Experimente uma prova mais bonita com animações. E como os ansewrs devem conter mais do que apenas um link para um site, aqui está a resposta para sua pergunta.
Primeiro, vamos relembrar como funciona a prova da inexistência do oráculo Halting. Provamos que, dado qualquer candidato H
a um oráculo Halting, existe um programa P
e uma entrada a
para os quais H
falha em prever corretamente o que P(a)
faz.
Teorema: Seja H
qualquer programa que aceite duas entradas e sempre retorne halt
ou loop
. Então existe um programa Q
e uma entrada a
que Q(a)
interrompe se, e somente se, H(Q,a)
retorna loop
.
Prova. Considere o programa
program P(y):
if H(y,y) = halt then
loop forever
else:
return
Let Q = P
e a = P
. De qualquer H(Q,a) = halt
ou H(Q,a) = loop
:
- se
H(Q,a) = halt
então Q(a)
(o que é justo P(P)
) corre eternamente pela definição deP
.
- se
H(Q,a) = loop
então Q(a)
parar pela definição de P
.
QED
Você perguntou por que pensamos em H(P,P)
vez de H(P,X)
por outro X
. A resposta óbvia é "porque H(P,P)
é o que faz a prova funcionar"! Se você usasse H(P,X)
algo arbitrário X
, ficaria preso. De fato, a prova ficaria assim:
Prova quebrada. Considere o programa
program P(y):
if H(y,y) = halt then
loop forever
else:
return
Vamos Q = P
e a = X
para alguns arbitrários X
. De qualquer H(Q,X) = halt
ou H(Q,X) = loop
:
- suponha
H(Q,X) = halt
que não possamos dizer o que P(X)
faz, porque se P(X)
parar depende do que H(X,X)
retorna. Nós estamos presos. No entanto, se soubéssemos disso P(X)
e X(X)
somos iguais, poderíamos progredir. (Então, nós realmente devemos tomar X = P
).
- se
H(Q,a) = loop
estivermos presos novamente, e ficaríamos desapegados se X = P
.
Sem QED.
Espero que isso mostre que devemos considerar H(P,P)
para que nossa ideia funcione.