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 ⋅ ÿ。
V 6 :$ x代表自然S(x)= x + 1。
V 7 表示自然0。
在具有i个自由变量的环境中,我们将表达式,命题和证明编码为2×2整数矩阵[1,0; a,b ],如下所示:
- M(我,∀ X [ P(X)])= [1,0; 1,4]⋅M(我,λ X [P(x)]的)
- M(我,λ X [ ˚F(X)])= M(我 + 1,˚F(X)),其中M(Ĵ,X)= [1,0; 所有j > i的 5 + i,4 + j ]
- M(i,P → Q)= [1,0; 2,4]⋅M(i,P)⋅M(i,Q)
- M(我,¬ 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(我,X ⋅ ÿ)= [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 + 我 ]
- M(我,(Γ,P)⊢ P)= [1,0; 1,4]
- M(我,Γ ⊢ P)= [1,0; 2,4]⋅M(我,Q)⋅M(我,Γ ⊢ Q)⋅M(我,Γ ⊢ Q → P)
- M(我,Γ ⊢ P(X))= [1,0; 3,4]⋅M(我,λ X [P(x)]的)⋅M(我,X)⋅[1,0; 1,2]⋅M(我,Γ ⊢&ForAll; X P(x)的)
- M(我,Γ ⊢ P(X))= [1,0; 3,4]⋅M(我,λ X [P(x)]的)⋅M(我,X)⋅[1,0; 2,2]⋅M(i,y)⋅M(我,Γ ⊢ ÿ = X)⋅M(我,Γ ⊢ P(Ý))
- M(我,Γ ⊢&ForAll; X,P(X))= [1,0; 8,8]⋅M(我,λ X [ Γ ⊢ P(X)])
- M(我,Γ ⊢&ForAll; X,P(X))= [1,0; 12,8]⋅M(我,Γ ⊢ P(0))⋅M(我,λ X [(Γ,P(X))⊢ P(S(X))])
- M(我,Γ ⊢ P → Q)= [1,0; 8,8]⋅M(我,(Γ,P)⊢ Q)
- M(我, Γ ⊢ P → Q)= [1,0; 12,8]⋅M(我,(Γ,¬ Q)⊢¬ P)
剩余的公理被数字编码并包含在初始环境Γ中:
- M(0,∀ X [ X = X ])= [1,0; 497、400]
- M(0,∀ X [¬(S(X)= 0)])= [1,0; 8269、8000]
- M(0,∀ X ∀ ÿ [S(X)= S(Ý)→ X = Ý ])= [1,0; 56106533,47775744]
- M(0,∀ X [ X + 0 = X ])= [1,0; 12033,10000]
- M(0,∀ ÿ [ x + S(y)= S(x + y)])= [1,0; 123263749,107495424]
- M(0,∀ X [ X ⋅0 = 0])= [1,0; 10049,10000]
- M(0,∀ X ∀ ÿ [ X ⋅S( Ý)= X ⋅ ÿ + X ])= [1,0; 661072709,644972544]
矩阵为[1,0; 一种,b ]可以检查仅给出左下角一个(或任何其他值全等一个模b); 还有其他值可用来构成证明。
例如,这里证明加法是可交换的。
- M(0,Γ ⊢∀ X ∀ ÿ [ X + ý = ÿ + 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)]
如果证明无效,您将得到一个空列表。