330 likes | 493 Views
Prolog tutorial (1). 白井英俊(情報理工学部). 人工知能研究からみた Prolog. 人工知能: 人間のように知的なふるまいをする計算機(プログラム)を作る 人間の「知的なふるまい」の例 世界についての知識を持つ 推論をする 言葉でコミュニケーションする. 人工知能研究からみた Prolog(2). 世界についての知識を持つ いろいろな事実を記憶する データベース 推論をする 推論手続き をもつ 言葉でコミュニケーションする 一階述語論理 に基づく言語仕様 組み込まれた 構文解析器 によって言葉の処理が可能.
E N D
Prolog tutorial (1) 白井英俊(情報理工学部)
人工知能研究からみたProlog • 人工知能: 人間のように知的なふるまいをする計算機(プログラム)を作る • 人間の「知的なふるまい」の例 世界についての知識を持つ 推論をする 言葉でコミュニケーションする
人工知能研究からみたProlog(2) • 世界についての知識を持つ いろいろな事実を記憶するデータベース • 推論をする 推論手続きをもつ • 言葉でコミュニケーションする 一階述語論理に基づく言語仕様 組み込まれた構文解析器によって言葉の処理が可能
Prologのデータベース • Prologは内部にデータベースを持つ • Prologの「プログラム」はそのデータベースに書き込まれ、 「プログラムの実行」はそのデータベースへの問い合わせ、という形で行われる
Prologの「プログラム」の基本形 • Prologの「プログラム」の基本形は二通り • 世の中にこういう事実がある 例: person(fred). % fredはperson(人)である • このような規則が世界で成り立っている 例: fly(X) :- bird(X). % どの鳥(bird)も飛ぶ(fly) % もしくは、何かが飛ぶかどうか知りたければ % それが鳥かどうか調べてみよ
Prologの「言葉」 • Prologは英語に近い「ホーン節論理」(一階述語論理の一種)が元になっている • ほとんどの「文」は次の形 (1) 単文 …「事実」を表現 述語(項1, …, 項n) . 例:person(fred). ( 5 is 3+2 のような算術式もこの仲間) (2) 複文…「規則」を表現 (後述) ピリオド!
日本語からPrologの言葉へ 日本語:「フレッド(fred)が人間(person)だ 。」 「項」と呼ばれる部分 「誰が」「何を」 「どこから」「どこへ」 などの情報を与える 注意: 「が」「を」「から」の 情報は、項の順番 で決まる 「述語」と呼ばれる部分 名詞+「だ」 動詞 (例:歩く) 形容詞 (例:太い) 形容動詞 (例:静かだ) など
日本語からPrologの言葉へ(2) 日本語:「フレッド(fred)が人間(person)だ 。」 項 述語 英語: Fred is a person ピリオド! Prolog: person(fred).
日本語からPrologの言葉へ(3) 二つ以上の「項」を持つ場合 (1) Taro が Hanako を 愛している(love) 。 項1 項2 述語 注意:Prologは項や述語は必ず小文字から始める Prolog: love(taro, hanako). Taro loves Hanako
日本語からPrologの言葉へ(4) 二つ以上の「項」を持つ場合 (2) Rikaが Hanakoの娘だ(daughter) 。 項1 項2 述語 Prolog: daughter(rika, hanako). Rika is Hanko’s daughter
練習問題(1):Prologから日本語へ 注意:UNIX版のSicstus prolog では「日本語の文字列」を 述語や項に使える • 訳してみよう • cat(mike). • dog(pochi). • bird(swallow). • male(fred). • female(mary). • father(波平, カツオ). • 母親(サザエ, タラ). • 8.祖父(波平, タラ).
知識をデータベースに登録 • Prologの「プログラム」をファイルに書く(仮にhoge.plとする) • Sicstus Prologを立ち上げる Windows: sicstusアイコンをクリック Unix:sicstus • 「プログラム」をデータベースに登録 Windowsの場合は、File ⇒ consultメニュー Unixの場合は consult(‘hoge.pl’).
練習(2):実行してみよう • 以下の「文」をファイルに入れる person(fred). person(tom). person(robert). father(fred, tom). father(tom, robert). bird(heron). bird(swallow). • Sicstusを起動し、Prologのデータベースに入れよう
データベースに入れて… • ちゃんとPrologのデータベースに入っただろうか? • え、ちゃんと入ったかどうかわからない? • データベースのデータベースたる所以は、そこに何が入っているかを(効率的に)調べられるところ
データベースへの問い合わせ • Prologのデータベースにデータが入っているかどうかは、次のようにして調べられる。 ?- というプロンプトが出ていることを確認して ?-person(fred). データベースにあれば yes、 なければ noが返る
データベースへの問い合わせ(2) ?-person(fred). というのは、「fredがpersonだ」という事実があるかどうかを調べること。 …「誰がpersonか」を調べられると便利。 それには、「変数」を使う。 Prologの「変数」は英大文字から始める 例: X Who Where Dare Nani KORE
データベースへの問い合わせ(3) Prologのデータベースに以下の事実が登録されているとする: person(fred). person(tom). person(robert). ここで、 ?-person(X). 「誰がpersonか?」という質問となる 「fredがpersonだ」という答え の結果は:X = fred ? まだ他の候補がある可能性 を示す
データベースへの問い合わせ(4) Prologのデータベースに以下の事実をこの順に登録したとする: person(fred). person(tom). person(robert). そこで、?-person(X). とすると、 これは「別なものを見つけろ」という指示 ; X = fred ? ; X = tom ? ; X = robert ? no 質問: どういう順番でPrologは事実をみつけているだろうか?
Prologのデータベースの特徴 • 事実は「登録された」順番に「見つけられる」 「見つけられる」=「検索される」 (2) データベースに登録されていないなら、「そういう事実はない(否定)」として扱われる 例:先のデータベースに対しperson(mary). を検索すると noが返る ⇒「何々でない」型の事実は登録しない (3) 検索において述語は必ず指定すること 「fredは何か?」(Prolog流に書けば What(fred)となる)というような『述語質問』はできない
Prologのデータベース(おまけ) • 「「fredは何か?」というような『述語質問』はできない」と書いたが、 データベースに登録されているものをすべて表示せよ と命令することはできる ?-listing.
復習問題(3) • 「Fred は John の兄弟(sibling)だ」をProlog文に直せ。 • 「MaryはTomの兄弟(sibling)だ」をProlog文に直せ。 • 上の二つをこの順でPrologのデータベースに登録した。この時、sibling(X,Y). を検索すると何が返されるか? • (3と同じ状態で) sibling(X,X). を検索するとその答えは何か?またどうしてそうなるのか? • (3と同じ状態で) sibling(X,mary). を検索するとその答えは何か?またどうしてそうなるのか?
Prologデータベースの検索 Prologのデータベースに以下の事実をこの順に登録したとする: (parent:親) parent(fred,tom). parent(tom,john). parent(mary,tom). parent(john,beth). • 連言質問: ?- parent(fred,A), parent(A,B). • 選言質問: ?- parent(fred,A); parent(B,fred). 「二つの文が「両方とも」成り立つようなAとBを求めよ」 「二つの文のうち「どちらかでも」成り立つようなA、Bを求めよ」
導入問題(4) Prologのデータベースに以下の事実をこの順に登録したとする: (parent:親) parent(fred,tom). parent(tom,john). parent(mary,tom). parent(john,beth). • 誰が誰の孫か調べるにはどうするか? • 「同じ子供をもつ二人は夫婦(couple)である」とすると、夫婦を見つけるにはどうするか?
「同じ人・物でない」という条件 • 「同じ子供をもつ二人は夫婦(couple)であるとすると、夫婦を見つける」問題にはちょっと手こずったはず。 Fred は一人で夫婦にはなれない! • 必要なものは「同じ人・物でない」ことを調べる方法。それには、\= を使う 使い方の例:A \= B …AとBは違うもの これを用いて「夫婦問題」をやり直してみよう
Prologの複文:「規則」の表現 • 連言質問や選言質問も「複文」の一種 • ここではもっと本格的な複文、つまり「規則」を表す方法を紹介 (例1) 「Bは、Aの親(parent)の親である」ならば、 「AがBの孫(grandChild)である」という規則: grandChild(A,B) :- parent(B,C), parent(C,A). 本体(body) 頭部(head) 頭部(head) 本体(body) :- 「を示すには」 .
Prologの複文:「規則」の表現 本体(body) (例1) 「Bは、Aの親(parent)の親である」ならば、 「AがBの孫(grandChild)である」という規則: grandChild(A,B) :- parent(B,C), parent(C,A). 頭部(head) 数理論理学を学んだ人に対しては 本体の条件(の連言) → 頭部 となっている、と言ったほうが分かりやすいだろう。 この例では parent(B,C)∧parent(C,A) → grandChild(A,B)
「規則」の練習 「同じ子供をもつ二人は夫婦(couple)だ」という規則をPrologで表そう 規則の形に言い換える… 頭部:「AがBと夫婦(couple)だ」 本体:「Aが誰か(Cとする)の親」で「Bも同じ誰か(C)の親」、かつ「AはBとは別物」 したがって… couple(A,B) :- parent(A,C), parent(B,C), A \= B.
規則の練習における注意 couple(A,B) :- parent(A,C), parent(B,C), A \= B. は次のようには書けない。なぜだろうか? couple(A,B) :- parent(A,C), A \= B, parent(B,C). または couple(A,B) :- A \= B, parent(A,C), parent(B,C).
規則をPrologのデータベースで使う 事実と規則型のProlog文をPrologのデータベースに入れておくと、「検索」の能力があがる。 parent(fred,tom). parent(tom,john). parent(mary,tom). parent(john,beth). couple(A,B) :- parent(A,C), parent(B,C), A \= B. をデータベースに入れれば、「誰が誰の親か」だけではなく、「誰が誰と夫婦か」も分かるようになる---推論を行っている! ぜひ試してみよう! 何か予想外のことは起きなかっただろうか?
規則をPrologのデータベースで使う(続き) parent(fred,tom). parent(tom,john). parent(mary,tom). parent(john,beth). couple(A,B) :- parent(A,C), parent(B,C), A \= B. がデータベースにあるとする。 ?- couple(fred,A). により、couple規則が見つかり、その本体に書かれた「連言質問」が試される
練習問題(5) 「誰が誰の親(parent)か」、「誰が男性(male)」、「誰が女性(female)」という3種類のデータがPrologのデータベースに沢山書き込まれているとする(他の情報はないとする) • 「誰が誰の息子(son)」規則を書く • 「誰が誰の夫(husband)か」規則を書く • 「誰が誰の妻(wife)か」規則を書く • 「誰が誰の孫(grandson)か」規則を書く • 他にどのような規則が書けるだろうか?
規則の書き方についての注意 • 「AがBの夫(husband)」ならば、明らかに「BはAの妻(wife)」が成り立つ • だからと言って、Prologのデータベースに次のように書いてはいけない husband(A,B) :- wife(B,A). wife(B,A) :- husband(A,B). Prologでどのように事実や規則を検索するかを思い出そう