Prova da indecidibilidade do problema da parada

25

Estou tendo problemas para entender a prova da indecidibilidade do problema da parada.

http://computing.guide/wp-content/uploads/2014/12/HaltingProblem1.jpg

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 bH(a,b)abPab

Por que não podemos alimentar H() com P e alguma entrada arbitrária, digamos, x ?

Netik
fonte
Lembre-se de que no modelo computacional usado aqui, qualquer entrada (codificada) é permitida. Não há verificação de tipo ou algo assim. Você sempre pode codificar um programa e passá-lo como uma entrada para si mesmo.
asmeurer
2
Você pode alimentar entrada que desejar. A estrutura desta prova requer considerar uma entrada específica. H
precisa saber é o seguinte
11
Você pode fornecer qualquer entrada para o programa. O objetivo é encontrar a contradição. Teoricamente, a máquina 'H' deve funcionar para todos os tipos de entradas. Assim, consideramos uma de todas as entradas possíveis, o que leva à contradição.
Ugnes
Essa prova é sutilmente falha. Considere se eu tenho um H () que funciona para tudo, menos ele próprio; isso ainda seria uma solução geral para o problema da parada.
Joshua
Relacionado, possivelmente duplicar: cs.stackexchange.com/questions/42819/...
Ilmari Karonen

Respostas:

27

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 PMM(P)=PP

A contradição acontece quando você pergunta: aceita ? Tente elaborar as duas opções para ver como há uma contradição.M MM

M M M M aceita se e somente se não aceita ; isso é claramente uma contradição.MMM

É 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

aelguindy
fonte
38

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)HaabH(a,b)

  1. Se o programa representado por interrompido quando for fornecido como entrada, responderá "sim". Por outro lado, se o programa descrito por executado sempre que for dada a entrada então H ( a , b ) responderá "não".b H ( a , b ) aabH(a,b)abH(a,b)
  2. É importante ressaltar que o programa sempre interromperá e fornecerá a resposta correta para qualquer par ( a , 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:HPHPx

P(x) =
  run H(x, x)
  if H(x, x) answers "yes"
      loop forever
  else
      halt

Não é difícil ver isso

será interrompido se, e somente se, o programa x for executado para sempre quando for fornecida sua própria descrição como entrada.P(x)x

Até aí tudo bem: certamente será um programa enquanto sua sub - rotina H for um programa.PH

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, teremosPpP

será interrompido se e somente se o programa P ( p ) for executado para sempre.P(p)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)HH

Rick Decker
fonte
Eu gosto desta resposta. Embora agora que entenda a prova, pareça provar que H pode lançar uma exceção de limite de recursão.
Fax
2
O @Fax Hnão está sendo chamado mais de uma vez, não há recursão P. H(P, P)não é executado P, apenas "magicamente" determina se Ppára ou não quando passou por si próprio.
precisa saber é o seguinte
O @ Ajedi32 H(P,P)não precisa ser executado P, mas deve ser executado H(x ↦ H(x,x), P)como parte da determinação de Pparadas. O que se expande H(x ↦ H(y ↦ H(y,y), x), P)e assim por diante.
Fax
@Fax A implementação de Hnão está especificada nesta prova. Portanto, não, ele não precisa executar nada, seja ele Pmesmo. A prova começa com a suposição de que Hexiste 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.
precisa saber é o seguinte
11
@Fax Você levanta um bom argumento sobre a possibilidade de existir um programa que decida o problema de interrupção, exceto quando chamado por si próprio. Consulte Existem provas da indecidibilidade do problema de parada que não depende de auto-referência ou diagonalização? para uma pergunta interessante sobre isso.
precisa
9

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 Ha um oráculo Halting, existe um programa Pe uma entrada apara os quais Hfalha em prever corretamente o que P(a)faz.

Teorema: Seja Hqualquer programa que aceite duas entradas e sempre retorne haltou loop. Então existe um programa Qe uma entrada aque Q(a)interrompe se, e somente se, H(Q,a)retorna loop.

Prova. Considere o programa

program P(y):
  if H(y,y) = halt then
    loop forever
  else:
    return

Let Q = Pe a = P. De qualquer H(Q,a) = haltou H(Q,a) = loop:

  • se H(Q,a) = haltentão Q(a)(o que é justo P(P)) corre eternamente pela definição deP .
  • se H(Q,a) = loopentão Q(a)parar pela definição de P.

QED

Você perguntou por que pensamos em H(P,P)vez de H(P,X)por outro X. A resposta óbvia é "porque H(P,P)é o que faz a prova funcionar"! Se você usasse H(P,X)algo arbitrário X, ficaria preso. De fato, a prova ficaria assim:

Prova quebrada. Considere o programa

program P(y):
  if H(y,y) = halt then
    loop forever
  else:
    return

Vamos Q = Pe a = Xpara alguns arbitrários X. De qualquer H(Q,X) = haltou H(Q,X) = loop:

  • suponha H(Q,X) = haltque não possamos dizer o que P(X)faz, porque se P(X)parar depende do que H(X,X)retorna. Nós estamos presos. No entanto, se soubéssemos disso P(X)e X(X)somos iguais, poderíamos progredir. (Então, nós realmente devemos tomar X = P).
  • se H(Q,a) = loopestivermos presos novamente, e ficaríamos desapegados se X = P.

Sem QED.

Espero que isso mostre que devemos considerar H(P,P)para que nossa ideia funcione.

Andrej Bauer
fonte
Haha Impressionante! :)
aelguindy
2

O resultado da prova é esta analogia:

P(P)P(P)P(P)(P)(P) . 🙂

(P)(P)

Ahmed Nassar
fonte