天地有情

Prolog入門 ~初歩の初歩~

Prolog入門 ~初歩の初歩~

*前口上
Prolog は,第5世代のプログラム言語などとも呼ばれ,人工知能の研究向きの
プログラム言語として使用されてきました.

私自身,AI(人工知能)を,のちにファジー制御やニューロ制御なるものを
少しばかりかじりました.このとき,Prologの勉強も少しばかりやりました.
今,再び挑戦してみたいと思います.

§1.Prologインタプリタの入手
先ずは,Prologを体感するにはプログラムを作成し,それの動作を確認することです.
Prologインタプリタには何種類かが存在しますが,SWI-Prolog を使うことにします.
SWI-Prolog はアムステルダム大学で開発された Prologインタプリタ です.

*ダウンロード
SWI-Prolog's Home からダウンロードします.
http://www.swi-prolog.org/

*Version
Stable release Sources and executables for MS-Windows and MacOS X version 6.4.x

インストール途中において,拡張子を設定する項目があります.デフォルトとして
.pl あるいは .pro が用意されていますが .pl はPerlスクリプト言語と,また .pro は各種の
プロジェクトファイルと混同する恐れがあります.ユーザ側で任意に決めることができますが,
.swi が推奨されているようです.このページでも .swi を使うことにします.

§2.Prolog プログラムの構成
Prolog のプログラムは次の3つの要素から成ります.
事実: 事物とその関係についていくつかの事実を宣言する.
規則: 事物とその関係についての規則を定義する.
質問: 事物とその関係について質問する.

swi01.png

Prolog のデータベース は 事実(fact) と 規則(rule) の集合です.それらは追加したり,
削除したりすることができます.

作り方はエディタで後述に示すような形式で”事実”や”規則”を作成し,ファイル名を付けて保存します.
たとえば,ファイル名を sample.swi としますと,
  ?- [sample].として,Prologシステムに読み込ませます.これで sample.swi のデータベースが完成しました.

この sample.swi データベースを運用するには,利用者が”質問”を送信するとデータベース内が
検索されて該当するものがあれば”応答”してくれます.


§3.事実とは
「i love you」(私は貴方を好きです) という文を考えると,主語が「i」,目的語
が「you」,述語が「love」となります. これは「i」という事物と「you」
という事物の関係(前者が後者をlove である) を表現しています.
Prolog では,この述語に注目して,事物の関係を表します.love(i, you).
次の点に注意します.

1. すべての関係と事物の名前は[小文字]で始まる.
   例: love, i, you
2. まず最初に関係の名前(述語)が置かれ,次に括弧で囲まれた中にコンマで区切って事物を書く.
   例: love(i, you).
   love ← 関係を表す(2つの引数をもつことのできる述語です)
   i, you ← 事物を表す
3. 事実の最後には’.’ (ピリオド) が置かれる.
4. コメント記号
   一行コメント記号    %
   複数行コメント記号   /* .....
                ......
                ......
               */

§4.質問とは
いくつかの事実があるとき,質問をすることができます. 質問は ?- という記号を前につけて表します.

?- love(i, you). ←入力
true ← Prolog の回答

Prolog は質問に適合する事実があれば"true" と回答し,なければ"false" と回答します.
つまりProlog における"false" は「知らない」ということです.

*変数について
Prolog は「大文字で始まる名前」は変数(variable) です. 変数は「値が決まっているか」
か「決まっていないか」のどちらかで, Prolog はすべての事実を探索してこの変数が表す
事物を見つけます. ただし,「述部」は変数にできないことに注意が必要です.

?- love(i, X). ← 入力
X = you ← Prolog が変数の値を表示する

つぎのようなデータベースがある場合の質問を考えてみましょう.

love(taro,aichan).
love(jiro,aichan).

?- (X,aichan).
X=taro;     ← 第一の解を表示する.セミコロンを入力すると,
X=jiro.     ← 第二の解を表示する.

Prolog が解を見つけて表示しているときに; を入力することによって, Prolog に別の
解を再探索させることができます. 別の解を見つけるために後戻りすることをバックト
ラック(backtrack) と言います.

§5.「かつ」と「または」について

*「かつ」(連言,論理積)
AND を表す関係を記述したいときには,コンマ(,)で区切って並べて記述します.

?- love(taro,X), love(jiro,X).
X=aichan.

*「または」(選言,論理和)
OR を表す関係を記述したいときには,セミコロン(;)で区切って並べて記述します.

?- love(taro,X);love(Y,aichan).
X = aichan ;
Y = taro ;
Y = jiro.

§6.規則とは
Prolog の規則は一般に次のような形式で表します.

head :- goal1, goal2, ..., goalN.

これは,「goal1 AND goal2 AND ... AND goalN ならばheadである」という意味です.

§7.SWI-Prolog の始動と終了

**始動操作
つぎの3通りがあります.

(1)たとえば sample.swi アイコンをクリックすると,SWI-Prolog が起動してプログラムが実行されます.

mple.png


(2)prolog実行ファイル swipl-win.exe を起動後,
    ?- consult('sample.swi'). または ?- consult(sample).
    拡張子を付けた場合は '...' (シングルコーテーションマーク)で囲みます.

(3)prolog実行ファイル swipl-win.exe を起動後,
    ?- ['sample.swi']. または ?- [sample]
    拡張子を付けた場合は '...' (シングルコーテーションマーク)で囲みます.


**終了操作
halt命令で終了します.すなわち,
    ?- halt.
    末尾の .(ピリオド)を忘れないように.

§8.対話形式によるSWI-Prolog の始動と終了

swipl-win.exe を起動すると,?- というプロンプトが現れます(この状態をトップレベルと呼ぶ).
トップレベルからプログラムを直接実行する場合,

?-[user].
と入力すると,プログラムの入力待ち状態になります.もう一度 Enterキー を押す.ここで,例えばプログラム

p(X):- q(X).
q(a).

を入力した後、Ctrl-D(コントロールキー+ D) を入力してトップレベル

?-

へ戻る.このとき,質問

?- p(a).

を入力して、リターン・キーを押すとtrue と表示され、次の質問入力待ち状態になります.
以上の遷移を以下に示します.

(1)起動直後

swi02.png


(2)データベース生成と質問状況

swi03.png


こうしたトップレベルからのプログラムの実行は,短いプログラムを1回限り走らせる場合
にはよいが,通常,長いプログラムを何回も走らせる場合は,先述の通りプログラムを別のファイル
に作成しておき,プログラムを実行する段階で読み込む方が便利です.

また、複数のファイルからプログラムを読み込む場合,例えば、prog1, prog2 という2 つ
のファイルのプログラムを読み込む場合は

?-[prog1,prog2].

のように操作します.


?- halt. で終了します.

§9.便利なコマンド
つぎのコマンドを利用すると便利な場合があります.

    ?- listing.     プログラムの内容を表示
    ?- chdir('...').   ディレクトリの遷移
    ?- pwd.       カレントディレクトリの表示
    ?- ls.        カレントディレクトリのファイル名表示

§10.例題演習

(1)磯野家の家系図は次の通りです.Prologファイル isono.swi を作成してください.

isono.png

----- isono.swi -----
% 節
male(namihei).
male(masuo).
male(katuo).
male(tara).

female(fune).
female(sazae).
female(wakame).

father_of(namihei, sazae).
father_of(namihei, katuo).
father_of(namihei, wakame).
father_of(masuo, tara).

mother_of(fune, sazae).
mother_of(fune, katuo).
mother_of(fune, wakame).
mother_of(sazae, tara).

% XはYの親である
% XがYの父親であるか、XがYの母親である
parent_of(X, Y) :- father_of(X, Y).
parent_of(X, Y) :- mother_of(X, Y).

% XはYの息子である
% YはXの親であり、かつXは男性である
suns_of(X, Y) :- parent_of(Y, X), male(X).

% XはYの娘である
% YはXの親であり、かつXは女性である
daughter_of(X, Y) :- parent_of(Y, X), female(X).

% XはYの祖父である
% ZはYの親であり、XはZの父である
grandfather_of(X, Y) :- parent_of(Z, Y), father_of(X, Z).

% XはYの祖母である
% ZはYの親であり、XはZの母
grandmother_of(X, Y) :- parent_of(Z, Y), mother_of(X, Z).

(2)データベース isono.swi の読み込み
    ?- [isono].


(3)次の質問をしてください.

?- male(X).
?- female(X).
?- father_of(X, Y).
?- mother_of(X, Y).
?- parent_of(X, sazae).
?- suns_of(X, sazae).
?- suns_of(X, fune).
?- daughter_of(X, Y).
?- grandfather_of(X, Y).
?- grandmother_of(X, Y).

§11.おわりに
初歩の初歩~と題して説明しましたが,これから先は次を学習して頂ければ幸甚です.
 
 
 
*参考サイト
 
お気楽Prologプログラミング入門
http://www.geocities.jp/m_hiroi/prolog/
(M.Hiroi's Home Page: 広井誠 (Makoto Hiroi)氏)


スポンサーサイト
  1. 2013/08/31(土) 11:39:14|
  2. Program
  3. | トラックバック:0
  4. | コメント:0