Problema de parada - um problema que está me incomodando


8

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?


Se nós pode encontrar todas essas provas é uma questão de lógica, eu acho, mas certamente há muitos que não encontramos ainda .
Raphael

o problema de parada é definido como um algoritmo específico que pode determinar se algum programa será interrompido ou não. Verificando um programa específico (ou mesmo vários programas específicos) com diferentes algoritmos se eles podem deter ou não é factível (o caso isnt geral)
Nikos M.

Respostas:


6

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)xppM(x)xMM(x)xTTxM(x) pára, mas você não pode provar que pára sem essa suposição, a menos que seu sistema seja inconsistente).


Esta é a resposta para 'posso provar, para cada algoritmo, que esse algoritmo será encerrado (ou o oposto), independentemente dos dados de entrada que forneço?' - apenas para ter certeza.
precisa saber é o seguinte

Sim. Precisa de mais caracteres
Ariel

Você também pode estar interessado nos resultados incompletos de Godel : basicamente, em qualquer sistema lógico poderoso o suficiente para falar sobre aritmética, há afirmações verdadeiras que não podem ser provadas.
Jmite

M - máquina de Turing, - sua entrada. Em seguida, executamos com, digamos, . O programa se traduz em: "verifique se existe uma prova para a declaração: para todos os M (2) paradas, de comprimento ..." Não faz sentido dizer para todos os . Ou talvez não seja assim que eu deva olhar. xx=2222
precisa saber é o seguinte

A variável quantificada é nova, pense nisso como pára. (a entrada) aparece apenas como o limite do comprimento da prova. yM(y)x
Ariel

2

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.


2

Posso pelo menos esclarecer a pergunta hipotética que se supõe que o chefe imaginário pergunte qual leva a essa resposta:

Você pode criar um programa que aceite esse outro programa / modelo / consulta ao banco de dados / etc. que sempre determine se encerra / gera uma exceção / fica sem memória?

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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.