Prolog入門

Prolog入門
ーIT中級者用ー
Prologとは
 PROgramming in LOGic
 人工知能用プログラミング言語




手続き型プログラミング
宣言型プログラミング
関数型プログラミング
オブジェクト指向型プログラミング etc.
 Programming in logic
 論理の言葉でプログラムを記述するプログ
ラミング方法
具体例
 記号微分プログラム
(さっそく、作ってみよう!)
微分の知識(例えば…)
d
d
k  0, n  0
dx
dx
d
d
x  1, kx  k 等
dx
dx
微分の知識
d
k 0
dx
d(K,X,0).
微分の知識
d
n0
dx
d
x 1
dx
d(N,X,0).
d(X,X,1).
プログラムのソース全容
d(X,X,1).
d(T,X,0) :- atom(T) ; number(T).
d(U+V,X,DU+DV) :- d(U,X,DU), d(V,X,DV).
d(U-V,X,DU+ (-DV)) :- d(U,X,DU), d(V,X,DV).
d(-T,X,-R) :- d(T,X,R).
d(K*U,X,K*W) :- number(K), d(U,X,W).
d(U*V,X,B*U+A*V) :- d(U,X,A), d(V,X,B).
d(U/V,X,W) :- d(U*V^ (-1),X,W).
d(U^V,X,V*W*U^ (V+ (-1))) :- number(V), d(U,X,W).
d(U^V,X,Z*log(U)*U^V+V*W*U^ (V+ (-1)))
:- d(U,X,W), d(V,X,Z).
d(log(T),X,R*T^ (-1)) :- d(T,X,R).
d(exp(T),X,R*exp(T)) :- d(T,X,R).
d(sin(T),X,R*cos(T)) :- d(T,X,R).
d(cos(T),X,-R*sin(T)) :- d(T,X,R).
d(tan(T),X,W) :- d(sin(T)/cos(T),X,W).
プログラム(1/4)
1. d(X,X,1).
2. d(T,X,0) :- atom(T) ; number(T).
プログラム(1/4-1)
1. d(X,X,1).




XをXで微分すると1.
XをXでdifferentiateすると1.
Differentiation of X with respect to X is 1.
d(X, X, 1).
d(X,X,1).
一般に、
d(f(x), x, f ’(x)).
プログラム(1/4)
2. d(T,X,0) :- atom(T) ; number(T).





もしTがアトムか数ならば、TをXで微分
すると0.
TをXで微分すると0.もしTがアトムか数
ならば.
d(T,X,0) if T is atom or T is number.
d(T,X,0) if atom(T) or number(T).
d(T,X,0) :- atom(T) ; number(T).
プログラム(2/4)
3. d(U+V,X,DU+DV) :- d(U,X,DU), d(V,X,DV).
4. d(U-V,X,DU+ (-DV)) :- d(U,X,DU), d(V,X,DV).
5. d(-T,X,-R) :- d(T,X,R).
プログラム(2/4-1)
3. d(U+V,X,DU+DV) :- d(U,X,DU), d(V,X,DV).

UをXで微分したものがDUであり、かつ、
VをXで微分したものがDVであるとき、
U+VをX微分したものはDU+DVである。
d
d
d
U ( x)  V ( x)  U ( x)  V ( x)
dx
dx
dx
プログラム(2/4)
3. d(U+V,X,DU+DV) :- d(U,X,DU), d(V,X,DV).
4. d(U-V,X,DU+ (-DV)) :- d(U,X,DU), d(V,X,DV).
5. d(-T,X,-R) :- d(T,X,R).
プログラム(3/4)
6.
7.
8.
9.
d(K*U,X,K*W) :- number(K), d(U,X,W).
d(U*V,X,B*U+A*V) :- d(U,X,A), d(V,X,B).
d(U/V,X,W) :- d(U*V^ (-1),X,W).
d(U^V,X,V*W*U^ (V+ (-1))) :number(V), d(U,X,W).
10. d(U^V,X,Z*log(U)*U^V+V*W*U^ (V+ (-1))) :d(U,X,W), d(V,X,Z).
プログラム(4/4)
11. d(log(T),X,R*T^ (-1)) :- d(T,X,R).
12. d(exp(T),X,R*exp(T)) :- d(T,X,R).
13. d(sin(T),X,R*cos(T)) :- d(T,X,R).
14. d(cos(T),X,-R*sin(T)) :- d(T,X,R).
15. d(tan(T),X,W) :- d(sin(T)/cos(T),X,W).
d(X,X,1).
d(T,X,0) :- atom(T) ; number(T).
d(U+V,X,DU+DV) :- d(U,X,DU),
d(V,X,DV).
d(U-V,X,DU+ (-DV)) :- d(U,X,DU),
d(V,X,DV).
d(-T,X,-R) :- d(T,X,R).
d(K*U,X,K*W) :- number(K),
d(U,X,W).
d(U*V,X,B*U+A*V) :- d(U,X,A),
d(V,X,B).
d(U/V,X,W) :- d(U*V^ (-1),X,W).
d(U^V,X,V*W*U^ (V+ (-1))) :number(V), d(U,X,W).
d(U^V,X,Z*log(U)*U^V+V*W*U^
(V+ (-1)))
:- d(U,X,W), d(V,X,Z).
d(log(T),X,R*T^ (-1)) :- d(T,X,R).
d(exp(T),X,R*exp(T)) :- d(T,X,R).
d(sin(T),X,R*cos(T)) :- d(T,X,R).
d(cos(T),X,-R*sin(T)) :- d(T,X,R).
d(tan(T),X,W) :d(sin(T)/cos(T),X,W).
プログラムのソース全容
d(X,X,1).
d(T,X,0) :- atom(T) ; number(T).
d(U+V,X,DU+DV) :- d(U,X,DU), d(V,X,DV).
d(U-V,X,DU+ (-DV)) :- d(U,X,DU), d(V,X,DV).
d(-T,X,-R) :- d(T,X,R).
d(K*U,X,K*W) :- number(K), d(U,X,W).
d(U*V,X,B*U+A*V) :- d(U,X,A), d(V,X,B).
d(U/V,X,W) :- d(U*V^ (-1),X,W).
d(U^V,X,V*W*U^ (V+ (-1))) :- number(V), d(U,X,W).
d(U^V,X,Z*log(U)*U^V+V*W*U^ (V+ (-1)))
:- d(U,X,W), d(V,X,Z).
d(log(T),X,R*T^ (-1)) :- d(T,X,R).
d(exp(T),X,R*exp(T)) :- d(T,X,R).
d(sin(T),X,R*cos(T)) :- d(T,X,R).
d(cos(T),X,-R*sin(T)) :- d(T,X,R).
d(tan(T),X,W) :- d(sin(T)/cos(T),X,W).
Prologのデータタイプ
1. 定数


文字定数:abc, aDog2 (小文字で始まる)
名詞(2バイト文字で始まる)
数定数:3.14, 2007
2. 変数:Hensuu, Noun(大文字で始まる)
_aDog2, _名詞(_で始まる)
3. 述語:p(X), is_a_dog(Animal)
4. リスト:[1,2,3], [好き,太郎,カレー], [ ]
定数
1. 文字定数(atom):



atom(ext2127) -> true
atom(2007) -> false
atom(3.14) -> false
2. 数(number):



number(2005) -> true
number(3.14) -> true
number(ext2171) -> false
変数
1. 変数(variable):
var(X)
var(abc)
述語
1. 述語(predicate):
pred(Arg1, Arg2, Arg3, … ).
Is_a_dog(ポチ).
Love(taro, hanako).
愛する(太郎, 花子).
リスト
1. 定数や変数や述語がゼロ個以上
括弧”[“と”]”で囲まれたもの。
[a, b, c]
[太郎, 花子, 次郎, pochi]
[a, B, c]
[愛する[太郎,花子], 年齢[太郎,20],
年齢[花子,19]]
[1 , [2, [3, [4], 5, 6]], 7]
[ ] (空リスト)
Prologのデータタイプ(確認)
1. 定数


文字定数:abc, aDog2 (小文字で始まる)
名詞(2バイト文字で始まる)
数定数:3.14, 2005
2. 変数:Hensuu, Noun(大文字で始まる)
_aDog2, _名詞(_で始まる)
3. 述語:p(X), is_a_dog(Animal)
4. リスト:[1,2,3], [好き,太郎,カレー], [ ]
ここまでは簡単!
次がポイント!
 がんばりましょう。
Unification(ユニフィケーション)
 「ある物とある物とが同じ」という概念
 「オブジェクトAとオブジェクトBとを
同一視することができる」

A <=> B と書こう。
実例で見てみよう
 2007 <=> 2007 (2007と2007は同じ)
 2007 <!=> 2006 (2007と2006は異なる)
 2007とext2171はunifyしない。
2007 <!=> ext2171
いろいろな例
1.
2.
3.
4.
5.
X と123 はunifyする?
p(a,b,c) と p(a,b,c) はunifyする?
p(a) と p(X) はunifyする?
[1,2,[3],4] は[1,2,3,4] とunifyする?
[1,2,3] は [A,B,C] とunifyする?
Unify(Unification)の理解なくして
Prologの理解なし!
 いろんな例で慣れよう!
次へ進みましょう
プログラム例(2)
 ある推論をPrologで表現し、その推論
をPrologに実行させてみる。
ある推論
 人間は死ぬ。
 ソクラテスは人間である。
 故に、ソクラテスは死ぬ。
前提
帰結
ある推論
人間は死ぬ。
ソクラテスは人間である。
------------------------------------故に、ソクラテスは死ぬ。
 これらを論理の言葉(論理式)に置き
換えてみよう。
ある推論
 人間は死ぬ  xが人間ならば、xは死ぬ。
 もし人間(x)が真ならば、
死ぬ(x)。
 mortal(x) if human(x).
 m(x) :- h(x).
ある推論
ソクラテスは人間である。
 ソクラテスsは人間である。
 人間(s)である。
 human(s).
 h(s).
ある推論
m(X) :- h(X).
h(s).
----------------------m(s).
Prologで書くと…
assert(m(X) :- h(X)).
asert(h(s)).
m(s).
Prologで書くと…
assert(m(X) :- h(X)).
asert(h(s)).
知識部(データベース)
m(s).
質問部
実行方法
1. 知識部を対話的にキーボードから入力
する方法。
2. 知識部をフィルから読み込む方法。
など
次回は…
 Progolの復習
 述語論理式とProlog言語との関係
 一般の論理式
⇒冠頭標準形
⇒skolem標準形
⇒節集合形式
 resolutionを適用できる!
 この特別なものがPorlog
付録. Prolog言語の処理系







swi-prolog
Arity-prolog
Run Prolog
K-prolog
IF-Prolog
Quintus Prolog
Sictus Prolog etc.