No entiendo por qué el problema de detención se usa con tanta frecuencia para descartar la posibilidad de determinar si un programa se detiene. La Wikipedia [artículo] [1] explica correctamente que una máquina determinista con memoria finita detendrá o repetirá un estado anterior. Puede usar el algoritmo que detecta si una lista vinculada realiza un bucle para implementar la función de detención con la complejidad espacial de O (1).
Me parece que la prueba del problema de detención no es más que una llamada "paradoja", una contradicción autorreferenciada (al menos cíclica) de la misma manera que la paradoja del mentiroso. La única conclusión que hace es que la función de detención es susceptible a preguntas mal formadas.
Entonces, excluyendo los programas paradójicos, la función de detención es decidible. Entonces, ¿por qué lo sostenemos como evidencia de lo contrario?
4 años después : cuando escribí esto, acababa de ver este video . Un programador obtiene algunos programas, debe determinar cuáles terminan y el video continúa para explicar por qué eso es imposible. Estaba frustrado, porque sabía que dados algunos programas arbitrarios, había alguna posibilidad de que el protagonista pudiera probar si terminaron. El concepto de generalidad se perdió de alguna manera. Es la diferencia entre decir "no se puede probar que algunos programas terminen" y "no se puede probar que ningún programa termine". Se demuestra formalmente que muchos algoritmos lo hacen. El hecho de no hacer esta distinción, por cada referencia que encontré en línea, fue cómo llegué al título de esta pregunta. Por esta razón, realmente aprecio la respuesta que redefine la función de detención como ternaria en lugar de booleana.
P => Q
es cierta para cualquier Q, si sabemos queP
es falsa (y sabemos que el problema de detención no es solucionable). Francis también podría decir "Si pudiéramos resolver el problema de detención, podríamos encontrar una cura para la muerte misma". Es la forma en que se define la implicación lógica.Respuestas:
Porque muchos problemas realmente prácticos son el problema de detención disfrazado. Una solución para ellos resuelve el problema de detención.
¿Desea un compilador que encuentre el código de máquina más rápido posible para un programa dado? En realidad el problema de detención.
Tiene JavaScript, con algunas variables con niveles de seguridad altos y otras con niveles de seguridad bajos. Desea asegurarse de que un atacante no pueda acceder a la información de alta seguridad. Esto también es solo el problema de detención.
Tiene un analizador para su lenguaje de programación. Lo cambia, pero desea asegurarse de que aún analice todos los programas que solía. En realidad el problema de detención.
Tiene un programa antivirus y desea ver si alguna vez ejecuta una instrucción maliciosa. En realidad, solo el problema de la detención.
En cuanto al ejemplo de Wikipedia, sí, podría modelar una computadora moderna como una máquina de estado finito. Pero hay dos problemas con esto.
Cada computadora sería un autómata diferente, dependiendo de la cantidad exacta de bits de RAM. Por lo tanto, esto no es útil para examinar un fragmento de código en particular, ya que el autómata depende de la máquina en la que puede ejecutarse.
Necesitaría estados si tiene n bits de RAM. Entonces, para su computadora moderna de 8GB, eso es . Este es un número tan grande que Wolfram Alpha ni siquiera sabe cómo interpretarlo. Cuando hago dice que tiene dígitos decimales. Esto es claramente demasiado grande para almacenar en una computadora normal.2 32000000000 2 10 9 3000000002n 232000000000 2109 300000000
El problema de detención nos permite razonar sobre la dificultad relativa de los algoritmos. Nos permite saber que hay algunos algoritmos que no existen, que a veces, todo lo que podemos hacer es adivinar un problema y nunca saber si lo hemos resuelto.
Si no tuviéramos el problema de la detención, aún estaríamos buscando el algoritmo mágico de Hilbert que introduce teoremas y resultados, ya sean verdaderos o no. Ahora sabemos que podemos dejar de buscar, y podemos poner nuestros esfuerzos en encontrar la heurística y el segundo mejor método para resolver estos problemas.
ACTUALIZACIÓN: Solo para abordar un par de cuestiones planteadas en los comentarios.
@Tyler Fleming Cloutier: El problema "sin sentido" surge en la prueba de que el problema de detención es indecidible, pero lo que está en el centro de la indecidibilidad es realmente tener un espacio de búsqueda infinito. Está buscando un objeto con una propiedad determinada y, si no existe, no hay forma de saber cuándo ha terminado.
La dificultad de un problema puede estar relacionada con la cantidad de cuantificadores que tiene. Intentando mostrar que existe ( ) un objeto con una propiedad arbitraria, debe buscar hasta encontrar uno. Si no existe ninguno, no hay forma (en general) de saber esto. Probar que todos los objetos ( ) tienen una propiedad es difícil, pero puede buscar un objeto sin la propiedad para refutarlo. Cuantas más alternancias haya entre todo y existe, más difícil es un problema.∀∃ ∀
Para más información sobre esto, vea la Jerarquía aritmética . Cualquier cosa por encima de es indecidible, aunque el nivel 1 es semi-decidible.Σ00=Π00
También es posible demostrar que hay problemas indecidibles sin utilizar una paradoja sin sentido como el problema de detención o la paradoja de los mentirosos. Una máquina de Turing puede codificarse utilizando una cadena de bits, es decir, un número entero. Pero un problema puede codificarse como un lenguaje, es decir, un subconjunto de los enteros. Se sabe que no hay biyección entre el conjunto de enteros y el conjunto de todos los subconjuntos de enteros. Por lo tanto, debe haber algunos problemas (idiomas) que no tienen una máquina de Turing asociada (algoritmo).
@Brent: sí, esto admite que esto es decidible para las computadoras modernas. Pero es decidible para una máquina específica. Si agrega una unidad USB con espacio en disco, o la capacidad de almacenar en una red, o cualquier otra cosa, entonces la máquina ha cambiado y el resultado aún no se mantiene.
También hay que decir que habrá muchas veces en que el algoritmo diga "este código se detendrá" porque el código fallará y se quedará sin memoria, y que agregar un solo bit adicional de memoria haría que el código tener éxito y dar un resultado diferente.
La cuestión es que las máquinas de Turing no tienen una cantidad infinita de memoria. Nunca hay un momento en que una cantidad infinita de símbolos se escriben en la cinta. En cambio, una máquina Turing tiene memoria "ilimitada", lo que significa que puede seguir obteniendo más fuentes de memoria cuando la necesite. Las computadoras son así. Puede agregar RAM, memorias USB, discos duros o almacenamiento en red. Sí, te quedas sin memoria cuando te quedas sin átomos en el universo. Pero tener memoria ilimitada es un modelo mucho más útil.
fuente
En términos prácticos, es importante porque le permite decirles a sus jefes ignorantes que "lo que están pidiendo es matemáticamente imposible".
El problema de detención y varios problemas de NP completo (por ejemplo, el problema del vendedor ambulante) surgen mucho en la forma de "¿Por qué no puedes simplemente hacer un programa que haga X?", Y necesitas poder dar una explicación de por qué es imposible o inviable dentro de la vida restante del universo.
Tenga en cuenta que es posible diseñar un lenguaje que no sea completo de Turing, por lo que puede analizarse, prohibiendo la recursión y la iteración ilimitadas.
fuente
Para hacer eso, debe almacenar al menos dos copias del estado parcial del programa en la memoria, más la sobrecarga del programa de verificación. Entonces, en una computadora determinada, no puede probar todos los programas que se pueden ejecutar en esa computadora, solo los programas que se ejecutan en una computadora más pequeña con menos de la mitad de memoria.
El problema de detención para una computadora de tamaño finito dado no se puede resolver en esa computadora de tamaño finito. Solo se puede resolver en una computadora más grande. (Esto es cierto para cualquier método, no solo el que usted propone. No voy a dar una prueba formal, pero aquí está la esencia. Si una computadora C puede ejecutar N programas diferentes de los cuales al menos una P no termina , entonces una computadora V que puede probar si estos N programas se detiene también debe poder ejecutar N programas verificadores diferentes. Si C y V son la misma computadora, entonces P no es uno de los N programas diferentes que ejecuta V, entonces la computadora debe ejecutar al menos N + 1 programas diferentes, lo que contradice la suposición de que C ejecuta N programas diferentes).
Además, no puede simplemente usar el algoritmo para detectar un bucle en una lista vinculada. Necesitas saber cuándo parar. Puede detenerse una vez que haya ejecutado tantos pasos como haya estados en la computadora. Si un programa usa hasta bits de memoria, puede tener estados diferentes. Esto muy rápidamente se vuelve imposible. Por ejemplo, una computadora típica se ejecuta en el orden de mil millones de instrucciones por segundo; mil millones de segundos son poco más de 30 años. Entonces, si ejecuta una computadora durante 8 años, puede probar si un programa con aproximadamente 250 millones de millones de estados potenciales se detiene. Pero eso es solo estados, es decir, solo puede probar un programa que funciona en 7 bytes de memoria.2 M 2 56M 2M 256
Los números allí ilustran que pensar en una computadora como una máquina de estado finito rara vez es práctico. El número de estados puede ser finito, pero es alucinante, prácticamente imposible. La única forma de razonar sobre los programas que no son de juguete es en abstracto, no enumerando los estados sino a través del razonamiento lógico.
La paradoja no proviene del problema, sino del intento de solución. Para cualquier programa dado, hay un algoritmo que dice "sí" si el programa termina y "no" si el programa no termina. Es trivial:
print "yes"
oprint "no"
lo hará. El problema es determinar a quién llamar. La imposibilidad de resolver el problema de detención significa que no hay un algoritmo para hacer esta determinación. La razón por la que la prueba usa un argumento de diagonalización es que necesita mostrar que nola solución funciona; para hacer eso, parte de una supuesta solución arbitraria y muestra que debe perder algunos programas al construir un programa perdido. La diagonalización (lo que usted llama inapropiadamente una "paradoja") está en la construcción, no en el programa resultante. Los programas resultantes no son autorreferenciales.Hay un resultado más general llamado teorema de Rice que establece que cualquier propiedad no trivialde programas es indecidible: cualquier propiedad que dependa solo del comportamiento del programa y no de la forma específica en que está escrita (por ejemplo, "¿el código fuente consta de menos de 42 caracteres?" es claramente decidible, mientras que "¿hay un ¿el programa cuyo código fuente consta de menos de 42 caracteres y que devuelve el mismo resultado para todas las entradas? Detener es solo un ejemplo. Es importante porque a menudo aparece en la práctica (por lo general, queremos saber si un programa devolverá un resultado en un tiempo razonable dados los recursos limitados de la computadora en la que se está ejecutando, pero dado que esto rara vez es prácticamente responsable, estamos dispuesto a conformarse con la pregunta más simple sobre si el programa finalmente terminará dado el tiempo y la memoria suficientes).
fuente
No, de eso no se trata el problema de la detención. Paradojas como la paradoja del mentiroso no son verdaderas o falsas, simplemente no tienen sentido. Un algoritmo determinista, por otro lado, se detendrá para una entrada determinada o se ejecutará para siempre. La función
halts(program, input)
tiene un valor determinista perfectamente bien definido para cada programa, para cada entrada. Simplemente no podemos decidirlo por ningún programa. O, más precisamente: no podemos escribir un programa que pueda decidirlo para cada par de programa / entrada.Un ejemplo similar (quizás menos abstracto) es la función "castor ocupado" , definida intuitivamente como La secuencia más larga de 1 es una máquina de Turing con estados, comenzando con una cinta vacía, puede escribir antes de que termine. Para cualquier , solo hay un número finito de máquinas de Turing, y cada una de ellas termina en algún momento (entonces puede contar la cantidad de unidades), o se ejecuta para siempre (entonces el castor ocupado no se preocupa por eso: solo mira los programas que terminan). Entonces, la función de castor ocupado tiene un valor determinista para cada . (Incluso lo sabemos por algunos pequeñosn n n n Σ ( n )Σ(n):= n n n n , porque podemos ver cada programa y encontrar pruebas de por qué nunca se detendrán.) Pero no puede haber un programa que calcule .Σ(n)
fuente
Primero, sí, teóricamente tiene sentido ver una computadora real, que tiene memoria finita, como una máquina de estados finitos. Pero en la práctica, el número de estados de una computadora real es tan grande que las máquinas Turing u otros modelos de cómputo de estado infinito modelan mucho mejor las computadoras reales.
Y segundo, incluso teóricamente tiene sentido ver una computadora moderna como una máquina de estado infinito. Una máquina de Turing no tiene una cinta infinita, tiene una cinta que siempre se puede extender cuando la máquina se queda sin memoria. ¿Y no es eso exactamente lo que podemos hacer con computadoras reales? (Y si el espacio de direcciones de la CPU se agota, podemos usar la nube, etc.)
Hay una diferencia entre el problema de detención y la prueba de su indecidibilidad. El problema de detención es solo una especificación para un programa : como entrada, el programa obtiene el código fuente de un programa y una entrada , y el programa debe devolver verdadero si detiene en la entrada y falso de lo contrario. Esta es una especificación muy clara; no tiene nada de paradójico: cada par de código fuente y entrada tiene una respuesta correcta bien definida.P x H P xH P x H P x
La prueba de Turing de la indecidibilidad del problema de detención utiliza un truco que es similar a la paradoja del mentiroso, sí. Una paradoja a menudo se define como una aparente contradicción, y algunas personas deducen de eso que, por lo tanto, no es una contradicción real . Sin embargo, la paradoja de Russel (la contraparte formal de la teoría de conjuntos de la paradoja del mentiroso) mostró una verdadera contradicción en las matemáticas, y la prueba de la indecidibilidad del problema de detención utiliza una contradicción real para su prueba por contradicción.
fuente
jmite ha respondido la pregunta muy bien. Permítanme agregar una pequeña nota al margen sobre la similitud percibida con la "paradoja del mentiroso" que creo que es causada por el uso de un mecanismo de autorreferencia.
La autorreferencia es una herramienta realmente útil en la computación (que un algoritmo puede referirse a su código, reflexión ) y el lenguaje humano (que podemos referirnos a nosotros mismos, la autoconciencia ).
El problema que causa la paradoja del mentiroso no es la auto-referencia, está tratando de usar el predicado de verdad para un lenguaje (formal) dentro del lenguaje. Causará problemas incluso sin autorreferencia, no necesitamos la capacidad de utilizar la autorreferencia para obtener una paradoja: ¡ la autorreferencia puede eliminarse! . Simplemente haría la oración menos agradable y concisa, pero no es difícil de hacer. Es esencialmente cómo se prueba el teorema del punto fijo de Kleene . Lo que implica la paradoja del mentiroso es que la verdad de las declaraciones en un lenguaje (formal) es trascendental a ese lenguaje, no que la autorreferencia sea problemática.
Me parece que su incomodidad no se debe a la indecidibilidad del problema de detención (para las máquinas Turing) sino a la aceptación de las máquinas Turing como modelo teórico para las computadoras. Por lo general (aunque no siempre) las máquinas de Turing (y modelos equivalentes de computación como las máquinas de acceso aleatorio ) son muy útiles para la discusión de la computación en computadoras reales que los autómatas finitos y hay buenas razones para ello (tenga en cuenta que una máquina de Turing no tiene una cantidad infinita de memoria, tiene una cantidad ilimitada de memoria y estas son cosas diferentes: ilimitada significa que podemos proporcionarle a la máquina más memoria cuando la necesita, no que use una cantidad infinita de memoria).
Claro, si quieres pensar en las computadoras como autómatas finitos, y eso tiene sentido para tu propósito, entonces el problema de detención para autómatas finitos es decidible (y decidible nos referimos a decidible por una máquina Turing, no por un autómata finito). Sin embargo, eso no es lo que las personas normalmente quieren decir cuando usan el problema de detención, sino el problema de detención para las máquinas Turing.
También tenga en cuenta que la teoría de autómatas se usa mucho en análisis de programas y verificación de software. Si sabe que es un límite superior en la cantidad de memoria que utilizará su algoritmo, no puede ejecutarse durante más de pasos y detenerse. Pero 1. necesita que sepas un límite superior en la cantidad de memoria que usará el algoritmo, 2. incluso entonces la decisión de si ese algoritmo se detiene o no toma una cantidad de tiempo exponencial que generalmente no es un algoritmo muy útil.2 ss 2s
fuente
El problema de detención introdujo un nuevo concepto matemático de "indecidibilidad" que no existía previamente en las matemáticas. fue una prueba ("aparentemente paradójica") de que algunos problemas no tienen "pruebas". está conectado al concepto godeliano de no demostrabilidad. El teorema de Godels precedió a la formulación del problema de detención por Turing por unos pocos años. El resultado de Godels se consideró bastante abstracto en ese momento y solo era conocido por investigadores y especialistas. La formulación de Turings mostró que el principio de indecidibilidad estaba relacionado con preguntas altamente prácticas / pragmáticas / aplicadas en ciencias de la computación, como determinar si los programas arbitrarios se detienen y si se lo considera un concepto mucho menos teórico, aparece en desafíos modernos como " (un desafío si las computadoras pueden descubrir teoremas) y probar la finalización del programa.
Otro ángulo interesante es que hay algunos problemas muy antiguos en la teoría de números (diofantina) que se originan con los griegos y que no han sido probados durante milenios. hay un resultado relacionado de que las preguntas generales sobre las ecuaciones de diofantina son indecidibles llamadas décimo problema / teorema de Hilbert . Hilbert vivió a principios del siglo XX y propuso como programa de investigación que las matemáticas pudieran encontrar enfoques sistemáticos para los problemas matemáticos. Este desafío / plan fue golpeado seriamente por el descubrimiento de la indecidibilidad de algunas décadas más tarde. La indecidibilidad continúa siendo un área de investigación muy avanzada y la frontera entre los problemas decidibles y decidibles probablemente siempre estará bajo estudio y análisis adicionales.
fuente
Parece confundir la clásica prueba basada en "autorreferencial" de que el problema de detención no se puede resolver con el problema de detención (también conocido como Halt).
Ese programa autorreferencial, el programa que se detiene si y solo si no se detiene, se construye para que sea fácil demostrar que no puede resolver Halt. El hecho de que demostremos que X es imposible mediante la técnica Y no implica que Y sea la única razón por la que no podemos resolver X.
Para decirlo de otra manera, no solo no podemos resolver Halt, no podemos detectar que un programa sea el tipo de programa que no podemos determinar si se detiene, aparte de una medida cruda como "si tarda más de 1 minuto en ejecutarse, pretenda no se detiene ".
Si comienza con el problema de detención y reduce otros problemas, eventualmente llega al punto de haber reducido casi todas las preguntas sobre los programas al respecto. Terminamos con el teorema de Rice:
Sea S una propiedad no trivial de 1 que acepta una máquina de Turing. Eso significa que hay al menos una máquina de Turing que acepta entradas con la propiedad S, y una que no.
Entonces es indecidible si una máquina Turing dada T acepta entradas con la propiedad S.
¿Quieres saber si una máquina de Turing acepta números enteros? Indecidible
¿Quiere saber si una máquina de Turing acepta acepta secuencias aritméticas? Indecidible
Puede razonar sobre las agallas de Turing Machine en general. Puede razonar sobre una máquina de Turing en particular y probar si detendrá / aceptará alguna secuencia / etc. Pero no puede saber si su técnica funcionará en la próxima máquina de Turing que la alimente.
1 Por
property of
no incluye el mecanismo de cómo se acepta, sino de lo que se acepta. "Acepta en 100 pasos o menos" es una propiedad de cómo acepta, no de lo que se acepta.fuente
Tiene razón en que el problema de detención, como se presenta y se establece comúnmente, es un simple problema. No prueba que no pueda haber una función de detención de tres valores ('paradas', 'bucles', 'no sé') que en la práctica siempre devuelve 'paradas' o 'bucles' y solo devuelve 'don' t know 'para casos de esquina especialmente construidos, por ejemplo.
Dos razones por las cuales el problema de detención es significativo:
1) Este es uno de los primeros problemas demostrablemente indecidibles. Incluso si hipotéticamente solo hubiera un "no sé", aún sería de gran interés matemático.
2) Algunos problemas se reducen al problema de detención donde un atacante malintencionado puede proporcionar el caso para ser analizado. Esto nos obliga a aceptar que puede haber casos válidos que todavía tenemos que rechazar.
Como una ocurrencia tardía al segundo punto, el análisis de software es un problema difícil, aunque se ha avanzado mucho tanto en el análisis como en el diseño del lenguaje para facilitar el análisis. Si puede demostrar que una determinada tarea es similar al análisis de software, sí, es difícil con una H mayúscula. "Es imposible porque equivaldría a resolver el problema de detención", aunque técnicamente es incorrecto o irrelevante en muchos casos, a menudo se usa un Taquigrafía para esta observación.
fuente
Hay un argumento contrario presentado por Eric Hehner en una serie de documentos que argumentan que la insolubilidad del problema de detención es comúnmente mal entendida. Los documentos, "Epimenides, Gödel, Turing: an Eternal Golden Tangle", "Problemas con el problema de detención", "Reconstrucción del problema de detención" y "Problema de detención", se pueden encontrar aquí . Para que esta respuesta no sea "solo enlace", intentaré resumir una de sus conclusiones, pero no el argumento.
La conclusión es que: la razón por la cual el problema de detención no se puede resolver no es porque un programa que pretende resolverlo puede usarse para crear una contradicción, sino más bien porque el problema en sí no es implementable, en el mismo sentido que una especificación de una función que debe devolver tanto 1 como 2 al mismo tiempo no es implementable. No nos parece destacable que no haya un programa para satisfacer una especificación , por lo que no deberíamos encontrarlo tan notable que no haya un programa para resolver el problema de detención. La opinión estándar es que hay un predicado bien definido tal que es verdadero si la máquina de Turing detiene en una cinta en blanco y es falso de lo contrario, pero que no hay ningún programah h ( M ) M H h hf(0)=1∧f(0)=2 h h(M) M H que implementa . La opinión de Hehner es que el predicado no está bien definido para comenzar.h h
fuente
Me gustaría ofrecer una explicación diferente de la importancia del problema de detención que involucra a las personas en lugar de las máquinas.
Es la última conferencia del curso de Estructura e Interpretación del MIT 1986 ; el profesor pregunta "¿Hay alguna pregunta?" y se prepara para finalizar la conferencia, cuando uno de los estudiantes pregunta: "¿Es esta la última pregunta?"
Piensa un momento en ello. ¿Cómo puede el maestro responder esto? Si el estudiante decide contradecir al maestro, no hay una respuesta válida que el maestro pueda dar, esto es como el problema de detención.
Estamos acostumbrados a pensar en el problema de la detención de manera abstracta, utilizando funciones y máquinas, pero es mucho más profundo que eso. Básicamente, significa que hay preguntas perfectamente válidas que no se pueden responder.
PD: Si no sabes de qué curso estoy hablando, ve a verlo, es increíble.
fuente
doesHalt(programCode, input);
, el programa no puede saber quédoesHalt
devuelve la función. Es imposible que el programa se detenga después de que ladoesHalt
función lo haya evaluado.Puedo escribir fácilmente un programa que proporcione una entrada n, ya sea que produzca el primo p> n más pequeño de modo que p + 2 también sea un primo, o se ejecute para siempre si no existe tal p. Si puede resolver el problema para predecir si mi programa se detiene por cada entrada, simplemente resolvió la Conjetura de Twin Prime.
Es muy posible que esta conjetura se demuestre indecidible, en cuyo caso tendríamos un programa sencillo donde falla el programa de detención.
fuente