富永研究室 ハンドブック プログラム言語

Prolog言語

[Comp] [Class]   [Upper]


[参考文献] [関連情報]


■ 基本操作

● 起動と終了

  > slog

  ※※※ 起動メッセージ ※※※

  |

  | ?-halt.        ※ slogを終了して、MS-DOSプロンプトに戻る

  >

● ファイルの読込み

○ consult(ファイル名)    ファイルの読込み


■ プログラム

● 事実の登録

事実は以下のような平叙文で表す。
  | happy.    ※ happyである
ある事物について判断を述べる。 person() を述語という。tom を個体という。 述語といっても、必ずしも自然言語の文法上での主語と述語の関係でなくともよい。
  | person(tom).    ※ tomはpersonである
2つ以上の事物の間の関係は、2変数の述語で表される。これを関係述語という。 基本的には前置記法で記述する。
  | love(tom, mary).  ※ tomはmaryをloveする
  | on(box, table).   ※ tableにboxがonしている
  | do(ken, run).     ※ kenはrunする

● 規則の登録

ある事実が他の事実から導かれるとき、以下のように記述する。
  | happy :- safe, comfortable.  ※ happyとは、safeかつcomfortableのときである

  | happy :- safe.               ※ happyとはsafeのときである
  | happy :- comfortable.        ※ happyとはcomfortableのときである
不特定なデータに対する一般的な規則は、以下のように記述する。
  | die(X):-person(X).    
die(X)の十分条件はperson(X)である。
  | father(X, Y) :- man(X), parent(X, Y).    
XがYのfatherであるためには、Xがmanで、かつXがYのparentでなければならない。
  | grandparent(X, Y) :- parent(X, Z), parent(Z, Y).
XがYのgrandparentであるためには、XがYのparent Zのparentでなければならない。 すなわち、上の関係を満たすZが存在しなければならない。


■ 実行

● 質問と返答

  | ?-happy・ 
  YES


■ 項の処理

● 項の一致

変数を含む2つの項の一致は、各変数に適当な項を代入して、 両者が等しくなるかどうかで判定する。 例えば、項 f(X, 1) と項 Y とは、Y=f(X, 1) と代入すれば、両者が一致する。 また、項 f(X, 1) と項 f(2, Y) とは、X=2, Y=1 と代入すれば、両者が一致する。 項 f(X) と項 f(X, 1) や、項 f(X) と項 g(X) は、変数の値によらず、一致しない。 また、項 f(X) と項 f(g(X)) とでは、代入 X=g(X) を考えそうだが、 これは X=g(X)=g(g(X))=‥ と無限ループを引き起こして一致しない。

● 項の単一化

2つの項が一致するように、変数への代入を行うことを単一化という。 変数への代入式の集合を単一化集合という。 例えば、項 f(1, X) と項 f(Y, 2) では、{X=2, Y=1} が単一化集合である。 また、項 f(1, X) と項 f(Y, Z) では、{X=Z, Y=1} が単一化集合である。 ここで、{X=0, Y=1, Z=0} も単一化集合であるが、 前者に比べて変数の一般性が弱まっている。 最も一般的な単一化集合で一致させることを最汎単一化という。 Prolog言語の動作原理は、最汎単一化に基づいている。 最汎単一化は、mguともいう。

● 項の比較

X == Y X \== YX @< Y X @> Y X @=< YX @>= Y
述語 compare() では、XとYの順序関係に対応して、Rに'=', '<', '>'を単一化する。
compare(R, X, Y)

● 項の判定

atom(1) や atom(X) は真であるが、atom(f(X)) が偽である。 var(X) は真であるが、var(2) や var(f(X)) は偽である。
atom(項)       項がアトムのとき
○ integer(項)    項が数値のとき
○ var(項)        項が変数のとき

● 項単位の入出力

read(項)         端末からの入力を項と照合する
○ write(項)        項を端末に出力する


■ 数値処理

● 式の評価

右辺の項は、数値として確定していなければならない。
X is Y         Yを評価してXに代入

● 算術演算

実際には、述語 is で評価されるまで、数値計算されず、式のままで扱われる。
X + Y          和
○ X - Y          差
○ X * Y          積
○ X / Y          商
○ X mod Y        剰余
○ X ^ Y          累乗

● 数値等号

C言語と異なるので、注意する。
X =:= Y      等号
○ X =\= Y      不等号

● 数値比較

<= ではなく、=< であることに注意する。
X < YX > YX =< YX => Y


■ 述語の再帰的定義


■ リスト処理

● リスト表記

項を幾つか並べて、[] で括った複合データをリストという。 項の区切は、, とする。[1, 2, 3] などがリストである。 [] もリストとみなす。これを空リストという。


■ 入出力

● ファイル入出力

オープンしたファイルは、必ずクローズする。 指定されたファイルが存在しないか、ロックされているときは、 失敗する。
see(ファイル)    入力ファイルをオープンする
○ seen             入力ファイルをクローズする
○ tell(ファイル)   出力ファイルをオープンする
○ told             出力ファイルをクローズする

● 文字単位の入出力

オープンしたファイルから、文字単位で入出力を行う。
get(変数)        1文字を読み込み、その文字コードを変数に代入する
○ put(数値)        数値の文字コードに対応する文字を表示する


■ 節の処理

● 定義節の読込

consult(ファイル名)      節の読込
○ reconsult(ファイル名)    以前の述語定義を削除してから節の再読込

● 定義節の一覧

listing            述語定義の一覧
○ listing(述語名)    その述語名の述語定義の一覧

● 定義節の追加と削除

assert(素論理式)     素論理式の追加
○ retract(素論理式)    素論理式を頭部に持つ最初の定義節を削除
○ abolish(述語名)      述語名を頭部に持つ全ての定義節を削除


■ 制御

● メタ実行

call(式)        式の実行

● 論理演算

P, Q             PかつQ
○ P; Q             PまたはQ
○ P -> Q; R        Pが真ならばQ、偽ならばR
○ \+ P             Pでない
○ not(P)           Pでない

● 特殊述語

fail         必ず失敗する述語
○ repeat       何度でも成功する述語

● カット

最初は成功するが、次からは失敗する。
!