Schreiben Sie ein Programm, dessen Nichtbeendigung unabhängig von der Peano-Arithmetik ist

29

Herausforderung

Schreiben Sie ein Programm P ohne Eingabe, so dass der Satz „die Ausführung von P endet“ unabhängig von der Peano-Arithmetik ist .

Formale Regeln

(Falls Sie ein mathematischer Logiker sind, der die obige Beschreibung für zu informell hält.)

Grundsätzlich kann man eine Universal Turing-Maschine U (zB Ihre Lieblingsprogrammiersprache) in eine Peano-Rechenformel HALT über die Variable p umwandeln , wobei HALT ( p ) den Satz „ U endet auf dem Programm ( Gödel-codiert von) p ”. Die Herausforderung besteht darin, p so zu finden , dass weder HALT ( p ) noch ¬HALT ( p ) in der Peano-Arithmetik bewiesen werden können.

Sie können davon ausgehen, dass Ihr Programm auf einem idealen Computer mit unbegrenztem Speicher und ganzen Zahlen / Zeigern ausgeführt wird, die groß genug sind, um darauf zuzugreifen.

Beispiel

Um zu sehen, dass solche Programme existieren, ist ein Beispiel ein Programm, das ausführlich nach einem Peano-arithmetischen Beweis von 0 = 1 sucht. Die Peano-Arithmetik beweist, dass dieses Programm genau dann anhält, wenn die Peano-Arithmetik inkonsistent ist. Da die Peano-Arithmetik konsistent ist, aber ihre eigene Konsistenz nicht nachweisen kann , kann sie nicht entscheiden, ob dieses Programm anhält.

Es gibt jedoch viele andere Aussagen, die unabhängig von der Peano-Arithmetik sind und auf denen Sie Ihr Programm aufbauen können.

Motivation

Diese Herausforderung wurde durch eine neue Veröffentlichung von Yedidia und Aaronson (2016) inspiriert, die eine Turing-Maschine mit 7.918 Zuständen zeigt, deren Nichtbeeinflussung unabhängig von ZFC ist , einem viel stärkeren System als die Peano-Arithmetik. Das könnte Sie interessieren [22]. Für diese Herausforderung können Sie natürlich anstelle der tatsächlichen Turing-Maschinen die von Ihnen gewählte Programmiersprache verwenden.

Anders Kaseorg
quelle
6
Welche Axiomsysteme können verwendet werden, um zu beweisen, dass (a) das Programm nicht anhält und (b) das Nichtanhalten des Programms in PA nicht beweisbar ist?
Feersum
5
Ich halte es nicht für vernünftig, zu verlangen, dass diese Frage den gesamten erforderlichen Hintergrund in der mathematischen Logik enthält. Es gibt ziemlich viel davon und es gibt Links zu den relevanten Informationen. Es ist nicht verschleiert, es ist nur ein technisches Thema. Ich denke, es wäre für die Zugänglichkeit hilfreich, die Anforderung für den Code getrennt von der Motivation für Turing-Maschinen
anzugeben
Damit dies sinnvoll ist, müssen wir davon ausgehen, dass der Code auf einem idealisierten Computer mit unbegrenztem Speicher ausgeführt wird. Können wir auch annehmen, dass die Maschine eine willkürliche echte Präzision hat?
Xnor
1
@feersum Ich erwarte keinen axiomatischen Beweis für (a) und (b). Schreiben Sie einfach ein Programm und geben Sie genügend Beschreibungen / Argumente / Zitate an, um davon zu überzeugen, dass die Behauptungen wahr sind, wie Sie es bei jeder anderen Herausforderung tun würden. Sie können sich auf alle gängigen Axiome und Theoreme verlassen, die Sie benötigen.
Anders Kaseorg
2
@xnor Sie können von unbegrenztem Speicher und unbegrenzten Zeigern ausgehen, mit denen Sie darauf zugreifen können. Ich halte es jedoch nicht für sinnvoll, eine willkürliche tatsächliche Genauigkeit anzunehmen, es sei denn, Ihre Sprache bietet sie tatsächlich an. In den meisten Sprachen stoppt ein Programm wie dieses x = 1.0; while (x) { x = x / 2.0; }sehr schnell.
Anders Kaseorg

Antworten:

27

Haskell, 838 Bytes

"Wenn du etwas machen willst, ..."

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

Erläuterung

Dieses Programm sucht direkt nach einem Peano-arithmetischen Beweis von 0 = 1. Da PA konsistent ist, wird dieses Programm niemals beendet. Da PA jedoch seine eigene Konsistenz nicht nachweisen kann, ist die Nichtbeendigung dieses Programms unabhängig von PA.

T ist die Art der Ausdrücke und Sätze:

  • A Prepräsentiert den Satz ∀ x [ P ( x )].
  • (V 1 :$ P) :$ Qstellt den Satz PQ .
  • V 2 :$ Pstellt den Satz ¬ P .
  • (V 3 :$ x) :$ yrepräsentiert den Satz x = y .
  • (V 4 :$ x) :$ yrepräsentiert das natürliche x + y .
  • (V 5 :$ x) :$ yrepräsentiert das natürliche xy .
  • V 6 :$ xrepräsentiert das natürliche S ( x ) = x + 1.
  • V 7 repräsentiert die natürliche 0.

In einer Umgebung mit i freien Variablen codieren wir Ausdrücke, Sätze und Beweise als 2 × 2 Ganzzahlmatrizen [1, 0; a , b ] wie folgt:

  • M ( i , x [ P ( x )]) = [1, 0; 1, 4] ≤ M ( i , λ x [P (x)])
  • M ( i , λ x [ F ( x )]) = M ( i + 1, F ( x )) , wobei M ( j , x ) = [1, 0; 5 + i , 4 + j ] für alle 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 )
  • M ( i , xy ) = [1, 0; 2, 4 + i ] ≤ M ( i , x ) ≤ M ( i , y )
  • M ( 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]
  • M ( i , & Ggr;P ) = [1, 0; 2, 4] ⋅ M ( i , Q ) ⋅ M ( i , & Ggr;Q ) ⋅ M ( i , & Ggr;QP )
  • M ( i , & Ggr;P ( x )) = [1, 0; 3, 4] ⋅ M ( i , λ x [P (x)]) ⋅ M ( i , x ) ⋅ [1, 0; 1, 2] ⋅ M ( i , & Ggr; ⊢ ∀ x P (x))
  • M ( i , & Ggr;P ( x )) = [1, 0; 3, 4] ⋅ M ( i , λ x [P (x)]) ⋅ M ( i , x ) ⋅ [1, 0; 2, 2] ⋅ M ( i , y ) ⋅ M ( i , & Ggr;y = x ) ⋅ M ( i , & Ggr;P ( y ))
  • M ( i , & Ggr; ⊢ ∀ x , P ( x )) = [1, 0; 8, 8] ⋅ M ( i , λ x [ & Ggr;P ( x )]) ,
  • M ( i , & Ggr; ⊢ ∀ x , P ( x )) = [1, 0; 12, 8] ⋅ M ( i , ΓP (0)) ⋅ M ( i , λ x [( Γ , P ( x )) ⊢ P (S ( x ))])
  • M ( i , & Ggr;PQ ) = [1, 0; 8, 8] ⋅ M ( i , ( Γ , P ) ⊢ Q )
  • M ( i , & Ggr;PQ ) = [1, 0; 12, 8] ⋅ M ( i , ( Γ , ¬ Q ) ⊢ ¬ P )

Die übrigen Axiome numerisch kodiert und in der Anfangsumgebung enthalten Γ :

  • 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]

Ein Beweis mit Matrix [1, 0; a , b ] kann nur in Anbetracht der unteren linken Ecke a (oder eines anderen Wertes, der zu einem Modulo b kongruent ist) überprüft werden ; Die anderen Werte dienen zur Erstellung von Proofs.

Zum Beispiel ist hier ein Beweis, dass Addition kommutativ ist.

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

Sie können dies mit dem Programm wie folgt überprüfen:

*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)]

Wenn der Beweis ungültig wäre, würden Sie stattdessen die leere Liste erhalten.

Anders Kaseorg
quelle
1
Bitte erläutern Sie die Idee hinter den Matrizen.
stolzer Haskeller
2
@proudhaskeller Sie sind nur eine praktische, relativ kompakte Methode, mit der Gödel alle möglichen Prüfbäume nummeriert. Sie können sie sich auch als gemischte Radix-Zahlen vorstellen, die von der niedrigstwertigen Seite mit div und mod anhand der Anzahl der möglichen Auswahlen bei jedem Schritt dekodiert werden.
Anders Kaseorg
Wie haben Sie die Induktionsaxiome kodiert?
PyRulez
@PyRulez M (i, ≤ ≤ ≤ x, P (x)) = [1, 0; 12, 8] ≤ M (i, ≤ P (0)) ≤ M (i, λx [(≤, P (x)) ≤ P (S (x))] ist das Induktionsaxiom.
Anders Kaseorg
Ich denke, Sie könnten dies verkleinern, wenn Sie stattdessen Konstruktionsberechnung verwenden (da Konstruktionsberechnung Logik erster Ordnung eingebaut hat und sehr klein ist). Calculus of Constructions ist ungefähr so ​​stark wie ZFC, daher ist seine Konsistenz mit Sicherheit unabhängig von PA. Um zu überprüfen, ob es konsistent ist, suchen Sie einfach nach einem Begriff eines leeren Typs.
PyRulez