1 / 32

Prolog tutorial (1)

Prolog tutorial (1). 白井英俊(情報理工学部). 人工知能研究からみた Prolog. 人工知能: 人間のように知的なふるまいをする計算機(プログラム)を作る 人間の「知的なふるまい」の例   世界についての知識を持つ   推論をする   言葉でコミュニケーションする. 人工知能研究からみた Prolog(2). 世界についての知識を持つ いろいろな事実を記憶する データベース 推論をする 推論手続き をもつ 言葉でコミュニケーションする 一階述語論理 に基づく言語仕様   組み込まれた 構文解析器 によって言葉の処理が可能.

irisa
Download Presentation

Prolog tutorial (1)

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Prolog tutorial (1) 白井英俊(情報理工学部)

  2. 人工知能研究からみたProlog • 人工知能: 人間のように知的なふるまいをする計算機(プログラム)を作る • 人間の「知的なふるまい」の例   世界についての知識を持つ   推論をする   言葉でコミュニケーションする

  3. 人工知能研究からみたProlog(2) • 世界についての知識を持つ いろいろな事実を記憶するデータベース • 推論をする 推論手続きをもつ • 言葉でコミュニケーションする 一階述語論理に基づく言語仕様   組み込まれた構文解析器によって言葉の処理が可能

  4. Prologのデータベース • Prologは内部にデータベースを持つ • Prologの「プログラム」はそのデータベースに書き込まれ、  「プログラムの実行」はそのデータベースへの問い合わせ、という形で行われる

  5. Prologの「プログラム」の基本形 • Prologの「プログラム」の基本形は二通り • 世の中にこういう事実がある 例: person(fred). % fredはperson(人)である • このような規則が世界で成り立っている  例: fly(X) :- bird(X). % どの鳥(bird)も飛ぶ(fly) % もしくは、何かが飛ぶかどうか知りたければ % それが鳥かどうか調べてみよ

  6. Prologの「言葉」 • Prologは英語に近い「ホーン節論理」(一階述語論理の一種)が元になっている • ほとんどの「文」は次の形 (1) 単文 …「事実」を表現 述語(項1, …, 項n) . 例:person(fred). ( 5 is 3+2 のような算術式もこの仲間) (2) 複文…「規則」を表現 (後述) ピリオド!

  7. 日本語からPrologの言葉へ 日本語:「フレッド(fred)が人間(person)だ 。」 「項」と呼ばれる部分  「誰が」「何を」  「どこから」「どこへ」 などの情報を与える 注意: 「が」「を」「から」の 情報は、項の順番 で決まる 「述語」と呼ばれる部分 名詞+「だ」  動詞 (例:歩く)  形容詞 (例:太い)  形容動詞 (例:静かだ) など

  8. 日本語からPrologの言葉へ(2) 日本語:「フレッド(fred)が人間(person)だ 。」 項 述語 英語:    Fred is a person ピリオド! Prolog: person(fred).

  9. 日本語からPrologの言葉へ(3) 二つ以上の「項」を持つ場合 (1) Taro が Hanako を 愛している(love) 。 項1 項2 述語 注意:Prologは項や述語は必ず小文字から始める Prolog: love(taro, hanako). Taro loves Hanako

  10. 日本語からPrologの言葉へ(4) 二つ以上の「項」を持つ場合 (2) Rikaが Hanakoの娘だ(daughter) 。 項1 項2 述語 Prolog: daughter(rika, hanako). Rika is Hanko’s daughter

  11. 練習問題(1):Prologから日本語へ 注意:UNIX版のSicstus prolog では「日本語の文字列」を 述語や項に使える • 訳してみよう • cat(mike). • dog(pochi). • bird(swallow). • male(fred). • female(mary). • father(波平, カツオ). • 母親(サザエ, タラ). • 8.祖父(波平, タラ).

  12. 知識をデータベースに登録 • Prologの「プログラム」をファイルに書く(仮にhoge.plとする) • Sicstus Prologを立ち上げる Windows: sicstusアイコンをクリック Unix:sicstus • 「プログラム」をデータベースに登録 Windowsの場合は、File ⇒ consultメニュー Unixの場合は consult(‘hoge.pl’).

  13. 練習(2):実行してみよう • 以下の「文」をファイルに入れる person(fred). person(tom). person(robert). father(fred, tom). father(tom, robert). bird(heron). bird(swallow). • Sicstusを起動し、Prologのデータベースに入れよう

  14. データベースに入れて… • ちゃんとPrologのデータベースに入っただろうか? • え、ちゃんと入ったかどうかわからない? • データベースのデータベースたる所以は、そこに何が入っているかを(効率的に)調べられるところ

  15. データベースへの問い合わせ • Prologのデータベースにデータが入っているかどうかは、次のようにして調べられる。 ?-  というプロンプトが出ていることを確認して ?-person(fred). データベースにあれば yes、 なければ noが返る

  16. データベースへの問い合わせ(2) ?-person(fred). というのは、「fredがpersonだ」という事実があるかどうかを調べること。 …「誰がpersonか」を調べられると便利。 それには、「変数」を使う。 Prologの「変数」は英大文字から始める  例: X Who Where Dare Nani KORE

  17. データベースへの問い合わせ(3) Prologのデータベースに以下の事実が登録されているとする: person(fred). person(tom). person(robert). ここで、 ?-person(X). 「誰がpersonか?」という質問となる 「fredがpersonだ」という答え の結果は:X = fred ? まだ他の候補がある可能性 を示す

  18. データベースへの問い合わせ(4) Prologのデータベースに以下の事実をこの順に登録したとする: person(fred). person(tom). person(robert). そこで、?-person(X). とすると、 これは「別なものを見つけろ」という指示 ; X = fred ? ; X = tom ? ; X = robert ? no 質問: どういう順番でPrologは事実をみつけているだろうか?

  19. Prologのデータベースの特徴 • 事実は「登録された」順番に「見つけられる」   「見つけられる」=「検索される」 (2) データベースに登録されていないなら、「そういう事実はない(否定)」として扱われる 例:先のデータベースに対しperson(mary). を検索すると noが返る  ⇒「何々でない」型の事実は登録しない (3) 検索において述語は必ず指定すること  「fredは何か?」(Prolog流に書けば What(fred)となる)というような『述語質問』はできない

  20. Prologのデータベース(おまけ) • 「「fredは何か?」というような『述語質問』はできない」と書いたが、 データベースに登録されているものをすべて表示せよ  と命令することはできる ?-listing.

  21. 復習問題(3) • 「Fred は John の兄弟(sibling)だ」をProlog文に直せ。 • 「MaryはTomの兄弟(sibling)だ」をProlog文に直せ。 • 上の二つをこの順でPrologのデータベースに登録した。この時、sibling(X,Y). を検索すると何が返されるか? • (3と同じ状態で) sibling(X,X). を検索するとその答えは何か?またどうしてそうなるのか? • (3と同じ状態で) sibling(X,mary). を検索するとその答えは何か?またどうしてそうなるのか?

  22. 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を求めよ」

  23. 導入問題(4) Prologのデータベースに以下の事実をこの順に登録したとする: (parent:親) parent(fred,tom). parent(tom,john). parent(mary,tom). parent(john,beth). • 誰が誰の孫か調べるにはどうするか? • 「同じ子供をもつ二人は夫婦(couple)である」とすると、夫婦を見つけるにはどうするか?

  24. 「同じ人・物でない」という条件 • 「同じ子供をもつ二人は夫婦(couple)であるとすると、夫婦を見つける」問題にはちょっと手こずったはず。 Fred は一人で夫婦にはなれない! • 必要なものは「同じ人・物でない」ことを調べる方法。それには、\= を使う  使い方の例:A \= B …AとBは違うもの これを用いて「夫婦問題」をやり直してみよう

  25. Prologの複文:「規則」の表現 • 連言質問や選言質問も「複文」の一種 • ここではもっと本格的な複文、つまり「規則」を表す方法を紹介 (例1) 「Bは、Aの親(parent)の親である」ならば、 「AがBの孫(grandChild)である」という規則: grandChild(A,B) :- parent(B,C), parent(C,A). 本体(body) 頭部(head) 頭部(head) 本体(body) :- 「を示すには」 .

  26. 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)

  27. 「規則」の練習 「同じ子供をもつ二人は夫婦(couple)だ」という規則をPrologで表そう 規則の形に言い換える… 頭部:「AがBと夫婦(couple)だ」 本体:「Aが誰か(Cとする)の親」で「Bも同じ誰か(C)の親」、かつ「AはBとは別物」 したがって… couple(A,B) :- parent(A,C), parent(B,C), A \= B.

  28. 規則の練習における注意 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).

  29. 規則を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. をデータベースに入れれば、「誰が誰の親か」だけではなく、「誰が誰と夫婦か」も分かるようになる---推論を行っている! ぜひ試してみよう! 何か予想外のことは起きなかっただろうか?

  30. 規則を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規則が見つかり、その本体に書かれた「連言質問」が試される

  31. 練習問題(5) 「誰が誰の親(parent)か」、「誰が男性(male)」、「誰が女性(female)」という3種類のデータがPrologのデータベースに沢山書き込まれているとする(他の情報はないとする) • 「誰が誰の息子(son)」規則を書く • 「誰が誰の夫(husband)か」規則を書く • 「誰が誰の妻(wife)か」規則を書く • 「誰が誰の孫(grandson)か」規則を書く • 他にどのような規則が書けるだろうか?

  32. 規則の書き方についての注意 • 「AがBの夫(husband)」ならば、明らかに「BはAの妻(wife)」が成り立つ • だからと言って、Prologのデータベースに次のように書いてはいけない husband(A,B) :- wife(B,A). wife(B,A) :- husband(A,B). Prologでどのように事実や規則を検索するかを思い出そう

More Related