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