Transcript 講義資料2
Prolog入門
ーIT中級者用ー
Prologとは
PROgramming in LOGic
人工知能用プログラミング言語
手続き型プログラミング
宣言型プログラミング
関数型プログラミング
オブジェクト指向型プログラミング etc.
2
Programming in logic
論理の言葉でプログラムを記述するプログ
ラミング方法
3
具体例
記号微分プログラム
(さっそく、作ってみよう!)
4
微分の知識(例えば…)
d
k 0 , d
dx
dx
d
d
dx
x 1, n0
kx k 等
dx
5
微分の知識
d
k 0
d(K,X,0).
dx
6
微分の知識
d
n0
d(N,X,0).
x 1
d(X,X,1).
dx
d
dx
7
プログラムのソース全容
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).
8
プログラム(1/4)
1. d(X,X,1).
2. d(T,X,0) :- atom(T) ; number(T).
9
プログラム(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).
10
d(X,X,1).
一般に、
d(f(x), x, f ’(x)).
11
プログラム(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).
12
プログラム(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).
13
プログラム(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
dx
U ( x ) V ( x )
d
dx
U ( x)
d
V ( x)
dx
14
プログラム(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).
15
プログラム(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).
16
プログラム(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).
17
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).
18
プログラムのソース全容
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).
19
Prologのデータタイプ
1. 定数
文字定数:abc, aDog2 (小文字で始まる)
名詞(2バイト文字で始まる)
数定数:3.14, 2007
2. 変数:Hensuu, Noun(大文字で始まる)
_aDog2, _名詞(_で始まる)
3. 述語:p(X), is_a_dog(Animal)
4. リスト:[1,2,3], [好き,太郎,カレー], [ ]
21
定数
1. 文字定数(atom):
atom(ext2127) -> true
atom(2007) -> false
atom(3.14) -> false
2. 数(number):
number(2005) -> true
number(3.14) -> true
number(ext2171) -> false
22
変数
1. 変数(variable):
var(X)
var(abc)
23
述語
1. 述語(predicate):
pred(Arg1, Arg2, Arg3, … ).
Is_a_dog(ポチ).
Love(taro, hanako).
愛する(太郎, 花子).
24
リスト
1. 定数や変数や述語がゼロ個以上
括弧”[“と”]”で囲まれたもの。
[a, b, c]
[太郎, 花子, 次郎, pochi]
[a, B, c]
[愛する[太郎,花子], 年齢[太郎,20],
年齢[花子,19]]
[1 , [2, [3, [4], 5, 6]], 7]
[ ] (空リスト)
25
Prologのデータタイプ(確認)
1. 定数
文字定数:abc, aDog2 (小文字で始まる)
名詞(2バイト文字で始まる)
数定数:3.14, 2005
2. 変数:Hensuu, Noun(大文字で始まる)
_aDog2, _名詞(_で始まる)
3. 述語:p(X), is_a_dog(Animal)
4. リスト:[1,2,3], [好き,太郎,カレー], [ ]
26
ここまでは簡単!
27
次がポイント!
がんばりましょう。
28
Unification(ユニフィケーション)
「ある物とある物とが同じ」という概念
「オブジェクトAとオブジェクトBとを
同一視することができる」
A <=> B と書こう。
29
実例で見てみよう
30
2007 <=> 2007 (2007と2007は同じ)
2007 <!=> 2006 (2007と2006は異なる)
2007とext2171はunifyしない。
2007 <!=> ext2171
31
いろいろな例
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する?
32
Unify(Unification)の理解なくして
Prologの理解なし!
いろんな例で慣れよう!
33
次へ進みましょう
34
プログラム例(2)
ある推論をPrologで表現し、その推論
をPrologに実行させてみる。
35
ある推論
人間は死ぬ。
ソクラテスは人間である。
故に、ソクラテスは死ぬ。
前提
帰結
36
ある推論
人間は死ぬ。
ソクラテスは人間である。
------------------------------------故に、ソクラテスは死ぬ。
37
これらを論理の言葉(論理式)に置き
換えてみよう。
38
ある推論
人間は死ぬ xが人間ならば、xは死ぬ。
もし人間(x)が真ならば、
死ぬ(x)。
mortal(x) if human(x).
m(x) :- h(x).
39
ある推論
ソクラテスは人間である。
ソクラテスsは人間である。
人間(s)である。
human(s).
h(s).
40
ある推論
m(X) :- h(X).
h(s).
----------------------m(s).
41
Prologで書くと…
assert(m(X) :- h(X)).
asert(h(s)).
m(s).
42
Prologで書くと…
assert(m(X) :- h(X)).
asert(h(s)).
知識部(データベース)
m(s).
質問部
43
実行方法
1. 知識部を対話的にキーボードから入力
する方法。
2. 知識部をフィルから読み込む方法。
など
44
練習問題
Prolog言語で2つのリストを結合する
プログラムを作成しなさい。
(答え)Prologの標準的な教科書に
載っています。
45
まとめとコメント
Progolの導入・紹介
述語論理式とProlog言語との関係
一般の論理式
⇒冠頭標準形
⇒skolem標準形
⇒節集合形式
resolutionを適用できる!
この特別なものがPorlog
46
付録. Prolog言語の処理系
swi-prolog
Arity-prolog
Run Prolog
K-prolog
IF-Prolog
Quintus Prolog
Sictus Prolog
Yap
etc.
47
さらに進んだ話題
いままでの推論は演繹的推論であった。
もう一つの推論形式である、帰納的推
論について簡単な紹介を行う。
48
演繹的推論(復習)
演繹的推論
Prolog形式表現
ソクラテスは人間である。 human(socrates).
mortal(X):-human(X).
人間は死ぬ。
___________________
___________
従って、
ソクラテスは死ぬ。
Therefore
mortal(socrates).
49
動作例
ソースコード
mortal(X):-human(X).
human(socrates).
動作画面
?- mortal(Z).
Z = socrates.
50
トレース時の動作画面
?- trace.
true.
[trace] 1 ?- mortal(A).
Call: (6) mortal(_G454) ? creep
Call: (7) human(_G454) ? creep
Exit: (7) human(socrates) ? creep
Exit: (6) mortal(socrates) ? creep
A = socrates.
51
帰納的推論
ソクラテスは死ぬ。
プロトンは死ぬ。
アリストテレスは死ぬ。
ソクラテスは人間である。
プラトンは人間である。
アリストテレスは人間である。
______________
人間は死ぬ。
52
帰納的推論(その2)
1990年代以降、帰納的推論のアルゴリ
ズムが明らかになるとともに、帰納的
推論を行うシステムが実装された。さ
らに、さまざまな分野に応用され、人
間が推論した場合と同等の結果を出力
する例も現れ始めた。
Progolがそのようなシステムの1つ。
53