Escreva um programa cuja não terminação seja independente da aritmética Peano

29

Desafio

Escreva um programa P, sem nenhuma entrada, de modo que a proposição “a execução de P eventualmente termine” seja independente da aritmética do Peano .

Regras formais

(Caso você seja um lógico matemático que considere a descrição acima muito informal.)

Pode-se, em princípio, converter alguma máquina Universal Turing U (por exemplo, sua linguagem de programação favorita) em uma fórmula aritmética Peano HALT sobre a variável p , onde HALT ( p ) codifica a proposição “ U termina no programa ( codificado por Gödel ) p ”. O desafio é encontrar p tal que nem HALT ( p ) nem ¬HALT ( p ) possam ser comprovados na aritmética Peano.

Você pode supor que seu programa seja executado em uma máquina ideal com memória ilimitada e números inteiros / ponteiros grandes o suficiente para acessá-lo.

Exemplo

Para ver que tais programas existem, um exemplo é um programa que procura exaustivamente uma prova aritmética Peano de 0 = 1. A aritmética Peano prova que esse programa interrompe se e somente se a aritmética Peano for inconsistente. Como a aritmética do Peano é consistente, mas não pode provar sua própria consistência , ele não pode decidir se esse programa é interrompido.

No entanto, existem muitas outras proposições independentes da aritmética do Peano nas quais você pode basear seu programa.

Motivação

Esse desafio foi inspirado em um novo artigo de Yedidia e Aaronson (2016) exibindo uma máquina de Turing com 7.918 estados cuja não terminação é independente do ZFC , um sistema muito mais forte que a aritmética do Peano. Você pode estar interessado em sua citação [22]. Para esse desafio, é claro, você pode usar sua linguagem de programação preferida no lugar das máquinas de Turing reais.

Anders Kaseorg
fonte
6
Quais sistemas de axiomas podem ser usados ​​para provar que (a) o programa não pára e (b) a não interrupção do programa é improvável no PA?
Feersum 5/05
5
Não acho razoável exigir que essa pergunta contenha todo o conhecimento necessário da lógica matemática. Há um pouco disso e há links para as informações relevantes. Não é ofuscado, é apenas um tópico técnico. Acho que ajudaria a acessibilidade declarar o requisito do código separado da motivação que envolve as máquinas de Turing e vincular a algum exemplo de declarações independentes do Peano a considerar, em particular o Teorema de Goodstein ( golfe relacionado )
xnor
Para que isso faça sentido, precisamos assumir que o código é executado na máquina idealizada com memória ilimitada. Também podemos assumir que a máquina possui precisão real arbitrária?
Xnor
11
@feersum Não estou esperando uma prova axiomática de (a) e (b). Basta escrever um programa e fornecer descrição / argumentos / citações suficientes para convencer razoavelmente que as afirmações são verdadeiras, como você faria com qualquer outro desafio. Você pode confiar em quaisquer axiomas e teoremas aceitos de maneira padrão que você precisa.
Anders Kaseorg 5/05
2
@xnor Você pode assumir memória ilimitada e ponteiros ilimitados para acessá-la. Mas não creio que seja razoável assumir uma precisão real arbitrária, a menos que seu idioma realmente a forneça; na maioria dos idiomas, um programa como x = 1.0; while (x) { x = x / 2.0; }o de fato parará muito rapidamente.
Anders Kaseorg 5/05

Respostas:

27

Haskell, 838 bytes

"Se você quer algo feito, ..."

import Control.Monad.State
data T=V Int|T:$T|A(T->T)
g=guard
r=runStateT
s!a@(V i)=maybe a id$lookup i s
s!(a:$b)=(s!a):$(s!b)
s@((i,_):_)!A f=A(\a->((i+1,a):s)!f(V$i+1))
c l=do(m,k)<-(`divMod`sum(1<$l)).pred<$>get;g$m>=0;put m;l!!fromEnum k
i&a=V i:$a
i%t=(:$).(i&)<$>t<*>t
x i=c$[4%x i,5%x i,(6&)<$>x i]++map(pure.V)[7..i-1]
y i=c[A<$>z i,1%y i,(2&)<$>y i,3%x i]
z i=(\a e->[(i,e)]!a)<$>y(i+1)
(i?h)p=c[g$any(p#i)h,do q<-y i;i?h$q;i?h$1&q:$p,do f<-z i;a<-x i;g$p#i$f a;c[i?h$A f,do b<-x i;i?h$3&b:$a;i?h$f b],case p of A f->c[(i+1)?h$f$V i,do i?h$f$V 7;(i+1)?(f(V i):h)$f$6&V i];V 1:$q:$r->c[i?(q:h)$r,i?(2&r:h)$V 2:$q];_->mzero]
(V a#i)(V b)=a==b
((a:$b)#i)(c:$d)=(a#i)c&&(b#i)d
(A f#i)(A g)=f(V i)#(i+1)$g$V i
(_#_)_=0<0
main=print$(r(8?map fst(r(y 8)=<<[497,8269,56106533,12033,123263749,10049,661072709])$3&V 7:$(6&V 7))=<<[0..])!!0

Explicação

Este programa procura diretamente uma prova aritmética Peano de 0 = 1. Como o PA é consistente, este programa nunca termina; mas como o PA não pode provar sua própria consistência, o não término deste programa é independente do PA.

T é o tipo de expressões e proposições:

  • A Prepresenta a proposição ∀ x [ P ( x )].
  • (V 1 :$ P) :$ Qrepresenta a proposição PQ .
  • V 2 :$ Prepresenta a proposição ¬ P .
  • (V 3 :$ x) :$ yrepresenta a proposição x = y .
  • (V 4 :$ x) :$ yrepresenta o x + y natural .
  • (V 5 :$ x) :$ yrepresenta os naturais xy .
  • V 6 :$ xrepresenta o natural S ( x ) = x + 1.
  • V 7 reprime o 0 natural.

Em um ambiente com i variáveis livres, nós codificar expressões, proposições e provas como 2 × 2 matrizes de números inteiros [1, 0; a , b ], como segue:

  • M ( i , x [ P ( x )]) = [1, 0; 1, 4] ⋅ M ( i , λ x [P (x)])
  • M ( i , λ x [ F ( x )]) = M ( i + 1, F ( x )) onde M ( j , x ) = [1, 0; 5 + i , 4 + j ] para todos os j > i
  • M ( i , PQ ) = [1, 0; 2, 4] ⋅ M ( i , P ) ⋅ M ( i , Q )
  • M ( i , P ) = [1, 0; 3, 4] ⋅ M ( i , P )
  • M ( i , x = y ) = [1, 0; 4, 4] ⋅ M ( i , x ) ⋅ M ( i , y )
  • M ( i , x + y ) = [1, 0; 1, 4 + i ] ⋅ M ( i , x ) ⋅ M ( i , y )
  • H ( i , xy ) = [1, 0; 2, 4 + i ] ⋅ M ( i , x ) ⋅ M ( i , y )
  • H ( i , S x ) = [1, 0; 3, 4 + i ] ⋅ M ( i , x )
  • M ( i , 0) = [1, 0; 4, 4 + i ]
  • M ( i , ( Γ , P ) ⊢ P ) = [1, 0; 1, 4]
  • H ( i , yP ) = [1, 0; 2, 4] ⋅ H ( I , Q ) ⋅ H ( i , yQ ) ⋅ H ( i , yQP )
  • H ( i , yP ( x )) = [1, 0; 3, 4] ⋅ M ( i , λ x [P (x)]) ⋅ M ( i , x ) ⋅ [1, 0; 1, 2] ⋅ H ( i , y ⊢ ∀ x P (x))
  • H ( i , yP ( x )) = [1, 0; 3, 4] ⋅ M ( i , λ x [P (x)]) ⋅ M ( i , x ) ⋅ [1, 0; 2, 2] ⋅ H ( i , y ) ⋅ H ( i , yy = x ) ⋅ H ( i , yP ( Y ))
  • H ( i , y ⊢ ∀ x , P ( x )) = [1, 0; 8, 8] ⋅ H ( i , λ x [ yP ( x )])
  • H ( i , y ⊢ ∀ x , P ( x )) = [1, 0; 12, 8] ⋅ H ( i , ΓP (0)) ⋅ H ( i , λ x [( Γ , P ( x )) ⊢ P (S ( x ))])
  • H ( i , yPQ ) = [1, 0; 8, 8] ⋅ M ( i , ( Γ , P ) ⊢ Q )
  • H ( i , yPQ ) = [1, 0; 12, 8] ⋅ M ( i , ( Γ , ¬ Q ) ⊢ P )

Os axiomas restantes são codificados numericamente e incluídos no ambiente inicial Γ :

  • M (0, x [ x = x ]) = [1, 0; 497, 400]
  • M (0, ∀ x [¬ (S ( x ) = 0)]) = [1, 0; 8269, 8000]
  • M (0, ∀ xy [S ( x ) = S ( y ) → x = y ]) = [1, 0; 56106533, 47775744]
  • M (0, x [ x + 0 = x ]) = [1, 0; 12033, 10000]
  • M (0, ∀ y [ x + S ( y ) = S ( x + y )]) = [1, 0; 123263749, 107495424]
  • M (0, x [ x 0 = 0]) = [1, 0; 10049, 10000]
  • M (0, ∀ xy [ x ⋅ S ( y ) = xy + x ]) = [1, 0; 661072709, 644972544]

Uma prova com matriz [1, 0; a , b ] pode ser verificado dado apenas o canto inferior esquerdo a (ou qualquer outro valor congruente a um módulo b ); os outros valores existem para permitir a composição de provas.

Por exemplo, aqui está uma prova de que a adição é comutativa.

  • M (0, y ⊢ ∀ xy [ x + y = y + x]) = [1, 0; 6651439985424903472274778830412211286042729801174124932726010503641310445578492460637276210966154277204244776748283051731165114392766752978964153601068040044362776324924904132311711526476930755026298356469866717434090029353415862307981531900946916847172554628759434336793920402956876846292776619877110678804972343426850350512203833644, 14010499234317302152403198529613715336094817740448888109376168978138227692104106788277363562889534501599380268163213618740021570705080096139804941973102814335632180523847407060058534443254569282138051511292576687428837652027900127452656255880653718107444964680660904752950049505280000000000000000000000000000000000000000000000000000000]

Você pode verificá-lo com o programa da seguinte maneira:

*Main> let p = A $ \x -> A $ \y -> V 3 :$ (V 4 :$ x :$ y) :$ (V 4 :$ y :$ x)
*Main> let a = 6651439985424903472274778830412211286042729801174124932726010503641310445578492460637276210966154277204244776748283051731165114392766752978964153601068040044362776324924904132311711526476930755026298356469866717434090029353415862307981531900946916847172554628759434336793920402956876846292776619877110678804972343426850350512203833644
*Main> r(8?map fst(r(y 8)=<<[497,8269,56106533,12033,123263749,10049,661072709])$p)a :: [((),Integer)]
[((),0)]

Se a prova fosse inválida, você obteria a lista vazia.

Anders Kaseorg
fonte
11
Por favor, explique a ideia por trás das matrizes.
Proud haskeller
2
@proudhaskeller Eles são apenas uma maneira conveniente e relativamente compacta de Gödel de numerar todas as árvores de prova possíveis. Você também pode pensar neles como números de raiz mista que são decodificados do lado menos significativo usando div e mod pelo número de opções possíveis em cada etapa.
Anders Kaseorg
Como você codificou os axiomas de indução?
PyRulez
@ PyRulez M (i, Γ ⊢x, P (x)) = [1, 0; 12, 8] ⋅ M (i, ⊢ P (0)) ⋅ M (i, λx [(Γ, P (x)) ⊢ P (S (x))]) é o axioma de indução.
Anders Kaseorg
Eu acho que você poderia tornar isso menor se você usar o Cálculo de Construções (já que o Cálculo de Construções possui lógica de primeira ordem integrada e é muito pequeno). O Cálculo de Construções é tão forte quanto o ZFC, portanto sua consistência é certamente independente do PA. Para verificar se é consistente, basta procurar um termo de um tipo vazio.
PyRulez