Mercurial > hg > Papers > 2019 > ryokka-sigss
comparison slide/slide.md @ 11:17b7605a5deb
add figures, some slides
author | ryokka |
---|---|
date | Sun, 13 Jan 2019 23:42:16 +0900 |
parents | a87fec07fd78 |
children | e8fe28afe61e |
comparison
equal
deleted
inserted
replaced
10:a87fec07fd78 | 11:17b7605a5deb |
---|---|
3 profile: 琉球大学 : 並列信頼研究室 | 3 profile: 琉球大学 : 並列信頼研究室 |
4 lang: Japanese | 4 lang: Japanese |
5 | 5 |
6 <!-- 発表20分、質疑応答5分 --> | 6 <!-- 発表20分、質疑応答5分 --> |
7 | 7 |
8 ## 研究目的 | 8 ## 研究背景 |
9 <!-- 後回しだ!!!!! --> | 9 - OS やアプリケーションなどの信頼性は重要な課題 |
10 - OS やアプリケーションなどの信頼性は重要な課題である。 | 10 - 信頼性を上げるために仕様を検証する必要 |
11 - プログラムの信頼性を上げるためには仕様を検証する必要がある。 | 11 - 仕様検証の手法として Floyd-Hoare Logic (以下 HoareLogic) がある |
12 - 使用の検証手法として Floyd-Hoare Logic (以下 HoareLogic) があり。 | 12 - 事前条件(PreCondition)が成り立つとき、関数(Command)を実行、それが停止したとき、事後条件(PostCondition)を満たす |
13 - これはプログラムを Pre、Post Condition(事前、事後条件)、Command (関数) | 13 - 既存の言語ではあまり利用されていない(python の pyrefine ってコードチェッカーくらい...?) |
14 - 当研究室では信頼性の高い OS として GearsOS を開発している。 | 14 |
15 - GearsOS では CodeGear、 DataGear という単位を用いてプログラムを記述する手法を提案している。 | 15 ## 背景 |
16 - OS やアプリケーションなど、ソフトウェアの信頼性を高めることは重要である。 | 16 - 当研究室では 処理の単位を **CodeGear**、データの単位を **DataGear** としてプログラムを記述する手法を提案 |
17 - そのために当研究室では CodeGear 、 DataGear という単位を用いてプログラムを記述する手法を提案している。 | 17 - CodeGear は Input DataGear を受け取り、処理を行って Output DataGear に書き込む |
18 - CodeGear は処理の単位で、処理が終わると次の CodeGear へと継続を行う。 | 18 - Gear 間の接続処理はメタ計算として定義 |
19 - このとき、 CodeGear は通常の関数呼び出しとは異なり、呼び出し前の環境を持たずに継続をする。 | 19 - メタ計算部分に検証を埋め込むことで通常処理に手を加えずに検証 |
20 - DataGear はデータの単位で、 CodeGear の入力、出力変数となる。 | 20 - 本研究では Gears OS の信頼性を高めるため、 Gears の単位を用いた HoareLogic ベースの検証手法を提案する |
21 - また、当研究室では Gears の単位を用いて作られる OS である、 GearsOS を開発している。 | 21 |
22 - 本研究では Gears OS の信頼性を高めるため、 Gears の単位を用いた検証手法を提案する。 | 22 <p style="text-align:center;"><img src="./pic/cgdg-small.svg" alt="" width="75%" height="75%"/></p> |
23 | |
24 * 当研究室では検証しやすい単位として **CodeGear**、**DataGear** という単位を用いてプログラムを記述する手法を提案している | |
25 * **CodeGear** とはプログラムを記述する際の処理の単位 | |
26 * **DataGear** は CodeGear で扱うデータの単位 | |
27 * これは関数型プログラミングに近い形になる | |
28 * 本研究では関数型言語であり、 **証明支援系** 言語でもある **Agda** を用いて仕様を検証することにしている | |
29 | |
30 <!-- * 動作するプログラムは高い信頼性を持っていてほしい --> | |
31 <!-- * そのために当研究室では CodeGear 、 DataGear を用いて記述する手法を提案している --> | |
32 <!-- * 処理の単位である CodeGear を継続しプログラムを記述していく --> | |
33 <!-- * メタ計算部分を切り替えることで CodeGear の処理を変更すること無くプログラムの検証をすることができる --> | |
34 <!-- * 継続に関数を呼び出すときの前提条件(pre-condition)を追加することができ、Hoare Logic を用いた証明を Agda で記述できると考えている --> | |
35 <!-- * 本研究では CodeGear, DataGear という単位を用いてプログラムを記述する手法の継続部分で Hoare Logic をベースにした証明手法を検討する --> | |
36 | |
37 | |
38 | 23 |
39 ## Gears について | 24 ## Gears について |
40 - **Gears** は当研究室で提案しているプログラム記述手法 | 25 - **Gears** は当研究室で提案しているプログラム記述手法 |
41 - 計算の単位を **CodeGear** 、データの単位を **DataGear** | 26 - 計算の単位を **CodeGear** 、データの単位を **DataGear** |
42 - CodeGear は引数として Input の DataGear を受け取り、 Output の DataGear を返す | 27 - CodeGear は引数として Input の DataGear を受け取り、 Output の DataGear を返す |
43 - Output の DataGear は次の CodeGear の Input として接続される | 28 - Output の DataGear は次の CodeGear の Input として接続される |
44 <!-- [fig1](file://./fig/cgdg.pdf) --> | 29 <!-- [fig1](file://./fig/cgdg.pdf) --> |
45 - CodeGear の接続処理は通常の計算とは異なるメタ計算として定義 | 30 - CodeGear の接続処理は通常の計算とは異なるメタ計算として定義 |
46 - メタ計算で信頼性の検証を行う | 31 - メタ計算で信頼性の検証を行う |
47 | 32 |
33 <!-- ![cgdg](./pic/codeGear_dataGear.pdf){} --> | |
34 <p style="text-align:center;"><img src="./pic/cgdg.svg" alt="" width="30%" height="30%"/></p> | |
35 | |
48 ## CbC について | 36 ## CbC について |
49 - Gears の単位でプログラミングできる言語として CbC (Continuation based C) が存在 | 37 - Gears の単位でプログラミングできる言語として当研究室で開発している **CbC** (Continuation based C) が存在 |
50 - 現在の CbC では assert での検証ができる | 38 - これは C からループ制御構造と関数呼び出しを取り除き継続を導入したもの |
39 - 環境を継続に含めない | |
40 - 現在の CbC ではメタ計算での検証 | |
51 - 将来的には証明も扱えるようにしたいが現段階では未実装 | 41 - 将来的には証明も扱えるようにしたいが現段階では未実装 |
52 - そのため Gears の単位を定理証明支援系の言語である **Agda** で記述できるようにし、 Agda 上で証明を行う | 42 - そのため Gears の単位を定理証明支援系の言語である **Agda** で記述し、 Agda で証明している |
53 | 43 |
54 ## Agda | 44 ## Agda |
55 - Agda は定理証明支援系の言語 | 45 - Agda は定理証明支援系の言語 |
56 - 依存型を持つ関数型言語 | 46 - 依存型を持つ関数型言語 |
57 - 型を明記する必要がある | 47 - 型を明記する必要がある |
59 | 49 |
60 ## Agda のデータ型 | 50 ## Agda のデータ型 |
61 - データ型は代数的なデータ構造 | 51 - データ型は代数的なデータ構造 |
62 - **data** キーワードの後に、**名前 : 型**、 where 句 | 52 - **data** キーワードの後に、**名前 : 型**、 where 句 |
63 - 次の行以降は**コンストラクタ名 : 型** | 53 - 次の行以降は**コンストラクタ名 : 型** |
64 - 型は**->**または**→**で繋げる事ができる | 54 - 型は**->**または**→**で繋げる |
65 - **PrimComm −> Comm**は**PrimComm** を受け取り、 **Comm**を返す型 | 55 - 例えば、型**PrimComm −> Comm**は**PrimComm** を受け取り**Comm**を返す型 |
66 - 再帰的な定義も可能 | 56 - 再帰的な定義も可能 |
67 | 57 ```AGDA |
68 ```AGDA | 58 data Comm : Set where |
69 data Comm : Set where | 59 Skip : Comm |
70 Skip : Comm | 60 Abort : Comm |
71 Abort : Comm | 61 PComm : PrimComm −> Comm |
72 PComm : PrimComm −> Comm | 62 Seq : Comm −> Comm −> Comm |
73 Seq : Comm −> Comm −> Comm | 63 If : Cond −> Comm −> Comm −> Comm |
74 If : Cond −> Comm −> Comm −> Comm | 64 While : Cond −> Comm −> Comm |
75 While : Cond −> Comm −> Comm | |
76 ``` | 65 ``` |
77 | 66 |
78 <!-- - where は宣言した部分に束縛する --> | 67 <!-- - where は宣言した部分に束縛する --> |
79 | 68 |
80 ## Agda のレコード型 | 69 ## Agda のレコード型 |
81 - C 言語での構造体に近い | 70 - C 言語での構造体に近い |
82 - 複数のデータ型をまとめる | 71 - 複数のデータをまとめる |
83 - 関数内で構築できる | 72 - 関数内で構築できる |
84 - 構築時は**レコード名 {フィールド名 = 値}** | 73 - 構築時は**レコード名 {フィールド名 = 値}** |
85 - 複数ある場合は **{フィールド1 = 1 ; フィールド2 = 2}**のように **;** を使って列挙 | 74 - 複数ある場合は **{フィールド1 = 1 ; フィールド2 = 2}**のように **;** を使って列挙 |
86 | 75 - (varn,vari の型 **ℕ** は Agda 上の 自然数、 データ型で zero : ℕ と succ : ℕ -> ℕ で定義されてる) |
87 ```AGDA | 76 ```AGDA |
88 record Env : Set where | 77 record Env : Set where |
89 field | 78 field |
90 varn : ℕ | 79 varn : ℕ |
91 vari : ℕ | 80 vari : ℕ |
92 ``` | 81 ``` |
93 | 82 |
94 ## Agda の関数 | 83 ## Agda の関数 |
95 - 関数にも型が必要 | 84 - 関数にも型が必要 |
96 - 関数は **関数名 = 値** | 85 - 関数は **関数名 = 値** |
97 - 関数ではパターンマッチがかける | 86 - 関数ではパターンマッチがかける |
98 - **_** は任意の引数 | 87 - **_** は任意の引数 |
99 | 88 ```AGDA |
100 ```AGDA | 89 _-_ : ℕ → ℕ → ℕ |
101 _−_ : ℕ → ℕ → ℕ | 90 x - zero = x |
102 x − zero = x | 91 zero - _ = zero |
103 zero − _ = zero | 92 (suc x) - (suc y) = x - y |
104 (suc x) − (suc y) = x − y | |
105 ``` | 93 ``` |
106 | 94 |
107 ## Agda での証明 | 95 ## Agda での証明 |
108 - 関数の型に論理式 | 96 - 関数の型に論理式 |
109 - 関数自体にそれを満たす導出 | 97 - 関数自体にそれを満たす導出 |
110 - 完成した関数は証明 | 98 - 完成した関数は証明 |
111 - **{}** は暗黙的(推論される) | 99 - **{}** は暗黙的(推論される) |
112 - 下のコードは自然数に 0 を足したとき値が変わらないことの証明 | 100 - 下のコードは自然数に 0 を足したとき値が変わらないことの証明 |
113 | 101 ```AGDA |
114 ```AGDA | 102 +zero : { y : ℕ } → y + zero ≡ y |
115 +zero : {y : ℕ} → y + zero ≡ y | 103 +zero {zero} = refl |
116 +zero {zero} = refl | 104 +zero {suc y} = cong ( λ x → suc x ) ( +zero {y} ) |
117 +zero {suc y} = cong ( λ x → suc x ) ( +zero {y} ) | |
118 ``` | 105 ``` |
119 | 106 |
120 ## Agda 上での HoareLogic | 107 ## Agda 上での HoareLogic |
121 * 現在 Agda での HoareLogic は初期のAgda の実装である Agda1(現在のものはAgda2)で実装されたものと | 108 * 現在 Agda での HoareLogic は初期のAgda の実装である Agda1(現在のものはAgda2)で実装されたものと |
122 それを Agda2 に書き写したものが存在している。 | 109 それを Agda2 に書き写したものが存在している。 |
123 * 今回はAgda2側の HoareLogic で使うコマンド定義の一部と、コマンドの証明に使うルールを借りて説明を行う。 | 110 * 今回はAgda2側の HoareLogic で使うコマンド定義の一部と、コマンドの証明に使うルールを借りて説明を行う。 |
124 | 111 |
125 | 112 |
126 ## Agda での HoareLogic の理解 | 113 ## Agda での HoareLogic の理解 |
127 * HoareLogic を用いて次のようなプログラム(while Program)を検証した。 | 114 * HoareLogic を用いて次のようなプログラム(while Program)を検証した。 |
128 | |
129 ```C | 115 ```C |
130 n = 10; | 116 n = 10; |
131 i = 0; | 117 i = 0; |
132 | 118 |
133 while (n>0) | 119 while (n>0) |
134 { | 120 { |
135 i++; | 121 i++; |
136 n--; | 122 n--; |
137 } | 123 } |
138 ``` | 124 ``` |
139 * このプログラムは変数iとnをもち、 n>0 の間nの値を減らし、i の値を増やす | 125 * このプログラムは変数iとnをもち、 n>0 の間nの値を減らし、i の値を増やす |
140 * n==0のとき停止するため、終了時の変数の結果はi==10、n==0 になるはずである。 | 126 * n==0のとき停止するため、終了時の変数の結果はi==10、n==0 になるはずである。 |
141 | 127 |
142 ## HoareLogic | 128 ## HoareLogic |
148 | 134 |
149 ## Agda 上での HoareLogic(コマンド定義) | 135 ## Agda 上での HoareLogic(コマンド定義) |
150 * Env は while Program の変数である var n, i | 136 * Env は while Program の変数である var n, i |
151 * **PrimComm** は代入時に使用される | 137 * **PrimComm** は代入時に使用される |
152 * **Cond** は Condition で Env を受け取って Boolean の値を返す | 138 * **Cond** は Condition で Env を受け取って Boolean の値を返す |
153 | 139 ```AGDA |
154 ```AGDA | 140 record Env : Set where |
155 record Env : Set where | 141 field |
156 field | 142 varn : ℕ |
157 varn : ℕ | 143 vari : ℕ |
158 vari : ℕ | 144 |
159 | 145 PrimComm : Set |
160 PrimComm : Set | 146 PrimComm = Env → Env |
161 PrimComm = Env → Env | 147 |
162 | 148 Cond : Set |
163 Cond : Set | 149 Cond = (Env → Bool) |
164 Cond = (Env → Bool) | |
165 ``` | 150 ``` |
166 | 151 |
167 ## Agda 上での HoareLogic(コマンド定義) | 152 ## Agda 上での HoareLogic(コマンド定義) |
168 * **Comm** は Agda のデータ型で定義した HoareLogic の Command | 153 * **Comm** は Agda のデータ型で定義した HoareLogic の Command |
169 * **Skip** は何も変更しない | 154 * **Skip** は何も変更しない |
170 * **PComm** は変数を代入する | 155 * **PComm** は変数を代入する |
171 * **Seq** は Command を次の Command に移す | 156 * **Seq** は Command を実行して次の Command に移す |
172 * **If** は Cond と2つの Comm を受け取り Cond の状態により実行する Comm を変える | 157 * **If** は Cond と2つの Comm を受け取り Cond の状態により実行する Comm を変える |
173 * **while** は Cond と Comm を受け取り Cond の中身が真である間 Comm を繰り返す | 158 * **while** は Cond と Comm を受け取り Cond の中身が真である間 Comm を繰り返す |
174 | 159 ```AGDA |
175 ```AGDA | 160 data Comm : Set where |
176 data Comm : Set where | 161 Skip : Comm |
177 Skip : Comm | 162 Abort : Comm |
178 Abort : Comm | 163 PComm : PrimComm -> Comm |
179 PComm : PrimComm -> Comm | 164 Seq : Comm -> Comm -> Comm |
180 Seq : Comm -> Comm -> Comm | 165 If : Cond -> Comm -> Comm -> Comm |
181 If : Cond -> Comm -> Comm -> Comm | 166 While : Cond -> Comm -> Comm |
182 While : Cond -> Comm -> Comm | |
183 ``` | 167 ``` |
184 | 168 |
185 ## Agda 上での HoareLogic(実際のプログラムの記述) | 169 ## Agda 上での HoareLogic(実際のプログラムの記述) |
186 * 先程の Comm を使ってwhile Program を記述した。 | 170 * Command を使って while Program を記述した。 |
187 | 171 * **$** は **()** の糖衣で行頭から行末までを ( ) で囲う |
188 ```AGDA | 172 * 見やすさのため改行しているため 3~7 行はまとまっている |
189 program : Comm | 173 * Seq は Comm を2つ取って次の Comm に移行する |
190 program = | 174 ```AGDA |
191 Seq ( PComm (λ env → record env {varn = 10})) | 175 program : Comm |
192 $ Seq ( PComm (λ env → record env {vari = 0})) | 176 program = |
193 $ While (λ env → lt zero (varn env ) ) | 177 Seq ( PComm (λ env → record env {varn = 10})) |
194 (Seq (PComm (λ env → record env {vari = ((vari env) + 1)} )) | 178 $ Seq ( PComm (λ env → record env {vari = 0})) |
195 $ PComm (λ env → record env {varn = ((varn env) - 1)} )) | 179 $ While (λ env → lt zero (varn env ) ) |
180 (Seq (PComm (λ env → record env {vari = ((vari env) + 1)} )) | |
181 $ PComm (λ env → record env {varn = ((varn env) - 1)} )) | |
196 ``` | 182 ``` |
197 | 183 |
198 | 184 |
199 ## Agda 上での HoareLogicの理解 | 185 ## Agda 上での HoareLogicの理解 |
200 * 証明規則は HTProof にまとめられてる | 186 * 規則は HTProof にまとめられてる |
201 * **PrimRule** は代入を | 187 * **PrimRule** は **PComm** で行う代入を保証する |
202 | 188 * 3行目の pr の型 Axiom は PreCondition に PrimComm が適用されると PostCondition になることの記述 |
203 | 189 * **_⇒_** は pre, post の Condition をとって post の Condition が成り立つときに True を返す関数 |
204 ```AGDA | 190 * SkipRule は PreCondition を変更しないことの保証 |
205 data HTProof : Cond -> Comm -> Cond -> Set where | 191 * AbortRule は プログラムが停止するときのルール |
206 PrimRule : {bPre : Cond} -> {pcm : PrimComm} -> {bPost : Cond} -> | 192 ```AGDA |
207 (pr : Axiom bPre pcm bPost) -> | 193 data HTProof : Cond -> Comm -> Cond -> Set where |
208 HTProof bPre (PComm pcm) bPost | 194 PrimRule : {bPre : Cond} -> {pcm : PrimComm} -> {bPost : Cond} -> |
209 SkipRule : (b : Cond) -> HTProof b Skip b | 195 (pr : Axiom bPre pcm bPost) -> |
210 AbortRule : (bPre : Cond) -> (bPost : Cond) -> | 196 HTProof bPre (PComm pcm) bPost |
211 HTProof bPre Abort bPost | 197 SkipRule : (b : Cond) -> HTProof b Skip b |
198 AbortRule : (bPre : Cond) -> (bPost : Cond) -> | |
199 HTProof bPre Abort bPost | |
212 -- 次のスライドに続く | 200 -- 次のスライドに続く |
213 ``` | 201 ``` |
214 | 202 ```AGDA |
203 Axiom : Cond -> PrimComm -> Cond -> Set | |
204 Axiom pre comm post = ∀ (env : Env) → (pre env) ⇒ ( post (comm env)) ≡ true | |
205 ``` | |
215 | 206 |
216 ## Agda 上での HoareLogicの理解 | 207 ## Agda 上での HoareLogicの理解 |
208 * **SeqRule** は Command を推移させる Seq の保証 | |
209 * **IfRule** は If の Command が正しく動くことを保証 | |
210 ```AGDA | |
211 -- HTProof の続き | |
212 SeqRule : {bPre : Cond} -> {cm1 : Comm} -> {bMid : Cond} -> | |
213 {cm2 : Comm} -> {bPost : Cond} -> | |
214 HTProof bPre cm1 bMid -> | |
215 HTProof bMid cm2 bPost -> | |
216 HTProof bPre (Seq cm1 cm2) bPost | |
217 IfRule : {cmThen : Comm} -> {cmElse : Comm} -> | |
218 {bPre : Cond} -> {bPost : Cond} -> | |
219 {b : Cond} -> | |
220 HTProof (bPre /\ b) cmThen bPost -> | |
221 HTProof (bPre /\ neg b) cmElse bPost -> | |
222 HTProof bPre (If b cmThen cmElse) bPost | |
223 ``` | |
224 | |
225 ## Agda 上での HoareLogicの理解 | |
226 * **WeakeningRule** は通常の Condition からループ不変条件(Loop Invaliant)に変換 | |
227 * Tautology は Condition と不変条件が等しく成り立つ | |
228 * **WhileRule** はループ不変条件が成り立つ間 Comm を繰り返す | |
229 ```AGDA | |
230 -- HTProof の続き | |
231 WeakeningRule : {bPre : Cond} -> {bPre' : Cond} -> {cm : Comm} -> | |
232 {bPost' : Cond} -> {bPost : Cond} -> | |
233 Tautology bPre bPre' -> | |
234 HTProof bPre' cm bPost' -> | |
235 Tautology bPost' bPost -> | |
236 HTProof bPre cm bPost | |
237 WhileRule : {cm : Comm} -> {bInv : Cond} -> {b : Cond} -> | |
238 HTProof (bInv /\ b) cm bInv -> | |
239 HTProof bInv (While b cm) (bInv /\ neg b) | |
240 ``` | |
241 ```AGDA | |
242 Tautology : Cond -> Cond -> Set | |
243 Tautology pre post = ∀ (env : Env) → (pre env) ⇒ (post env) ≡ true | |
244 ``` | |
245 | |
246 ## Agda 上での HoareLogic(証明) | |
247 * **proof1** は while Program の証明 | |
248 * HTProof に 初期状態とコマンドで書かれた **program** と終了状態を渡す | |
249 * lemma1~5は rule それぞれの証明 | |
217 * | 250 * |
218 | 251 ```AGDA |
219 ```AGDA | 252 proof1 : HTProof initCond program termCond |
220 -- HTProof の続き | 253 proof1 = |
221 WeakeningRule : {bPre : Cond} -> {bPre' : Cond} -> {cm : Comm} -> | 254 SeqRule {λ e → true} ( PrimRule empty-case ) |
222 {bPost' : Cond} -> {bPost : Cond} -> | 255 $ SeqRule {λ e → Equal (varn e) 10} ( PrimRule lemma1 ) |
223 Tautology bPre bPre' -> | 256 $ WeakeningRule {λ e → (Equal (varn e) 10) ∧ (Equal (vari e) 0)} lemma2 ( |
224 HTProof bPre' cm bPost' -> | 257 WhileRule {_} {λ e → Equal ((varn e) + (vari e)) 10} |
225 Tautology bPost' bPost -> | 258 $ SeqRule (PrimRule {λ e → whileInv e ∧ lt zero (varn e) } lemma3 ) |
226 HTProof bPre cm bPost | |
227 SeqRule : {bPre : Cond} -> {cm1 : Comm} -> {bMid : Cond} -> | |
228 {cm2 : Comm} -> {bPost : Cond} -> | |
229 HTProof bPre cm1 bMid -> | |
230 HTProof bMid cm2 bPost -> | |
231 HTProof bPre (Seq cm1 cm2) bPost | |
232 IfRule : {cmThen : Comm} -> {cmElse : Comm} -> | |
233 {bPre : Cond} -> {bPost : Cond} -> | |
234 {b : Cond} -> | |
235 HTProof (bPre /\ b) cmThen bPost -> | |
236 HTProof (bPre /\ neg b) cmElse bPost -> | |
237 HTProof bPre (If b cmThen cmElse) bPost | |
238 WhileRule : {cm : Comm} -> {bInv : Cond} -> {b : Cond} -> | |
239 HTProof (bInv /\ b) cm bInv -> | |
240 HTProof bInv (While b cm) (bInv /\ neg b) | |
241 ``` | |
242 | |
243 ## Agda 上での HoareLogic(証明) | |
244 | |
245 ```AGDA | |
246 proof1 : HTProof initCond program termCond | |
247 proof1 = | |
248 SeqRule {λ e → true} ( PrimRule empty-case ) | |
249 $ SeqRule {λ e → Equal (varn e) 10} ( PrimRule lemma1 ) | |
250 $ WeakeningRule {λ e → (Equal (varn e) 10) ∧ (Equal (vari e) 0)} lemma2 ( | |
251 WhileRule {_} {λ e → Equal ((varn e) + (vari e)) 10} | |
252 $ SeqRule (PrimRule {λ e → whileInv e ∧ lt zero (varn e) } lemma3 ) | |
253 $ PrimRule {whileInv'} {_} {whileInv} lemma4 ) lemma5 | 259 $ PrimRule {whileInv'} {_} {whileInv} lemma4 ) lemma5 |
254 ``` | 260 |
255 | 261 initCond : Cond |
262 initCond env = true | |
263 | |
264 termCond : {c10 : ℕ} → Cond | |
265 termCond {c10} env = Equal (vari env) c10 | |
266 ``` | |
267 | |
268 <!-- program : Comm --> | |
269 <!-- program = --> | |
270 <!-- Seq ( PComm (λ env → record env {varn = 10})) --> | |
271 <!-- $ Seq ( PComm (λ env → record env {vari = 0})) --> | |
272 <!-- $ While (λ env → lt zero (varn env ) ) --> | |
273 <!-- (Seq (PComm (λ env → record env {vari = ((vari env) + 1)} )) --> | |
274 <!-- $ PComm (λ env → record env {varn = ((varn env) - 1)} )) --> | |
275 | |
276 ## 証明の一部 | |
277 - 基本的な証明方法は Condtition を変化させて次の Condition が成り立つように変形する | |
278 - impl⇒ | |
279 ```AGDA | |
280 lemma1 : {c10 : ℕ} → Axiom (stmt1Cond {c10}) (λ env → record { varn = varn env ; vari = 0 }) (stmt2Cond {c10}) | |
281 lemma1 {c10} env = impl⇒ ( λ cond → let open ≡-Reasoning in | |
282 begin | |
283 (Equal (varn env) c10 ) ∧ true | |
284 ≡⟨ ∧true ⟩ | |
285 Equal (varn env) c10 | |
286 ≡⟨ cond ⟩ | |
287 true | |
288 ∎ ) | |
289 ``` | |
290 | |
291 | |
292 <!-- lemma2 : {c10 : ℕ} → Tautology stmt2Cond whileInv --> | |
293 | |
294 <!-- lemma3 : Axiom (λ e → whileInv e ∧ lt zero (varn e)) (λ env → record { varn = varn env ; vari = vari env + 1 }) whileInv' --> | |
295 | |
296 <!-- lemma4 : {c10 : ℕ} → Axiom whileInv' (λ env → record { varn = varn env - 1 ; vari = vari env }) whileInv --> | |
297 | |
298 <!-- lemma5 : {c10 : ℕ} → Tautology ((λ e → Equal (varn e + vari e) c10) and (neg (λ z → lt zero (varn z)))) termCond --> | |
256 | 299 |
257 ## Agda での Gears | 300 ## Agda での Gears |
258 - Agda での CodeGear は通常の関数とは異なり、継続渡し (CPS : Continuation Passing Style) で記述された関数 | 301 - Agda での CodeGear は通常の関数とは異なり、継続渡し (CPS : Continuation Passing Style) で記述された関数 |
259 - CPS の関数は引数として継続を受け取って継続に計算結果を渡す | 302 - CPS の関数は引数として継続を受け取って継続に計算結果を渡す |
260 - **名前 : 引数 -> (Code : fa -> t) -> t** | 303 - **名前 : 引数 -> (Code : fa -> t) -> t** |
261 - **t** は継続 | 304 - **t** は継続 |
262 - **(Code : fa -> t)** は次の継続先 | 305 - **(Code : fa -> t)** は次の継続先 |
263 - DataGear は Agda での CodeGear に使われる引数 | 306 - DataGear は Agda での CodeGear に使われる引数 |
307 ```AGDA | |
308 _g-_ : {t : Set} → ℕ → ℕ → (Code : ℕ → t) → t | |
309 x g- zero next = next x | |
310 zero g- _ = next zero | |
311 (suc x) g- (suc y) = next (x g- y) | |
312 ``` | |
264 | 313 |
265 ## Gears をベースにした HoareLogic | 314 ## Gears をベースにした HoareLogic |
266 * 次に Gears をベースにした while Program をみる。 | 315 * 次に Gears をベースにした while Program をみる。 |
267 * このプログラムは c10 | 316 * このプログラムは自然数と継続先を受け取って t を返す |
268 | 317 ```AGDA |
269 ```AGDA | 318 {-# TERMINATING #-} |
270 whileTest : {l : Level} {t : Set l} -> {c10 : ℕ } → (Code : (env : Env) -> | 319 whileLoop : {l : Level} {t : Set l} -> Env -> (Code : Env -> t) -> t |
271 ((vari env) ≡ 0) /\ ((varn env) ≡ c10) -> t) -> t | 320 whileLoop env next with lt 0 (varn env) |
272 whileTest {_} {_} {c10} next = next env proof2 | 321 whileLoop env next | false = next env |
273 where | 322 whileLoop env next | true = |
274 env : Env | 323 whileLoop (record {varn = (varn env) - 1 ; vari = (vari env) + 1}) next |
275 env = record {vari = 0 ; varn = c10} | |
276 proof2 : ((vari env) ≡ 0) /\ ((varn env) ≡ c10) | |
277 proof2 = record {pi1 = refl ; pi2 = refl} | |
278 ``` | 324 ``` |
279 | 325 |
280 ## Gears と HoareLogic をベースにした証明 | 326 ## Gears と HoareLogic をベースにした証明 |
281 * ここでは | 327 * ここでは |
282 | 328 ```AGDA |
283 ```AGDA | 329 proofGears : {c10 : ℕ } → Set |
284 proofGears : {c10 : ℕ } → Set | 330 proofGears {c10} = whileTest' {_} {_} {c10} (λ n p1 → conversion1 n p1 |
285 proofGears {c10} = whileTest {_} {_} {c10} (λ n p1 → conversion1 n p1 (λ n1 p2 → whileLoop' n1 p2 (λ n2 → ( vari n2 ≡ c10 )))) | 331 (λ n1 p2 → whileLoop' n1 p2 (λ n2 → ( vari n2 ≡ c10 )))) |
286 ``` | 332 ``` |
287 | 333 |
288 | 334 |
289 <--! | 335 ## まとめと今後の課題 |
290 [論文目次] | 336 - HoareLogic の while を使った例題を作成、証明を行った |
291 まえがき | 337 - Gears を用いた HoareLogic ベースの検証方法を導入した |
292 | 338 - 証明が引数として渡される記述のため証明とプログラムを一体化できた |
293 現状 | 339 - 今後の課題 |
294 | 340 - RedBlackTree や SynchronizedQueue などのデータ構造の検証(HoareLogic ベースで) |
295 Agda | |
296 | |
297 GearsOS | |
298 | |
299 CodeGear DataGear | |
300 | |
301 Gears と Agda | |
302 | |
303 Agda での HoareLogic | |
304 | |
305 Gears ベースの HoareLogic | |
306 | |
307 まとめと課題 | |
308 | |
309 --> |