ホーア論理
ホーア論理(ホーアろんり、英: Hoare logic)とは、公理的意味論の立場でプログラムの正当性について厳密に推論するために第一階述語論理を拡張した形式論理の言語を言う。
プログラムの正しさを証明するためのロバート・フロイドによる流れ図に関する方法[1]を基に、計算機科学者のアントニー・ホーアによって提案された[2]。
概要
ホーア論理には、単純な命令型言語の全構成要素についての公理と推論規則が備わっている。当初の論文にあったそれら規則に加えて、ホーアや他の研究者は様々な言語要素に関する規則を開発した。並行性に関する規則、プロシージャに関する規則、分岐に関する規則、ポインタに関する規則などがある。
定義
部分的正当性(partial correctness)
事前条件(precondition) P が成り立つときに、プログラム S を実行して、それが停止した場合においては必ず事後条件(postcondition) Q が成り立つならば、プログラム S は、事前条件 P と事後条件 Q とに関して部分的に正当(partially correct)であると言い[3]、
- P { S } Q
と記述する[4]。ホーアによる元々の記法は上記のものであるが、一般的にはプログラム S の部分正当性は、
- { P } S { Q }
と記述されることが多い[5][6]。
正当性(correctness)
事前条件 P が成り立つときに、プログラム S を実行すると、その実行が必ず終了するならば、プログラム S は、事前条件 P に関して停止する(terminate)と言う[3]。
プログラム S が部分的に正当かつ停止するものであるとき、すなわち、プログラム S が事前条件 P に関して停止し、停止後には必ず事後条件 Q が成り立つならば、プログラム S は、事前条件 P と事後条件 Q とに関して正当(correct)であるという[3]。
部分的正当性の証明体系
(A1) 代入文の公理
- { Q[e/x] }
x:=e
{ Q }
ここで、事前条件の Q[e/x] は置換であり、式 Q の中に出現するすべての x を式 e で置き換えた式を表す。一方で事後条件の Q は代入文実行後(置換ではなく代入を行ったあとの)x の値について式 Q が成り立つことを表す[3]。
したがって、この公理は、
- { Q[e/x] }:式 Q 中の全ての x を e に置換するとき式 Q が成り立つのであれば、
x:=e
:(置換で成り立つならば、ほぼ同じような代入操作でも変わらないはずのため)式 Q 中の x の値を代入 x:=e で変更することで、- { Q }:(置換の場合は成り立っているのであるから x の値が e に変更されたのであれば当然に)代入文実行後の式 Q は成り立つ、
というように読む[7]。
(A2) 空文の公理
空文(skip
文)は、プログラムの状態を変化させないが、これを表すのが空文の公理である。skip
以前に真であったことはそのまま真となる。
- { P } skip { P }
(R1) 複合文の規則
一般に順序的プログラムは機能ごとに分解することができるが、その逆として分解した手続きは複合文として合成することができる。以下の複合文の規則は分解したプログラムが中間条件 R を介することで元の機能に合成されることを表している[8]。
{ P } S1 { R } , { R } S2 { Q } | |
{ P } S1 ; S2 { Q } |
(R2) if文の規則
{ P ∧ B } S1 { Q } , { P ∧ ¬B } S2 { Q } | |
{ P } If B Then S1 else S2 End { Q } |
{ P ∧ B } S1 { Q } , P ∧ ¬B => Q | |
{ P } If B Then S1 End { Q } |
(R3) while文の規則
{ P ∧ B } S1 { P } | |
{ P } While B Do S1 End { P ∧ ¬B } |
ここで、P はループ不変条件である[9]。
(R4) 帰結の規則
P => P1 , { P1 } S { Q1 } , Q1 => Q | |
{ P } S { Q } |
例
例 1 (代入の公理) (結果規則) 例 2 (代入の公理) ( ここで x と N は整数型) (結果規則)
脚注
- ^ Floyd(1967)
- ^ Hoare(1969)
このような経緯から、フロイド−ホーア論理(Floyd-Hoare Logic)とも呼ばれる。荒木・張(2002) p.23 - ^ a b c d 荒木・張(2002) p.7
- ^ これをホーアの三つ組(Hoare triple)と呼ぶこともある。
- ^ これは、ホーアの共同研究者であったニクラウス・ヴィルトが開発したプログラミング言語のPascalのコメント記法に由来していると考えられる。系統的(1986)
- ^ 部分的正当性に関するホーア論理では、プログラムの完了を示すことができない。もしプログラム S が完了しなければ事後条件の Q は意味を成さない。そのような事情から事後条件 Q を偽の値である false とすることで完了しないプログラムを
- { P } S { false }
- ^ 正しい Triple の例:
- ^ 例えば、次の2つの代入を考えてみよう。
- ^ なお、完全正当性のための While 規則としては以下のようになる。
参考文献
- Robert D. Tennent: "Specifying Software" (ホーア論理を紹介している最近の教科書) ISBN 0-521-00401-2
- 荒木 啓二郎, 張 漢明『プログラム仕様記述論』オーム社〈IT Text〉、2002年。
- 林 晋『プログラム検証論』共立出版〈情報数学講座〉、1995年。
- 木村 泉, 米澤 明憲『算法表現論』岩波書店〈岩波講座 情報科学〉、1982年。
- R. W. Floyd (1967), “Assigning meanings to programs”, Proceedings of the American Mathematical Society Symposia on Applied Mathematics 19: 19–31, http://www.cs.virginia.edu/~weimer/2007-615/reading/FloydMeaning.pdf
- C. A. R. Hoare (1969), “An axiomatic basis for computer programming”, Communications of the ACM 12(10): 576-580,583, doi:10.1145/363235.363259, http://sunnyday.mit.edu/16.355/Hoare-CACM-69.pdf
- N. Wirth 著、野下 浩平, 筧 捷彦, 武市 正人 訳『系統的プログラミング入門』(第2版補訂)近代科学社、1986年。
- ロバート B. アンダスン 著、有澤 誠 訳『演習 プログラムの証明』近代科学社〈ソフトウェア工学ライブラリ〉、1980年。
関連項目
- 構造化プログラミング - 公理的意味論 - プログラム検証
- 第一階述語論理 - 自然演繹
- Pascal
- Communicating Sequential Processes
- 契約による設計
- 述語変換意味論
- 静的コード解析
- カリー・ハワード同型対応 - マーティン=レーフの型理論(表明の代わりに型を利用したもの)
関連人物
外部リンク
- KeY-Hoare - KeY という定理証明機上に構築された半自動検証システムで、ホーア論理を散りいれている。
- j-Algo-modul Hoare calculus — アルゴリズム視覚化プログラム j-Algo におけるホーア論理視覚化モジュール