Estou tendo dificuldade para ver a solução de Turing para o problema da parada como um lógico, e não como um engenheiro.
Aqui está o meu entendimento do problema da parada:
Seja o conjunto de todas as máquinas de Turing.
Deixe ser o conjunto de todas as entradas para todas as máquinas de Turing em .
Seja todo elemento em um elemento em .
Deixe os valores booleanos e serem elementos em .
Seja uma função que retorne:
- se e somente se parar
- se e somente se não parar
Seja uma máquina de Turing em que:
- chama
- pára se e somente se retornar
- não pára se e somente se retornar
O que acontece quando chamamos passando para si mesmo, ?
A parte com a qual discordo é a implementação de para que não pare quando for . Meu intestino entende essa abordagem da seguinte maneira:
Dado um método que funciona e um método projetado para quebrar , quando combinamos esses métodos para construir uma máquina, essa máquina está quebrada.
Entendo que a prova por contradição é uma abordagem válida para a solução de problemas na lógica formal, mas essa aplicação específica da prova por contradição parece falha de alguma forma.
o que estou perdendo?
fonte
Respostas:
A seguir, vou distinguir uma máquinaM de sua descrição, denotando a descrição de M de ⟨M⟩ .
Especificação do programa de teste de parada,H
Agora, supondo que exista essa máquinaH , podemos usar H como uma sub-rotina para construir um programa P do seguinte modo:
Especificação do programa "perverso"P
A chave para esse argumento é que, se pudermos definir uma máquinaH que sature a especificação acima, então podemos construir uma máquinaP isso satisfaz a segunda especificação.
Contudo,P , quando dado ⟨P⟩ , exibe comportamento impossível,
assimP falha em cumprir seu segundo requisito em pelo menos uma entrada e, consequentemente, deve ser o caso em queH não pode satisfazer sua exigência, portanto, não podemos fazer H como especificado.
AgoraH pode muito bem se comportar conforme especificado em muitas entradas (⟨M⟩,i) , mas o ponto é que não é possível criar um testador de interrupção que funcione em todas as entradas possíveis.
fonte
Aqui está como um lógico pode abordar o problema:
fonte
Você diz:
O problema é quep() NÃO foi projetado para quebrar h() , foi projetado para usar h() - e o uso é válido E funciona! Exceto, ele não funciona quando a entrada ép() , o que prova que não funciona para todas as entradas.
O que significa queh() não existe, na melhor das hipóteses hminus() existe. Não é importante quep() está quebrado, o importante é que h() não existe.
Se alguém diz que escreveuh() você sabe que eles estão enganados ou mentindo, se eles querem trabalhar para criar h() eles estão desperdiçando seu dinheiro, e assim por diante.
Estabelece limites para o que pode e o que não pode ser decidido e os recursos necessários para isso.
Se alguém fizer a pergunta: podemos determinar sep() pára devido a esta entrada? As respostas possíveis para isso são: (a) sim - sim, (b) sim - não (c) sim - mas atualmente não sabemos se sim ou não, e finalmente (d) não - é impossível provar de uma maneira ou de outra.
Ser capaz de determinar rapidamente se a resposta é (c) ou (d) pode ser extremamente útil. Lembre-se de que Halting não diz que não podemos provar uma situação específica.p() Halting diz que não podemos ter uma solução geral que funcione para qualquer entrada. Restringirp() ou a entrada e a resposta são frequentes, sim, isso é trivial.
fonte
Você não deve pensar nisso em termos de "fragilidade", porque existem muitos programas perfeitamente legítimos, projetados para rodar para sempre, portanto, rodar para sempre não é necessariamente um comportamento "quebrado".
p
é o seguinte algoritmo simples, assumindo que já temos uma funçãoh(X,Y)
que retornatrue
se a máquinaX
pára com a entradaY
e retornafalse
se não.fonte
h()
foi projetado para "atender aos requisitos do projeto" (ou seja, decidir o problema da parada). Assumimos que este programa existe e funciona.p()
é algo que um de seus programadores escreveu enquanto ele brincava na hora do almoço. Não é que "não atenda aos requisitos do projeto", é que é um programa impossível : se não pára, para; se parar, não pára. Como a suposição queh()
existe e funciona levou a uma situação impossível, somos forçados a concluir queh()
não existe.Há outra prova por contradição que você pode gostar, modelada após o paradoxo de Berry. Para uma máquina de TuringT , deixei N(T) ser a saída da máquina de Turing quando executada em uma fita vazia, interpretada como um número; possivelmenteN(T) é indefinido, se a máquina nunca parar. DeixeiXn ser o menor número que não pode ser produzido por uma máquina de Turing com no máximo n estados (existe um número assim porque existem muitas dessas máquinas de Turing). Suponha que o problema da parada fosse solucionável. Em seguida, poderíamos construir uma máquina de Turing implementando o seguinte algoritmo:
Os dois últimos estágios podem ser implementados usando uma máquina de Turing fixaC estados, e o primeiro usando um extra log2n estados. No total, obtemos uma máquina de Turing comlog2n+C afirma que calcula Xn . Quandon é grande o suficiente, chegamos a uma contradição desde log2n+C≤n : por um lado, Xn não deve ser computável usando uma máquina de Turing n estados; por outro lado, a máquina acima calcula usando apenaslog2n+C≤n estados.
Eu ouvi essa prova de Ran Raz .
fonte
O ponto do problema de parada é que é impossível decidir com um algoritmo se um determinado algoritmo é interrompido. Claro, você pode fornecer algoritmos que sempre serão interrompidos (para todas as entradas fornecidas). No entanto, você não pode decidir isso para todos os algoritmos (por exemplo,p ) com um algoritmo, portanto, nenhum algoritmo h pode existir.
Dadop(p(A))) , para um determinado algoritmo A . E seh diz lhe A pára, então o interior p não vai e o exterior p retornará falso. E seM não interrompe o interior p não vai parar, mas o exterior p retornará falso. Portanto, h não pode decidir se p será interrompido.
fonte