J'ai du mal à comprendre la preuve de l'indécidabilité du problème de l'arrêt.
Si renvoie si le programme s'arrête ou non sur l'entrée , pourquoi devons-nous passer le code de pour et ?a b P a b
Pourquoi ne pouvons-nous pas alimenter avec et une entrée arbitraire, disons, ?P x
Réponses:
La preuve vise à trouver une contradiction. Vous devez comprendre quelle est la contradiction dérivée, afin de comprendre pourquoi est utilisé comme entrée pour lui-même. La contradiction est informelle: si nous avons une machine H (a, b) qui décide "a accepte b", alors nous pouvons construire une machine qui accepte des machines qui ne s'acceptent pas. (Lu que quelques fois jusqu'à ce que vous l' obtenez.) La machine représentée dans l'image - Appelons- - ne accepte pas ?M M ( P ) = P ⟨ P ⟩P M M( P) = P ⟨ P⟩
La contradiction se produit lorsque vous demandez: accepte-t-il ? Essayez de trouver les deux options pour voir comment il y a une contradiction.⟨ M ⟩M ⟨ M⟩
⟨ M ⟩ M ⟨ M ⟩M accepte si et seulement si n'accepte pas ; c'est clairement une contradiction.⟨ M⟩ M ⟨ M⟩
C'est pourquoi il est essentiel pour la preuve d'exécuter sur lui-même et non sur une entrée arbitraire. Il s'agit d'un thème commun dans les preuves d'impossibilité appelées arguments diagonaux.P
la source
Ignorez l'image pendant un instant; nous y reviendrons sous peu. Le programme est censé être un testeur d'arrêt: lorsque nous donnons à une entrée d'un programme (pensez à comme la liste d'un programme) et n'importe quoi pour , agit comme suitH a a b H ( a , b )H( a , b ) H une une b H( a , b )
L'argument selon lequel est impossible à construire repose sur l'action d'un programme "pervers" particulier, , qui utilise comme sous-programme. prend comme entrée une liste de tout programme, , et fait ce qui suit:P H P xH P H P X
Ce n'est pas difficile de voir ça
Jusqu'ici tout va bien: sera certainement un programme tant que son sous-programme sera un programme.HP H
Revenons maintenant à l'image. Que se passe-t-il si reçoit sa propre description en entrée? L'image décrit juste ce scénario: Soit la description du programme , puis, en remplaçant dans la partie surlignée ci-dessus, nous auronsp PP p P
De toute évidence, ce comportement paradoxal est impossible, nous sommes donc obligés de conclure que le sous-programme ne peut pas être un testeur d'arrêt, car il échoue dans le cas où il est donné en entrée. Il peut y avoir d'autres cas où fonctionne comme il se doit, mais comme échoue dans au moins une situation, il ne peut pas s'agir d'un testeur d'arrêt complet, comme requis.( p , p ) H HH ( p , p ) H H
la source
H
n'est pas appelé plus d'une fois, il n'y a aucune récursivitéP
.H(P, P)
ne s'exécute pasP
, il détermine simplement "par magie" s'ilP
s'arrête ou non lorsqu'il est passé.H(P,P)
n'a pas à s'exécuterP
, mais il doit s'exécuterH(x ↦ H(x,x), P)
dans le cadre de la détermination de l'P
arrêt. Qui se développeH(x ↦ H(y ↦ H(y,y), x), P)
et ainsi de suite.H
n'est pas spécifiée dans cette preuve. Donc non, il ne possède rien exécuter, que ce soitP
ou lui - même. La preuve commence par l'hypothèse qu'ilH
existe une sorte de programme qui décide par magie du problème d'arrêt, puis prouve que l'existence même d'un tel programme serait une contradiction, et donc aucun tel programme n'existe.Essayez une plus jolie preuve avec des animations. Et puisque les réponses doivent contenir plus qu'un simple lien vers un site, voici la réponse à votre question.
Rappelons d'abord comment fonctionne la preuve de la non-existence de l'oracle Halting. Nous prouvons que, étant donné tout candidat
H
à un oracle Halting, il existe un programmeP
et une entréea
pour lesquels ilH
ne parvient pas à prédire correctement ce qui seP(a)
passe.Théorème: Soit
H
n'importe quel programme qui prend deux entrées et renvoie toujours soithalt
ouloop
. Il existe alors un programmeQ
et une entréea
tels queQ(a)
s'arrête si, et seulement si,H(Q,a)
revientloop
.Preuve. Considérez le programme
Soit
Q = P
eta = P
. SoitH(Q,a) = halt
ouH(Q,a) = loop
:H(Q,a) = halt
alorsQ(a)
(ce qui est justeP(P)
) fonctionne pour toujours selon la définition deP
.H(Q,a) = loop
alorsQ(a)
arrêtez par la definitoin deP
.QED
Vous avez demandé pourquoi nous avons envisagé
H(P,P)
au lieu d'H(P,X)
un autreX
. La réponse évidente est "carH(P,P)
c'est ce qui fait fonctionner la preuve"! Si vous l'utilisiezH(P,X)
pour un arbitraireX
, vous seriez coincé. En effet, la preuve ressemblerait alors à ceci:Preuve cassée. Considérez le programme
Soit
Q = P
eta = X
pour certains arbitraireX
. SoitH(Q,X) = halt
ouH(Q,X) = loop
:H(Q,X) = halt
alors que nous ne pouvons pas dire ce qui seP(X)
passe, car si lesP(X)
arrêts dépendent de ce quiH(X,X)
revient. Nous sommes bloqués. Cependant, si nous le savionsP(X)
et que nousX(X)
sommes les mêmes, nous pourrions progresser. (Donc, nous devrions vraiment prendreX = P
).H(Q,a) = loop
alors nous sommes à nouveau coincés, et nous serions décollés siX = P
.Pas de QED.
J'espère que cela montre que nous devons tenir
H(P,P)
compte afin de faire fonctionner notre idée.la source
Le résultat de la preuve est cette analogie:
la source