Prologで数を表現

発明家エジソンが小学校のとき


先生、なんで 1+1=2になるんですか?
的な質問を連発して先生を困らせたという話は有名です。

で、自分も、なんでなのかいまだによくわからんのですが...

以前 数学ガールで読んだ、


数字を知らない宇宙人に数という概念を教えるにはどうしたらいいか
   = 「ペアノ算術 (ペアノの公理)」
を参考にしつつ、さわり始めたばかりのProlog*1で1から10までの数、足し算、引き算、掛け算を定義してみました*2

まずは勉強、ということで、他のかたのコードを見ないで、一度 書いてみました。めっちゃ適当に書いたのに、すんなり動いてビックリ。*3

実際のコードは以下に*4

参考リンク*5  お気楽 Prolog プログラミング入門


SWI Prolog Portableで動作しました。*6


ちなみに、Prologには、ちゃんと最初から普通の四則演算が入っています。これは、あくまでも ペアノ算法をPrologで書いたらどんな感じになるか、という興味本位で書いたものです。


/* 最初に無限の定義 */
つぎ(たくさん,たくさん).
まえ(たくさん,たくさん).

/* 数を1から10まで順番に並べる */
/* もっと かしこいやりかたが有りそう*/
つぎ(いち,に).
つぎ(に,さん).
つぎ(さん,よん).
つぎ(よん,ご).
つぎ(ご,ろく).
つぎ(ろく,なな).
つぎ(なな,はち).
つぎ(はち,きゅう).
つぎ(きゅう,じゅう).
つぎ(じゅう,たくさん).


/* +1は、次の数字 */
たす(X,いち,Z) :- つぎ(X,Z).

/* 前の数字は、 次の数字の反対 */
まえ(X,Y) :- つぎ(Y,X).
ひく(X,いち,Z) :- まえ(X,Z).

/* 足し算の定義 X+Yは、(X+(Y-1))+1 */
/* 再帰を使ってます */
たす(X,Y,Z) :- まえ(Y,Y1),たす(X,Y1,Z1),つぎ(Z1,Z).


/* 引き算 X-Yは、(X-(Y-1))-1 */
ひく(X,Y,Z) :- まえ(Y,Y1),ひく(X,Y1,Z1),まえ(Z1,Z).

/* 掛け算の定義 X*Y は (X*(Y-1))+X */
かける(X,いち,Z) :- Z=X.
かける(X,Y,Z) :- まえ(Y,Y1),かける(X,Y1,Z1),たす(Z1,X,Z).


ひらがなばかりでユルいですが、これがちゃんとプログラムとして認識されて動くんだから、面白いプログラミング言語も有るもんですねー


これで



?- たす(いち,いち,X).
X = に .

?- かける(に,さん,X).
X = ろく .


みたいに答えてくれます。結果が10を超えたら「たくさん」ですけど。

*1:つきあい始めたばかりなのでたのしい

*2:割り算は ちょっとわからなかったのでやってません。

*3:型チェックなど、はしょってあります。

*4:その前にPrologインタプリタの使い方から説明しなきゃいけないような気がしないでもありませんが、、、

*5:自分は、こちらで勉強しました(まだ1/4ぐらいしか読んでないですけれども)

*6:いくつかWarningが出ます