プログラミング言語論 第12回 論理型プログラミング 情報工学科 篠埜 功.

Slides:



Advertisements
Similar presentations
プログラミング言語論 第3回 BNF 記法について(演習付き) 篠埜 功. 構文の記述 プログラミング言語の構文はどのように定式化できるか? 例1 : for ループの中に for ループが書ける。 for (i=0; i
Advertisements

一階述語論理 (first-order predicate logic) 一階述語論理入門 構文論(論理式の文 法) 意味論(論理式の解 釈) 認知システム論 知識と推論(4) 知識と論理でを組み合わせて問題を解決する.
プログラミング言語論 第10回(演習) 情報工学科 木村昌臣   篠埜 功.
プログラミング言語論論理型言語 論理型プログラミング言語 水野嘉明
到着時刻と燃料消費量を同時に最適化する船速・航路計画
人工知能特論2011 No.4 東京工科大学大学院 担当教員:亀田弘之.
京都大学情報学研究科 通信情報システム専攻 湯淺研究室 M2 平石 拓
ラベル付き区間グラフを列挙するBDDとその応用
プログラミング言語としてのR 情報知能学科 白井 英俊.
近似アルゴリズム 第10章 終了時刻最小化スケジューリング
知的インタフェース 例示によるプログラミング 予測インタフェース 制約インタフェース.
ファジィ論理と ファジィ構造モデリング 北海道工業大学 情報デザイン学科 三田村 保.
システムプログラミング 第5回 情報工学科 篠埜 功 ヒアドキュメント レポート課題 main関数の引数 usageメッセージ
Q q 情報セキュリティ 第6回:2005年5月20日(金) q q.
データ構造と アルゴリズム 理工学部 情報システム工学科 新田直也.
プログラミング言語論 プログラミング言語の 特徴と分類 水野嘉明
C言語 配列 2016年 吉田研究室.
プログラミング言語論 第6回 型 情報工学科 篠埜 功.
プログラミング言語論 第4回 式の構文、式の評価
Prolog演習 PowerPointのアニメーション機能を利用すると分かりやすいと思います.
人工知能特論2011 資料No.6 東京工科大学大学院 担当教員 亀田弘之.
Natural Semantics 実行過程の、最初と最後の状態(state)の関係を考える。
整数計画法を用いた ペグソリティアの解法 ver. 2.1
条件式 (Conditional Expressions)
データ構造と アルゴリズム 知能情報学部 新田直也.
システム開発実験No.7        解 説       “論理式の簡略化方法”.
ML 演習 第 7 回 新井淳也、中村宇佑、前田俊行 2011/05/31.
プログラミング言語論 第12回 関数型プログラミング 情報工学科 篠埜 功.
シミュレーション演習 G. 総合演習 (Mathematica演習) システム創成情報工学科
オントロジーを使用した プログラム開発支援システムの提案
PROGRAMMING IN HASKELL
プログラミング言語論 第3回 BNF記法について(演習付き)
PROGRAMMING IN HASKELL
Prolog入門 ーIT中級者用ー.
導出原理とProlog -論理と形式化 授業資料-
第7回 条件による繰り返し.
 型推論1(単相型) 2007.
並行プログラミング concurrent programming
Structural operational semantics
プログラミング言語論 第10回 練習問題解答例 情報工学科 篠埜 功.
PHP 概要 担当 岡村耕二 月曜日 2限 平成22年度 情報科学III (理系コア科目・2年生)
4.リスト,シンボル,文字列.
論理プログラミング 導出の効率化 論理プログラム ホーン節 ホーン集合に対する導出戦略 論理式の手続き的解釈 Prolog
アルゴリズム論 (第12回) 佐々木研(情報システム構築学講座) 講師 山田敬三
第5章 計算とプログラム 本章で説明すること ・計算の概観と記述法 ・代表的な計算モデル ・プログラムとプログラム言語.
プログラミング言語論 第9回 情報工学科 木村昌臣 篠埜 功.
コンパイラ 2011年10月20日
 型推論3(MLの多相型).
情報基礎Ⅱ (第1回) 月曜4限 担当:北川 晃.
KL1 による並列プログラミング 早稲田大学理工学部情報学科 上田研究室 4 年 高木祐介
第14回 前半:ラムダ計算(演習付) 後半:小テスト
東京工科大学 コンピュータサイエンス学部 亀田弘之
東京工科大学 コンピュータサイエンス学部 亀田弘之
プログラミング言語論 第10回 情報工学科 篠埜 功.
述語論理式の構文と意味 一階述語論理式の構文 一階述語論理式の意味 述語,限量記号 自然言語文の述語論理式表現 解釈 妥当,充足不能
プログラミング言語論 第4回 文の翻訳 C言語の文 表明 Hoare論理
情報処理Ⅱ 第7回 2004年11月16日(火).
PROGRAMMING IN HASKELL
関数型言語の基礎 型なしl計算 型理論 構成的プログラミング GUIにあらわれる関数概念 PBD VL
プログラミング基礎演習 第4回.
プログラミング入門2 第6回 関数 情報工学科 篠埜 功.
Q q 情報セキュリティ 第8回:2004年5月28日(金) の補足 q q.
PROGRAMMING IN HASKELL
オブジェクト指向言語論 第一回 知能情報学部 新田直也.
情報処理Ⅱ 2005年11月25日(金).
プログラミング入門2 第5回 配列 変数宣言、初期化について
プログラミング入門2 第3回 条件分岐(2) 繰り返し文 篠埜 功.
JavaScript    プログラミング入門 2-3 式と演算子 2006/10/12 神津 健太.
数理論理学 最終回 茨城大学工学部情報工学科 佐々木 稔.
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
Presentation transcript:

プログラミング言語論 第12回 論理型プログラミング 情報工学科 篠埜 功

論理型プログラミング (logic programming) 自動定理証明がもとになっている 1階述語論理の構文が用いられる Prolog (1973年) --- 最初は自然言語処理に用いられた Robert Kowalski: “algorithm=logic+control” Alain Colmerauerと彼のteamが自然言語処理用のプログラミング言語を開発しており、Kowalskiと交流してPrologの開発に繋がった。

Algorithm = logic + control Prologにはさまざまな方言(dialect)が存在する。 代表的なものはEdinburgh Prolog。Edinburgh PrologがPrologのISO規格に影響を与えている。 各方言Dの間の構文以外の違いは次の式で表される: algorithmD = logic + controlD (参考文献)R. A. Kowalski, “Algorithm = Logic + Control”. Communication of the ACM, 22(7), pp. 424-436, 1979

論理型プログラミングの概念 関数(function)ではなく関係(relation)を用いる n項関係は関係はm行n列(行は無限にあるかもしれない)のテーブルで表される (a1, a2, …, an)がテーブル内のどこかの行の場合、a1, a2, …, anはそのテーブルが表している関係にある。

例: append X Y Z [ ] [a] [b] [a,b] [c,d] [a,b,c,d] … 関係appendは「XとYを連結したリストがZ」を満たす組(X,Y,Z)の集合(それを表の形にしたものが上記の表) 関係は述語でもある: 「与えられた組は関係の要素か」 (例) ([a],[b],[a,b]) append, ([a],[b],[ ]) append

ホーン節(Horn clause) 関係を、P :- Q1 , Q2, …, Qk . のような形の規則により記述する(k ≥ 0)。これは以下のような論理式に対応する。 P if Q1 and Q2 and … and Qk . (k ≥ 0) Q1 , Q2, …, Qk が成り立つならPが成り立つという意味(declarative interpretation)だが、Pを成立させるにはQ1 , Q2, …, Qk を成立させればよいというように考える(procedural interpretation)。このような規則をホーン節(Horn clause)と呼ぶ。kが0のときは前提無しで成り立つ事実を表し、:=を省略して P. のように記述する。 (例)関係appendは2つの規則で記述される。 append ([ ], Y, Y). append ( [H|X], Y, [H|Z]) :- append (X,Y,Z). (参考文献)A. Horn, “On sentences which are true of direct unions of algebras”. Journal of Symbolic Logic, Vol. 16, pp. 14-21, 1951.

Query ?- append([a,b],[c,d],[a,b,c,d]). yes ?- append([a,b],[c,d],Z). Z=[a,b,c,d] ?- append([a,b],Y,[a,b,c,d]). Y=[c,d] ?- append(X,[c,d],[a,b,c,d]). X=[a,b] ?- append(X,[d,c],[a,b,c,d]). no 論理型プログラミングにおいては(変数を含む)queryに対する答えを見つけるのが計算。

Term Simple term: 数 大文字で始まる変数 アトム(atom) (例) 0 1972 X Source lisp algol60 Compound term: アトムの後にtermの列を括弧で囲んだもの (例) link(bcpl, c) 中値記法が使える場合もある。 (例) =(X,Y)はX=Yと書いてよい。 _は特別な変数でplaceholder。

Fact, rule, queryの構文 (Edinburgh Prologの場合) <fact> ::= <term> . <rule> ::= <term> :- <terms> . <query> ::= <terms> . <term> ::= <number> | <atom> | <variable> | <atom> (<terms>) <terms> ::= <term> | <term>, <terms>

Fact, ruleの例 link(fortran, algol60). link(algol60, cpl). link(cpl, bcpl). link(bcpl, c). link(c, cplusplus). link(algol60, simula67). link(simula67, cplusplus). link(simula67, smalltalk80). path(L,L). path(L,M) :- link(L,X), path(X,M) .

Existential queries Query <term>1, <term>2, …. <term>k . は、 <term>1 and <term>2 and … and <term>k ? という疑似コードに対応する。Queryはgoalとも呼ばれる。Query中の各termはsubgoalとも呼ばれる。 (例) ?- link(cpl, bcpl), link(bcpl, c). yes ?- link(algol60, L), link(L, M). L=cpl M=bcpl ここでreturnキーを押すとyesと表示されて終了するが、;を打つと別の解が表示される(かあるいは解が見つからない場合はnoが表示される)。 link(algol60,L) とlink(L,M)を満たすL,Mはあるか?

(続き) ?- link(algol60, L), link(L, M). L=cpl M=bcpl ; L=simula67 M=cplusplus ; M=smalltalk80 yes 次の解がないことが分かった場合はこのように;の入力を待たずにyesが表示される。

Universal facts and rules Rule <term> :- <term>1, <term>2, …. <term>k . は、 <term> if <term>1 and <term>2 and … and <term>k ? という疑似コードに対応する。Ruleの:-の左側はhead、:-の右側はconditionあるいはbodyと呼ばれる。Factはruleの特別な場合で、conditionがなくheadだけのruleである。 path(L,L). path(L,M) :- link(L,X), path(X,M) . はpathという関係を定義している。 path(L,L)は、全てのLに対し、path(L,L)が成り立つということを表す。path(L,M) :- link(L,X), path(X,M) . は、すべてのLとMに対し、もしlink(L,X)とpath(X,M)が成り立つようなXが存在するなら、path(L,M)が成り立つということを表す。

Negation as failure Prologは、queryを満たすのに失敗したときにnoと答える。 ?- link(lisp,scheme) . no not演算子(\+)もnegation as failureであり、\+(P)はPを示すのに失敗したらtrueとして扱われる。

(続き) ?- link(L,N), link(M,N) . L=fortran M=fortran N=algol60 ?- link(L,N), link(M,N), \+(L=M) . L=c M=simula67 N=cplusplus ; L=simula67 M=c no ?- \+(L=M), link(L,N), link(M,N) .

単一化(unification) 2つのtermを等しくするような変数への最も一般的な置換(most general unifier)を求めること Unificationは規則の適用ができるかどうかを判定するために行われる。 Unificationを行う組み込みの述語として=がある。 (例)?- f (X,b) = f (a,Y) . X=a Y=b (参考文献1) John A. Robinson. “A machine-oriented logic based on the resolution principle”. Journal of the ACM, 12(1):23–41, 1965. (参考文献2) Alberto Martelli and Ugo Montanari, “An efficient unification algorithm”, ACM TOPLAS 4(2), pp. 258-282, 1982. (参考)片方のみに変数がある場合はパターンマッチング(pattern matching)。

instance term Tの中の変数を何らかのtermで置き換えて得られるtermをterm Tのinstanceという。(同じ変数に対しては同じtermで置き換えなければならない。) (例1) f(a,b)はf(X,b)のinstance。 (例2) f(a,b)はf(a,Y)のinstance。 (例3) g(a,a)はg(X,X)のinstance。 (例4) g(h(b),h(b))はg(X,X)のinstance。 (例5) g(a,b)はg(X,X)のinstanceではない。 2つのterm T1, T2は共通のinstance T を持つとき単一化(unify)できるという。 (参考)単一化は関数型言語の型推論においても用いられる。

Occurs check 変数Xとterm Tを単一化する際に、Tの中にXがあるかどうかを確認することをoccurs checkという。 ?- append([ ], E, [a,b|E]). E = [a,b,a,b,a,b,a,b,a,b,…] append([ ], Y, Y)と単一化が成功するためには、YがEと[a,b|E]の両方と単一化が成功しなければならない。Eを[a,b|E]で置き換えようとすると、 E = [a,b|E] = [a,b,a,b|E] = [a,b,a,b,a,b|E] = … のようになる。GNU prologなど、cyclic termを構築するものもある。 • a • b

算術演算 =演算子 --- term1=term2の形で用いられ、term1とterm2の単一化を行う ?- X=2+3. X=2+3 is演算子 --- term is 式の形で用いられ、式の評価結果とtermの単一化を行う ?- X is 2+3. X=5 ?- X is 2+3, X=5. ?- X is 2+3, X=2+3. no 算術演算

Prolog探索木 各ノードはゴール(goal)を表す 各ノードはそのノードの一番左のサブゴールに適用できるルールの数だけ子供を持つ 各ノードの子供の順番は規則の順番と同じ Prologの計算は、Prolog探索木を深さ優先で探索することにより行われ、ゴールが空のノードに到達する度に答えを出力する Backtrack(バックトラック)が行われる

例 Prolog探索木 a(X) b e c d fail a(1) :- b. a(2) :- e. {X -> 2} b :- c. b :- d. c :- fail. d. e. {X -> 1} {X -> 2} b e c d 成功し、 X=2を出力 (yesを出力して 終了) (failは常に失敗する述語) fail 成功し、 X=1を出力 (セミコロンを打つと backtrack) 失敗し、 backtrack ?- a(X). X=1; X=2 yes

Cut 探索する部分を削減する効果を持ち、計算量が減少 純粋な論理式の意味からははずれる B :- C1, …, Cj-1, !, Cj+1, …, Ck !自体は常に成功し、backtrackで!に戻ってきた際に、述語Bは失敗するという副作用を持つ。 a(X) a(1) :- b. a(2) :- e. b :- !, c. b :- d. c :- fail. d. e. {X -> 2} ?- a(X). X=2 yes {X -> 1} b e !, c ここは探索しない 成功し、 X=2を出力 (yesを出力して 終了) c fail 失敗し、backtrack

Cutの例 mem(K, node(K,_,_)). mem(K, node(N,S,_)) :- K<N, mem(K,S). mem(K, node(N,_,T)) :- K>N, mem(K,T). この定義では、3つの規則が相互に重なり合わないので、以下のようにcutを入れると効率が良くなる。 mem(K, node(N,S,_)) :- K<N, !, mem(K,S). この場合は、Prolog探索木の中で解に到達しない部分だけを探索範囲から除外している。このようなcutをgreen cutという。それ以外のcutはred cutという。

not演算子 X=2, \+(X=1) [Prologのnot演算子] \+(Y) :- Y, !, fail. \+(_). yes ?- \+(X=1), X=2. no \+(2=1) {Y -> 2=1} 2=1, !, fail 成功し、X=2を出力 (yesを出力して終了) 2=1が失敗し、backtrack \+(X=1), X=2 {Y -> X=1} X=1, !, fail, X=2 ここは探索しない {X -> 1} !, fail, 1=2 (noを出力して終了) fail, 1=2 failが失敗し、backtrack