数理論理学
第2回
Prolog プログラミング
© 加藤,高田,新出
7.2節(p. 169)
簡単なプログラムによるProlog プログラミング
7.3節(p. 177)
一般的な確定節
Prolog (Programing in logic)
1974年 マルセイユ大学 コルメラワにより開発
Prolog (Programing in logic)
1974年 マルセイユ大学 コルメラワにより開発
本書を用いた講義の目的
Prolog の基礎である述語論理と
Prolog の動作原理である導出規則
の理解。
「ひろしがまる子の親である」という関係
Prologでは
parent(hiroshi, maruko).
parent(sumire, maruko).
male(hiroshi).
female(sumire).
female(maruko).
?- parent(X, maruko).
X = hiroshi
準備作業とプログラムの作成
$ mkdir prolog
$ cd prolog
$ emacs sakurake.pl &
parent(hiroshi, maruko).
parent(sumire, maruko).
male(hiroshi).
female(sumire).
female(maruko).
parent(tomozou, hiroshi).
parent(kotake, hiroshi).
parent(hiroshi, sakiko).
parent(sumire, sakiko).
parent(hiroshi, maruko).
parent(sumire, maruko).
male(tomozou).
male(hiroshi).
female(kotake).
female(sumire).
female(sakiko).
female(maruko).
child(X, Y) :- parent(Y, X).
mother(X, Y) :- parent(X, Y), female(X).
プログラム作成
ファイル名 sakurake.pl
(Windows のメモ帳の場合)ファイルの種類「全てのファイル」
準備作業とプログラムの実行
$ mkdir prolog
$ cd prolog
$ emacs sakurake.pl &
$ swipl
Welcome to SWI-prolog…
:
?- ['sakurake.pl'].
parent(tomozou, hiroshi).
parent(kotake, hiroshi).
parent(hiroshi, sakiko).
parent(sumire, sakiko).
parent(hiroshi, maruko).
parent(sumire, maruko).
male(tomozou).
male(hiroshi).
female(kotake).
female(sumire).
female(sakiko).
female(maruko).
child(X, Y) :- parent(Y, X).
mother(X, Y) :- parent(X, Y), female(X).
事実節
まる子がひろしの子供かどうか
child(tomozou, hiroshi).
child(kotake, hiroshi).
child(hiroshi, sakiko).
child(sumire, sakiko).
child(hiroshi, maruko).
child(sumire, maruko).
事実節だけ
では、表現
力に限界が
ある
ルールの導入
child(X, Y) :- parent(Y, X).
Y が Xの親
X は Y の
子供である。
ならば
:-
ヘッド部
ボディー部
確定節(プログラム節)
事実節も確定節の一種
?- listing.
parent(tomozou, hiroshi).
:
child(A, B) :-
parent(B, A).
mother(A, B) :-
parent(A, B),
female(A).
?- child(maruko, hiroshi).
true.
?- child(maruko, X).
X = hiroshi ;
X = sumire ;
parent(sumire, maruko). では不十分!
条件のAnd合成
すみれ は まる子の母親である。
mother(X,Y) :- parent(X,Y), female(X).
X が Yの親であり、
かつ X が女性
X は Y の
母親である。
ならば
かつ
?- listing.
parent(tomozou, hiroshi).
:
child(A, B) :-
parent(B, A).
mother(A, B) :-
parent(A, B),
female(A).
?- mother(sumire, maruko).
true.
?- mother(hiroshi, maruko).
false.
?- mother(X, maruko).
X = sumire ;
練習問題 条件のAnd合成の応用
さき子は、まる子の兄弟姉妹である。
X と Y
の親は
同じ
ルールを作る方針
X \= Y.
sibling(X,Y) :- 条件1,条件2,…
?- sibling(sakiko, maruko).
true.
?- sibling(maruko, maruko).
false.
?- sibling(X, maruko).
X= sakiko
練習問題 実行結果
sibling(X, Y) :-
child(X, Z),
child(Y, Z),
X \= Y.
練習問題 解答例
parent(tomozou, hiroshi).
parent(kotake, hiroshi).
parent(hiroshi, sakiko).
parent(sumire, sakiko).
parent(hiroshi, maruko).
parent(sumire, maruko).
male(tomozou).
male(hiroshi).
female(kotake).
female(sumire).
female(sakiko).
female(maruko).
child(X, Y) :- parent(Y, X).
mother(X, Y) :- parent(X, Y), female(X).
事実節
演習課題2 の準備
parent(tomozou, hiroshi).
:
parent(sumire, maruko).
parent(sakiko, tomohiro).
male(tomozou).
male(hiroshi).
female(kotake).
female(sumire).
female(sakiko).
female(maruko).
male(tomohiro).
child(X, Y) :- parent(Y, X).
mother(X, Y) :- parent(X, Y), female(X).
事実節の追加
演習課題2 条件のAnd合成の応用
ともひろは、まる子の甥である。
ルールを作る方針
nephew (X,Y) :- 条件1,条件2,…
?- nephew(tomohiro, maruko).
true.
?- nephew(tomohiro, sakiko).
false.
?- nephew (tomohiro, X).
X= maruko;
演習課題2 実行結果