Não entendo por que o problema da parada é tão frequentemente usado para descartar a possibilidade de determinar se um programa é interrompido. O Wikipedia [artigo] [1] explica corretamente que uma máquina determinística com memória finita interromperá ou repetirá um estado anterior. Você pode usar o algoritmo que detecta se uma lista vinculada faz um loop para implementar a Função Halting com complexidade de espaço de O (1).
Parece-me que a prova do problema da parada não passa de um chamado "paradoxo", uma contradição auto-referente (pelo menos cíclica) da mesma maneira que o paradoxo do mentiroso. A única conclusão que é feita é que a função de parada é suscetível a essas perguntas malformadas.
Portanto, excluindo os programas paradoxais, a Função Halting é decidível. Então, por que a consideramos uma evidência do contrário?
4 anos depois : Quando eu escrevi isso, eu tinha acabado de assistir este vídeo . Um programador obtém alguns programas, precisa determinar quais terminam e o vídeo continua explicando por que isso é impossível. Fiquei frustrado, porque sabia que, dado alguns programas arbitrários, havia alguma possibilidade de o protagonista provar se eles terminavam. O conceito de generalidade foi perdido de alguma forma. É a diferença entre dizer "alguns programas não podem ser concluídos" e "nenhum programa pode ser finalizado". Muitos algoritmos são formalmente demonstrados para fazer isso. O fracasso em fazer essa distinção, por todas as referências que encontrei on-line, foi como cheguei ao título desta pergunta. Por esse motivo, eu realmente aprecio a resposta que redefine a função de parada como ternária em vez de booleana.
P => Q
é verdadeira para qualquer Q, se sabemos queP
é falso (e sabemos que o Problema da Parada não é solucionável). Francisco poderia também dizer "Se pudéssemos resolver o problema da parada, poderíamos encontrar uma cura para a própria morte". É assim que a implicação lógica é definida.Respostas:
Porque muitos problemas realmente práticos são o problema de parada disfarçado. Uma solução para eles resolve o problema da parada.
Você quer um compilador que encontre o código de máquina mais rápido possível para um determinado programa? Na verdade, o problema de parada.
Você possui JavaScript, com algumas variáveis com níveis altos de segurança e outras com nível baixo de segurança. Você deseja garantir que um invasor não consiga acessar as informações de alta segurança. Este também é apenas o problema da parada.
Você tem um analisador para sua linguagem de programação. Você o altera, mas deseja garantir que ele ainda analise todos os programas que costumava usar. Na verdade, o problema de parada.
Você tem um programa antivírus e deseja verificar se algum dia executa uma instrução maliciosa. Na verdade, apenas o problema de parada.
Quanto ao exemplo da wikipedia, sim, você pode modelar um computador moderno como uma máquina de estado finito. Mas há dois problemas com isso.
Todo computador seria um autômato diferente, dependendo do número exato de bits de RAM. Portanto, isso não é útil para examinar um pedaço de código específico, pois o autômato depende da máquina na qual ele pode ser executado.
Você precisaria de estados se tiver n bits de RAM. Portanto, para o seu computador moderno de 8 GB, são 2 32000000000 . Esse é um número tão grande que o wolfram alpha nem sabe como interpretá-lo. Quando eu faço 2 10 9, ele diz que tem 300000000 dígitos decimais. Isso é claramente muito grande para armazenar em um computador normal.2n 232000000000 2109 300000000
O problema da parada permite pensar sobre a dificuldade relativa dos algoritmos. Isso nos permite saber que existem alguns algoritmos que não existem e que, às vezes, tudo o que podemos fazer é adivinhar um problema e nunca sabemos se o solucionamos.
Se não tivéssemos o problema da parada, ainda estaríamos procurando o algoritmo mágico de Hilbert, que introduz teoremas e resultados, sejam eles verdadeiros ou não. Agora sabemos que podemos parar de procurar e podemos nos esforçar para encontrar heurísticas e o segundo melhor método para resolver esses problemas.
ATUALIZAÇÃO: Apenas para abordar algumas questões levantadas nos comentários.
@Tyler Fleming Cloutier: O problema "sem sentido" surge na prova de que o problema da parada é indecidível, mas o que está no cerne da indecidibilidade é realmente ter um espaço de pesquisa infinito. Você está procurando um objeto com uma determinada propriedade e, se não existir, não há como saber quando você termina.
A dificuldade de um problema pode estar relacionada ao número de quantificadores que possui. Tentando mostrar que existe ( ) um objeto com uma propriedade arbitrária, você deve procurar até encontrar um. Se não existe, não há como (em geral) saber disso. É difícil provar que todos os objetos ( ∀ ) têm uma propriedade, mas é possível procurar um objeto sem a propriedade para refutá-lo. Quanto mais alternâncias existirem entre todos e existir, mais difícil será o problema.∃ ∀
Para mais informações, consulte a Hierarquia Aritmética . Qualquer coisa acima de é indecidível, embora o nível 1 seja semi-decidível.Σ0 00 0= Π0 00 0
Também é possível mostrar que existem problemas indecidíveis sem usar um paradoxo sem sentido, como o problema de Halting ou o paradoxo de Liars. Uma máquina de Turing pode ser codificada usando uma sequência de bits, ou seja, um número inteiro. Mas um problema pode ser codificado como um idioma, ou seja, um subconjunto dos números inteiros. Sabe-se que não há bijeção entre o conjunto de números inteiros e o conjunto de todos os subconjuntos dos números inteiros. Portanto, deve haver alguns problemas (linguagens) que não possuem uma máquina de Turing associada (algoritmo).
@Brent: sim, isso admite que isso é decidível para computadores modernos. Mas é decidível para uma máquina específica. Se você adicionar uma unidade USB com espaço em disco, ou a capacidade de armazenar em uma rede, ou qualquer outra coisa, a máquina mudou e o resultado ainda não se mantém.
Também é preciso dizer que muitas vezes o algoritmo diz "esse código será interrompido" porque ele falhará e ficará sem memória, e que a adição de um único bit extra de memória faria com que o código ter sucesso e dar um resultado diferente.
O problema é que as máquinas de Turing não têm uma quantidade infinita de memória. Nunca há um tempo em que uma quantidade infinita de símbolos seja gravada na fita. Em vez disso, uma máquina de Turing tem memória "ilimitada", o que significa que você pode continuar obtendo mais fontes de memória quando precisar. Computadores são assim. Você pode adicionar RAM, pen drives ou discos rígidos ou armazenamento em rede. Sim, você fica sem memória quando fica sem átomos no universo. Mas ter memória ilimitada é um modelo muito mais útil.
fonte
Em termos práticos, é importante porque permite que você diga a seus chefes ignorantes "o que você está pedindo é matematicamente impossível".
O problema da parada e vários problemas completos do NP (por exemplo, o problema do vendedor ambulante) surgem muito na forma de "Por que você não pode simplesmente criar um programa que executa o X?" E você precisa ser capaz de dar uma explicação de por que é impossível ou inviável durante a vida útil restante do universo.
Observe que é possível projetar uma linguagem que não seja completa em Turing, para que possa ser analisada, proibindo a recursão e a iteração ilimitadas.
fonte
Para fazer isso, você precisa armazenar pelo menos duas cópias do estado parcial do programa na memória, além da sobrecarga do programa de verificação. Portanto, em um determinado computador, você não pode testar todos os programas que podem ser executados nesse computador, apenas os programas executados em um computador menor com menos da metade da memória.
O problema de parada para um determinado computador de tamanho finito não pode ser resolvido nesse computador de tamanho finito. Só pode ser resolvido em um computador maior. (Isso é verdade para qualquer método, não apenas o que você propõe. Não darei uma prova formal, mas aqui está a essência. Se um computador C pode executar N programas diferentes dos quais pelo menos um P não termina , um computador V que pode testar se esses N programas param também deve executar N programas verificadores diferentes. Se C e V são o mesmo computador, P não é um dos N programas diferentes que V executa, portanto, o o computador deve executar pelo menos N + 1 programas diferentes, o que contradiz a suposição de que C executa N programas diferentes.)
Os números ilustram que pensar em um computador como uma máquina de estados finitos raramente é prático. O número de estados pode ser finito, mas é incompreensivelmente enorme. A única maneira de raciocinar sobre programas que não são de brinquedos é em abstrato, não enumerando estados, mas através do raciocínio lógico.
O paradoxo não vem do problema, mas da tentativa de solução. Para qualquer programa, existe um algoritmo que diz "sim" se o programa terminar e "não" se o programa não terminar. É trivial: um
print "yes"
ouprint "no"
fará. O problema é determinar qual chamar. A impossibilidade de resolver o problema de parada significa que não há algoritmo para fazer essa determinação. A razão pela qual a prova usa um argumento de diagonalização é que ela precisa mostrar que nenhumasolução funciona; para fazer isso, ele inicia a partir de uma solução supostamente arbitrária e mostra que deve perder alguns programas construindo um programa perdido. A diagonalização (o que você chama inadequadamente de “paradoxo”) está na construção, não no programa resultante. Os programas resultantes não são auto-referenciais.Existe um resultado mais geral chamado teorema de Rice, que afirma que qualquer propriedade não trivialde programas é indecidível - qualquer propriedade que dependa apenas do comportamento do programa e não da maneira específica em que foi escrita (por exemplo, “o código-fonte consiste em menos de 42 caracteres?” é claramente decidível, enquanto “existe um programa cujo código fonte consiste em menos de 42 caracteres e que retorna o mesmo resultado para todas as entradas? ”não é, nem“ esse programa nunca produz alguma coisa? ”). Parar é apenas um exemplo. É importante porque geralmente aparece na prática (geralmente, queremos saber se um programa retornará um resultado em tempo razoável, considerando os recursos finitos do computador em que está sendo executado, mas como isso raramente é praticamente responsável, estamos dispostos a aceitar a pergunta mais simples sobre se o programa terminará com tempo e memória suficientes).
fonte
Não, não é disso que se trata o problema da parada. Paradoxos como o paradoxo do mentiroso não são verdadeiros ou falsos, eles simplesmente não fazem sentido. Um algoritmo determinístico, por outro lado, será interrompido para uma determinada entrada ou será executado para sempre. A função
halts(program, input)
possui um valor determinístico perfeitamente bem definido para cada programa, para cada entrada. Nós simplesmente não podemos decidir isso por nenhum programa. Ou, mais precisamente: não podemos escrever um programa que o decida para cada par de programa / entrada.Um exemplo semelhante (talvez menos abstrato) é a função "ocupado castor" , definida intuitivamente comoΣ ( n ) : = n n n n Σ ( n )
fonte
Primeiro, sim, teoricamente , faz sentido ver um computador real, que possui memória finita, como uma máquina de estados finitos. Mas, na prática, o número de estados de um computador real é tão grande que os computadores reais são muito melhor modelados por máquinas de Turing ou outros modelos de computação de estado infinito.
E segundo, mesmo teoricamente , faz sentido ver um computador moderno como uma máquina de estados infinitos. Uma máquina de Turing não possui uma fita infinita; ela possui uma fita que sempre pode ser estendida quando a máquina fica sem memória. E não é exatamente isso que podemos fazer com computadores reais? (E se o espaço de endereço da CPU acabar, podemos usar a nuvem etc.)
A prova de Turing da indecidibilidade do problema da parada usa um truque que é semelhante ao paradoxo do mentiroso, sim. Um paradoxo é frequentemente definido como uma aparente contradição, e algumas pessoas inferem disso que um paradoxo não é, portanto, uma contradição real . No entanto, o paradoxo de Russel (a contrapartida formal da teoria dos conjuntos do paradoxo do mentiroso) mostrou uma contradição real na matemática, e a prova da indecidibilidade do problema da parada usa uma contradição real para sua prova por contradição.
fonte
jmite respondeu à pergunta muito bem. Deixe-me acrescentar uma pequena nota lateral sobre a similaridade percebida com o "Paradoxo do Mentiroso", que eu acho que é causada pelo uso de um mecanismo de auto-referência.
A auto-referência é uma ferramenta realmente útil na computação (que um algoritmo pode se referir ao seu código, reflexão ) e linguagem humana (que podemos nos referir a nós mesmos, autoconsciência ).
O problema que causa o paradoxo do mentiroso não é a auto-referência, ele está tentando usar o predicado de verdade para uma linguagem (formal) dentro da linguagem. Isso causará problemas mesmo sem a auto-referência; não precisamos da capacidade de usar a auto-referência para obter um paradoxo: a auto-referência pode ser eliminada! . Isso tornaria a frase menos agradável e concisa, mas não é difícil de fazer. É essencialmente como o teorema do ponto fixo de Kleene é comprovado. O que o Paradoxo do Mentiroso implica é que a verdade das afirmações em uma linguagem (formal) é transcendental a essa linguagem, não que a auto-referência seja problemática.
Parece-me que seu desconforto não se deve à indecidibilidade do problema de parada (para máquinas de Turing), mas à aceitação das máquinas de Turing como modelo teórico para computadores. Normalmente (embora nem sempre) máquinas de Turing (e modelos equivalentes de computação como máquinas de acesso aleatório ) são muito úteis para discutir a computação em computadores reais do que os autômatos finitos e existem boas razões para isso (lembre-se de que uma máquina de Turing não possui uma quantidade infinita de memória, possui uma quantidade ilimitada de memória e estas são coisas diferentes: ilimitado significa que podemos fornecer à máquina mais memória quando ela precisar, e não que ela use uma quantidade infinita de memória).
Claro, se você quer pensar em computadores como autômatos finitos, e isso faz sentido para o seu propósito, então o problema de parada para autômatos finitos é decidível (e por decidível queremos dizer decidível por uma máquina de Turing, não por autômatos finitos). Entretanto, não é isso que as pessoas normalmente querem dizer quando usam o problema de parada, elas querem dizer o problema de parada para as máquinas de Turing.
fonte
o problema da parada introduziu um novo conceito matemático de "indecidibilidade" que não existia anteriormente em matemática. era uma prova ("aparentemente paradoxal") de que alguns problemas não têm "provas". está ligado ao conceito godeliano de improvabilidade. O teorema de Godels precedeu a formulação do problema de parada por Turing por alguns anos. O resultado de Godels era considerado bastante abstrato na época e era conhecido apenas por pesquisadores e especialistas. A formulação de Turings mostrou que o princípio da indecidibilidade estava relacionado a práticas / pragmáticas / aplicadas em ciência da computação, como determinar se programas arbitrários são interrompidos e é considerado um conceito muito menos teórico, que aparece em desafios modernos como " (um desafio se os computadores podem descobrir teoremas) e comprovar o encerramento do programa.
Outro ângulo interessante é que existem alguns problemas muito antigos na teoria dos números (diofantinos) originários dos gregos que não são comprovados por milênios. há um resultado relacionado que perguntas gerais sobre equações diofantinas são indecidíveis chamadas Hilberts 10o problema / teorema . Hilbert viveu na virada do século XX e propôs como um programa de pesquisa que a matemática pudesse encontrar abordagens sistemáticas para os problemas de matemática. esse desafio / plano foi seriamente atingido pela descoberta da indecidibilidade algumas décadas depois. a indecidibilidade continua sendo uma área de pesquisa muito avançada e a fronteira entre problemas indecidíveis e decidíveis provavelmente sempre estará sob estudo e análise adicionais.
fonte
Você parece estar confundindo a prova clássica baseada em "auto-referencial" de que o problema de Halting não pode ser resolvido com o próprio problema de Halting (também conhecido como Halt).
Esse programa auto-referencial - o programa que interrompe se e somente se não parar - é construído para facilitar a prova de que você não pode resolver o Halt. O fato de provarmos que X é impossível através da técnica Y não implica que Y é a única razão pela qual não podemos resolver X.
Dito de outra forma, não apenas não podemos resolver Halt, como também não podemos detectar que um programa é o tipo de programa que não podemos determinar se ele pára, exceto uma medida grosseira como "se demorar mais de um minuto para executar, finja não para ".
Se você começar do problema de parada e reduzir outros problemas, finalmente chegará ao ponto em que reduziu quase todas as perguntas sobre os programas. Terminamos com o Teorema de Rice:
Seja S alguma propriedade não trivial de 1 o que uma Máquina de Turing aceita. Isso significa que há pelo menos uma Máquina de Turing que aceita entrada com a propriedade S e outra que não.
Então, é indecidível se uma determinada máquina de Turing T aceita entrada com a propriedade S.
Você quer saber se uma máquina de Turing aceita números inteiros? Indecidível.
Você quer saber se uma máquina de Turing aceita aceita seqüências aritméticas? Indecidível.
Você pode argumentar sobre as tripas da Turing Machine em geral. Você pode raciocinar sobre uma máquina de Turing específica e provar se ela irá parar / aceitar alguma sequência / etc. Mas você não pode saber se sua técnica funcionará na próxima máquina de Turing que você a alimentar.
1 Por
property of
ele, não inclui o mecanismo de como é aceito - apenas o que é aceito. "Ele aceita em 100 etapas ou menos" é uma propriedade como aceita, não do que é aceito.fonte
Você está certo de que o problema da interrupção, como comumente apresentado e declarado, é um mero problema. Isso não prova que não pode haver uma função de parada de três valores ('paradas', 'loops', 'não sei') que, na prática, sempre retorna 'paradas' ou 'loops' e retorna apenas 'don' não sei 'para caixas de canto especialmente construídas, por exemplo.
Duas razões pelas quais o problema da parada é significativo:
1) Este é um dos primeiros problemas comprovadamente indecidíveis. Mesmo que hipoteticamente houvesse apenas um "não sei", ainda seria de grande interesse matemático.
2) Alguns problemas se reduzem ao problema de parada, em que um invasor mal-intencionado pode fornecer o caso a ser analisado. Isso nos obriga a aceitar que pode haver casos válidos que ainda precisamos rejeitar.
Como uma reflexão tardia para o segundo ponto, a análise de software é um problema difícil, embora muito progresso tenha sido feito tanto na análise quanto no design da linguagem, a fim de facilitar a análise. Se você pode mostrar que uma determinada tarefa é semelhante à análise de software, sim, é difícil com letra maiúscula H. 'É impossível porque isso equivale a resolver o problema de parada', embora tecnicamente errado ou irrelevante em muitos casos, é frequentemente usado taquigrafia para esta observação.
fonte
Há um argumento contrário apresentado por Eric Hehner em uma série de artigos que argumentam que a insolubilidade do Problema da Parada é comumente mal compreendida. Os artigos "Epimenides, Gödel, Turing: um eterno emaranhado dourado", "Problemas com o problema de parada", "Reconstruindo o problema de parada" e "Problema de parada" podem ser encontrados aqui . Para que essa resposta não seja "apenas um link", tentarei resumir uma de suas conclusões, mas não o argumento.
fonte
Eu gostaria de oferecer uma explicação diferente da importância do problema da parada que envolve pessoas e não máquinas.
É a última palestra do curso de Estrutura e Interpretação do MIT 1986 ; o professor pergunta "Há alguma pergunta?" e se prepara para encerrar a palestra, quando um dos alunos pergunta: "Esta é a última pergunta?"
Pense nisso por um momento. Como o professor pode responder isso? Se o aluno decidir contradizer o professor, não há resposta válida que o professor possa dar - isso é exatamente como o problema da interrupção.
Estamos acostumados a pensar abstratamente sobre o problema da parada, usando funções e máquinas, mas é muito mais profundo do que isso. Fundamentalmente, isso significa que existem perguntas perfeitamente válidas que não podem ser respondidas.
PS: Se você não sabe do que estou falando, assista, é incrível.
fonte
doesHalt(programCode, input);
, o programa não pode saber o que adoesHalt
função retorna. É impossível que o programa seja interrompido após adoesHalt
função ter avaliado.Eu posso escrever facilmente um programa que, dado uma entrada n, produz o menor primo p> n, de modo que p + 2 também seja um primo, ou roda para sempre, se esse p não existir. Se você puder resolver o problema para prever se meu programa é interrompido para cada entrada, você acabou de resolver a Conjectura Twin Prime.
É bem possível que essa conjectura seja indecidível; nesse caso, teríamos um programa direto em que o programa de interrupção falha.
fonte