Suche senden
Hochladen
Design by contractとホーア論理
•
11 gefällt mir
•
5,121 views
Takuya Matsunaga
Folgen
Melden
Teilen
Melden
Teilen
1 von 28
Jetzt herunterladen
Downloaden Sie, um offline zu lesen
Empfohlen
ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14
Ryo Suzuki
オブジェクト指向できていますか?
オブジェクト指向できていますか?
Moriharu Ohzu
できる!並列・並行プログラミング
できる!並列・並行プログラミング
Preferred Networks
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
Yoshifumi Kawai
C++ ポインタ ブートキャンプ
C++ ポインタ ブートキャンプ
Kohsuke Yuasa
デキるプログラマだけが知っているコードレビュー7つの秘訣
デキるプログラマだけが知っているコードレビュー7つの秘訣
Masahiro Nishimi
関数型プログラミングのデザインパターンひとめぐり
関数型プログラミングのデザインパターンひとめぐり
Kazuyuki TAKASE
Map
Map
kikairoya
Empfohlen
ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14
Ryo Suzuki
オブジェクト指向できていますか?
オブジェクト指向できていますか?
Moriharu Ohzu
できる!並列・並行プログラミング
できる!並列・並行プログラミング
Preferred Networks
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
Yoshifumi Kawai
C++ ポインタ ブートキャンプ
C++ ポインタ ブートキャンプ
Kohsuke Yuasa
デキるプログラマだけが知っているコードレビュー7つの秘訣
デキるプログラマだけが知っているコードレビュー7つの秘訣
Masahiro Nishimi
関数型プログラミングのデザインパターンひとめぐり
関数型プログラミングのデザインパターンひとめぐり
Kazuyuki TAKASE
Map
Map
kikairoya
Riderはいいぞ!
Riderはいいぞ!
UnityTechnologiesJapan002
Unityネイティブプラグインマニアクス #denatechcon
Unityネイティブプラグインマニアクス #denatechcon
DeNA
【Unite Tokyo 2019】Understanding C# Struct All Things
【Unite Tokyo 2019】Understanding C# Struct All Things
UnityTechnologiesJapan002
2018年01月27日 TensorBoardによる学習の可視化
2018年01月27日 TensorBoardによる学習の可視化
aitc_jp
ライブラリ作成のすゝめ - 事例から見る個人OSS開発の効能
ライブラリ作成のすゝめ - 事例から見る個人OSS開発の効能
Yoshifumi Kawai
ゴリラテスト モバイルゲームのUIを自動的に検出・操作する モンキーテスト
ゴリラテスト モバイルゲームのUIを自動的に検出・操作する モンキーテスト
KLab Inc. / Tech
20分くらいでわかった気分になれるC++20コルーチン
20分くらいでわかった気分になれるC++20コルーチン
yohhoy
オブジェクト指向の設計と実装の学び方のコツ
オブジェクト指向の設計と実装の学び方のコツ
増田 亨
【Unity道場スペシャル 2017京都】乱数完全マスター 京都編
【Unity道場スペシャル 2017京都】乱数完全マスター 京都編
Unity Technologies Japan K.K.
テスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるな
Kentaro Matsui
凡人の凡人による凡人のためのデザインパターン第一幕 Public
凡人の凡人による凡人のためのデザインパターン第一幕 Public
bonjin6770 Kurosawa
SSE4.2の文字列処理命令の紹介
SSE4.2の文字列処理命令の紹介
MITSUNARI Shigeo
【Unity道場】物理シミュレーション完全マスター
【Unity道場】物理シミュレーション完全マスター
Unity Technologies Japan K.K.
何となく勉強した気分になれるパーサ入門
何となく勉強した気分になれるパーサ入門
masayoshi takahashi
中3女子でもわかる constexpr
中3女子でもわかる constexpr
Genya Murakami
Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.
Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.
kiki utagawa
Marp Tutorial
Marp Tutorial
Rui Watanabe
クロージャデザインパターン
クロージャデザインパターン
Moriharu Ohzu
RPGにおけるイベント駆動型の設計と実装
RPGにおけるイベント駆動型の設計と実装
Koji Morikawa
UE4における大規模背景制作事例(コリジョン編)
UE4における大規模背景制作事例(コリジョン編)
エピック・ゲームズ・ジャパン Epic Games Japan
C言語講習会2
C言語講習会2
odenhadengaku
エンジニア目線で見る TLA+ と PlusCal - TAKAMI Torao
エンジニア目線で見る TLA+ と PlusCal - TAKAMI Torao
Torao Takami
Weitere ähnliche Inhalte
Was ist angesagt?
Riderはいいぞ!
Riderはいいぞ!
UnityTechnologiesJapan002
Unityネイティブプラグインマニアクス #denatechcon
Unityネイティブプラグインマニアクス #denatechcon
DeNA
【Unite Tokyo 2019】Understanding C# Struct All Things
【Unite Tokyo 2019】Understanding C# Struct All Things
UnityTechnologiesJapan002
2018年01月27日 TensorBoardによる学習の可視化
2018年01月27日 TensorBoardによる学習の可視化
aitc_jp
ライブラリ作成のすゝめ - 事例から見る個人OSS開発の効能
ライブラリ作成のすゝめ - 事例から見る個人OSS開発の効能
Yoshifumi Kawai
ゴリラテスト モバイルゲームのUIを自動的に検出・操作する モンキーテスト
ゴリラテスト モバイルゲームのUIを自動的に検出・操作する モンキーテスト
KLab Inc. / Tech
20分くらいでわかった気分になれるC++20コルーチン
20分くらいでわかった気分になれるC++20コルーチン
yohhoy
オブジェクト指向の設計と実装の学び方のコツ
オブジェクト指向の設計と実装の学び方のコツ
増田 亨
【Unity道場スペシャル 2017京都】乱数完全マスター 京都編
【Unity道場スペシャル 2017京都】乱数完全マスター 京都編
Unity Technologies Japan K.K.
テスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるな
Kentaro Matsui
凡人の凡人による凡人のためのデザインパターン第一幕 Public
凡人の凡人による凡人のためのデザインパターン第一幕 Public
bonjin6770 Kurosawa
SSE4.2の文字列処理命令の紹介
SSE4.2の文字列処理命令の紹介
MITSUNARI Shigeo
【Unity道場】物理シミュレーション完全マスター
【Unity道場】物理シミュレーション完全マスター
Unity Technologies Japan K.K.
何となく勉強した気分になれるパーサ入門
何となく勉強した気分になれるパーサ入門
masayoshi takahashi
中3女子でもわかる constexpr
中3女子でもわかる constexpr
Genya Murakami
Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.
Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.
kiki utagawa
Marp Tutorial
Marp Tutorial
Rui Watanabe
クロージャデザインパターン
クロージャデザインパターン
Moriharu Ohzu
RPGにおけるイベント駆動型の設計と実装
RPGにおけるイベント駆動型の設計と実装
Koji Morikawa
UE4における大規模背景制作事例(コリジョン編)
UE4における大規模背景制作事例(コリジョン編)
エピック・ゲームズ・ジャパン Epic Games Japan
Was ist angesagt?
(20)
Riderはいいぞ!
Riderはいいぞ!
Unityネイティブプラグインマニアクス #denatechcon
Unityネイティブプラグインマニアクス #denatechcon
【Unite Tokyo 2019】Understanding C# Struct All Things
【Unite Tokyo 2019】Understanding C# Struct All Things
2018年01月27日 TensorBoardによる学習の可視化
2018年01月27日 TensorBoardによる学習の可視化
ライブラリ作成のすゝめ - 事例から見る個人OSS開発の効能
ライブラリ作成のすゝめ - 事例から見る個人OSS開発の効能
ゴリラテスト モバイルゲームのUIを自動的に検出・操作する モンキーテスト
ゴリラテスト モバイルゲームのUIを自動的に検出・操作する モンキーテスト
20分くらいでわかった気分になれるC++20コルーチン
20分くらいでわかった気分になれるC++20コルーチン
オブジェクト指向の設計と実装の学び方のコツ
オブジェクト指向の設計と実装の学び方のコツ
【Unity道場スペシャル 2017京都】乱数完全マスター 京都編
【Unity道場スペシャル 2017京都】乱数完全マスター 京都編
テスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるな
凡人の凡人による凡人のためのデザインパターン第一幕 Public
凡人の凡人による凡人のためのデザインパターン第一幕 Public
SSE4.2の文字列処理命令の紹介
SSE4.2の文字列処理命令の紹介
【Unity道場】物理シミュレーション完全マスター
【Unity道場】物理シミュレーション完全マスター
何となく勉強した気分になれるパーサ入門
何となく勉強した気分になれるパーサ入門
中3女子でもわかる constexpr
中3女子でもわかる constexpr
Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.
Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.
Marp Tutorial
Marp Tutorial
クロージャデザインパターン
クロージャデザインパターン
RPGにおけるイベント駆動型の設計と実装
RPGにおけるイベント駆動型の設計と実装
UE4における大規模背景制作事例(コリジョン編)
UE4における大規模背景制作事例(コリジョン編)
Ähnlich wie Design by contractとホーア論理
C言語講習会2
C言語講習会2
odenhadengaku
エンジニア目線で見る TLA+ と PlusCal - TAKAMI Torao
エンジニア目線で見る TLA+ と PlusCal - TAKAMI Torao
Torao Takami
Javaプログラミング入門【第2回】
Javaプログラミング入門【第2回】
Yukiko Kato
並行計算の実践と理論
並行計算の実践と理論
gotoloop
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 ...
Eiji Uchibe
2018年度 若手技術者向け講座 リファクタリング
2018年度 若手技術者向け講座 リファクタリング
keki3
Kink: invokedynamic on a prototype-based language
Kink: invokedynamic on a prototype-based language
Taku Miyakawa
AgileTourOsaka2011 関係者に理解してもらえるアジャイル開発にむけて
AgileTourOsaka2011 関係者に理解してもらえるアジャイル開発にむけて
Shuji Morisaki
cp-5. 繰り返し計算
cp-5. 繰り返し計算
kunihikokaneko1
量子コンピュータで金融計算
量子コンピュータで金融計算
Kenji Tanaka
CRF を使った Web 本文抽出
CRF を使った Web 本文抽出
Shuyo Nakatani
Interpretable sequence learning for covid-19 forecasting
Interpretable sequence learning for covid-19 forecasting
Morpho, Inc.
強化学習勉強会・論文紹介(第30回)Ensemble Contextual Bandits for Personalized Recommendation
強化学習勉強会・論文紹介(第30回)Ensemble Contextual Bandits for Personalized Recommendation
Naoki Nishimura
Ähnlich wie Design by contractとホーア論理
(14)
C言語講習会2
C言語講習会2
エンジニア目線で見る TLA+ と PlusCal - TAKAMI Torao
エンジニア目線で見る TLA+ と PlusCal - TAKAMI Torao
Javaプログラミング入門【第2回】
Javaプログラミング入門【第2回】
並行計算の実践と理論
並行計算の実践と理論
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 ...
2018年度 若手技術者向け講座 リファクタリング
2018年度 若手技術者向け講座 リファクタリング
Kink: invokedynamic on a prototype-based language
Kink: invokedynamic on a prototype-based language
AgileTourOsaka2011 関係者に理解してもらえるアジャイル開発にむけて
AgileTourOsaka2011 関係者に理解してもらえるアジャイル開発にむけて
cp-5. 繰り返し計算
cp-5. 繰り返し計算
量子コンピュータで金融計算
量子コンピュータで金融計算
CRF を使った Web 本文抽出
CRF を使った Web 本文抽出
Interpretable 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
Mehr von Takuya Matsunaga
光コラボは契約してはいけない
光コラボは契約してはいけない
Takuya Matsunaga
ソフトウェア組織マインド
ソフトウェア組織マインド
Takuya Matsunaga
ある製造業のチームトポロジー
ある製造業のチームトポロジー
Takuya Matsunaga
クリーンアーキテクチャを試してみた
クリーンアーキテクチャを試してみた
Takuya Matsunaga
組込エンジニアのための深層学習
組込エンジニアのための深層学習
Takuya Matsunaga
Deep Leaningと超解像
Deep Leaningと超解像
Takuya Matsunaga
進化するArt
進化するArt
Takuya Matsunaga
ここが変だよDalvik仮想マシン
ここが変だよDalvik仮想マシン
Takuya Matsunaga
詳解Dexファイルフォーマット
詳解Dexファイルフォーマット
Takuya Matsunaga
Dalvikバイトコードリファレンスの読み方 改訂版
Dalvikバイトコードリファレンスの読み方 改訂版
Takuya Matsunaga
Dalvik仮想マシンのアーキテクチャ 改訂版
Dalvik仮想マシンのアーキテクチャ 改訂版
Takuya Matsunaga
Mehr von Takuya Matsunaga
(11)
光コラボは契約してはいけない
光コラボは契約してはいけない
ソフトウェア組織マインド
ソフトウェア組織マインド
ある製造業のチームトポロジー
ある製造業のチームトポロジー
クリーンアーキテクチャを試してみた
クリーンアーキテクチャを試してみた
組込エンジニアのための深層学習
組込エンジニアのための深層学習
Deep Leaningと超解像
Deep Leaningと超解像
進化するArt
進化するArt
ここが変だよDalvik仮想マシン
ここが変だよDalvik仮想マシン
詳解Dexファイルフォーマット
詳解Dexファイルフォーマット
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
3.
Design by Contractを知っていますか? 知っている人は挙手!
2
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
28.
ご清聴ありがとうございました
27
Jetzt herunterladen