Pourquoi pouvons-nous supposer qu'un algorithme peut être représenté comme une chaîne de bits?

17

Je commence à lire un livre sur la complexité informatique et les machines de Turing. Voici une citation:

Un algorithme (c'est-à-dire une machine) peut être représenté comme une chaîne de bits une fois que nous avons décidé d'un codage canonique.

Cette affirmation est fournie comme un simple fait, mais je ne peux pas le comprendre.

Par exemple, si j'ai un algorithme qui prend en entrée et calcule ou:X(X+1)2

int function (int x){
   x = x + 1; 
   return x**2; 
}

Comment cela peut-il être représenté sous forme de chaîne en utilisant l'alphabet {0,1} ?

Kenenbek Arzymatov
la source
38
Vous ne connaissez pas les connaissances minimales requises pour comprendre comment le texte est codé. Aujourd'hui est un grand jour pour apprendre! joelonsoftware.com/2003/10/08/…
Eric Lippert
1
Je pense que OP pourrait en venir à un point de vue différent sur la base d'une ambiguïté dans le texte cité. Je suppose que OP signifie `` comment la machine entière et l'algorithme peuvent-ils être construits comme une chaîne de bits '', et non l'entrée de la machine Turing elle-même. Le texte cité implique que l'ensemble de l'algorithme peut être auto-exécuté, mais un bit codé en utf du langage c ne dit rien sur la façon dont une machine agirait réellement sur cette chaîne.
Sentinel
3
... Je pense que tout le monde ici comprend mal la source et pousse la plaisanterie trop loin, au détriment de l'inexpérience des Roms. La plupart de ces commentaires et réponses parlent de l'encodage du texte pour une transmission arbitraire, tandis que la citation parle de l'encodage de l'algorithme pour la consommation par une machine de turing. La réponse (actuellement) acceptée la touche au moins dans la deuxième phrase.
Izkata
2
@Izkata Je ne sais pas si vous savez que, en raison de l'universalité, ces deux déclarations sont équivalentes.
Konrad Rudolph
15
Le plus drôle, c'est que pour que je puisse lire votre algorithme codé, il fallait nécessairement le transformer en une séquence de bits dès que vous l'avez tapé. Il n'a jamais été représenté différemment - de votre clavier à mon moniteur. Il n'avait une représentation non binaire que dans nos esprits; et sur le plan physiologique, quand on regarde les synapses, même cela est discutable.
Peter - Rétablir Monica le

Réponses:

45

La réponse la plus naïve et la plus simple à votre question est que le code fourni (et le code machine compilé) sont en fait représentés comme des chaînes syntaxiques de {0,1} *. De plus, puisque vous parlez de machines de turing, les programmes qu'elles exécutent sont une liste linéaire d'opérations / instructions, il n'y a aucune raison pour qu'elles ne puissent pas être représentées en bits / octets.

Daniel F
la source
Comment représentez-vous exactement la machine Turing comme une liste d'instructions? La définition habituelle est quelque chose comme ça .
svick
@svick Comme mentionné dans ma réponse ci-dessous, vous utilisez une MT universelle, qui prend la description d'une MT en entrée (encodée de manière appropriée)
dseuss
@svick Un langage de programmation avec des instructions simples pour déplacer un pointeur sur une bande? Je pense qu'un exemple pourrait être le langage de programmation ésotérique Brainfuck . Exemple de code
LukStorms
@LukStorms Je ne pense plus que vous puissiez appeler cela une "machine de Turing".
svick
52

Vous avez déjà une représentation de cette fonction sous forme de texte. Convertissez chaque caractère en une valeur d'un octet à l'aide du codage ASCII. Le résultat est alors une séquence d'octets, c'est-à-dire une séquence de bits, c'est-à-dire une chaîne sur l'alphabet . C'est un exemple d'encodage.{0,1}

DW
la source
Exactement. Et comme je l'ai dit plus haut, c'est arrivé pendant que les Roms l'ont écrit. Même les glyphes que je vois sur mon moniteur sont des pixels noir et blanc, c'est-à-dire des informations binaires, envoyées via une connexion de données binaires à partir d'une mémoire binaire connectée à un réseau binaire via des contrôleurs binaires. Est-il possible de représenter chaque algorithme comme une chaîne de bits? Plus que cela: c'est inévitable, sauf si vous vous limitez aux médias analogiques et à la communication en face à face.
Peter - Rétablir Monica le
@ PeterA.Schneider L'utilisation de supports analogiques ou en face à face n'implique pas nécessairement qu'il n'y a pas de codage discret intégré. Utiliser un langage naturel n'est pas loin d'utiliser un encodage discret, n'est-ce pas?
Jean-Baptiste Yunès
32

Je ne peux pas résister ...

⡂⡀⣀⢀⣄⡀⣰⡉⡀⠀⡀⡀⣀⠀⢀⣀⢀⣄⡀⡂⢀⣀⡀⢀⢀⡀⠀⡰⣀⠀⣀⠀⡂⡀⣀⢀⣄⡰⡀⢠⠂
⡇⡏⠀⡇⡇⠀⢸⠀⡇⢀⡇⡏⠀⡇⣏⠀⠀⡇⠀⡇⣏⠀⣹⢸⠁⢸⠀⡇⢈⠷⡁⠀⡇⡏⠀⡇⡇⠀⡇⢼⠀
⠁⠁⠀⠁⠈⠁⠈⠀⠈⠁⠁⠁⠀⠁⠈⠉⠀⠈⠁⠁⠈⠉⠁⠈⠀⠈⠀⠱⠉⠀⠉⠀⠁⠁⠀⠁⠈⠱⠁⠘⠄
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⢤⡀⡤⠀⣀⣀⣀⠀⢤⡀⡤⠀⠀⢰⠀⠀⢹⠠⠀
⠀⠀⠀⣠⠛⣄⠀⠒⠒⠒⠀⣠⠛⣄⠀⠉⢹⠉⠁⢸⢀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠘⠀
⠀⠀⠀⣄⢄⠤⢄⢴⠤⢠⠀⢠⢠⡠⢠⡠⢄⠀⢤⡀⡤⢺⡖⠐⣷⠂⠊⢉⡆
⠀⠀⠀⡇⠸⣍⣉⠸⣀⠸⣀⢼⢸⠀⢸⠀⢸⠀⣠⠛⣄⠀⠀⠀⠀⠀⣴⣋⡀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀

⢱⠀
⢸⠁
⠊

(Les points ci-dessus représentent des uns, les zéros blancs).

à gauche
la source
5
Amusant (+1) mais il sert à souligner la nature essentiellement arbitraire de l'encodage.
John Coleman
4
Amusez-vous à écrire le compilateur pour cela :)
Barmar
1
@Barmar Cela ressemble à un défi pour codegolf.stackexchange.com
IMSoP
1
@RomaKarageorgievich voici la fonction qui rend le rendu aux caractères braille. Voici un simple wrapper qui permet de l'appeler à partir de la ligne de commande.
leftaroundabout
13

Votre ordinateur stocke tout comme des séquences de 0et 1, y compris la question que vous avez saisi pour demander comment il le fait. Par exemple, chaque lettre et symbole est représenté par 8 bits (je parle de la façon dont les choses étaient, de nos jours c'est 16 bits et plus compliqué). Vous pouvez les voir ici . Eh bien, ils ne montrent pas les bits, mais plutôt les codes hexadécimaux et octaux. Savez-vous comment convertir un nombre en sa représentation numérique?

Andrej Bauer
la source
6
C'est 16 octets uniquement sous Windows et dans certaines bibliothèques comme Qt ou ICU, qui utilisent UTF-16. Et même toutes les lettres ne prennent pas une seule unité de code en général, même en UTF-32, elles peuvent donc être plus longues. Je pense donc qu'il vaut mieux s'en tenir à ASCII dans cette discussion, amener Unicode ici entraînera une complication.
Ruslan
8

L'hypothèse fondamentale derrière ce concept est la thèse de Church-Turing . Il peut être difficile de voir que n'importe quel algorithme peut être représenté comme une chaîne de bits, car le terme "algorithme" peut être pensé en termes très informels. Dans la thèse de Church-Turing, ils utilisent un concept très rigoureusement défini de ce qu'est un algorithme (et même alors, il y a eu quelques questions sur les mots). Cependant, leur terminologie a obtenu tellement domination qu'il est parfois fait valoir que ces définitions pour des mots comme « algorithme » sont si efficaces que nous les acceptons simplement la définition.

Church-Turing déclare que chaque algorithme peut être implémenté comme un calcul sur une machine de Turing. Étant donné que la description d'une machine de Turing est un ensemble fini de valeurs, il est trivial de voir comment mapper cette description en une séquence de nombres, puis en une séquence de 0 et de 1.

Comme les autres réponses l'ont mentionné, il est trivial de représenter votre exemple d'algorithme en utilisant un codage ASCII ou d'autres codages.

Je pense que la raison pour laquelle votre livre donne cette affirmation comme un fait vient du fait que beaucoup utilisent simplement la thèse de Church-Turing comme base pour leur définition d'un algorithme. Si vous utilisez une telle définition, elle est aussi évidente que "5 est un nombre" car vous l'avez essentiellement définie comme telle.

Cort Ammon - Rétablir Monica
la source
9
La thèse de Church-Turing n'est pas un théorème et elle n'implique aucune définition du concept d'algorithme, qui est informel. Je ne vois pas non plus la nécessité d'invoquer la thèse de Church-Turing pour cela. La raison "profonde" pour laquelle certains objets peuvent être représentés comme des chaînes finies et d'autres non, c'est que certains ensembles sont dénombrables et d'autres non.
quicksort
Je vois "un algorithme peut être codé comme une chaîne si nous spécifions une injection entre les composants de la spécification de la machine et l'ensemble de chaînes dans un langage." OP le fait dans son exemple, en prenant la machine représentée par " $ (x + 1) ^ 2 $ " et en la représentant à nouveau comme une chaîne dans le langage des fonctions C bien formées (ou BCPL, C ++, et al.) .
Eric Towers
1
@EricTowers Qui nécessite la thèse de Church-Turing. Sinon, on ne peut pas être certain qu'il existe une spécification machine d'un algorithme pour tous les algorithmes.
Cort Ammon - Rétablir Monica le
1
J'affirme qu'un "algorithme [qui] requiert un nombre infiniment infini de symboles pour s'exprimer" ne peut pas être exprimé. Une telle expression doit utiliser un nombre incalculable de symboles, sinon elle peut être exprimée dans un sous-langage plus petit. De plus, toute expression (non idiote) sur un alphabet infini a une quantité infinie d'entropie dans presque tous ses symboles, donc défie l'expression (c'est-à-dire qu'elle ne peut pas réellement communiquer avec un destinataire). Toutes les logiques finitaires refusent d'opérer sur de telles chaînes infinies et je ne connais pas de logique infinitaire qui permette de travailler sur des chaînes innombrables.
Eric Towers
1
Les commentaires ne sont pas pour une discussion approfondie; cette conversation a été déplacée vers le chat .
DW
4

Cette déclaration est basée sur l'existence de MT universelles . Ce sont essentiellement des MT programmables qui peuvent simuler n'importe quelle autre MT avec au plus une surcharge poly. Par conséquent, votre programme fait simplement partie de l'entrée codée en zéros et en uns.

dseuss
la source
1
@Discretelizard, je ne vous suis pas. Tout algorithme est exprimable en entrée d'une MT universelle. Les langues peuvent être calculables ou non calculables; Je ne connais aucune notion standard de calculabilité pour les algorithmes, donc je ne suis pas sûr de savoir où vous en êtes. Qu'est-ce que cela signifierait d'avoir un algorithme non calculable? Vous pensez peut-être à des algorithmes qui ne se terminent pas nécessairement? Mais une MT universelle peut toujours exécuter de tels algorithmes.
DW
@Discretelizard Je ne te suis pas non plus. Être exécutable sur une machine de Turing est essentiellement la définition d'un algorithme. Je suppose que vous pourriez parler d'un "algorithme" pour, disons, une machine de Turing avec un oracle pour le problème d'arrêt mais, normalement, "algorithme" signifie "chose que vous pouvez faire sur une machine de Turing".
David Richerby
@DavidRicherby Vrai, la définition réelle de l'algorithme est plus stricte, je suppose. Mais cette question concerne la raison pour laquelle nous imposons une restriction beaucoup plus clémente et dire qu'il existe une restriction encore plus forte n'est pas très instructif, à mon avis.
Lézard discret
4

Eh bien, parlons d'algorithmes qui ne peuvent pas être représentés comme une chaîne de bits finie pour tout type d'encodage.

Permettez-moi de taper un tel algorithme pour vous ... Ah, mais si je le fais, je peux représenter cet algorithme avec l'encodage de mon texte tapé.

Que diriez-vous de représenter mon algorithme en utilisant des «moyens analogiques», disons par la position de quelques pièces sur mon bureau. Bien que la position de ces pièces puisse être modélisée par certains nombres réels (qui dans certains encodages pourraient être impossibles à représenter de manière définitive), cette description entière peut à nouveau être considérée comme une représentation de mon algorithme et peut être à nouveau encodée en une chaîne de bits!

J'espère que ces exemples montrent clairement que si un algorithme ne peut pas être représenté par une chaîne de bits finie, nous n'avons aucun moyen de décrire cet algorithme du tout!

Alors, pourquoi considérerions-nous l'existence de quelque chose dont nous ne pouvons pas parler? Peut-être intéressant pour la philosophie, mais pas pour la science. Par conséquent, nous définissons la notion d' algorithme de telle sorte qu'il puisse être représenté par une chaîne de bits, car alors nous savons au moins que nous pouvons parler de tous les algorithmes.


Bien que la réponse ci-dessus à la question posée, je pense que la confusion au sujet de l'exemple donné est principalement due au fait qu'une représentation n'a besoin que de représenter de manière unique un algorithme. Le mode de représentation n'a pas besoin d'impliquer les calculs réels invoqués par l'algorithme! Ceci est très utile, car cela signifie que nous pouvons également représenter des algorithmes non calculables !

Lézard discret
la source
rUNEr
1
UNErR
1
Oui! Charmant! Wittgenstein! "Wovon man nicht sprechen kann, darüber muss man schweigen."
Peter - Rétablir Monica le
r
@Raphael Oui, et? Il n'est pas surprenant que l'écriture d'un nombre incalculable d'algorithmes ne soit pas possible. Et encore une fois, vous prétendez que vous "exprimez" certains algorithmes qui ne peuvent pas être écrits. Je ne comprends pas ce que vous entendez par «exprimer», mais cela semble impliquer au moins la représentation. Comme ma réclamation commence avec l'hypothèse qu'un algorithme n'est pas représenté, je ne vois pas en quoi cela contredit ma réclamation.
Lézard discret
2

Une autre façon de voir cela est à travers la théorie de l'information. Tous les encodages d'informations / questions significatives / utiles peuvent être transformés en «séquences» binaires.

Une grande partie du champ est consacrée à la question «quelle est la façon de poser le moins de questions en moyenne pour communiquer une information significative? En pratique, cela revient à "quelle est l'approche optimale pour poser le moins de questions oui / non pour comprendre ce qui a été communiqué ou dit?"

eSurfsnake
la source