Viết chương trình có số thập phân độc lập với số học Peano


29

Thử thách

Viết chương trình P, không lấy đầu vào, sao cho mệnh đề bắt đầu thực hiện P cuối cùng chấm dứt, độc lập với số học Peano .

Quy tắc chính thức

(Trong trường hợp bạn là một nhà logic học toán học, người cho rằng mô tả ở trên quá không chính thức.)

Về nguyên tắc, người ta có thể chuyển đổi một số máy Turing phổ dụng U (ví dụ ngôn ngữ lập trình yêu thích của bạn) thành công thức số học Peano HALT qua biến p , trong đó HALT ( p ) mã hóa mệnh đề mà U U chấm dứt trên chương trình ( được mã hóa bởi Gotdel ) pv . Thách thức là tìm ra p sao cho không thể chứng minh HALT ( p ) hay HALT ( p ) trong số học Peano.

Bạn có thể cho rằng chương trình của bạn chạy trên một máy lý tưởng với bộ nhớ không giới hạn và số nguyên / con trỏ đủ lớn để truy cập nó.

Thí dụ

Để thấy rằng các chương trình như vậy tồn tại, một ví dụ là một chương trình tìm kiếm triệt để bằng chứng số học Peano bằng 0 = 1. Số học Peano chứng minh rằng chương trình này dừng lại khi và chỉ khi số học Peano không nhất quán. Vì số học Peano là nhất quán nhưng không thể chứng minh tính nhất quán của chính nó, nên nó không thể quyết định liệu chương trình này có dừng lại hay không.

Tuy nhiên, có nhiều đề xuất khác độc lập với số học Peano mà bạn có thể dựa vào chương trình của mình.

Động lực

Thử thách này được lấy cảm hứng từ một bài báo mới của Yedidia và Aaronson (2016) trưng bày một cỗ máy Turing 7.918 trạng thái mà sự hủy diệt của nó không phụ thuộc vào ZFC , một hệ thống mạnh hơn nhiều so với số học Peano. Bạn có thể quan tâm đến trích dẫn của nó [22]. Đối với thử thách này, tất nhiên, bạn có thể sử dụng ngôn ngữ lập trình mà bạn chọn thay cho máy Turing thực tế.


6
Những hệ tiên đề nào có thể được sử dụng để chứng minh rằng (a) chương trình không dừng lại và (b) việc không tạm dừng của chương trình là không thể chứng minh được trong PA?
frageum

5
Tôi không nghĩ là hợp lý khi yêu cầu câu hỏi này chứa tất cả các nền tảng cần thiết trong logic toán học. Có khá nhiều về nó, và có các liên kết đến thông tin liên quan. Nó không bị xáo trộn, nó chỉ là một chủ đề kỹ thuật. Tôi nghĩ rằng nó sẽ giúp khả năng truy cập để nêu yêu cầu về mã tách biệt với động lực liên quan đến máy Turing và liên kết với một số ví dụ về các tuyên bố độc lập với Peano để xem xét, đặc biệt là Định lý Goodstein ( golf liên quan )
xnor

Để điều này có ý nghĩa, chúng ta cần giả sử mã chạy trên máy được lý tưởng hóa với bộ nhớ không giới hạn. Chúng ta cũng có thể giả sử máy có độ chính xác thực tùy ý?
xnor

1
@feersum Tôi không mong đợi một bằng chứng tiên đề của (a) và (b). Chỉ cần viết một chương trình, và cung cấp đủ mô tả / lập luận / trích dẫn để có thể thuyết phục một cách hợp lý rằng các tuyên bố là đúng, như bạn làm với bất kỳ thách thức nào khác. Bạn có thể dựa vào bất kỳ tiên đề và định lý được chấp nhận tiêu chuẩn nào mà bạn cần.
Anders Kaseorg

2
@xnor Bạn có thể sử dụng bộ nhớ không giới hạn và các con trỏ không giới hạn để truy cập nó. Nhưng tôi không nghĩ sẽ hợp lý khi cho rằng độ chính xác thực sự tùy ý trừ khi ngôn ngữ của bạn thực sự cung cấp nó; trong hầu hết các ngôn ngữ, một chương trình như thế x = 1.0; while (x) { x = x / 2.0; }sẽ thực sự dừng lại rất nhanh.
Anders Kaseorg

Câu trả lời:


27

Haskell, 838 byte

Nếu bạn muốn một cái gì đó được thực hiện, thì

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

Giải trình

Chương trình này trực tiếp tìm kiếm bằng chứng số học Peano bằng 0 = 1. Vì PA là nhất quán, chương trình này không bao giờ chấm dứt; nhưng vì PA không thể chứng minh tính nhất quán của riêng mình, nên việc kết thúc chương trình này không phụ thuộc vào PA.

T là loại biểu thức và mệnh đề:

  • A Pđại diện cho mệnh đề ∀ x [ P ( x )].
  • (V 1 :$ P) :$ Qđại diện cho các đề xuất PQ .
  • V 2 :$ Pđại diện cho các đề xuất ¬ P .
  • (V 3 :$ x) :$ yđại diện cho mệnh đề x = y .
  • (V 4 :$ x) :$ yđại diện cho x + y tự nhiên .
  • (V 5 :$ x) :$ yđại diện cho tự nhiên xy .
  • V 6 :$ xđại diện cho S tự nhiên ( x ) = x + 1.
  • V 7 phản hồi tự nhiên 0.

Trong một môi trường có i biến miễn phí, chúng tôi mã hóa các biểu thức, mệnh đề và chứng minh dưới dạng ma trận nguyên 2 × 2 [1, 0; a , b ], như sau:

  • M ( i , ∀ x [ P ( x )]) = [1, 0; 1, 4] ⋅ M ( i , λ x [P (x)])
  • M ( i , x [ F ( x )]) = M ( i + 1, F ( x )) trong đó M ( j , x ) = [1, 0; 5 + i , 4 + j ] cho tất cả 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 , gammaP ) = [1, 0; 2, 4] ⋅ M ( i , Q ) ⋅ M ( i , gammaQ ) ⋅ M ( i , gammaQP )
  • M ( i , gammaP ( x )) = [1, 0; 3, 4] ⋅ M ( i , λ x [P (x)]) ⋅ M ( i , x ) [1, 0; 1, 2] ⋅ M ( i , gamma ⊢ ∀ x P (x))
  • M ( i , gammaP ( x )) = [1, 0; 3, 4] ⋅ M ( i , λ x [P (x)]) ⋅ M ( i , x ) [1, 0; 2, 2] ⋅ M ( i , y ) ⋅ M ( i , gammay = x ) ⋅ M ( i , gammaP ( y ))
  • M ( i , Γ ⊢ ∀ x , P ( x )) = [1, 0; 8, 8] ⋅ M ( i , λ x [ gammaP ( x )])
  • M ( i , Γ ⊢ ∀ x , P ( x )) = [1, 0; 12, 8] ⋅ M ( i , ΓP (0)) ⋅ M ( i , λ x [( Γ , P ( x )) ⊢ P (S ( x ))])
  • M ( i , gammaPQ ) = [1, 0; 8, 8] ⋅ M ( i , ( Γ , P ) Q )
  • M ( i , gammaPQ ) = [1, 0; 12, 8] ⋅ M ( i , ( Γ , ¬ Q ) ⊢ P )

Các tiên đề còn lại được mã hóa bằng số và đưa vào môi trường ban đầu Γ :

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

Một bằng chứng với ma trận [1, 0; một , b ] có thể được kiểm tra đưa ra chỉ góc dưới bên trái một (hoặc bất kỳ đồng dạng giá trị khác để một modulo b ); các giá trị khác ở đó để cho phép cấu thành bằng chứng.

Ví dụ, đây là một bằng chứng cho thấy bổ sung là giao hoán.

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

Bạn có thể xác minh nó với chương trình như sau:

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

Nếu bằng chứng không hợp lệ, bạn sẽ nhận được danh sách trống thay thế.


1
Hãy giải thích ý tưởng đằng sau ma trận.
tự hào

2
@proudhaskeller Chúng chỉ là một cách thuận tiện, tương đối nhỏ gọn để đánh số tất cả các cây chứng minh có thể. Bạn cũng có thể nghĩ về chúng như các chữ số hỗn hợp được giải mã từ phía ít quan trọng nhất bằng cách sử dụng div và mod theo số lượng lựa chọn có thể có ở mỗi bước.
Anders Kaseorg

Làm thế nào bạn mã hóa các tiên đề cảm ứng?
PyRulez

@PyRulez M (i, Γ ⊢ x, P (x)) = [1, 0; 12, 8] M (i, Γ P (0)) ⋅ M (i, x [(Γ, P (x)) ⊢ P (S (x))]) là tiên đề cảm ứng.
Anders Kaseorg

Tôi nghĩ rằng bạn có thể làm cho nó nhỏ hơn nếu bạn sử dụng Giải tích công trình thay thế (vì Giải tích công trình có logic thứ nhất được tích hợp và rất nhỏ). Tính toán các công trình xây dựng mạnh ngang với ZFC, vì vậy tính nhất quán của nó chắc chắn không phụ thuộc vào PA. Để kiểm tra xem tính nhất quán của nó, bạn chỉ cần tìm một thuật ngữ thuộc loại trống.
PyRulez
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.