Que eu saiba, interromper o problema pergunta se existe um programa que decide se um programa está sendo testado, dados alguns dados de entrada (não importa qual programa seja ou quais dados de entrada que fornecemos) serão encerrados ou não. A resposta para esse problema é 'não'. Em outras palavras, não há um programa 'único' que possa verificá-lo para todos os pares possíveis (algum algoritmo, alguns dados de entrada).
Mas isso não significa que não podemos decidir se determinado programa X será encerrado ou não.
Ainda não posso comentar outras respostas, mas uma delas me chamou a atenção:
Em termos práticos, é importante porque permite que você diga a seus chefes ignorantes "o que você está pedindo é matematicamente impossível".
Talvez você possa me dizer o que essa pessoa quis dizer? No meu cenário, meu chefe ignorante pode me pedir para verificar (na verdade, provar ou refutar) se meu programa (que é um programa específico) será encerrado ou não. E, é claro, existem pares (algoritmo, dados de entrada) que podem ser comprovados para terminar (ou nunca terminar).
A questão é: posso provar isso para cada par (programa, dados de entrada) separadamente? Mesmo que a resposta seja afirmativa, existe um problema - pode haver infinitos 'dados de entrada'. Portanto, é bastante natural perguntar - posso provar, para cada algoritmo, que esse algoritmo será encerrado (ou o contrário), independentemente dos dados de entrada que forneço?
fonte
Respostas:
Não, você não pode provar isso para todos os algoritmos (máquina de Turing). Isso se torna uma questão sobre a natureza das provas e não sobre a computação.
Considere a seguinte máquina de Turing : verifique se existe uma prova para a instrução pára, de comprimento(para explicação sobre a auto-referência, consulte o teorema da recursão de Klenee). Se essa prova for encontrada, entre em um loop infinito (caso contrário, interrompa).M(x) ∀xM(x) ≤|x|
Claramente, você não pode provar que interrompido para todos os , pois se você puder encontrar uma prova do comprimento , ela não será interrompida para todas as entradas de tamanho . Além disso, você não pode provar que não é interrompido por algum , pois isso significa que existe uma prova para a interrupção de em todas as entradas (contradição). A situação aqui é que, se nosso sistema axioma é consistente, interrompido para todos os , mas você não pode prová-lo (o que significa que você pode provar em sua teoria que se é consistente, entãoM(x) x p ≥p M(x) x M M(x) x T T ∀xM(x) pára, mas você não pode provar que pára sem essa suposição, a menos que seu sistema seja inconsistente).
fonte
Para um programa específico, tenho certeza de que posso provar que o programa será interrompido em todas as entradas: meu programa tem "halt" como sua primeira instrução.
Outro exemplo: posso ter um programa específico que é um simulador de máquina de Turing (ou seja, uma máquina universal de Turing). Ele interpreta sua entrada como uma descrição de uma máquina de Turing e o simulador simula a máquina em execução em uma fita em branco. Portanto, o simulador parará se a máquina que está sendo inserida parar e funcionará para sempre se a máquina que estiver sendo inserida for executada para sempre. (Se a entrada não estiver no formato correto para descrever uma máquina de Turing, o simulador será interrompido.)
Sabemos que é impossível decidir se uma máquina de Turing arbitrária é interrompida quando iniciada em uma fita em branco. Portanto, para minha máquina de simulador específica, não há algoritmo para decidir o que ele faz com entradas arbitrárias.
Não sei se esses dois exemplos ajudam.
Certamente, em muitos domínios problemáticos, é razoável poder provar que programas específicos terminam. Se meu programa multiplicar duas matrizes, eu esperaria provar que não há como continuar para sempre.
fonte
Posso pelo menos esclarecer a pergunta hipotética que se supõe que o chefe imaginário pergunte qual leva a essa resposta:
O ponto da prova da impossibilidade é que essa tarefa não pode ser realizada. É claro que hoje é do conhecimento geral que essa tarefa pode ser bem aproximada , ou seja, é possível fornecer um algoritmo que determine se um programa irá gerar uma exceção, mas às vezes as respostas "podem gerar uma exceção", mesmo que o programa não o faça. faça na prática .
Alguns deles também são mais difíceis de praticar, por exemplo, é mais difícil provar o término do que a ausência de exceção de ponteiro nulo para "programas do mundo real" (mas equivalente em teoria).
fonte