Prolog入門 ーIT中級者用ー Prologとは PROgramming in LOGic 人工知能用プログラミング言語 手続き型プログラミング 宣言型プログラミング 関数型プログラミング オブジェクト指向型プログラミング etc. 2 Programming in logic 論理の言葉でプログラムを記述するプログ ラミング方法 3 具体例 記号微分プログラム (さっそく、作ってみよう!) 4 微分の知識(例えば…) d d k 0, n 0 dx dx d d x 1, kx k 等 dx dx 5 微分の知識 d k 0 dx d(K,X,0). 6 微分の知識 d n0 dx d x 1 dx d(N,X,0). d(X,X,1). 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 d d U ( x) V ( x) U ( x) V ( x) dx dx 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
© Copyright 2024 ExpyDoc