comparison slide/slide.html @ 14:b711209123f7

update
author ryokka
date Tue, 15 Jan 2019 17:47:18 +0900
parents e8fe28afe61e
children 07e1ccdfd844
comparison
equal deleted inserted replaced
13:fde9ee0cc8ae 14:b711209123f7
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>Curry-Howard の証明支援系</li>
176 <li>型と値がある</li>
176 <li>Agda の文法については次のスライドから軽く説明する</li> 177 <li>Agda の文法については次のスライドから軽く説明する</li>
177 </ul> 178 </ul>
178 179
179 180
180 181
181 </div> 182 </div>
182 183
183 <div class='slide'> 184 <div class='slide'>
184 <!-- _S9SLIDE_ --> 185 <!-- _S9SLIDE_ -->
185 <h2 id="agda-のデータ型">Agda のデータ型</h2> 186 <h2 id="agda-での-gears-の記述whileloop">Agda での Gears の記述(whileLoop)</h2>
186 <ul> 187 <ul>
187 <li>データ型は代数的なデータ構造</li> 188 <li>Agda での CodeGear は通常の関数とは異なり、継続渡し (CPS : Continuation Passing Style) で記述された関数</li>
188 <li><strong>data</strong> キーワードの後に、<strong>名前 : 型</strong></li> 189 <li>CPS の関数は引数として継続を受け取って継続に計算結果を渡す</li>
189 <li>次の行以降は<strong>コンストラクタ名 : 型</strong></li> 190 <li><strong>名前 : 引数 → (Code : fa → t) → t</strong></li>
190 <li>型は<strong>-&gt;</strong>または<strong>→</strong>で繋げる 191 <li><strong>t</strong> は継続</li>
191 <ul> 192 <li><strong>(Code : fa → t)</strong> は次の継続先</li>
192 <li>例えば、suc の型<strong>Nat → Nat*は</strong>Nat** を受け取り<strong>Nat</strong>を返す型</li> 193 <li>DataGear は Agda での CodeGear に使われる引数
193 <li>これにより 3 を suc (suc (suc zero)) のように表せる 194 <div class="language-AGDA highlighter-coderay"><div class="CodeRay">
194 <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> 195 <div class="code"><pre>whileTest : {l : Level} {t : Set l} -&gt; (c10 : ℕ)
195 <div class="code"><pre><span class="line-numbers"><a href="#n1" name="n1">1</a></span> data Nat : Set where 196 → (Code : Env -&gt; t) -&gt; t
196 <span class="line-numbers"><a href="#n2" name="n2">2</a></span> zero : Nat 197 whileTest c10 next = next (record {varn = c10 ; vari = 0} )
197 <span class="line-numbers"><a href="#n3" name="n3">3</a></span> suc : Nat → Nat 198 </pre></div>
198 </pre></div> 199 </div>
199 </div> 200 </div>
200 </div> 201 </li>
201 </li> 202 </ul>
202 </ul> 203
203 </li> 204
204 </ul> 205
205 206 </div>
206 <!-- - where は宣言した部分に束縛する --> 207
207 208 <div class='slide'>
208 209 <!-- _S9SLIDE_ -->
209 210 <h2 id="agda-での-gears-の記述whileloop-1">Agda での Gears の記述(whileLoop)</h2>
210 </div> 211 <ul>
211 212 <li>関数の動作を条件で変えたいときはパターンマッチを行う</li>
212 <div class='slide'> 213 <li>whileLoop は varn が 0 より大きい間ループする
213 <!-- _S9SLIDE_ --> 214 <ul>
214 <h2 id="agda-のレコード型">Agda のレコード型</h2> 215 <li>lt は Nat を2つ受け取って値の大小を比較
215 <ul> 216 ```AGDA
216 <li>C 言語での構造体に近い</li> 217 {-# TERMINATING #-}
217 <li>複数のデータをまとめる</li> 218 whileLoop : {l : Level} {t : Set l} -&gt; Env
218 <li>関数内で構築できる</li> 219 -&gt; (Code : Env -&gt; t) -&gt; t
219 <li>構築時は<strong>record レコード名 {フィールド名 = 値}</strong></li> 220 whileLoop env next with lt 0 (varn env)
220 <li>複数ある場合は <strong>record Env {varn = 1 ; varn = 2}</strong>のように <strong>;</strong> を使って列挙 221 whileLoop env next | false = next env
221 <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> 222 whileLoop env next | true =
222 <div class="code"><pre><span class="line-numbers"><a href="#n1" name="n1">1</a></span> record Env : Set where 223 whileLoop (record {varn = (varn env) - 1
223 <span class="line-numbers"><a href="#n2" name="n2">2</a></span> field 224 ; vari = (vari env) + 1}) next</li>
224 <span class="line-numbers"><a href="#n3" name="n3">3</a></span> varn : Nat 225 </ul>
225 <span class="line-numbers"><a href="#n4" name="n4">4</a></span> vari : Nat 226 </li>
226 </pre></div> 227 </ul>
227 </div> 228
228 </div> 229 <p>lt : Nat → Nat → Bool</p>
229 </li> 230 <pre><code>
230 </ul> 231 ## Agda での DataGear
231 232 - **DataGear** は CodeGear の引数
232 233 - **データ型**と**レコード型**がある
233 234 - データ型は一つのデータ
234 </div> 235 ```AGDA
235 236 data Nat : Set where
236 <div class='slide'> 237 zero : Nat
237 <!-- _S9SLIDE_ --> 238 suc : Nat → Nat
238 <h2 id="agda-の関数">Agda の関数</h2> 239 </code></pre>
239 <ul> 240 <ul>
240 <li>関数にも型が必要(1行目) 241 <li>レコード型は複数のデータをまとめる
241 <ul> 242 <div class="language-AGDA highlighter-coderay"><div class="CodeRay">
242 <li>引き算はは自然数を2つ取って結果の自然数を返す</li> 243 <div class="code"><pre>record Env : Set where
243 <li><strong>_</strong> は任意の値、名前で使うと受け取った引数が順番に入る</li> 244 field
244 </ul> 245 varn : Nat
245 </li> 246 vari : Nat
246 <li>関数本体は <strong>関数名 = 値</strong></li> 247 </pre></div>
247 <li>関数ではパターンマッチがかける 248 </div>
248 <ul> 249 </div>
249 <li>ここでは関数名に <strong>_</strong> を使っているため<strong>Nat</strong>の定義にから zero かそれ以外でパターンマッチ
250 <div class="language-AGDA highlighter-coderay"><div class="CodeRay">
251 <div class="code"><pre><span class="line-numbers"><a href="#n1" name="n1">1</a></span> _-_ : Nat → Nat → Nat
252 <span class="line-numbers"><a href="#n2" name="n2">2</a></span> x - zero = x
253 <span class="line-numbers"><a href="#n3" name="n3">3</a></span> zero - _ = zero
254 <span class="line-numbers"><a href="#n4" name="n4">4</a></span> (suc x) - (suc y) = x - y
255 </pre></div>
256 </div>
257 </div>
258 </li>
259 </ul>
260 </li> 250 </li>
261 </ul> 251 </ul>
262 252
263 253
264 254
274 <li><strong>{}</strong> は暗黙的(推論される)</li> 264 <li><strong>{}</strong> は暗黙的(推論される)</li>
275 <li>下のコードは Bool型の x と true の and を取ったものは x と等しいことの証明 265 <li>下のコードは Bool型の x と true の and を取ったものは x と等しいことの証明
276 <ul> 266 <ul>
277 <li><strong>refl</strong> は <strong>x == x</strong> の左右の項が等しいことの証明 267 <li><strong>refl</strong> は <strong>x == x</strong> の左右の項が等しいことの証明
278 <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> 268 <div class="language-AGDA highlighter-coderay"><div class="CodeRay">
279 <div class="code"><pre><span class="line-numbers"><a href="#n1" name="n1">1</a></span> ∧true : { x : Bool } → x ∧ true ≡ x 269 <div class="code"><pre>∧true : { x : Bool } → x ∧ true ≡ x
280 <span class="line-numbers"><a href="#n2" name="n2">2</a></span> ∧true {x} with x 270 ∧true {x} with x
281 <span class="line-numbers"><a href="#n3" name="n3">3</a></span> ∧true {x} | false = refl 271 ∧true {x} | false = refl
282 <span class="line-numbers"><a href="#n4" name="n4">4</a></span> ∧true {x} | true = refl 272 ∧true {x} | true = refl
283 </pre></div> 273 </pre></div>
284 </div> 274 </div>
285 </div> 275 </div>
286 </li> 276 </li>
277 </ul>
278 </li>
279 </ul>
280
281
282
283 </div>
284
285 <div class='slide'>
286 <!-- _S9SLIDE_ -->
287 <h2 id="gears-をベースにした-hoarelogic-と証明全体">Gears をベースにした HoareLogic と証明(全体)</h2>
288 <ul>
289 <li>Gears をベースにした while Program で実行できる
290 <ul>
291 <li>これは証明も持っている</li>
292 </ul>
293 </li>
294 <li>whileループを任意の回数にするため<strong>c10</strong>は引数</li>
295 <li>whileTest’ の継続に conversion1、その継続に whileLoop’ が来て最後の継続に vari が c10 と等しい
296 <div class="language-AGDA highlighter-coderay"><div class="CodeRay">
297 <div class="code"><pre>proofGears : {c10 : Nat } → Set
298 proofGears {c10} = whileTest' {_} {_} {c10} (λ n p1 → conversion1 n p1
299 (λ n1 p2 → whileLoop' n1 p2 (λ n2 → ( vari n2 ≡ c10 ))))
300 </pre></div>
301 </div>
302 </div>
303 </li>
304 </ul>
305
306
307
308 </div>
309
310 <div class='slide'>
311 <!-- _S9SLIDE_ -->
312 <h2 id="gears-と-hoarelogic-をベースにした証明whiletest">Gears と HoareLogic をベースにした証明(whileTest)</h2>
313 <ul>
314 <li>最初の Command なので PreCondition がない</li>
315 <li>proof2は Post Condition が成り立つことの証明
316 <ul>
317 <li><strong><em>/\</em></strong> は pi1 と pi2 のフィールドをもつレコード型</li>
318 <li>2つのものを引数に取り、両方が同時に成り立つことを示す</li>
319 </ul>
320 </li>
321 <li>Gears での PostCondition は <strong>引数 → (Code : fa → PostCondition → t) → t</strong>
322 <div class="language-AGDA highlighter-coderay"><div class="CodeRay">
323 <div class="code"><pre>whileTest' : {l : Level} {t : Set l} → {c10 : Nat } →
324 (Code : (env : Env) →
325 ((vari env) ≡ 0) /\ ((varn env) ≡ c10) → t) → t
326 hileTest' {_} {_} {c10} next = next env proof2
327 where
328 env : Env
329 env = record {vari = 0 ; varn = c10}
330 proof2 : ((vari env) ≡ 0) /\ ((varn env) ≡ c10) &lt;-- PostCondition
331 proof2 = record {pi1 = refl ; pi2 = refl}
332 </pre></div>
333 </div>
334 </div>
335 </li>
336 </ul>
337
338
339
340 </div>
341
342 <div class='slide'>
343 <!-- _S9SLIDE_ -->
344 <h2 id="gears-と-hoarelogic-をベースにした証明conversion">Gears と HoareLogic をベースにした証明(conversion)</h2>
345 <ul>
346 <li>conversion は Condition から LoopInvaliant への変換を行う CodeGear
347 <ul>
348 <li>Condition の条件は Loop 内では厳しいのでゆるくする</li>
349 </ul>
350 </li>
351 <li>proof4 は LoopInvaliant の証明</li>
352 <li>Gears での HoareLogic の完全な記述は <strong>引数 → PreCondition → (Code : fa → PostCondition → t) → t</strong>
353 ```AGDA
354 conversion1 : {l : Level} {t : Set l } → (env : Env) → {c10 : Nat } →
355 ((vari env) ≡ 0) /\ ((varn env) ≡ c10)
356 → (Code : (env1 : Env) → (varn env1 + vari env1 ≡ c10) → t) → t
357 conversion1 env {c10} p1 next = next env proof4
358 where
359 proof4 : varn env + vari env ≡ c10</li>
360 </ul>
361
362 <pre><code>
363
364 ## Agdaでの証明(≡-Reasoning)
365 - Agda では証明の項を書き換える構文が用意されている
366 ```AGDA
367 proof4 : varn env + vari env ≡ c10
368 proof4 = let open ≡-Reasoning in
369 begin
370 varn env + vari env
371 ≡⟨ cong ( λ n → n + vari env ) (pi2 p1 ) ⟩
372 c10 + vari env
373 ≡⟨ cong ( λ n → c10 + n ) (pi1 p1 ) ⟩
374 c10 + 0
375 ≡⟨ +-sym {c10} {0} ⟩
376 c10
377
378 </code></pre>
379
380
381
382 </div>
383
384 <div class='slide'>
385 <!-- _S9SLIDE_ -->
386 <h2 id="gears-と-hoarelogic-をベースにした証明全体">Gears と HoareLogic をベースにした証明(全体)</h2>
387 <ul>
388 <li>最終状態で返ってくる i の値は c10 と一致する</li>
389 <li>これにより証明が可能
390 <div class="language-AGDA highlighter-coderay"><div class="CodeRay">
391 <div class="code"><pre> proofGears : {c10 : Nat } → Set
392 proofGears {c10} = whileTest' {_} {_} {c10} (λ n p1 → conversion1 n p1
393 (λ n1 p2 → whileLoop' n1 p2 (λ n2 → ( vari n2 ≡ c10 ))))
394 </pre></div>
395 </div>
396 </div>
397 </li>
398 </ul>
399
400
401
402 </div>
403
404 <div class='slide'>
405 <!-- _S9SLIDE_ -->
406 <h2 id="まとめと今後の課題">まとめと今後の課題</h2>
407 <ul>
408 <li>HoareLogic の while を使った例題を作成、証明を行った</li>
409 <li>Gears を用いた HoareLogic ベースの検証方法を導入した
410 <ul>
411 <li>証明が引数として渡される記述のため証明とプログラムを一体化できた</li>
412 </ul>
413 </li>
414 <li>今後の課題
415 <ul>
416 <li>RedBlackTree や SynchronizedQueue などのデータ構造の検証(HoareLogic ベースで)</li>
287 </ul> 417 </ul>
288 </li> 418 </li>
289 </ul> 419 </ul>
290 420
291 421
326 <li>HoareLogic 例として疑似コードを用意した</li> 456 <li>HoareLogic 例として疑似コードを用意した</li>
327 <li>このプログラムは変数iとnをもち、 n&gt;0 の間nの値を減らし、i の値を増やす</li> 457 <li>このプログラムは変数iとnをもち、 n&gt;0 の間nの値を減らし、i の値を増やす</li>
328 <li>n==0 のとき停止するため、終了時の変数の結果は i==10、n==0 になるはずである。</li> 458 <li>n==0 のとき停止するため、終了時の変数の結果は i==10、n==0 になるはずである。</li>
329 <li>次のスライドから Agda 上 HoareLogic を実装し、その上でこの whileProgram の検証を行う 459 <li>次のスライドから Agda 上 HoareLogic を実装し、その上でこの whileProgram の検証を行う
330 <div class="language-C highlighter-coderay"><div class="CodeRay"> 460 <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>; 461 <div class="code"><pre> 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>; 462 i = <span style="color:#00D">0</span>;
333 <span class="line-numbers"><a href="#n3" name="n3">3</a></span> 463
334 <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>) 464 <span style="color:#080;font-weight:bold">while</span> (n&gt;<span style="color:#00D">0</span>)
335 <span class="line-numbers"><a href="#n5" name="n5">5</a></span> { 465 {
336 <span class="line-numbers"><a href="#n6" name="n6">6</a></span> i++; 466 i++;
337 <span class="line-numbers"><a href="#n7" name="n7">7</a></span> n--; 467 n--;
338 <span class="line-numbers"><a href="#n8" name="n8">8</a></span> } 468 }
339 </pre></div> 469 </pre></div>
340 </div> 470 </div>
341 </div> 471 </div>
342 </li> 472 </li>
343 </ul> 473 </ul>
352 <ul> 482 <ul>
353 <li><strong>Env</strong> は while Program で必要な変数をまとめたもの</li> 483 <li><strong>Env</strong> は while Program で必要な変数をまとめたもの</li>
354 <li>varn、vari はそれぞれ変数 n、 i</li> 484 <li>varn、vari はそれぞれ変数 n、 i</li>
355 <li><strong>Cond</strong> は Pre、Post の Condition で Env を受け取って Bool 値(true か false)を返す 485 <li><strong>Cond</strong> は Pre、Post の Condition で Env を受け取って Bool 値(true か false)を返す
356 <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> 486 <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 487 <div class="code"><pre> record Env : Set where
358 <span class="line-numbers"><a href="#n2" name="n2">2</a></span> field 488 field
359 <span class="line-numbers"><a href="#n3" name="n3">3</a></span> varn : Nat 489 varn : Nat
360 <span class="line-numbers"><a href="#n4" name="n4">4</a></span> vari : Nat 490 vari : Nat
361 <span class="line-numbers"><a href="#n5" name="n5">5</a></span> 491
362 <span class="line-numbers"><a href="#n6" name="n6">6</a></span> Cond : Set 492 Cond : Set
363 <span class="line-numbers"><a href="#n7" name="n7">7</a></span> Cond = (Env → Bool) 493 Cond = (Env → Bool)
364 </pre></div> 494 </pre></div>
365 </div> 495 </div>
366 </div> 496 </div>
367 </li> 497 </li>
368 </ul> 498 </ul>
384 </ul> 514 </ul>
385 </li> 515 </li>
386 <li>他にも何もしないコマンドやコマンドの停止などのコマンドもある</li> 516 <li>他にも何もしないコマンドやコマンドの停止などのコマンドもある</li>
387 <li><strong>PrimComm</strong> は Env を受け取って Env を返す定義 517 <li><strong>PrimComm</strong> は Env を受け取って Env を返す定義
388 <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> 518 <div class="language-AGDA highlighter-coderay"><div class="CodeRay">
389 <div class="code"><pre><span class="line-numbers"><a href="#n1" name="n1">1</a></span> data Comm : Set where 519 <div class="code"><pre> data Comm : Set where
390 <span class="line-numbers"><a href="#n2" name="n2">2</a></span> PComm : PrimComm → Comm 520 PComm : PrimComm → Comm
391 <span class="line-numbers"><a href="#n3" name="n3">3</a></span> Seq : Comm → Comm → Comm 521 Seq : Comm → Comm → Comm
392 <span class="line-numbers"><a href="#n4" name="n4">4</a></span> If : Cond → Comm → Comm → Comm 522 If : Cond → Comm → Comm → Comm
393 <span class="line-numbers"><a href="#n5" name="n5">5</a></span> While : Cond → Comm → Comm 523 While : Cond → Comm → Comm
394 <span class="line-numbers"><a href="#n6" name="n6">6</a></span> 524
395 <span class="line-numbers"><a href="#n7" name="n7">7</a></span> PrimComm : Set 525 PrimComm : Set
396 <span class="line-numbers"><a href="#n8" name="n8">8</a></span> PrimComm = Env → Env 526 PrimComm = Env → Env
397 </pre></div> 527 </pre></div>
398 </div> 528 </div>
399 </div> 529 </div>
400 </li> 530 </li>
401 </ul> 531 </ul>
414 </ul> 544 </ul>
415 </li> 545 </li>
416 <li><strong>$</strong> は <strong>()</strong> の糖衣で行頭から行末までを ( ) で囲う</li> 546 <li><strong>$</strong> は <strong>()</strong> の糖衣で行頭から行末までを ( ) で囲う</li>
417 <li>見やすさのため改行しているが 3~7 行は1行 547 <li>見やすさのため改行しているが 3~7 行は1行
418 <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> 548 <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 549 <div class="code"><pre> program : ℕ → Comm
420 <span class="line-numbers"><a href="#n2" name="n2">2</a></span> program c10 = 550 program c10 =
421 <span class="line-numbers"><a href="#n3" name="n3">3</a></span> Seq ( PComm (λ env → record env {varn = c10})) -- n = 10; 551 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; 552 $ 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&gt;0) { 553 $ While (λ env → lt zero (varn env ) ) -- while (n&gt;0) {
424 <span class="line-numbers"><a href="#n6" name="n6">6</a></span> (Seq (PComm (λ env → record env {vari = ((vari env) + 1)} )) -- i++; 554 (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--; 555 $ PComm (λ env → record env {varn = ((varn env) - 1)} )) -- n--;
426 </pre></div> 556 </pre></div>
427 </div> 557 </div>
428 </div> 558 </div>
429 </li> 559 </li>
430 </ul> 560 </ul>
441 <li><strong>PrimRule</strong> は <strong>PComm</strong> で行う代入を保証する</li> 571 <li><strong>PrimRule</strong> は <strong>PComm</strong> で行う代入を保証する</li>
442 <li>3行目の pr の型 Axiom は PreCondition に PrimComm が適用されると PostCondition になることの記述 572 <li>3行目の pr の型 Axiom は PreCondition に PrimComm が適用されると PostCondition になることの記述
443 <ul> 573 <ul>
444 <li><strong><em>⇒</em></strong> は pre, post の Condition をとって post の Condition が成り立つときに True を返す 574 <li><strong><em>⇒</em></strong> は pre, post の Condition をとって post の Condition が成り立つときに True を返す
445 <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> 575 <div class="language-AGDA highlighter-coderay"><div class="CodeRay">
446 <div class="code"><pre><span class="line-numbers"><a href="#n1" name="n1">1</a></span> data HTProof : Cond → Comm → Cond → Set where 576 <div class="code"><pre> data HTProof : Cond → Comm → Cond → Set where
447 <span class="line-numbers"><a href="#n2" name="n2">2</a></span> PrimRule : {bPre : Cond} → {pcm : PrimComm} → {bPost : Cond} → 577 PrimRule : {bPre : Cond} → {pcm : PrimComm} → {bPost : Cond} →
448 <span class="line-numbers"><a href="#n3" name="n3">3</a></span> (pr : Axiom bPre pcm bPost) → 578 (pr : Axiom bPre pcm bPost) →
449 <span class="line-numbers"><a href="#n4" name="n4">4</a></span> HTProof bPre (PComm pcm) bPost 579 HTProof bPre (PComm pcm) bPost
450 <span class="line-numbers"><a href="#n5" name="n5">5</a></span>-- 次のスライドに続く 580 -- 次のスライドに続く
451 </pre></div> 581 </pre></div>
452 </div> 582 </div>
453 </div> 583 </div>
454 <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> 584 <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 585 <div class="code"><pre> 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 586 Axiom pre comm post = ∀ (env : Env) → (pre env) ⇒ ( post (comm env)) ≡ true
457 </pre></div> 587 </pre></div>
458 </div> 588 </div>
459 </div> 589 </div>
460 </li> 590 </li>
461 </ul> 591 </ul>
471 <h2 id="agda-上での-hoarelogicコマンド保証23">Agda 上での HoareLogic(コマンド保証)2/3</h2> 601 <h2 id="agda-上での-hoarelogicコマンド保証23">Agda 上での HoareLogic(コマンド保証)2/3</h2>
472 <ul> 602 <ul>
473 <li><strong>SeqRule</strong> は Command を推移させる Seq の保証</li> 603 <li><strong>SeqRule</strong> は Command を推移させる Seq の保証</li>
474 <li><strong>IfRule</strong> は If の Command が正しく動くことを保証 604 <li><strong>IfRule</strong> は If の Command が正しく動くことを保証
475 <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> 605 <div class="language-AGDA highlighter-coderay"><div class="CodeRay">
476 <div class="code"><pre><span class="line-numbers"> <a href="#n1" name="n1">1</a></span>-- HTProof の続き 606 <div class="code"><pre>-- HTProof の続き
477 <span class="line-numbers"> <a href="#n2" name="n2">2</a></span> SeqRule : {bPre : Cond} → {cm1 : Comm} → {bMid : Cond} → 607 SeqRule : {bPre : Cond} → {cm1 : Comm} → {bMid : Cond} →
478 <span class="line-numbers"> <a href="#n3" name="n3">3</a></span> {cm2 : Comm} → {bPost : Cond} → 608 {cm2 : Comm} → {bPost : Cond} →
479 <span class="line-numbers"> <a href="#n4" name="n4">4</a></span> HTProof bPre cm1 bMid → 609 HTProof bPre cm1 bMid →
480 <span class="line-numbers"> <a href="#n5" name="n5">5</a></span> HTProof bMid cm2 bPost → 610 HTProof bMid cm2 bPost →
481 <span class="line-numbers"> <a href="#n6" name="n6">6</a></span> HTProof bPre (Seq cm1 cm2) bPost 611 HTProof bPre (Seq cm1 cm2) bPost
482 <span class="line-numbers"> <a href="#n7" name="n7">7</a></span> IfRule : {cmThen : Comm} → {cmElse : Comm} → 612 IfRule : {cmThen : Comm} → {cmElse : Comm} →
483 <span class="line-numbers"> <a href="#n8" name="n8">8</a></span> {bPre : Cond} → {bPost : Cond} → 613 {bPre : Cond} → {bPost : Cond} →
484 <span class="line-numbers"> <a href="#n9" name="n9">9</a></span> {b : Cond} → 614 {b : Cond} →
485 <span class="line-numbers"><strong><a href="#n10" name="n10">10</a></strong></span> HTProof (bPre /\ b) cmThen bPost → 615 HTProof (bPre /\ b) cmThen bPost →
486 <span class="line-numbers"><a href="#n11" name="n11">11</a></span> HTProof (bPre /\ neg b) cmElse bPost → 616 HTProof (bPre /\ neg b) cmElse bPost →
487 <span class="line-numbers"><a href="#n12" name="n12">12</a></span> HTProof bPre (If b cmThen cmElse) bPost 617 HTProof bPre (If b cmThen cmElse) bPost
488 </pre></div> 618 </pre></div>
489 </div> 619 </div>
490 </div> 620 </div>
491 </li> 621 </li>
492 </ul> 622 </ul>
501 <ul> 631 <ul>
502 <li><strong>WeakeningRule</strong> は通常の Condition からループ不変条件(Loop Invaliant)に変換</li> 632 <li><strong>WeakeningRule</strong> は通常の Condition からループ不変条件(Loop Invaliant)に変換</li>
503 <li>Tautology は Condition と不変条件が等しく成り立つ</li> 633 <li>Tautology は Condition と不変条件が等しく成り立つ</li>
504 <li><strong>WhileRule</strong> はループ不変条件が成り立つ間 Comm を繰り返す 634 <li><strong>WhileRule</strong> はループ不変条件が成り立つ間 Comm を繰り返す
505 <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> 635 <div class="language-AGDA highlighter-coderay"><div class="CodeRay">
506 <div class="code"><pre><span class="line-numbers"> <a href="#n1" name="n1">1</a></span>-- HTProof の続き 636 <div class="code"><pre>-- HTProof の続き
507 <span class="line-numbers"> <a href="#n2" name="n2">2</a></span> WeakeningRule : {bPre : Cond} → {bPre' : Cond} → {cm : Comm} → 637 WeakeningRule : {bPre : Cond} → {bPre' : Cond} → {cm : Comm} →
508 <span class="line-numbers"> <a href="#n3" name="n3">3</a></span> {bPost' : Cond} → {bPost : Cond} → 638 {bPost' : Cond} → {bPost : Cond} →
509 <span class="line-numbers"> <a href="#n4" name="n4">4</a></span> Tautology bPre bPre' → 639 Tautology bPre bPre' →
510 <span class="line-numbers"> <a href="#n5" name="n5">5</a></span> HTProof bPre' cm bPost' → 640 HTProof bPre' cm bPost' →
511 <span class="line-numbers"> <a href="#n6" name="n6">6</a></span> Tautology bPost' bPost → 641 Tautology bPost' bPost →
512 <span class="line-numbers"> <a href="#n7" name="n7">7</a></span> HTProof bPre cm bPost 642 HTProof bPre cm bPost
513 <span class="line-numbers"> <a href="#n8" name="n8">8</a></span> WhileRule : {cm : Comm} → {bInv : Cond} → {b : Cond} → 643 WhileRule : {cm : Comm} → {bInv : Cond} → {b : Cond} →
514 <span class="line-numbers"> <a href="#n9" name="n9">9</a></span> HTProof (bInv /\ b) cm bInv → 644 HTProof (bInv /\ b) cm bInv →
515 <span class="line-numbers"><strong><a href="#n10" name="n10">10</a></strong></span> HTProof bInv (While b cm) (bInv /\ neg b) 645 HTProof bInv (While b cm) (bInv /\ neg b)
516 </pre></div> 646 </pre></div>
517 </div> 647 </div>
518 </div> 648 </div>
519 <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> 649 <div class="language-AGDA highlighter-coderay"><div class="CodeRay">
520 <div class="code"><pre><span class="line-numbers"><a href="#n1" name="n1">1</a></span> Tautology : Cond → Cond → Set 650 <div class="code"><pre> Tautology : Cond → Cond → Set
521 <span class="line-numbers"><a href="#n2" name="n2">2</a></span> Tautology pre post = ∀ (env : Env) → (pre env) ⇒ (post env) ≡ true 651 Tautology pre post = ∀ (env : Env) → (pre env) ⇒ (post env) ≡ true
522 </pre></div> 652 </pre></div>
523 </div> 653 </div>
524 </div> 654 </div>
525 </li> 655 </li>
526 </ul> 656 </ul>
536 <li><strong>proof1</strong> は while Program の証明</li> 666 <li><strong>proof1</strong> は while Program の証明</li>
537 <li>HTProof に 初期状態と先程コマンドで記述した whileProgram である <strong>program</strong> と終了状態を渡す</li> 667 <li>HTProof に 初期状態と先程コマンドで記述した whileProgram である <strong>program</strong> と終了状態を渡す</li>
538 <li>Condititon は initCond や termCond のようにそれぞれ定義する必要がある</li> 668 <li>Condititon は initCond や termCond のようにそれぞれ定義する必要がある</li>
539 <li>program に近い形で証明を記述できる 669 <li>program に近い形で証明を記述できる
540 <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> 670 <div class="language-AGDA highlighter-coderay"><div class="CodeRay">
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}) 671 <div class="code"><pre> proof1 : (c10 : ℕ) → HTProof initCond (program c10 ) (termCond {c10})
542 <span class="line-numbers"> <a href="#n2" name="n2">2</a></span> proof1 c10 = 672 proof1 c10 =
543 <span class="line-numbers"> <a href="#n3" name="n3">3</a></span> SeqRule {λ e → true} ( PrimRule (init-case {c10} )) 673 SeqRule {λ e → true} ( PrimRule (init-case {c10} ))
544 <span class="line-numbers"> <a href="#n4" name="n4">4</a></span> $ SeqRule {λ e → Equal (varn e) c10} ( PrimRule lemma1 ) 674 $ SeqRule {λ e → Equal (varn e) c10} ( PrimRule lemma1 )
545 <span class="line-numbers"> <a href="#n5" name="n5">5</a></span> $ WeakeningRule {λ e → (Equal (varn e) c10) ∧ (Equal (vari e) 0)} lemma2 ( 675 $ WeakeningRule {λ e → (Equal (varn e) c10) ∧ (Equal (vari e) 0)} lemma2 (
546 <span class="line-numbers"> <a href="#n6" name="n6">6</a></span> WhileRule {_} {λ e → Equal ((varn e) + (vari e)) c10} 676 WhileRule {_} {λ e → Equal ((varn e) + (vari e)) c10}
547 <span class="line-numbers"> <a href="#n7" name="n7">7</a></span> $ SeqRule (PrimRule {λ e → whileInv e ∧ lt zero (varn e) } lemma3 ) 677 $ SeqRule (PrimRule {λ e → whileInv e ∧ lt zero (varn e) } lemma3 )
548 <span class="line-numbers"> <a href="#n8" name="n8">8</a></span> $ PrimRule {whileInv'} {_} {whileInv} lemma4 ) lemma5 678 $ PrimRule {whileInv'} {_} {whileInv} lemma4 ) lemma5
549 <span class="line-numbers"> <a href="#n9" name="n9">9</a></span> 679
550 <span class="line-numbers"><strong><a href="#n10" name="n10">10</a></strong></span> initCond : Cond 680 initCond : Cond
551 <span class="line-numbers"><a href="#n11" name="n11">11</a></span> initCond env = true 681 initCond env = true
552 <span class="line-numbers"><a href="#n12" name="n12">12</a></span> 682
553 <span class="line-numbers"><a href="#n13" name="n13">13</a></span> termCond : {c10 : Nat} → Cond 683 termCond : {c10 : Nat} → Cond
554 <span class="line-numbers"><a href="#n14" name="n14">14</a></span> termCond {c10} env = Equal (vari env) c10 684 termCond {c10} env = Equal (vari env) c10
555 </pre></div> 685 </pre></div>
556 </div> 686 </div>
557 </div> 687 </div>
558 <!-- * lemma1~5は rule それぞれの証明 --> 688 <!-- * lemma1~5は rule それぞれの証明 -->
559 <!-- program : Comm --> 689 <!-- program : Comm -->
584 <li>impl⇒ は x ≡ true → y ≡ true の関数(Command)を受け取って x ⇒ y ≡ true を返す関数</li> 714 <li>impl⇒ は x ≡ true → y ≡ true の関数(Command)を受け取って x ⇒ y ≡ true を返す関数</li>
585 </ul> 715 </ul>
586 </li> 716 </li>
587 <li><strong>≡-Reasoning</strong> は Agda での等式変形 717 <li><strong>≡-Reasoning</strong> は Agda での等式変形
588 <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> 718 <div class="language-AGDA highlighter-coderay"><div class="CodeRay">
589 <div class="code"><pre><span class="line-numbers"> <a href="#n1" name="n1">1</a></span> lemma1 : {c10 : Nat} → Axiom (stmt1Cond {c10}) 719 <div class="code"><pre> lemma1 : {c10 : Nat} → Axiom (stmt1Cond {c10})
590 <span class="line-numbers"> <a href="#n2" name="n2">2</a></span> (λ env → record { varn = varn env ; vari = 0 }) (stmt2Cond {c10}) 720 (λ env → record { varn = varn env ; vari = 0 }) (stmt2Cond {c10})
591 <span class="line-numbers"> <a href="#n3" name="n3">3</a></span> lemma1 {c10} env = impl⇒ ( λ cond → let open ≡-Reasoning in 721 lemma1 {c10} env = impl⇒ ( λ cond → let open ≡-Reasoning in
592 <span class="line-numbers"> <a href="#n4" name="n4">4</a></span> begin 722 begin
593 <span class="line-numbers"> <a href="#n5" name="n5">5</a></span> (Equal (varn env) c10 ) ∧ true 723 (Equal (varn env) c10 ) ∧ true
594 <span class="line-numbers"> <a href="#n6" name="n6">6</a></span> ≡⟨ ∧true ⟩ 724 ≡⟨ ∧true ⟩
595 <span class="line-numbers"> <a href="#n7" name="n7">7</a></span> Equal (varn env) c10 725 Equal (varn env) c10
596 <span class="line-numbers"> <a href="#n8" name="n8">8</a></span> ≡⟨ cond ⟩ 726 ≡⟨ cond ⟩
597 <span class="line-numbers"> <a href="#n9" name="n9">9</a></span> true 727 true
598 <span class="line-numbers"><strong><a href="#n10" name="n10">10</a></strong></span> ∎ ) 728 ∎ )
599 <span class="line-numbers"><a href="#n11" name="n11">11</a></span> 729
600 <span class="line-numbers"><a href="#n12" name="n12">12</a></span> stmt1Cond : {c10 : ℕ} → Cond 730 stmt1Cond : {c10 : ℕ} → Cond
601 <span class="line-numbers"><a href="#n13" name="n13">13</a></span> stmt1Cond {c10} env = Equal (varn env) c10 731 stmt1Cond {c10} env = Equal (varn env) c10
602 <span class="line-numbers"><a href="#n14" name="n14">14</a></span> 732
603 <span class="line-numbers"><a href="#n15" name="n15">15</a></span> stmt2Cond : {c10 : ℕ} → Cond 733 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) 734 stmt2Cond {c10} env = (Equal (varn env) c10) ∧ (Equal (vari env) 0)
605 </pre></div> 735 </pre></div>
606 </div> 736 </div>
607 </div> 737 </div>
608 738
609 <p><!-- lemma2 : {c10 : Nat} → Tautology stmt2Cond whileInv --></p> 739 <p><!-- lemma2 : {c10 : Nat} → Tautology stmt2Cond whileInv --></p>
614 744
615 <p><!-- lemma5 : {c10 : Nat} → Tautology ((λ e → Equal (varn e + vari e) c10) and (neg (λ z → lt zero (varn z)))) termCond --></p> 745 <p><!-- lemma5 : {c10 : Nat} → Tautology ((λ e → Equal (varn e + vari e) c10) and (neg (λ z → lt zero (varn z)))) termCond --></p>
616 </li> 746 </li>
617 </ul> 747 </ul>
618 748
619
620
621 </div>
622
623 <div class='slide'>
624 <!-- _S9SLIDE_ -->
625 <h2 id="agda-での-gears">Agda での Gears</h2>
626 <ul>
627 <li>Agda での CodeGear は通常の関数とは異なり、継続渡し (CPS : Continuation Passing Style) で記述された関数</li>
628 <li>CPS の関数は引数として継続を受け取って継続に計算結果を渡す</li>
629 <li><strong>名前 : 引数 → (Code : fa → t) → t</strong></li>
630 <li><strong>t</strong> は継続</li>
631 <li><strong>(Code : fa → t)</strong> は次の継続先</li>
632 <li>DataGear は Agda での CodeGear に使われる引数
633 <div class="language-AGDA highlighter-coderay"><div class="CodeRay">
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
635 <span class="line-numbers"><a href="#n2" name="n2">2</a></span>x - zero = (λ next → next x)
636 <span class="line-numbers"><a href="#n3" name="n3">3</a></span>zero - _ = (λ next → next zero)
637 <span class="line-numbers"><a href="#n4" name="n4">4</a></span>(suc x) - (suc y) = (x - y)
638 </pre></div>
639 </div>
640 </div>
641 </li>
642 </ul>
643
644
645
646 </div>
647
648 <div class='slide'>
649 <!-- _S9SLIDE_ -->
650 <h2 id="gears-をベースにした-hoarelogic-と証明全体">Gears をベースにした HoareLogic と証明(全体)</h2>
651 <ul>
652 <li>Gears をベースにした while Program
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) &lt;-- 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 へ
747 <div class="language-AGDA highlighter-coderay"><div class="CodeRay">
748 <div class="code"><pre><span class="line-numbers"><a href="#n1" name="n1">1</a></span> {-# TERMINATING #-}
749 <span class="line-numbers"><a href="#n2" name="n2">2</a></span> whileLoop : {l : Level} {t : Set l} → Env → (Code : Env → t) → t
750 <span class="line-numbers"><a href="#n3" name="n3">3</a></span> whileLoop env next with lt 0 (varn env)
751 <span class="line-numbers"><a href="#n4" name="n4">4</a></span> whileLoop env next | false = next env
752 <span class="line-numbers"><a href="#n5" name="n5">5</a></span> whileLoop env next | true =
753 <span class="line-numbers"><a href="#n6" name="n6">6</a></span> whileLoop (record {varn = (varn env) - 1 ; vari = (vari env) + 1}) next
754 </pre></div>
755 </div>
756 </div>
757 </li>
758 </ul>
759
760
761
762 </div>
763
764 <div class='slide'>
765 <!-- _S9SLIDE_ -->
766 <h2 id="gears-と-hoarelogic-をベースにした証明全体">Gears と HoareLogic をベースにした証明(全体)</h2>
767 <ul>
768 <li>最終状態で返ってくる i の値は c10 と一致する</li>
769 <li>これにより証明が可能
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
772 <span class="line-numbers"><a href="#n2" name="n2">2</a></span> proofGears {c10} = whileTest' {_} {_} {c10} (λ n p1 → conversion1 n p1
773 <span class="line-numbers"><a href="#n3" name="n3">3</a></span> (λ n1 p2 → whileLoop' n1 p2 (λ n2 → ( vari n2 ≡ c10 ))))
774 </pre></div>
775 </div>
776 </div>
777 </li>
778 </ul>
779
780
781
782 </div>
783
784 <div class='slide'>
785 <!-- _S9SLIDE_ -->
786 <h2 id="まとめと今後の課題">まとめと今後の課題</h2>
787 <ul>
788 <li>HoareLogic の while を使った例題を作成、証明を行った</li>
789 <li>Gears を用いた HoareLogic ベースの検証方法を導入した
790 <ul>
791 <li>証明が引数として渡される記述のため証明とプログラムを一体化できた</li>
792 </ul>
793 </li>
794 <li>今後の課題
795 <ul>
796 <li>RedBlackTree や SynchronizedQueue などのデータ構造の検証(HoareLogic ベースで)</li>
797 </ul>
798 </li>
799 </ul>
800 749
801 </div> 750 </div>
802 751
803 752
804 </div><!-- presentation --> 753 </div><!-- presentation -->