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
説明
このプログラムは、0 = 1のPeano算術証明を直接検索します。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個の自由変数がある環境では、式、命題、および証明を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、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は ]のみ左下の所与確認することができ、A(またはそれに他の値合同モジュロ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)]
証明が無効な場合は、代わりに空のリストを取得します。