Tulis sebuah program yang nonterminasi-nya tidak tergantung pada aritmetika Peano

29

Tantangan

Tulis program P, tanpa masukan, sehingga proposisi “eksekusi P akhirnya berakhir” tidak tergantung pada aritmetika Peano .

Aturan formal

(Jika Anda seorang ahli logika matematika yang menganggap uraian di atas terlalu informal.)

Seseorang dapat, pada prinsipnya, mengubah beberapa mesin U Universal Turing (misalnya bahasa pemrograman favorit Anda) menjadi rumus aritmatika Peano HALT di atas variabel p , di mana HALT ( p ) menyandikan proposisi “ U mengakhiri pada program (Di -encode oleh Gödel oleh) p ”. Tantangannya adalah menemukan p sedemikian rupa sehingga HALT ( p ) atau HHALT ( p ) tidak dapat dibuktikan dalam aritmatika Peano.

Anda dapat menganggap program Anda berjalan pada mesin yang ideal dengan memori tidak terbatas dan integer / pointer yang cukup besar untuk mengaksesnya.

Contoh

Untuk melihat bahwa program-program semacam itu ada, salah satu contohnya adalah sebuah program yang secara mendalam mencari bukti aritmetika Peano dari 0 = 1. Aritmatika Peano membuktikan bahwa program ini berhenti jika dan hanya jika aritmatika Peano tidak konsisten. Karena aritmatika Peano konsisten tetapi tidak dapat membuktikan konsistensinya sendiri , ia tidak dapat memutuskan apakah program ini berhenti.

Namun, ada banyak proposisi lain yang tidak bergantung pada aritmatika Peano di mana Anda dapat mendasarkan program Anda.

Motivasi

Tantangan ini diilhami oleh sebuah makalah baru oleh Yedidia dan Aaronson (2016) yang memamerkan mesin Turing yang terdiri dari 7.918 negara bagian yang nonterminasi-nya tidak tergantung pada ZFC , sistem yang jauh lebih kuat daripada aritmatika Peano. Anda mungkin tertarik pada kutipannya [22]. Untuk tantangan ini, tentu saja, Anda dapat menggunakan bahasa pemrograman pilihan Anda sebagai pengganti mesin Turing yang sebenarnya.

Anders Kaseorg
sumber
6
Sistem aksioma apa yang dapat digunakan untuk membuktikan bahwa (a) program tidak berhenti, dan (b) program yang tidak dihentikan tidak dapat dibuktikan dalam PA?
feersum
5
Saya tidak berpikir masuk akal untuk meminta pertanyaan ini mengandung semua latar belakang yang diperlukan dalam logika matematika. Ada cukup banyak, dan ada tautan ke info yang relevan. Itu tidak dikaburkan, itu hanya topik teknis. Saya pikir itu akan membantu untuk aksesibilitas untuk menyatakan persyaratan untuk kode terpisah dari motivasi yang melibatkan mesin Turing dan untuk menghubungkan ke beberapa contoh pernyataan Peano-independen untuk dipertimbangkan, khususnya Teorema Goodstein's ( golf terkait )
xnor
Agar ini masuk akal, kita harus menganggap kode berjalan pada mesin yang diidealkan dengan memori tidak terbatas. Bisakah kita juga menganggap mesin memiliki presisi nyata yang sewenang-wenang?
xnor
1
@feersum Saya tidak mengharapkan bukti aksiomatis dari (a) dan (b). Cukup tulis sebuah program, dan berikan deskripsi / argumen / kutipan yang cukup untuk cukup meyakinkan bahwa klaim itu benar, seperti halnya dengan tantangan lain. Anda dapat mengandalkan aksioma dan teorema yang diterima secara standar yang Anda butuhkan.
Anders Kaseorg
2
@ xnor Anda dapat mengasumsikan memori tidak terbatas, dan petunjuk tanpa batas untuk mengaksesnya. Tapi saya pikir itu tidak masuk akal untuk mengasumsikan presisi nyata yang sewenang-wenang kecuali bahasa Anda benar-benar menyediakannya; dalam kebanyakan bahasa, program seperti x = 1.0; while (x) { x = x / 2.0; }sebenarnya akan berhenti sangat cepat.
Anders Kaseorg

Jawaban:

27

Haskell, 838 byte

"Jika kamu ingin sesuatu dilakukan, ..."

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

Penjelasan

Program ini secara langsung mencari bukti aritmatika Peano dari 0 = 1. Karena PA konsisten, program ini tidak pernah berakhir; tetapi karena PA tidak dapat membuktikan konsistensinya sendiri, nonterminasi program ini tidak tergantung pada PA.

T adalah jenis ekspresi dan proposisi:

  • A Pmewakili proposisi ∀ x [ P ( x )].
  • (V 1 :$ P) :$ Qmewakili proposisi PQ .
  • V 2 :$ Pmewakili proposisi ¬ P .
  • (V 3 :$ x) :$ ymewakili proposisi x = y .
  • (V 4 :$ x) :$ ymewakili x + y alami .
  • (V 5 :$ x) :$ ymewakili x alami ⋅ y .
  • V 6 :$ xmewakili S alami ( x ) = x +1.
  • V 7 mewakili alam 0.

Dalam lingkungan dengan variabel bebas i , kami menyandikan ekspresi, proposisi, dan bukti sebagai matriks bilangan bulat 2 × 2 [1, 0; a , b ], sebagai berikut:

  • M ( i , ∀ x [ P ( x )]) = [1, 0; 1, 4] ⋅ M ( i , λ x [P (x)])
  • M ( i , λ x [ F ( x )]) = M ( i + 1, F ( x )) di mana M ( j , x ) = [1, 0; 5 + i , 4 + j ] untuk semua 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 , ΓP ) = [1, 0; 2, 4] ⋅ M ( i , Q ) ⋅ M ( i , ΓQ ) ⋅ M ( i , ΓQP )
  • M ( i , ΓP ( x )) = [1, 0; 3, 4] ⋅ M ( i , λ x [P (x)]) ⋅ M ( i , x ) ⋅ [1, 0; 1, 2] ⋅ M ( i , Γ ⊢ ∀ x P (x))
  • M ( i , ΓP ( x )) = [1, 0; 3, 4] ⋅ M ( i , λ x [P (x)]) ⋅ M ( i , x ) ⋅ [1, 0; 2, 2] ⋅ M ( i , y ) ⋅ M ( i , Γy = x ) ⋅ M ( i , ΓP ( y ))
  • M ( i , Γ ⊢ ∀ x , P ( x )) = [1, 0; 8, 8] ⋅ M ( i , λ x [ ΓP ( x )])
  • M ( i , Γ ⊢ ∀ x , P ( x )) = [1, 0; 12, 8] ⋅ M ( i , ΓP (0)) ⋅ M ( i , λ x [( Γ , P ( x )) ⊢ P (S ( x ))])
  • M ( i , ΓPQ ) = [1, 0; 8, 8] ⋅ M ( i , ( Γ , P ) ⊢ Q )
  • M ( i , ΓPQ ) = [1, 0; 12, 8] ⋅ M ( i , ( Γ , ¬ Q ) ⊢ ¬ P )

Aksioma yang tersisa dikodekan secara numerik dan termasuk dalam lingkungan awal Γ :

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

Bukti dengan matriks [1, 0; a , b ] dapat diperiksa diberikan hanya sudut kiri bawah sebuah (atau nilai kongruen lain untuk a modulo b ); nilai-nilai lain ada untuk memungkinkan komposisi bukti.

Sebagai contoh, berikut adalah bukti bahwa penambahan bersifat komutatif.

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

Anda dapat memverifikasinya dengan program sebagai berikut:

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

Jika buktinya tidak valid, Anda akan mendapatkan daftar kosong sebagai gantinya.

Anders Kaseorg
sumber
1
Tolong jelaskan ide di balik matriks.
haskeller bangga
2
@proudhaskeller Mereka hanya cara yang mudah, relatif kompak dari penomoran Gödel semua pohon bukti yang mungkin. Anda juga dapat menganggap mereka sebagai angka radix campuran yang diterjemahkan dari sisi paling tidak signifikan menggunakan div dan mod dengan jumlah pilihan yang mungkin pada setiap langkah.
Anders Kaseorg
Bagaimana Anda menyandikan aksioma induksi?
PyRulez
@PyRulez M (i, Γ ⊢ ∀x, P (x)) = [1, 0; 12, 8] ⋅ M (i, Γ ⊢ P (0)) ⋅ M (i, λx [(Γ, P (x)) ⊢ P (S (x))]) adalah aksioma induksi.
Anders Kaseorg
Saya pikir Anda bisa membuat ini lebih kecil jika Anda menggunakan Calculus of Constructions sebagai gantinya (karena Calculus of Constructions memiliki logika tingkat pertama yang tertanam di dalamnya, dan sangat kecil). Calculus of Constructions kira-kira sekuat ZFC, jadi konsistensinya tidak tergantung pada PA. Untuk memeriksa apakah itu konsisten, Anda cukup mencari istilah jenis kosong.
PyRulez