wvogel日記

自分用の技術備忘録が多めです.

SWI-Prolog導入

まずはお試し、ということで。
簡単な物を書いてみた。
拡張子は(.pro)で保存できるように指定しました。

programLanguage(X) :- functional(X).
programLanguage(Y) :- procedural(Y).
programLanguage(Z) :- logical(Z).

functional(haskell).
functional(erlang).

procedural(java).
procedural(c).
procedural(python).

logical(prolog).

実行結果

1 ?- logical(prolog).
true.

2 ?- procedural(c).
true.

3 ?- procedural(java).
true.

4 ?- procedural(haskell).
false.

5 ?- functional(erlang).
true.


更にもう一つ。

writeTo(i,Person).

実行結果

1 ?- Person = mother.
Person = mother.

2 ?- writeTo(i,Person).
true.

3 ?- writeTo(i,mother).
true.

4 ?- writeTo(i,father).
true.

面白いですけど、インタプリタ上でしか動かないのが悲しい。

そして階乗。
ホームページ移転のお知らせ - Yahoo!ジオシティーズ
こちらのホームページのソースコードをうつさせてもらいました。

kaijou(1,0).
kaijou(Ans,N) :- N > 0 , N1 is N-1 ,
                kaijou(Ans1,N1) , Ans is N*Ans1.

これでちゃんと解が出るのですが、なぜそうなるのかまだよく追えない.....