Prolog 1日目

7つの言語 7つの世界 Prolog編。Prologは授業で触ったことがあるのでサクサクと。

Prologは論理型言語に属する。プログラマーは知識としてのデータベースをコーディングし、質問を投げかける。そうするとPrologはコーディングされた知識から解答を見つけてくれるというような言語である。

基本

小文字で始まる単語は固定値であり、変更できない。大文字もしくはアンダースコアで始まる単語が変数。Prologは事実・ルール・質問で構成されており、下の例ではlikes以降が事実、friend以降がルールとなっている。

likes(wallace, cheese).
likes(grommit, cheese).
likes(wendolene, sheep).

friend(X, Y) :- \+(X = Y), likes(X, Z), likes(Y, Z).

このfriendルールは:-以降を見ると、\+(X = Y), likes(X, Z), likes(Y, Z)となっている。このルールは「XとYは異なっており、かつXはZが好き、かつYはZが好きな場合に真となる」と表すことができる。同じものが好きだったら2人は友達という過程だ。

カンマで区切られたそれぞれの部分をサブゴールと呼ぶ。ひとつめのサブゴールは論理否定\+を使って「XはYでないとき」を表している。2つ目のサブゴールは「XがZを好き」ならtrue.となる。likes(Y, Z)も同様であり、Zについてはlikesを満たすものが見つかるまで検索を行う。

質問はfriend(grommit, wallace).で表される。friendルールに則り、この場合はtrue.が返ってくる。

上の例をtest.plで保存し、Prologインタプリタ

['test.pl'].

とすれば読み込むことができる。

穴埋め問題

airtime(zexal, evening).
airtime(precure, morning).
airtime(torico, morning).

という事実があったとき、airtime(What, morning).と変数を含ませて質問すると、What = precureとWhat = toricoが返ってくる。