하스켈, 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명제 ∀ 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 자유 변수가 있는 환경에서 표현식, 제안 및 증명을 2x2 정수 행렬로 인코딩합니다 [1, 0; , 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; 모든 j > i에 대해 5 + i , 4 + j ]
- M ( i , P → Q ) = [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 , x ⋅ y ) = [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 , Γ ⊢ Q → P )
- 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 , Γ ⊢ P → Q ) = 1, 0; 8, 8] ⋅ M ( i , ( Γ , P ) ⊢ Q )
- M ( I , Γ ⊢ P → Q ) = 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, ∀ x ∀ y [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, ∀ x ∀ y [ x ⋅ S ( y ) = x ⋅ y + x ]) = [1, 0; 661072709, 644972544]
행렬을 가진 증명 [1, 0; , B ] 체크 만 왼쪽 모서리들 수 을 (또는 어떤 다른 값 합동 모듈로 B ); 다른 값은 증명의 구성을 가능하게합니다.
예를 들어, 여기에 덧셈이 반복적이라는 증거가 있습니다.
- M (0, Γ ⊢ ∀ x ∀ y [ 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)]
증명이 유효하지 않은 경우 빈 목록이 대신 표시됩니다.