SlideShare a Scribd company logo
1 of 28
Download to read offline
Design by Contractと
    ホーア論理
     Presenter : kmt-t
自己紹介
ハンドルネーム
•   正式には「kmt-t」
•   はてなID : kmt-t2
•   Twitter ID : kmt_t


居住地
•   大阪に「出稼ぎ」中です
•   鳥取に帰ろうとしてその度に阻止されています…orz

属性など
•   いわゆる「組み込み屋」です
•   言語的にはC/C++/C#
•   ミドルウェア(2D/3Dグラフィックス、ファイルシステムなど)



                                      1
Design by Contractを知っていますか?
知っている人は挙手!




                              2
Design by Contractとは
事前条件
•   ある手続きが事前に満たすべき条件

事後条件
•   ある手続きが事後に満たすべき条件

不変条件
•   ある手続きが常に満たすべき条件

以上の条件を満たすことをプログラム上に記述する
•   C/C++ではAssertで記述することが多い
•   Eiffelでは言語でサポートしているらしい (触ったことありません)
•   ちょっと遠いところではUMLのユースケース記述でも同じような記述をするよね?




                                             3
Design by Contractの効果
仕様を明確にする
•   処理の実装者側と利用者側とでコミュニケーションミスを減らす

実装のバグを検出する
•   事前条件を満たすのに事後条件を満たさないのは仕様か実装のバグ

利用者のバグを検出する
•   ある手続きを利用するのに事前条件を満たしていないのは利用者のバグ

オブジェクト指向言語でのインターフェイスにおいて効果大
•   インターフェイスは、型以外の正しさの基準の情報がない
•   Design by Contractを適用すれば、実装者、利用者に正しさの基準を提供できる




                                                    4
ちょっと数学的な例 – 事前条件
平方根を計算する関数𝑠𝑞𝑟𝑡
•   関数𝑠𝑞𝑟𝑡は正の整数しか引数に取れない



•   「引数として正の整数を与えること」が事前条件になる
•   事前条件を満たさない場合の動作は未定義で問題ない

ちょっとだけ数学用語の確認
•   y = 𝑠𝑞𝑟𝑡 𝑥 , 𝑥 ∈ 𝑋, 𝑦 ∈ 𝑌
•   集合𝑋を関数𝑠𝑞𝑟𝑡の定義域(domain) と呼ぶ
•   集合𝑌を関数𝑠𝑞𝑟𝑡の値域 (codomain) と呼ぶ
•   この例の事前条件は「引数が定義域の集合に含まれているか」




                                   5
ちょっと数学的な例 – 事後条件
平方根を計算する関数𝑠𝑞𝑟𝑡
•   関数𝑠𝑞𝑟𝑡の戻り値は必ず正の整数



•   「戻り値は必ず正」が事後条件になる
•   関数𝑠𝑞𝑟𝑡が事後条件を満たさない場合、バグである
•   実際のプログラムでは事後条件は戻り値のみに適用されるわけではないのに注意

ちょっとだけ数学的な表現にすると
•   この例の事後条件は「戻り値が値域の集合に含まれているか」




                                           6
ちょっと数学的な例 – 不変条件
プリペイドカードを定義するPrepaid型
•   残高はマイナスにならない
•   残高は100円単位でしか使用できない
•   残高は最大で50000円までしかチャージできない
•   以上は不変条件として定義することができる

型の取りうる値を定義

•   この例では型の取りうる値を定義している
•   本来は言語組み込み型の値が実際に取りうる値と一致することは稀




                                     7
Design by Contractのバックグラウンド
Design by Contractは形式仕様記述をカジュアルにしたもの
•   Design by Contractは経験則から導かれたものではない
•   Design by Contractは数学的なバックグラウンドを持つ
•   Design by Contractはホーア論理 (または公理的意味論) をベースにした形式仕
    様記述をカジュアル化したもの

形式仕様記述とは

•   ある決まった規則を適用することができる手法を形式手法と言う
     – 人間よりコンピュータで処理しやすい場合が比較的多い
•   ここで言うホーア論理をベースとした形式仕様記述では仕様 (事前条件、事後条件、
    不変条件) を満たすことを証明することで、プログラムの正当性を証明できる
•   ホーア論理をベースとした形式仕様記述の言語の例
     – Z言語
     – VDM/VDM SL/VDM++
     – OCL (UMLの仕様に含まれる、形式仕様記述言語)

                                                      8
プログラムの正しさとは?
プログラムの正しさとは相対的なもの
•   プログラムの正しさとは、正しさの基準 (一般的には仕様と呼ぶ) に対して合致して
    いるかどうかで決まる

正しさと仕様の例
•   関数𝑠𝑜𝑟𝑡の仕様を考えてみる
•   以下の仕様を見たす実装としてはクイックソート、マージソートどちらでも良い
     – 事後条件として配列の前の要素より後の要素のほうが必ず値が大きい
•   しかし以下の仕様を満たすのはマージソートであり、クイックソートではない
     – 事後条件として配列の前の要素より後の要素のほうが必ず値が大きい
     – 事後条件として整列の結果が安定でなければならない
•   このようにプログラムの正しさとは仕様で決まる




                                               9
ホーア論理とは
考案者はアントニー・ホーアさん
•   一番有名なのはクイックソートの発明者
•   CSP (Communicating Sequential Processes) の考案者




ホーア論理とは
•   プログラムの正しさの基準 (仕様) を提供するための論理
•   事前条件、事後条件が正しさの基準として妥当であることが帰納法をつかって数学
    的に証明されている

帰納法とは
•   ある起点となる論理から再帰的に別の論理が正しいことを示す証明方法
•   髪の毛ゼロ本の人はハゲである、ハゲの人より髪の毛一本多い人もハゲである、
    よってすべての人はハゲである、というジョークが帰納法


                                                    10
ここで簡単な論理式の記法のおさらい
以下の論理式は押さえておく
•   命題論理
    – 「 𝐴ではない」の場合、以下のように書く
                     ¬A
    – 「𝐴または𝐵」の場合、以下のように書く
                    𝐴⋁𝐵
    – 「𝐴かつ𝐵」の場合、以下のように書く
                    𝐴∧ 𝐵
    – 「𝐴ならば𝐵」の場合、以下のように書く
                   𝐴→ 𝐵
•   述語論理
    – 「𝑥について述語𝑃が成り立つ」場合、以下のように書く
                    𝑃(𝑥)


                                   11
ここで簡単な論理式の記法のおさらい
以下の論理式は押さえておく
• 集合
    – 「集合𝐴のすべての要素について述語𝑃は真である」場合
                  ∀𝑥 ∈ 𝐴, 𝑃(𝑥)
    – 「集合𝐴のいずれかの要素について述語𝑃が真である」場合
                   ∃𝑥 ∈ 𝐴, 𝑃(𝑥)
•   代入
    – 「論理式𝑃のすべての自由変項𝑥を式𝐸で置き換える」場合
                       𝑃[𝑥 𝐸 ]
•   演繹
    – 「前提𝑃 → 𝑄, 𝑄 → 𝑅が成り立つとき、結論𝑃 → 𝑅が成り立つ」場合
                   𝑃 → 𝑄, 𝑄 → 𝑅
                      𝑃→ 𝑅


                                               12
Hoare Triple
Hoare Tripleとは論理式でホーア論理を記述したもの
•   Hoare Tripleの書き方
                       𝑃 𝐶 𝑄
     – 𝑃は事前条件
     – 𝑄は事後条件
     – 𝐶はコード
•   Hoare Tripleにより事前条件、事後条件を論理式で表せる




                                       13
ホーア論理を構成する公理と規則
ホーア論理は以下の公理と規則で構成されている
•   空文の公理
•   代入の公理
•   逐次規則
•   条件規則
•   While規則
•   結果規則




                         14
空文の公理
空文の公理とは


                  𝑃 𝑝𝑎𝑠𝑠 {𝑃}
•   空文は前提条件なしに事前条件および事後条件として同じ論理式𝑃を表明できる




                                           15
代入の公理
代入の公理とは


                     𝑃 𝑥 𝐸   𝑥 ≔ 𝐸 {𝑃}
•   前提なしで上記のHoare Tripleが成り立つ

具体例
•   論理式𝑃には論理式y = 43, 𝑥 = 42が含まれていることとする
•   変項𝑦に𝑥 + 1を代入すると以下の様なHoare Tripleとなる
       𝑥 + 1 = 43 ∧ 𝑥 = 42 𝑦 ≔ 𝑥 + 1 𝑦 = 43 ∧ 𝑥 = 42
•   事後条件の変項𝑦が事前条件では式𝑥 + 1に置き換えられている




                                                       16
逐次規則
逐次規則とは
                      𝑃 𝑆 𝑄 , 𝑄 𝑇 {𝑅}
                         𝑃 𝑆; 𝑇 {𝑅}
•   ふたつ手続きが続けて実行される場合、最初の式の事前条件Pと後の式の事後条
    件𝑅を複合文の事前条件、事後条件として表明できる

具体例

    𝑥 + 1 = 43 𝑦: = 𝑥 + 1 𝑦 = 43 , 𝑦 = 43 𝑧: = 𝑦 {𝑧 = 43}
             𝑥 + 1 = 43 𝑦: = 𝑥 + 1; 𝑧: = 𝑦 {𝑧 = 43}




                                                            17
条件規則
条件規則とは
               𝐵 ∧ 𝑃 𝑆 𝑄 , ¬𝐵 ∧ 𝑃 𝑇 {𝑄}
             𝑃 𝑖𝑓 𝐵 𝑡ℎ𝑒𝑛 𝑆 𝑒𝑙𝑠𝑒 𝑇 𝑒𝑛𝑑𝑖𝑓 {𝑄}
•   条件𝐵が成り立つ場合は手続きS、成り立たない場合は手続き𝑇となる
•   ただしどちらでも事前条件𝑃と事後条件𝑄を表明できる




                                              18
While規則
While規則とは
                       𝑃∧ 𝐵 𝑆 𝑃
             𝑃   𝑤ℎ𝑖𝑙𝑒 𝐵 𝑑𝑜 𝑆 𝑑𝑜𝑛𝑒 {¬𝐵 ∧ 𝑃}
•   手続き𝑆を論理式𝐵が成り立つ間繰り返す
•   繰り返しが終了すると¬𝐵となる




                                              19
結果規則
結果規則とは
              𝑃′ → 𝑃, 𝑃 𝑆 𝑄 , 𝑄 → 𝑄′
                      𝑃′ 𝑆 {𝑄′ }

•   論理包含によって事前条件を制限、事後条件を拡張することができる


         P                             Q’


         P’                            Q
                        S




                                            20
帰納法を使って証明してみる

手続き型言語を構成する制御は、「逐次」「条件」「繰り返し」のみ
•   「逐次」に対応する「逐次規則」
•   「条件」に対応する「条件規則」
•   「繰り返し」に対応する「While規則」
•   公理、規則を帰納的に当てはめることで、ホーア論理でどんなに長いプログラムの
    正当性でも検証できることが証明できる
•   今回は細かい証明は割愛しますが、割りと受け入れやすい結論だと思われる




                                            21
完全正当性のためのWhile規則
部分的正当性の証明
•   今まで説明した公理と規則では、実はプログラムが停止しない場合、正しさの証明
    ができない
•   そのため今までの公理と規則で証明した場合、「部分的正当性の証明」と呼ぶ

完全正当性の証明
•   完全正当性の証明には「ループごとに絶対に減少するカウンタ」をWhile規則に組
    み込むことでプログラムが確実に終了することを示す
          𝑃∧ 𝐵∧ 𝑡= 𝑧 𝑆 𝑃∧ 𝑡< 𝑧 , 𝑃→ 𝑡≥0
             𝑃 𝑤ℎ𝑖𝑙𝑒 𝐵 𝑑𝑜 𝑆 𝑑𝑜𝑛𝑒 {¬𝐵 ∧ 𝑃}
•   ただしこの規則を導入したプログラムはチューリング完全ではなくなる
•   完全なプログラムの停止性は証明不可能なので、どちらを取るかになる




                                              22
ホーア論理を満たしていることを示す方法
プログラムがホーア論理を満たしていることを示す方法
•       方法はふたつ
         1. 定理証明器 (Coqなど) などを使って証明する
         2. テストをする

証明する方法
•       プログラムが正しいことが証明でき、間違いがない
•       自明なプログラムが証明が簡単とは限らない
•       普通の感覚では証明のコストが高すぎる

    テストする方法
    •   現実的な方法だが、テスト条件でバグがないことしか検査できない



                                         23
UMLにおけるホーア論理
OCL
•   UMLにおける形式仕様記述言語
•   事前条件、事後条件、不変条件を記述する
•   http://ja.wikipedia.org/wiki/Object_Constraint_Language

特徴
•   副作用がない
•   宣言的である
•   関数型プログラマの人にはとっつきやすいと思われる

応用されている分野
•   MDAでは構成要素として利用されている様子




                                                              24
ホーア論理の応用範囲
要件定義から詳細設計、実装まで
•   ホーア論理の応用範囲は詳細設計、実装にとどまらない
•   要件定義の段階から仕様の矛盾、コミュニケーションミスを減らすために使える




                                           25
今日の発表の教科書など
プログラム仕様記述論
•   形式仕様記述の教科書で非常に平易でわかりやすい
•   入門書としてはお勧め
•   荒木啓二郎 張漢明
•   ISBN : 4-274-13263-3



                            ソフトウェア開発のモデル化技法
             •   VDM-SLの実際に適用するケーススタディの本
             •   ジョン・フィッツジェラルド ペーター・ゴルム ラーセン
             •   ISBN : 4-00-005609-3


•   新しめの本としては「VDM++による形式仕様記述(ISBN : 4764904098)」なども



                                                      26
ご清聴ありがとうございました




                 27

More Related Content

What's hot

分散システムについて語らせてくれ
分散システムについて語らせてくれ分散システムについて語らせてくれ
分散システムについて語らせてくれKumazaki Hiroki
 
20分くらいでわかった気分になれるC++20コルーチン
20分くらいでわかった気分になれるC++20コルーチン20分くらいでわかった気分になれるC++20コルーチン
20分くらいでわかった気分になれるC++20コルーチンyohhoy
 
NLP2019 松田寛 - GiNZA
NLP2019 松田寛 - GiNZANLP2019 松田寛 - GiNZA
NLP2019 松田寛 - GiNZAMegagon Labs
 
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~Takuya Akiba
 
BuildKitによる高速でセキュアなイメージビルド
BuildKitによる高速でセキュアなイメージビルドBuildKitによる高速でセキュアなイメージビルド
BuildKitによる高速でセキュアなイメージビルドAkihiro Suda
 
暗号文のままで計算しよう - 準同型暗号入門 -
暗号文のままで計算しよう - 準同型暗号入門 -暗号文のままで計算しよう - 準同型暗号入門 -
暗号文のままで計算しよう - 準同型暗号入門 -MITSUNARI Shigeo
 
続・モジュール / Introduction to C++ modules (part 2)
続・モジュール / Introduction to C++ modules (part 2)続・モジュール / Introduction to C++ modules (part 2)
続・モジュール / Introduction to C++ modules (part 2)TetsuroMatsumura
 
SAT/SMTソルバの仕組み
SAT/SMTソルバの仕組みSAT/SMTソルバの仕組み
SAT/SMTソルバの仕組みMasahiro Sakai
 
プログラミングコンテストでの動的計画法
プログラミングコンテストでの動的計画法プログラミングコンテストでの動的計画法
プログラミングコンテストでの動的計画法Takuya Akiba
 
暗号技術の実装と数学
暗号技術の実装と数学暗号技術の実装と数学
暗号技術の実装と数学MITSUNARI Shigeo
 
マーク&スイープ勉強会
マーク&スイープ勉強会マーク&スイープ勉強会
マーク&スイープ勉強会7shi
 
Deflate
DeflateDeflate
Deflate7shi
 
YoctoをつかったDistroの作り方とハマり方
YoctoをつかったDistroの作り方とハマり方YoctoをつかったDistroの作り方とハマり方
YoctoをつかったDistroの作り方とハマり方wata2ki
 
不遇の標準ライブラリ - valarray
不遇の標準ライブラリ - valarray不遇の標準ライブラリ - valarray
不遇の標準ライブラリ - valarrayRyosuke839
 

What's hot (20)

入門 シェル実装
入門 シェル実装入門 シェル実装
入門 シェル実装
 
分散システムについて語らせてくれ
分散システムについて語らせてくれ分散システムについて語らせてくれ
分散システムについて語らせてくれ
 
20分くらいでわかった気分になれるC++20コルーチン
20分くらいでわかった気分になれるC++20コルーチン20分くらいでわかった気分になれるC++20コルーチン
20分くらいでわかった気分になれるC++20コルーチン
 
Marp Tutorial
Marp TutorialMarp Tutorial
Marp Tutorial
 
NLP2019 松田寛 - GiNZA
NLP2019 松田寛 - GiNZANLP2019 松田寛 - GiNZA
NLP2019 松田寛 - GiNZA
 
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~
 
BuildKitによる高速でセキュアなイメージビルド
BuildKitによる高速でセキュアなイメージビルドBuildKitによる高速でセキュアなイメージビルド
BuildKitによる高速でセキュアなイメージビルド
 
暗号文のままで計算しよう - 準同型暗号入門 -
暗号文のままで計算しよう - 準同型暗号入門 -暗号文のままで計算しよう - 準同型暗号入門 -
暗号文のままで計算しよう - 準同型暗号入門 -
 
続・モジュール / Introduction to C++ modules (part 2)
続・モジュール / Introduction to C++ modules (part 2)続・モジュール / Introduction to C++ modules (part 2)
続・モジュール / Introduction to C++ modules (part 2)
 
SAT/SMTソルバの仕組み
SAT/SMTソルバの仕組みSAT/SMTソルバの仕組み
SAT/SMTソルバの仕組み
 
プログラミングコンテストでの動的計画法
プログラミングコンテストでの動的計画法プログラミングコンテストでの動的計画法
プログラミングコンテストでの動的計画法
 
明日使えないすごいビット演算
明日使えないすごいビット演算明日使えないすごいビット演算
明日使えないすごいビット演算
 
暗号技術の実装と数学
暗号技術の実装と数学暗号技術の実装と数学
暗号技術の実装と数学
 
マーク&スイープ勉強会
マーク&スイープ勉強会マーク&スイープ勉強会
マーク&スイープ勉強会
 
Deflate
DeflateDeflate
Deflate
 
Marp入門
Marp入門Marp入門
Marp入門
 
Oss貢献超入門
Oss貢献超入門Oss貢献超入門
Oss貢献超入門
 
Raspberry Piで始める自宅サーバー超入門
Raspberry Piで始める自宅サーバー超入門Raspberry Piで始める自宅サーバー超入門
Raspberry Piで始める自宅サーバー超入門
 
YoctoをつかったDistroの作り方とハマり方
YoctoをつかったDistroの作り方とハマり方YoctoをつかったDistroの作り方とハマり方
YoctoをつかったDistroの作り方とハマり方
 
不遇の標準ライブラリ - valarray
不遇の標準ライブラリ - valarray不遇の標準ライブラリ - valarray
不遇の標準ライブラリ - valarray
 

Similar to Design by contractとホーア論理

エンジニア目線で見る TLA+ と PlusCal - TAKAMI Torao
エンジニア目線で見る TLA+ と PlusCal - TAKAMI Toraoエンジニア目線で見る TLA+ と PlusCal - TAKAMI Torao
エンジニア目線で見る TLA+ と PlusCal - TAKAMI ToraoTorao Takami
 
Javaプログラミング入門【第2回】
Javaプログラミング入門【第2回】Javaプログラミング入門【第2回】
Javaプログラミング入門【第2回】Yukiko Kato
 
並行計算の実践と理論
並行計算の実践と理論並行計算の実践と理論
並行計算の実践と理論gotoloop
 
Hyperoptとその周辺について
Hyperoptとその周辺についてHyperoptとその周辺について
Hyperoptとその周辺についてKeisuke Hosaka
 
NIPS KANSAI Reading Group #7: Temporal Difference Models: Model-Free Deep RL ...
NIPS KANSAI Reading Group #7: Temporal Difference Models: Model-Free Deep RL ...NIPS KANSAI Reading Group #7: Temporal Difference Models: Model-Free Deep RL ...
NIPS KANSAI Reading Group #7: Temporal Difference Models: Model-Free Deep RL ...Eiji Uchibe
 
2018年度 若手技術者向け講座 リファクタリング
2018年度 若手技術者向け講座 リファクタリング2018年度 若手技術者向け講座 リファクタリング
2018年度 若手技術者向け講座 リファクタリングkeki3
 
Kink: invokedynamic on a prototype-based language
Kink: invokedynamic on a prototype-based languageKink: invokedynamic on a prototype-based language
Kink: invokedynamic on a prototype-based languageTaku Miyakawa
 
AgileTourOsaka2011 関係者に理解してもらえるアジャイル開発にむけて
AgileTourOsaka2011 関係者に理解してもらえるアジャイル開発にむけてAgileTourOsaka2011 関係者に理解してもらえるアジャイル開発にむけて
AgileTourOsaka2011 関係者に理解してもらえるアジャイル開発にむけてShuji Morisaki
 
cp-5. 繰り返し計算
cp-5. 繰り返し計算cp-5. 繰り返し計算
cp-5. 繰り返し計算kunihikokaneko1
 
量子コンピュータで金融計算
量子コンピュータで金融計算量子コンピュータで金融計算
量子コンピュータで金融計算Kenji Tanaka
 
CRF を使った Web 本文抽出
CRF を使った Web 本文抽出CRF を使った Web 本文抽出
CRF を使った Web 本文抽出Shuyo Nakatani
 
Interpretable sequence learning for covid-19 forecasting
Interpretable sequence learning for covid-19 forecastingInterpretable sequence learning for covid-19 forecasting
Interpretable sequence learning for covid-19 forecastingMorpho, Inc.
 
強化学習勉強会・論文紹介(第30回)Ensemble Contextual Bandits for Personalized Recommendation
強化学習勉強会・論文紹介(第30回)Ensemble Contextual Bandits for Personalized Recommendation強化学習勉強会・論文紹介(第30回)Ensemble Contextual Bandits for Personalized Recommendation
強化学習勉強会・論文紹介(第30回)Ensemble Contextual Bandits for Personalized RecommendationNaoki Nishimura
 

Similar to Design by contractとホーア論理 (14)

C言語講習会2
C言語講習会2C言語講習会2
C言語講習会2
 
エンジニア目線で見る TLA+ と PlusCal - TAKAMI Torao
エンジニア目線で見る TLA+ と PlusCal - TAKAMI Toraoエンジニア目線で見る TLA+ と PlusCal - TAKAMI Torao
エンジニア目線で見る TLA+ と PlusCal - TAKAMI Torao
 
Javaプログラミング入門【第2回】
Javaプログラミング入門【第2回】Javaプログラミング入門【第2回】
Javaプログラミング入門【第2回】
 
並行計算の実践と理論
並行計算の実践と理論並行計算の実践と理論
並行計算の実践と理論
 
Hyperoptとその周辺について
Hyperoptとその周辺についてHyperoptとその周辺について
Hyperoptとその周辺について
 
NIPS KANSAI Reading Group #7: Temporal Difference Models: Model-Free Deep RL ...
NIPS KANSAI Reading Group #7: Temporal Difference Models: Model-Free Deep RL ...NIPS KANSAI Reading Group #7: Temporal Difference Models: Model-Free Deep RL ...
NIPS KANSAI Reading Group #7: Temporal Difference Models: Model-Free Deep RL ...
 
2018年度 若手技術者向け講座 リファクタリング
2018年度 若手技術者向け講座 リファクタリング2018年度 若手技術者向け講座 リファクタリング
2018年度 若手技術者向け講座 リファクタリング
 
Kink: invokedynamic on a prototype-based language
Kink: invokedynamic on a prototype-based languageKink: invokedynamic on a prototype-based language
Kink: invokedynamic on a prototype-based language
 
AgileTourOsaka2011 関係者に理解してもらえるアジャイル開発にむけて
AgileTourOsaka2011 関係者に理解してもらえるアジャイル開発にむけてAgileTourOsaka2011 関係者に理解してもらえるアジャイル開発にむけて
AgileTourOsaka2011 関係者に理解してもらえるアジャイル開発にむけて
 
cp-5. 繰り返し計算
cp-5. 繰り返し計算cp-5. 繰り返し計算
cp-5. 繰り返し計算
 
量子コンピュータで金融計算
量子コンピュータで金融計算量子コンピュータで金融計算
量子コンピュータで金融計算
 
CRF を使った Web 本文抽出
CRF を使った Web 本文抽出CRF を使った Web 本文抽出
CRF を使った Web 本文抽出
 
Interpretable sequence learning for covid-19 forecasting
Interpretable sequence learning for covid-19 forecastingInterpretable sequence learning for covid-19 forecasting
Interpretable sequence learning for covid-19 forecasting
 
強化学習勉強会・論文紹介(第30回)Ensemble Contextual Bandits for Personalized Recommendation
強化学習勉強会・論文紹介(第30回)Ensemble Contextual Bandits for Personalized Recommendation強化学習勉強会・論文紹介(第30回)Ensemble Contextual Bandits for Personalized Recommendation
強化学習勉強会・論文紹介(第30回)Ensemble Contextual Bandits for Personalized Recommendation
 

More from Takuya Matsunaga

光コラボは契約してはいけない
光コラボは契約してはいけない光コラボは契約してはいけない
光コラボは契約してはいけないTakuya Matsunaga
 
ソフトウェア組織マインド
ソフトウェア組織マインドソフトウェア組織マインド
ソフトウェア組織マインドTakuya Matsunaga
 
ある製造業のチームトポロジー
ある製造業のチームトポロジーある製造業のチームトポロジー
ある製造業のチームトポロジーTakuya Matsunaga
 
クリーンアーキテクチャを試してみた
クリーンアーキテクチャを試してみたクリーンアーキテクチャを試してみた
クリーンアーキテクチャを試してみたTakuya Matsunaga
 
組込エンジニアのための深層学習
組込エンジニアのための深層学習組込エンジニアのための深層学習
組込エンジニアのための深層学習Takuya Matsunaga
 
ここが変だよDalvik仮想マシン
ここが変だよDalvik仮想マシン ここが変だよDalvik仮想マシン
ここが変だよDalvik仮想マシン Takuya Matsunaga
 
詳解Dexファイルフォーマット
詳解Dexファイルフォーマット詳解Dexファイルフォーマット
詳解DexファイルフォーマットTakuya Matsunaga
 
Dalvikバイトコードリファレンスの読み方 改訂版
Dalvikバイトコードリファレンスの読み方 改訂版Dalvikバイトコードリファレンスの読み方 改訂版
Dalvikバイトコードリファレンスの読み方 改訂版Takuya Matsunaga
 
Dalvik仮想マシンのアーキテクチャ 改訂版
Dalvik仮想マシンのアーキテクチャ 改訂版Dalvik仮想マシンのアーキテクチャ 改訂版
Dalvik仮想マシンのアーキテクチャ 改訂版Takuya Matsunaga
 

More from Takuya Matsunaga (11)

光コラボは契約してはいけない
光コラボは契約してはいけない光コラボは契約してはいけない
光コラボは契約してはいけない
 
ソフトウェア組織マインド
ソフトウェア組織マインドソフトウェア組織マインド
ソフトウェア組織マインド
 
ある製造業のチームトポロジー
ある製造業のチームトポロジーある製造業のチームトポロジー
ある製造業のチームトポロジー
 
クリーンアーキテクチャを試してみた
クリーンアーキテクチャを試してみたクリーンアーキテクチャを試してみた
クリーンアーキテクチャを試してみた
 
組込エンジニアのための深層学習
組込エンジニアのための深層学習組込エンジニアのための深層学習
組込エンジニアのための深層学習
 
Deep Leaningと超解像
Deep Leaningと超解像Deep Leaningと超解像
Deep Leaningと超解像
 
進化するArt
進化するArt進化するArt
進化するArt
 
ここが変だよDalvik仮想マシン
ここが変だよDalvik仮想マシン ここが変だよDalvik仮想マシン
ここが変だよDalvik仮想マシン
 
詳解Dexファイルフォーマット
詳解Dexファイルフォーマット詳解Dexファイルフォーマット
詳解Dexファイルフォーマット
 
Dalvikバイトコードリファレンスの読み方 改訂版
Dalvikバイトコードリファレンスの読み方 改訂版Dalvikバイトコードリファレンスの読み方 改訂版
Dalvikバイトコードリファレンスの読み方 改訂版
 
Dalvik仮想マシンのアーキテクチャ 改訂版
Dalvik仮想マシンのアーキテクチャ 改訂版Dalvik仮想マシンのアーキテクチャ 改訂版
Dalvik仮想マシンのアーキテクチャ 改訂版
 

Design by contractとホーア論理

  • 1. Design by Contractと ホーア論理 Presenter : kmt-t
  • 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
  • 8. ちょっと数学的な例 – 不変条件 プリペイドカードを定義するPrepaid型 • 残高はマイナスにならない • 残高は100円単位でしか使用できない • 残高は最大で50000円までしかチャージできない • 以上は不変条件として定義することができる 型の取りうる値を定義 • この例では型の取りうる値を定義している • 本来は言語組み込み型の値が実際に取りうる値と一致することは稀 7
  • 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
  • 14. Hoare Triple Hoare Tripleとは論理式でホーア論理を記述したもの • Hoare Tripleの書き方 𝑃 𝐶 𝑄 – 𝑃は事前条件 – 𝑄は事後条件 – 𝐶はコード • Hoare Tripleにより事前条件、事後条件を論理式で表せる 13
  • 15. ホーア論理を構成する公理と規則 ホーア論理は以下の公理と規則で構成されている • 空文の公理 • 代入の公理 • 逐次規則 • 条件規則 • While規則 • 結果規則 14
  • 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
  • 22. 帰納法を使って証明してみる 手続き型言語を構成する制御は、「逐次」「条件」「繰り返し」のみ • 「逐次」に対応する「逐次規則」 • 「条件」に対応する「条件規則」 • 「繰り返し」に対応する「While規則」 • 公理、規則を帰納的に当てはめることで、ホーア論理でどんなに長いプログラムの 正当性でも検証できることが証明できる • 今回は細かい証明は割愛しますが、割りと受け入れやすい結論だと思われる 21
  • 23. 完全正当性のためのWhile規則 部分的正当性の証明 • 今まで説明した公理と規則では、実はプログラムが停止しない場合、正しさの証明 ができない • そのため今までの公理と規則で証明した場合、「部分的正当性の証明」と呼ぶ 完全正当性の証明 • 完全正当性の証明には「ループごとに絶対に減少するカウンタ」をWhile規則に組 み込むことでプログラムが確実に終了することを示す 𝑃∧ 𝐵∧ 𝑡= 𝑧 𝑆 𝑃∧ 𝑡< 𝑧 , 𝑃→ 𝑡≥0 𝑃 𝑤ℎ𝑖𝑙𝑒 𝐵 𝑑𝑜 𝑆 𝑑𝑜𝑛𝑒 {¬𝐵 ∧ 𝑃} • ただしこの規則を導入したプログラムはチューリング完全ではなくなる • 完全なプログラムの停止性は証明不可能なので、どちらを取るかになる 22
  • 24. ホーア論理を満たしていることを示す方法 プログラムがホーア論理を満たしていることを示す方法 • 方法はふたつ 1. 定理証明器 (Coqなど) などを使って証明する 2. テストをする 証明する方法 • プログラムが正しいことが証明でき、間違いがない • 自明なプログラムが証明が簡単とは限らない • 普通の感覚では証明のコストが高すぎる テストする方法 • 現実的な方法だが、テスト条件でバグがないことしか検査できない 23
  • 25. UMLにおけるホーア論理 OCL • UMLにおける形式仕様記述言語 • 事前条件、事後条件、不変条件を記述する • http://ja.wikipedia.org/wiki/Object_Constraint_Language 特徴 • 副作用がない • 宣言的である • 関数型プログラマの人にはとっつきやすいと思われる 応用されている分野 • MDAでは構成要素として利用されている様子 24
  • 26. ホーア論理の応用範囲 要件定義から詳細設計、実装まで • ホーア論理の応用範囲は詳細設計、実装にとどまらない • 要件定義の段階から仕様の矛盾、コミュニケーションミスを減らすために使える 25
  • 27. 今日の発表の教科書など プログラム仕様記述論 • 形式仕様記述の教科書で非常に平易でわかりやすい • 入門書としてはお勧め • 荒木啓二郎 張漢明 • ISBN : 4-274-13263-3 ソフトウェア開発のモデル化技法 • VDM-SLの実際に適用するケーススタディの本 • ジョン・フィッツジェラルド ペーター・ゴルム ラーセン • ISBN : 4-00-005609-3 • 新しめの本としては「VDM++による形式仕様記述(ISBN : 4764904098)」なども 26