セルフケア理論の理解 セルフケア-事例展開の実 …ja-nn.jp/uploads/files/1_18th.pdf1 患者理解のための理論と実際 セルフケア理論の理解 セルフケア-事例展開の実際-
Ryo Hatano JAIST April 9, 2012s1220010/Prolog_1.pdf · 2 OHの目的 •Prologに慣れる –...
Transcript of Ryo Hatano JAIST April 9, 2012s1220010/Prolog_1.pdf · 2 OHの目的 •Prologに慣れる –...
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章が背景に詳しい)
(用語や定義をサッと引くときに)
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)
(大雑把注意)
関数型言語
論理型言語 ハイブリッド
オブジェクト指向型言語手続き型言語
影響を与えたホスト言語
(下記参照)
(ベースとなる実装の実現言語)
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に関わる処理を環境側が受け持つ.
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
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プログラムの構成要素
(以降, 見慣れないものがあっても, だいたいこの中のどれかに当てはまる)
• 算術, 比較, 代入, ユーザー定義• 単一化, バックトラック制御• コメント
演算子
+
節
頭部 :- 本体.
述語(項, 項, …, 項)
変数 定数 関数
データ構造
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
マッチング例
←成功すると, 最も一般的な変数の具体化を返す
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.
インタープリタ
←子会社かつ程々の給料
プログラム例