Prolog始めました

はじめに

この記事は、SLP KBIT Advent Calendar 2015 - Adventar 23日目の記事となります。
今回が初めての参加となります。よろしくお願いします。
あと、ブログを書くのは初めてです。ご了承ください。

Prolog(プロログ)とは?

Prolog (Programming in Logic)はプログラミング言語です。C言語PerlPythonなどが手続き型言語LISP関数型言語と言われていますが、Prologは論理型言語と言われています。
人工知能とかPrologでできるとか。

手続き型と何が違うのか

Prologは物事の間で成り立つ関係を定義していきます。この定義されたものを事実(fact)と言い、事実関係を問い合わせることでプログラムが動作します。
C言語等はコンピュータに処理させる内容を順に書いてプログラミングしていきますが、Prologは事実を定義することでプログラミングすることができます。

例えば

「太郎は花子が好きである。」という事実を定義すると、

太郎は何が好きか? → 花子
誰が花子を好きか? → 太郎

という感じで、質問に答えることが可能です。

実際にやってみる

処理系は SWI-Prolog というものを使用しました。
SWI-prolog's homeからダウンロードできます。セットアップも簡単。

先ほどの「太郎は花子が好きである。」という定義はPrologでは、

like(taro, hanako).

と表します。
起動すると、

?-

という入力待ち状態になります。
では、太郎が花子が好きであるか、質問してみましょう。

?- like(taro, hanako).
true.

前提にしてあるのでその通りですね。
次は変数Xを用いて太郎は誰が好きなのかを質問します。

?- like(taro, X).
X = hanako.

ちゃんと答が返ってきました。 Prologはこのように事実を検索して答を見つけてくれます。

なんか作ってみる

今回はPrologで家系図を構築してみることにしました。 国民的アニメ「サザエさん」の磯野家とフグ田家の家系図を作ります。

Isono family

// 男性
male(namihei).
male(umihei).
male(katsuo).
male(masuo).
male(tarao).
// 女性
female(fune).
female(wakame).
female(sazae).
// 父親
father_of(namihei, sazae).
father_of(namihei, katsuo).
father_of(namihei, wakame).
father_of(masuo, tarao).
// 母親
mother_of(fune, sazae).
mother_of(fune, katsuo).
mother_of(fune, wakame).
mother_of(sazae, tarao).
// 両親
parents_of(X, Y) :- father_of(X, Y).
parents_of(X, Y) :- mother_of(X, Y).
// 子供
son_of(X, Y) :- parents_of(Y, X), male(X).
daughter_of(X, Y) :- parents_of(Y, X), female(X).
// 祖父母
grandfather_of(X, Y) :- parents_of(Z, Y), father_of(X, Z).
grandmother_of(X, Y) :- parents_of(Z, Y), mother_of(X, Z).

祖父母の関係を示すためにX, Y以外の新たな変数を用いるところはまだ理解できてなかったりします…
とりあえず起動してみましょう。
てきとうに色々質問してみます。

?- son_of(katsuo, Y).
X = namihei ;
X = fune.

?- father_of(namihei, X).
X = sazae ;
X = katsuo ;
X = wakame.

?- father_of(X, tarao).
X = masuo.

?- grandmother_of(X, tarao).
X = fune.

あってますね。
まだまだ完璧に仕上げるためには孫などの定義も作る必要がありそうですね。

まとめ

最初はC言語以外の言語してみたいと思い偶然Prologというのがあると聞いたのがきっかけでした。
はい、Prolog楽しいです。
プログラミング言語は色々勉強してみるものですね。
今まで触れてなかったものに触れると新たな発見があるかもしれません。
…最終的にはほんとに人工知能とか作ってみたいなぁ。