view slide/slide.html @ 14:b711209123f7

update
author ryokka
date Tue, 15 Jan 2019 17:47:18 +0900
parents e8fe28afe61e
children 07e1ccdfd844
line wrap: on
line source






<!DOCTYPE html>
<html>
<head>
   <meta http-equiv="content-type" content="text/html;charset=utf-8">
   <title>GearsOS の 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="Masataka Hokama" >

<!-- style sheet links -->
<link rel="stylesheet" href="s6/themes/projection.css"   media="screen,projection">
<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>

<script>
  $(document).ready( function() {
    Slideshow.init();

    $('code').each(function(_, el) {
      if (!el.classList.contains('noprettyprint')) {
        el.classList.add('prettyprint');
      }
    });
    prettyPrint();
  } );

</script>

<!-- Better Browser Banner for Microsoft Internet Explorer (IE) -->
<!--[if IE]>
<script src="s6/js/jquery.microsoft.js"></script>
<![endif]-->

    

</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">GearsOS の Hoare Logic を用いた検証</font></h1>
          </div>
        </td>
      </tr>
      <tr>
        <td>
          <div align="left">
              Masataka Hokama
              琉球大学 : 並列信頼研究室
            <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'>
  <!-- 発表20分、質疑応答5分 -->


<!-- _S9SLIDE_ -->
<h2 id="研究背景">研究背景</h2>
<ul>
  <li>OS やアプリケーションなどの信頼性は重要な課題</li>
  <li>信頼性を上げるために仕様を検証する必要</li>
  <li>仕様検証の手法として Floyd-Hoare Logic (以下 HoareLogic) がある
    <ul>
      <li>事前条件(Pre Condition)が成り立つとき、関数(Command)を実行、それが停止したとき、事後条件(Post Condition)を満たす</li>
    </ul>
  </li>
  <li>既存の言語ではあまり利用されていない</li>
</ul>



</div>

<div class='slide'>
  <!-- _S9SLIDE_ -->
<h2 id="背景">背景</h2>
<ul>
  <li>当研究室では 処理の単位を <strong>CodeGear</strong>、データの単位を <strong>DataGear</strong> としてプログラムを記述する手法を提案</li>
  <li>CodeGear は Input DataGear を受け取り、処理を行って Output DataGear に書き込む
<!-- - Gear 間の接続処理はメタ計算として定義 -->
<!--   - メタ計算部分に検証を埋め込むことで通常処理に手を加えずに検証 --></li>
  <li>この単位を用いて信頼性の高い OS として GearsOS を開発している</li>
  <li>本発表では Gears OS の信頼性を高めるため、 Gears の単位を用いた HoareLogic ベースの検証手法を提案する</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 の接続処理は通常の計算とは異なるメタ計算として定義
    <ul>
      <li>メタ計算で信頼性の検証を行う</li>
    </ul>
  </li>
</ul>
<p style="text-align:center;"><img src="./pic/cgdg-small.svg" alt="" width="75%" height="75%" /></p>
<!-- ![cgdg](./pic/codeGear_dataGear.pdf){} -->
<!-- <p style="text-align:center;"><img src="./pic/cgdg.svg" alt=""  width="30%" height="30%"/></p> -->



</div>

<div class='slide'>
  <!-- _S9SLIDE_ -->
<h2 id="cbc-について">CbC について</h2>
<ul>
  <li>Gears の単位でプログラミングできる言語として当研究室で開発している <strong>CbC</strong> (Continuation based C) が存在
    <ul>
      <li>これは C からループ制御構造と関数呼び出しを取り除き、代わりに継続を導入したもの</li>
    </ul>
  </li>
  <li>現在の CbC でもメタ計算での検証は可能</li>
  <li>将来的には証明も扱えるようにしたいが現段階では未実装</li>
  <li>そのため Gears の単位を定理証明支援系の言語である <strong>Agda</strong> で記述し、 Agda で証明している</li>
</ul>



</div>

<div class='slide'>
  <!-- _S9SLIDE_ -->
<h2 id="agda-とは">Agda とは</h2>
<ul>
  <li>Agda は定理証明支援系の言語</li>
  <li>依存型を持つ関数型言語</li>
  <li>Curry-Howard の証明支援系</li>
  <li>型と値がある</li>
  <li>Agda の文法については次のスライドから軽く説明する</li>
</ul>



</div>

<div class='slide'>
  <!-- _S9SLIDE_ -->
<h2 id="agda-での-gears-の記述whileloop">Agda での Gears の記述(whileLoop)</h2>
<ul>
  <li>Agda での CodeGear は通常の関数とは異なり、継続渡し (CPS : Continuation Passing Style) で記述された関数</li>
  <li>CPS の関数は引数として継続を受け取って継続に計算結果を渡す</li>
  <li><strong>名前 : 引数 → (Code : fa → t) → t</strong></li>
  <li><strong>t</strong> は継続</li>
  <li><strong>(Code : fa → t)</strong> は次の継続先</li>
  <li>DataGear は Agda での CodeGear に使われる引数
    <div class="language-AGDA highlighter-coderay"><div class="CodeRay">
  <div class="code"><pre>whileTest : {l : Level} {t : Set l} -&gt; (c10 : ℕ) 
                   → (Code : Env -&gt; t) -&gt; t
whileTest c10 next = next (record {varn = c10 ; vari = 0} )
</pre></div>
</div>
    </div>
  </li>
</ul>



</div>

<div class='slide'>
  <!-- _S9SLIDE_ -->
<h2 id="agda-での-gears-の記述whileloop-1">Agda での Gears の記述(whileLoop)</h2>
<ul>
  <li>関数の動作を条件で変えたいときはパターンマッチを行う</li>
  <li>whileLoop は varn が 0 より大きい間ループする
    <ul>
      <li>lt は Nat を2つ受け取って値の大小を比較
```AGDA
{-# TERMINATING #-}
whileLoop : {l : Level} {t : Set l} -&gt; Env 
          -&gt; (Code : Env -&gt; t) -&gt; t
whileLoop env next with lt 0 (varn env)
whileLoop env next | false = next env
whileLoop env next | true =
 whileLoop (record {varn = (varn env) - 1 
                  ; vari = (vari env) + 1}) next</li>
    </ul>
  </li>
</ul>

<p>lt : Nat → Nat → Bool</p>
<pre><code>
## Agda での DataGear
- **DataGear** は CodeGear の引数
- **データ型**と**レコード型**がある
- データ型は一つのデータ
```AGDA
data Nat : Set where
  zero : Nat
  suc  : Nat → Nat
</code></pre>
<ul>
  <li>レコード型は複数のデータをまとめる
    <div class="language-AGDA highlighter-coderay"><div class="CodeRay">
  <div class="code"><pre>record Env : Set where 
field
  varn : Nat
  vari : Nat
</pre></div>
</div>
    </div>
  </li>
</ul>



</div>

<div class='slide'>
  <!-- _S9SLIDE_ -->
<h2 id="agda-での証明">Agda での証明</h2>
<ul>
  <li>関数の型に証明すべき論理式</li>
  <li>関数自体にそれを満たす導出</li>
  <li>完成した関数は証明</li>
  <li><strong>{}</strong> は暗黙的(推論される)</li>
  <li>下のコードは Bool型の x と true の and を取ったものは x と等しいことの証明
    <ul>
      <li><strong>refl</strong> は <strong>x == x</strong> の左右の項が等しいことの証明
        <div class="language-AGDA highlighter-coderay"><div class="CodeRay">
  <div class="code"><pre>∧true : { x : Bool } →  x  ∧  true  ≡ x
∧true {x} with x
∧true {x} | false = refl
∧true {x} | true = refl
</pre></div>
</div>
        </div>
      </li>
    </ul>
  </li>
</ul>



</div>

<div class='slide'>
  <!-- _S9SLIDE_ -->
<h2 id="gears-をベースにした-hoarelogic-と証明全体">Gears をベースにした HoareLogic と証明(全体)</h2>
<ul>
  <li>Gears をベースにした while Program で実行できる
    <ul>
      <li>これは証明も持っている</li>
    </ul>
  </li>
  <li>whileループを任意の回数にするため<strong>c10</strong>は引数</li>
  <li>whileTest’ の継続に conversion1、その継続に whileLoop’ が来て最後の継続に vari が c10 と等しい
    <div class="language-AGDA highlighter-coderay"><div class="CodeRay">
  <div class="code"><pre>proofGears : {c10 :  Nat } → Set
proofGears {c10} = whileTest' {_} {_} {c10} (λ n p1 →  conversion1 n p1 
       (λ n1 p2 → whileLoop' n1 p2 (λ n2 →  ( vari n2 ≡ c10 )))) 
</pre></div>
</div>
    </div>
  </li>
</ul>



</div>

<div class='slide'>
  <!-- _S9SLIDE_ -->
<h2 id="gears-と-hoarelogic-をベースにした証明whiletest">Gears と HoareLogic をベースにした証明(whileTest)</h2>
<ul>
  <li>最初の Command なので PreCondition がない</li>
  <li>proof2は Post Condition が成り立つことの証明
    <ul>
      <li><strong><em>/\</em></strong> は pi1 と pi2 のフィールドをもつレコード型</li>
      <li>2つのものを引数に取り、両方が同時に成り立つことを示す</li>
    </ul>
  </li>
  <li>Gears での PostCondition は <strong>引数 → (Code : fa → PostCondition → t) → t</strong>
    <div class="language-AGDA highlighter-coderay"><div class="CodeRay">
  <div class="code"><pre>whileTest' : {l : Level} {t : Set l}  → {c10 :  Nat } → 
      (Code : (env : Env)  → 
          ((vari env) ≡ 0) /\ ((varn env) ≡ c10) → t) → t
hileTest' {_} {_} {c10} next = next env proof2
where
  env : Env
  env = record {vari = 0 ; varn = c10}
  proof2 : ((vari env) ≡ 0) /\ ((varn env) ≡ c10)      &lt;-- PostCondition
  proof2 = record {pi1 = refl ; pi2 = refl}
</pre></div>
</div>
    </div>
  </li>
</ul>



</div>

<div class='slide'>
  <!-- _S9SLIDE_ -->
<h2 id="gears-と-hoarelogic-をベースにした証明conversion">Gears と HoareLogic をベースにした証明(conversion)</h2>
<ul>
  <li>conversion は Condition から LoopInvaliant への変換を行う CodeGear
    <ul>
      <li>Condition の条件は Loop 内では厳しいのでゆるくする</li>
    </ul>
  </li>
  <li>proof4 は LoopInvaliant の証明</li>
  <li>Gears での HoareLogic の完全な記述は <strong>引数 → PreCondition → (Code : fa → PostCondition → t) → t</strong>
```AGDA
conversion1 : {l : Level} {t : Set l } → (env : Env) → {c10 :  Nat } → 
        ((vari env) ≡ 0) /\ ((varn env) ≡ c10)
        → (Code : (env1 : Env) → (varn env1 + vari env1 ≡ c10) → t) → t
conversion1 env {c10} p1 next = next env proof4
where
  proof4 : varn env + vari env ≡ c10</li>
</ul>

<pre><code>

##  Agdaでの証明(≡-Reasoning)
- Agda では証明の項を書き換える構文が用意されている
```AGDA
    proof4 : varn env + vari env ≡ c10
    proof4 = let open ≡-Reasoning  in
      begin
        varn env + vari env
      ≡⟨ cong ( λ n → n + vari env ) (pi2 p1 ) ⟩
        c10 + vari env
      ≡⟨ cong ( λ n → c10 + n ) (pi1 p1 ) ⟩
        c10 + 0
      ≡⟨ +-sym {c10} {0} ⟩
        c10

</code></pre>



</div>

<div class='slide'>
  <!-- _S9SLIDE_ -->
<h2 id="gears-と-hoarelogic-をベースにした証明全体">Gears と HoareLogic をベースにした証明(全体)</h2>
<ul>
  <li>最終状態で返ってくる i の値は c10 と一致する</li>
  <li>これにより証明が可能
    <div class="language-AGDA highlighter-coderay"><div class="CodeRay">
  <div class="code"><pre>  proofGears : {c10 :  Nat } → Set
  proofGears {c10} = whileTest' {_} {_} {c10} (λ n p1 →  conversion1 n p1 
                 (λ n1 p2 → whileLoop' n1 p2 (λ n2 →  ( vari n2 ≡ c10 )))) 
</pre></div>
</div>
    </div>
  </li>
</ul>



</div>

<div class='slide'>
  <!-- _S9SLIDE_ -->
<h2 id="まとめと今後の課題">まとめと今後の課題</h2>
<ul>
  <li>HoareLogic の while を使った例題を作成、証明を行った</li>
  <li>Gears を用いた HoareLogic ベースの検証方法を導入した
    <ul>
      <li>証明が引数として渡される記述のため証明とプログラムを一体化できた</li>
    </ul>
  </li>
  <li>今後の課題
    <ul>
      <li>RedBlackTree や SynchronizedQueue などのデータ構造の検証(HoareLogic ベースで)</li>
    </ul>
  </li>
</ul>



</div>

<div class='slide'>
  <!-- _S9SLIDE_ -->
<h2 id="agda-上での-hoarelogic">Agda 上での HoareLogic</h2>
<ul>
  <li>Agda での HoareLogic は初期のAgda の実装である Agda1(現在のものはAgda2)で実装されたものと
それを Agda2 に書き写したものが存在している。</li>
  <li>今回はAgda2側の HoareLogic で使うコマンド定義の一部と、コマンドの証明に使うルールを借りて Agda2上で HoareLogic を構築する</li>
</ul>



</div>

<div class='slide'>
  <!-- _S9SLIDE_ -->
<h2 id="hoarelogic-とは">HoareLogic とは</h2>
<ul>
  <li>Floyd-Hoare Logic (以下HoareLogic)は部分的な正当性を検証する</li>
  <li>プログラムは事前条件(Pre Condition)、事後条件(Post Condition)を持ち、条件がコマンドで更新され、事後条件になる</li>
  <li>事前、事後条件には変数や論理式、コマンドには代入や、繰り返し、条件分岐などがある。</li>
  <li>コマンドが正しく成り立つことを保証することで、このコマンドを用いて記述されたプログラムの部分的な正しさを検証できる</li>
</ul>



</div>

<div class='slide'>
  <!-- _S9SLIDE_ -->
<h2 id="hoarelogic-の理解">HoareLogic の理解</h2>
<ul>
  <li>HoareLogic 例として疑似コードを用意した</li>
  <li>このプログラムは変数iとnをもち、 n&gt;0 の間nの値を減らし、i の値を増やす</li>
  <li>n==0 のとき停止するため、終了時の変数の結果は i==10、n==0 になるはずである。</li>
  <li>次のスライドから Agda 上 HoareLogic を実装し、その上でこの whileProgram の検証を行う
    <div class="language-C highlighter-coderay"><div class="CodeRay">
  <div class="code"><pre> n = <span style="color:#00D">10</span>;
 i = <span style="color:#00D">0</span>;

 <span style="color:#080;font-weight:bold">while</span> (n&gt;<span style="color:#00D">0</span>)
 {
   i++;
   n--;
 }
</pre></div>
</div>
    </div>
  </li>
</ul>



</div>

<div class='slide'>
  <!-- _S9SLIDE_ -->
<h2 id="agda-上での-hoarelogic条件変数の定義">Agda 上での HoareLogic(条件、変数の定義)</h2>
<ul>
  <li><strong>Env</strong> は while Program で必要な変数をまとめたもの</li>
  <li>varn、vari はそれぞれ変数 n、 i</li>
  <li><strong>Cond</strong> は Pre、Post の Condition で Env を受け取って Bool 値(true か false)を返す
    <div class="language-AGDA highlighter-coderay"><div class="CodeRay">
  <div class="code"><pre> record Env : Set where
   field
     varn : Nat
     vari : Nat

 Cond : Set
 Cond = (Env → Bool) 
</pre></div>
</div>
    </div>
  </li>
</ul>



</div>

<div class='slide'>
  <!-- _S9SLIDE_ -->
<h2 id="agda-上での-hoarelogicコマンド定義">Agda 上での HoareLogic(コマンド定義)</h2>
<ul>
  <li><strong>Comm</strong> は Agda のデータ型で定義した HoareLogic のコマンド
    <ul>
      <li><strong>PComm</strong> は変数を代入のコマンド</li>
      <li><strong>Seq</strong> はコマンドの推移、 Command を実行して次の Command に移す</li>
      <li><strong>If</strong> は条件分岐のコマンド</li>
      <li><strong>while</strong> は繰り返しのコマンド</li>
    </ul>
  </li>
  <li>他にも何もしないコマンドやコマンドの停止などのコマンドもある</li>
  <li><strong>PrimComm</strong> は Env を受け取って Env を返す定義
    <div class="language-AGDA highlighter-coderay"><div class="CodeRay">
  <div class="code"><pre>   data Comm : Set where
     PComm : PrimComm → Comm
     Seq   : Comm → Comm → Comm
     If    : Cond → Comm → Comm → Comm
     While : Cond → Comm → Comm
       
   PrimComm : Set
   PrimComm = Env → Env
</pre></div>
</div>
    </div>
  </li>
</ul>



</div>

<div class='slide'>
  <!-- _S9SLIDE_ -->
<h2 id="agda-上での-hoarelogic実際のプログラムの記述">Agda 上での HoareLogic(実際のプログラムの記述)</h2>
<ul>
  <li>先程定義したコマンドを使って while Program を記述した
    <ul>
      <li>任意の自然数を引数に取る形になっているが<strong>c10 == 10</strong>ということにする</li>
    </ul>
  </li>
  <li><strong>$</strong> は <strong>()</strong> の糖衣で行頭から行末までを ( ) で囲う</li>
  <li>見やすさのため改行しているが 3~7 行は1行
    <div class="language-AGDA highlighter-coderay"><div class="CodeRay">
  <div class="code"><pre> program : ℕ → Comm
 program c10 = 
    Seq ( PComm (λ env → record env {varn = c10}))                -- n = 10;
    $ Seq ( PComm (λ env → record env {vari = 0}))                -- i = 0;
    $ While (λ env → lt zero (varn env ) )                         -- while (n&gt;0) {
      (Seq (PComm (λ env → record env {vari = ((vari env) + 1)} )) -- i++;
        $ PComm (λ env → record env {varn = ((varn env) - 1)} ))   -- n--;
</pre></div>
</div>
    </div>
  </li>
</ul>



</div>

<div class='slide'>
  <!-- _S9SLIDE_ -->
<h2 id="agda-上での-hoarelogicコマンドの保証13">Agda 上での HoareLogic(コマンドの保証)1/3</h2>
<ul>
  <li>保証の規則は HTProof にまとめられてる</li>
  <li><strong>PrimRule</strong> は <strong>PComm</strong> で行う代入を保証する</li>
  <li>3行目の pr の型 Axiom は PreCondition に PrimComm が適用されると PostCondition になることの記述
    <ul>
      <li><strong><em>⇒</em></strong> は pre, post の Condition をとって post の Condition が成り立つときに True を返す
        <div class="language-AGDA highlighter-coderay"><div class="CodeRay">
  <div class="code"><pre> data HTProof : Cond → Comm → Cond → Set where
 PrimRule : {bPre : Cond} → {pcm : PrimComm} → {bPost : Cond} →
              (pr : Axiom bPre pcm bPost) →
              HTProof bPre (PComm pcm) bPost
-- 次のスライドに続く
</pre></div>
</div>
        </div>
        <div class="language-AGDA highlighter-coderay"><div class="CodeRay">
  <div class="code"><pre> Axiom : Cond → PrimComm → Cond → Set
 Axiom pre comm post = ∀ (env : Env) →  (pre env) ⇒ ( post (comm env)) ≡ true
</pre></div>
</div>
        </div>
      </li>
    </ul>
  </li>
</ul>



</div>

<div class='slide'>
  <!-- _S9SLIDE_ -->
<h2 id="agda-上での-hoarelogicコマンド保証23">Agda 上での HoareLogic(コマンド保証)2/3</h2>
<ul>
  <li><strong>SeqRule</strong> は Command を推移させる Seq の保証</li>
  <li><strong>IfRule</strong> は If の Command が正しく動くことを保証
    <div class="language-AGDA highlighter-coderay"><div class="CodeRay">
  <div class="code"><pre>-- HTProof の続き
   SeqRule : {bPre : Cond} → {cm1 : Comm} → {bMid : Cond} →
           {cm2 : Comm} → {bPost : Cond} →
           HTProof bPre cm1 bMid →
           HTProof bMid cm2 bPost →
           HTProof bPre (Seq cm1 cm2) bPost
   IfRule : {cmThen : Comm} → {cmElse : Comm} →
          {bPre : Cond} → {bPost : Cond} →
          {b : Cond} →
          HTProof (bPre /\ b) cmThen bPost →
          HTProof (bPre /\ neg b) cmElse bPost →
          HTProof bPre (If b cmThen cmElse) bPost
</pre></div>
</div>
    </div>
  </li>
</ul>



</div>

<div class='slide'>
  <!-- _S9SLIDE_ -->
<h2 id="agda-上での-hoarelogicコマンド保証33">Agda 上での HoareLogic(コマンド保証)3/3</h2>
<ul>
  <li><strong>WeakeningRule</strong> は通常の Condition からループ不変条件(Loop Invaliant)に変換</li>
  <li>Tautology は Condition と不変条件が等しく成り立つ</li>
  <li><strong>WhileRule</strong> はループ不変条件が成り立つ間 Comm を繰り返す
    <div class="language-AGDA highlighter-coderay"><div class="CodeRay">
  <div class="code"><pre>-- HTProof の続き
   WeakeningRule : {bPre : Cond} → {bPre' : Cond} → {cm : Comm} →
               {bPost' : Cond} → {bPost : Cond} →
               Tautology bPre bPre' →
               HTProof bPre' cm bPost' →
               Tautology bPost' bPost →
               HTProof bPre cm bPost
   WhileRule : {cm : Comm} → {bInv : Cond} → {b : Cond} →
               HTProof (bInv /\ b) cm bInv →
               HTProof bInv (While b cm) (bInv /\ neg b)
</pre></div>
</div>
    </div>
    <div class="language-AGDA highlighter-coderay"><div class="CodeRay">
  <div class="code"><pre> Tautology : Cond → Cond → Set
 Tautology pre post = ∀ (env : Env) →  (pre env) ⇒ (post env) ≡ true
</pre></div>
</div>
    </div>
  </li>
</ul>



</div>

<div class='slide'>
  <!-- _S9SLIDE_ -->
<h2 id="agda-上での-hoarelogic証明">Agda 上での HoareLogic(証明)</h2>
<ul>
  <li><strong>proof1</strong> は while Program の証明</li>
  <li>HTProof に 初期状態と先程コマンドで記述した whileProgram である <strong>program</strong> と終了状態を渡す</li>
  <li>Condititon は initCond や termCond のようにそれぞれ定義する必要がある</li>
  <li>program に近い形で証明を記述できる
    <div class="language-AGDA highlighter-coderay"><div class="CodeRay">
  <div class="code"><pre> proof1 : (c10 : ℕ) → HTProof initCond (program c10 ) (termCond {c10})
 proof1 c10 =
       SeqRule {λ e → true} ( PrimRule (init-case {c10} ))
       $ SeqRule {λ e →  Equal (varn e) c10} ( PrimRule lemma1   )
       $ WeakeningRule {λ e → (Equal (varn e) c10) ∧ (Equal (vari e) 0)}  lemma2 (
          WhileRule {_} {λ e → Equal ((varn e) + (vari e)) c10}
          $ SeqRule (PrimRule {λ e →  whileInv e  ∧ lt zero (varn e) } lemma3 )
             $ PrimRule {whileInv'} {_} {whileInv}  lemma4 ) lemma5

 initCond : Cond
 initCond env = true

 termCond : {c10 : Nat} → Cond
 termCond {c10} env = Equal (vari env) c10
</pre></div>
</div>
    </div>
    <!-- * lemma1~5は rule それぞれの証明 -->
    <!-- program : Comm -->
    <!-- program =  -->
    <!--   Seq ( PComm (λ env → record env {varn = 10})) -->
    <!--   $ Seq ( PComm (λ env → record env {vari = 0})) -->
    <!--   $ While (λ env → lt zero (varn env ) ) -->
    <!--     (Seq (PComm (λ env → record env {vari = ((vari env) + 1)} )) -->
    <!--       $ PComm (λ env → record env {varn = ((varn env) - 1)} )) -->
  </li>
</ul>



</div>

<div class='slide'>
  <!-- _S9SLIDE_ -->
<h2 id="証明の一部lemma1">証明の一部(lemma1)</h2>
<ul>
  <li>PComm の証明である lemma1 だけ解説</li>
  <li>lemma1 は n に 10 を代入したあと、 i に 0 を代入するところ</li>
  <li>証明することは<strong>事前条件の n ≡ 10 が成り立つか</strong></li>
  <li>PreCondition が成り立つとき、Command を実行するとPostConditionが成り立つ
    <ul>
      <li>Axiom は x ⇒ y  ≡ true が成り立てば良かった</li>
      <li><strong><em>⇒</em></strong> は事後条件が成り立つかどうか</li>
      <li>impl⇒ は x ≡ true → y ≡ true の関数(Command)を受け取って x ⇒ y  ≡ true を返す関数</li>
    </ul>
  </li>
  <li><strong>≡-Reasoning</strong> は Agda での等式変形
    <div class="language-AGDA highlighter-coderay"><div class="CodeRay">
  <div class="code"><pre>  lemma1 : {c10 : Nat} → Axiom (stmt1Cond {c10}) 
         (λ env → record { varn = varn env ; vari = 0 }) (stmt2Cond {c10})
  lemma1 {c10} env = impl⇒ ( λ cond → let open ≡-Reasoning in
    begin
      (Equal (varn env) c10 ) ∧ true
    ≡⟨ ∧true ⟩
      Equal (varn env) c10 
    ≡⟨ cond ⟩
      true
    ∎ )
      
  stmt1Cond : {c10 : ℕ} → Cond
  stmt1Cond {c10} env = Equal (varn env) c10
   
  stmt2Cond : {c10 : ℕ} → Cond
  stmt2Cond {c10} env = (Equal (varn env) c10) ∧ (Equal (vari env) 0)
</pre></div>
</div>
    </div>

    <p><!-- lemma2 :  {c10 : Nat} → Tautology stmt2Cond whileInv --></p>

    <p><!-- lemma3 :   Axiom (λ e → whileInv e ∧ lt zero (varn e)) (λ env → record { varn = varn env ; vari = vari env + 1 }) whileInv' --></p>

    <p><!-- lemma4 :  {c10 : Nat} → Axiom whileInv' (λ env → record { varn = varn env - 1 ; vari = vari env }) whileInv --></p>

    <p><!-- lemma5 : {c10 : Nat} →  Tautology ((λ e → Equal (varn e + vari e) c10) and (neg (λ z → lt zero (varn z)))) termCond  --></p>
  </li>
</ul>


</div>


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