Prueba de la indecidibilidad del problema de detención

25

Tengo problemas para comprender la prueba de la indecidibilidad del problema de detención.

http://computing.guide/wp-content/uploads/2014/12/HaltingProblem1.jpg

Si devuelve si el programa a se detiene o no en la entrada b , ¿por qué tenemos que pasar el código de P para a y b ?H(a,b)abPab

¿Por qué no podemos alimentar con P y alguna entrada arbitraria, por ejemplo, x ?H()Px

Netik
fuente
Tenga en cuenta que en el modelo computacional que se usa aquí, se permite cualquier entrada (codificada). No hay verificación de tipo ni nada de eso. Siempre puede codificar un programa y pasarlo como una entrada para sí mismo.
Asmeurer
2
Usted podría alimentar cualquier entrada que desee. La estructura de esta prueba requiere considerar una entrada particular. H
David Richerby
1
Puede proporcionar cualquier entrada al programa. El objetivo es encontrar la contradicción. Teóricamente, la máquina 'H' debería funcionar para todo tipo de entradas. Por lo tanto, consideramos una de todas las entradas posibles, lo que conduce a la contradicción.
Ugnes
Esta prueba es sutilmente defectuosa. Considere si tengo un H () que funciona para todo menos para sí mismo; eso todavía sería una solución general al problema de detención.
Joshua el
Relacionado, posiblemente duplicado: cs.stackexchange.com/questions/42819/…
Ilmari Karonen

Respuestas:

27

La prueba tiene como objetivo encontrar una contradicción. Debe comprender cuál es la contradicción derivada, para comprender por qué se utiliza como una entrada para sí mismo. La contradicción es, informalmente: si tenemos una máquina H (a, b) que decide "a acepta b", entonces podemos construir una máquina que acepte máquinas que no se aceptan a sí mismas. (Leer que un par de veces hasta que lo haga.) La máquina que se muestra en la imagen - llamémoslo M - M ( P ) = no P no acepta P ?PMM(P)=PP

La contradicción ocurre cuando se pregunta: Qué aceptar M ? Intenta resolver las dos opciones para ver cómo hay una contradicción.MM

aceptaM si y sólo si M no aceptaM ; Esto es claramente una contradicción.MMMM

Esta es la razón por la cual es esencial que la prueba ejecute sobre sí misma, no alguna entrada arbitraria. Este es un tema común en las pruebas de imposibilidad conocidas como argumentos diagonales.P

aelguindy
fuente
38

Ignora la imagen por un momento; Lo veremos en breve. Se supone que el programa es un probador de alto: cuando le damos a H una entrada de un programa a (piense en a como la lista de un programa) y cualquier cosa para b , H ( a , b ) actúa de la siguiente maneraH(a,b)HaabH(a,b)

  1. Si el programa representado por detiene cuando se le da b como entrada, H ( a , b ) responderá "sí". Por otro lado, si el programa descrito por a se ejecuta para siempre cuando se le da la entrada b, entonces H ( a , b ) responderá "no".abH(a,b)abH(a,b)
  2. Es importante destacar que el programa siempre se detendrá y dará la respuesta correcta para cualquier par ( a , b ) .H(a,b)

El argumento de que es imposible de construir se basa en la acción de un programa "perverso" particular, P , uno que usa H como subrutina. P toma como entrada una lista de cualquier programa, x , y hace lo siguiente:HPHPx

P(x) =
  run H(x, x)
  if H(x, x) answers "yes"
      loop forever
  else
      halt

No es difícil ver eso

se detendrá si y solo si el programa x se ejecutará para siempre cuando se le dé su propia descripción como entrada.P(x)x

Hasta ahora todo bien: sin duda será un programa siempre que su subrutina H sea ​​un programa.PH

PpP

P(p)P(p)

H(p,p)HH

Rick Decker
fuente
Me gusta esta respuesta Aunque ahora que entiendo la prueba, parece demostrar que H puede lanzar una excepción de límite de recurrencia.
Fax
2
@Fax Hno recibe llamadas más de una vez, no hay recurrencia en Pabsoluto. H(P, P)no se ejecuta P, simplemente "mágicamente" determina si se Pdetiene o no cuando se pasa a sí mismo.
Ajedi32
@ Ajedi32 H(P,P)no tiene que ejecutarse P, pero debe ejecutarse H(x ↦ H(x,x), P)como parte de la determinación de si se Pdetiene. Lo que se expande H(x ↦ H(y ↦ H(y,y), x), P)y así sucesivamente.
Fax
@Fax La implementación de Hno se especifica en esta prueba. Entonces, no, no tiene que ejecutar nada, ya sea eso Pmismo. La prueba comienza con la suposición de que Hexiste algún tipo de programa que mágicamente decide el problema de detención, luego pasa a demostrar que la existencia de tal programa sería una contradicción, y por lo tanto no existe tal programa.
Ajedi32
1
@Fax Sin embargo, usted plantea un buen punto sobre si podría existir un programa que decida el problema de detención, excepto cuando se lo solicite. Ver ¿Hay alguna prueba de la indecidibilidad del problema de detención que no depende de autorreferencia o diagonalización? para una pregunta interesante sobre eso.
Ajedi32
9

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 Hpara un oráculo de detención, hay un programa Py una entrada apara los cuales Hno se puede predecir correctamente lo que P(a)hace.

Teorema: Sea Hcualquier programa que tome dos entradas y siempre devuelva halto loop. Luego, existe un programa Qy una entrada aque 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 = Py a = P. Ya sea H(Q,a) = halto H(Q,a) = loop:

  • si H(Q,a) = haltentonces Q(a)(que es justo P(P)) se ejecuta para siempre según la definición de P.
  • si H(Q,a) = loopentonces 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 = Py a = Xpara algunos arbitrarios X. Ya sea H(Q,X) = halto H(Q,X) = loop:

  • supongamos H(Q,X) = haltque 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) = loopentonces 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.

Andrej Bauer
fuente
Jaja. ¡Increíble! :)
aelguindy
2

El resultado de la prueba es esta analogía:

P(P)P(P)P(P)(P)(P)

(P)(P)

Ahmed Nassar
fuente