2009年7月29日水曜日

【検証論】5 ホーア論理の数学 (その3)


*** 5.2.1 健全性
- 定義なので原文ママ引用。

---

ホーア論理の健全性 (soundness)

PHL(PV,AV,S)が、解釈Iに対して健全であるとは、
PHL(PV,AV,S) |- {A}P{B}であるときには、必ず
I |= {A}P{B} となることをいう。

---

- これはあくまで健全性とはどういうことかという定
義。ホーア論理が健全性をもっているかどうかをこ
れから調べる。

- さて、それにあたって次の補題をまず示すのがよい
ようだ。

---

PHL(PV,AV,S)が解釈Iに対して健全である必要十分条件
は、Sの任意の表明Aに対して I |= A となることである。

---

- えっと、「必要十分条件」って何だっけ?
- 岩波数学入門辞典によると、P => Q, Q => P のとき、
PはQの、QはPの必要十分条件というようだ。
- なので、この補題が成立することを確認するには、

「PHL(PV,AV,S)が解釈Iに対して健全である」
=>
「Sの任意の表明Aに対して I |= A となる」



「Sの任意の表明Aに対して I |= A となる」
=>
「PHL(PV,AV,S)が解釈Iに対して健全である」

を調べればよいようだ。

- 本に載っているこの証明がなんだかよく分からない。
そこで自分なりに考えてみる。

- まず第一の方向。

「PHL(PV,AV,S)が解釈Iに対して健全である」
=>
「Sの任意の表明Aに対して I |= A となる」

これを示せばよい。

- まず、

「PHL(PV,AV,S)が解釈Iに対して健全である」

ということは健全性の定義により、

「PHL(PV,AV,S) |- {A}P{B}であるときには、必ずI |= {A}P{B} となる」

ということであった。

- なので、この後半の I |= {A}P{B} をうまくとると、

「Sの任意の表明Aに対して I |= A となる」

が言えるのではないかな。

- さて、ここではAはSに属しているので、表明単体と
してみると公理として正しさは確保できている。
- すると推論規則の方の公理でスキップ文の公理があ
るので、

PHL(PV,AV,S) |- {A}skip{A}

は成り立つ。

- ところで、帰結規則をここで使うと

{A}skip{A}
---------------------
{<恒真論理式>}skip{A}

と推論できる。というのは、<恒真論理式> => A は、
AがSに含まれていることからTrue => Trueであり、ト
リビアルに成立するからだ

ここで、<恒真論理式>をTrueと書くことにすると、
健全性から、

I |= {True}skip{A}

が成り立つということになる。

- では、

I |= {True}skip{A}

が成り立つということはどういうことであろうか。

- これは、表明付きプログラムの意味論から、
全ての状態pおよび全ての状態p'について、

I,p |= True => Exec[I'](skip,p,p') => I,p' |= A

が成立するということ。

- さて、

Exec[I'](skip,p,p') <=> 'p = p

なので、これは、

I,p |= True => p = p' => I,p' |= A

が全てのpとp'で成立する、ということ。

- さて、Trueは恒真論理式なので、解釈によらず常に
正しいから最左は成立し、結果、任意のp'について、

I,p' |= A

となる。これは

I |= A

の正式表記であった。■

- さて、次は逆の条件、

「Sの任意の表明Aに対して I |= A となる」
=>
「PHL(PV,AV,S)が解釈Iに対して健全である」

を確認しよう。

- ここでも健全性の定義を使って詳細化すると、

「Sの任意の表明Aに対して I |= A となる」
=>
「PHL(PV,AV,S) |- {A}P{B}であるときには、必ずI |= {A}P{B} となる」

ということだ。

- あれ? これ、よく考えるとおかしくないか?

「Sの任意の表明Aに対して I |= A となる」

解釈Iは、表明付きプログラムに対する解釈だから、
表明付きプログラムではない単なる表明であるAが伴
意されることはないのでは?

たぶん、気持的には解釈Iの中の表明に関する部分に
よって、Aが伴意される、ということじゃないか。

ということで、その気持で行こう。

- さて、これは任意のPについて成立することを示さな
ければいけないからPはいろいろあるので大変である。
そこでPの行数に関する帰納法で確認することにしよ
う。

- ではまず、Pが1行のみのプログラムの場合はどうか。

- 「形式的証明」で一行のみで成立するプログラムとい
うのは、公理だけである。よって、代入文の公理と
スキップ文の公理を確認すればよい。
- 代入文の公理は、

{A[t/x]} x := t {A}

である。これが形式的に証明されているときに、

I |= {A[t/x]} x := t {A}

と言えるかどうか、だが、形式的に証明されている、
ということはこれが公理であることと同義なので、
そのこと自体はここでの確認において無価値かな。

- そこで、伴意の文を詳細化してみると、
任意の状態pとp'について、

I,p |= {A[t/x]} => Exec[I'](x := t,p,p') => I,p' |= {A}

が成立することを示せばよいことになる。

- ここで、

Exec[I'](x := t,p,p') <=> p' = p[Ip[t]/x]

なので、

任意の状態pとp'について、

I,p |= {A[t/x]} => p' = p[Ip[t]/x] => I,p' |= {A}

が成立する、

となる。この言明が真かどうか確認してみよう。

- まず、I,p |= {A[t/x]}が真でなければ、それ以降は
何であっても全体は真になる。なので、I,p |=
{A[t/x]}が真であるような状態pについて考えればよ
い。p' = p[Ip[t]/x]は、ちょっと奇妙だがp'を設定
しているだけなので、常に真と考える。すると、そ
んなp'において、I,p' |= {A} が成立すればOKとな
る。

- pは状態であり、これは環境と同義であった。
ということは、p[Ip[t]/x]は、pという環境において、
変数xについてはもともとpで割り付けていた値では
なく、Ip[t]を割り付ける、ということだ。

- これは項の代入性そのものであり、自明だろう。

- 次。スキップ文の公理

- スキップ文の公理は、

{A} skip {A}

である。これが形式的に証明されているときに、

I |= {A} skip {A}

と言えるかどうか、だが、形式的に証明されている、
ということはこれが公理であることと同義なので、
そのこと自体はここでの確認において無価値であろ
う。

- そこで、伴意の文を詳細化してみると、
任意の状態pとp'について、

I,p |= {A} => Exec[I'](skip,p,p') => I,p' |= {A}

が成立することを示せばよいことになる。

- ここで、

Exec[I'](skip,p,p') <=> p' = p

なので、

任意の状態pとp'について、

I,p |= {A} p' = p => I,p' |= {A}

が成立する、

となる。これは{A}が伴意されるなら{A}は伴意され
る、という言明なので、自明だろう。

- ゆえに、一行のみの形式的証明について成立するこ
とが確認できた。

- 次に、n>1として、n行から構成される形式的証明を
考えよう。数学的帰納法を用いるので、n-1行までは
正しい(伴意する)ことが確認できているとする。

- n行目が、公理(代入文 or スキップ文)であれば、一
行のみと同様に自明である。なので、n行目が推論規
則である場合を確認すればよい。すると、次のもの
について確認することになる。
- while文
- if文
- begin文
- 帰結規則

- まずwhile文からやろう。

- 今、n行の形式的証明があり、n-1行目までは健全で
あるとする。そして、n行目が、

{A} while C do P od {¬C ^ A}

であるとする。
- n行目がこうであるということは、n-1行目までのど
こかに、

{C^A}P{A}

がある、ということである。これは健全であるから、

I |= {C^A}P{A}

が成立しているということになる。これを情報とし
て、示すべきは、

I |= {A} while C do P od {¬C ^ A}

である。この伴意を詳細化すると、

任意の状態p,p'について、

I,p |= A => Exec[I'](while C do P od,p,p') => I,p' |= {¬C ^ A}

が真である

ということだ。

- さて、上記のwhile文のExecは次のものと同値である。

次のものを満すような、m(>=1)と、状態の列
p1,...,pmが存在する

(p=p1)^(p'=pm)^(I,pm /|= C) ^
(すべてのi(<m)について次のことが成り立つ ((I,pi |= C ^ ExecI(P,pi,pi+1))))

- どわーーー。while文がやっぱりわからん。

- ということで、とりあえずここまでとして、次回は、
while文について自分なりに整理しなおすことにする。


こつこつ。

0 件のコメント: