計算の理論...
Transcript of 計算の理論...
計算の理論 後半第6回(最終回)
小林 直樹
本日の内容
• 論理プログラミング(前回の復習と続き) • プログラム検証と数学 (シラバスにあった「並行計算」は割愛します)
論理型プログラミング
•プログラム = 論理式
•プログラムの実行 = 証明探索 (cf. Curry-Howard同型: 論理式=型、プログラム=証明)
•代表的な言語 – Prolog
•1970年代に人工知能の研究用に開発
•エキスパートシステム、自然言語処理などの知的処理を伴うプログラムの開発に応用
– GHC, KL1 •論理型言語に並行プログラミングの要素を盛り込んだもの
•日本の「第5世代コンピュータ」プロジェクトで活発に研究
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))) ...
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
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
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).
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))).
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を抽出すればよい
Prologの実行の仕組み: 計算 = 証明の探索
足し算の公理(プログラム):
−−−−−−−−−−−−−−−−− plus(0, X, X)
plus(X, Y, Z) −−−−−−−−−−−−−−−−− plus(s(X), Y, s(Z))
... −−−−−−−−−−−−−−−−− plus(V, W, s(s(0)))
Prologの実行の仕組み: 計算 = 証明の探索
足し算の公理(プログラム):
−−−−−−−−−−−−−−−−− plus(0, X, X)
plus(X, Y, Z) −−−−−−−−−−−−−−−−− plus(s(X), Y, s(Z))
... −−−−−−−−−−−−−−−−− plus(V, W, s(s(0)))
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)))
Prologの実行の仕組み: 計算 = 証明の探索
足し算の公理(プログラム):
−−−−−−−−−−−−−−−−− plus(0, X, X)
plus(X, Y, Z) −−−−−−−−−−−−−−−−− plus(s(X), Y, s(Z))
... −−−−−−−−−−−−−−−−− plus(V, W, s(s(0)))
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)))
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)))
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)))
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)))
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)))
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)))
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)))
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)))
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
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」などの機能をサポート
本日の内容
• 論理プログラミング(前回の復習と続き) • プログラム検証と数学 (シラバスにあった「並行計算」は割愛します)
内容 • プログラム検証って何?なぜ重要? • プログラム検証と数学
– プログラム検証 = 数学の定理証明 – プログラム検証の限界:
万能な検証器は作れない
• 高階モデル検査を用いたプログラム検証 (時間があれば)
プログラム検証器って何?
データ (数、画像、 音声など)
加工された データ
プログラム + 仕様 (期待される動作)
仕様を満たすか否か (誤りの可能性が あればその場所も)
プログラム検証器
通常のプログラム
テスト実行 vs (形式的)検証
• テスト実行
– 典型的な入力について実際に実行して動作を確認する(cf. 車の試験走行)
– 絶対に誤りがないという保証はできない
• 形式的検証
– 実行前にプログラムを網羅的に解析し、動作に問題がないことを検証
– 絶対に誤りがないことを理論的に保証
プログラムの検証の重要性
• 人命や財産にかかわるさまざまなシステムがプログラムによって制御 – 飛行機など交通システムの制御プログラム – 原子力発電所・医療器具などの制御プログラム – 銀行の口座管理システム(ATM等) – 電子商取引・電子マネー – 電子政府
⇓
プログラムの欠陥が人命や財産が失われる大事故に直結!
プログラムの欠陥による問題の例 • 証券取引所のシステムの不具合
• 電話、飛行機のチェックインシステム、駅の改札、エレベータ制御、...の不具合
• ウラニウムプラントでの放射能漏れ事故 (2001年12月、オーストラリア)
• 種々のコンピュータウィルス
• Ariane 5ロケットの墜落(1996年6月、ヨーロッパ)
• 放射線治療器具の誤動作による医療事故(アメリカ)
このままだといずれもっと重大な事故が...
講義内容 • プログラム検証って何?なぜ重要? • プログラム検証と数学
– プログラム検証 = 数学の定理証明 – プログラム検証の限界:
万能な検証器は作れない
• 高階モデル検査を用いたプログラム検証 (時間があれば)
プログラム検証の目的
「プログラムPは、○○を満たすいかなる状態のもとで実行しても、結果は△△を満たす」 ことの証明 「...」の部分をきちんと書くと...
プログラムの意味 • プログラムの数学的意味:
初期状態から最終状態(または停止しないことを表す⊥) への関数 (状態 = 変数からその値への関数)
〚 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
プログラムの意味 • プログラムの数学的意味:
初期状態から最終状態(または停止しないことを表す⊥) への関数 (状態 = 変数からその値への関数)
〚 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
プログラム検証の目的
「プログラムPは、Aを満たすいかなる状態のもとで実行しても、結果はBを満たす」 ことの証明 「...」の部分をきちんと書くと... ∀σ∈St. A(σ) ⇒ B(〚 P〛σ )
プログラム検証問題 = 数学の定理の証明問題(の一種)
講義内容 • プログラム検証って何?なぜ重要? • プログラム検証と数学
– プログラム検証 = 数学の定理証明 – プログラム検証の限界:
万能な検証器は作れない
• 高階モデル検査を用いたプログラム検証 (時間があれば)
プログラム検証は難しい? 以下のプログラムは停止するか? 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; }
任意のプログラムの停止性が 自動判定可能 => フェルマーの最終定理が 自動証明できる!!
停止性問題の決定不能性
証明: 背理法による。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) は停止しない
...それでもプログラムの検証は有効 • 完全性を諦める
正しく動作する プログラム
誤りのある プログラム
プログラム + 仕様 (期待される動作) プログラム検証器
正しい!
間違っている!
この境界は 複雑すぎて 判別できない
...それでもプログラムの検証は有効 • 完全性を諦める
正しく動作する プログラム
誤りのある プログラム
検証器で受理する プログラム
プログラム + 仕様 (期待される動作) プログラム検証器
正しい!
間違っている... かもしれない
...それでもプログラムの検証は有効 • 完全性を諦める
正しく動作する プログラム
誤りのある プログラム
検証器で受理する プログラム
プログラム + 仕様 (期待される動作) プログラム検証器
正しい!
間違っている!
わかりません
...それでもプログラムの検証は有効
• 完全性を諦める
• 人手を借りる
正しく動作する プログラム
誤りのある プログラム
検証器で受理する プログラム
プログラム
検証すべき性質
プログラムの 正しさの
必要十分条件 (論理式)
自動生成 人間+ 証明支援器 Yes
or No
講義内容 • プログラム検証って何?なぜ重要? • プログラム検証と数学
– プログラム検証 = 数学の定理証明 – プログラム検証の限界:
万能な検証器は作れない
• 高階モデル検査を用いたプログラム検証 – 高階モデル検査って何? – プログラム検証への応用 – データ圧縮への応用
高階モデル検査とは? • 高階木文法によって生成される無限木の性質を
判定する問題
Gが生成する木が Aを満たすか否か
高階モデル検査
高階 木文法
G
木の性質A (論理式)
高階木文法って?
→ 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
木文法の例
高階木文法
→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)
高階木文法と無限木
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 ...
高階モデル検査とは?
Gが生成する木が Aを満たすか否か
高階モデル検査
高階 木文法
木の性質A (論理式)
S → a c B B → b S
aとbが交互に現れる無限パスがある?
c b a
c b ...
a
YES!
高階モデル検査問題の決定可能性と計算量
入力 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の多項式
k重指数時間完全問題の恐ろしさ
1
2
3
2 2 2
2 4
k k 計算時間 (毎秒1京回の計算が できるとして)
k重指数時間完全問題の恐ろしさ
1 16
2
3
2 2 2
2 4
k k 計算時間 (毎秒1京回の計算が できるとして)
k重指数時間完全問題の恐ろしさ
1 16 0.0000000000000016秒
2
3
2 2 2
2 4
k k 計算時間 (毎秒1京回の計算が できるとして)
k重指数時間完全問題の恐ろしさ
1 16 0.0000000000000016秒
2 65536 0.0000000000065536秒
3
2 2 2
2 4
k k 計算時間 (毎秒1京回の計算が できるとして)
k重指数時間完全問題の恐ろしさ
1 16 0.0000000000000016秒
2 65536 0.0000000000065536秒
3 265536 = (210)6553.6
2 2 2
2 4
k k 計算時間 (毎秒1京回の計算が できるとして)
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京回の計算が できるとして)
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京回の計算が できるとして)
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京回の計算が できるとして)
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京回の計算が できるとして)
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京回の計算が できるとして)
世界初の高階モデル検査器TRecS http://www-kb.is.s.u-tokyo.ac.jp/~koba/trecs/
最悪の入力が与えられるとk重指数時間かかるが、 典型的な多くの入力に対しては高速に動作
講義内容 • プログラム検証って何?なぜ重要? • プログラム検証と数学
– プログラム検証 = 数学の定理証明 – プログラム検証の限界:
万能な検証器は作れない
• 高階モデル検査を用いたプログラム検証 – 高階モデル検査って何? – プログラム検証への応用 – データ圧縮への応用
高階モデル検査とは?
Gが生成する木が Aを満たすか否か
高階モデル検査
高階 木文法
木の性質A (論理式)
S → a c B B → b S
aとbが交互に現れる無限パスがある?
c b a
c b ...
a
YES!
応用1:プログラムの全自動検証器
プログラム + 仕様
仕様を満たすか否か
プログラム検証器
高階 木文法 + 木の仕様 プログラム
変換器 高階モデル 検査器
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
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
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!
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!
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!
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
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
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
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
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
応用例2: データ圧縮
データ D
プログラム P
展開 (=実行)
圧縮 (Dを生成する プログラムPに)
例:円周率の最初の100万桁 (≈ 数百万ビット)
円周率を計算するプログラム +「100万」という数字
理論的に最適な圧縮率
応用例2: データ圧縮
データ D
プログラム P
展開 (=実行)
圧縮
高階モデル検査を 用いたプログラム変換
データ E データ操作 (検索、置換等)
プログラム Q
展開 (=実行)
圧縮
まとめ • プログラム検証はコンピュータ社会を支える重要な基盤技術
• 数学や論理学と密接な関係 – プログラム検証 ≈ 定理証明
• 万能なプログラム検証器は作れない • 万能ではないが有用な検証器は作れる
– 高階モデル検査はそのための基盤技術・理論の一つ