¿Por qué es realmente tan importante el problema de detención?


149

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.


16
"una máquina determinista con memoria finita" es "aburrida" ya que no es más que un autómata finito; Estos no son útiles para modelar la computación en general. En cuanto al problema de detención: es un ejemplo específico para una función que no es (Turing) computable. Si está satisfecho con una prueba no constructiva, no la "necesita". Sin embargo, todavía tiene relevancia histórica.
Raphael

16
Dicho esto, su pregunta aparece como mal informada. Es posible que desee poner al día sus fundamentos de computabilidad teoría (que se prueba su intuición, que es informado por la realidad, no los modelos discutidos allí). Vea nuestras preguntas de referencia para comenzar. Si necesita más "pruebas" de que su intuición (en lo que respecta a la teoría) es fatalmente errónea, lea esta pregunta .
Raphael

12
"Puede usar el algoritmo que detecta si una lista enlazada se repite para implementar la función de detención con una complejidad espacial de O (1)", pero si desea resolver el problema para una computadora con 2 GB de almacenamiento, necesitará más 2 ^ 2000000000 pasos y una computadora más grande.
user2357112

11
Hace mucho tiempo estaba conversando con un amigo sobre el problema de detención y alguien sentado cerca me preguntó "¿cuál es el problema de detención? ¿Es importante?" y mi amigo se volvió hacia él y le dijo "si pudiéramos resolver el problema de detención, podríamos construir ciudades en las nubes". Esto es verdad.
Francis Davey

8
@emory La afirmación es vaciamente verdadera: P => Qes cierta para cualquier Q, si sabemos que Pes 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.
amalloy

Respuestas:


217

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.

  1. 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.

  2. 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 3000000002n2320000000002109300000000

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.


44
@Mehrdad Para cualquier definición razonable de "código de máquina más rápido posible para un programa dado", la pregunta tiene sentido y la respuesta es "No puede haber tal compilador".
David Richerby

13
También funciona para encontrar el código de máquina más corto posible, el que tiene menos accesos de memoria, etc. etc. Para programas generales, encontrar cualquier transformación óptima es indecidible. Esto es básicamente el teorema de Rice.
jmite

44
Como corolario hasta el punto de seguir buscando el algoritmo mágico de Hilbert, sin el concepto estrechamente relacionado de equivalencia de Turing, todavía estaríamos discutiendo sobre si los códigos gotos o auto modificables permiten una computación más poderosa, buscando formas de hardware computacionalmente más poderosas. , y los argumentos sobre cuál es el mejor lenguaje de programación serían mucho más subjetivos incluso de lo que son ahora.
sdenham

3
Incluso aparece en lugares que no esperarías. ¿Desea escribir un compilador de C ++ que rechace todos los programas no válidos mientras compila todos los programas válidos? Primero resuelva el problema de detención: la metaprogramación de plantillas de C ++ es completa de Turing, por lo que determinar si sus plantillas son válidas o no en el caso general requiere resolverlo.
Mark

77
@Merhrdad: Su ejemplo de "simular todo el programa de computadora" es un excelente ejemplo de por qué el problema de detención es tan importante. Para algunos programas, simular el programa no es tan sencillo como parece (por ejemplo, mira la página de wikipedia sobre la detención). Si el problema puede ser engañoso de esta forma, puedes imaginar lo difícil que es explicarle a alguien una forma más oculta (como el problema del antivirus)
Cort Ammon

49

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.




8
es posible diseñar un lenguaje que no sea completo de Turing : Ejemplo de un lenguaje completo útil que no sea de Turing: SQL (en realidad, un SQL simplificado). La completitud de Turing agregaría automáticamente la no terminación al lenguaje, que es algo que probablemente no desee al ejecutar una consulta db. (Aunque, me temo que todas las implementaciones modernas de SQL ofrecen turing-completeness de todos modos)
Bakuriu

8
@FranciscoPresencia: utilizaron un equipo de investigación, por lo que el punto general aún se mantiene.
RemcoGerlich

44
@MooingDuck: lo de Flickr no elige entre parques y pájaros, (intenta) confirmar uno o ambos. O, no XOR.
rickster

45

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).

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 56M2M256

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.

Excluyendo los programas paradójicos, el problema de detención es decidible

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"o print "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).


2
Pensaría que la pregunta de "¿hay un programa que produzca el mismo resultado que un programa autónomo dado (sin entrada sino el programa en sí), pero en menos tiempo, incluido el tiempo para cargar el programa ?" sería decidible, aunque intratable, ya que la duración máxima de los programas candidatos estaría limitada, como sería el momento de evaluar cada uno.
supercat

@supercat Sí, esta propiedad es decidible. No es decidible para el caso general de un programa que recibe información.
Gilles

1
Tenía la impresión de que el problema de detención generalmente supone que toda la información que recibirá un programa en el curso de su ejecución está incluida en el programa. Si uno tuviera una máquina que pudiera resolver mágicamente el problema de detención para cualquier programa alimentado con una secuencia particular de entrada, ¿podría esa máquina determinar si un programa detendría todas las entradas de longitud limitada?
supercat

3
@supercat No, el oráculo de detención de todos los datos estaría un paso más arriba que el oráculo de detención de todos los datos . Eso sería una buena pregunta para este sitio ... de hecho lo tenemos . Por cierto, mi modelo mental predeterminado son las funciones recursivas, donde "input" significa "argumento" y ejecutar un programa significa aplicarlo a un argumento; tienes razón en que mi declaración es falsa en un contexto que trata sobre máquinas Turing, la actualizaré.
Gilles

28

Me parece que el 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

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):=nnnn, porque podemos ver cada programa y encontrar pruebas de por qué nunca se detendrán.) Pero no puede haber un programa que calcule .Σ(n)


2
Vale la pena señalar que, en la forma común, la paradoja del mentiroso hace referencia explícita a sí misma, pero el mismo problema puede surgir incluso si no lo hace. ¿La respuesta a la declaración se formó tomando el texto, "La respuesta a la declaración se formó tomando el texto e insertando después de la primera coma una copia entre comillas, ¿no?" e insertando después de la primera coma una copia entre comillas simples, ¿no? Tal afirmación no es explícitamente autorreferencial sino que se refiere a la veracidad de una afirmación que es idéntica carácter por carácter.
supercat

2
@supercat: eh, no creo que haya visto una frase en inglés antes ...
SamB

@SamB: He visto algunos, pero decidí probar mi mano con una formulación original que, aunque más detallada que algunas, se lee (tal vez) de forma más natural.
supercat

24

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. El artículo de Wikipedia 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).

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.)

Me parece que el 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. Excluyendo los programas paradójicos, el problema de detención es decidible. Entonces, ¿por qué lo sostenemos como evidencia de lo contrario?

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 xHPxHPx

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.


1
+1 para explicar la relación entre computadoras reales, máquinas de estado finito y máquinas de Turing, que es una parte importante de la configuración de la pregunta.
David Richerby

1
Has despertado mi interés. ¿Cuál es la diferencia entre una contradicción aparente y una contradicción real?
Brent

Otra forma de decir esto: en términos generales, la programación no asume recursos limitados. La mayoría de los algoritmos que diseñamos o los programas que escribimos no están escritos para usar una cantidad limitada, o incluso fija, de recursos informáticos, a menos que los diseñamos específicamente que manera (por ejemplo, esto a menudo se requiere cuando se programa para sistemas integrados).
reinierpost

3
@Brent. Muchas paradojas no son contradictorias en absoluto, sino solo a primera vista. Cuando miramos más de cerca, resulta que hay un error en el razonamiento, o alguna palabra cuyo significado cambió ligeramente al usarlo en un contexto diferente, o algo similar. A veces, sin embargo, una paradoja saca a la luz una verdadera contradicción.
Hoopje

He estado estudiando este problema por intervalos desde mi OP. ¿El teorema de incompletitud de Gödel implica que siempre es posible encontrar alguna paradoja independientemente del sistema de lógica en uso?
Brent

17

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 no es paradójica!

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 ss2s


14

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.


14

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 ofno 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.


Es posible que desee explicar qué es una "propiedad", ya que la interpretación ingenua que uno podría hacer probablemente sea incorrecta.
Rick Decker

@rick ¿Creo que la nota al pie lo cubre ahora?
Yakk

7

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.


5

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)=1f(0)=2hh(M)MHque implementa . La opinión de Hehner es que el predicado no está bien definido para comenzar.hh


3
No te sigo. La función de detención es un predicado perfectamente bien definido y válido: para cualquier máquina de Turing y cualquier entrada, la máquina se detiene o realiza un bucle. (Le falta una referencia adecuada; ¿qué parpa está resumiendo?)
Rafael

@Raphael Que la función está bien definida generalmente se acepta como un hecho. El punto de vista de Hehner es diferente y se explica en sus documentos. Editaré mi respuesta para proporcionar los nombres de los documentos.
Theodore Norvell

Digamos que sea cual sea el argumento de Hehner [no he leído los documentos], resultaron controvertidos al menos en su primera lectura / aproximación: ' cs.toronto.edu/~hehner/Shallitaffair.pdf y recursed.blogspot.com/ 2013/10 / eric-hehner-replies.html
Fizz

Y no está claro dada la naturaleza y el número de citas que tienen los documentos de Hehner (sobre esto) de que cualquier lectura adicional (de sus trabajos sobre esto) vale la pena.
Fizz

Sus pruebas parecen muy sólidas y apuntan a que es solo una repetición de cosas tontas que puedes hacer en filosofía, como tratar de analizar la siguiente declaración autorreferencial para verificar su veracidad: "Esta oración es falsa". lo que si es verdadero significa que es falso, lo que significa que en realidad era cierto, no, eso lo hace falso nuevamente ... así que esto parece una pregunta de observación naval filosófica no tan importante. en.wikipedia.org/wiki/Liar_paradox la paradoja detenida puede ser un caso de científicos que no hablan con filósofos.
James Wakefield

3

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.


Pero si ejecutara doesHalt(programCode, input);, el programa no puede saber qué doesHaltdevuelve la función. Es imposible que el programa se detenga después de que la doesHaltfunción lo haya evaluado.
Tvde1

0

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.


Creo que estás mezclando "Turing-indecidible" con una noción muy diferente; de hecho, puede haber tropezado con la "misma vieja" falacia por accidente. Ver también aquí y aquí .
Raphael
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.