"Alan Turing demostró en 1936 que no puede existir un algoritmo general para resolver el problema de detención para todos los posibles pares de entrada de programa"
¿Puedo encontrar un algoritmo general para resolver el problema de detención de algunos posibles pares de entrada de programa?
¿Puedo encontrar un lenguaje de programación (o lenguajes), donde para cada tipo de programa en este lenguaje, pueda decidir si el programa finaliza o se ejecuta para siempre?
Respuestas:
Si seguro. Por ejemplo, podría escribir un algoritmo que devuelva "Sí, termina" para cualquier programa que no contenga ni bucles ni recursividad y "No, no termina" para cualquier programa que contenga un
while(true)
bucle que definitivamente se alcanzará y no contiene una declaración de ruptura, y "No sé" para todo lo demás.No si ese idioma es Turing completo, no.
Sin embargo, hay idiomas completos que no son de Turing, como por ejemplo Coq , Agda o Microsoft Dafny, para los cuales el problema de detención es decidible (y de hecho lo deciden sus respectivos sistemas de tipos, lo que los convierte en idiomas totales (es decir, un programa que podría no finalizar compilar)).
fuente
Creo que todas las respuestas aquí completamente y completamente pierden el punto. La respuesta a la pregunta es: suponiendo que el programa esté destinado a detenerse, entonces sí, será mejor que pueda mostrar que se detiene. Si no puede mostrar que se detiene fácilmente, entonces el Control de calidad debe considerar que el programa está muy mal escrito y rechazado como tal.
Si realmente puede escribir un algoritmo de máquina adecuado depende del lenguaje de programación de entrada y de lo ambicioso que sea. Es un objetivo de diseño razonable para un lenguaje de programación hacer posible probar la terminación fácilmente.
Si el lenguaje es C ++, es probable que no pueda escribir la herramienta, de hecho, es poco probable que pueda ejecutar el analizador, y mucho menos probar la terminación. Para un lenguaje mejor estructurado, debería poder generar una prueba, o al menos hacerlo con ciertos supuestos: en el último caso, la herramienta debería generar estos supuestos. Un enfoque similar sería incluir aserciones de terminación en el lenguaje y usarlas en situaciones complejas donde la herramienta confiaría en las aserciones.
La conclusión es que nadie parece entender que la prueba de que un programa se detenga es realmente posible porque los (buenos) programadores que intentan escribir tales programas de detención siempre lo hacen intencionalmente y con una imagen mental de por qué terminan y actúan correctamente: dicho código es deliberadamente escrito para que quede claro que se detienen y son correctos y si un algoritmo razonable no puede probar esto, posiblemente con algunos consejos, entonces el programa debe ser rechazado.
El punto: los programadores no escriben programas arbitrarios, por lo que la tesis del teorema de detención no se cumple y la conclusión no se aplica.
fuente
excelente y (prob. involuntariamente profunda) pregunta. De hecho, existen programas de detección de detención que pueden tener éxito en conjuntos limitados de entradas. Es un área activa de investigación. tiene vínculos muy fuertes con las áreas de prueba de teoremas (automatizadas).
sin embargo, la informática no parece tener un término exacto para "programas" que "a veces" tengan éxito. la palabra "algoritmo" generalmente está reservada para programas que siempre se detienen.
el concepto parece ser claramente diferente de los algoritmos probabilísticos donde los teóricos de CS insisten en que haya alguna probabilidad conocida o computable de su éxito.
hay un término semialgoritmos que se usa a veces, pero aparentemente es un sinónimo de recursivamente enumerable o no computable.
así que para propósitos aquí, llámalos llámelos cuasialgoritmos . El concepto es diferente de decidible vs indecidible.
se podría decir que no se pueden comparar los cuasialgoritmos. pero de hecho parece haber una jerarquía natural (un ordenamiento parcial) de estos cuasialgoritmos. Supongamos que un quasialgorithm puede detectar detención de un conjunto limitado de programas de entrada dicen X . otro B puede detectar detención de un conjunto Y . si X ⊂ Y es decir, X es adecuada subconjunto de Y entonces B es "más potente" que A .A X B Y X⊂Y X Y B A
en CS, esta "jerarquía de cuasi algoritmo" parece estudiarse principalmente solo de manera informal hasta ahora.
aparece en la investigación de castores ocupados [1] y el problema PCP [2]. de hecho, un ataque informático basado en ADN en PCP puede verse como un quasialgoritmo. [3] y se ve en otras áreas ya señaladas, como la demostración de teoremas [4].
[1] Nuevo ataque del milenio al problema del castor ocupado
[2] Problema de correspondencia de Tackling Posts por Zhao (v2?)
[3] Utilizando el ADN para resolver el problema de la correspondencia posterior a los límites de Kari et al.
[4] prueba de terminación del programa por Cook et al, Comm. de la ACM
(así que esta es realmente una pregunta muy profunda que definitivamente merece estar en TCS.SE, en mi opinión ... tal vez alguien pueda volver a preguntarla de tal manera que se ajuste y permanezca)
fuente
Mientras el lenguaje de programación en cuestión sea lo suficientemente complejo (es decir, si está completo en Turing), siempre hay programas en el lenguaje que ningún programa puede terminar.
Dado que todos los lenguajes, excepto los más primitivos, son completos de Turing (solo se necesitan algo como variables y condicionales), en realidad solo puede construir lenguajes de juguete muy pequeños para los que pueda resolver el problema de detención.Editar: luz de los comentarios, permítanme ser más explícito: cualquier lenguaje que pueda diseñar para el que pueda resolver el problema de detención necesariamente tendrá que ser Turing incompleto. Esto descarta cualquier lenguaje que contenga un conjunto adecuado de ingredientes básicos (por ejemplo, "variables, condicionales y saltos", o como dice @ sepp2k, un bucle genérico "while").
Aparentemente existen varios lenguajes "simples" prácticos como ese (por ejemplo, solucionadores de teoremas como Coq y Agda). Si estos satisfacen su noción de un "lenguaje de programación", puede investigar si satisfacen algún tipo de completitud o si el problema de detención es solucionable para ellos.
fuente
Esto es bastante trivial. Si tomamos la unión de cualquier subconjunto ce de TM detenidas y cualquier subconjunto ce de TM no detenidas, el resultado será un conjunto de TM para las cuales el problema de detención es decidible (ejecute ambas máquinas en paralelo, si el primero acepta la TM se detiene, si el segundo acepta, entonces la máquina no se detiene). Sin embargo, esto no conducirá a idiomas muy interesantes.
fuente
Sí, puedes, pero dudo que sea útil. Probablemente tendría que hacerlo mediante análisis de casos y luego solo podría buscar los casos más obvios. Por ejemplo, podría grep un archivo para el código
while(true){}
. Si el archivo tiene ese código, nunca terminará ^. En términos más generales, podría decir que un programa sin bucle o recursión siempre terminará y hay varios casos que podría hacer para garantizar que un programa terminará o no, pero incluso para un programa de tamaño medio esto sería muy difícil y en muchos casos no podría darle una respuesta.tl; dr: Sí, pero no podrá hacer que sea útil para la mayoría de los programas útiles.
^ Sí, técnicamente si ese código no está en la ruta del código o si hay otros subprocesos, podría terminar, pero estoy haciendo un comentario general aquí.
fuente