Powered By Blogger

2012年6月4日月曜日

ペアノ算術とProlog

ペアノ算術をPrologで表現してみる。

元ネタ
第3巻『数学ガール/ゲーデルの不完全性定理』
Prolog by Example: Peano Arithmetics

Swi-Prologを使います。

と…その前にペアノの公理で自然数を定義しよう。

ペアノの公理1
0は自然数である



Prologコード
natural_n(0).

ペアノの公理2
どんな自然数nに対しても後続数s(n)は自然数である



Prologコード
natural_n(s(N)) :- natural_n(N).

ペアノの公理3
どんな自然数nに対してもs(n)は0ではない



Prologコードは無し

ペアノの公理4
どんな自然数m,nに対しても、s(m)=s(n)ならばm=nである



Prologコードは無し
ペアノの公理5
自然数nに対する述語P(n)で、次の2つが成り立つとする。
・P(0)である。
・どんな自然数kに対しても、P(k)ならばP(s(k))である。
このときどんな自然数nに対してもP(n)が成り立つ。



Prologコードは無し
ここまでのPrologコードまとめ
natural_n(0).
natural_n(s(N)) :- natural_n(N).

実行してみる。
?- natural_n(X).
X = 0 ;
X = s(0) ;
X = s(s(0)) ;
X = s(s(s(0))) ;
X = s(s(s(s(0)))) ;
X = s(s(s(s(s(0))))) .

自然数が出来た!
「これが自然数?」と言いたい人もいるでしょうが、これで良いんです!!
s(0)を1
s(s(0))を2
s(s(s(0)))を3
というふうに読み替えて下さい。


さて、ここからがペアノ算術

足し算の公理1
どんな自然数nに対しても、n + 0 = nが成り立つ


Prologコード
sum(N,0,N).

余談ですが自然数に0を含める考え方(0,1,2 ...)と含めない考え方(1,2,3 ...)があり、上の足し算の公理は前者です。
後者の場合の公理はこうなります。
足し算の公理1(0は自然数に含めない)
どんな自然数nに対しても、n + 1 = s(n)が成り立つ


"0"という自然数は存在しないので、こうするしかないのでしょう。
この場合は、
s(1)を2
s(s(1))を3
s(s(s(1)))を4
というふうに読み替えて下さい。

Prologコード
sum(N,1,s(N)).

足し算の公理2



Prologコード
sum(N,s(M),s(K)) :- sum(N,M,K).

Prologコードまとめ
sum(N,0,N).     %In case of natural numbers contain 0.
sum(N,1,s(N)).  %In case of natural numbers contain NO 0.
sum(N,s(M),s(K)) :- sum(N,M,K).  %K=N+M

X=3+2を実行してみます。

?- sum(s(s(s(0))),s(s(0)),X).
X = s(s(s(s(s(0))))) ;
false.

X=5になりました。
おっと、ここで作った自然数は"5"とは言わないんでしたね。
s(s(s(s(s(0)))))ですね、でも長ったらしいので5と言う事にします。

因みに、0は自然数に含めない場合で
X=4+3を実行してみます。

?- sum(s(s(s(1))),s(s(1)),X).
X = s(s(s(s(s(s(1)))))) ;
false.

X=7になりました。

0を自然数に含める場合は、例えば2をs(s(0))と表現すると
sum(N,s(M),s(K)) :- sum(N,M,K).
を再帰的に評価し、最終的に
sum(N,0,N).
にマッチして、再帰の階段を戻って結果が出る訳です。

0を自然数に含めない場合は、例えば2をs(1)と表現して、最終的に
sum(N,1,s(N)).
の方にマッチするのです。

ではここからは掛け算です。
掛け算の公理1
0を自然数に含める場合

Prologコード
prod(M,0,0).

0を自然数に含めない場合

Prologコード
prod(M,1,M).

掛け算の公理2



Prologコード
prod(M,s(N),P) :-
     prod(M,N,K),
     sum(K,M,P).   % K=M+N

Prologコードまとめ
prod(M,0,0).    %In case of natural numbers contain 0.
prod(M,1,M).    %In case of natural numbers contain NO 0.
prod(M,s(N),P) :-
    prod(M,N,K),
    sum(K,M,P).   % K=M+N

実行

0を自然数に含める場合、X=2*3

?- prod(s(s(0)),s(s(s(0))),X).
X = s(s(s(s(s(s(0)))))) ;
false.

X=6となりました。


0を自然数に含めない場合、X=2*4

?- prod(s(1),s(s(s(1))),X).
X = s(s(s(s(s(s(s(1))))))) ;
false.

X=8となりました。

0 件のコメント:

コメントを投稿