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 )HuneunebH( a , b )
- Si le programme représenté par s'arrête lorsqu'il reçoit en entrée, répondra "oui". D'un autre côté, si le programme décrit par s'exécute indéfiniment lorsqu'il reçoit l'entrée alors répondra "non".b H ( a , b ) a b H ( a , b )unebH( a , b )unebH( a , b )
- Surtout, le programme s'arrêtera toujours et donnera la bonne réponse pour toutes les paires .( a , 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 xHPHPX
P(x) =
run H(x, x)
if H(x, x) answers "yes"
loop forever
else
halt
Ce n'est pas difficile de voir ça
xP( x ) s'arrêtera si et seulement si le programme s'exécutera indéfiniment lorsqu'il recevra sa propre description en entrée.X
Jusqu'ici tout va bien: sera certainement un programme tant que son sous-programme sera un programme.HPH
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 PPpP
P ( p )P( p ) s'arrêtera si et seulement si le programme s'exécutera indéfiniment.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 )HH