計算の理論...

75
計算の理論 後半第6回(最終回) 小林 直樹

Transcript of 計算の理論...

Page 1: 計算の理論 後半第6回(最終回)koba/class/ComputationTheory/...論理型プログラミング •プログラム = 論理式 •プログラムの実行 = 証明探索

計算の理論 後半第6回(最終回)

小林 直樹

Page 2: 計算の理論 後半第6回(最終回)koba/class/ComputationTheory/...論理型プログラミング •プログラム = 論理式 •プログラムの実行 = 証明探索

本日の内容

• 論理プログラミング(前回の復習と続き) • プログラム検証と数学 (シラバスにあった「並行計算」は割愛します)

Page 3: 計算の理論 後半第6回(最終回)koba/class/ComputationTheory/...論理型プログラミング •プログラム = 論理式 •プログラムの実行 = 証明探索

論理型プログラミング

•プログラム = 論理式

•プログラムの実行 = 証明探索 (cf. Curry-Howard同型: 論理式=型、プログラム=証明)

•代表的な言語 – Prolog

•1970年代に人工知能の研究用に開発

•エキスパートシステム、自然言語処理などの知的処理を伴うプログラムの開発に応用

– GHC, KL1 •論理型言語に並行プログラミングの要素を盛り込んだもの

•日本の「第5世代コンピュータ」プロジェクトで活発に研究

Page 4: 計算の理論 後半第6回(最終回)koba/class/ComputationTheory/...論理型プログラミング •プログラム = 論理式 •プログラムの実行 = 証明探索

Prologのプログラム例 plus(0, X, X). /* 0+X = X */ plus(s(X), Y, s(Z)) :- plus(X, Y, Z). /* X+Y=Zならば(X+1)+Y = Z+1 */

自然数の表現: 0 0 1 s(0) 2 s(s(0)) 3 s(s(s(0))) ...

Page 5: 計算の理論 後半第6回(最終回)koba/class/ComputationTheory/...論理型プログラミング •プログラム = 論理式 •プログラムの実行 = 証明探索

Prologのプログラム例 plus(0, X, X). /* 0+X = X */ plus(s(X), Y, s(Z)) :- plus(X, Y, Z). /* X+Y=Zならば(X+1)+Y = Z+1 */ ?- plus(s(0), s(s(0)), X). /* 1+2は? */ X = s(s(s(0))) ?- plus(X, Y, s(s(0))). /* X+Y=2を満たすX,Yは?*/ X = 0, Y = s(s(0)); X = s(0), Y = s(0); X = s(s(0)), Y = 0

Page 6: 計算の理論 後半第6回(最終回)koba/class/ComputationTheory/...論理型プログラミング •プログラム = 論理式 •プログラムの実行 = 証明探索

Prologのプログラム例(魔方陣) mem(X, [X|L], L). mem(X, [A|L1], [A|L2]) :- mem(X, L1, L2).

permutation([], []). permutation(L, [X|L2]) :- mem(X,L,L1), permutation(L1, L2).

magic([X11,X12,X13,X21,X22,X23,X31,X32,X33]) :- permutation([1,2,3,4,5,6,7,8,9], [X11,X12,X13,X21,X22,X23,X31,X32,X33]), X1 is X11+X12+X13, X1 = 15, X2 is X21+X22+X23, X2 = 15, X3 is X31+X32+X33, X3 = 15, Y1 is X11+X21+X31, Y1 = 15, Y2 is X12+X22+X32, Y2 = 15, Y3 is X13+X23+X33, Y3 = 15, Z is X11+X22+X33, Z = 15, W is X13+X22+X31, W = 15.

X11 X12 X13

X21 X22 X23

X31 X32 X33

Page 7: 計算の理論 後半第6回(最終回)koba/class/ComputationTheory/...論理型プログラミング •プログラム = 論理式 •プログラムの実行 = 証明探索

Prologの実行の仕組み: 計算 = 証明の探索

例:足し算の場合 足し算の公理(プログラム): ∀X.plus(0, X, X) ∀X,Y,Z.plus(X, Y, Z) ⇒ plus(s(X), Y, s(Z))

Prologでの表現形式: plus(0, X, X). plus(s(X), Y, s(Z)) :- plus(X, Y, Z).

Page 8: 計算の理論 後半第6回(最終回)koba/class/ComputationTheory/...論理型プログラミング •プログラム = 論理式 •プログラムの実行 = 証明探索

Prologの実行の仕組み: 計算 = 証明の探索

例:足し算の場合 足し算の公理(プログラム): ∀X.plus(0, X, X) ∀X,Y,Z.plus(X, Y, Z) ⇒ plus(s(X), Y, s(Z)) 問い合わせ文(クエリー)の例: plus(X,Y, s(s(0)))を満たすX, Yは?

Prologでの表現形式: plus(0, X, X). plus(s(X), Y, s(Z)) :- plus(X, Y, Z). ?- plus(X,Y,s(s(0))).

Page 9: 計算の理論 後半第6回(最終回)koba/class/ComputationTheory/...論理型プログラミング •プログラム = 論理式 •プログラムの実行 = 証明探索

Prologの実行の仕組み: 計算 = 証明の探索

例:足し算の場合 足し算の公理(プログラム): ∀X.plus(0, X, X) ∀X,Y,Z.plus(X, Y, Z) ⇒ plus(s(X), Y, s(Z)) 問い合わせ文(クエリー)の例: plus(X,Y, s(s(0)))を満たすX, Yは? ∃X, Y. plus(X,Y, s(s(0))) を証明し、

証明からX,Yを抽出すればよい

Page 10: 計算の理論 後半第6回(最終回)koba/class/ComputationTheory/...論理型プログラミング •プログラム = 論理式 •プログラムの実行 = 証明探索

Prologの実行の仕組み: 計算 = 証明の探索

足し算の公理(プログラム):

−−−−−−−−−−−−−−−−− plus(0, X, X)

plus(X, Y, Z) −−−−−−−−−−−−−−−−− plus(s(X), Y, s(Z))

... −−−−−−−−−−−−−−−−− plus(V, W, s(s(0)))

Page 11: 計算の理論 後半第6回(最終回)koba/class/ComputationTheory/...論理型プログラミング •プログラム = 論理式 •プログラムの実行 = 証明探索

Prologの実行の仕組み: 計算 = 証明の探索

足し算の公理(プログラム):

−−−−−−−−−−−−−−−−− plus(0, X, X)

plus(X, Y, Z) −−−−−−−−−−−−−−−−− plus(s(X), Y, s(Z))

... −−−−−−−−−−−−−−−−− plus(V, W, s(s(0)))

Page 12: 計算の理論 後半第6回(最終回)koba/class/ComputationTheory/...論理型プログラミング •プログラム = 論理式 •プログラムの実行 = 証明探索

Prologの実行の仕組み: 計算 = 証明の探索

足し算の公理(プログラム):

−−−−−−−−−−−−−−−−− plus(0, X, X)

plus(X, Y, Z) −−−−−−−−−−−−−−−−− plus(s(X), Y, s(Z))

V=0, W=s(s(0)) −−−−−−−−−−−−−−−−− plus(V, W, s(s(0)))

Page 13: 計算の理論 後半第6回(最終回)koba/class/ComputationTheory/...論理型プログラミング •プログラム = 論理式 •プログラムの実行 = 証明探索

Prologの実行の仕組み: 計算 = 証明の探索

足し算の公理(プログラム):

−−−−−−−−−−−−−−−−− plus(0, X, X)

plus(X, Y, Z) −−−−−−−−−−−−−−−−− plus(s(X), Y, s(Z))

... −−−−−−−−−−−−−−−−− plus(V, W, s(s(0)))

Page 14: 計算の理論 後半第6回(最終回)koba/class/ComputationTheory/...論理型プログラミング •プログラム = 論理式 •プログラムの実行 = 証明探索

Prologの実行の仕組み: 計算 = 証明の探索

足し算の公理(プログラム):

−−−−−−−−−−−−−−−−− plus(0, X, X)

plus(X, Y, Z) −−−−−−−−−−−−−−−−− plus(s(X), Y, s(Z))

... −−−−−−−−−−−−−−−−−

plus(V1,W,s(0)), V=s(V1) −−−−−−−−−−−−−−−−− plus(V, W, s(s(0)))

Page 15: 計算の理論 後半第6回(最終回)koba/class/ComputationTheory/...論理型プログラミング •プログラム = 論理式 •プログラムの実行 = 証明探索

Prologの実行の仕組み: 計算 = 証明の探索

足し算の公理(プログラム):

−−−−−−−−−−−−−−−−− plus(0, X, X)

plus(X, Y, Z) −−−−−−−−−−−−−−−−− plus(s(X), Y, s(Z))

... −−−−−−−−−−−−−−−−−

plus(V1,W,s(0)), V=s(V1) −−−−−−−−−−−−−−−−− plus(V, W, s(s(0)))

Page 16: 計算の理論 後半第6回(最終回)koba/class/ComputationTheory/...論理型プログラミング •プログラム = 論理式 •プログラムの実行 = 証明探索

Prologの実行の仕組み: 計算 = 証明の探索

足し算の公理(プログラム):

−−−−−−−−−−−−−−−−− plus(0, X, X)

plus(X, Y, Z) −−−−−−−−−−−−−−−−− plus(s(X), Y, s(Z))

... −−−−−−−−−−−−−−−−−

plus(V1,W,s(0)), V=s(V1) −−−−−−−−−−−−−−−−− plus(V, W, s(s(0)))

Page 17: 計算の理論 後半第6回(最終回)koba/class/ComputationTheory/...論理型プログラミング •プログラム = 論理式 •プログラムの実行 = 証明探索

Prologの実行の仕組み: 計算 = 証明の探索

足し算の公理(プログラム):

−−−−−−−−−−−−−−−−− plus(0, X, X)

plus(X, Y, Z) −−−−−−−−−−−−−−−−− plus(s(X), Y, s(Z))

V1=0, W=s(0), V=s(V1) −−−−−−−−−−−−−−−−−

plus(V1,W,s(0)), V=s(V1) −−−−−−−−−−−−−−−−− plus(V, W, s(s(0)))

Page 18: 計算の理論 後半第6回(最終回)koba/class/ComputationTheory/...論理型プログラミング •プログラム = 論理式 •プログラムの実行 = 証明探索

Prologの実行の仕組み: 計算 = 証明の探索

足し算の公理(プログラム):

−−−−−−−−−−−−−−−−− plus(0, X, X)

plus(X, Y, Z) −−−−−−−−−−−−−−−−− plus(s(X), Y, s(Z))

... −−−−−−−−−−−−−−−−−

plus(V1,W,s(0)), V=s(V1) −−−−−−−−−−−−−−−−− plus(V, W, s(s(0)))

Page 19: 計算の理論 後半第6回(最終回)koba/class/ComputationTheory/...論理型プログラミング •プログラム = 論理式 •プログラムの実行 = 証明探索

Prologの実行の仕組み: 計算 = 証明の探索

足し算の公理(プログラム):

−−−−−−−−−−−−−−−−− plus(0, X, X)

plus(X, Y, Z) −−−−−−−−−−−−−−−−− plus(s(X), Y, s(Z))

... −−−−−−−−−−−−−−−−−

plus(V2,W,0), V1=s(V2), V=s(V1) −−−−−−−−−−−−−−−−−

plus(V1,W,s(0)), V=s(V1) −−−−−−−−−−−−−−−−− plus(V, W, s(s(0)))

Page 20: 計算の理論 後半第6回(最終回)koba/class/ComputationTheory/...論理型プログラミング •プログラム = 論理式 •プログラムの実行 = 証明探索

Prologの実行の仕組み: 計算 = 証明の探索

足し算の公理(プログラム):

−−−−−−−−−−−−−−−−− plus(0, X, X)

plus(X, Y, Z) −−−−−−−−−−−−−−−−− plus(s(X), Y, s(Z))

... −−−−−−−−−−−−−−−−−

plus(V2,W,0), V1=s(V2), V=s(V1) −−−−−−−−−−−−−−−−−

plus(V1,W,s(0)), V=s(V1) −−−−−−−−−−−−−−−−− plus(V, W, s(s(0)))

Page 21: 計算の理論 後半第6回(最終回)koba/class/ComputationTheory/...論理型プログラミング •プログラム = 論理式 •プログラムの実行 = 証明探索

Prologの実行の仕組み: 計算 = 証明の探索

足し算の公理(プログラム):

−−−−−−−−−−−−−−−−− plus(0, X, X)

plus(X, Y, Z) −−−−−−−−−−−−−−−−− plus(s(X), Y, s(Z))

... −−−−−−−−−−−−−−−−−

plus(V2,W,0), V1=s(V2), V=s(V1) −−−−−−−−−−−−−−−−−

plus(V1,W,s(0)), V=s(V1) −−−−−−−−−−−−−−−−− plus(V, W, s(s(0)))

Page 22: 計算の理論 後半第6回(最終回)koba/class/ComputationTheory/...論理型プログラミング •プログラム = 論理式 •プログラムの実行 = 証明探索

Prologの実行の仕組み: 計算 = 証明の探索

足し算の公理(プログラム):

−−−−−−−−−−−−−−−−− plus(0, X, X)

plus(X, Y, Z) −−−−−−−−−−−−−−−−− plus(s(X), Y, s(Z))

V2=W=0, V1=s(V2), V=s(V1) −−−−−−−−−−−−−−−−−

plus(V2,W,0), V1=s(V2), V=s(V1) −−−−−−−−−−−−−−−−−

plus(V1,W,s(0)), V=s(V1) −−−−−−−−−−−−−−−−− plus(V, W, s(s(0)))

V=s(s(0)), W = 0

Page 23: 計算の理論 後半第6回(最終回)koba/class/ComputationTheory/...論理型プログラミング •プログラム = 論理式 •プログラムの実行 = 証明探索

Prologの実際 • プログラムとして書ける論理式はホーン節:

A :- B1,...,Bn Bn (A, Bi は原子命題 p(t1,...,tk)) に制限

• SLD-resolution という特定の証明手法を採用 • ホーン節の適用順序を固定するため、解があっても止まらな

いことがあり p(X) :- p(s(X)). p(0). ? – A(Y). 解としてY=0があるが、Prologでは最初の節p(x):-p(s(x))を用いようとして無限ループ

• プログラミング言語としての表現力を高めるために、 「カット」「negation-as-failure」などの機能をサポート

Page 24: 計算の理論 後半第6回(最終回)koba/class/ComputationTheory/...論理型プログラミング •プログラム = 論理式 •プログラムの実行 = 証明探索

本日の内容

• 論理プログラミング(前回の復習と続き) • プログラム検証と数学 (シラバスにあった「並行計算」は割愛します)

Page 25: 計算の理論 後半第6回(最終回)koba/class/ComputationTheory/...論理型プログラミング •プログラム = 論理式 •プログラムの実行 = 証明探索

内容 • プログラム検証って何?なぜ重要? • プログラム検証と数学

– プログラム検証 = 数学の定理証明 – プログラム検証の限界:

万能な検証器は作れない

• 高階モデル検査を用いたプログラム検証 (時間があれば)

Page 26: 計算の理論 後半第6回(最終回)koba/class/ComputationTheory/...論理型プログラミング •プログラム = 論理式 •プログラムの実行 = 証明探索

プログラム検証器って何?

データ (数、画像、 音声など)

加工された データ

プログラム + 仕様 (期待される動作)

仕様を満たすか否か (誤りの可能性が あればその場所も)

プログラム検証器

通常のプログラム

Page 27: 計算の理論 後半第6回(最終回)koba/class/ComputationTheory/...論理型プログラミング •プログラム = 論理式 •プログラムの実行 = 証明探索

テスト実行 vs (形式的)検証

• テスト実行

– 典型的な入力について実際に実行して動作を確認する(cf. 車の試験走行)

– 絶対に誤りがないという保証はできない

• 形式的検証

– 実行前にプログラムを網羅的に解析し、動作に問題がないことを検証

– 絶対に誤りがないことを理論的に保証

Page 28: 計算の理論 後半第6回(最終回)koba/class/ComputationTheory/...論理型プログラミング •プログラム = 論理式 •プログラムの実行 = 証明探索

プログラムの検証の重要性

• 人命や財産にかかわるさまざまなシステムがプログラムによって制御 – 飛行機など交通システムの制御プログラム – 原子力発電所・医療器具などの制御プログラム – 銀行の口座管理システム(ATM等) – 電子商取引・電子マネー – 電子政府

プログラムの欠陥が人命や財産が失われる大事故に直結!

Page 29: 計算の理論 後半第6回(最終回)koba/class/ComputationTheory/...論理型プログラミング •プログラム = 論理式 •プログラムの実行 = 証明探索

プログラムの欠陥による問題の例 • 証券取引所のシステムの不具合

• 電話、飛行機のチェックインシステム、駅の改札、エレベータ制御、...の不具合

• ウラニウムプラントでの放射能漏れ事故 (2001年12月、オーストラリア)

• 種々のコンピュータウィルス

• Ariane 5ロケットの墜落(1996年6月、ヨーロッパ)

• 放射線治療器具の誤動作による医療事故(アメリカ)

このままだといずれもっと重大な事故が...

Page 30: 計算の理論 後半第6回(最終回)koba/class/ComputationTheory/...論理型プログラミング •プログラム = 論理式 •プログラムの実行 = 証明探索

講義内容 • プログラム検証って何?なぜ重要? • プログラム検証と数学

– プログラム検証 = 数学の定理証明 – プログラム検証の限界:

万能な検証器は作れない

• 高階モデル検査を用いたプログラム検証 (時間があれば)

Page 31: 計算の理論 後半第6回(最終回)koba/class/ComputationTheory/...論理型プログラミング •プログラム = 論理式 •プログラムの実行 = 証明探索

プログラム検証の目的

「プログラムPは、○○を満たすいかなる状態のもとで実行しても、結果は△△を満たす」 ことの証明 「...」の部分をきちんと書くと...

Page 32: 計算の理論 後半第6回(最終回)koba/class/ComputationTheory/...論理型プログラミング •プログラム = 論理式 •プログラムの実行 = 証明探索

プログラムの意味 • プログラムの数学的意味:

初期状態から最終状態(または停止しないことを表す⊥) への関数 (状態 = 変数からその値への関数)

〚 x:= x+1 〛(σ) = σ[x ↦ σ(x)+1 ] 〚 while true do skip 〛(σ) = ⊥ 〚 s:=0; while x>0 do (s:=s+x; x:=x-1) 〛(σ) σ(x) = σ[s ↦ ∑ i , x ↦ 0] if σ(x)>0 i=1 σ[s ↦ 0] if σ(x)≤0

Page 33: 計算の理論 後半第6回(最終回)koba/class/ComputationTheory/...論理型プログラミング •プログラム = 論理式 •プログラムの実行 = 証明探索

プログラムの意味 • プログラムの数学的意味:

初期状態から最終状態(または停止しないことを表す⊥) への関数 (状態 = 変数からその値への関数)

〚 skip 〛(σ) = σ (恒等関数) 〚 x:=a 〛(σ) = σ[x ↦ 〚a〛σ ] 〚 P1;P2〛(σ) =〚 P2〛(〚 P1〛σ ) 〚 if b then P1 else P2〛(σ) = 〚 P1〛σ if 〚 b〛σ = true 〚 P2〛σ if 〚 b〛σ = false 〚 while b do P〛= 以下の関数Fの最小不動点 F(X) (σ) = X(〚 P〛σ) if 〚 b〛σ = true σ if 〚 b〛σ = false

Page 34: 計算の理論 後半第6回(最終回)koba/class/ComputationTheory/...論理型プログラミング •プログラム = 論理式 •プログラムの実行 = 証明探索

プログラム検証の目的

「プログラムPは、Aを満たすいかなる状態のもとで実行しても、結果はBを満たす」 ことの証明 「...」の部分をきちんと書くと... ∀σ∈St. A(σ) ⇒ B(〚 P〛σ )

プログラム検証問題 = 数学の定理の証明問題(の一種)

Page 35: 計算の理論 後半第6回(最終回)koba/class/ComputationTheory/...論理型プログラミング •プログラム = 論理式 •プログラムの実行 = 証明探索

講義内容 • プログラム検証って何?なぜ重要? • プログラム検証と数学

– プログラム検証 = 数学の定理証明 – プログラム検証の限界:

万能な検証器は作れない

• 高階モデル検査を用いたプログラム検証 (時間があれば)

Page 36: 計算の理論 後半第6回(最終回)koba/class/ComputationTheory/...論理型プログラミング •プログラム = 論理式 •プログラムの実行 = 証明探索

プログラム検証は難しい? 以下のプログラムは停止するか? i := 1; a:=0; b:= 0; c:= 0; n := 0; while not (a>0 & b>0 & c>0 & n>2 & an + bn = cn) { a := factor_of(i, 2); /*** i = 2a3b5c7n... ***/ b := factor_of(i, 3); c := factor_of(i, 5); n := factor_of(i, 7); i := i+1; }

任意のプログラムの停止性が 自動判定可能 => フェルマーの最終定理が 自動証明できる!!

Page 37: 計算の理論 後半第6回(最終回)koba/class/ComputationTheory/...論理型プログラミング •プログラム = 論理式 •プログラムの実行 = 証明探索

停止性問題の決定不能性

証明: 背理法による。haltが存在したとして... weird(p) = if halt(p,p) = 0 then return 1 else loop() (* 無限ループ *) を考える。 weird(weird)は停止する?? weird(weird)は停止 halt(weird,weird)=0 weird(weird)は停止しない となって矛盾!

以下のようなプログラムhaltは存在しない halt(P, d) = 1 if P(d) は停止 0 if P(d) は停止しない

Page 38: 計算の理論 後半第6回(最終回)koba/class/ComputationTheory/...論理型プログラミング •プログラム = 論理式 •プログラムの実行 = 証明探索

...それでもプログラムの検証は有効 • 完全性を諦める

正しく動作する プログラム

誤りのある プログラム

プログラム + 仕様 (期待される動作) プログラム検証器

正しい!

間違っている!

この境界は 複雑すぎて 判別できない

Page 39: 計算の理論 後半第6回(最終回)koba/class/ComputationTheory/...論理型プログラミング •プログラム = 論理式 •プログラムの実行 = 証明探索

...それでもプログラムの検証は有効 • 完全性を諦める

正しく動作する プログラム

誤りのある プログラム

検証器で受理する プログラム

プログラム + 仕様 (期待される動作) プログラム検証器

正しい!

間違っている... かもしれない

Page 40: 計算の理論 後半第6回(最終回)koba/class/ComputationTheory/...論理型プログラミング •プログラム = 論理式 •プログラムの実行 = 証明探索

...それでもプログラムの検証は有効 • 完全性を諦める

正しく動作する プログラム

誤りのある プログラム

検証器で受理する プログラム

プログラム + 仕様 (期待される動作) プログラム検証器

正しい!

間違っている!

わかりません

Page 41: 計算の理論 後半第6回(最終回)koba/class/ComputationTheory/...論理型プログラミング •プログラム = 論理式 •プログラムの実行 = 証明探索

...それでもプログラムの検証は有効

• 完全性を諦める

• 人手を借りる

正しく動作する プログラム

誤りのある プログラム

検証器で受理する プログラム

プログラム

検証すべき性質

プログラムの 正しさの

必要十分条件 (論理式)

自動生成 人間+ 証明支援器 Yes

or No

Page 42: 計算の理論 後半第6回(最終回)koba/class/ComputationTheory/...論理型プログラミング •プログラム = 論理式 •プログラムの実行 = 証明探索

講義内容 • プログラム検証って何?なぜ重要? • プログラム検証と数学

– プログラム検証 = 数学の定理証明 – プログラム検証の限界:

万能な検証器は作れない

• 高階モデル検査を用いたプログラム検証 – 高階モデル検査って何? – プログラム検証への応用 – データ圧縮への応用

Page 43: 計算の理論 後半第6回(最終回)koba/class/ComputationTheory/...論理型プログラミング •プログラム = 論理式 •プログラムの実行 = 証明探索

高階モデル検査とは? • 高階木文法によって生成される無限木の性質を

判定する問題

Gが生成する木が Aを満たすか否か

高階モデル検査

高階 木文法

G

木の性質A (論理式)

Page 44: 計算の理論 後半第6回(最終回)koba/class/ComputationTheory/...論理型プログラミング •プログラム = 論理式 •プログラムの実行 = 証明探索

高階木文法って?

→ a

c B c b

→ a

S

c b

→ a

a

c B

→ ... →

c b

a

c b

a

c b

a

S

S → a c B B → b S

木文法の例

Page 45: 計算の理論 後半第6回(最終回)koba/class/ComputationTheory/...論理型プログラミング •プログラム = 論理式 •プログラムの実行 = 証明探索

高階木文法

→A c

c A(b c)

→ a

→ ... →

c a

→ a

b A(b(b c))

c

c a a

b c

a b b c

a b b b c

...

S

S → A c A x → a x A(b x)

Page 46: 計算の理論 後半第6回(最終回)koba/class/ComputationTheory/...論理型プログラミング •プログラム = 論理式 •プログラムの実行 = 証明探索

高階木文法と無限木

c b

a

c b

a

c b

a

S → a c B B → b S

S → F c F x → a x F(b x)

c a a

b c

a b2

c

a b4

c ...

S → a c F b c F f x → a f x F (D f) x D f x → f (f x)

c a a

b c

a b2

c

a b3

c ...

Page 47: 計算の理論 後半第6回(最終回)koba/class/ComputationTheory/...論理型プログラミング •プログラム = 論理式 •プログラムの実行 = 証明探索

高階モデル検査とは?

Gが生成する木が Aを満たすか否か

高階モデル検査

高階 木文法

木の性質A (論理式)

S → a c B B → b S

aとbが交互に現れる無限パスがある?

c b a

c b ...

a

YES!

Page 48: 計算の理論 後半第6回(最終回)koba/class/ComputationTheory/...論理型プログラミング •プログラム = 論理式 •プログラムの実行 = 証明探索

高階モデル検査問題の決定可能性と計算量

入力 G: 無限木を表す高階木文法 A: 木の性質を表す時相論理式(又はオートマトン) 例:すべての有限パスにはcが出現 bが出現したら必ずその後にaが出現 出力 Gが生成する木がAを満たすか否か

定理[Ong 2006] Order kの高階モデル検査問題は k-EXPTIME完全

2 2 2

2 p(x)

k

どんなにアルゴリズムを工夫しても、入力によっては、入力サイズのk重指数時間かかってしまい、

かつそのような問題の中で「一番難しい」

x: 入力サイズ p(x): xの多項式

Page 49: 計算の理論 後半第6回(最終回)koba/class/ComputationTheory/...論理型プログラミング •プログラム = 論理式 •プログラムの実行 = 証明探索

k重指数時間完全問題の恐ろしさ

1

2

3

2 2 2

2 4

k k 計算時間 (毎秒1京回の計算が できるとして)

Page 50: 計算の理論 後半第6回(最終回)koba/class/ComputationTheory/...論理型プログラミング •プログラム = 論理式 •プログラムの実行 = 証明探索

k重指数時間完全問題の恐ろしさ

1 16

2

3

2 2 2

2 4

k k 計算時間 (毎秒1京回の計算が できるとして)

Page 51: 計算の理論 後半第6回(最終回)koba/class/ComputationTheory/...論理型プログラミング •プログラム = 論理式 •プログラムの実行 = 証明探索

k重指数時間完全問題の恐ろしさ

1 16 0.0000000000000016秒

2

3

2 2 2

2 4

k k 計算時間 (毎秒1京回の計算が できるとして)

Page 52: 計算の理論 後半第6回(最終回)koba/class/ComputationTheory/...論理型プログラミング •プログラム = 論理式 •プログラムの実行 = 証明探索

k重指数時間完全問題の恐ろしさ

1 16 0.0000000000000016秒

2 65536 0.0000000000065536秒

3

2 2 2

2 4

k k 計算時間 (毎秒1京回の計算が できるとして)

Page 53: 計算の理論 後半第6回(最終回)koba/class/ComputationTheory/...論理型プログラミング •プログラム = 論理式 •プログラムの実行 = 証明探索

k重指数時間完全問題の恐ろしさ

1 16 0.0000000000000016秒

2 65536 0.0000000000065536秒

3 265536 = (210)6553.6

2 2 2

2 4

k k 計算時間 (毎秒1京回の計算が できるとして)

Page 54: 計算の理論 後半第6回(最終回)koba/class/ComputationTheory/...論理型プログラミング •プログラム = 論理式 •プログラムの実行 = 証明探索

k重指数時間完全問題の恐ろしさ

1 16 0.0000000000000016秒

2 65536 0.0000000000065536秒

3 265536 = (210)6553.6

> (103)6553.6

2 2 2

2 4

k k 計算時間 (毎秒1京回の計算が できるとして)

Page 55: 計算の理論 後半第6回(最終回)koba/class/ComputationTheory/...論理型プログラミング •プログラム = 論理式 •プログラムの実行 = 証明探索

k重指数時間完全問題の恐ろしさ

1 16 0.0000000000000016秒

2 65536 0.0000000000065536秒

3 265536 = (210)6553.6

> (103)6553.6

> 1019660

2 2 2

2 4

k k 計算時間 (毎秒1京回の計算が できるとして)

Page 56: 計算の理論 後半第6回(最終回)koba/class/ComputationTheory/...論理型プログラミング •プログラム = 論理式 •プログラムの実行 = 証明探索

k重指数時間完全問題の恐ろしさ

1 16 0.0000000000000016秒

2 65536 0.0000000000065536秒

3 265536 = (210)6553.6

> (103)6553.6

> 1019660

1019644秒

2 2 2

2 4

k k 計算時間 (毎秒1京回の計算が できるとして)

Page 57: 計算の理論 後半第6回(最終回)koba/class/ComputationTheory/...論理型プログラミング •プログラム = 論理式 •プログラムの実行 = 証明探索

k重指数時間完全問題の恐ろしさ

1 16 0.0000000000000016秒

2 65536 0.0000000000065536秒

3 265536 = (210)6553.6

> (103)6553.6

> 1019660

1019644秒 > 1019639日

2 2 2

2 4

k k 計算時間 (毎秒1京回の計算が できるとして)

Page 58: 計算の理論 後半第6回(最終回)koba/class/ComputationTheory/...論理型プログラミング •プログラム = 論理式 •プログラムの実行 = 証明探索

k重指数時間完全問題の恐ろしさ

1 16 0.0000000000000016秒

2 65536 0.0000000000065536秒

3 265536 = (210)6553.6

> (103)6553.6

> 1019660

1019644秒 > 1019639日 > 1019636年

2 2 2

2 4

k k 計算時間 (毎秒1京回の計算が できるとして)

Page 59: 計算の理論 後半第6回(最終回)koba/class/ComputationTheory/...論理型プログラミング •プログラム = 論理式 •プログラムの実行 = 証明探索

世界初の高階モデル検査器TRecS http://www-kb.is.s.u-tokyo.ac.jp/~koba/trecs/

最悪の入力が与えられるとk重指数時間かかるが、 典型的な多くの入力に対しては高速に動作

Page 60: 計算の理論 後半第6回(最終回)koba/class/ComputationTheory/...論理型プログラミング •プログラム = 論理式 •プログラムの実行 = 証明探索

講義内容 • プログラム検証って何?なぜ重要? • プログラム検証と数学

– プログラム検証 = 数学の定理証明 – プログラム検証の限界:

万能な検証器は作れない

• 高階モデル検査を用いたプログラム検証 – 高階モデル検査って何? – プログラム検証への応用 – データ圧縮への応用

Page 61: 計算の理論 後半第6回(最終回)koba/class/ComputationTheory/...論理型プログラミング •プログラム = 論理式 •プログラムの実行 = 証明探索

高階モデル検査とは?

Gが生成する木が Aを満たすか否か

高階モデル検査

高階 木文法

木の性質A (論理式)

S → a c B B → b S

aとbが交互に現れる無限パスがある?

c b a

c b ...

a

YES!

Page 62: 計算の理論 後半第6回(最終回)koba/class/ComputationTheory/...論理型プログラミング •プログラム = 論理式 •プログラムの実行 = 証明探索

応用1:プログラムの全自動検証器

プログラム + 仕様

仕様を満たすか否か

プログラム検証器

高階 木文法 + 木の仕様 プログラム

変換器 高階モデル 検査器

Page 63: 計算の理論 後半第6回(最終回)koba/class/ComputationTheory/...論理型プログラミング •プログラム = 論理式 •プログラムの実行 = 証明探索

From Program Verification to Model Checking: Example

let f(x) = if ∗ then close(x) else read(x); f(x) in let y = open “foo” in f (y)

c +

+

c +

c ...

r

r

r

Is the file “foo” accessed according

to read* close? Is each path of the tree

labeled by r*c?

F x k → + (c k) (r(F x k)) S → F d

Page 64: 計算の理論 後半第6回(最終回)koba/class/ComputationTheory/...論理型プログラミング •プログラム = 論理式 •プログラムの実行 = 証明探索

From Program Verification to Model Checking: Example

let f(x) = if ∗ then close(x) else read(x); f(x) in let y = open “foo” in f (y)

F x k → + (c k) (r(F x k)) S → F d

c +

+

c +

c ...

r

r

r

Is the file “foo” accessed according

to read* close? Is each path of the tree

labeled by r*c?

CPS Transformation!

continuation parameter, expressing how “foo” is accessed

after the call returns

Page 65: 計算の理論 後半第6回(最終回)koba/class/ComputationTheory/...論理型プログラミング •プログラム = 論理式 •プログラムの実行 = 証明探索

From Program Verification to Model Checking: Example

let f(x) = if ∗ then close(x) else read(x); f(x) in let y = open “foo” in f (y)

F x k → + (c k) (r(F x k)) S → F d

c +

+

c +

c ...

r

r

r

Is the file “foo” accessed according

to read* close? Is each path of the tree

labeled by r*c?

CPS Transformation!

Page 66: 計算の理論 後半第6回(最終回)koba/class/ComputationTheory/...論理型プログラミング •プログラム = 論理式 •プログラムの実行 = 証明探索

From Program Verification to Model Checking: Example

let f(x) = if ∗ then close(x) else read(x); f(x) in let y = open “foo” in f (y)

F x k → + (c k) (r(F x k)) S → F d

c +

+

c +

c ...

r

r

r

Is the file “foo” accessed according

to read* close? Is each path of the tree

labeled by r*c?

CPS Transformation!

Page 67: 計算の理論 後半第6回(最終回)koba/class/ComputationTheory/...論理型プログラミング •プログラム = 論理式 •プログラムの実行 = 証明探索

From Program Verification to Model Checking: Example

let f(x) = if ∗ then close(x) else read(x); f(x) in let y = open “foo” in f (y)

F x k → + (c k) (r(F x k)) S → F d

c +

+

c +

c ...

r

r

r

Is the file “foo” accessed according

to read* close? Is each path of the tree

labeled by r*c?

CPS Transformation!

Page 68: 計算の理論 後半第6回(最終回)koba/class/ComputationTheory/...論理型プログラミング •プログラム = 論理式 •プログラムの実行 = 証明探索

From Program Verification to Model Checking: Example

let f(x) = if ∗ then close(x) else read(x); f(x) in let y = open “foo” in f (y)

Is the file “foo” accessed according

to read* close? Is each path of the tree

labeled by r*c?

F x k → + (c k) (r(F x k)) S → F d

S

Page 69: 計算の理論 後半第6回(最終回)koba/class/ComputationTheory/...論理型プログラミング •プログラム = 論理式 •プログラムの実行 = 証明探索

From Program Verification to Model Checking: Example

let f(x) = if ∗ then close(x) else read(x); f(x) in let y = open “foo” in f (y)

Is the file “foo” accessed according

to read* close? Is each path of the tree

labeled by r*c?

F x k → + (c k) (r(F x k)) S → F d

F d

Page 70: 計算の理論 後半第6回(最終回)koba/class/ComputationTheory/...論理型プログラミング •プログラム = 論理式 •プログラムの実行 = 証明探索

From Program Verification to Model Checking: Example

let f(x) = if ∗ then close(x) else read(x); f(x) in let y = open “foo” in f (y)

Is the file “foo” accessed according

to read* close? Is each path of the tree

labeled by r*c?

F x k → + (c k) (r(F x k)) S → F d

F d

+ c

r

Page 71: 計算の理論 後半第6回(最終回)koba/class/ComputationTheory/...論理型プログラミング •プログラム = 論理式 •プログラムの実行 = 証明探索

From Program Verification to Model Checking: Example

let f(x) = if ∗ then close(x) else read(x); f(x) in let y = open “foo” in f (y)

Is the file “foo” accessed according

to read* close? Is each path of the tree

labeled by r*c?

F x k → + (c k) (r(F x k)) S → F d

+ c

r

+

F d

c

r

Page 72: 計算の理論 後半第6回(最終回)koba/class/ComputationTheory/...論理型プログラミング •プログラム = 論理式 •プログラムの実行 = 証明探索

From Program Verification to Model Checking: Example

let f(x) = if ∗ then close(x) else read(x); f(x) in let y = open “foo” in f (y)

c +

+

c +

c ...

r

r

r

Is the file “foo” accessed according

to read* close? Is each path of the tree

labeled by r*c?

F x k → + (c k) (r(F x k)) S → F d

Page 73: 計算の理論 後半第6回(最終回)koba/class/ComputationTheory/...論理型プログラミング •プログラム = 論理式 •プログラムの実行 = 証明探索

応用例2: データ圧縮

データ D

プログラム P

展開 (=実行)

圧縮 (Dを生成する プログラムPに)

例:円周率の最初の100万桁 (≈ 数百万ビット)

円周率を計算するプログラム +「100万」という数字

理論的に最適な圧縮率

Page 74: 計算の理論 後半第6回(最終回)koba/class/ComputationTheory/...論理型プログラミング •プログラム = 論理式 •プログラムの実行 = 証明探索

応用例2: データ圧縮

データ D

プログラム P

展開 (=実行)

圧縮

高階モデル検査を 用いたプログラム変換

データ E データ操作 (検索、置換等)

プログラム Q

展開 (=実行)

圧縮

Page 75: 計算の理論 後半第6回(最終回)koba/class/ComputationTheory/...論理型プログラミング •プログラム = 論理式 •プログラムの実行 = 証明探索

まとめ • プログラム検証はコンピュータ社会を支える重要な基盤技術

• 数学や論理学と密接な関係 – プログラム検証 ≈ 定理証明

• 万能なプログラム検証器は作れない • 万能ではないが有用な検証器は作れる

– 高階モデル検査はそのための基盤技術・理論の一つ