¿Hay programas que nunca se detienen y no tienen prueba de no terminación?

23

Como agujeros negros en informática. Solo podemos saber que existen, pero cuando tengamos uno de ellos, nunca sabremos que es uno de ellos.

Otakar Molnár López
fuente
1
Decidir el problema de detención es al menos tan difícil como probar teoremas (dado un teorema simplemente puede escribir un programa como , el programa termina si y solo si el teorema es verdadero). Si no hubiera tales programas, significaría que podría probar todos los teoremas, lo cual es bien conocido como falso. Tif T is true then halt else loop forever
Bakuriu
@Bakuriu: ¿Cómo escribirías if T is true?
ruakh
@ruakh: El método tradicional esFor each string S in the (countable) universe of possible strings: If S is a syntactically valid proof of T, halt.
Quuxplusone
@Quuxplusone: Bueno, sí, pero eso no parece encajar en la construcción de Bakuriu. . .
ruakh
Esto es interesante, pero más allá de mi conocimiento. ¿Puedes dar más detalles, por favor?
Evorlor

Respuestas:

23

De hecho, hay programas como este. Para probar esto, supongamos lo contrario que por cada máquina que no se detiene, hay una prueba de que no se detiene.

Estas pruebas son cadenas de longitud finita, por lo que podemos enumerar todas las pruebas de longitud menor que para algunos enteros s .ss

Luego podemos usar esto para resolver el problema de detención de la siguiente manera: Dada una máquina Turing y una entrada x , usamos el siguiente algoritmo:Mx

s := 0
while (True)
    test if machine M halts on input x in s steps
    look at all proofs of length s and see if they prove M doesn't halt on input x
    set s := s + 1

Si detiene en la entrada x , entonces se detiene en un número finito de pasos s , por lo que nuestro algoritmo termina.Mxs

Si no se detiene en la entrada x , entonces, por nuestra suposición, hay algunas pruebas de longitud s donde hay una prueba de que M no se detiene. Entonces, en este caso, nuestro algoritmo siempre termina.MxsM

Por lo tanto, tenemos un algoritmo para decidir el problema de detención que siempre termina. Pero sabemos que esto no puede existir, por lo que nuestra suposición de que siempre hay una prueba de no detenerse debe ser falsa.

jmite
fuente
2
Creo que de esto también se desprende una forma más débil del teorema de incompletitud del godel. Básicamente, existen cosas que son ciertas pero que no se pueden probar. Este es uno de mis nuevos experimentos de pensamiento favoritos.
Jake
¿Crees que intentar probar P = NP o tratar de encontrar un número perfecto impar podría ser uno de estos programas?
Otakar Molnár López
1
Eso no tiene mucho sentido porque los programas que no terminan no son pruebas ni son números, pero la idea a la que te estás refiriendo ha sido planteada. Algunos dicen que PvsNP no es demostrable
Jake
1
@Jake Creo que parte de la motivación de las máquinas de Turing fue una expresión más limpia de la idea detrás del teorema de Godel.
cpast
6

Para un ejemplo algo más concreto, supongamos que la teoría que estamos utilizando para nuestras pruebas tiene las siguientes características (bastante razonables, IMO):

  1. Es consistente ; es decir, no puede probar una contradicción.
  2. Su conjunto de axiomas es recursivamente enumerable.
  3. Sus pruebas pueden escribirse como cadenas de bits finitas.
  4. La cuestión de si una cadena dada codifica una prueba bien formada y correcta es algorítmicamente decidible en un tiempo finito.
  5. Es lo suficientemente expresivo como para admitir una prueba del segundo teorema de incompletitud de Gödel , que dice que no puede probar su propia consistencia.

Con esos supuestos, el siguiente programa nunca se detendrá, pero no se puede probar (dentro del alcance de la teoría que estamos usando) que no se detenga:

let k := 0;
repeat:
    let k := k + 1;
    let s := binary expansion of k, excluding leading 1 bit;
while s does not encode a proof of a contradiction;
halt.

El detalle clave aquí es la primera suposición anterior, a saber, que la teoría que estamos utilizando para nuestras pruebas es consistente. Obviamente, debemos asumir esto, para que nuestras pruebas valgan algo, pero el segundo teorema de incompletitud de Gödel dice que, para cualquier teoría razonablemente expresiva y efectivamente axiomatizada, no podemos probar esto (excepto posiblemente en alguna otra teoría, cuya consistencia entonces Necesito asumir, etc. etc.).

Ilmari Karonen
fuente