Prolog入門 ~初歩の初歩~
*前口上Prolog は,第5世代のプログラム言語などとも呼ばれ,人工知能の研究向きの
プログラム言語として使用されてきました.
私自身,AI(人工知能)を,のちにファジー制御やニューロ制御なるものを
少しばかりかじりました.このとき,Prologの勉強も少しばかりやりました.
今,再び挑戦してみたいと思います.
§1.Prologインタプリタの入手先ずは,Prologを体感するにはプログラムを作成し,それの動作を確認することです.
Prologインタプリタには何種類かが存在しますが,
SWI-Prolog を使うことにします.
SWI-Prolog はアムステルダム大学で開発された Prologインタプリタ です.
*ダウンロードSWI-Prolog's Home からダウンロードします.
http://www.swi-prolog.org/*VersionStable 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つの要素から成ります.
*
事実: 事物とその関係についていくつかの事実を宣言する.
*
規則: 事物とその関係についての規則を定義する.
*
質問: 事物とその関係について質問する.

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 が起動してプログラムが実行されます.

(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)起動直後

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

こうしたトップレベルからのプログラムの実行は,短いプログラムを1回限り走らせる場合
にはよいが,通常,長いプログラムを何回も走らせる場合は,先述の通りプログラムを別のファイル
に作成しておき,プログラムを実行する段階で読み込む方が便利です.
また、複数のファイルからプログラムを読み込む場合,例えば、prog1, prog2 という2 つ
のファイルのプログラムを読み込む場合は
?-[prog1,prog2].
のように操作します.
?- halt. で終了します.
§9.便利なコマンドつぎのコマンドを利用すると便利な場合があります.
?- listing. プログラムの内容を表示
?- chdir('...'). ディレクトリの遷移
?- pwd. カレントディレクトリの表示
?- ls. カレントディレクトリのファイル名表示
§10.例題演習(1)磯野家の家系図は次の通りです.Prologファイル isono.swi を作成してください.

----- 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)氏)
スポンサーサイト
- 2013/08/31(土) 11:39:14|
- Program
-
| トラックバック:0
-
| コメント:0