เขียนโปรแกรมที่มีคำว่า nontermination เป็นอิสระจากเลขคณิตของ Peano


29

ท้าทาย

เขียนโปรแกรม P, การไม่มีการป้อนข้อมูลเช่นว่าเรื่อง“การดำเนินการของ P ในที่สุดก็ยุติ” เป็นอิสระของอาโน่คณิตศาสตร์

กฎอย่างเป็นทางการ

(ในกรณีที่คุณเป็นนักตรรกวิทยาคณิตศาสตร์ที่คิดว่าคำอธิบายข้างต้นไม่เป็นทางการ)

ตามหลักการแล้วสามารถแปลงU Universal Turing Machine บางตัว(เช่นภาษาการเขียนโปรแกรมที่คุณชื่นชอบ) ไปเป็นสูตร HALT ทางคณิตศาสตร์ Peano HALT บนตัวแปรpซึ่ง HALT ( p ) เข้ารหัสข้อเสนอ“ Uยุติลงในโปรแกรม ( Gödel-encoded by) p ” ความท้าทายคือการหาpที่ HALT ( p ) และ¬HALT ( p ) ไม่สามารถพิสูจน์ได้ใน Peano arithmetic

คุณอาจสมมติว่าโปรแกรมของคุณทำงานบนเครื่องในอุดมคติโดยมีหน่วยความจำไม่ จำกัด และจำนวนเต็ม / พอยน์เตอร์ขนาดใหญ่พอที่จะเข้าถึงได้

ตัวอย่าง

เมื่อต้องการดูว่ามีโปรแกรมดังกล่าวอยู่ตัวอย่างหนึ่งคือโปรแกรมที่ค้นหาหลักฐานทางคณิตศาสตร์ของ Peano อย่างละเอียด 0 = 1 Peano เลขคณิตพิสูจน์ว่าโปรแกรมนี้หยุดถ้าโปรแกรม Peano ไม่สอดคล้องกันเท่านั้น เนื่องจาก Peano คณิตศาสตร์มีความสอดคล้องกันแต่ไม่สามารถพิสูจน์ความมั่นคงของตนเองได้จึงไม่สามารถตัดสินใจได้ว่าโปรแกรมนี้หยุดทำงานหรือไม่

อย่างไรก็ตามมีข้อเสนออื่น ๆ อีกมากมายที่ไม่ขึ้นอยู่กับเลขคณิตของ Peano ที่คุณสามารถใช้โปรแกรมของคุณได้

แรงจูงใจ

ความท้าทายนี้ได้รับแรงบันดาลใจจากรายงานฉบับใหม่ของ Yedidia และ Aaronson (2016) ที่แสดงเครื่องทัวริง 7,918 สถานะซึ่งการทำลายล้างนั้นไม่ขึ้นอยู่กับZFCซึ่งเป็นระบบที่แข็งแกร่งกว่าเลขคณิตของ Peano คุณอาจสนใจในการอ้างอิง [22] แน่นอนว่าสำหรับความท้าทายนี้คุณสามารถใช้ภาษาการเขียนโปรแกรมแทนเครื่องทัวริงจริง


6
ระบบสัจพจน์ใดที่อาจใช้เพื่อพิสูจน์ว่า (a) โปรแกรมไม่หยุดและ (b) โปรแกรมที่ไม่หยุดชะงักไม่สามารถพิสูจน์ได้ใน PA
feersum

5
ฉันไม่คิดว่ามันสมเหตุสมผลที่คำถามนี้จะต้องมีพื้นฐานที่จำเป็นทั้งหมดในตรรกะทางคณิตศาสตร์ มีค่อนข้างน้อยและมีลิงก์ไปยังข้อมูลที่เกี่ยวข้อง มันไม่ได้ทำให้งงงวยมันเป็นเพียงหัวข้อทางเทคนิค ฉันคิดว่ามันจะช่วยสำหรับการเข้าถึงที่จะระบุความต้องการสำหรับรหัสแยกต่างหากจากแรงจูงใจที่เกี่ยวข้องกับเครื่องจักรทัวริงและเพื่อเชื่อมโยงไปยังตัวอย่างของงบอาโน่อิสระที่จะพิจารณาโดยเฉพาะอย่างยิ่งGoodstein ทฤษฎีบท ( กอล์ฟที่เกี่ยวข้อง )
XNOR

เพื่อให้เหมาะสมเราจะต้องสมมติว่าโค้ดทำงานบนเครื่องในอุดมคติที่มีหน่วยความจำไม่ จำกัด เราสามารถสันนิษฐานได้ว่าเครื่องมีความแม่นยำแท้จริงโดยพลการหรือไม่?
xnor

1
@feersum ฉันไม่ได้คาดหวังการพิสูจน์เชิงประจักษ์ของ (a) และ (b) เพียงแค่เขียนโปรแกรมและให้คำอธิบาย / ข้อโต้แย้ง / การอ้างอิงที่เพียงพอเพื่อให้เชื่อได้อย่างสมเหตุสมผลว่าการอ้างสิทธิ์นั้นเป็นจริงเช่นเดียวกับความท้าทายอื่น ๆ คุณอาจพึ่งพาสัจพจน์และทฤษฎีบทที่ได้รับการยอมรับตามมาตรฐานที่คุณต้องการ
Anders Kaseorg

2
@xnor คุณอาจใช้หน่วยความจำไม่ จำกัด และพอยน์เตอร์ที่ไม่ จำกัด ที่จะเข้าถึง แต่ฉันไม่คิดว่ามันสมเหตุสมผลที่จะใช้ความแม่นยำที่แท้จริงโดยพลการเว้นแต่ภาษาของคุณจะให้มันจริง ในภาษาส่วนใหญ่โปรแกรมเช่นx = 1.0; while (x) { x = x / 2.0; }นั้นจะหยุดอย่างรวดเร็วจริง ๆ
Anders Kaseorg

คำตอบ:


27

Haskell, 838 ไบต์

“ ถ้าคุณต้องการทำอะไรให้สำเร็จ…”

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

คำอธิบาย

โปรแกรมนี้ค้นหาหลักฐานการคำนวณทางคณิตศาสตร์ของ Peano โดยตรง 0 = 1 เนื่องจาก PA สอดคล้องกันโปรแกรมนี้จึงไม่ยุติ แต่เนื่องจาก PA ไม่สามารถพิสูจน์ความมั่นคงของตนเองได้การกำจัดโปรแกรมนี้จึงไม่ขึ้นกับ PA

T คือประเภทของนิพจน์และข้อเสนอ:

  • A Pแสดงถึงข้อเสนอ position x [ P ( x )]
  • (V 1 :$ P) :$ Qหมายถึงเรื่องP → Q
  • V 2 :$ Pแสดงให้เห็นถึงเรื่อง¬ P
  • (V 3 :$ x) :$ yแสดงให้เห็นถึงข้อเสนอx = Y
  • (V 4 :$ x) :$ yหมายถึงธรรมชาติx + y ที่
  • (V 5 :$ x) :$ yหมายถึงธรรมชาติx ⋅ Y
  • V 6 :$ xแสดงถึงธรรมชาติ S ( x ) = x + 1
  • V 7 พิมพ์ค่าธรรมชาติ 0

ในสภาพแวดล้อมที่มีตัวแปรอิสระiเราเข้ารหัสนิพจน์ข้อเสนอและบทพิสูจน์เป็นเมทริกซ์จำนวนเต็ม 2 × 2 [1, 0; a , b ] ดังนี้:

  • M ( i , ∀ x [ P ( x )]) = [1, 0; 1, 4] ⋅ M ( i , λ x [P (x)])
  • M ( i , λ x [ F ( x )]) = M ( i + 1, F ( x )) โดยที่ M ( j , x ) = [1, 0; 5 + i , 4 + j ] สำหรับทุก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 ( ฉัน , แกมมาP ) = [1, 0; 2, 4] ⋅ M ( ฉัน , Q ) ⋅ M ( ฉัน , แกมมาQ ) ⋅ M ( ฉัน , แกมมาQP )
  • M ( ฉัน , แกมมาP ( x )) = [1, 0; 3, 4] ⋅ M ( i , λ x [P (x)]) ⋅ M ( i , x ) ⋅ [1, 0; 1, 2] ⋅ M ( ฉัน , แกมมา ⊢∀ x P (x))
  • M ( ฉัน , แกมมาP ( x )) = [1, 0; 3, 4] ⋅ M ( i , λ x [P (x)]) ⋅ M ( i , x ) ⋅ [1, 0; 2, 2] ⋅ M ( ฉัน , Y ) ⋅ M ( ฉัน , แกมมาY = x ) ⋅ M ( ฉัน , แกมมาP ( Y ))
  • M ( ฉัน , แกมมา ⊢∀ x , P ( x )) = [1, 0; 8, 8] ⋅ M ( ฉัน , λ x [ แกมมาP ( x )])
  • M ( ฉัน , แกมมา ⊢∀ x , P ( x )) = [1, 0; 12 8] ⋅ M ( ฉัน , ΓP (0)) ⋅ M ( ฉัน , λ x [( Γ , P ( x )) ⊢ P (S ( x ))])
  • M ( ฉัน , แกมมาPQ ) = [1, 0; 8, 8] ⋅ M ( i , ( Γ , P ) ⊢ Q )
  • M ( ฉัน , แกมมาPQ ) = [1, 0; 12, 8] ⋅ M ( i , ( Γ , ¬ Q ) ⊢¬ P )

สัจพจน์ที่เหลือจะถูกเข้ารหัสเป็นตัวเลขและรวมอยู่ในสภาพแวดล้อมเริ่มต้นΓ :

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

การพิสูจน์ด้วยเมทริกซ์ [1, 0; , ] สามารถตรวจสอบได้รับเพียงมุมล่างซ้าย(หรือสอดคล้องค่าอื่น ๆ เพื่อโมดูโล ); ค่าอื่น ๆ ที่มีเพื่อเปิดใช้งานองค์ประกอบของการพิสูจน์

ตัวอย่างเช่นต่อไปนี้เป็นข้อพิสูจน์ว่าการเพิ่มคือการสลับ

  • M (0, แกมมา ⊢∀ xY [ x + Y = Y + x]) = [1, 0; 6651439985424903472274778830412211286042729801174124932726010503641310445578492460637276210966154277204244776748283051731165114392766752978964153601068040044362776324924904132311711526476930755026298356469866717434090029353415862307981531900946916847172554628759434336793920402956876846292776619877110678804972343426850350512203833644, 14010499234317302152403198529613715336094817740448888109376168978138227692104106788277363562889534501599380268163213618740021570705080096139804941973102814335632180523847407060058534443254569282138051511292576687428837652027900127452656255880653718107444964680660904752950049505280000000000000000000000000000000000000000000000000000000]

คุณสามารถตรวจสอบกับโปรแกรมดังนี้:

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

หากหลักฐานไม่ถูกต้องคุณจะได้รับรายการว่างเปล่าแทน


1
โปรดอธิบายแนวคิดเบื้องหลังการฝึกอบรม
ภูมิใจ haskeller

2
@proudhaskeller พวกเขาเป็นเพียงวิธีที่สะดวกและกะทัดรัดของGödelที่มีต้นไม้พิสูจน์ที่เป็นไปได้ทั้งหมด นอกจากนี้คุณยังสามารถคิดว่าพวกเขาเป็นตัวเลขคละแบบเลขฐานสองซึ่งถอดรหัสจากด้านที่มีความสำคัญน้อยที่สุดโดยใช้ div และ mod โดยจำนวนตัวเลือกที่เป็นไปได้ในแต่ละขั้นตอน
Anders Kaseorg

คุณเข้ารหัสความจริงเหนี่ยวนำได้อย่างไร
PyRulez

@PyRulez M (i, Γ⊢∀x, P (x)) = [1, 0; 12, 8] ⋅ M (i, Γ⊢ P (0)) ⋅ M (i, λx [(Γ, P (x)) ⊢ P (S (x))] คือสัจพจน์ของอุปนัย
Anders Kaseorg

ฉันคิดว่าคุณสามารถทำให้มันเล็กลงถ้าคุณใช้แคลคูลัสของการก่อสร้างแทน (เนื่องจากแคลคูลัสของการก่อสร้างมีตรรกะลำดับแรกที่สร้างขึ้นและมีขนาดเล็กมาก) แคลคูลัสของสิ่งก่อสร้างนั้นแข็งแกร่งพอ ๆ กับ ZFC ดังนั้นความมั่นคงของมันจึงเป็นอิสระจาก PA ในการตรวจสอบความสอดคล้องของมันคุณแค่มองหาคำศัพท์ที่ว่างเปล่า
PyRulez
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.