J'essaie d'attaquer TAOCP une fois de plus, étant donné la lourdeur littérale des volumes que j'ai du mal à m'y engager sérieusement. Dans TAOCP 1, Knuth écrit, page 8, les concepts de base:
Soit un ensemble fini de lettres. Soit l'ensemble de toutes les chaînes de (l'ensemble de toutes les séquences ordonnées ... où et est dans pour ). L'idée est de coder les états du calcul pour qu'ils soient représentés par des chaînes de . Soit maintenant un entier non négatif et Q (l'état) l'ensemble de tous , où est dans et j est un entier ; laisse (l'entrée) le sous - ensemble de Q avec et soit (la sortie) le sous - ensemble avec . Si et sont des chaînes dans , nous disons que se produit dans si a la forme pour les chaînes et . Pour compléter notre définition, soit une fonction du type suivant, définie par les chaînes , et les entiers , pour :
- si ne se produit pas dans
- si est la chaîne la plus courte possible pour laquelle
N'étant pas informaticien, j'ai du mal à saisir tout le passage. J'ai en quelque sorte l'idée qui se cache derrière un système d'opcodes, mais je n'ai pas progressé efficacement dans la compréhension. Je pense que le principal problème est que je ne sais pas comment le lire efficacement.
Serait-il possible d'expliquer le passage ci-dessus pour que je puisse le comprendre, et me donner une stratégie pour entrer dans la logique d'interprétation de ces affirmations?
la source
Réponses:
Nous manquons de contexte, donc je n'ai aucune idée de ce que Knuth essaie de faire, mais voici comment interpréter une machine de Turing de cette façon. Cela vous aidera peut-être à comprendre ce qui se passe. En général, un bon moyen de maîtriser un concept est de jouer avec lui. Dans le cas des paradigmes de programmation, cela signifie écrire un programme. Dans ce cas, je vais montrer comment écrire n'importe quel programme.
Supposons que la bande de la machine de Turing ait des symboles{0,1,ϵ} (où ϵ signifie "vide"), et ajoutez un autre symbole qui représente l'emplacement de la tête H . Vos états vont être des paires du formulaire(q,α) , où q est un état de la machine de Turing, et α∈{0,…,14} . Nous identifions également(F,0) avec N pour tout état final.
Entrée (non vide)x , votre point de départ sera (Hx,(s,0)) , où s est l'état de départ. La partie difficile est de coder les états. Supposons qu'à l'étatq , lors de la lecture de l'entrée x , vous le remplacez par a(q,x) , se déplacer dans la direction D(q,x)∈{L,R} et passer à l'état σ(q,x) . Pour leθ s, nous avons
Maintenant, appliquezf à plusieurs reprises jusqu'à ce que vous soyez coincé. Si vous suivez la construction, vous verrez que nous avons simulé le fonctionnement de la machine de Turing.
la source
Décomposons-le petit à petit. Tout d'abord, rappelez-vous ce que Knuth a écrit à la page 7:
Ceci est le contour. Vous devez lire "représenter" comme "contenir";Q va contenir des états (dont certains sont en I , certains sont en Ω ) et f va être une fonction de transition entre les états; pensez-y comme un programme.
Ceci est juste une réitération de ceA∗ est. Voir aussi ici .
C'est probablement la phrase clé. Nous parlons de calculs , c'est-à-dire des séquences d'exécution de certaines instructions (langage de programmation) qui manipulent certains états , qui peuvent être considérées comme des valeurs dans les cellules de mémoire ou des évaluations de variables. Knuth dit ici qu'il veut encoder ces états de manière abstraite, à savoir sous forme de mots sur un alphabet.
Exemple: considérons un programme qui utilise (tout au plus)k variables, chacune d'entre elles stockant un entier. Autrement dit, un état est donné par le tuple de valeurs(x1,…,xk) où xk est la valeur (actuelle) du k -th variable. Afin de coder les états de cette forme dans un langage formel, nous pouvons choisirA={0,1,#} avec # un séparateur. Maintenant, modélisez un tel état en#x1¯¯¯¯¯#⋯#xk¯¯¯¯¯# où xi¯¯¯¯¯ est le codage binaire de xi .
Plus précisément,(3,5,0) serait #11#101#0# .
Vous y avez mal cité (mauvais Stefano!); les parenthèses ne sont pas dans le texte original et elles étaient trompeuses (voir ci-dessus). Knuth définitQ ici comme l'ensemble de tous les états possibles (σ∈UNE∗ ) à tous les endroits possibles du calcul (j peut être compris comme compteur de programme). Donc,Q contient tous les états indexés par les instructions tout calcul de l'algorithme donné par F peut assumer. Par définition, nous commençons par le compteur de programme0 et se terminent par N , donc les états indexés 0 sont des états d'entrée et ceux indexés N sont des états de sortie.
J'espère que cela est clair; ce n'est qu'une (re) définition des sous-chaînes.
Il s'agit d'un petit langage de programmation; si vous corrigezθj,ψj,aj,bj , vous avez un programme. Sur le compteur de programmej , f remplace l'occurrence la plus à gauche θj dans l'état avec ψj et va à la déclaration bj . Si il n'y a pasθj dans l'état actuel, il va à la déclaration aj . Le programme boucle si l'instructionN est atteint, modélisation de la terminaison.
Dans la moitié supérieure de la page 8, il y a un exemple plus concret de "programme"f . Gardez à l'esprit que Knuth va utiliser le langage d'assemblage plus tard; cela informe comment il regarde les programmes (déclarations atomiques reliées par des sauts).
la source
Ce texte décrit le pseudocode (Python) suivant:
La fonction f va vraisemblablement être appliquée à plusieurs reprises.
Les trois derniers points sont tout ce dont vous avez vraiment besoin une fois que vous avez compris les notations. Tout ce qui précède est un peu similaire à l'explication du fonctionnement de Python avant de donner le code Python.
la source