Prueba una prueba más bonita con animaciones. Y dado que los mensajes deben contener algo más que un enlace a un sitio, esta es la respuesta a su pregunta.
Primero, recordemos cómo funciona la prueba de la no existencia del oráculo de detención. Demostramos que dado cualquier candidato H
para un oráculo de detención, hay un programa P
y una entrada a
para los cuales H
no se puede predecir correctamente lo que P(a)
hace.
Teorema: Sea H
cualquier programa que tome dos entradas y siempre devuelva halt
o loop
. Luego, existe un programa Q
y una entrada a
que se Q(a)
detiene si, y solo si, H(Q,a)
regresa loop
.
Prueba. Considera el programa
program P(y):
if H(y,y) = halt then
loop forever
else:
return
Deje Q = P
y a = P
. Ya sea H(Q,a) = halt
o H(Q,a) = loop
:
- si
H(Q,a) = halt
entonces Q(a)
(que es justo P(P)
) se ejecuta para siempre según la definición de P
.
- si
H(Q,a) = loop
entonces se Q(a)
detiene por la definición de P
.
QED
Usted preguntó por qué lo consideramos en H(P,P)
lugar de H(P,X)
otro X
. ¡La respuesta obvia es "porque H(P,P)
es lo que hace que la prueba funcione"! Si H(P,X)
usabas algo arbitrario X
, entonces te quedarías atascado. De hecho, la prueba se vería así:
Prueba rota Considera el programa
program P(y):
if H(y,y) = halt then
loop forever
else:
return
Let Q = P
y a = X
para algunos arbitrarios X
. Ya sea H(Q,X) = halt
o H(Q,X) = loop
:
- supongamos
H(Q,X) = halt
que no podemos decir qué P(X)
hace, porque si se P(X)
detiene depende de lo que H(X,X)
regrese. Estamos atascados. Sin embargo, si supiéramos eso P(X)
y X(X)
somos iguales, podríamos avanzar. (Entonces, realmente deberíamos tomar X = P
).
- si
H(Q,a) = loop
entonces estamos atascados nuevamente, y nos despegaríamos si X = P
.
No QED
Espero que esto muestre que debemos considerar H(P,P)
para que nuestra idea funcione.