comparison presentation/slide.html @ 122:c195713cf7d7

Update slide
author atton <atton@cr.ie.u-ryukyu.ac.jp>
date Tue, 14 Feb 2017 15:45:03 +0900
parents 137aae675a94
children 81978a9122f0
comparison
equal deleted inserted replaced
121:137aae675a94 122:c195713cf7d7
84 84
85 <div class='slide '> 85 <div class='slide '>
86 <!-- === begin markdown block === 86 <!-- === begin markdown block ===
87 87
88 generated by markdown/1.2.0 on Ruby 2.3.3 (2016-11-21) [x86_64-darwin16] 88 generated by markdown/1.2.0 on Ruby 2.3.3 (2016-11-21) [x86_64-darwin16]
89 on 2017-02-14 15:02:42 +0900 with Markdown engine kramdown (1.13.0) 89 on 2017-02-14 15:44:26 +0900 with Markdown engine kramdown (1.13.0)
90 using options {} 90 using options {}
91 --> 91 -->
92 92
93 <!-- _S9SLIDE_ --> 93 <!-- _S9SLIDE_ -->
94 <h1 id="section">プログラミング言語とソフトウェアの信頼性</h1> 94 <h1 id="section">プログラミング言語とソフトウェアの信頼性</h1>
127 127
128 128
129 </div> 129 </div>
130 <div class='slide '> 130 <div class='slide '>
131 <!-- _S9SLIDE_ --> 131 <!-- _S9SLIDE_ -->
132 <h1 id="section-2">本発表ではモデル検査的アプローチについて中心に見ていきます</h1> 132 <h1 id="section-2">モデル検査的アプローチについての流れ</h1>
133 <ul>
134 <li>修士論文の内部の比率は半分半分くらい</li>
135 <li>定理証明の方は説明する内容が多くて複雑</li>
136 <li>モデル検査的アプローチは過去論文を提出したもの
137 <ul>
138 <li>なのでそちらをメインで発表します</li>
139 </ul>
140 </li>
141 </ul>
142
143
144 </div>
145 <div class='slide '>
146 <!-- _S9SLIDE_ -->
147 <h1 id="section-3">モデル検査的アプローチについての流れ</h1>
148 <ul> 133 <ul>
149 <li>既存のモデル検査器について</li> 134 <li>既存のモデル検査器について</li>
150 <li>Continuation based C (CbC) 言語について</li> 135 <li>Continuation based C (CbC) 言語について</li>
151 <li>CbC における CodeSegment と DataSegment を用いたプログラミングスタイル</li> 136 <li>CbC における CodeSegment と DataSegment を用いたプログラミングスタイル</li>
152 <li>CbC とメタ計算について</li> 137 <li>CbC とメタ計算について</li>
264 249
265 250
266 </div> 251 </div>
267 <div class='slide '> 252 <div class='slide '>
268 <!-- _S9SLIDE_ --> 253 <!-- _S9SLIDE_ -->
269 <h1 id="section-4">メタ計算</h1> 254 <h1 id="section-3">メタ計算</h1>
270 <ul> 255 <ul>
271 <li>とある計算を実現するための計算</li> 256 <li>とある計算を実現するための計算</li>
272 <li>ネットワーク接続、例外処理、メモリ確保、並列処理など</li> 257 <li>ネットワーク接続、例外処理、メモリ確保、並列処理など</li>
273 <li>CbC は通常レベルの計算とメタ計算を分離して考える 258 <li>CbC は通常レベルの計算とメタ計算を分離して考える
274 <ul> 259 <ul>
318 303
319 304
320 </div> 305 </div>
321 <div class='slide '> 306 <div class='slide '>
322 <!-- _S9SLIDE_ --> 307 <!-- _S9SLIDE_ -->
323 <h1 id="section-5">赤黒木</h1> 308 <h1 id="section-4">赤黒木</h1>
324 <ul> 309 <ul>
325 <li>データの保存に用いる二分木</li> 310 <li>データの保存に用いる二分木</li>
326 <li>特に赤黒木はノードが持つ赤か黒の色を使って木のバランスを取る 311 <li>特に赤黒木はノードが持つ赤か黒の色を使って木のバランスを取る
327 <ul> 312 <ul>
328 <li>ルートノードと葉ノードの色は黒</li> 313 <li>ルートノードと葉ノードの色は黒</li>
351 336
352 337
353 </div> 338 </div>
354 <div class='slide '> 339 <div class='slide '>
355 <!-- _S9SLIDE_ --> 340 <!-- _S9SLIDE_ -->
356 <h1 id="section-6">仕様の記述とその確認</h1> 341 <h1 id="section-5">仕様の記述とその確認</h1>
357 <ul> 342 <ul>
358 <li>「バランスが取れている」とは何かを表現できる必要がある 343 <li>「バランスが取れている」とは何かを表現できる必要がある
359 <ul> 344 <ul>
360 <li>実行可能な CbC の条件式を使った assert になる</li> 345 <li>実行可能な CbC の条件式を使った assert になる</li>
361 </ul> 346 </ul>
369 354
370 355
371 </div> 356 </div>
372 <div class='slide '> 357 <div class='slide '>
373 <!-- _S9SLIDE_ --> 358 <!-- _S9SLIDE_ -->
374 <h1 id="section-7">チェックする仕様</h1> 359 <h1 id="section-6">チェックする仕様</h1>
375 <ul> 360 <ul>
376 <li>赤黒木の高さに関する仕様に以下のものがある 361 <li>赤黒木の高さに関する仕様に以下のものがある
377 <ul> 362 <ul>
378 <li>木をルートから辿った際に最も長い経路は最も短い経路の高々2倍に収まる</li> 363 <li>木をルートから辿った際に最も長い経路は最も短い経路の高々2倍に収まる</li>
379 </ul> 364 </ul>
380 </li> 365 </li>
381 <li>以下のような条件式を仕様として CbC で定義、検証できる</li> 366 <li>以下のような条件式を仕様として CbC で定義できる</li>
382 </ul> 367 </ul>
383 368
384 <pre><code>__code verifySpecificationFinish(struct Context* context) { 369 <pre><code>__code verifySpecificationFinish(struct Context* context) {
385 if (context-&gt;data[AkashaInfo]-&gt;akashaInfo.maxHeight &gt; 370 if (context-&gt;data[AkashaInfo]-&gt;akashaInfo.maxHeight &gt;
386 2*context-&gt;data[AkashaInfo]-&gt;akashaInfo.minHeight) 371 2*context-&gt;data[AkashaInfo]-&gt;akashaInfo.minHeight)
403 <li>goto された時に挿入される要素の組み合わせを全て列挙して実行する 388 <li>goto された時に挿入される要素の組み合わせを全て列挙して実行する
404 <ul> 389 <ul>
405 <li>赤黒木の状態の保存、挿入、チェック、次の状態の列挙、赤黒木の再現……</li> 390 <li>赤黒木の状態の保存、挿入、チェック、次の状態の列挙、赤黒木の再現……</li>
406 </ul> 391 </ul>
407 </li> 392 </li>
408 <li>その度に仕様の式は成り立つかをチェックする</li> 393 <li>挿入する度に仕様の式が成り立つかをチェック</li>
409 </ul> 394 </ul>
410 </li> 395 </li>
411 <li>ノーマルレベルのコードを検証用に変更せず検証可能</li> 396 <li>ノーマルレベルのコードを検証用に変更せず検証可能</li>
412 </ul> 397 </ul>
413 398
454 439
455 440
456 </div> 441 </div>
457 <div class='slide '> 442 <div class='slide '>
458 <!-- _S9SLIDE_ --> 443 <!-- _S9SLIDE_ -->
444 <h1 id="agda-">Agda における証明</h1>
445 <ul>
446 <li>Curry-Howard Isomorphism による型付きラムダ計算と自然演繹の対応
447 <ul>
448 <li>自然演繹: 命題、ならば、かつ、または、で構成される証明システム</li>
449 </ul>
450 </li>
451 <li>論理式は型に相当して、証明はその値の導出</li>
452 <li>三段論法の証明は以下のようになる
453 <ul>
454 <li>「((A ならば B) かつ (B ならば C)) ならば (A ならば C)</li>
455 </ul>
456 </li>
457 </ul>
458
459 <pre><code>f : {A B C : Set} -&gt; ((A -&gt; B) × (B -&gt; C)) -&gt; (A -&gt; C)
460 f = \p x -&gt; (snd p) ((fst p) x)
461 </code></pre>
462
463
464 </div>
465 <div class='slide '>
466 <!-- _S9SLIDE_ -->
467 <h1 id="agda--1">Agda における等式の証明</h1>
468 <ul>
469 <li>Agda では等式も証明できる
470 <ul>
471 <li>依存型という型を変数として扱える型システムを持つ</li>
472 <li>型を取って型を返す型などが定義可能</li>
473 </ul>
474 </li>
475 <li>等式の証明は両方が同じ項に簡約されることを示せば良い</li>
476 <li>自然数の加法の交換法則は以下のようになる</li>
477 </ul>
478
479 <pre><code>addSym : (n m : Nat) -&gt; n + m ≡ m + n
480 addSym O O = refl
481 addSym O (S m) = cong S (addSym O m)
482 addSym (S n) O = cong S (addSym n O)
483 addSym (S n) (S m) = begin
484 (S n) + (S m) ≡⟨ refl ⟩
485 S (n + S m) ≡⟨ cong S (addSym n (S m)) ⟩
486 S ((S m) + n) ≡⟨ addToRight (S m) n ⟩
487 S (m + S n) ≡⟨ refl ⟩
488 (S m) + (S n) ∎
489 </code></pre>
490
491
492 </div>
493 <div class='slide '>
494 <!-- _S9SLIDE_ -->
459 <h1 id="agda--datasegment">Agda と DataSegment</h1> 495 <h1 id="agda--datasegment">Agda と DataSegment</h1>
460 <ul> 496 <ul>
461 <li>CbC の DataSegment は Agda のレコード型 497 <li>CbC の DataSegment は Agda のレコード型
462 <ul> 498 <ul>
463 <li>名前付きの値が複数ある(C の構造体)</li> 499 <li>名前付きの値が複数ある(C の構造体)</li>
501 537
502 538
503 </div> 539 </div>
504 <div class='slide '> 540 <div class='slide '>
505 <!-- _S9SLIDE_ --> 541 <!-- _S9SLIDE_ -->
506 <h1 id="section-8">メタレベルの型付け</h1> 542 <h1 id="section-7">メタレベルの型付け</h1>
507 <ul> 543 <ul>
508 <li>メタ計算とは通常のレベルとは区別された計算</li> 544 <li>メタ計算とは通常のレベルとは区別された計算</li>
509 <li>任意の通常のレベルの計算を扱えなくてはならない 545 <li>任意の通常のレベルの計算を扱えなくてはならない
510 <ul> 546 <ul>
511 <li>ライブラリが呼び出されるプログラムは無数にあるようなイメージ</li> 547 <li>ライブラリが呼び出されるプログラムは無数にあるようなイメージ</li>
522 558
523 559
524 </div> 560 </div>
525 <div class='slide '> 561 <div class='slide '>
526 <!-- _S9SLIDE_ --> 562 <!-- _S9SLIDE_ -->
527 <h1 id="agda-">Agda 上のメタ計算</h1> 563 <h1 id="agda--2">Agda 上のメタ計算</h1>
528 <ul> 564 <ul>
529 <li>ノーマルレベルの型を保持したままメタレベルの計算を利用できる 565 <li>ノーマルレベルの型を保持したままメタレベルの計算を利用できる
530 <ul> 566 <ul>
531 <li>cs0 の定義はメタ計算用に変更しなくても良い</li> 567 <li>cs0 の定義はメタ計算用に変更しなくても良い</li>
532 </ul> 568 </ul>
547 583
548 584
549 </div> 585 </div>
550 <div class='slide '> 586 <div class='slide '>
551 <!-- _S9SLIDE_ --> 587 <!-- _S9SLIDE_ -->
588 <h1 id="agda--3">Agda 上で証明できた性質</h1>
589 <ul>
590 <li>CodeSegment の合成則</li>
591 </ul>
592
593 <pre><code>comp-associative : &gt; (a : CodeSegment A B) (b : CodeSegment C D) (c : CodeSegment E F)
594 -&gt; csComp c (csComp b a) ≡ csComp (csComp c b) a
595 comp-associative (cs _) (cs _) (cs _) = refl
596 -- c . (b . a) ≡ (c . b) . a
597 </code></pre>
598
599 <ul>
600 <li>スタックの操作についての性質</li>
601 </ul>
602
603 <pre><code>push-pop-type : ℕ -&gt; ℕ -&gt; ℕ -&gt; Element ℕ -&gt; Set₁
604 push-pop-type n e x s = M.exec (M.csComp (M.cs popOnce) (M.cs pushOnce)) meta ≡ meta
605 -- goto (pop . push) mds ≡ mds
606
607 n-push-pop-type : ℕ -&gt; ℕ -&gt; ℕ -&gt; SingleLinkedStack ℕ -&gt; Set₁
608 n-push-pop-type n cn ce st = M.exec (M.csComp (n-pop n) (n-push n)) meta ≡ meta
609 -- goto (pop*n . push*n) mds ≡ mds
610 </code></pre>
611
612
613 </div>
614 <div class='slide '>
615 <!-- _S9SLIDE_ -->
552 <h1 id="agda--cbc-">Agda 上に CbC を記述した成果</h1> 616 <h1 id="agda--cbc-">Agda 上に CbC を記述した成果</h1>
553 <ul> 617 <ul>
554 <li>部分型で CbC の型付けができた</li> 618 <li>部分型で CbC の型付けができた</li>
555 <li>メタ計算をきちんと階層化できた 619 <li>メタ計算をきちんと階層化できた
556 <ul> 620 <ul>
566 630
567 631
568 </div> 632 </div>
569 <div class='slide '> 633 <div class='slide '>
570 <!-- _S9SLIDE_ --> 634 <!-- _S9SLIDE_ -->
571 <h1 id="section-9">まとめ</h1> 635 <h1 id="section-8">まとめ</h1>
572 <ul> 636 <ul>
573 <li>Continuation based C 言語を対象にした二種類の検証アプローチ</li> 637 <li>Continuation based C 言語を対象にした二種類の検証アプローチ</li>
574 <li>モデル検査的なアプローチ 638 <li>モデル検査的なアプローチ
575 <ul> 639 <ul>
576 <li>継続を上書きして可能な状態を数え上げるメタ計算ライブラリ akasha を実装</li> 640 <li>継続を上書きして可能な状態を数え上げるメタ計算ライブラリ akasha を実装</li>
577 <li>有限の要素数まで保証できた</li> 641 <li>有限の要素数まで検証できた</li>
578 </ul> 642 </ul>
579 </li> 643 </li>
580 <li>証明的なアプローチ 644 <li>証明的なアプローチ
581 <ul> 645 <ul>
582 <li>証明支援系 Agda 上で CbC のプログラムを定義して直接証明</li> 646 <li>証明支援系 Agda 上で CbC のプログラムを定義して直接証明</li>
588 652
589 653
590 </div> 654 </div>
591 <div class='slide '> 655 <div class='slide '>
592 <!-- _S9SLIDE_ --> 656 <!-- _S9SLIDE_ -->
593 <h1 id="section-10">今後の課題</h1> 657 <h1 id="section-9">今後の課題</h1>
594 <ul> 658 <ul>
595 <li>より大きなサイズの赤黒木の検証</li> 659 <li>より大きなサイズの赤黒木の検証</li>
596 <li>赤黒木の挿入に関する性質を証明する</li> 660 <li>赤黒木の挿入に関する性質を証明する</li>
597 <li>部分型を利用してCbCを型付け</li> 661 <li>部分型を利用してCbCを型付け</li>
598 <li>依存型をCbC に導入して自身を証明可能にする</li> 662 <li>依存型をCbC に導入して自身を証明可能にする</li>
599 <li>型情報から stub を自動生成すkる</li> 663 </ul>
600 </ul> 664
601 665
602 666 </div>
603 </div> 667 <div class='slide '>
604 <div class='slide '> 668 <!-- _S9SLIDE_ -->
605 <!-- _S9SLIDE_ --> 669 <h1 id="section-10">発表履歴</h1>
606 <h1 id="section-11">発表履歴</h1>
607 <ul> 670 <ul>
608 <li>Agda 入門. 671 <li>Agda 入門.
609 <ul> 672 <ul>
610 <li>オープンソースカンファレンス 2014 Okinawa, May 2014.</li> 673 <li>オープンソースカンファレンス 2014 Okinawa, May 2014.</li>
611 </ul> 674 </ul>