530 likes | 958 Views
Prolog 入門. ー IT 中級者用ー. Prolog とは. PRO gramming in LOG ic 人工知能用プログラミング言語 手続き型プログラミング 宣言型プログラミング 関数型プログラミング オブジェクト指向型プログラミング etc. Programming in logic 論理の言葉でプログラムを記述するプログラミング方法. 具体例. 記号微分プログラム (さっそく、作ってみよう!). 微分の知識(例えば … ). 微分の知識. d(K,X,0). 微分の知識. d(N,X,0). d(X,X,1). プログラムのソース全容.
E N D
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). • d(T,X,0) :- atom(T) ; number(T).
プログラム(2/4) • 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).
プログラム(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(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のデータタイプ • 定数 • 文字定数:abc, aDog2 (小文字で始まる) 名詞(2バイト文字で始まる) • 数定数:3.14, 2007 • 変数:Hensuu, Noun(大文字で始まる)_aDog2, _名詞(_で始まる) • 述語:p(X), is_a_dog(Animal) • リスト:[1,2,3], [好き,太郎,カレー], [ ]
定数 • 文字定数(atom): • 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のデータタイプ(確認) • 定数 • 文字定数: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の理解なし!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の導入・紹介 • 述語論理式と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). ___________________ Thereforemortal(socrates). • ソクラテスは人間である。 • 人間は死ぬ。 • ___________ • 従って、ソクラテスは死ぬ。
動作例 ソースコード 動作画面 ?- mortal(Z). Z = socrates. mortal(X):-human(X). human(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.