AI::Prolog

perlの実装でAI::Prologというのがあるが、インストールするとaiprologというコマンドがついてくる。

階乗を計算してみる。

fact(0, 1).
fact(X, Sum) :-
    X > 0, X1 is X - 1, fact(X1, Sum1), Sum is X * Sum1.

aiprologを起動

$ aiprolog fact.swi

Welcome to AI::Prolog v 0.740
Copyright (c) 2005-2006, Curtis "Ovid" Poe.
AI::Prolog comes with ABSOLUTELY NO WARRANTY.  This library is free software;
you can redistribute it and/or modify it under the same terms as Perl itself.

Type 'help.' for for a list of built-ins or 'help("$builtin").' for help on a specific built-in.

?-fact(10,X).

fact(10, 3628800)

Yes

prologをいじってると宣言的ってのが「あーこういうことなのね」ってのがわかって楽しい。On LispでCommon Lispで実装するPrologとか読んである(継続とパターンマッチング)と内部でこういうことしてんのかなとか推測できるし。

ProductName On Lisp
ポール グレアム
オーム社 / 3990円 ( 2007-03 )


あとでHOPの9章の宣言的プログラミングのとこも読み返そう。Prologを知ってると面白く読めるのかも。

ProductName Higher-Order Perl: Transforming Programs with Programs
Mark Jason Dominus
Morgan Kaufmann / 5692円 ( 2005-03-28 )


macbookにswi-prologをインストール

初Prolog

sudo port install swi-prolog

linuxだとplなんだけどmacだとswiplというコマンド。

parent(kzfm,yuki).
parent(uko,yuki).
parent(ako,uko).
parent(yum,kzfm).
parent(chiyo,yum).
parent(kzfm,hana).
parent(uko,hana).

上のファイルをtest.swiという名前で保存しておいて、

swipl -f test.swi

で起動

?- parent(A,yuki).
A = kzfm ;
A = uko . 

?- parent(A,B),parent(B,yuki).
A = ako,
B = uko ;
A = yum,
B = kzfm ;
false.

parentのparentつまり祖父母だ。もちろん再帰もできる。On Lispの言葉を借りるならPrologは規則を追加したデータベースだ。

ということは、ミニ言語としてperlとかに組み込んであっても良さそうなものだと思って探してみたら、ズバリな記事を見つけた。

Logic Programming with Perl and Prolog

あとで読む。

今のところ入門的な内容しかやってないのでアレなんだけど、ファクトが固いというか、True,Falseからしかルールを導いてないので、もうちょっと確率的なものを扱いたい。8割くらい正しいのでTrueとかそんな感じの緩いルール。

これも気になるが、なか見検索できないので躊躇している。

追記

これ見たら、この本よりも、Prolog Programming for Artificial Intelligenceを買うべきな気がしてきた。

ProductName Prolog Programming for Artificial Intelligence (International Computer Science Series)
Ivan Bratko
Longman Group United Kingdom / ¥ 7,091 ()
通常11~13日以内に発送