view slide/slide.pdf.html @ 13:e8655e0264b8

fix paper, slide
author ryokka
date Tue, 11 Feb 2020 02:31:26 +0900
parents 831316a767e8
children 19ab6b8055ea
line wrap: on
line source






<!DOCTYPE html>
<html>
<head>
   <meta http-equiv="content-type" content="text/html;charset=utf-8">
   <title>Continuation based C での Hoare Logic を用いた記述と検証</title>

   <meta name="generator" content="Slide Show (S9) v4.0.1 on Ruby 2.4.1 (2017-03-22) [x86_64-darwin16]">
   <meta name="author"    content="外間政尊" >

<!-- style sheet links -->
<link rel="stylesheet" href="s6/themes/screen.css"       media="screen">
<link rel="stylesheet" href="s6/themes/print.css"        media="print">
<link rel="stylesheet" href="s6/themes/blank.css"        media="screen,projection">

<!-- JS -->
<script src="s6/js/jquery-1.11.3.min.js"></script>
<script src="s6/js/jquery.slideshow.js"></script>
<script src="s6/js/jquery.slideshow.counter.js"></script>
<script src="s6/js/jquery.slideshow.controls.js"></script>
<script src="s6/js/jquery.slideshow.footer.js"></script>
<script src="s6/js/jquery.slideshow.autoplay.js"></script>

<!-- prettify -->
<link rel="stylesheet" href="scripts/prettify.css">
<script src="scripts/prettify.js"></script>

<style>
  .slide {page-break-after: always;}
</style>




</head>
<body>

<div class="layout">
  <div id="header"></div>
  <div id="footer">
    <div align="right">
      <img src="s6/images/logo.svg" width="200px">
    </div>
  </div>
</div>

<div class="presentation">

  <div class='slide cover'>
    <table width="90%" height="90%" border="0" align="center">
      <tr>
        <td>
          <div align="center">
              <h1><font color="#808db5">Continuation based C での Hoare Logic を用いた記述と検証</font></h1>
          </div>
        </td>
      </tr>
      <tr>
        <td>
          <div align="left">
               外間政尊
               - 琉球大学 : 並列信頼研究室
            <hr style="color:#ffcc00;background-color:#ffcc00;text-align:left;border:none;width:100%;height:0.2em;">
          </div>
        </td>
      </tr>
    </table>
  </div>


<div class='slide'>
  <!-- 発表30~40分、質疑応答20~30分くらい…? -->
<!-- TODO 
- 章構成を slide.mm の形に直す。
- Agda の説明と Gears の説明をなおす
- Gears での Hoare Logic の説明する前になんで Hoare Logic ベースなのかのスライドを入れてみる
-->


<!-- _S9SLIDE_ -->
<h2 id="os-の検証技術としての-hoare-logic-の問題点">OS の検証技術としての Hoare Logic の問題点</h2>
<ul>
  <li>OS やアプリケーションの信頼性は重要な課題</li>
  <li>信頼性を上げるために仕様の検証が必要</li>
  <li>検証にはモデル検査や<strong>定理証明</strong>などが存在する</li>
  <li>また、仕様検証の手法として <strong>Hoare Logic</strong> がある
    <ul>
      <li>プログラムを書く上である関数は実行する前に必要な引数があって何らかの出力がある</li>
      <li>Hoare Logic ではコマンドを実行する上で引数が存在するなどの事前に成り立つ条件があり、コマンド実行後に異なる条件が成り立つ
<!-- - 関数実行前に、引数が存在していて、出力が意図した通りになる --></li>
    </ul>
  </li>
  <li>Hoare Logic では関数が最低限のコマンドまで分割されており記述が困難(変数の代入、コマンド実行の遷移等)</li>
  <li>大規模なプログラムは構築しづらい</li>
</ul>



</div>

<div class='slide'>
  <!-- _S9SLIDE_ -->
<h2 id="hoare-logicをベースにした-gears-単位での検証">Hoare Logic をベースにした Gears 単位での検証</h2>
<ul>
  <li>当研究室では 処理の単位を <strong>CodeGear</strong>、データの単位を <strong>DataGear</strong> としてプログラムを記述する手法を提案</li>
  <li>CodeGear は Input DataGear を受け取り、処理を行って Output DataGear に書き込む</li>
  <li>CodeGear は継続を用いて次の CodeGear に接続される</li>
  <li>定理証明支援機の Agda 上で Gears 単位を用いた検証を行う</li>
  <li>本研究では Gears 単位を用いた Hoare Logic ベースの検証手法を提案する</li>
</ul>



</div>

<div class='slide'>
  <!-- _S9SLIDE_ -->
<h2 id="agda-のデータ型">Agda のデータ型</h2>
<ul>
  <li><strong>データ型</strong>はプリミティブなデータ</li>
  <li>この型のとき値は一意に定まる
    <div class="language-SHELL highlighter-coderay"><div class="CodeRay">
  <div class="code"><pre><span class="line-numbers"><a href="#n1" name="n1">1</a></span>  data Nat : Set where
<span class="line-numbers"><a href="#n2" name="n2">2</a></span>      zero : Nat
<span class="line-numbers"><a href="#n3" name="n3">3</a></span>      suc  : Nat → Nat
</pre></div>
</div>
    </div>
  </li>
  <li><strong>レコード型</strong>は複数のデータをまとめる</li>
  <li>複数の値を保持できる
    <div class="language-SHELL highlighter-coderay"><div class="CodeRay">
  <div class="code"><pre><span class="line-numbers"><a href="#n1" name="n1">1</a></span>  record Env : Set where 
<span class="line-numbers"><a href="#n2" name="n2">2</a></span>      field
<span class="line-numbers"><a href="#n3" name="n3">3</a></span>        varn : Nat
<span class="line-numbers"><a href="#n4" name="n4">4</a></span>        vari : Nat
</pre></div>
</div>
    </div>
  </li>
</ul>



</div>

<div class='slide'>
  <!-- _S9SLIDE_ -->
<h2 id="agda-の関数">Agda の関数</h2>
<ul>
  <li>関数にも同様に型が必要
    <div class="language-HASKELL highlighter-coderay"><div class="CodeRay">
  <div class="code"><pre><span class="line-numbers"><a href="#n1" name="n1">1</a></span>  +1 : ℕ → ℕ
<span class="line-numbers"><a href="#n2" name="n2">2</a></span>  +1 m = suc m
<span class="line-numbers"><a href="#n3" name="n3">3</a></span>
<span class="line-numbers"><a href="#n4" name="n4">4</a></span>  -- eval +1 zero
<span class="line-numbers"><a href="#n5" name="n5">5</a></span>  -- return suc zero
</pre></div>
</div>
    </div>
  </li>
  <li>関数の型は <strong>input → output</strong></li>
  <li>複数入力がある場合は <strong>input1 → input2 → output</strong></li>
  <li><strong>=</strong> の左側は関数名と引数、右側に実装</li>
</ul>



</div>

<div class='slide'>
  <!-- _S9SLIDE_ -->
<h2 id="agda-での証明">Agda での証明</h2>
<ul>
  <li>関数との違いは<strong>型が証明すべき論理式</strong>で<strong>関数自体がそれを満たす導出</strong>
    <div class="language-HASKELL highlighter-coderay"><div class="CodeRay">
  <div class="code"><pre><span class="line-numbers"><a href="#n1" name="n1">1</a></span>  +zero : { y : Nat } → y + zero ≡ y
<span class="line-numbers"><a href="#n2" name="n2">2</a></span>  +zero {zero} = refl
<span class="line-numbers"><a href="#n3" name="n3">3</a></span>  +zero {suc y} = cong suc ( +zero {y} )
</pre></div>
</div>
    </div>
  </li>
  <li><strong>refl</strong> は <strong>x ≡ x</strong></li>
  <li><strong>cong</strong> は <strong>関数</strong> と等式を受け取って、等式の両辺に関数を適応しても等しくなること</li>
  <li><strong>+zero</strong> は任意の自然数の右から zero を足しても元の数と等しいことの証明
    <ul>
      <li><strong>y = zero</strong> のときは <strong>zero ≡ zero</strong> のため refl</li>
      <li><strong>y = suc y</strong> のときは cong を使い y の数を減らして帰納的に証明している</li>
    </ul>
  </li>
</ul>



</div>

<div class='slide'>
  <!-- _S9SLIDE_ -->
<h2 id="gears-について">Gears について</h2>
<ul>
  <li><strong>Gears</strong> は当研究室で提案しているプログラム記述手法</li>
  <li>処理の単位を <strong>CodeGear</strong> 、データの単位を <strong>DataGear</strong></li>
  <li>CodeGear は引数として Input の DataGear を受け取り、 Output の DataGear を返す</li>
  <li>Output の DataGear は次の CodeGear の Input として接続される
<!-- [fig1](file://./fig/cgdg.pdf) --></li>
  <li>CodeGear の接続処理などのメタ計算は Meta CodeGear として定義</li>
  <li>Meta CodeGear で信頼性の検証を行う</li>
</ul>
<p style="text-align:center;"><img src="./fig/cgdg-small.svg" alt="" width="60%" height="75%" /></p>
<!-- <p style="text-align:center;"><img src="./fig/cgdg-small.svg" alt=""  width="75%" height="75%"/></p> -->



</div>

<div class='slide'>
  <!-- _S9SLIDE_ -->
<h2 id="agda-での-datagear">Agda での DataGear</h2>
<ul>
  <li><strong>DataGear</strong> は CodeGear でつかわれる引数をまとめたもの</li>
  <li>Agda は CodeGear、 DataGear は検証メタ計算そのものと考えられる</li>
  <li>DataGear は Agda の CodeGear で使われる<strong>全てのデータ</strong>に当たる</li>
</ul>



</div>

<div class='slide'>
  <!-- _S9SLIDE_ -->
<h2 id="agda-での-codegear">Agda での CodeGear</h2>
<ul>
  <li>Agda での CodeGear は継続渡しで記述された関数
    <div class="language-AGDA highlighter-coderay"><div class="CodeRay">
  <div class="code"><pre><span class="line-numbers"><a href="#n1" name="n1">1</a></span>  whileTest : {t : Set} → (c10 : Nat) 
<span class="line-numbers"><a href="#n2" name="n2">2</a></span>                → (Code : Env → t) → t
<span class="line-numbers"><a href="#n3" name="n3">3</a></span>  whileTest c10 next = next (record {varn = c10 
<span class="line-numbers"><a href="#n4" name="n4">4</a></span>                                     ; vari = 0} )
</pre></div>
</div>
    </div>
  </li>
  <li>CodeGear の型は<strong>引数 → (Code : fa → t) → t</strong></li>
  <li><strong>(Code : fa → t)</strong> は継続先</li>
  <li>引数として継続先を受け取って計算結果を渡す</li>
</ul>



</div>

<div class='slide'>
  <!-- _S9SLIDE_ -->
<h2 id="agda-での-gears-の記述whileloop">Agda での Gears の記述(whileLoop)</h2>
<ul>
  <li>関数の動作を条件で変えたいときはパターンマッチを行う
    <div class="language-AGDA highlighter-coderay"><div class="CodeRay">
  <div class="code"><pre><span class="line-numbers"><a href="#n1" name="n1">1</a></span>  whileLoop : {l : Level} {t : Set l} → Envc 
<span class="line-numbers"><a href="#n2" name="n2">2</a></span>     → (next : Envc → t) → (exit : Envc → t) → t
<span class="line-numbers"><a href="#n3" name="n3">3</a></span>  whileLoop env@(record { c10 = _ ; varn = zero ; vari = _ }) _ exit = exit env
<span class="line-numbers"><a href="#n4" name="n4">4</a></span>  whileLoop record { c10 = _ ; varn = suc varn1 ; vari = vari } next _ = 
<span class="line-numbers"><a href="#n5" name="n5">5</a></span>       next (record {c10 = _ ; varn = varn1 ; vari = suc vari })
</pre></div>
</div>
    </div>
  </li>
  <li>whileLoop は varn が 0 より大きい間ループする</li>
</ul>



</div>

<div class='slide'>
  <!-- _S9SLIDE_ -->
<h2 id="hoare-logic-をベースとした-gears-での検証手法">Hoare Logic をベースとした Gears での検証手法</h2>
<div class="language-C highlighter-coderay"><div class="CodeRay">
  <div class="code"><pre><span class="line-numbers"><a href="#n1" name="n1">1</a></span>   n = <span style="color:#00D">10</span>;
<span class="line-numbers"><a href="#n2" name="n2">2</a></span>   i = <span style="color:#00D">0</span>;
<span class="line-numbers"><a href="#n3" name="n3">3</a></span>
<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>)
<span class="line-numbers"><a href="#n5" name="n5">5</a></span>   {
<span class="line-numbers"><a href="#n6" name="n6">6</a></span>     i++;
<span class="line-numbers"><a href="#n7" name="n7">7</a></span>     n--;
<span class="line-numbers"><a href="#n8" name="n8">8</a></span>   }
</pre></div>
</div>
</div>
<ul>
  <li>今回 Hoare Logic で証明する次のようなコードを検証した</li>
  <li>このプログラムは変数iとnをもち、 n&gt;0 の間nの値を減らし、i の値を増やす</li>
  <li>n ≡ 0 のとき停止するため、終了時の変数の結果は i ≡ 10、n ≡ 0 になる</li>
</ul>



</div>

<div class='slide'>
  <!-- _S9SLIDE_ -->
<h2 id="gears-をベースにしたプログラム">Gears をベースにしたプログラム</h2>
<div class="language-AGDA highlighter-coderay"><div class="CodeRay">
  <div class="code"><pre><span class="line-numbers"><a href="#n1" name="n1">1</a></span>    test : Env
<span class="line-numbers"><a href="#n2" name="n2">2</a></span>    test = whileTest 10 (λ env → whileLoop env (λ env1 → env1))
<span class="line-numbers"><a href="#n3" name="n3">3</a></span>
<span class="line-numbers"><a href="#n4" name="n4">4</a></span>    -- whileTest : {t : Set} → (c10 : Nat) → (Code : Env → t) → t
<span class="line-numbers"><a href="#n5" name="n5">5</a></span>    -- whileLoop : {t : Set} → Env → (Code : Env → t) → t
</pre></div>
</div>
</div>
<ul>
  <li>test は whileTest と whileLoop を実行した結果を返す関数</li>
  <li>whileTest の継続先にDataGear を受け取って whileLoop に渡す
    <ul>
      <li><strong>(λ 引数 → )</strong>は無名の関数で引数を受け取って継続する</li>
    </ul>
  </li>
</ul>



</div>

<div class='slide'>
  <!-- _S9SLIDE_ -->
<h2 id="gears-をベースにした-hoare-logic-と証明全体">Gears をベースにした Hoare Logic と証明(全体)</h2>
<div class="language-AGDA highlighter-coderay"><div class="CodeRay">
  <div class="code"><pre><span class="line-numbers"><a href="#n1" name="n1">1</a></span>    -- test = whileTest 10 (λ env → whileLoop env (λ env1 → env1))
<span class="line-numbers"><a href="#n2" name="n2">2</a></span>    proofGears : {c10 :  Nat } → Set
<span class="line-numbers"><a href="#n3" name="n3">3</a></span>    proofGears {c10} = whileTest' {_} {_} {c10} (λ n p1 →
<span class="line-numbers"><a href="#n4" name="n4">4</a></span>             conversion1 n p1  (λ n1 p2 → whileLoop' n1 p2 
<span class="line-numbers"><a href="#n5" name="n5">5</a></span>             (λ n2 →  ( vari n2 ≡ c10 )))) 
</pre></div>
</div>
</div>
<ul>
  <li>proofGears は Hoare Logic をベースとした証明
    <ul>
      <li>先程のプログラムと違い、引数として証明も持っている</li>
    </ul>
  </li>
  <li>whileTest’ の継続に conversion1、その継続に whileLoop’ が来て最後の継続に vari が c10 と等しい</li>
</ul>



</div>

<div class='slide'>
  <!-- _S9SLIDE_ -->
<h2 id="gears-と-hoare-logic-をベースにした証明whiletest">Gears と Hoare Logic をベースにした証明(whileTest)</h2>
<div class="language-AGDA highlighter-coderay"><div class="CodeRay">
  <div class="code"><pre><span class="line-numbers"><a href="#n1" name="n1">1</a></span>    whileTest' : {l : Level} {t : Set l} {c10 :  ℕ } 
<span class="line-numbers"><a href="#n2" name="n2">2</a></span>      → (Code : (env : Env )  → ((vari env) ≡ 0) ∧ ((varn env) ≡ c10) → t) → t
<span class="line-numbers"><a href="#n3" name="n3">3</a></span>    whileTest' {_} {_}  {c10} next = next 
<span class="line-numbers"><a href="#n4" name="n4">4</a></span>      (record env {vari = 0 ; varn = c10 }) (record {pi1 = refl ; pi2 = refl})
</pre></div>
</div>
</div>
<ul>
  <li>最初の Command なので PreCondition はない</li>
  <li>(record {pi1 = refl ; pi2 = refl}) は <strong>(vari env) ≡ 0</strong> と <strong>(varn env) ≡ c10</strong>の証明
    <ul>
      <li><strong><em>∧</em></strong> は pi1 と pi2 のフィールドをもつレコード型</li>
      <li>両方とも成り立つので <strong>refl</strong></li>
    </ul>
  </li>
  <li>Gears での PostCondition は <strong>引数 → (Code : fa → PostCondition → t) → t</strong></li>
</ul>



</div>

<div class='slide'>
  <!-- _S9SLIDE_ -->
<h2 id="gears-と-hoare-logic-をベースにした証明conversion">Gears と Hoare Logic をベースにした証明(conversion)</h2>
<div class="language-AGDA highlighter-coderay"><div class="CodeRay">
  <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
<span class="line-numbers"><a href="#n2" name="n2">2</a></span>    conv e record { pi1 = refl ; pi2 = refl } = +zero
</pre></div>
</div>
</div>
<ul>
  <li>conv は制約を緩める CodeGear
    <ul>
      <li><strong>(vari env ≡ 0) ∧ (varn env ≡ c10 env)</strong> が成り立つとき <strong>varn env + vari env ≡ c10 env</strong> が成り立つ</li>
    </ul>
  </li>
</ul>

<!-- ##  Hoare Logic の証明 -->
<!-- - Hoare Logic の証明では基本的に項の書き換えを行って証明している -->
<!-- - proof4 の証明部分では論理式の**varn env + vari env** を 書き換えて **c10** に変換している -->
<!-- - 変換で使っている **cong** は 関数と x ≡ y 受け取って両辺に関数を適応しても等しいことが変わらないことの証明 -->
<!-- - 変換後の式を次の行に書いて変換を続ける -->
<!-- ```AGDA -->
<!--     conv1 : {l : Level} {t : Set l } → (env : Envc ) -->
<!--       → ((vari env) ≡ 0) /\ ((varn env) ≡ (c10 env)) -->
<!--       → (Code : (env1 : Envc ) → (varn env1 + vari env1 ≡ (c10 env1)) → t) → t -->
<!--     conv1 env record { pi1 = refl ; pi2 = refl } next = next env +zero -->
<!-- ``` -->



</div>

<div class='slide'>
  <!-- _S9SLIDE_ -->
<h2 id="gears-と-hoare-logic-をベースにした証明whileloop">Gears と Hoare Logic をベースにした証明(whileLoop)</h2>
<div class="language-AGDA highlighter-coderay"><div class="CodeRay">
  <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
<span class="line-numbers"> <a href="#n2" name="n2">2</a></span>      → (next : (env : Envc ) → (pred n ≡ varn env) → whileTestStateP s2 env  → t)
<span class="line-numbers"> <a href="#n3" name="n3">3</a></span>      → (exit : (env : Envc ) → whileTestStateP sf env  → t) → t
<span class="line-numbers"> <a href="#n4" name="n4">4</a></span>    whileLoopPwP' zero env refl refl next exit = exit env refl
<span class="line-numbers"> <a href="#n5" name="n5">5</a></span>    whileLoopPwP' (suc n) env refl refl next exit = 
<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))
<span class="line-numbers"> <a href="#n7" name="n7">7</a></span>
<span class="line-numbers"> <a href="#n8" name="n8">8</a></span>    loopPwP' zero env refl refl exit = exit env refl
<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 
<span class="line-numbers"><strong><a href="#n10" name="n10">10</a></strong></span>        (λ env x y → loopPwP' n env x y exit) exit
</pre></div>
</div>
</div>
<ul>
  <li>whileLoop も whileTest と同様に PreCondition が CodeGear に入りそれに対する証明が記述されている</li>
  <li>ループが回るごとに、<strong>whileLoopPwP’</strong> で停止か継続かを判断し、 <strong>loopPwP’</strong> でループが回る</li>
</ul>



</div>

<div class='slide'>
  <!-- _S9SLIDE_ -->
<h2 id="gears-と-hoare-logic-をベースにした仕様記述">Gears と Hoare Logic をベースにした仕様記述</h2>
<div class="language-AGDA highlighter-coderay"><div class="CodeRay">
  <div class="code"><pre><span class="line-numbers"><a href="#n1" name="n1">1</a></span>    whileProofs : (c :  ℕ ) → Set
<span class="line-numbers"><a href="#n2" name="n2">2</a></span>    whileProofs c = whileTestPwP {_} {_} c 
<span class="line-numbers"><a href="#n3" name="n3">3</a></span>       ( λ env s → conv1 env s 
<span class="line-numbers"><a href="#n4" name="n4">4</a></span>       ( λ env s → loopPwP' (varn env) env refl s 
<span class="line-numbers"><a href="#n5" name="n5">5</a></span>       ( λ env s → vari env ≡ c10 env )))
</pre></div>
</div>
</div>
<ul>
  <li><strong>whileProofs</strong> では最終状態が vari と c10 が等しくなるため仕様になっている</li>
</ul>



</div>

<div class='slide'>
  <!-- _S9SLIDE_ -->
<h2 id="gears-と-hoare-logic-を用いた仕様の証明">Gears と Hoare Logic を用いた仕様の証明</h2>
<div class="language-AGDA highlighter-coderay"><div class="CodeRay">
  <div class="code"><pre><span class="line-numbers"> <a href="#n1" name="n1">1</a></span>--    whileProofs c = whileTestPwP {_} {_} c 
<span class="line-numbers"> <a href="#n2" name="n2">2</a></span>--       ( λ env s → conv1 env s 
<span class="line-numbers"> <a href="#n3" name="n3">3</a></span>--       ( λ env s → loopPwP' (varn env) env refl s 
<span class="line-numbers"> <a href="#n4" name="n4">4</a></span>--       ( λ env s → vari env ≡ c10 env )))
<span class="line-numbers"> <a href="#n5" name="n5">5</a></span>
<span class="line-numbers"> <a href="#n6" name="n6">6</a></span>    ProofGears : (c : ℕ) → whileProofs c
<span class="line-numbers"> <a href="#n7" name="n7">7</a></span>    ProofGears c = whileTestPwP {_} {_} c
<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
<span class="line-numbers"> <a href="#n9" name="n9">9</a></span>      (λ env₁ s₁ → {!!}))
<span class="line-numbers"><strong><a href="#n10" name="n10">10</a></strong></span>
<span class="line-numbers"><a href="#n11" name="n11">11</a></span>    Goal: loopPwP' c (record { c10 = c ; varn = c ; vari = 0 }) refl
<span class="line-numbers"><a href="#n12" name="n12">12</a></span>          +zero (λ env₂ s₂ → vari env₂ ≡ c10 env₂)
<span class="line-numbers"><a href="#n13" name="n13">13</a></span>    ------------------------------------------------------------
<span class="line-numbers"><a href="#n14" name="n14">14</a></span>    s₁   : vari env₁ ≡ c10 env₁
<span class="line-numbers"><a href="#n15" name="n15">15</a></span>    env₁ : Envc
<span class="line-numbers"><a href="#n16" name="n16">16</a></span>    s    : (vari env ≡ 0) /\ (varn env ≡ c10 env)
<span class="line-numbers"><a href="#n17" name="n17">17</a></span>    env  : Envc
<span class="line-numbers"><a href="#n18" name="n18">18</a></span>    c    : ℕ
</pre></div>
</div>
</div>
<ul>
  <li>先程の <strong>whileProofs</strong> で行った仕様記述を型に記述し、実際に証明していく</li>
  <li>しかし loopPwP’ のループが進まず証明できない</li>
</ul>



</div>

<div class='slide'>
  <!-- _S9SLIDE_ -->
<h2 id="検証時の-loop-の解決">検証時の Loop の解決</h2>
<div class="language-AGDA highlighter-coderay"><div class="CodeRay">
  <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) 
<span class="line-numbers"><a href="#n2" name="n2">2</a></span>      → loopPwP' n env (sym eq) seq (λ env₁ x → (vari env₁ ≡ c10 env₁))
<span class="line-numbers"><a href="#n3" name="n3">3</a></span>    loopHelper zero env eq refl rewrite eq = refl
<span class="line-numbers"><a href="#n4" name="n4">4</a></span>    loopHelper (suc n) env eq refl rewrite eq = loopHelper n 
<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))
</pre></div>
</div>
</div>
<ul>
  <li><strong>loopHelper</strong> は今回のループを解決する証明</li>
  <li>ループ解決のためにループの簡約ができた</li>
</ul>



</div>

<div class='slide'>
  <!-- _S9SLIDE_ -->
<h2 id="gears-と-hoare-logic-を用いた仕様の証明完成">Gears と Hoare Logic を用いた仕様の証明(完成)</h2>
<div class="language-AGDA highlighter-coderay"><div class="CodeRay">
  <div class="code"><pre><span class="line-numbers"><a href="#n1" name="n1">1</a></span>    --    whileProofs c = whileTestPwP {_} {_} c 
<span class="line-numbers"><a href="#n2" name="n2">2</a></span>    --       ( λ env s → conv1 env s 
<span class="line-numbers"><a href="#n3" name="n3">3</a></span>    --       ( λ env s → loopPwP' (varn env) env refl s 
<span class="line-numbers"><a href="#n4" name="n4">4</a></span>    --       ( λ env s → vari env ≡ c10 env )))
<span class="line-numbers"><a href="#n5" name="n5">5</a></span>    ProofGears : (c : ℕ) → whileProofs c
<span class="line-numbers"><a href="#n6" name="n6">6</a></span>    ProofGears c = whileTestPwP {_} {_} c 
<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)
</pre></div>
</div>
</div>
<ul>
  <li><strong>loopHelper</strong> を使って簡約することで <strong>whileProofs</strong> の証明を行うことができた</li>
</ul>



</div>

<div class='slide'>
  <!-- _S9SLIDE_ -->
<h2 id="まとめと今後の課題">まとめと今後の課題</h2>
<ul>
  <li>CodeGear、 DataGear を用いた Hoare Logic ベースの仕様記述を導入した</li>
  <li>Hoare Logic ベースの検証を実際に行うことができた</li>
  <li>証明時の任意回の有限ループに対する解決を行えた</li>
  <li>今後の課題
    <ul>
      <li>BinaryTree の有限ループに対する証明</li>
      <li>Hoare Logic で検証されたコードの CbC 変換</li>
      <li>並列実行での検証</li>
    </ul>
  </li>
</ul>

</div>


</div><!-- presentation -->
</body>
</html>