Mercurial > hg > Papers > 2019 > ryokka-sigss
comparison slide/slide.html @ 12:e8fe28afe61e
fix slide
author | ryokka |
---|---|
date | Tue, 15 Jan 2019 15:56:33 +0900 |
parents | 17b7605a5deb |
children | b711209123f7 |
comparison
equal
deleted
inserted
replaced
11:17b7605a5deb | 12:e8fe28afe61e |
---|---|
5 | 5 |
6 <!DOCTYPE html> | 6 <!DOCTYPE html> |
7 <html> | 7 <html> |
8 <head> | 8 <head> |
9 <meta http-equiv="content-type" content="text/html;charset=utf-8"> | 9 <meta http-equiv="content-type" content="text/html;charset=utf-8"> |
10 <title>GearsOS の Hoare triple を用いた検証</title> | 10 <title>GearsOS の Hoare Logic を用いた検証</title> |
11 | 11 |
12 <meta name="generator" content="Slide Show (S9) v4.0.1 on Ruby 2.4.1 (2017-03-22) [x86_64-darwin16]"> | 12 <meta name="generator" content="Slide Show (S9) v4.0.1 on Ruby 2.4.1 (2017-03-22) [x86_64-darwin16]"> |
13 <meta name="author" content="Masataka Hokama" > | 13 <meta name="author" content="Masataka Hokama" > |
14 | 14 |
15 <!-- style sheet links --> | 15 <!-- style sheet links --> |
68 <div class='slide cover'> | 68 <div class='slide cover'> |
69 <table width="90%" height="90%" border="0" align="center"> | 69 <table width="90%" height="90%" border="0" align="center"> |
70 <tr> | 70 <tr> |
71 <td> | 71 <td> |
72 <div align="center"> | 72 <div align="center"> |
73 <h1><font color="#808db5">GearsOS の Hoare triple を用いた検証</font></h1> | 73 <h1><font color="#808db5">GearsOS の Hoare Logic を用いた検証</font></h1> |
74 </div> | 74 </div> |
75 </td> | 75 </td> |
76 </tr> | 76 </tr> |
77 <tr> | 77 <tr> |
78 <td> | 78 <td> |
97 <ul> | 97 <ul> |
98 <li>OS やアプリケーションなどの信頼性は重要な課題</li> | 98 <li>OS やアプリケーションなどの信頼性は重要な課題</li> |
99 <li>信頼性を上げるために仕様を検証する必要</li> | 99 <li>信頼性を上げるために仕様を検証する必要</li> |
100 <li>仕様検証の手法として Floyd-Hoare Logic (以下 HoareLogic) がある | 100 <li>仕様検証の手法として Floyd-Hoare Logic (以下 HoareLogic) がある |
101 <ul> | 101 <ul> |
102 <li>事前条件(PreCondition)が成り立つとき、関数(Command)を実行、それが停止したとき、事後条件(PostCondition)を満たす</li> | 102 <li>事前条件(Pre Condition)が成り立つとき、関数(Command)を実行、それが停止したとき、事後条件(Post Condition)を満たす</li> |
103 </ul> | 103 </ul> |
104 </li> | 104 </li> |
105 <li>既存の言語ではあまり利用されていない(python の pyrefine ってコードチェッカーくらい…?)</li> | 105 <li>既存の言語ではあまり利用されていない</li> |
106 </ul> | 106 </ul> |
107 | 107 |
108 | 108 |
109 | 109 |
110 </div> | 110 </div> |
112 <div class='slide'> | 112 <div class='slide'> |
113 <!-- _S9SLIDE_ --> | 113 <!-- _S9SLIDE_ --> |
114 <h2 id="背景">背景</h2> | 114 <h2 id="背景">背景</h2> |
115 <ul> | 115 <ul> |
116 <li>当研究室では 処理の単位を <strong>CodeGear</strong>、データの単位を <strong>DataGear</strong> としてプログラムを記述する手法を提案</li> | 116 <li>当研究室では 処理の単位を <strong>CodeGear</strong>、データの単位を <strong>DataGear</strong> としてプログラムを記述する手法を提案</li> |
117 <li>CodeGear は Input DataGear を受け取り、処理を行って Output DataGear に書き込む</li> | 117 <li>CodeGear は Input DataGear を受け取り、処理を行って Output DataGear に書き込む |
118 <li>Gear 間の接続処理はメタ計算として定義 | 118 <!-- - Gear 間の接続処理はメタ計算として定義 --> |
119 <ul> | 119 <!-- - メタ計算部分に検証を埋め込むことで通常処理に手を加えずに検証 --></li> |
120 <li>メタ計算部分に検証を埋め込むことで通常処理に手を加えずに検証</li> | 120 <li>この単位を用いて信頼性の高い OS として GearsOS を開発している</li> |
121 </ul> | 121 <li>本発表では Gears OS の信頼性を高めるため、 Gears の単位を用いた HoareLogic ベースの検証手法を提案する</li> |
122 </li> | 122 </ul> |
123 <li>本研究では Gears OS の信頼性を高めるため、 Gears の単位を用いた HoareLogic ベースの検証手法を提案する</li> | |
124 </ul> | |
125 | |
126 <p style="text-align:center;"><img src="./pic/cgdg-small.svg" alt="" width="75%" height="75%" /></p> | |
127 | 123 |
128 | 124 |
129 | 125 |
130 </div> | 126 </div> |
131 | 127 |
142 <ul> | 138 <ul> |
143 <li>メタ計算で信頼性の検証を行う</li> | 139 <li>メタ計算で信頼性の検証を行う</li> |
144 </ul> | 140 </ul> |
145 </li> | 141 </li> |
146 </ul> | 142 </ul> |
147 | 143 <p style="text-align:center;"><img src="./pic/cgdg-small.svg" alt="" width="75%" height="75%" /></p> |
148 <!-- ![cgdg](./pic/codeGear_dataGear.pdf){} --> | 144 <!-- ![cgdg](./pic/codeGear_dataGear.pdf){} --> |
149 <p style="text-align:center;"><img src="./pic/cgdg.svg" alt="" width="30%" height="30%" /></p> | 145 <!-- <p style="text-align:center;"><img src="./pic/cgdg.svg" alt="" width="30%" height="30%"/></p> --> |
150 | 146 |
151 | 147 |
152 | 148 |
153 </div> | 149 </div> |
154 | 150 |
155 <div class='slide'> | 151 <div class='slide'> |
156 <!-- _S9SLIDE_ --> | 152 <!-- _S9SLIDE_ --> |
157 <h2 id="cbc-について">CbC について</h2> | 153 <h2 id="cbc-について">CbC について</h2> |
158 <ul> | 154 <ul> |
159 <li>Gears の単位でプログラミングできる言語として CbC (Continuation based C) が存在</li> | 155 <li>Gears の単位でプログラミングできる言語として当研究室で開発している <strong>CbC</strong> (Continuation based C) が存在 |
160 <li>現在の CbC では assert での検証ができる</li> | 156 <ul> |
157 <li>これは C からループ制御構造と関数呼び出しを取り除き、代わりに継続を導入したもの</li> | |
158 </ul> | |
159 </li> | |
160 <li>現在の CbC でもメタ計算での検証は可能</li> | |
161 <li>将来的には証明も扱えるようにしたいが現段階では未実装</li> | 161 <li>将来的には証明も扱えるようにしたいが現段階では未実装</li> |
162 <li>そのため Gears の単位を定理証明支援系の言語である <strong>Agda</strong> で記述し、 Agda 上で証明</li> | 162 <li>そのため Gears の単位を定理証明支援系の言語である <strong>Agda</strong> で記述し、 Agda で証明している</li> |
163 </ul> | 163 </ul> |
164 | 164 |
165 | 165 |
166 | 166 |
167 </div> | 167 </div> |
168 | 168 |
169 <div class='slide'> | 169 <div class='slide'> |
170 <!-- _S9SLIDE_ --> | 170 <!-- _S9SLIDE_ --> |
171 <h2 id="agda">Agda</h2> | 171 <h2 id="agda-とは">Agda とは</h2> |
172 <ul> | 172 <ul> |
173 <li>Agda は定理証明支援系の言語</li> | 173 <li>Agda は定理証明支援系の言語</li> |
174 <li>依存型を持つ関数型言語</li> | 174 <li>依存型を持つ関数型言語</li> |
175 <li>型を明記する必要がある</li> | 175 <li>型を明記する必要がある</li> |
176 <li>Agda の文法については次のスライドから軽く説明する</li> | 176 <li>Agda の文法については次のスライドから軽く説明する</li> |
183 <div class='slide'> | 183 <div class='slide'> |
184 <!-- _S9SLIDE_ --> | 184 <!-- _S9SLIDE_ --> |
185 <h2 id="agda-のデータ型">Agda のデータ型</h2> | 185 <h2 id="agda-のデータ型">Agda のデータ型</h2> |
186 <ul> | 186 <ul> |
187 <li>データ型は代数的なデータ構造</li> | 187 <li>データ型は代数的なデータ構造</li> |
188 <li><strong>data</strong> キーワードの後に、<strong>名前 : 型</strong>、 where 句</li> | 188 <li><strong>data</strong> キーワードの後に、<strong>名前 : 型</strong></li> |
189 <li>次の行以降は<strong>コンストラクタ名 : 型</strong></li> | 189 <li>次の行以降は<strong>コンストラクタ名 : 型</strong></li> |
190 <li>型は<strong>-></strong>または<strong>→</strong>で繋げる</li> | 190 <li>型は<strong>-></strong>または<strong>→</strong>で繋げる |
191 <li>例えば、型<strong>PrimComm -> Comm</strong>は<strong>PrimComm</strong> を受け取り<strong>Comm</strong>を返す型</li> | 191 <ul> |
192 <li>再帰的な定義も可能 | 192 <li>例えば、suc の型<strong>Nat → Nat*は</strong>Nat** を受け取り<strong>Nat</strong>を返す型</li> |
193 <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> | 193 <li>これにより 3 を suc (suc (suc zero)) のように表せる |
194 <div class="code"><pre><span class="line-numbers"><a href="#n1" name="n1">1</a></span> data Comm : Set where | 194 <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> |
195 <span class="line-numbers"><a href="#n2" name="n2">2</a></span> Skip : Comm | 195 <div class="code"><pre><span class="line-numbers"><a href="#n1" name="n1">1</a></span> data Nat : Set where |
196 <span class="line-numbers"><a href="#n3" name="n3">3</a></span> Abort : Comm | 196 <span class="line-numbers"><a href="#n2" name="n2">2</a></span> zero : Nat |
197 <span class="line-numbers"><a href="#n4" name="n4">4</a></span> PComm : PrimComm -> Comm | 197 <span class="line-numbers"><a href="#n3" name="n3">3</a></span> suc : Nat → Nat |
198 <span class="line-numbers"><a href="#n5" name="n5">5</a></span> Seq : Comm -> Comm -> Comm | 198 </pre></div> |
199 <span class="line-numbers"><a href="#n6" name="n6">6</a></span> If : Cond -> Comm -> Comm -> Comm | 199 </div> |
200 <span class="line-numbers"><a href="#n7" name="n7">7</a></span> While : Cond -> Comm -> Comm | 200 </div> |
201 </pre></div> | 201 </li> |
202 </div> | 202 </ul> |
203 </div> | |
204 </li> | 203 </li> |
205 </ul> | 204 </ul> |
206 | 205 |
207 <!-- - where は宣言した部分に束縛する --> | 206 <!-- - where は宣言した部分に束縛する --> |
208 | 207 |
215 <h2 id="agda-のレコード型">Agda のレコード型</h2> | 214 <h2 id="agda-のレコード型">Agda のレコード型</h2> |
216 <ul> | 215 <ul> |
217 <li>C 言語での構造体に近い</li> | 216 <li>C 言語での構造体に近い</li> |
218 <li>複数のデータをまとめる</li> | 217 <li>複数のデータをまとめる</li> |
219 <li>関数内で構築できる</li> | 218 <li>関数内で構築できる</li> |
220 <li>構築時は<strong>レコード名 {フィールド名 = 値}</strong></li> | 219 <li>構築時は<strong>record レコード名 {フィールド名 = 値}</strong></li> |
221 <li>複数ある場合は <strong>{フィールド1 = 1 ; フィールド2 = 2}</strong>のように <strong>;</strong> を使って列挙 | 220 <li>複数ある場合は <strong>record Env {varn = 1 ; varn = 2}</strong>のように <strong>;</strong> を使って列挙 |
222 <ul> | 221 <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> |
223 <li>(varn,vari の型 <strong>ℕ</strong> は Agda 上の 自然数、 データ型で zero : ℕ と succ : ℕ -> ℕ で定義されてる) | 222 <div class="code"><pre><span class="line-numbers"><a href="#n1" name="n1">1</a></span> record Env : Set where |
223 <span class="line-numbers"><a href="#n2" name="n2">2</a></span> field | |
224 <span class="line-numbers"><a href="#n3" name="n3">3</a></span> varn : Nat | |
225 <span class="line-numbers"><a href="#n4" name="n4">4</a></span> vari : Nat | |
226 </pre></div> | |
227 </div> | |
228 </div> | |
229 </li> | |
230 </ul> | |
231 | |
232 | |
233 | |
234 </div> | |
235 | |
236 <div class='slide'> | |
237 <!-- _S9SLIDE_ --> | |
238 <h2 id="agda-の関数">Agda の関数</h2> | |
239 <ul> | |
240 <li>関数にも型が必要(1行目) | |
241 <ul> | |
242 <li>引き算はは自然数を2つ取って結果の自然数を返す</li> | |
243 <li><strong>_</strong> は任意の値、名前で使うと受け取った引数が順番に入る</li> | |
244 </ul> | |
245 </li> | |
246 <li>関数本体は <strong>関数名 = 値</strong></li> | |
247 <li>関数ではパターンマッチがかける | |
248 <ul> | |
249 <li>ここでは関数名に <strong>_</strong> を使っているため<strong>Nat</strong>の定義にから zero かそれ以外でパターンマッチ | |
224 <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> | 250 <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> |
225 <div class="code"><pre><span class="line-numbers"><a href="#n1" name="n1">1</a></span>record Env : Set where | 251 <div class="code"><pre><span class="line-numbers"><a href="#n1" name="n1">1</a></span> _-_ : Nat → Nat → Nat |
226 <span class="line-numbers"><a href="#n2" name="n2">2</a></span> field | 252 <span class="line-numbers"><a href="#n2" name="n2">2</a></span> x - zero = x |
227 <span class="line-numbers"><a href="#n3" name="n3">3</a></span> varn : ℕ | 253 <span class="line-numbers"><a href="#n3" name="n3">3</a></span> zero - _ = zero |
228 <span class="line-numbers"><a href="#n4" name="n4">4</a></span> vari : ℕ | 254 <span class="line-numbers"><a href="#n4" name="n4">4</a></span> (suc x) - (suc y) = x - y |
229 </pre></div> | 255 </pre></div> |
230 </div> | 256 </div> |
231 </div> | 257 </div> |
232 </li> | 258 </li> |
233 </ul> | 259 </ul> |
238 | 264 |
239 </div> | 265 </div> |
240 | 266 |
241 <div class='slide'> | 267 <div class='slide'> |
242 <!-- _S9SLIDE_ --> | 268 <!-- _S9SLIDE_ --> |
243 <h2 id="agda-の関数">Agda の関数</h2> | |
244 <ul> | |
245 <li>関数にも型が必要</li> | |
246 <li>関数は <strong>関数名 = 値</strong></li> | |
247 <li>関数ではパターンマッチがかける</li> | |
248 <li><strong>_</strong> は任意の引数 | |
249 <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> | |
250 <div class="code"><pre><span class="line-numbers"><a href="#n1" name="n1">1</a></span> _-_ : ℕ → ℕ → ℕ | |
251 <span class="line-numbers"><a href="#n2" name="n2">2</a></span> x - zero = x | |
252 <span class="line-numbers"><a href="#n3" name="n3">3</a></span> zero - _ = zero | |
253 <span class="line-numbers"><a href="#n4" name="n4">4</a></span> (suc x) - (suc y) = x - y | |
254 </pre></div> | |
255 </div> | |
256 </div> | |
257 </li> | |
258 </ul> | |
259 | |
260 | |
261 | |
262 </div> | |
263 | |
264 <div class='slide'> | |
265 <!-- _S9SLIDE_ --> | |
266 <h2 id="agda-での証明">Agda での証明</h2> | 269 <h2 id="agda-での証明">Agda での証明</h2> |
267 <ul> | 270 <ul> |
268 <li>関数の型に論理式</li> | 271 <li>関数の型に証明すべき論理式</li> |
269 <li>関数自体にそれを満たす導出</li> | 272 <li>関数自体にそれを満たす導出</li> |
270 <li>完成した関数は証明</li> | 273 <li>完成した関数は証明</li> |
271 <li><strong>{}</strong> は暗黙的(推論される)</li> | 274 <li><strong>{}</strong> は暗黙的(推論される)</li> |
272 <li>下のコードは自然数に 0 を足したとき値が変わらないことの証明 | 275 <li>下のコードは Bool型の x と true の and を取ったものは x と等しいことの証明 |
273 <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> | 276 <ul> |
274 <div class="code"><pre><span class="line-numbers"><a href="#n1" name="n1">1</a></span> +zero : { y : ℕ } → y + zero ≡ y | 277 <li><strong>refl</strong> は <strong>x == x</strong> の左右の項が等しいことの証明 |
275 <span class="line-numbers"><a href="#n2" name="n2">2</a></span> +zero {zero} = refl | 278 <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> |
276 <span class="line-numbers"><a href="#n3" name="n3">3</a></span> +zero {suc y} = cong ( λ x → suc x ) ( +zero {y} ) | 279 <div class="code"><pre><span class="line-numbers"><a href="#n1" name="n1">1</a></span> ∧true : { x : Bool } → x ∧ true ≡ x |
277 </pre></div> | 280 <span class="line-numbers"><a href="#n2" name="n2">2</a></span> ∧true {x} with x |
278 </div> | 281 <span class="line-numbers"><a href="#n3" name="n3">3</a></span> ∧true {x} | false = refl |
279 </div> | 282 <span class="line-numbers"><a href="#n4" name="n4">4</a></span> ∧true {x} | true = refl |
283 </pre></div> | |
284 </div> | |
285 </div> | |
286 </li> | |
287 </ul> | |
280 </li> | 288 </li> |
281 </ul> | 289 </ul> |
282 | 290 |
283 | 291 |
284 | 292 |
286 | 294 |
287 <div class='slide'> | 295 <div class='slide'> |
288 <!-- _S9SLIDE_ --> | 296 <!-- _S9SLIDE_ --> |
289 <h2 id="agda-上での-hoarelogic">Agda 上での HoareLogic</h2> | 297 <h2 id="agda-上での-hoarelogic">Agda 上での HoareLogic</h2> |
290 <ul> | 298 <ul> |
291 <li>現在 Agda での HoareLogic は初期のAgda の実装である Agda1(現在のものはAgda2)で実装されたものと | 299 <li>Agda での HoareLogic は初期のAgda の実装である Agda1(現在のものはAgda2)で実装されたものと |
292 それを Agda2 に書き写したものが存在している。</li> | 300 それを Agda2 に書き写したものが存在している。</li> |
293 <li>今回はAgda2側の HoareLogic で使うコマンド定義の一部と、コマンドの証明に使うルールを借りて説明を行う。</li> | 301 <li>今回はAgda2側の HoareLogic で使うコマンド定義の一部と、コマンドの証明に使うルールを借りて Agda2上で HoareLogic を構築する</li> |
294 </ul> | 302 </ul> |
295 | 303 |
296 | 304 |
297 | 305 |
298 </div> | 306 </div> |
299 | 307 |
300 <div class='slide'> | 308 <div class='slide'> |
301 <!-- _S9SLIDE_ --> | 309 <!-- _S9SLIDE_ --> |
302 <h2 id="agda-での-hoarelogic-の理解">Agda での HoareLogic の理解</h2> | 310 <h2 id="hoarelogic-とは">HoareLogic とは</h2> |
303 <ul> | |
304 <li>HoareLogic を用いて次のようなプログラム(while Program)を検証した。 | |
305 <div class="language-C highlighter-coderay"><div class="CodeRay"> | |
306 <div class="code"><pre><span class="line-numbers"><a href="#n1" name="n1">1</a></span> n = <span style="color:#00D">10</span>; | |
307 <span class="line-numbers"><a href="#n2" name="n2">2</a></span> i = <span style="color:#00D">0</span>; | |
308 <span class="line-numbers"><a href="#n3" name="n3">3</a></span> | |
309 <span class="line-numbers"><a href="#n4" name="n4">4</a></span> <span style="color:#080;font-weight:bold">while</span> (n><span style="color:#00D">0</span>) | |
310 <span class="line-numbers"><a href="#n5" name="n5">5</a></span> { | |
311 <span class="line-numbers"><a href="#n6" name="n6">6</a></span> i++; | |
312 <span class="line-numbers"><a href="#n7" name="n7">7</a></span> n--; | |
313 <span class="line-numbers"><a href="#n8" name="n8">8</a></span> } | |
314 </pre></div> | |
315 </div> | |
316 </div> | |
317 </li> | |
318 <li>このプログラムは変数iとnをもち、 n>0 の間nの値を減らし、i の値を増やす</li> | |
319 <li>n==0のとき停止するため、終了時の変数の結果はi==10、n==0 になるはずである。</li> | |
320 </ul> | |
321 | |
322 | |
323 | |
324 </div> | |
325 | |
326 <div class='slide'> | |
327 <!-- _S9SLIDE_ --> | |
328 <h2 id="hoarelogic">HoareLogic</h2> | |
329 <ul> | 311 <ul> |
330 <li>Floyd-Hoare Logic (以下HoareLogic)は部分的な正当性を検証する</li> | 312 <li>Floyd-Hoare Logic (以下HoareLogic)は部分的な正当性を検証する</li> |
331 <li>プログラムは事前条件(Pre Condition)、事後条件(Post Condition)を持ち、条件がコマンドで更新され、事後条件になる</li> | 313 <li>プログラムは事前条件(Pre Condition)、事後条件(Post Condition)を持ち、条件がコマンドで更新され、事後条件になる</li> |
332 <li>事前、事後条件には変数や論理式、コマンドには代入や、繰り返し、条件分岐などがある。</li> | 314 <li>事前、事後条件には変数や論理式、コマンドには代入や、繰り返し、条件分岐などがある。</li> |
333 <li>コマンドが正しく成り立つことを保証することで、このコマンドを用いて記述されたプログラムの部分的な正しさを検証する</li> | 315 <li>コマンドが正しく成り立つことを保証することで、このコマンドを用いて記述されたプログラムの部分的な正しさを検証できる</li> |
316 </ul> | |
317 | |
318 | |
319 | |
320 </div> | |
321 | |
322 <div class='slide'> | |
323 <!-- _S9SLIDE_ --> | |
324 <h2 id="hoarelogic-の理解">HoareLogic の理解</h2> | |
325 <ul> | |
326 <li>HoareLogic 例として疑似コードを用意した</li> | |
327 <li>このプログラムは変数iとnをもち、 n>0 の間nの値を減らし、i の値を増やす</li> | |
328 <li>n==0 のとき停止するため、終了時の変数の結果は i==10、n==0 になるはずである。</li> | |
329 <li>次のスライドから Agda 上 HoareLogic を実装し、その上でこの whileProgram の検証を行う | |
330 <div class="language-C highlighter-coderay"><div class="CodeRay"> | |
331 <div class="code"><pre><span class="line-numbers"><a href="#n1" name="n1">1</a></span> n = <span style="color:#00D">10</span>; | |
332 <span class="line-numbers"><a href="#n2" name="n2">2</a></span> i = <span style="color:#00D">0</span>; | |
333 <span class="line-numbers"><a href="#n3" name="n3">3</a></span> | |
334 <span class="line-numbers"><a href="#n4" name="n4">4</a></span> <span style="color:#080;font-weight:bold">while</span> (n><span style="color:#00D">0</span>) | |
335 <span class="line-numbers"><a href="#n5" name="n5">5</a></span> { | |
336 <span class="line-numbers"><a href="#n6" name="n6">6</a></span> i++; | |
337 <span class="line-numbers"><a href="#n7" name="n7">7</a></span> n--; | |
338 <span class="line-numbers"><a href="#n8" name="n8">8</a></span> } | |
339 </pre></div> | |
340 </div> | |
341 </div> | |
342 </li> | |
343 </ul> | |
344 | |
345 | |
346 | |
347 </div> | |
348 | |
349 <div class='slide'> | |
350 <!-- _S9SLIDE_ --> | |
351 <h2 id="agda-上での-hoarelogic条件変数の定義">Agda 上での HoareLogic(条件、変数の定義)</h2> | |
352 <ul> | |
353 <li><strong>Env</strong> は while Program で必要な変数をまとめたもの</li> | |
354 <li>varn、vari はそれぞれ変数 n、 i</li> | |
355 <li><strong>Cond</strong> は Pre、Post の Condition で Env を受け取って Bool 値(true か false)を返す | |
356 <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> | |
357 <div class="code"><pre><span class="line-numbers"><a href="#n1" name="n1">1</a></span> record Env : Set where | |
358 <span class="line-numbers"><a href="#n2" name="n2">2</a></span> field | |
359 <span class="line-numbers"><a href="#n3" name="n3">3</a></span> varn : Nat | |
360 <span class="line-numbers"><a href="#n4" name="n4">4</a></span> vari : Nat | |
361 <span class="line-numbers"><a href="#n5" name="n5">5</a></span> | |
362 <span class="line-numbers"><a href="#n6" name="n6">6</a></span> Cond : Set | |
363 <span class="line-numbers"><a href="#n7" name="n7">7</a></span> Cond = (Env → Bool) | |
364 </pre></div> | |
365 </div> | |
366 </div> | |
367 </li> | |
334 </ul> | 368 </ul> |
335 | 369 |
336 | 370 |
337 | 371 |
338 </div> | 372 </div> |
339 | 373 |
340 <div class='slide'> | 374 <div class='slide'> |
341 <!-- _S9SLIDE_ --> | 375 <!-- _S9SLIDE_ --> |
342 <h2 id="agda-上での-hoarelogicコマンド定義">Agda 上での HoareLogic(コマンド定義)</h2> | 376 <h2 id="agda-上での-hoarelogicコマンド定義">Agda 上での HoareLogic(コマンド定義)</h2> |
343 <ul> | 377 <ul> |
344 <li>Env は while Program の変数である var n, i</li> | 378 <li><strong>Comm</strong> は Agda のデータ型で定義した HoareLogic のコマンド |
345 <li><strong>PrimComm</strong> は代入時に使用される</li> | 379 <ul> |
346 <li><strong>Cond</strong> は Condition で Env を受け取って Boolean の値を返す | 380 <li><strong>PComm</strong> は変数を代入のコマンド</li> |
347 <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> | 381 <li><strong>Seq</strong> はコマンドの推移、 Command を実行して次の Command に移す</li> |
348 <div class="code"><pre><span class="line-numbers"> <a href="#n1" name="n1">1</a></span> record Env : Set where | 382 <li><strong>If</strong> は条件分岐のコマンド</li> |
349 <span class="line-numbers"> <a href="#n2" name="n2">2</a></span> field | 383 <li><strong>while</strong> は繰り返しのコマンド</li> |
350 <span class="line-numbers"> <a href="#n3" name="n3">3</a></span> varn : ℕ | 384 </ul> |
351 <span class="line-numbers"> <a href="#n4" name="n4">4</a></span> vari : ℕ | 385 </li> |
352 <span class="line-numbers"> <a href="#n5" name="n5">5</a></span> | 386 <li>他にも何もしないコマンドやコマンドの停止などのコマンドもある</li> |
353 <span class="line-numbers"> <a href="#n6" name="n6">6</a></span> PrimComm : Set | 387 <li><strong>PrimComm</strong> は Env を受け取って Env を返す定義 |
354 <span class="line-numbers"> <a href="#n7" name="n7">7</a></span> PrimComm = Env → Env | 388 <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> |
355 <span class="line-numbers"> <a href="#n8" name="n8">8</a></span> | 389 <div class="code"><pre><span class="line-numbers"><a href="#n1" name="n1">1</a></span> data Comm : Set where |
356 <span class="line-numbers"> <a href="#n9" name="n9">9</a></span> Cond : Set | 390 <span class="line-numbers"><a href="#n2" name="n2">2</a></span> PComm : PrimComm → Comm |
357 <span class="line-numbers"><strong><a href="#n10" name="n10">10</a></strong></span> Cond = (Env → Bool) | 391 <span class="line-numbers"><a href="#n3" name="n3">3</a></span> Seq : Comm → Comm → Comm |
358 </pre></div> | 392 <span class="line-numbers"><a href="#n4" name="n4">4</a></span> If : Cond → Comm → Comm → Comm |
359 </div> | 393 <span class="line-numbers"><a href="#n5" name="n5">5</a></span> While : Cond → Comm → Comm |
360 </div> | 394 <span class="line-numbers"><a href="#n6" name="n6">6</a></span> |
361 </li> | 395 <span class="line-numbers"><a href="#n7" name="n7">7</a></span> PrimComm : Set |
362 </ul> | 396 <span class="line-numbers"><a href="#n8" name="n8">8</a></span> PrimComm = Env → Env |
363 | 397 </pre></div> |
364 | 398 </div> |
365 | 399 </div> |
366 </div> | 400 </li> |
367 | 401 </ul> |
368 <div class='slide'> | 402 |
369 <!-- _S9SLIDE_ --> | 403 |
370 <h2 id="agda-上での-hoarelogicコマンド定義-1">Agda 上での HoareLogic(コマンド定義)</h2> | 404 |
371 <ul> | 405 </div> |
372 <li><strong>Comm</strong> は Agda のデータ型で定義した HoareLogic の Command | 406 |
373 <ul> | 407 <div class='slide'> |
374 <li><strong>Skip</strong> は何も変更しない</li> | 408 <!-- _S9SLIDE_ --> |
375 <li><strong>PComm</strong> は変数を代入する</li> | 409 <h2 id="agda-上での-hoarelogic実際のプログラムの記述">Agda 上での HoareLogic(実際のプログラムの記述)</h2> |
376 <li><strong>Seq</strong> は Command を実行して次の Command に移す</li> | 410 <ul> |
377 <li><strong>If</strong> は Cond と2つの Comm を受け取り Cond の状態により実行する Comm を変える</li> | 411 <li>先程定義したコマンドを使って while Program を記述した |
378 <li><strong>while</strong> は Cond と Comm を受け取り Cond の中身が真である間 Comm を繰り返す | 412 <ul> |
413 <li>任意の自然数を引数に取る形になっているが<strong>c10 == 10</strong>ということにする</li> | |
414 </ul> | |
415 </li> | |
416 <li><strong>$</strong> は <strong>()</strong> の糖衣で行頭から行末までを ( ) で囲う</li> | |
417 <li>見やすさのため改行しているが 3~7 行は1行 | |
418 <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> | |
419 <div class="code"><pre><span class="line-numbers"><a href="#n1" name="n1">1</a></span> program : ℕ → Comm | |
420 <span class="line-numbers"><a href="#n2" name="n2">2</a></span> program c10 = | |
421 <span class="line-numbers"><a href="#n3" name="n3">3</a></span> Seq ( PComm (λ env → record env {varn = c10})) -- n = 10; | |
422 <span class="line-numbers"><a href="#n4" name="n4">4</a></span> $ Seq ( PComm (λ env → record env {vari = 0})) -- i = 0; | |
423 <span class="line-numbers"><a href="#n5" name="n5">5</a></span> $ While (λ env → lt zero (varn env ) ) -- while (n>0) { | |
424 <span class="line-numbers"><a href="#n6" name="n6">6</a></span> (Seq (PComm (λ env → record env {vari = ((vari env) + 1)} )) -- i++; | |
425 <span class="line-numbers"><a href="#n7" name="n7">7</a></span> $ PComm (λ env → record env {varn = ((varn env) - 1)} )) -- n--; | |
426 </pre></div> | |
427 </div> | |
428 </div> | |
429 </li> | |
430 </ul> | |
431 | |
432 | |
433 | |
434 </div> | |
435 | |
436 <div class='slide'> | |
437 <!-- _S9SLIDE_ --> | |
438 <h2 id="agda-上での-hoarelogicコマンドの保証13">Agda 上での HoareLogic(コマンドの保証)1/3</h2> | |
439 <ul> | |
440 <li>保証の規則は HTProof にまとめられてる</li> | |
441 <li><strong>PrimRule</strong> は <strong>PComm</strong> で行う代入を保証する</li> | |
442 <li>3行目の pr の型 Axiom は PreCondition に PrimComm が適用されると PostCondition になることの記述 | |
443 <ul> | |
444 <li><strong><em>⇒</em></strong> は pre, post の Condition をとって post の Condition が成り立つときに True を返す | |
379 <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> | 445 <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> |
380 <div class="code"><pre><span class="line-numbers"><a href="#n1" name="n1">1</a></span>data Comm : Set where | 446 <div class="code"><pre><span class="line-numbers"><a href="#n1" name="n1">1</a></span> data HTProof : Cond → Comm → Cond → Set where |
381 <span class="line-numbers"><a href="#n2" name="n2">2</a></span> Skip : Comm | 447 <span class="line-numbers"><a href="#n2" name="n2">2</a></span> PrimRule : {bPre : Cond} → {pcm : PrimComm} → {bPost : Cond} → |
382 <span class="line-numbers"><a href="#n3" name="n3">3</a></span> Abort : Comm | 448 <span class="line-numbers"><a href="#n3" name="n3">3</a></span> (pr : Axiom bPre pcm bPost) → |
383 <span class="line-numbers"><a href="#n4" name="n4">4</a></span> PComm : PrimComm -> Comm | 449 <span class="line-numbers"><a href="#n4" name="n4">4</a></span> HTProof bPre (PComm pcm) bPost |
384 <span class="line-numbers"><a href="#n5" name="n5">5</a></span> Seq : Comm -> Comm -> Comm | 450 <span class="line-numbers"><a href="#n5" name="n5">5</a></span>-- 次のスライドに続く |
385 <span class="line-numbers"><a href="#n6" name="n6">6</a></span> If : Cond -> Comm -> Comm -> Comm | 451 </pre></div> |
386 <span class="line-numbers"><a href="#n7" name="n7">7</a></span> While : Cond -> Comm -> Comm | 452 </div> |
453 </div> | |
454 <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> | |
455 <div class="code"><pre><span class="line-numbers"><a href="#n1" name="n1">1</a></span> Axiom : Cond → PrimComm → Cond → Set | |
456 <span class="line-numbers"><a href="#n2" name="n2">2</a></span> Axiom pre comm post = ∀ (env : Env) → (pre env) ⇒ ( post (comm env)) ≡ true | |
387 </pre></div> | 457 </pre></div> |
388 </div> | 458 </div> |
389 </div> | 459 </div> |
390 </li> | 460 </li> |
391 </ul> | 461 </ul> |
396 | 466 |
397 </div> | 467 </div> |
398 | 468 |
399 <div class='slide'> | 469 <div class='slide'> |
400 <!-- _S9SLIDE_ --> | 470 <!-- _S9SLIDE_ --> |
401 <h2 id="agda-上での-hoarelogic実際のプログラムの記述">Agda 上での HoareLogic(実際のプログラムの記述)</h2> | 471 <h2 id="agda-上での-hoarelogicコマンド保証23">Agda 上での HoareLogic(コマンド保証)2/3</h2> |
402 <ul> | |
403 <li>Command を使って while Program を記述した。</li> | |
404 <li><strong>$</strong> は <strong>()</strong> の糖衣で行頭から行末までを ( ) で囲う | |
405 <ul> | |
406 <li>見やすさのため改行しているため 3~7 行はまとまっている</li> | |
407 </ul> | |
408 </li> | |
409 <li>Seq は Comm を2つ取って次の Comm に移行する | |
410 <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> | |
411 <div class="code"><pre><span class="line-numbers"><a href="#n1" name="n1">1</a></span> program : Comm | |
412 <span class="line-numbers"><a href="#n2" name="n2">2</a></span> program = | |
413 <span class="line-numbers"><a href="#n3" name="n3">3</a></span> Seq ( PComm (λ env → record env {varn = 10})) | |
414 <span class="line-numbers"><a href="#n4" name="n4">4</a></span> $ Seq ( PComm (λ env → record env {vari = 0})) | |
415 <span class="line-numbers"><a href="#n5" name="n5">5</a></span> $ While (λ env → lt zero (varn env ) ) | |
416 <span class="line-numbers"><a href="#n6" name="n6">6</a></span> (Seq (PComm (λ env → record env {vari = ((vari env) + 1)} )) | |
417 <span class="line-numbers"><a href="#n7" name="n7">7</a></span> $ PComm (λ env → record env {varn = ((varn env) - 1)} )) | |
418 </pre></div> | |
419 </div> | |
420 </div> | |
421 </li> | |
422 </ul> | |
423 | |
424 | |
425 | |
426 </div> | |
427 | |
428 <div class='slide'> | |
429 <!-- _S9SLIDE_ --> | |
430 <h2 id="agda-上での-hoarelogicの理解">Agda 上での HoareLogicの理解</h2> | |
431 <ul> | |
432 <li>規則は HTProof にまとめられてる</li> | |
433 <li><strong>PrimRule</strong> は <strong>PComm</strong> で行う代入を保証する</li> | |
434 <li>3行目の pr の型 Axiom は PreCondition に PrimComm が適用されると PostCondition になることの記述 | |
435 <ul> | |
436 <li><strong><em>⇒</em></strong> は pre, post の Condition をとって post の Condition が成り立つときに True を返す関数</li> | |
437 </ul> | |
438 </li> | |
439 <li>SkipRule は PreCondition を変更しないことの保証</li> | |
440 <li>AbortRule は プログラムが停止するときのルール | |
441 <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> | |
442 <div class="code"><pre><span class="line-numbers"><a href="#n1" name="n1">1</a></span> data HTProof : Cond -> Comm -> Cond -> Set where | |
443 <span class="line-numbers"><a href="#n2" name="n2">2</a></span> PrimRule : {bPre : Cond} -> {pcm : PrimComm} -> {bPost : Cond} -> | |
444 <span class="line-numbers"><a href="#n3" name="n3">3</a></span> (pr : Axiom bPre pcm bPost) -> | |
445 <span class="line-numbers"><a href="#n4" name="n4">4</a></span> HTProof bPre (PComm pcm) bPost | |
446 <span class="line-numbers"><a href="#n5" name="n5">5</a></span> SkipRule : (b : Cond) -> HTProof b Skip b | |
447 <span class="line-numbers"><a href="#n6" name="n6">6</a></span> AbortRule : (bPre : Cond) -> (bPost : Cond) -> | |
448 <span class="line-numbers"><a href="#n7" name="n7">7</a></span> HTProof bPre Abort bPost | |
449 <span class="line-numbers"><a href="#n8" name="n8">8</a></span>-- 次のスライドに続く | |
450 </pre></div> | |
451 </div> | |
452 </div> | |
453 <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> | |
454 <div class="code"><pre><span class="line-numbers"><a href="#n1" name="n1">1</a></span> Axiom : Cond -> PrimComm -> Cond -> Set | |
455 <span class="line-numbers"><a href="#n2" name="n2">2</a></span> Axiom pre comm post = ∀ (env : Env) → (pre env) ⇒ ( post (comm env)) ≡ true | |
456 </pre></div> | |
457 </div> | |
458 </div> | |
459 </li> | |
460 </ul> | |
461 | |
462 | |
463 | |
464 </div> | |
465 | |
466 <div class='slide'> | |
467 <!-- _S9SLIDE_ --> | |
468 <h2 id="agda-上での-hoarelogicの理解-1">Agda 上での HoareLogicの理解</h2> | |
469 <ul> | 472 <ul> |
470 <li><strong>SeqRule</strong> は Command を推移させる Seq の保証</li> | 473 <li><strong>SeqRule</strong> は Command を推移させる Seq の保証</li> |
471 <li><strong>IfRule</strong> は If の Command が正しく動くことを保証 | 474 <li><strong>IfRule</strong> は If の Command が正しく動くことを保証 |
472 <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> | 475 <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> |
473 <div class="code"><pre><span class="line-numbers"> <a href="#n1" name="n1">1</a></span>-- HTProof の続き | 476 <div class="code"><pre><span class="line-numbers"> <a href="#n1" name="n1">1</a></span>-- HTProof の続き |
474 <span class="line-numbers"> <a href="#n2" name="n2">2</a></span> SeqRule : {bPre : Cond} -> {cm1 : Comm} -> {bMid : Cond} -> | 477 <span class="line-numbers"> <a href="#n2" name="n2">2</a></span> SeqRule : {bPre : Cond} → {cm1 : Comm} → {bMid : Cond} → |
475 <span class="line-numbers"> <a href="#n3" name="n3">3</a></span> {cm2 : Comm} -> {bPost : Cond} -> | 478 <span class="line-numbers"> <a href="#n3" name="n3">3</a></span> {cm2 : Comm} → {bPost : Cond} → |
476 <span class="line-numbers"> <a href="#n4" name="n4">4</a></span> HTProof bPre cm1 bMid -> | 479 <span class="line-numbers"> <a href="#n4" name="n4">4</a></span> HTProof bPre cm1 bMid → |
477 <span class="line-numbers"> <a href="#n5" name="n5">5</a></span> HTProof bMid cm2 bPost -> | 480 <span class="line-numbers"> <a href="#n5" name="n5">5</a></span> HTProof bMid cm2 bPost → |
478 <span class="line-numbers"> <a href="#n6" name="n6">6</a></span> HTProof bPre (Seq cm1 cm2) bPost | 481 <span class="line-numbers"> <a href="#n6" name="n6">6</a></span> HTProof bPre (Seq cm1 cm2) bPost |
479 <span class="line-numbers"> <a href="#n7" name="n7">7</a></span> IfRule : {cmThen : Comm} -> {cmElse : Comm} -> | 482 <span class="line-numbers"> <a href="#n7" name="n7">7</a></span> IfRule : {cmThen : Comm} → {cmElse : Comm} → |
480 <span class="line-numbers"> <a href="#n8" name="n8">8</a></span> {bPre : Cond} -> {bPost : Cond} -> | 483 <span class="line-numbers"> <a href="#n8" name="n8">8</a></span> {bPre : Cond} → {bPost : Cond} → |
481 <span class="line-numbers"> <a href="#n9" name="n9">9</a></span> {b : Cond} -> | 484 <span class="line-numbers"> <a href="#n9" name="n9">9</a></span> {b : Cond} → |
482 <span class="line-numbers"><strong><a href="#n10" name="n10">10</a></strong></span> HTProof (bPre /\ b) cmThen bPost -> | 485 <span class="line-numbers"><strong><a href="#n10" name="n10">10</a></strong></span> HTProof (bPre /\ b) cmThen bPost → |
483 <span class="line-numbers"><a href="#n11" name="n11">11</a></span> HTProof (bPre /\ neg b) cmElse bPost -> | 486 <span class="line-numbers"><a href="#n11" name="n11">11</a></span> HTProof (bPre /\ neg b) cmElse bPost → |
484 <span class="line-numbers"><a href="#n12" name="n12">12</a></span> HTProof bPre (If b cmThen cmElse) bPost | 487 <span class="line-numbers"><a href="#n12" name="n12">12</a></span> HTProof bPre (If b cmThen cmElse) bPost |
485 </pre></div> | 488 </pre></div> |
486 </div> | 489 </div> |
487 </div> | 490 </div> |
488 </li> | 491 </li> |
489 </ul> | 492 </ul> |
490 | 493 |
491 | 494 |
492 | 495 |
493 </div> | 496 </div> |
494 | 497 |
495 <div class='slide'> | 498 <div class='slide'> |
496 <!-- _S9SLIDE_ --> | 499 <!-- _S9SLIDE_ --> |
497 <h2 id="agda-上での-hoarelogicの理解-2">Agda 上での HoareLogicの理解</h2> | 500 <h2 id="agda-上での-hoarelogicコマンド保証33">Agda 上での HoareLogic(コマンド保証)3/3</h2> |
498 <ul> | 501 <ul> |
499 <li><strong>WeakeningRule</strong> は通常の Condition からループ不変条件(Loop Invaliant)に変換</li> | 502 <li><strong>WeakeningRule</strong> は通常の Condition からループ不変条件(Loop Invaliant)に変換</li> |
500 <li>Tautology は Condition と不変条件が等しく成り立つ</li> | 503 <li>Tautology は Condition と不変条件が等しく成り立つ</li> |
501 <li><strong>WhileRule</strong> はループ不変条件が成り立つ間 Comm を繰り返す | 504 <li><strong>WhileRule</strong> はループ不変条件が成り立つ間 Comm を繰り返す |
502 <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> | 505 <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> |
503 <div class="code"><pre><span class="line-numbers"> <a href="#n1" name="n1">1</a></span>-- HTProof の続き | 506 <div class="code"><pre><span class="line-numbers"> <a href="#n1" name="n1">1</a></span>-- HTProof の続き |
504 <span class="line-numbers"> <a href="#n2" name="n2">2</a></span> WeakeningRule : {bPre : Cond} -> {bPre' : Cond} -> {cm : Comm} -> | 507 <span class="line-numbers"> <a href="#n2" name="n2">2</a></span> WeakeningRule : {bPre : Cond} → {bPre' : Cond} → {cm : Comm} → |
505 <span class="line-numbers"> <a href="#n3" name="n3">3</a></span> {bPost' : Cond} -> {bPost : Cond} -> | 508 <span class="line-numbers"> <a href="#n3" name="n3">3</a></span> {bPost' : Cond} → {bPost : Cond} → |
506 <span class="line-numbers"> <a href="#n4" name="n4">4</a></span> Tautology bPre bPre' -> | 509 <span class="line-numbers"> <a href="#n4" name="n4">4</a></span> Tautology bPre bPre' → |
507 <span class="line-numbers"> <a href="#n5" name="n5">5</a></span> HTProof bPre' cm bPost' -> | 510 <span class="line-numbers"> <a href="#n5" name="n5">5</a></span> HTProof bPre' cm bPost' → |
508 <span class="line-numbers"> <a href="#n6" name="n6">6</a></span> Tautology bPost' bPost -> | 511 <span class="line-numbers"> <a href="#n6" name="n6">6</a></span> Tautology bPost' bPost → |
509 <span class="line-numbers"> <a href="#n7" name="n7">7</a></span> HTProof bPre cm bPost | 512 <span class="line-numbers"> <a href="#n7" name="n7">7</a></span> HTProof bPre cm bPost |
510 <span class="line-numbers"> <a href="#n8" name="n8">8</a></span> WhileRule : {cm : Comm} -> {bInv : Cond} -> {b : Cond} -> | 513 <span class="line-numbers"> <a href="#n8" name="n8">8</a></span> WhileRule : {cm : Comm} → {bInv : Cond} → {b : Cond} → |
511 <span class="line-numbers"> <a href="#n9" name="n9">9</a></span> HTProof (bInv /\ b) cm bInv -> | 514 <span class="line-numbers"> <a href="#n9" name="n9">9</a></span> HTProof (bInv /\ b) cm bInv → |
512 <span class="line-numbers"><strong><a href="#n10" name="n10">10</a></strong></span> HTProof bInv (While b cm) (bInv /\ neg b) | 515 <span class="line-numbers"><strong><a href="#n10" name="n10">10</a></strong></span> HTProof bInv (While b cm) (bInv /\ neg b) |
513 </pre></div> | 516 </pre></div> |
514 </div> | 517 </div> |
515 </div> | 518 </div> |
516 <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> | 519 <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> |
517 <div class="code"><pre><span class="line-numbers"><a href="#n1" name="n1">1</a></span> Tautology : Cond -> Cond -> Set | 520 <div class="code"><pre><span class="line-numbers"><a href="#n1" name="n1">1</a></span> Tautology : Cond → Cond → Set |
518 <span class="line-numbers"><a href="#n2" name="n2">2</a></span> Tautology pre post = ∀ (env : Env) → (pre env) ⇒ (post env) ≡ true | 521 <span class="line-numbers"><a href="#n2" name="n2">2</a></span> Tautology pre post = ∀ (env : Env) → (pre env) ⇒ (post env) ≡ true |
519 </pre></div> | 522 </pre></div> |
520 </div> | 523 </div> |
521 </div> | 524 </div> |
522 </li> | 525 </li> |
523 </ul> | 526 </ul> |
529 <div class='slide'> | 532 <div class='slide'> |
530 <!-- _S9SLIDE_ --> | 533 <!-- _S9SLIDE_ --> |
531 <h2 id="agda-上での-hoarelogic証明">Agda 上での HoareLogic(証明)</h2> | 534 <h2 id="agda-上での-hoarelogic証明">Agda 上での HoareLogic(証明)</h2> |
532 <ul> | 535 <ul> |
533 <li><strong>proof1</strong> は while Program の証明</li> | 536 <li><strong>proof1</strong> は while Program の証明</li> |
534 <li>HTProof に 初期状態とコマンドで書かれた <strong>program</strong> と終了状態を渡す</li> | 537 <li>HTProof に 初期状態と先程コマンドで記述した whileProgram である <strong>program</strong> と終了状態を渡す</li> |
535 <li>lemma1~5は rule それぞれの証明</li> | 538 <li>Condititon は initCond や termCond のようにそれぞれ定義する必要がある</li> |
536 <li> | 539 <li>program に近い形で証明を記述できる |
537 <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> | 540 <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> |
538 <div class="code"><pre><span class="line-numbers"> <a href="#n1" name="n1">1</a></span>proof1 : HTProof initCond program termCond | 541 <div class="code"><pre><span class="line-numbers"> <a href="#n1" name="n1">1</a></span> proof1 : (c10 : ℕ) → HTProof initCond (program c10 ) (termCond {c10}) |
539 <span class="line-numbers"> <a href="#n2" name="n2">2</a></span>proof1 = | 542 <span class="line-numbers"> <a href="#n2" name="n2">2</a></span> proof1 c10 = |
540 <span class="line-numbers"> <a href="#n3" name="n3">3</a></span> SeqRule {λ e → true} ( PrimRule empty-case ) | 543 <span class="line-numbers"> <a href="#n3" name="n3">3</a></span> SeqRule {λ e → true} ( PrimRule (init-case {c10} )) |
541 <span class="line-numbers"> <a href="#n4" name="n4">4</a></span> $ SeqRule {λ e → Equal (varn e) 10} ( PrimRule lemma1 ) | 544 <span class="line-numbers"> <a href="#n4" name="n4">4</a></span> $ SeqRule {λ e → Equal (varn e) c10} ( PrimRule lemma1 ) |
542 <span class="line-numbers"> <a href="#n5" name="n5">5</a></span> $ WeakeningRule {λ e → (Equal (varn e) 10) ∧ (Equal (vari e) 0)} lemma2 ( | 545 <span class="line-numbers"> <a href="#n5" name="n5">5</a></span> $ WeakeningRule {λ e → (Equal (varn e) c10) ∧ (Equal (vari e) 0)} lemma2 ( |
543 <span class="line-numbers"> <a href="#n6" name="n6">6</a></span> WhileRule {_} {λ e → Equal ((varn e) + (vari e)) 10} | 546 <span class="line-numbers"> <a href="#n6" name="n6">6</a></span> WhileRule {_} {λ e → Equal ((varn e) + (vari e)) c10} |
544 <span class="line-numbers"> <a href="#n7" name="n7">7</a></span> $ SeqRule (PrimRule {λ e → whileInv e ∧ lt zero (varn e) } lemma3 ) | 547 <span class="line-numbers"> <a href="#n7" name="n7">7</a></span> $ SeqRule (PrimRule {λ e → whileInv e ∧ lt zero (varn e) } lemma3 ) |
545 <span class="line-numbers"> <a href="#n8" name="n8">8</a></span> $ PrimRule {whileInv'} {_} {whileInv} lemma4 ) lemma5 | 548 <span class="line-numbers"> <a href="#n8" name="n8">8</a></span> $ PrimRule {whileInv'} {_} {whileInv} lemma4 ) lemma5 |
546 <span class="line-numbers"> <a href="#n9" name="n9">9</a></span> | 549 <span class="line-numbers"> <a href="#n9" name="n9">9</a></span> |
547 <span class="line-numbers"><strong><a href="#n10" name="n10">10</a></strong></span>initCond : Cond | 550 <span class="line-numbers"><strong><a href="#n10" name="n10">10</a></strong></span> initCond : Cond |
548 <span class="line-numbers"><a href="#n11" name="n11">11</a></span>initCond env = true | 551 <span class="line-numbers"><a href="#n11" name="n11">11</a></span> initCond env = true |
549 <span class="line-numbers"><a href="#n12" name="n12">12</a></span> | 552 <span class="line-numbers"><a href="#n12" name="n12">12</a></span> |
550 <span class="line-numbers"><a href="#n13" name="n13">13</a></span>termCond : {c10 : ℕ} → Cond | 553 <span class="line-numbers"><a href="#n13" name="n13">13</a></span> termCond : {c10 : Nat} → Cond |
551 <span class="line-numbers"><a href="#n14" name="n14">14</a></span>termCond {c10} env = Equal (vari env) c10 | 554 <span class="line-numbers"><a href="#n14" name="n14">14</a></span> termCond {c10} env = Equal (vari env) c10 |
552 </pre></div> | 555 </pre></div> |
553 </div> | 556 </div> |
554 </div> | 557 </div> |
555 </li> | 558 <!-- * lemma1~5は rule それぞれの証明 --> |
556 </ul> | 559 <!-- program : Comm --> |
557 | 560 <!-- program = --> |
558 <p><!-- program : Comm --> | 561 <!-- Seq ( PComm (λ env → record env {varn = 10})) --> |
559 <!-- program = --> | 562 <!-- $ Seq ( PComm (λ env → record env {vari = 0})) --> |
560 <!-- Seq ( PComm (λ env → record env {varn = 10})) --> | 563 <!-- $ While (λ env → lt zero (varn env ) ) --> |
561 <!-- $ Seq ( PComm (λ env → record env {vari = 0})) --> | 564 <!-- (Seq (PComm (λ env → record env {vari = ((vari env) + 1)} )) --> |
562 <!-- $ While (λ env → lt zero (varn env ) ) --> | 565 <!-- $ PComm (λ env → record env {varn = ((varn env) - 1)} )) --> |
563 <!-- (Seq (PComm (λ env → record env {vari = ((vari env) + 1)} )) --> | 566 </li> |
564 <!-- $ PComm (λ env → record env {varn = ((varn env) - 1)} )) --></p> | 567 </ul> |
565 | 568 |
566 | 569 |
567 | 570 |
568 </div> | 571 </div> |
569 | 572 |
570 <div class='slide'> | 573 <div class='slide'> |
571 <!-- _S9SLIDE_ --> | 574 <!-- _S9SLIDE_ --> |
572 <h2 id="証明の一部">証明の一部</h2> | 575 <h2 id="証明の一部lemma1">証明の一部(lemma1)</h2> |
573 <ul> | 576 <ul> |
574 <li>型だけ載せる</li> | 577 <li>PComm の証明である lemma1 だけ解説</li> |
575 <li>基本的な証明方法は Condtition を変化させて次の Condition が成り立つように変形する</li> | 578 <li>lemma1 は n に 10 を代入したあと、 i に 0 を代入するところ</li> |
576 <li>impl⇒ | 579 <li>証明することは<strong>事前条件の n ≡ 10 が成り立つか</strong></li> |
577 <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> | 580 <li>PreCondition が成り立つとき、Command を実行するとPostConditionが成り立つ |
578 <div class="code"><pre><span class="line-numbers"> <a href="#n1" name="n1">1</a></span> lemma1 : {c10 : ℕ} → Axiom (stmt1Cond {c10}) (λ env → record { varn = varn env ; vari = 0 }) (stmt2Cond {c10}) | 581 <ul> |
579 <span class="line-numbers"> <a href="#n2" name="n2">2</a></span> lemma1 {c10} env = impl⇒ ( λ cond → let open ≡-Reasoning in | 582 <li>Axiom は x ⇒ y ≡ true が成り立てば良かった</li> |
580 <span class="line-numbers"> <a href="#n3" name="n3">3</a></span> begin | 583 <li><strong><em>⇒</em></strong> は事後条件が成り立つかどうか</li> |
581 <span class="line-numbers"> <a href="#n4" name="n4">4</a></span> (Equal (varn env) c10 ) ∧ true | 584 <li>impl⇒ は x ≡ true → y ≡ true の関数(Command)を受け取って x ⇒ y ≡ true を返す関数</li> |
582 <span class="line-numbers"> <a href="#n5" name="n5">5</a></span> ≡⟨ ∧true ⟩ | 585 </ul> |
583 <span class="line-numbers"> <a href="#n6" name="n6">6</a></span> Equal (varn env) c10 | 586 </li> |
584 <span class="line-numbers"> <a href="#n7" name="n7">7</a></span> ≡⟨ cond ⟩ | 587 <li><strong>≡-Reasoning</strong> は Agda での等式変形 |
585 <span class="line-numbers"> <a href="#n8" name="n8">8</a></span> true | 588 <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> |
586 <span class="line-numbers"> <a href="#n9" name="n9">9</a></span> ∎ ) | 589 <div class="code"><pre><span class="line-numbers"> <a href="#n1" name="n1">1</a></span> lemma1 : {c10 : Nat} → Axiom (stmt1Cond {c10}) |
587 </pre></div> | 590 <span class="line-numbers"> <a href="#n2" name="n2">2</a></span> (λ env → record { varn = varn env ; vari = 0 }) (stmt2Cond {c10}) |
588 </div> | 591 <span class="line-numbers"> <a href="#n3" name="n3">3</a></span> lemma1 {c10} env = impl⇒ ( λ cond → let open ≡-Reasoning in |
589 </div> | 592 <span class="line-numbers"> <a href="#n4" name="n4">4</a></span> begin |
590 | 593 <span class="line-numbers"> <a href="#n5" name="n5">5</a></span> (Equal (varn env) c10 ) ∧ true |
591 <p><!-- lemma2 : {c10 : ℕ} → Tautology stmt2Cond whileInv --></p> | 594 <span class="line-numbers"> <a href="#n6" name="n6">6</a></span> ≡⟨ ∧true ⟩ |
595 <span class="line-numbers"> <a href="#n7" name="n7">7</a></span> Equal (varn env) c10 | |
596 <span class="line-numbers"> <a href="#n8" name="n8">8</a></span> ≡⟨ cond ⟩ | |
597 <span class="line-numbers"> <a href="#n9" name="n9">9</a></span> true | |
598 <span class="line-numbers"><strong><a href="#n10" name="n10">10</a></strong></span> ∎ ) | |
599 <span class="line-numbers"><a href="#n11" name="n11">11</a></span> | |
600 <span class="line-numbers"><a href="#n12" name="n12">12</a></span> stmt1Cond : {c10 : ℕ} → Cond | |
601 <span class="line-numbers"><a href="#n13" name="n13">13</a></span> stmt1Cond {c10} env = Equal (varn env) c10 | |
602 <span class="line-numbers"><a href="#n14" name="n14">14</a></span> | |
603 <span class="line-numbers"><a href="#n15" name="n15">15</a></span> stmt2Cond : {c10 : ℕ} → Cond | |
604 <span class="line-numbers"><a href="#n16" name="n16">16</a></span> stmt2Cond {c10} env = (Equal (varn env) c10) ∧ (Equal (vari env) 0) | |
605 </pre></div> | |
606 </div> | |
607 </div> | |
608 | |
609 <p><!-- lemma2 : {c10 : Nat} → Tautology stmt2Cond whileInv --></p> | |
592 | 610 |
593 <p><!-- lemma3 : Axiom (λ e → whileInv e ∧ lt zero (varn e)) (λ env → record { varn = varn env ; vari = vari env + 1 }) whileInv' --></p> | 611 <p><!-- lemma3 : Axiom (λ e → whileInv e ∧ lt zero (varn e)) (λ env → record { varn = varn env ; vari = vari env + 1 }) whileInv' --></p> |
594 | 612 |
595 <p><!-- lemma4 : {c10 : ℕ} → Axiom whileInv' (λ env → record { varn = varn env - 1 ; vari = vari env }) whileInv --></p> | 613 <p><!-- lemma4 : {c10 : Nat} → Axiom whileInv' (λ env → record { varn = varn env - 1 ; vari = vari env }) whileInv --></p> |
596 | 614 |
597 <p><!-- lemma5 : {c10 : ℕ} → Tautology ((λ e → Equal (varn e + vari e) c10) and (neg (λ z → lt zero (varn z)))) termCond --></p> | 615 <p><!-- lemma5 : {c10 : Nat} → Tautology ((λ e → Equal (varn e + vari e) c10) and (neg (λ z → lt zero (varn z)))) termCond --></p> |
598 </li> | 616 </li> |
599 </ul> | 617 </ul> |
600 | 618 |
601 | 619 |
602 | 620 |
606 <!-- _S9SLIDE_ --> | 624 <!-- _S9SLIDE_ --> |
607 <h2 id="agda-での-gears">Agda での Gears</h2> | 625 <h2 id="agda-での-gears">Agda での Gears</h2> |
608 <ul> | 626 <ul> |
609 <li>Agda での CodeGear は通常の関数とは異なり、継続渡し (CPS : Continuation Passing Style) で記述された関数</li> | 627 <li>Agda での CodeGear は通常の関数とは異なり、継続渡し (CPS : Continuation Passing Style) で記述された関数</li> |
610 <li>CPS の関数は引数として継続を受け取って継続に計算結果を渡す</li> | 628 <li>CPS の関数は引数として継続を受け取って継続に計算結果を渡す</li> |
611 <li><strong>名前 : 引数 -> (Code : fa -> t) -> t</strong></li> | 629 <li><strong>名前 : 引数 → (Code : fa → t) → t</strong></li> |
612 <li><strong>t</strong> は継続</li> | 630 <li><strong>t</strong> は継続</li> |
613 <li><strong>(Code : fa -> t)</strong> は次の継続先</li> | 631 <li><strong>(Code : fa → t)</strong> は次の継続先</li> |
614 <li>DataGear は Agda での CodeGear に使われる引数 | 632 <li>DataGear は Agda での CodeGear に使われる引数 |
615 <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> | 633 <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> |
616 <div class="code"><pre><span class="line-numbers"><a href="#n1" name="n1">1</a></span>_g-_ : {t : Set} → ℕ → ℕ → (Code : ℕ → t) → t | 634 <div class="code"><pre><span class="line-numbers"><a href="#n1" name="n1">1</a></span>_-_ : {t : Set} → Nat → Nat → (Code : Nat → t) → t |
617 <span class="line-numbers"><a href="#n2" name="n2">2</a></span>x g- zero next = next x | 635 <span class="line-numbers"><a href="#n2" name="n2">2</a></span>x - zero = (λ next → next x) |
618 <span class="line-numbers"><a href="#n3" name="n3">3</a></span>zero g- _ = next zero | 636 <span class="line-numbers"><a href="#n3" name="n3">3</a></span>zero - _ = (λ next → next zero) |
619 <span class="line-numbers"><a href="#n4" name="n4">4</a></span>(suc x) g- (suc y) = next (x g- y) | 637 <span class="line-numbers"><a href="#n4" name="n4">4</a></span>(suc x) - (suc y) = (x - y) |
620 </pre></div> | 638 </pre></div> |
621 </div> | 639 </div> |
622 </div> | 640 </div> |
623 </li> | 641 </li> |
624 </ul> | 642 </ul> |
625 | 643 |
626 | 644 |
627 | 645 |
628 </div> | 646 </div> |
629 | 647 |
630 <div class='slide'> | 648 <div class='slide'> |
631 <!-- _S9SLIDE_ --> | 649 <!-- _S9SLIDE_ --> |
632 <h2 id="gears-をベースにした-hoarelogic">Gears をベースにした HoareLogic</h2> | 650 <h2 id="gears-をベースにした-hoarelogic-と証明全体">Gears をベースにした HoareLogic と証明(全体)</h2> |
633 <ul> | 651 <ul> |
634 <li>次に Gears をベースにした while Program をみる。</li> | 652 <li>Gears をベースにした while Program |
635 <li>このプログラムは自然数と継続先を受け取って t を返す | 653 <ul> |
654 <li>これは証明でもある</li> | |
655 </ul> | |
656 </li> | |
657 <li>whileループを任意の回数にするため<strong>c10</strong>は引数</li> | |
658 <li>whileTest’ の継続に conversion1、その継続に whileLoop’ が来て最後の継続に vari が c10 と等しい | |
659 <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> | |
660 <div class="code"><pre><span class="line-numbers"><a href="#n1" name="n1">1</a></span> proofGears : {c10 : Nat } → Set | |
661 <span class="line-numbers"><a href="#n2" name="n2">2</a></span> proofGears {c10} = whileTest' {_} {_} {c10} (λ n p1 → conversion1 n p1 | |
662 <span class="line-numbers"><a href="#n3" name="n3">3</a></span> (λ n1 p2 → whileLoop' n1 p2 (λ n2 → ( vari n2 ≡ c10 )))) | |
663 </pre></div> | |
664 </div> | |
665 </div> | |
666 </li> | |
667 </ul> | |
668 | |
669 | |
670 | |
671 </div> | |
672 | |
673 <div class='slide'> | |
674 <!-- _S9SLIDE_ --> | |
675 <h2 id="gears-と-hoarelogic-をベースにした証明whiletest">Gears と HoareLogic をベースにした証明(whileTest)</h2> | |
676 <ul> | |
677 <li>ここは代入する Command</li> | |
678 <li>最初の Command なので PreCondition がない</li> | |
679 <li>もとの whileProgram では PComm を2回していたがまとめた</li> | |
680 <li>proof2は Post Condition が成り立つことの証明 | |
681 <ul> | |
682 <li><strong><em>/\</em></strong> は pi1 と pi2 のフィールドをもつレコード型</li> | |
683 <li>2つのものを引数に取り、両方が同時に成り立つことを示す</li> | |
684 </ul> | |
685 </li> | |
686 <li>Gears での PostCondition は <strong>引数 → (Code : fa → PostCondition → t) → t</strong> | |
687 <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> | |
688 <div class="code"><pre><span class="line-numbers"><a href="#n1" name="n1">1</a></span> whileTest' : {l : Level} {t : Set l} → {c10 : Nat } → | |
689 <span class="line-numbers"><a href="#n2" name="n2">2</a></span> (Code : (env : Env) → ((vari env) ≡ 0) /\ ((varn env) ≡ c10) → t) → t | |
690 <span class="line-numbers"><a href="#n3" name="n3">3</a></span> whileTest' {_} {_} {c10} next = next env proof2 | |
691 <span class="line-numbers"><a href="#n4" name="n4">4</a></span> where | |
692 <span class="line-numbers"><a href="#n5" name="n5">5</a></span> env : Env | |
693 <span class="line-numbers"><a href="#n6" name="n6">6</a></span> env = record {vari = 0 ; varn = c10} | |
694 <span class="line-numbers"><a href="#n7" name="n7">7</a></span> proof2 : ((vari env) ≡ 0) /\ ((varn env) ≡ c10) <-- PostCondition | |
695 <span class="line-numbers"><a href="#n8" name="n8">8</a></span> proof2 = record {pi1 = refl ; pi2 = refl} | |
696 </pre></div> | |
697 </div> | |
698 </div> | |
699 </li> | |
700 </ul> | |
701 | |
702 | |
703 | |
704 </div> | |
705 | |
706 <div class='slide'> | |
707 <!-- _S9SLIDE_ --> | |
708 <h2 id="gears-と-hoarelogic-をベースにした証明conversion">Gears と HoareLogic をベースにした証明(conversion)</h2> | |
709 <ul> | |
710 <li>conversion は Condition から LoopInvaliant への変換を行う CodeGear</li> | |
711 <li>proof4 は LoopInvaliant の証明</li> | |
712 <li>Gears での HoareLogic の完全な記述は <strong>引数 → PreCondition → (Code : fa → PostCondition → t) → t</strong> | |
713 <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> | |
714 <div class="code"><pre><span class="line-numbers"> <a href="#n1" name="n1">1</a></span> conversion1 : {l : Level} {t : Set l } → (env : Env) → {c10 : Nat } → | |
715 <span class="line-numbers"> <a href="#n2" name="n2">2</a></span> ((vari env) ≡ 0) /\ ((varn env) ≡ c10) | |
716 <span class="line-numbers"> <a href="#n3" name="n3">3</a></span> → (Code : (env1 : Env) → (varn env1 + vari env1 ≡ c10) → t) → t | |
717 <span class="line-numbers"> <a href="#n4" name="n4">4</a></span> conversion1 env {c10} p1 next = next env proof4 | |
718 <span class="line-numbers"> <a href="#n5" name="n5">5</a></span> where | |
719 <span class="line-numbers"> <a href="#n6" name="n6">6</a></span> proof4 : varn env + vari env ≡ c10 | |
720 <span class="line-numbers"> <a href="#n7" name="n7">7</a></span> proof4 = let open ≡-Reasoning in | |
721 <span class="line-numbers"> <a href="#n8" name="n8">8</a></span> begin | |
722 <span class="line-numbers"> <a href="#n9" name="n9">9</a></span> varn env + vari env | |
723 <span class="line-numbers"><strong><a href="#n10" name="n10">10</a></strong></span> ≡⟨ cong ( λ n → n + vari env ) (pi2 p1 ) ⟩ | |
724 <span class="line-numbers"><a href="#n11" name="n11">11</a></span> c10 + vari env | |
725 <span class="line-numbers"><a href="#n12" name="n12">12</a></span> ≡⟨ cong ( λ n → c10 + n ) (pi1 p1 ) ⟩ | |
726 <span class="line-numbers"><a href="#n13" name="n13">13</a></span> c10 + 0 | |
727 <span class="line-numbers"><a href="#n14" name="n14">14</a></span> ≡⟨ +-sym {c10} {0} ⟩ | |
728 <span class="line-numbers"><a href="#n15" name="n15">15</a></span> c10 | |
729 <span class="line-numbers"><a href="#n16" name="n16">16</a></span> ∎ | |
730 </pre></div> | |
731 </div> | |
732 </div> | |
733 </li> | |
734 </ul> | |
735 | |
736 | |
737 | |
738 </div> | |
739 | |
740 <div class='slide'> | |
741 <!-- _S9SLIDE_ --> | |
742 <h2 id="gears-と-hoarelogic-をベースにした証明whileloop">Gears と HoareLogic をベースにした証明(whileLoop)</h2> | |
743 <ul> | |
744 <li>whileLoop は loopInvaliant が true の間 WhileLoop を回し続けるCodeGear</li> | |
745 <li>この CodeGear は Agda がループが終わることが証明できてないため <strong>{-# TERMINATING #-}</strong> で明示</li> | |
746 <li>false になると次の CodeGear へ | |
636 <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> | 747 <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> |
637 <div class="code"><pre><span class="line-numbers"><a href="#n1" name="n1">1</a></span> {-# TERMINATING #-} | 748 <div class="code"><pre><span class="line-numbers"><a href="#n1" name="n1">1</a></span> {-# TERMINATING #-} |
638 <span class="line-numbers"><a href="#n2" name="n2">2</a></span> whileLoop : {l : Level} {t : Set l} -> Env -> (Code : Env -> t) -> t | 749 <span class="line-numbers"><a href="#n2" name="n2">2</a></span> whileLoop : {l : Level} {t : Set l} → Env → (Code : Env → t) → t |
639 <span class="line-numbers"><a href="#n3" name="n3">3</a></span> whileLoop env next with lt 0 (varn env) | 750 <span class="line-numbers"><a href="#n3" name="n3">3</a></span> whileLoop env next with lt 0 (varn env) |
640 <span class="line-numbers"><a href="#n4" name="n4">4</a></span> whileLoop env next | false = next env | 751 <span class="line-numbers"><a href="#n4" name="n4">4</a></span> whileLoop env next | false = next env |
641 <span class="line-numbers"><a href="#n5" name="n5">5</a></span> whileLoop env next | true = | 752 <span class="line-numbers"><a href="#n5" name="n5">5</a></span> whileLoop env next | true = |
642 <span class="line-numbers"><a href="#n6" name="n6">6</a></span> whileLoop (record {varn = (varn env) - 1 ; vari = (vari env) + 1}) next | 753 <span class="line-numbers"><a href="#n6" name="n6">6</a></span> whileLoop (record {varn = (varn env) - 1 ; vari = (vari env) + 1}) next |
643 </pre></div> | 754 </pre></div> |
650 | 761 |
651 </div> | 762 </div> |
652 | 763 |
653 <div class='slide'> | 764 <div class='slide'> |
654 <!-- _S9SLIDE_ --> | 765 <!-- _S9SLIDE_ --> |
655 <h2 id="gears-と-hoarelogic-をベースにした証明">Gears と HoareLogic をベースにした証明</h2> | 766 <h2 id="gears-と-hoarelogic-をベースにした証明全体">Gears と HoareLogic をベースにした証明(全体)</h2> |
656 <ul> | 767 <ul> |
657 <li>ここでは | 768 <li>最終状態で返ってくる i の値は c10 と一致する</li> |
658 <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> | 769 <li>これにより証明が可能 |
659 <div class="code"><pre><span class="line-numbers"><a href="#n1" name="n1">1</a></span> proofGears : {c10 : ℕ } → Set | 770 <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> |
771 <div class="code"><pre><span class="line-numbers"><a href="#n1" name="n1">1</a></span> proofGears : {c10 : Nat } → Set | |
660 <span class="line-numbers"><a href="#n2" name="n2">2</a></span> proofGears {c10} = whileTest' {_} {_} {c10} (λ n p1 → conversion1 n p1 | 772 <span class="line-numbers"><a href="#n2" name="n2">2</a></span> proofGears {c10} = whileTest' {_} {_} {c10} (λ n p1 → conversion1 n p1 |
661 <span class="line-numbers"><a href="#n3" name="n3">3</a></span> (λ n1 p2 → whileLoop' n1 p2 (λ n2 → ( vari n2 ≡ c10 )))) | 773 <span class="line-numbers"><a href="#n3" name="n3">3</a></span> (λ n1 p2 → whileLoop' n1 p2 (λ n2 → ( vari n2 ≡ c10 )))) |
662 </pre></div> | 774 </pre></div> |
663 </div> | 775 </div> |
664 </div> | 776 </div> |
665 </li> | 777 </li> |
666 </ul> | 778 </ul> |
667 | 779 |
668 <p><–! | 780 |
669 [論文目次] | 781 |
670 まえがき</p> | 782 </div> |
671 | 783 |
672 <p>現状</p> | 784 <div class='slide'> |
673 | 785 <!-- _S9SLIDE_ --> |
674 <p>Agda</p> | 786 <h2 id="まとめと今後の課題">まとめと今後の課題</h2> |
675 | 787 <ul> |
676 <p>GearsOS</p> | 788 <li>HoareLogic の while を使った例題を作成、証明を行った</li> |
677 | 789 <li>Gears を用いた HoareLogic ベースの検証方法を導入した |
678 <p>CodeGear DataGear</p> | 790 <ul> |
679 | 791 <li>証明が引数として渡される記述のため証明とプログラムを一体化できた</li> |
680 <p>Gears と Agda</p> | 792 </ul> |
681 | 793 </li> |
682 <p>Agda での HoareLogic</p> | 794 <li>今後の課題 |
683 | 795 <ul> |
684 <p>Gears ベースの HoareLogic</p> | 796 <li>RedBlackTree や SynchronizedQueue などのデータ構造の検証(HoareLogic ベースで)</li> |
685 | 797 </ul> |
686 <p>まとめと課題</p> | 798 </li> |
687 | 799 </ul> |
688 <p>–></p> | |
689 | 800 |
690 </div> | 801 </div> |
691 | 802 |
692 | 803 |
693 </div><!-- presentation --> | 804 </div><!-- presentation --> |