Ryo Hatano JAIST April 9, 2012s1220010/Prolog_1.pdf · 2 OHの目的 •Prologに慣れる –...

48
人工知能特論 - Prolog 演習 1- Ryo Hatano JAIST April 9, 2012

Transcript of Ryo Hatano JAIST April 9, 2012s1220010/Prolog_1.pdf · 2 OHの目的 •Prologに慣れる –...

人工知能特論- Prolog 演習 1-

Ryo HatanoJAIST

April 9, 2012

1

OHについて

• 月曜 3限 (4/9, 16, 23 全2回?)• レポートあり

• TAは情報1棟7F, 東条研にいる

– 秦野 亮 (D1)– [email protected]– 質問等はメールでも可

• 資料など

– https://www.jaist.ac.jp/~s1220010/– JAIST HP > 情報科学研究科 > 学内情報 > 講義関連情

報 > i215

かもしれない

学内からしかアクセスできないので注意!

2

OHの目的

• Prologに慣れる

– 論理学と論理プログラミングの関係を理解

– 基本的なPrologの取り扱いを学ぶ

• Prologを自分で勉強できるようになる

– OHでは導入部分 だけ

3

参考文献

• I. Bratko, Prologへの入門

• 古川康一 他, 帰納論理プログラミング

• S. Russell 他, エージェントアプローチ人工知能

• Bruce A. Tate, 7つの言語 7つの世界

• 東条 敏, 言語・知識・信念の論理

• Shapiro 他, The Art of Prolog• P. Blackburn 他, Learn Prolog Now!

他, JAISTの図書館やGoogleで「Prolog」と調べればイロイロある

(わかりやすい)

(短くまとまっている)

(8章が背景に詳しい)

(用語や定義をサッと引くときに)

4

目次

1. OHについて

2. Prologとは

3. 必要な論理学の知識

4. 使い方

5. 構文規則

6. Prologの動作

5

Prolog

• PROgrammation en LOGique– 述語論理に基づくプログラミング言語

– 論理的な処理, 知識表現が得意

• 対象間の関係性を扱う問題解決に特に適している

• (どちらかといえば)非数値処理向け

6

歴史

• 1972年, Prolog 誕生

– A. Colmerauer, P. Roussel– 当初は英仏翻訳システムの構文解析器として開発

• 1974年, 意味論の研究

– R. Kowalski , M. Van Emden– 論理学とProlog を厳密に関係づけた(形式化)

• 1975年, WAM (Warren抽象機械) の導入

– D.H.D. Warren – 実用的な速度で実行可能になる

– この仕組みは後のSICStusProlog 等に継承

7

言語として

• ホスト言語– 埋め込み言語を含む事ができる言語

• Progol (Prologの帰納論理拡張), • PRISM (Prologの確率拡張) etc…

• 位置づけ

Fortran(1958)ALGOL(1958)

ML(1974)Lisp(1958)

Haskell(1990)

C(1972)

Prolog(1972) Strand(1989) Earlang(1986)

C++(1983) Java(1995)Scala(2003)Clojure(2007)

(大雑把注意)

関数型言語

論理型言語 ハイブリッド

オブジェクト指向型言語手続き型言語

影響を与えたホスト言語

(下記参照)

(ベースとなる実装の実現言語)

8

目次

1. OHについて

2. Prologとは

3. 必要な論理学の知識

4. 使い方

5. 構文規則

6. Prologの実行過程

9

命題 (Proposition)

• それだけで物事の真偽を決定できる文

• 命題に割り当てた真偽値を付値 (assignment)という

JAISTは石川県にある. (付値は真)JAISTの教職員は皆 猟銃免許を持っている. (付値は偽)

命題の例

10

原子論理式 (Atomic formula)

• 文を「項」と「述語」の二つに分解し, その組み合わせ毎に真

偽を決定できる式表現

• 対象の性質や, 関係を表現する

• 項に「対象」や「関数」をとる

関係: 「JAISTは石川県にある」 → locate(JAIST, 石川)性質: 「草庵の蕎麦はうまい」→ delicious(蕎麦, 草庵)

原子論理式の例

Prolog では, 命題や(一階述語論理の) 原子論理式を知識表現として扱う.

原子論理式の記法

述語記号(項1, 項2, …)

11

Modus Ponens (MP)

Aが成り立ち, かつAならばBが成り立つとき,同時にBが成り立つ.

BBAA →

推論規則

ソクラテスは人間である. man(socrates)人間は死ぬ. ∀x [man(x) → mortal(x)]従ってソクラテスも死ぬ. mortal(sorcates)(三段論法)

Prolog では,MPに関わる処理を環境側が受け持つ.

12

目次

1. OHについて

2. Prologとは

3. 必要な論理学の知識

4. 使い方

5. 構文規則

6. Prologの実行過程

13

環境について

• 処理系– SICStus Prolog – SWI Prolog– GNU Prolog

• 開発環境– Emacs のPrologモード

– Eclipse のPDT– テキストエディタ + Prolog シェル

有料, 性能が良い, しかし使いづらい

フリー, 使いやすい, おすすめ

組込みのライブラリが異なる場合があるので注意

14

起動・実行・終了などの使用方法

• 起動– %prolog [-l] [filename]

• 終了– halt. [return]– Ctrl + d

• 実行中の停止– Ctrl + c で割り込み出来るので, そのときに「a」と入力

• ファイルのロード– chdir(‘dir_path’). でディレクトリを移動

– consult[‘file_name’]. 又は [‘file_name’]. で読み込み

• ファイルのリロード– make. – 編集したファイルを読み込みなおす

(-l 起動時にファイルを読むオプション)

(‘c:¥¥test’ など)

15

起動・実行・終了などの使用方法 (2)

• インタプリタの利用– 対話的にプログラムを作成したり, 制御が出来る

– 通常, プログラムを読み込んだ後, 「?-」以降に

質問文を入力して使用する

• 例

?- [test.pl].% test.pl compiled 0.00 sec, 1,004 bytes?- hoge(huga).true.

?- hoge(X).X = huga;X = piyo

?- halt.

←プログラムの読み込み(略記法)

←質問文の入力

←別解が存在する場合, 「;」で次の解を探索

←読み込むと同時にコンパイルされる

16

日本語の取り扱い

• SWI-Prologの場合

– プログラムの保存設定• 文字コード: UTF-8• 改行コード: CR-LF

– 実行環境の設定• Setting > font でフォントを日本語フォントに変更

• 文字セットを日本語にする

?- 中間試験(X).X = ‘5月2日’.

中間試験(“5月2日”).

プログラム例

実行結果例

17

デバッグ

• spy(X) : 述語Xにスパイポイントを設置し, デバッグモードに入る

• nospy(X) : 述語Xのスパイポイントを取り除く

• debug : デバッグモードに入る

• nodebug : デバッグモードから抜ける

• trace : 全ての述語の動作ステップを表示する

• notrace : トレースから抜ける (他, 細かい制御はヘルプを参照)

• spy/nospy は述語名のリストを与えることで, 同時に複数のスパイポイン

トの設定ができる

• スパイポイントはnospy で取り除くかPrologを終了するまで消えない

• 変数は “数字” で表示される. 異なる変数は数字が違う.

(デバッグモードを抜けただけでは消えない)

?- foo(X).Call: (22) foo(_G2150) ? creepExit: (22) foo(bar) ? creep

X = bar .

←数字のところ(_G2150)が変数X

18

目次

1. OHについて

2. Prologとは

3. 必要な論理学の知識

4. 使い方

5. 構文規則 (本日のメイン)6. 論理的側面

7. Prologの実行過程

19

Prolog構文の構成要素

(以降, 見慣れないものがあっても, だいたいこの中のどれかに当てはまる)

• 算術, 比較, 代入, ユーザー定義• 単一化, バックトラック制御• コメント

演算子

+

頭部 :- 本体.

述語(項, 項, …, 項)

変数 定数 関数

データ構造

20

コメント

• 一行コメント– 「%」から行末まで

• 複数行コメント– 「/*」から「*/」まで

• 例

ソースコードにはコメントを書いて可読性をあげる.これはソフトウェア工学上大切なこと.

/* 複数行コメント*/foo(bar) %行末までコメント

21

Prologプログラムの構成要素

(以降, 見慣れないものがあっても, だいたいこの中のどれかに当てはまる)

• 算術, 比較, 代入, ユーザー定義• 単一化, バックトラック制御• コメント

演算子

+

データ構造

頭部 :- 本体.

述語(項, 項, …, 項)

変数 定数 関数

22

• Prologのプログラムは節(Horn clause)の集合により構成– ホーン節とは帰結が0または1つの正リテラルからなる節

• Prologには3種類の節がある– 事実節(Facts), 規則節(Rules), ゴール節(Query)

節 (Clauses)

(プログラム中の記法はProlog 用に変更されている)

→∧…∧∧→

→∧…∧∧

m

n

AAAC

BAAA

21

21

述語論理の例

プログラム節

23

プログラム例

• Prologでの節の表記

頭部 :- 本体.

% 全てホーン節!vegetable(carrot).fruit(apple).vegetable(tomato). fruit(tomato).

plant(X) :- vegetable(X).plant(X) :- fruit(X).plant(X) :- fruit(X), vegetable(X).

?- plant(X).

プログラム

インタープリタ

← ゴール節(質問)

規則節

事実節

述語論理の「ならば」(→, 含意) に相当, ただし向きは逆 (本体→頭部).

各節の終わりにはピリオドを置く.

24

事実節

vegetable(carrot). %にんじんは野菜であるfruit(apple). %りんごは果物であるvegetable(tomato). fruit(tomato). %トマトは野菜であり果物である.

Prolog プログラム例

(述語などについては後で解説)

• 事実(fact)を表す節– 本体(前提, Body)が空(true)の節 ⇔ 頭部(帰結, Head)のみ

– 無条件で常に真となる述語や定数などを含む

C→

対応する述語論理の形式

述語だけでなく日本語の定数などもok.

25

規則節

plant(X) :- vegetable(X).plant(X) :- fruit(X).plant(X) :- vegetable(X), fruit(X).

Prolog プログラム例

対応する述語論理の形式

BAAA n →∧…∧

• 規則(rule)を表す節– 頭部 と空でない本体 を持つ節

– 「ならば(含意)」と同じで, Modus Ponens を提供する

– 本体 の内容に依存して真/偽が決まる

∧ 21

カンマで複数の要素を与えた場合, 「and 条件」となるセミコロンの場合「or 条件」となる

事実と規則の節は, 表記が同じ頭部が複数ある場合, 「or 条件」となる

大事なのは 「.」, 「,」, 「:-」

26

ゴール節

?- vegetable(carrot).true.

インタープリタ例 (Yes/No型の質問)

←事実の成否を問う質問←システムはYes/No いずれかの応答をする

対応する述語論理の形式

インタープリタ例 (What型の質問)

→∧…∧

• システムに対する質問(query)を表す節– 本体だけ を持つ節

– ひとつ以上の目標(goals) からなる

– 2種類の質問型がある• Yes/No 型の質問, What 型の質問

∧ mAAA 21

Prologはこの矢印の先を, 事実と規則

に基づいて探し出してくる!

?- vegetable(X).X = carrot.

←変数(後述)を含む質問

←システムはその変数に当てはまる内容を応答する.(見つからなければエラー)

27

Prologプログラムの構成要素

(以降, 見慣れないものがあっても, だいたいこの中のどれかに当てはまる)

• 算術, 比較, 代入, ユーザー定義• 単一化, バックトラック制御• コメント

演算子

+

頭部 :- 本体.

述語(項, 項, …, 項)

変数 定数 関数

データ構造

28

データ構造

• Prologの全てのデータオブジェクトは項(Term)• 項は大きく分けて3種類

– 定数

– 変数

– 関数 (複数の成分を持つ構造データ)

29

定数 (Atoms)

• 定数は3種類

– 英小文字又で始まる文字列または数字

– 特殊文字の系列 +, -, *, /, <, >, =, :, ., &, _, ~– 引用符で囲んだ文字列

←日本語の定数は環境依存の例外

carrot.miss_mary.1234.======>.‘Mr. Tom’.日本語の定数.

←大文字で始まる定数が欲しい時使う

←「:-」など既に意味を持っているものもあるので注意

定数の例

true, end_of_file のような環境ごとに定義されている特別な定数もある

30

変数 (Variables)

• 変数は2種類

– 英大文字又はアンダースコアで始まる, 通常の変数

– アンダースコアのみの無名変数• 節に一度しか出現しない変数に, 便宜上の名前を割り当てるもの

• 出現するたびに異なる値が割り振られる

• 質問中の無名変数は, 解答の際に無視される

←無名変数は, 評価にその変数を用いたくないときに使う

XResult_Arg1hoge( _ , X):- 略.

変数を評価したときに実際にメモリが割り当てられる

変数の例

31

関数 (function)

• 複数の成分を持つ構造データ– 関数子(項1, 項2, …)– 関数子(functor)は定数と同じ命名規則

– 項の数(引数の数)をアリティ(arity)という

– 関数は, 他の「項」を参照するだけで真偽値が決まらない

fruit(apple).plant(eatable(X)):- fruit(X).

関数の例

関数子 項

←関数と述語はまったく別物なので要注意

(複合項(Compound term)ともいう)

述語

インタープリタ

?- plant(Func).Func = eatable(apple). ←他の項を参照している.

eatable(apple)が真という値を返しているわけではない

32

関数 (function) 続き

• 構造データは木(tree)とみなすことができる

– 同じデータかどうかは, 木の構造と対応する成分が同じ

かどうかで決まる

木構造 father(parent(X, Y), male(X)) の例

father

parent male

X Y X

木の根(Root) を特に主関数子(Principal functor) という

マッチング(後述)の結果次第

33

述語 (predicate)

• 対象(項)間の関係を表す構造データ

– 述語記号(項1, 項2, …)– 述語記号(predicate symbol)は定数と同じ命名規則

– 述語記号と項で原子論理式を構成し, 真偽が決まる

fruit(carrot).plant(X):- fruit(X).father(X):- parent(X, Y), male(X).

述語の例

←変数, 定数を引数に持つことができる

述語記号 項

34

述語 (predicate) 続き

• 同じ述語かどうかは, 述語記号とアリティで識別される

– 述語記号/アリティという省略記法で識別

plant(X) :- vegetable(X).plant(Y) :- vegetable(Y), fruit(Y).

本体や変数名は異なるが, どちらも plant/1 で同じ述語扱い

述語の同一性と, 関数の木の同一性は

別問題なので注意!

35

Prologプログラムの構成要素

(以降, 見慣れないものがあっても, だいたいこの中のどれかに当てはまる)

• 算術, 比較, 代入, ユーザー定義(次回)• 単一化, バックトラック制御(次回)• コメント

演算子

+

頭部 :- 本体.

述語(項, 項, …, 項)

変数 定数 関数

データ構造

36

算術演算子(Arithmetic operator)

• X + Y 加算

• X - Y 減算

• X * Y 乗算

• X / Y 除算

• X // Y 整数除算の商

• X mod Y 整数除算の余り

• X is Y X に Y を代入 (Yは具体化されている必要あり)

?- Result is 2 + 3.Result = 5.

?- Result = 2 + 3.Result = 2 + 3

数式例

←「=」では算術演算が実行されないので注意

←正しい算術演算 + 代入の例

基本的に中置記法 (記法の詳細については次回)

37

比較演算子

• X > Y X は Y より大きい

• X < Y X は Y より小さい

• X >= Y X は Y 以上

• X =< Y X は Y 以下

• X =:= Y (算術式) X と Y の値は等しい

• X =¥= Y (算術式) X と Y の値は等しくない

• X == Y X と Y の項が等しい

• X ¥== Y X と Y の項が等しくない

38

比較演算子 (続き)

• 算術演算子との関係– 代入, 比較演算子は式の左辺, 右辺の計算手続きを実行させる

– この手続きを, オペレータに関連した組み込み手続き(built-in procedure) という

• == と ¥== は計算を行わない

?- 1 + 2 == 2 + 1.false.

?- 1 + 2 == 1 + 2.true.

?- date(_Day, _Month, 2012) == date(9, april, _Year).false.

?- date(9, april, 2012) == date(9, april, 2012).true.

項の比較例

←計算されない

←変数の具体化(後述)もされない

39

単一化 (Unification)

• X = Y X と Y のマッチングを行い, マッチすれば真

• マッチング(matching)– 二つの項が与えられたとき, それらを同一化する代入の

発見を試みる

– 変数がある場合, 具体化(束縛, bind)した際に二つの項が等価となる場合, 同一(マッチ) となる

Prolog のマッチングは, 述語論理の単一化の近似(読みかえOK)

?-date(_Day, _Month, 2012) = date(9, april, _Year)._Day = 9_Month = april_Year = 2012

マッチング例

←成功すると, 最も一般的な変数の具体化を返す

40

目次

1. OHについて

2. Prologとは

3. 必要な論理学の知識

4. 使い方

5. 構文規則

6. Prologの動作

41

深さ優先後向き探索

%事実の定義fruit(apple).fruit(tomato). vegetable(tomato).

%規則の定義plant(X) :- fruit(X).plant(X) :- vegetable(X).

ソースコード インタープリタ

?- trace.true.

?- plant(X).Call: (6) plant(_G466) ? creepCall: (7) fruit(_G466) ? creepExit: (7) fruit(apple) ? creepExit: (6) plant(apple) ? creep

X = apple

plant

fruit vegetable質問 (ゴール節) から, 定義されている

事実まで深さ優先で探索をする

apple tomato tomato

探索木

42

単一化

%事実の定義fruit(apple).fruit(tomato). vegetable(tomato).

%規則の定義plant(X) :- fruit(X).plant(X) :- vegetable(X).

ソースコード インタープリタ

?- trace.true.

?- plant(X).Call: (6) plant(_G466) ? creepCall: (7) fruit(_G466) ? creepExit: (7) fruit(apple) ? creepExit: (6) plant(apple) ? creep

X = apple

plant

fruit vegetable変数と, 項(この場合事実節)のマッチングを行う変数の有効範囲は, 同じ節内のみ

apple tomato tomato

X= apple

探索木

43

バックトラック

%事実の定義fruit(apple).fruit(tomato).vegetable(tomato).

%規則の定義plant(X) :- fruit(X).plant(X) :- vegetable(X).

ソースコード インタープリタ

X = apple ;Redo: (7) fruit(_G466) ? creepExit: (7) fruit(tomato) ? creepExit: (6) plant(tomato) ? creep

X = tomato

plant

fruit vegetable

直前の分岐に戻り, 別解の探索を行う.このような他の選択肢のことをオルタナティブ(alternative)という

apple tomato tomato

探索木

44

閉世界仮説

%事実の定義fruit(apple).fruit(tomato). vegetable(tomato).

%規則の定義plant(X) :- fruit(X).plant(X) :- vegetable(X).

インタープリタソースコード

?- plant(X).X = apple ;X = tomato ;X = tomato ;X = tomato.

?-

plant

fruit vegetable

もうこれ以上Xに当てはまるものがない.Prolog では定義されていない事は全て偽であるという仮定があり, この場合の結果は偽となる.

apple tomato tomato

←次の質問待ち

この仮定を閉世界仮説という

他の選択肢なし

探索木

45

演習

• 自分が興味を持つ対象について, 複数の事実および2項以上の規則を用いてプログラムを定義せよ

– 対象の例: 動植物, 機械, 建造物, 組織

– 関係の例: 分類, 捕食関係,家族関係, 利害関係, 構造

場所(東京, a). 給料(大, a). 系統(メーカーX, a). 業種(‘SIer’, a). 親(a).場所(大阪, b). 給料(中, b). 系統(独立, b). 業種(プログラマ, b).場所(東京, c). 給料(中, c). 系統(メーカーX, c). 業種(プログラマ, c).親子(P, C):- 系統(X, P), 親(P), 系統(X, C), P¥==C.グループ企業(X, G):- 系統(G, X), 系統(G, Y), X¥==Y.

?-親子(_, X), 給料(中, X). X = c.

インタープリタ

←子会社かつ程々の給料

プログラム例

46

次回予告?

1. Prolog の二面性

2. カット

3. 再帰

4. 糖衣構文

5. リスト

6. 様々な種類の述語

7. レポート

47

バックトラック制御(紹介のみ, 詳細は次回)

• X ! Y カット. バックトラックを阻止する

• true 必ず成功する目標

• fail 必ず失敗する目標

• not(X) 失敗による否定

• repeat 必ず成功し, もうひとつの実行分岐を生成する

• call(P) 目標P を起動する