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を超えたら「たくさん」ですけど。