Estou tendo problemas para entender a prova da indecidibilidade do problema da parada.
Se retorna se o programa interrompido ou não na entrada b , por que precisamos passar o código de P para ambos a e b ?a b P a b
Por que não podemos alimentar com e alguma entrada arbitrária, digamos, ?
Respostas:
A prova tem como objetivo encontrar uma contradição. Você precisa entender qual é a contradição derivada, para entender por que é usado como uma entrada para si mesmo. A contradição é informal: se temos uma máquina H (a, b) que decide "a aceita b", podemos construir uma máquina que aceita máquinas que não se aceitam. (Leia que algumas vezes até que você obtê-lo.) A máquina mostrada na imagem - vamos chamá-lo - faz não aceita ?H H ( P ) = P ⟨ P ⟩P M M( P) = P ⟨ P⟩
A contradição acontece quando você pergunta: aceita ? Tente elaborar as duas opções para ver como há uma contradição.⟨ M ⟩M ⟨ M⟩
⟨ M ⟩ M ⟨ M ⟩M aceita se e somente se não aceita ; isso é claramente uma contradição.⟨ M⟩ M ⟨ M⟩
É por isso que é essencial que a prova execute em si mesma e não em alguma entrada arbitrária. Esse é um tema comum nas provas de impossibilidade conhecidas como argumentos diagonais.P
fonte
Ignore a imagem por um momento; chegaremos a isso em breve. O programa deve ser um testador de parada: quando damos a uma entrada de um programa (pense em como a listagem de um programa) e qualquer coisa para , age da seguinte maneiraH a a b H ( a , b )H( a , b ) H uma uma b H( a , b )
O argumento de que é impossível construir baseia-se na ação de um programa "perverso" específico, P , que usa H como sub-rotina. P usa como entrada uma lista de qualquer programa, x , e faz o seguinte:H P H P x
Não é difícil ver isso
Até aí tudo bem: certamente será um programa enquanto sua sub - rotina H for um programa.P H
Agora retorne à imagem. O que acontece se receber sua própria descrição como entrada? A figura descreve exatamente esse cenário: Seja p a descrição do programa P , substituindo na parte destacada acima, teremosP p P
Claramente, esse comportamento paradoxal é impossível, então somos forçados a concluir que a sub rotina H não pode ser um testador de parada, uma vez que falha no primeiro caso, onde é fornecida ( p , p ) como entrada. Pode haver outros casos em que H funciona como deveria, mas como H falha em pelo menos uma situação, ele não pode ser um testador de parada completo, conforme necessário.H (p,p) H H
fonte
H
não está sendo chamado mais de uma vez, não há recursãoP
.H(P, P)
não é executadoP
, apenas "magicamente" determina seP
pára ou não quando passou por si próprio.H(P,P)
não precisa ser executadoP
, mas deve ser executadoH(x ↦ H(x,x), P)
como parte da determinação deP
paradas. O que se expandeH(x ↦ H(y ↦ H(y,y), x), P)
e assim por diante.H
não está especificada nesta prova. Portanto, não, ele não precisa executar nada, seja eleP
mesmo. A prova começa com a suposição de queH
existe algum tipo de programa que decide magicamente o problema da parada e depois prova que a própria existência de tal programa seria uma contradição e, portanto, esse programa não existe.Experimente uma prova mais bonita com animações. E como os ansewrs devem conter mais do que apenas um link para um site, aqui está a resposta para sua pergunta.
Primeiro, vamos relembrar como funciona a prova da inexistência do oráculo Halting. Provamos que, dado qualquer candidato
H
a um oráculo Halting, existe um programaP
e uma entradaa
para os quaisH
falha em prever corretamente o queP(a)
faz.Teorema: Seja
H
qualquer programa que aceite duas entradas e sempre retornehalt
ouloop
. Então existe um programaQ
e uma entradaa
queQ(a)
interrompe se, e somente se,H(Q,a)
retornaloop
.Prova. Considere o programa
Let
Q = P
ea = P
. De qualquerH(Q,a) = halt
ouH(Q,a) = loop
:H(Q,a) = halt
entãoQ(a)
(o que é justoP(P)
) corre eternamente pela definição deP
.H(Q,a) = loop
entãoQ(a)
parar pela definição deP
.QED
Você perguntou por que pensamos em
H(P,P)
vez deH(P,X)
por outroX
. A resposta óbvia é "porqueH(P,P)
é o que faz a prova funcionar"! Se você usasseH(P,X)
algo arbitrárioX
, ficaria preso. De fato, a prova ficaria assim:Prova quebrada. Considere o programa
Vamos
Q = P
ea = X
para alguns arbitráriosX
. De qualquerH(Q,X) = halt
ouH(Q,X) = loop
:H(Q,X) = halt
que não possamos dizer o queP(X)
faz, porque seP(X)
parar depende do queH(X,X)
retorna. Nós estamos presos. No entanto, se soubéssemos dissoP(X)
eX(X)
somos iguais, poderíamos progredir. (Então, nós realmente devemos tomarX = P
).H(Q,a) = loop
estivermos presos novamente, e ficaríamos desapegados seX = P
.Sem QED.
Espero que isso mostre que devemos considerar
H(P,P)
para que nossa ideia funcione.fonte
O resultado da prova é esta analogia:
fonte