Veuillez expliquer cette définition formelle du calcul

7

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 ; laisseAAAx1 x2xnn0xjA1jnAN(σ,j)σA0jNI(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 , pourj=0Ωj=NθσAθσσαθωαωfθjϕjajbj0jN :

  • f((σ,j))=(σ,aj) si ne se produit pas dansθjσ
  • f((σ,j))=(αψjω,bj) si est la chaîne la plus courte possible pour laquelleασ=αθjω
  • f((σ,N))=(σ,N)

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?

Stefano Borini
la source
Ensuite, vous ne devez pas inclure votre commentaire dans la citation présumée, ce qui dérouterait quiconque n'a pas le livre à portée de main. -.- J'espère que ma réponse vous aidera ...
Raphael
@Raphael: la citation est textuellement extraite du livre. Je viens d'ajouter une explication entre parenthèses des symboles pour I et oméga
Stefano Borini
@SteanoBorini: Mais ce n'est pas une "explication", c'est faux. Je vois comment vous pouvez lire le texte original pour arriver à la même conclusion que vous, mais ce n'est toujours pas utile. Si vous dites que vous citez quelque chose et ajoutez un commentaire, veuillez le marquer comme tel afin que les gens puissent le prendre avec un grain de sel.
Raphael
Il manque un contexte ici: quel calcul et quels états?
reinierpost

Réponses:

8

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ù sest 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

θq,0=0H0,θq,1=0H1,θq,2=0Hϵ,θq,3=1H0,θq,4=1H1,θq,5=1Hϵ,θq,6=ϵH0θq,7=ϵH1,θq,8=ϵHϵ,θq,9=H0,θq,10=H1,θq,11=Hϵ,θq,12=0H,θq,13=1H,θq,14=ϵH.
Pour le as, nous avons aq,i=(q,i+1) pour i<14, et aq,14=(q,14), bien que nous ne devrions jamais vraiment aller aussi loin. Pour lebs, nous avons
bq,0=bq,3=bq,6=bq,9=(σ(q,0),0),bq,1=bq,4=bq,7=bq,10=(σ(q,1),0),bq,2=bq,5=bq,8=bq,11=bq,12=bq,13=bq,14=(σ(q,ϵ),0).
Reste maintenant à déterminer ψs. Laissera0=a(q,0). SiD(q,0)=L puis
ψq,0=H0a0,ψq,3=H1a0,ψq,6=ψq,9=Hϵa0.
Si D(q,0)=R puis
ψq,0=0a0H,ψq,3=1a0H,ψq,6=ϵa0H,ψq,9=a0Hϵ.
Ensuite, laissez a1=a(q,1). SiD(q,1)=L puis
ψq,1=H0a1,ψq,4=H1a1,ψq,7=ψq,10=Hϵa1.
Si D(q,1)=R puis
ψq,1=0a1H,ψq,4=1a1H,ψq,7=ϵa1H,ψq,10=a1Hϵ.
Enfin, laissez aϵ=a(q,ϵ). SiD(q,ϵ)=L puis
ψq,2=H0aϵ,ψq,5=H1aϵ,ψq,8=ψq,11=Hϵaϵ,ψq,12=H0aϵ,ψq,13=H1aϵ,ψq,14=Hϵaϵ.
Si D(q,ϵ)=R puis
ψq,2=0aϵH,ψq,5=1aϵH,ψq,8=ϵaϵH,ψq,11=aϵHϵ,ψq,12=0aϵH,ψq,13=1aϵH,ψq,14=ϵaϵH.

Maintenant, appliquez fà 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.

Yuval Filmus
la source
rien compris. Pas ta faute. Merci quand même :(
3
"Nous manquons de contexte." C'est: nous devrions avoir une description précise de ce que nous entendons par «méthode de calcul»; en voici une donnée par AA Markov; il en existe d'autres équivalents, comme les machines de Turing.
rgrig
6

Décomposons-le petit à petit. Tout d'abord, rappelez-vous ce que Knuth a écrit à la page 7:

Définissons formellement une méthode de calcul comme étant un quadruple(Q,I,Ω,f), dans lequel Q est un ensemble contenant des sous-ensembles I et Ω, et f est une fonction de Qen lui-même. [...] Les quatre quantitésQ, I, Ω, f sont destinés à représenter respectivement l'état du calcul, l'entrée, la sortie et la règle de calcul.

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 fva être une fonction de transition entre les états; pensez-y comme un programme.

Laisser Aêtre un ensemble fini de lettres. LaisserA être l'ensemble de toutes les chaînes A (l'ensemble de toutes les séquences ordonnées x1 x2 ... xnn0 et xj est dans A pour 1jn).

Ceci est juste une réitération de ce Aest. Voir aussi ici .

L'idée est de coder les états du calcul afin qu'ils soient représentés par des chaînes de A.

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)kvariables, chacune d'entre elles stockant un entier. Autrement dit, un état est donné par le tuple de valeurs(x1,,xk)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¯#xi¯ est le codage binaire de xi.

Plus précisément, (3,5,0) serait #11#101#0#.

Maintenant, laisse N être un entier non négatif et Q être l'ensemble de tous (σ,j), où σ est dans A et j est un entier 0jN; laisserI être le sous-ensemble de Q avec j=0 et laisse Ω être le sous-ensemble avec j=N.

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éfinitQici comme l'ensemble de tous les états possibles (σA) à tous les endroits possibles du calcul (jpeut être compris comme compteur de programme). Donc,Q contient tous les états indexés par les instructions tout calcul de l'algorithme donné par fpeut 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.

Si θ et σ sont des chaînes A, nous disons que θ se produit dans σ si σ a la forme αθω pour cordes α et ω.

J'espère que cela est clair; ce n'est qu'une (re) définition des sous-chaînes.

Pour compléter notre définition, laissez f être une fonction du type suivant, définie par les chaînes θj, ϕj et les entiers aj, bj pour 0jN:

  • f((σ,j))=(σ,aj) si θj ne se produit pas dans σ
  • f((σ,j))=(αψjω,bj) si α est la chaîne la plus courte possible pour laquelle σ=αθjω
  • f((σ,N))=(σ,N)

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).

Raphael
la source
1
Maintenant, je comprends un peu mieux ce qui se passe. Cependant, deux choses ne sont toujours pas claires et j'apprécierais vraiment que vous développiez votre réponse. Tout d'abord, θj, ψj, aj, bj - quels sont ces chaînes et nombres? Que représentent-ils? Si je comprends bien, aj et bj représentent le numéro d'étape ou le compteur de commandes pour l'état j + 1. Mais je ne sais pas ce que signifient les chaînes θj, ψj. Pouvez-vous expliquer ce que vous entendez par "si vous corrigez θj, ψj, aj, bj, vous avez un programme"? Ou plutôt, comment pourrais-je le réparer pour un exemple?
Georgy Bolyuba
@GeorgyBolyuba: Vous avez raison aj et bj. L'état du programme est une chaîneσ et un "compteur de programmes" j. θj et ψj sont utilisés pour modifier cet état (voir deuxième cas de f). Ils peuvent avoir toutes sortes de formes; cela dépend vraiment de la façon dont vous codez l'état sous forme de chaîne. Voir le livre pour un exemple.
Raphael
5

Ce texte décrit le pseudocode (Python) suivant:

subs = a list of string pairs  
As = a list of integers  
Bs = a list of integers

def f(state, pc):  
  if pc == N: return (state, pc)  
  if state.find(subs[pc][0]) != -1:  
    return (state.replace(subs[pc][0],subs[pc][1],1), Bs[pc])  
  else:  
    return (state,As[pc])  

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.

rgrig
la source
Ah ok, c'est une machine de Turing.
Stefano Borini
1
Il s'agit plutôt d'un modèle de calcul différent avec la même puissance qu'une machine de Turing.
Yuval Filmus
Eh bien, trois lignes en dessous de votre citation, Knuth dit que cela équivaut à des machines Turing, donc vous le saviez probablement déjà lorsque vous avez demandé. Je pensais que vous demandiez de l'aide pour la notation. Maintenant, je n'ai aucune idée de ce que vous vouliez demander.
rgrig