More Related Content
Similar to Design by contractとホーア論理
Similar to Design by contractとホーア論理 (14)
More from Takuya Matsunaga
More from Takuya Matsunaga (11)
Design by contractとホーア論理
- 2. 自己紹介
ハンドルネーム
• 正式には「kmt-t」
• はてなID : kmt-t2
• Twitter ID : kmt_t
居住地
• 大阪に「出稼ぎ」中です
• 鳥取に帰ろうとしてその度に阻止されています…orz
属性など
• いわゆる「組み込み屋」です
• 言語的にはC/C++/C#
• ミドルウェア(2D/3Dグラフィックス、ファイルシステムなど)
1
- 4. Design by Contractとは
事前条件
• ある手続きが事前に満たすべき条件
事後条件
• ある手続きが事後に満たすべき条件
不変条件
• ある手続きが常に満たすべき条件
以上の条件を満たすことをプログラム上に記述する
• C/C++ではAssertで記述することが多い
• Eiffelでは言語でサポートしているらしい (触ったことありません)
• ちょっと遠いところではUMLのユースケース記述でも同じような記述をするよね?
3
- 5. Design by Contractの効果
仕様を明確にする
• 処理の実装者側と利用者側とでコミュニケーションミスを減らす
実装のバグを検出する
• 事前条件を満たすのに事後条件を満たさないのは仕様か実装のバグ
利用者のバグを検出する
• ある手続きを利用するのに事前条件を満たしていないのは利用者のバグ
オブジェクト指向言語でのインターフェイスにおいて効果大
• インターフェイスは、型以外の正しさの基準の情報がない
• Design by Contractを適用すれば、実装者、利用者に正しさの基準を提供できる
4
- 6. ちょっと数学的な例 – 事前条件
平方根を計算する関数𝑠𝑞𝑟𝑡
• 関数𝑠𝑞𝑟𝑡は正の整数しか引数に取れない
• 「引数として正の整数を与えること」が事前条件になる
• 事前条件を満たさない場合の動作は未定義で問題ない
ちょっとだけ数学用語の確認
• y = 𝑠𝑞𝑟𝑡 𝑥 , 𝑥 ∈ 𝑋, 𝑦 ∈ 𝑌
• 集合𝑋を関数𝑠𝑞𝑟𝑡の定義域(domain) と呼ぶ
• 集合𝑌を関数𝑠𝑞𝑟𝑡の値域 (codomain) と呼ぶ
• この例の事前条件は「引数が定義域の集合に含まれているか」
5
- 7. ちょっと数学的な例 – 事後条件
平方根を計算する関数𝑠𝑞𝑟𝑡
• 関数𝑠𝑞𝑟𝑡の戻り値は必ず正の整数
• 「戻り値は必ず正」が事後条件になる
• 関数𝑠𝑞𝑟𝑡が事後条件を満たさない場合、バグである
• 実際のプログラムでは事後条件は戻り値のみに適用されるわけではないのに注意
ちょっとだけ数学的な表現にすると
• この例の事後条件は「戻り値が値域の集合に含まれているか」
6
- 9. Design by Contractのバックグラウンド
Design by Contractは形式仕様記述をカジュアルにしたもの
• Design by Contractは経験則から導かれたものではない
• Design by Contractは数学的なバックグラウンドを持つ
• Design by Contractはホーア論理 (または公理的意味論) をベースにした形式仕
様記述をカジュアル化したもの
形式仕様記述とは
• ある決まった規則を適用することができる手法を形式手法と言う
– 人間よりコンピュータで処理しやすい場合が比較的多い
• ここで言うホーア論理をベースとした形式仕様記述では仕様 (事前条件、事後条件、
不変条件) を満たすことを証明することで、プログラムの正当性を証明できる
• ホーア論理をベースとした形式仕様記述の言語の例
– Z言語
– VDM/VDM SL/VDM++
– OCL (UMLの仕様に含まれる、形式仕様記述言語)
8
- 10. プログラムの正しさとは?
プログラムの正しさとは相対的なもの
• プログラムの正しさとは、正しさの基準 (一般的には仕様と呼ぶ) に対して合致して
いるかどうかで決まる
正しさと仕様の例
• 関数𝑠𝑜𝑟𝑡の仕様を考えてみる
• 以下の仕様を見たす実装としてはクイックソート、マージソートどちらでも良い
– 事後条件として配列の前の要素より後の要素のほうが必ず値が大きい
• しかし以下の仕様を満たすのはマージソートであり、クイックソートではない
– 事後条件として配列の前の要素より後の要素のほうが必ず値が大きい
– 事後条件として整列の結果が安定でなければならない
• このようにプログラムの正しさとは仕様で決まる
9
- 11. ホーア論理とは
考案者はアントニー・ホーアさん
• 一番有名なのはクイックソートの発明者
• CSP (Communicating Sequential Processes) の考案者
ホーア論理とは
• プログラムの正しさの基準 (仕様) を提供するための論理
• 事前条件、事後条件が正しさの基準として妥当であることが帰納法をつかって数学
的に証明されている
帰納法とは
• ある起点となる論理から再帰的に別の論理が正しいことを示す証明方法
• 髪の毛ゼロ本の人はハゲである、ハゲの人より髪の毛一本多い人もハゲである、
よってすべての人はハゲである、というジョークが帰納法
10
- 12. ここで簡単な論理式の記法のおさらい
以下の論理式は押さえておく
• 命題論理
– 「 𝐴ではない」の場合、以下のように書く
¬A
– 「𝐴または𝐵」の場合、以下のように書く
𝐴⋁𝐵
– 「𝐴かつ𝐵」の場合、以下のように書く
𝐴∧ 𝐵
– 「𝐴ならば𝐵」の場合、以下のように書く
𝐴→ 𝐵
• 述語論理
– 「𝑥について述語𝑃が成り立つ」場合、以下のように書く
𝑃(𝑥)
11
- 13. ここで簡単な論理式の記法のおさらい
以下の論理式は押さえておく
• 集合
– 「集合𝐴のすべての要素について述語𝑃は真である」場合
∀𝑥 ∈ 𝐴, 𝑃(𝑥)
– 「集合𝐴のいずれかの要素について述語𝑃が真である」場合
∃𝑥 ∈ 𝐴, 𝑃(𝑥)
• 代入
– 「論理式𝑃のすべての自由変項𝑥を式𝐸で置き換える」場合
𝑃[𝑥 𝐸 ]
• 演繹
– 「前提𝑃 → 𝑄, 𝑄 → 𝑅が成り立つとき、結論𝑃 → 𝑅が成り立つ」場合
𝑃 → 𝑄, 𝑄 → 𝑅
𝑃→ 𝑅
12
- 16. 空文の公理
空文の公理とは
𝑃 𝑝𝑎𝑠𝑠 {𝑃}
• 空文は前提条件なしに事前条件および事後条件として同じ論理式𝑃を表明できる
15
- 17. 代入の公理
代入の公理とは
𝑃 𝑥 𝐸 𝑥 ≔ 𝐸 {𝑃}
• 前提なしで上記のHoare Tripleが成り立つ
具体例
• 論理式𝑃には論理式y = 43, 𝑥 = 42が含まれていることとする
• 変項𝑦に𝑥 + 1を代入すると以下の様なHoare Tripleとなる
𝑥 + 1 = 43 ∧ 𝑥 = 42 𝑦 ≔ 𝑥 + 1 𝑦 = 43 ∧ 𝑥 = 42
• 事後条件の変項𝑦が事前条件では式𝑥 + 1に置き換えられている
16
- 18. 逐次規則
逐次規則とは
𝑃 𝑆 𝑄 , 𝑄 𝑇 {𝑅}
𝑃 𝑆; 𝑇 {𝑅}
• ふたつ手続きが続けて実行される場合、最初の式の事前条件Pと後の式の事後条
件𝑅を複合文の事前条件、事後条件として表明できる
具体例
𝑥 + 1 = 43 𝑦: = 𝑥 + 1 𝑦 = 43 , 𝑦 = 43 𝑧: = 𝑦 {𝑧 = 43}
𝑥 + 1 = 43 𝑦: = 𝑥 + 1; 𝑧: = 𝑦 {𝑧 = 43}
17
- 19. 条件規則
条件規則とは
𝐵 ∧ 𝑃 𝑆 𝑄 , ¬𝐵 ∧ 𝑃 𝑇 {𝑄}
𝑃 𝑖𝑓 𝐵 𝑡ℎ𝑒𝑛 𝑆 𝑒𝑙𝑠𝑒 𝑇 𝑒𝑛𝑑𝑖𝑓 {𝑄}
• 条件𝐵が成り立つ場合は手続きS、成り立たない場合は手続き𝑇となる
• ただしどちらでも事前条件𝑃と事後条件𝑄を表明できる
18
- 20. While規則
While規則とは
𝑃∧ 𝐵 𝑆 𝑃
𝑃 𝑤ℎ𝑖𝑙𝑒 𝐵 𝑑𝑜 𝑆 𝑑𝑜𝑛𝑒 {¬𝐵 ∧ 𝑃}
• 手続き𝑆を論理式𝐵が成り立つ間繰り返す
• 繰り返しが終了すると¬𝐵となる
19
- 21. 結果規則
結果規則とは
𝑃′ → 𝑃, 𝑃 𝑆 𝑄 , 𝑄 → 𝑄′
𝑃′ 𝑆 {𝑄′ }
• 論理包含によって事前条件を制限、事後条件を拡張することができる
P Q’
P’ Q
S
20
- 23. 完全正当性のためのWhile規則
部分的正当性の証明
• 今まで説明した公理と規則では、実はプログラムが停止しない場合、正しさの証明
ができない
• そのため今までの公理と規則で証明した場合、「部分的正当性の証明」と呼ぶ
完全正当性の証明
• 完全正当性の証明には「ループごとに絶対に減少するカウンタ」をWhile規則に組
み込むことでプログラムが確実に終了することを示す
𝑃∧ 𝐵∧ 𝑡= 𝑧 𝑆 𝑃∧ 𝑡< 𝑧 , 𝑃→ 𝑡≥0
𝑃 𝑤ℎ𝑖𝑙𝑒 𝐵 𝑑𝑜 𝑆 𝑑𝑜𝑛𝑒 {¬𝐵 ∧ 𝑃}
• ただしこの規則を導入したプログラムはチューリング完全ではなくなる
• 完全なプログラムの停止性は証明不可能なので、どちらを取るかになる
22
- 25. UMLにおけるホーア論理
OCL
• UMLにおける形式仕様記述言語
• 事前条件、事後条件、不変条件を記述する
• http://ja.wikipedia.org/wiki/Object_Constraint_Language
特徴
• 副作用がない
• 宣言的である
• 関数型プログラマの人にはとっつきやすいと思われる
応用されている分野
• MDAでは構成要素として利用されている様子
24
- 27. 今日の発表の教科書など
プログラム仕様記述論
• 形式仕様記述の教科書で非常に平易でわかりやすい
• 入門書としてはお勧め
• 荒木啓二郎 張漢明
• ISBN : 4-274-13263-3
ソフトウェア開発のモデル化技法
• VDM-SLの実際に適用するケーススタディの本
• ジョン・フィッツジェラルド ペーター・ゴルム ラーセン
• ISBN : 4-00-005609-3
• 新しめの本としては「VDM++による形式仕様記述(ISBN : 4764904098)」なども
26