comparison slide/slide.html @ 10:aedb8c4f13b9

add slide and slide-mindmap
author ryokka
date Sat, 08 Feb 2020 22:07:16 +0900
parents
children 831316a767e8
comparison
equal deleted inserted replaced
9:95a5f8e76944 10:aedb8c4f13b9
1
2
3
4
5
6 <!DOCTYPE html>
7 <html>
8 <head>
9 <meta http-equiv="content-type" content="text/html;charset=utf-8">
10 <title>Your Title Here</title>
11
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="Your Name Here" >
14
15 <!-- style sheet links -->
16 <link rel="stylesheet" href="s6/themes/projection.css" media="screen,projection">
17 <link rel="stylesheet" href="s6/themes/screen.css" media="screen">
18 <link rel="stylesheet" href="s6/themes/print.css" media="print">
19 <link rel="stylesheet" href="s6/themes/blank.css" media="screen,projection">
20
21 <!-- JS -->
22 <script src="s6/js/jquery-1.11.3.min.js"></script>
23 <script src="s6/js/jquery.slideshow.js"></script>
24 <script src="s6/js/jquery.slideshow.counter.js"></script>
25 <script src="s6/js/jquery.slideshow.controls.js"></script>
26 <script src="s6/js/jquery.slideshow.footer.js"></script>
27 <script src="s6/js/jquery.slideshow.autoplay.js"></script>
28
29 <!-- prettify -->
30 <link rel="stylesheet" href="scripts/prettify.css">
31 <script src="scripts/prettify.js"></script>
32
33 <script>
34 $(document).ready( function() {
35 Slideshow.init();
36
37 $('code').each(function(_, el) {
38 if (!el.classList.contains('noprettyprint')) {
39 el.classList.add('prettyprint');
40 }
41 });
42 prettyPrint();
43 } );
44
45 </script>
46
47 <!-- Better Browser Banner for Microsoft Internet Explorer (IE) -->
48 <!--[if IE]>
49 <script src="s6/js/jquery.microsoft.js"></script>
50 <![endif]-->
51
52
53
54 </head>
55 <body>
56
57 <div class="layout">
58 <div id="header"></div>
59 <div id="footer">
60 <div align="right">
61 <img src="s6/images/logo.svg" width="200px">
62 </div>
63 </div>
64 </div>
65
66 <div class="presentation">
67
68 <div class='slide cover'>
69 <table width="90%" height="90%" border="0" align="center">
70 <tr>
71 <td>
72 <div align="center">
73 <h1><font color="#808db5">Your Title Here</font></h1>
74 </div>
75 </td>
76 </tr>
77 <tr>
78 <td>
79 <div align="left">
80 Your Name Here
81 - profile not found -
82 <hr style="color:#ffcc00;background-color:#ffcc00;text-align:left;border:none;width:100%;height:0.2em;">
83 </div>
84 </td>
85 </tr>
86 </table>
87 </div>
88
89
90
91 <div class='slide'>
92 <!-- TODO
93 - 章構成を slide.mm の形に直す。
94 - Agda の説明と Gears の説明をなおす
95 - Gears での Hoare Logic の説明する前になんで Hoare Logic ベースなのかのスライドを入れてみる
96 -->
97
98 <p>title: Continuation based C での Hoare Logic を用いた記述と検証
99 author: 外間政尊
100 profile: - 琉球大学 : 並列信頼研究室
101 lang: Japanese</p>
102
103 <!-- 発表20分、質疑応答5分 -->
104
105
106
107 </div>
108
109 <div class='slide'>
110 <!-- _S9SLIDE_ -->
111 <h2 id="os-の検証技術としての-hoarelogic-の問題点">OS の検証技術としての HoareLogic の問題点</h2>
112 <ul>
113 <li>OS やアプリケーションの信頼性は重要な課題</li>
114 <li>信頼性を上げるために仕様の検証が必要</li>
115 <li>仕様検証の手法として <strong>Hoare Logic</strong> がある
116 <ul>
117 <li>ある関数は実行する前に必要な引数があって何らかの出力がある</li>
118 <li>Hoare Logic では 任意のコマンドは 事前に成り立つ条件があり、コマンド実行後に異なる条件が成り立つ
119 <!-- - 関数実行前に、引数が存在していて、出力が意図した通りになる --></li>
120 </ul>
121 </li>
122 <li>HoareLogic では関数が最低限のコマンドまで分割されており記述が困難(変数の代入、コマンド実行の遷移等)</li>
123 <li>大規模なプログラムは構築しづらい</li>
124 </ul>
125
126
127
128 </div>
129
130 <div class='slide'>
131 <!-- _S9SLIDE_ -->
132 <h2 id="gears-を用いた-hoarelogic-の導入">Gears を用いた HoareLogic の導入</h2>
133 <ul>
134 <li>当研究室では 処理の単位を <strong>CodeGear</strong>、データの単位を <strong>DataGear</strong> としてプログラムを記述する手法を提案</li>
135 <li>CodeGear は Input DataGear を受け取り、処理を行って Output DataGear に書き込む</li>
136 <li>CodeGear は継続を用いて次の CodeGear に接続される</li>
137 <li>本研究では Gears 単位を用いた HoareLogic ベースの検証手法を提案する</li>
138 </ul>
139
140
141
142 </div>
143
144 <div class='slide'>
145 <!-- _S9SLIDE_ -->
146 <h2 id="gears-について">Gears について</h2>
147 <ul>
148 <li><strong>Gears</strong> は当研究室で提案しているプログラム記述手法</li>
149 <li>処理の単位を <strong>CodeGear</strong> 、データの単位を <strong>DataGear</strong></li>
150 <li>CodeGear は引数として Input の DataGear を受け取り、 Output の DataGear を返す</li>
151 <li>Output の DataGear は次の CodeGear の Input として接続される
152 <!-- [fig1](file://./fig/cgdg.pdf) --></li>
153 <li>CodeGear の接続処理などのメタ計算は Meta CodeGear として定義
154 <ul>
155 <li>今回は Meta CodeGear で信頼性の検証を行う</li>
156 </ul>
157 </li>
158 </ul>
159 <p style="text-align:center;"><img src="./fig/cgdg-small.svg" alt="" width="60%" height="50%" /></p>
160 <!-- <p style="text-align:center;"><img src="./fig/cgdg-small.svg" alt="" width="75%" height="75%"/></p> -->
161
162
163
164 </div>
165
166 <div class='slide'>
167 <!-- _S9SLIDE_ -->
168 <h2 id="agda-での-datagear">Agda での DataGear</h2>
169 <ul>
170 <li><strong>DataGear</strong> は CodeGear でつかわれる引数</li>
171 <li><strong>データ型</strong>と<strong>レコード型</strong>がある</li>
172 <li>データ型は一つのデータ
173 <div class="language-AGDA highlighter-coderay"><div class="CodeRay">
174 <div class="code"><pre><span class="line-numbers"><a href="#n1" name="n1">1</a></span> data Nat : Set where
175 <span class="line-numbers"><a href="#n2" name="n2">2</a></span> zero : Nat
176 <span class="line-numbers"><a href="#n3" name="n3">3</a></span> suc : Nat → Nat
177 </pre></div>
178 </div>
179 </div>
180 </li>
181 <li>レコード型は複数のデータをまとめる
182 <div class="language-AGDA highlighter-coderay"><div class="CodeRay">
183 <div class="code"><pre><span class="line-numbers"><a href="#n1" name="n1">1</a></span> record Env : Set where
184 <span class="line-numbers"><a href="#n2" name="n2">2</a></span> field
185 <span class="line-numbers"><a href="#n3" name="n3">3</a></span> varn : Nat
186 <span class="line-numbers"><a href="#n4" name="n4">4</a></span> vari : Nat
187 </pre></div>
188 </div>
189 </div>
190 </li>
191 </ul>
192
193
194
195 </div>
196
197 <div class='slide'>
198 <!-- _S9SLIDE_ -->
199 <h2 id="agda-での-gears-の記述whiletest">Agda での Gears の記述(whileTest)</h2>
200 <ul>
201 <li>Agda での CodeGear は継続渡し (CPS : Continuation Passing Style) で記述された関数</li>
202 <li><strong>{}</strong> は暗黙的(推論される)</li>
203 <li>継続渡しの関数は引数として継続を受け取って継続に計算結果を渡す</li>
204 <li>CodeGear の型は<strong>引数 → (Code : fa → t) → t</strong></li>
205 <li><strong>t</strong> は継続(最終的に返すもの)</li>
206 <li><strong>(Code : fa → t)</strong> は次の継続先
207 <div class="language-AGDA highlighter-coderay"><div class="CodeRay">
208 <div class="code"><pre><span class="line-numbers"><a href="#n1" name="n1">1</a></span> whileTest : {t : Set} → (c10 : Nat)
209 <span class="line-numbers"><a href="#n2" name="n2">2</a></span> → (Code : Env → t) → t
210 <span class="line-numbers"><a href="#n3" name="n3">3</a></span> whileTest c10 next = next (record {varn = c10
211 <span class="line-numbers"><a href="#n4" name="n4">4</a></span> ; vari = 0} )
212 </pre></div>
213 </div>
214 </div>
215 </li>
216 </ul>
217
218
219
220 </div>
221
222 <div class='slide'>
223 <!-- _S9SLIDE_ -->
224 <h2 id="agda-での-gears-の記述whileloop">Agda での Gears の記述(whileLoop)</h2>
225 <ul>
226 <li>関数の動作を条件で変えたいときはパターンマッチを行う</li>
227 <li>whileLoop は varn が 0 より大きい間ループする
228 <div class="language-AGDA highlighter-coderay"><div class="CodeRay">
229 <div class="code"><pre><span class="line-numbers"><a href="#n1" name="n1">1</a></span> whileLoopPwP' : {t : Set} → (n : ℕ) → (env : Envc ) → (n ≡ varn env) → whileTestStateP s2 env
230 <span class="line-numbers"><a href="#n2" name="n2">2</a></span> → (next : (env : Envc ) → (pred n ≡ varn env) → whileTestStateP s2 env → t)
231 <span class="line-numbers"><a href="#n3" name="n3">3</a></span> → (exit : (env : Envc ) → whileTestStateP sf env → t) → t
232 <span class="line-numbers"><a href="#n4" name="n4">4</a></span> whileLoopPwP' zero env refl refl next exit = exit env refl
233 <span class="line-numbers"><a href="#n5" name="n5">5</a></span> whileLoopPwP' (suc n) env refl refl next exit =
234 <span class="line-numbers"><a href="#n6" name="n6">6</a></span> next (record env {varn = pred (varn env) ; vari = suc (vari env) }) refl (+-suc n (vari env))
235 </pre></div>
236 </div>
237 </div>
238 </li>
239 </ul>
240
241
242
243 </div>
244
245 <div class='slide'>
246 <!-- _S9SLIDE_ -->
247 <h2 id="agda-での証明">Agda での証明</h2>
248 <ul>
249 <li>関数との違いは<strong>型が証明すべき論理式</strong>で<strong>関数自体がそれを満たす導出</strong>
250 <ul>
251 <li><strong>refl</strong> は <strong>x ≡ x</strong></li>
252 <li><strong>cong</strong> は 関数と x ≡ y 受け取って、x ≡ y の両辺に関数を適応しても等しいことが変わらないこと</li>
253 </ul>
254 </li>
255 <li><strong>+zero</strong> は任意の自然数の右から zero を足しても元の数と等しいことの証明
256 <ul>
257 <li><strong>y = zero</strong> のときは <strong>zero ≡ zero</strong> のため refl</li>
258 <li><strong>y = suc y</strong> のときは cong を使い y の数を減らして再帰的に<strong>+zero</strong>を行っている</li>
259 <li>y の数を減らしても大丈夫なことを cong の関数として受け取った数を suc する関数で保証している
260 <div class="language-AGDA highlighter-coderay"><div class="CodeRay">
261 <div class="code"><pre><span class="line-numbers"><a href="#n1" name="n1">1</a></span>+zero : { y : Nat } → y + zero ≡ y
262 <span class="line-numbers"><a href="#n2" name="n2">2</a></span>+zero {zero} = refl
263 <span class="line-numbers"><a href="#n3" name="n3">3</a></span>+zero {suc y} = cong ( λ x → suc x ) ( +zero {y} )
264 </pre></div>
265 </div>
266 </div>
267 </li>
268 </ul>
269 </li>
270 </ul>
271
272 <!-- ## Agda での証明(項変換) -->
273 <!-- <\!-- -- もしかしたら rewrite で代用しちゃうかも -\-> -->
274 <!-- - **x + y ≡ y + x** の証明 **+-sym** -->
275 <!-- - 項変換の例として引数が zero, suc y のパターンをみる -->
276 <!-- - **zero + suc y**を変換して**suc y + zero**にする -->
277 <!-- - begin の下の行に変形したい式を記述 -->
278 <!-- - **≡⟨ ⟩** に変形規則、その次の行に変換した結果、 **∎** が項変換終了 -->
279 <!-- ```AGDA -->
280 <!-- +-sym : { x y : Nat } → x + y ≡ y + x -->
281 <!-- +-sym {zero} {suc y} = let open ≡-Reasoning in -->
282 <!-- begin -->
283 <!-- zero + suc y -->
284 <!-- ≡⟨⟩ -->
285 <!-- suc y -->
286 <!-- ≡⟨ sym +zero ⟩ -->
287 <!-- suc y + zero -->
288 <!-- ∎ -->
289 <!-- -- sym : Symmetric {A = A} _≡_ -->
290 <!-- -- sym refl = refl -->
291 <!-- -- +zero : { y : Nat } → y + zero ≡ y -->
292 <!-- ``` -->
293
294 <!-- ## Agda での証明(項変換) -->
295 <!-- - **x + y ≡ y + x** の証明 **+-sym** -->
296 <!-- - 項の変換には **rewrite** と **** -->
297 <!-- - begin の下の行に変形したい式を記述 -->
298 <!-- - **≡⟨ ⟩** に変形規則、その次の行に変換した結果、 **∎** が項変換終了 -->
299 <!-- ```AGDA -->
300 <!-- +-comm : (x y : ℕ) → x + y ≡ y + x -->
301 <!-- +-comm zero y rewrite (+zero {y}) = refl -->
302 <!-- +-comm (suc x) y = let open ≡-Reasoning in -->
303 <!-- begin -->
304 <!-- suc (x + y) ≡⟨⟩ -->
305 <!-- suc (x + y) ≡⟨ cong suc (+-comm x y) ⟩ -->
306 <!-- suc (y + x) ≡⟨ sym (+-suc {y} {x}) ⟩ -->
307 <!-- y + suc x ∎ -->
308
309 <!-- -- +-suc : {x y : ℕ} → x + suc y ≡ suc (x + y) -->
310 <!-- -- +-suc {zero} {y} = refl -->
311 <!-- -- +-suc {suc x} {y} = cong suc (+-suc {x} {y}) -->
312 <!-- ``` -->
313
314
315
316 </div>
317
318 <div class='slide'>
319 <!-- _S9SLIDE_ -->
320 <h2 id="hoare-logic-をベースとした-gears-での検証手法">Hoare Logic をベースとした Gears での検証手法</h2>
321 <ul>
322 <li>今回 HoareLogic で証明する次のようなコードを検証した</li>
323 <li>このプログラムは変数iとnをもち、 n&gt;0 の間nの値を減らし、i の値を増やす</li>
324 <li>n==0 のとき停止するため、終了時の変数の結果は i==10、n==0 になる
325 <div class="language-C highlighter-coderay"><div class="CodeRay">
326 <div class="code"><pre><span class="line-numbers"><a href="#n1" name="n1">1</a></span> n = <span style="color:#00D">10</span>;
327 <span class="line-numbers"><a href="#n2" name="n2">2</a></span> i = <span style="color:#00D">0</span>;
328 <span class="line-numbers"><a href="#n3" name="n3">3</a></span>
329 <span class="line-numbers"><a href="#n4" name="n4">4</a></span> <span style="color:#080;font-weight:bold">while</span> (n&gt;<span style="color:#00D">0</span>)
330 <span class="line-numbers"><a href="#n5" name="n5">5</a></span> {
331 <span class="line-numbers"><a href="#n6" name="n6">6</a></span> i++;
332 <span class="line-numbers"><a href="#n7" name="n7">7</a></span> n--;
333 <span class="line-numbers"><a href="#n8" name="n8">8</a></span> }
334 </pre></div>
335 </div>
336 </div>
337 </li>
338 </ul>
339
340
341
342 </div>
343
344 <div class='slide'>
345 <!-- _S9SLIDE_ -->
346 <h2 id="gears-をベースにしたプログラム">Gears をベースにしたプログラム</h2>
347 <ul>
348 <li>test は whileTest と whileLoop を使った Gears のプログラム</li>
349 <li>whileTest の継続先にDataGear を受け取って whileLoop に渡す
350 <ul>
351 <li><strong>(λ 引数 → )</strong>は無名の関数で引数を受け取って継続する</li>
352 </ul>
353 </li>
354 </ul>
355
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> test : Env
358 <span class="line-numbers"><a href="#n2" name="n2">2</a></span> test = whileTest 10 (λ env → whileLoop env (λ env1 → env1))
359 <span class="line-numbers"><a href="#n3" name="n3">3</a></span>
360 <span class="line-numbers"><a href="#n4" name="n4">4</a></span> -- whileTest : {t : Set} → (c10 : Nat) → (Code : Env → t) → t
361 <span class="line-numbers"><a href="#n5" name="n5">5</a></span> -- whileLoop : {t : Set} → Env → (Code : Env → t) → t
362 </pre></div>
363 </div>
364 </div>
365
366
367
368 </div>
369
370 <div class='slide'>
371 <!-- _S9SLIDE_ -->
372 <h2 id="gears-をベースにした-hoarelogic-と証明全体">Gears をベースにした HoareLogic と証明(全体)</h2>
373 <ul>
374 <li>proofGears は HoareLogic をベースとした証明
375 <ul>
376 <li>先程のプログラムと違い、引数として証明も持っている</li>
377 </ul>
378 </li>
379 <li>whileTest’ の継続に conversion1、その継続に whileLoop’ が来て最後の継続に vari が c10 と等しい
380 <div class="language-AGDA highlighter-coderay"><div class="CodeRay">
381 <div class="code"><pre><span class="line-numbers"><a href="#n1" name="n1">1</a></span> -- test = whileTest 10 (λ env → whileLoop env (λ env1 → env1))
382 <span class="line-numbers"><a href="#n2" name="n2">2</a></span> proofGears : {c10 : Nat } → Set
383 <span class="line-numbers"><a href="#n3" name="n3">3</a></span> proofGears {c10} = whileTest' {_} {_} {c10} (λ n p1 →
384 <span class="line-numbers"><a href="#n4" name="n4">4</a></span> conversion1 n p1 (λ n1 p2 → whileLoop' n1 p2
385 <span class="line-numbers"><a href="#n5" name="n5">5</a></span> (λ n2 → ( vari n2 ≡ c10 ))))
386 </pre></div>
387 </div>
388 </div>
389 </li>
390 </ul>
391
392
393
394 </div>
395
396 <div class='slide'>
397 <!-- _S9SLIDE_ -->
398 <h2 id="gears-と-hoarelogic-をベースにした証明whiletest">Gears と HoareLogic をベースにした証明(whileTest)</h2>
399 <ul>
400 <li>最初の Command なので PreCondition がない</li>
401 <li>proof2は Post Condition が成り立つことの証明
402 <ul>
403 <li><strong><em>/\</em></strong> は pi1 と pi2 のフィールドをもつレコード型</li>
404 <li>これは2つのものを引数に取り、両方が同時に成り立つことを表している</li>
405 <li><strong>refl</strong> は <strong>x == x</strong> で左右の項が等しいことの証明</li>
406 </ul>
407 </li>
408 <li>Gears での PostCondition は <strong>引数 → (Code : fa → PostCondition → t) → t</strong>
409 <div class="language-AGDA highlighter-coderay"><div class="CodeRay">
410 <div class="code"><pre><span class="line-numbers"><a href="#n1" name="n1">1</a></span> whileTest' : {l : Level} {t : Set l} {c10 : ℕ }
411 <span class="line-numbers"><a href="#n2" name="n2">2</a></span> → (Code : (env : Env ) → ((vari env) ≡ 0) /\ ((varn env) ≡ c10) → t) → t
412 <span class="line-numbers"><a href="#n3" name="n3">3</a></span> whileTest' {_} {_} {c10} next = next env proof2
413 <span class="line-numbers"><a href="#n4" name="n4">4</a></span> where
414 <span class="line-numbers"><a href="#n5" name="n5">5</a></span> env : Env
415 <span class="line-numbers"><a href="#n6" name="n6">6</a></span> env = record {vari = 0 ; varn = c10 }
416 <span class="line-numbers"><a href="#n7" name="n7">7</a></span> proof2 : ((vari env) ≡ 0) /\ ((varn env) ≡ c10) -- PostCondition
417 <span class="line-numbers"><a href="#n8" name="n8">8</a></span> proof2 = record {pi1 = refl ; pi2 = refl}
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="gears-と-hoarelogic-をベースにした証明conversion">Gears と HoareLogic をベースにした証明(conversion)</h2>
431 <ul>
432 <li>conversion は Condition から LoopInvaliant への変換を行う CodeGear
433 <ul>
434 <li>Condition の条件は Loop 内では厳しいのでゆるくする</li>
435 </ul>
436 </li>
437 <li>proof4 は LoopInvaliant の証明</li>
438 </ul>
439
440 <div class="language-AGDA highlighter-coderay"><div class="CodeRay">
441 <div class="code"><pre><span class="line-numbers"><a href="#n1" name="n1">1</a></span> conv : (env : Envc ) → (vari env ≡ 0) /\ (varn env ≡ c10 env) → varn env + vari env ≡ c10 env
442 <span class="line-numbers"><a href="#n2" name="n2">2</a></span> conv e record { pi1 = refl ; pi2 = refl } = +zero
443 </pre></div>
444 </div>
445 </div>
446
447
448
449 </div>
450
451 <div class='slide'>
452 <!-- _S9SLIDE_ -->
453 <h2 id="hoarelogic-の証明">HoareLogic の証明</h2>
454 <ul>
455 <li>HoareLogic の証明では基本的に項の書き換えを行って証明している</li>
456 <li>proof4 の証明部分では論理式の<strong>varn env + vari env</strong> を 書き換えて <strong>c10</strong> に変換している</li>
457 <li>変換で使っている <strong>cong</strong> は 関数と x ≡ y 受け取って両辺に関数を適応しても等しいことが変わらないことの証明</li>
458 <li>変換後の式を次の行に書いて変換を続ける
459 <div class="language-AGDA highlighter-coderay"><div class="CodeRay">
460 <div class="code"><pre><span class="line-numbers"><a href="#n1" name="n1">1</a></span> conv1 : {l : Level} {t : Set l } → (env : Envc )
461 <span class="line-numbers"><a href="#n2" name="n2">2</a></span> → ((vari env) ≡ 0) /\ ((varn env) ≡ (c10 env))
462 <span class="line-numbers"><a href="#n3" name="n3">3</a></span> → (Code : (env1 : Envc ) → (varn env1 + vari env1 ≡ (c10 env1)) → t) → t
463 <span class="line-numbers"><a href="#n4" name="n4">4</a></span> conv1 env record { pi1 = refl ; pi2 = refl } next = next env +zero
464 </pre></div>
465 </div>
466 </div>
467 </li>
468 </ul>
469
470
471
472 </div>
473
474 <div class='slide'>
475 <!-- _S9SLIDE_ -->
476 <h2 id="gears-と-hoarelogic-をベースにした証明whileloop">Gears と HoareLogic をベースにした証明(whileLoop)</h2>
477 <ul>
478 <li>whileLoop も whileTest と同様に PreCondition が CodeGear に入りそれに対する証明が記述されている</li>
479 <li>ループステップごとに <strong>whileLoopPwP’</strong> で停止か継続かを判断し、 <strong>loopPwP’</strong> でループが回る</li>
480 </ul>
481
482 <div class="language-AGDA highlighter-coderay"><div class="CodeRay">
483 <div class="code"><pre><span class="line-numbers"> <a href="#n1" name="n1">1</a></span> whileLoopPwP' : {l : Level} {t : Set l} → (n : ℕ) → (env : Envc ) → (n ≡ varn env) → whileTestStateP s2 env
484 <span class="line-numbers"> <a href="#n2" name="n2">2</a></span> → (next : (env : Envc ) → (pred n ≡ varn env) → whileTestStateP s2 env → t)
485 <span class="line-numbers"> <a href="#n3" name="n3">3</a></span> → (exit : (env : Envc ) → whileTestStateP sf env → t) → t
486 <span class="line-numbers"> <a href="#n4" name="n4">4</a></span> whileLoopPwP' zero env refl refl next exit = exit env refl
487 <span class="line-numbers"> <a href="#n5" name="n5">5</a></span> whileLoopPwP' (suc n) env refl refl next exit =
488 <span class="line-numbers"> <a href="#n6" name="n6">6</a></span> next (record env {varn = pred (varn env) ; vari = suc (vari env) }) refl (+-suc n (vari env))
489 <span class="line-numbers"> <a href="#n7" name="n7">7</a></span>
490 <span class="line-numbers"> <a href="#n8" name="n8">8</a></span> loopPwP' zero env refl refl exit = exit env refl
491 <span class="line-numbers"> <a href="#n9" name="n9">9</a></span> loopPwP' (suc n) env refl refl exit = whileLoopPwP' (suc n) env refl refl
492 <span class="line-numbers"><strong><a href="#n10" name="n10">10</a></strong></span> (λ env x y → loopPwP' n env x y exit) exit
493 </pre></div>
494 </div>
495 </div>
496
497
498
499 </div>
500
501 <div class='slide'>
502 <!-- _S9SLIDE_ -->
503 <h2 id="gears-と-hoarelogic-をベースにした仕様記述">Gears と HoareLogic をベースにした仕様記述</h2>
504 <ul>
505 <li><strong>proofGears</strong> では最終状態が i と c10 が等しくなるため仕様になっている</li>
506 </ul>
507
508 <div class="language-AGDA highlighter-coderay"><div class="CodeRay">
509 <div class="code"><pre><span class="line-numbers"><a href="#n1" name="n1">1</a></span> whileProofs : (c : ℕ ) → Set
510 <span class="line-numbers"><a href="#n2" name="n2">2</a></span> whileProofs c = whileTestPwP {_} {_} c
511 <span class="line-numbers"><a href="#n3" name="n3">3</a></span> ( λ env s → conv1 env s
512 <span class="line-numbers"><a href="#n4" name="n4">4</a></span> ( λ env s → loopPwP' (varn env) env refl s
513 <span class="line-numbers"><a href="#n5" name="n5">5</a></span> ( λ env s → vari env ≡ c10 env )))
514 </pre></div>
515 </div>
516 </div>
517
518
519
520 </div>
521
522 <div class='slide'>
523 <!-- _S9SLIDE_ -->
524 <h2 id="gears-と-hoarelogic-を用いた仕様の証明">Gears と HoareLogic を用いた仕様の証明</h2>
525 <ul>
526 <li>先程の <strong>whileProofs</strong> で行った仕様記述を型に記述し、実際に証明していく</li>
527 <li>このままだと loopPwP’ のループが進まず証明できない</li>
528 </ul>
529
530 <div class="language-AGDA highlighter-coderay"><div class="CodeRay">
531 <div class="code"><pre><span class="line-numbers"> <a href="#n1" name="n1">1</a></span>-- whileProofs c = whileTestPwP {_} {_} c
532 <span class="line-numbers"> <a href="#n2" name="n2">2</a></span>-- ( λ env s → conv1 env s
533 <span class="line-numbers"> <a href="#n3" name="n3">3</a></span>-- ( λ env s → loopPwP' (varn env) env refl s
534 <span class="line-numbers"> <a href="#n4" name="n4">4</a></span>-- ( λ env s → vari env ≡ c10 env )))
535 <span class="line-numbers"> <a href="#n5" name="n5">5</a></span>
536 <span class="line-numbers"> <a href="#n6" name="n6">6</a></span> ProofGears : (c : ℕ) → whileProofs c
537 <span class="line-numbers"> <a href="#n7" name="n7">7</a></span> ProofGears c = whileTestPwP {_} {_} c
538 <span class="line-numbers"> <a href="#n8" name="n8">8</a></span> (λ env s → loopPwP' c (record { c10 = c ; varn = c ; vari = 0 }) refl +zero
539 <span class="line-numbers"> <a href="#n9" name="n9">9</a></span> (λ env₁ s₁ → {!!}))
540 <span class="line-numbers"><strong><a href="#n10" name="n10">10</a></strong></span>
541 <span class="line-numbers"><a href="#n11" name="n11">11</a></span> Goal: loopPwP' c (record { c10 = c ; varn = c ; vari = 0 }) refl
542 <span class="line-numbers"><a href="#n12" name="n12">12</a></span> +zero (λ env₂ s₂ → vari env₂ ≡ c10 env₂)
543 <span class="line-numbers"><a href="#n13" name="n13">13</a></span> ------------------------------------------------------------
544 <span class="line-numbers"><a href="#n14" name="n14">14</a></span> s₁ : vari env₁ ≡ c10 env₁
545 <span class="line-numbers"><a href="#n15" name="n15">15</a></span> env₁ : Envc
546 <span class="line-numbers"><a href="#n16" name="n16">16</a></span> s : (vari env ≡ 0) /\ (varn env ≡ c10 env)
547 <span class="line-numbers"><a href="#n17" name="n17">17</a></span> env : Envc
548 <span class="line-numbers"><a href="#n18" name="n18">18</a></span> c : ℕ
549 </pre></div>
550 </div>
551 </div>
552
553
554
555 </div>
556
557 <div class='slide'>
558 <!-- _S9SLIDE_ -->
559 <h2 id="検証時の-loop-の解決">検証時の Loop の解決</h2>
560 <ul>
561 <li><strong>loopHelper</strong> は今回のループを解決する証明</li>
562 <li>ループ解決のためにループの簡約ができた</li>
563 </ul>
564
565 <div class="language-AGDA highlighter-coderay"><div class="CodeRay">
566 <div class="code"><pre><span class="line-numbers"><a href="#n1" name="n1">1</a></span> loopHelper : (n : ℕ) → (env : Envc ) → (eq : varn env ≡ n) → (seq : whileTestStateP s2 env)
567 <span class="line-numbers"><a href="#n2" name="n2">2</a></span> → loopPwP' n env (sym eq) seq (λ env₁ x → (vari env₁ ≡ c10 env₁))
568 <span class="line-numbers"><a href="#n3" name="n3">3</a></span> loopHelper zero env eq refl rewrite eq = refl
569 <span class="line-numbers"><a href="#n4" name="n4">4</a></span> loopHelper (suc n) env eq refl rewrite eq = loopHelper n
570 <span class="line-numbers"><a href="#n5" name="n5">5</a></span> (record { c10 = suc (n + vari env) ; varn = n ; vari = suc (vari env) }) refl (+-suc n (vari env))
571 </pre></div>
572 </div>
573 </div>
574
575
576
577 </div>
578
579 <div class='slide'>
580 <!-- _S9SLIDE_ -->
581 <h2 id="gears-と-hoarelogic-を用いた仕様の証明完成">Gears と HoareLogic を用いた仕様の証明(完成)</h2>
582 <ul>
583 <li><strong>loopHelper</strong> を使って簡約することで <strong>whileProofs</strong> の証明を行うことができた</li>
584 </ul>
585
586 <div class="language-AGDA highlighter-coderay"><div class="CodeRay">
587 <div class="code"><pre><span class="line-numbers"><a href="#n1" name="n1">1</a></span> -- whileProofs c = whileTestPwP {_} {_} c
588 <span class="line-numbers"><a href="#n2" name="n2">2</a></span> -- ( λ env s → conv1 env s
589 <span class="line-numbers"><a href="#n3" name="n3">3</a></span> -- ( λ env s → loopPwP' (varn env) env refl s
590 <span class="line-numbers"><a href="#n4" name="n4">4</a></span> -- ( λ env s → vari env ≡ c10 env )))
591 <span class="line-numbers"><a href="#n5" name="n5">5</a></span> ProofGears : (c : ℕ) → whileProofs c
592 <span class="line-numbers"><a href="#n6" name="n6">6</a></span> ProofGears c = whileTestPwP {_} {_} c
593 <span class="line-numbers"><a href="#n7" name="n7">7</a></span> (λ env s → loopHelper c (record { c10 = c ; varn = c ; vari = zero }) refl +zero)
594 </pre></div>
595 </div>
596 </div>
597
598 <!-- ## Binary Tree について -->
599 <!-- - -->
600
601
602
603 </div>
604
605 <div class='slide'>
606 <!-- _S9SLIDE_ -->
607 <h2 id="まとめと今後の課題">まとめと今後の課題</h2>
608 <ul>
609 <li>CodeGear、 DataGear を用いた HoareLogic ベースの仕様記述を導入した</li>
610 <li>HoareLogic ベースの検証を実際に行うことができた</li>
611 <li>証明時の任意回の有限ループに対する解決を行えた</li>
612 <li>今後の課題
613 <ul>
614 <li>BinaryTree の有限ループに対する証明</li>
615 <li>Hoare Logic で検証されたコードの CbC 変換</li>
616 <li>並列実行での検証</li>
617 </ul>
618 </li>
619 </ul>
620
621 </div>
622
623
624 </div><!-- presentation -->
625 </body>
626 </html>