Mercurial > hg > Papers > 2019 > ryokka-sigss
diff slide/slide.html @ 11:17b7605a5deb
add figures, some slides
author | ryokka |
---|---|
date | Sun, 13 Jan 2019 23:42:16 +0900 |
parents | a87fec07fd78 |
children | e8fe28afe61e |
line wrap: on
line diff
--- a/slide/slide.html Sun Jan 13 03:51:48 2019 +0900 +++ b/slide/slide.html Sun Jan 13 23:42:16 2019 +0900 @@ -93,46 +93,37 @@ <!-- _S9SLIDE_ --> -<h2 id="研究目的">研究目的</h2> -<!-- 後回しだ!!!!! --> +<h2 id="研究背景">研究背景</h2> <ul> - <li>OS やアプリケーションなどの信頼性は重要な課題である。</li> - <li>プログラムの信頼性を上げるためには仕様を検証する必要がある。</li> - <li>使用の検証手法として Floyd-Hoare Logic (以下 HoareLogic) があり。 + <li>OS やアプリケーションなどの信頼性は重要な課題</li> + <li>信頼性を上げるために仕様を検証する必要</li> + <li>仕様検証の手法として Floyd-Hoare Logic (以下 HoareLogic) がある <ul> - <li>これはプログラムを Pre、Post Condition(事前、事後条件)、Command (関数)</li> - </ul> - </li> - <li>当研究室では信頼性の高い OS として GearsOS を開発している。</li> - <li>GearsOS では CodeGear、 DataGear という単位を用いてプログラムを記述する手法を提案している。</li> - <li>OS やアプリケーションなど、ソフトウェアの信頼性を高めることは重要である。</li> - <li>そのために当研究室では CodeGear 、 DataGear という単位を用いてプログラムを記述する手法を提案している。 - <ul> - <li>CodeGear は処理の単位で、処理が終わると次の CodeGear へと継続を行う。</li> - <li>このとき、 CodeGear は通常の関数呼び出しとは異なり、呼び出し前の環境を持たずに継続をする。</li> - <li>DataGear はデータの単位で、 CodeGear の入力、出力変数となる。</li> + <li>事前条件(PreCondition)が成り立つとき、関数(Command)を実行、それが停止したとき、事後条件(PostCondition)を満たす</li> </ul> </li> - <li>また、当研究室では Gears の単位を用いて作られる OS である、 GearsOS を開発している。</li> - <li> - <p>本研究では Gears OS の信頼性を高めるため、 Gears の単位を用いた検証手法を提案する。</p> - </li> - <li>当研究室では検証しやすい単位として <strong>CodeGear</strong>、<strong>DataGear</strong> という単位を用いてプログラムを記述する手法を提案している + <li>既存の言語ではあまり利用されていない(python の pyrefine ってコードチェッカーくらい…?)</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 に書き込む</li> + <li>Gear 間の接続処理はメタ計算として定義 <ul> - <li><strong>CodeGear</strong> とはプログラムを記述する際の処理の単位</li> - <li><strong>DataGear</strong> は CodeGear で扱うデータの単位</li> + <li>メタ計算部分に検証を埋め込むことで通常処理に手を加えずに検証</li> </ul> </li> - <li>これは関数型プログラミングに近い形になる</li> - <li>本研究では関数型言語であり、 <strong>証明支援系</strong> 言語でもある <strong>Agda</strong> を用いて仕様を検証することにしている</li> + <li>本研究では Gears OS の信頼性を高めるため、 Gears の単位を用いた HoareLogic ベースの検証手法を提案する</li> </ul> -<!-- * 動作するプログラムは高い信頼性を持っていてほしい --> -<!-- * そのために当研究室では CodeGear 、 DataGear を用いて記述する手法を提案している --> -<!-- * 処理の単位である CodeGear を継続しプログラムを記述していく --> -<!-- * メタ計算部分を切り替えることで CodeGear の処理を変更すること無くプログラムの検証をすることができる --> -<!-- * 継続に関数を呼び出すときの前提条件(pre-condition)を追加することができ、Hoare Logic を用いた証明を Agda で記述できると考えている --> -<!-- * 本研究では CodeGear, DataGear という単位を用いてプログラムを記述する手法の継続部分で Hoare Logic をベースにした証明手法を検討する --> +<p style="text-align:center;"><img src="./pic/cgdg-small.svg" alt="" width="75%" height="75%" /></p> @@ -154,6 +145,9 @@ </li> </ul> +<!-- ![cgdg](./pic/codeGear_dataGear.pdf){} --> +<p style="text-align:center;"><img src="./pic/cgdg.svg" alt="" width="30%" height="30%" /></p> + </div> @@ -165,7 +159,7 @@ <li>Gears の単位でプログラミングできる言語として CbC (Continuation based C) が存在</li> <li>現在の CbC では assert での検証ができる</li> <li>将来的には証明も扱えるようにしたいが現段階では未実装</li> - <li>そのため Gears の単位を定理証明支援系の言語である <strong>Agda</strong> で記述できるようにし、 Agda 上で証明を行う</li> + <li>そのため Gears の単位を定理証明支援系の言語である <strong>Agda</strong> で記述し、 Agda 上で証明</li> </ul> @@ -193,12 +187,10 @@ <li>データ型は代数的なデータ構造</li> <li><strong>data</strong> キーワードの後に、<strong>名前 : 型</strong>、 where 句</li> <li>次の行以降は<strong>コンストラクタ名 : 型</strong></li> - <li>型は<strong>-></strong>または<strong>→</strong>で繋げる事ができる</li> - <li><strong>PrimComm -> Comm</strong>は<strong>PrimComm</strong> を受け取り、 <strong>Comm</strong>を返す型</li> - <li>再帰的な定義も可能</li> -</ul> - -<div class="language-AGDA highlighter-coderay"><div class="CodeRay"> + <li>型は<strong>-></strong>または<strong>→</strong>で繋げる</li> + <li>例えば、型<strong>PrimComm -> Comm</strong>は<strong>PrimComm</strong> を受け取り<strong>Comm</strong>を返す型</li> + <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> data Comm : Set where <span class="line-numbers"><a href="#n2" name="n2">2</a></span> Skip : Comm <span class="line-numbers"><a href="#n3" name="n3">3</a></span> Abort : Comm @@ -208,7 +200,9 @@ <span class="line-numbers"><a href="#n7" name="n7">7</a></span> While : Cond -> Comm -> Comm </pre></div> </div> -</div> + </div> + </li> +</ul> <!-- - where は宣言した部分に束縛する --> @@ -221,20 +215,24 @@ <h2 id="agda-のレコード型">Agda のレコード型</h2> <ul> <li>C 言語での構造体に近い</li> - <li>複数のデータ型をまとめる</li> + <li>複数のデータをまとめる</li> <li>関数内で構築できる</li> <li>構築時は<strong>レコード名 {フィールド名 = 値}</strong></li> - <li>複数ある場合は <strong>{フィールド1 = 1 ; フィールド2 = 2}</strong>のように <strong>;</strong> を使って列挙</li> -</ul> - -<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> 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 : ℕ -<span class="line-numbers"><a href="#n4" name="n4">4</a></span> vari : ℕ + <li>複数ある場合は <strong>{フィールド1 = 1 ; フィールド2 = 2}</strong>のように <strong>;</strong> を使って列挙 + <ul> + <li>(varn,vari の型 <strong>ℕ</strong> は Agda 上の 自然数、 データ型で zero : ℕ と succ : ℕ -> ℕ で定義されてる) + <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>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 : ℕ +<span class="line-numbers"><a href="#n4" name="n4">4</a></span> vari : ℕ </pre></div> </div> -</div> + </div> + </li> + </ul> + </li> +</ul> @@ -247,17 +245,17 @@ <li>関数にも型が必要</li> <li>関数は <strong>関数名 = 値</strong></li> <li>関数ではパターンマッチがかける</li> - <li><strong>_</strong> は任意の引数</li> -</ul> - -<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> _-_ : ℕ → ℕ → ℕ -<span class="line-numbers"><a href="#n2" name="n2">2</a></span> x - zero = x -<span class="line-numbers"><a href="#n3" name="n3">3</a></span> zero - _ = zero -<span class="line-numbers"><a href="#n4" name="n4">4</a></span> (suc x) - (suc y) = x - y + <li><strong>_</strong> は任意の引数 + <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> _-_ : ℕ → ℕ → ℕ +<span class="line-numbers"><a href="#n2" name="n2">2</a></span> x - zero = x +<span class="line-numbers"><a href="#n3" name="n3">3</a></span> zero - _ = zero +<span class="line-numbers"><a href="#n4" name="n4">4</a></span> (suc x) - (suc y) = x - y </pre></div> </div> -</div> + </div> + </li> +</ul> @@ -271,16 +269,16 @@ <li>関数自体にそれを満たす導出</li> <li>完成した関数は証明</li> <li><strong>{}</strong> は暗黙的(推論される)</li> - <li>下のコードは自然数に 0 を足したとき値が変わらないことの証明</li> -</ul> - -<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>+zero : {y : ℕ} → 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 ( λ x → suc x ) ( +zero {y} ) + <li>下のコードは自然数に 0 を足したとき値が変わらないことの証明 + <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> +zero : { y : ℕ } → 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 ( λ x → suc x ) ( +zero {y} ) </pre></div> </div> -</div> + </div> + </li> +</ul> @@ -303,10 +301,8 @@ <!-- _S9SLIDE_ --> <h2 id="agda-での-hoarelogic-の理解">Agda での HoareLogic の理解</h2> <ul> - <li>HoareLogic を用いて次のようなプログラム(while Program)を検証した。</li> -</ul> - -<div class="language-C highlighter-coderay"><div class="CodeRay"> + <li>HoareLogic を用いて次のようなプログラム(while Program)を検証した。 + <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> @@ -317,8 +313,8 @@ <span class="line-numbers"><a href="#n8" name="n8">8</a></span> } </pre></div> </div> -</div> -<ul> + </div> + </li> <li>このプログラムは変数iとnをもち、 n>0 の間nの値を減らし、i の値を増やす</li> <li>n==0のとき停止するため、終了時の変数の結果はi==10、n==0 になるはずである。</li> </ul> @@ -347,10 +343,8 @@ <ul> <li>Env は while Program の変数である var n, i</li> <li><strong>PrimComm</strong> は代入時に使用される</li> - <li><strong>Cond</strong> は Condition で Env を受け取って Boolean の値を返す</li> -</ul> - -<div class="language-AGDA highlighter-coderay"><div class="CodeRay"> + <li><strong>Cond</strong> は Condition で Env を受け取って Boolean の値を返す + <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> 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 : ℕ @@ -363,7 +357,9 @@ <span class="line-numbers"><strong><a href="#n10" name="n10">10</a></strong></span> Cond = (Env → Bool) </pre></div> </div> -</div> + </div> + </li> +</ul> @@ -377,25 +373,25 @@ <ul> <li><strong>Skip</strong> は何も変更しない</li> <li><strong>PComm</strong> は変数を代入する</li> - <li><strong>Seq</strong> は Command を次の Command に移す</li> + <li><strong>Seq</strong> は Command を実行して次の Command に移す</li> <li><strong>If</strong> は Cond と2つの Comm を受け取り Cond の状態により実行する Comm を変える</li> - <li><strong>while</strong> は Cond と Comm を受け取り Cond の中身が真である間 Comm を繰り返す</li> + <li><strong>while</strong> は Cond と Comm を受け取り Cond の中身が真である間 Comm を繰り返す + <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>data Comm : Set where +<span class="line-numbers"><a href="#n2" name="n2">2</a></span> Skip : Comm +<span class="line-numbers"><a href="#n3" name="n3">3</a></span> Abort : Comm +<span class="line-numbers"><a href="#n4" name="n4">4</a></span> PComm : PrimComm -> Comm +<span class="line-numbers"><a href="#n5" name="n5">5</a></span> Seq : Comm -> Comm -> Comm +<span class="line-numbers"><a href="#n6" name="n6">6</a></span> If : Cond -> Comm -> Comm -> Comm +<span class="line-numbers"><a href="#n7" name="n7">7</a></span> While : Cond -> Comm -> Comm +</pre></div> +</div> + </div> + </li> </ul> </li> </ul> -<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> data Comm : Set where -<span class="line-numbers"><a href="#n2" name="n2">2</a></span> Skip : Comm -<span class="line-numbers"><a href="#n3" name="n3">3</a></span> Abort : Comm -<span class="line-numbers"><a href="#n4" name="n4">4</a></span> PComm : PrimComm -> Comm -<span class="line-numbers"><a href="#n5" name="n5">5</a></span> Seq : Comm -> Comm -> Comm -<span class="line-numbers"><a href="#n6" name="n6">6</a></span> If : Cond -> Comm -> Comm -> Comm -<span class="line-numbers"><a href="#n7" name="n7">7</a></span> While : Cond -> Comm -> Comm -</pre></div> -</div> -</div> - </div> @@ -404,10 +400,14 @@ <!-- _S9SLIDE_ --> <h2 id="agda-上での-hoarelogic実際のプログラムの記述">Agda 上での HoareLogic(実際のプログラムの記述)</h2> <ul> - <li>先程の Comm を使ってwhile Program を記述した。</li> -</ul> - -<div class="language-AGDA highlighter-coderay"><div class="CodeRay"> + <li>Command を使って while Program を記述した。</li> + <li><strong>$</strong> は <strong>()</strong> の糖衣で行頭から行末までを ( ) で囲う + <ul> + <li>見やすさのため改行しているため 3~7 行はまとまっている</li> + </ul> + </li> + <li>Seq は Comm を2つ取って次の Comm に移行する + <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> program : Comm <span class="line-numbers"><a href="#n2" name="n2">2</a></span> program = <span class="line-numbers"><a href="#n3" name="n3">3</a></span> Seq ( PComm (λ env → record env {varn = 10})) @@ -417,7 +417,9 @@ <span class="line-numbers"><a href="#n7" name="n7">7</a></span> $ PComm (λ env → record env {varn = ((varn env) - 1)} )) </pre></div> </div> -</div> + </div> + </li> +</ul> @@ -427,22 +429,35 @@ <!-- _S9SLIDE_ --> <h2 id="agda-上での-hoarelogicの理解">Agda 上での HoareLogicの理解</h2> <ul> - <li>証明規則は HTProof にまとめられてる</li> - <li><strong>PrimRule</strong> は代入を</li> -</ul> - -<div class="language-AGDA highlighter-coderay"><div class="CodeRay"> + <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 を返す関数</li> + </ul> + </li> + <li>SkipRule は PreCondition を変更しないことの保証</li> + <li>AbortRule は プログラムが停止するときのルール + <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> data HTProof : Cond -> Comm -> Cond -> Set where <span class="line-numbers"><a href="#n2" name="n2">2</a></span> PrimRule : {bPre : Cond} -> {pcm : PrimComm} -> {bPost : Cond} -> -<span class="line-numbers"><a href="#n3" name="n3">3</a></span> (pr : Axiom bPre pcm bPost) -> -<span class="line-numbers"><a href="#n4" name="n4">4</a></span> HTProof bPre (PComm pcm) bPost +<span class="line-numbers"><a href="#n3" name="n3">3</a></span> (pr : Axiom bPre pcm bPost) -> +<span class="line-numbers"><a href="#n4" name="n4">4</a></span> HTProof bPre (PComm pcm) bPost <span class="line-numbers"><a href="#n5" name="n5">5</a></span> SkipRule : (b : Cond) -> HTProof b Skip b <span class="line-numbers"><a href="#n6" name="n6">6</a></span> AbortRule : (bPre : Cond) -> (bPost : Cond) -> -<span class="line-numbers"><a href="#n7" name="n7">7</a></span> HTProof bPre Abort bPost +<span class="line-numbers"><a href="#n7" name="n7">7</a></span> HTProof bPre Abort bPost <span class="line-numbers"><a href="#n8" name="n8">8</a></span>-- 次のスライドに続く </pre></div> </div> + </div> + <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> Axiom : Cond -> PrimComm -> Cond -> Set +<span class="line-numbers"><a href="#n2" name="n2">2</a></span> Axiom pre comm post = ∀ (env : Env) → (pre env) ⇒ ( post (comm env)) ≡ true +</pre></div> </div> + </div> + </li> +</ul> @@ -452,10 +467,39 @@ <!-- _S9SLIDE_ --> <h2 id="agda-上での-hoarelogicの理解-1">Agda 上での HoareLogicの理解</h2> <ul> - <li></li> + <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><span class="line-numbers"> <a href="#n1" name="n1">1</a></span>-- HTProof の続き +<span class="line-numbers"> <a href="#n2" name="n2">2</a></span> SeqRule : {bPre : Cond} -> {cm1 : Comm} -> {bMid : Cond} -> +<span class="line-numbers"> <a href="#n3" name="n3">3</a></span> {cm2 : Comm} -> {bPost : Cond} -> +<span class="line-numbers"> <a href="#n4" name="n4">4</a></span> HTProof bPre cm1 bMid -> +<span class="line-numbers"> <a href="#n5" name="n5">5</a></span> HTProof bMid cm2 bPost -> +<span class="line-numbers"> <a href="#n6" name="n6">6</a></span> HTProof bPre (Seq cm1 cm2) bPost +<span class="line-numbers"> <a href="#n7" name="n7">7</a></span> IfRule : {cmThen : Comm} -> {cmElse : Comm} -> +<span class="line-numbers"> <a href="#n8" name="n8">8</a></span> {bPre : Cond} -> {bPost : Cond} -> +<span class="line-numbers"> <a href="#n9" name="n9">9</a></span> {b : Cond} -> +<span class="line-numbers"><strong><a href="#n10" name="n10">10</a></strong></span> HTProof (bPre /\ b) cmThen bPost -> +<span class="line-numbers"><a href="#n11" name="n11">11</a></span> HTProof (bPre /\ neg b) cmElse bPost -> +<span class="line-numbers"><a href="#n12" name="n12">12</a></span> HTProof bPre (If b cmThen cmElse) bPost +</pre></div> +</div> + </div> + </li> </ul> -<div class="language-AGDA highlighter-coderay"><div class="CodeRay"> + + +</div> + +<div class='slide'> + <!-- _S9SLIDE_ --> +<h2 id="agda-上での-hoarelogicの理解-2">Agda 上での HoareLogicの理解</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><span class="line-numbers"> <a href="#n1" name="n1">1</a></span>-- HTProof の続き <span class="line-numbers"> <a href="#n2" name="n2">2</a></span> WeakeningRule : {bPre : Cond} -> {bPre' : Cond} -> {cm : Comm} -> <span class="line-numbers"> <a href="#n3" name="n3">3</a></span> {bPost' : Cond} -> {bPost : Cond} -> @@ -463,23 +507,20 @@ <span class="line-numbers"> <a href="#n5" name="n5">5</a></span> HTProof bPre' cm bPost' -> <span class="line-numbers"> <a href="#n6" name="n6">6</a></span> Tautology bPost' bPost -> <span class="line-numbers"> <a href="#n7" name="n7">7</a></span> HTProof bPre cm bPost -<span class="line-numbers"> <a href="#n8" name="n8">8</a></span> SeqRule : {bPre : Cond} -> {cm1 : Comm} -> {bMid : Cond} -> -<span class="line-numbers"> <a href="#n9" name="n9">9</a></span> {cm2 : Comm} -> {bPost : Cond} -> -<span class="line-numbers"><strong><a href="#n10" name="n10">10</a></strong></span> HTProof bPre cm1 bMid -> -<span class="line-numbers"><a href="#n11" name="n11">11</a></span> HTProof bMid cm2 bPost -> -<span class="line-numbers"><a href="#n12" name="n12">12</a></span> HTProof bPre (Seq cm1 cm2) bPost -<span class="line-numbers"><a href="#n13" name="n13">13</a></span> IfRule : {cmThen : Comm} -> {cmElse : Comm} -> -<span class="line-numbers"><a href="#n14" name="n14">14</a></span> {bPre : Cond} -> {bPost : Cond} -> -<span class="line-numbers"><a href="#n15" name="n15">15</a></span> {b : Cond} -> -<span class="line-numbers"><a href="#n16" name="n16">16</a></span> HTProof (bPre /\ b) cmThen bPost -> -<span class="line-numbers"><a href="#n17" name="n17">17</a></span> HTProof (bPre /\ neg b) cmElse bPost -> -<span class="line-numbers"><a href="#n18" name="n18">18</a></span> HTProof bPre (If b cmThen cmElse) bPost -<span class="line-numbers"><a href="#n19" name="n19">19</a></span> WhileRule : {cm : Comm} -> {bInv : Cond} -> {b : Cond} -> -<span class="line-numbers"><strong><a href="#n20" name="n20">20</a></strong></span> HTProof (bInv /\ b) cm bInv -> -<span class="line-numbers"><a href="#n21" name="n21">21</a></span> HTProof bInv (While b cm) (bInv /\ neg b) +<span class="line-numbers"> <a href="#n8" name="n8">8</a></span> WhileRule : {cm : Comm} -> {bInv : Cond} -> {b : Cond} -> +<span class="line-numbers"> <a href="#n9" name="n9">9</a></span> HTProof (bInv /\ b) cm bInv -> +<span class="line-numbers"><strong><a href="#n10" name="n10">10</a></strong></span> 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><span class="line-numbers"><a href="#n1" name="n1">1</a></span> Tautology : Cond -> Cond -> Set +<span class="line-numbers"><a href="#n2" name="n2">2</a></span> Tautology pre post = ∀ (env : Env) → (pre env) ⇒ (post env) ≡ true +</pre></div> </div> + </div> + </li> +</ul> @@ -488,20 +529,75 @@ <div class='slide'> <!-- _S9SLIDE_ --> <h2 id="agda-上での-hoarelogic証明">Agda 上での HoareLogic(証明)</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> proof1 : HTProof initCond program termCond -<span class="line-numbers"><a href="#n2" name="n2">2</a></span> proof1 = -<span class="line-numbers"><a href="#n3" name="n3">3</a></span> SeqRule {λ e → true} ( PrimRule empty-case ) -<span class="line-numbers"><a href="#n4" name="n4">4</a></span> $ SeqRule {λ e → Equal (varn e) 10} ( PrimRule lemma1 ) -<span class="line-numbers"><a href="#n5" name="n5">5</a></span> $ WeakeningRule {λ e → (Equal (varn e) 10) ∧ (Equal (vari e) 0)} lemma2 ( -<span class="line-numbers"><a href="#n6" name="n6">6</a></span> WhileRule {_} {λ e → Equal ((varn e) + (vari e)) 10} -<span class="line-numbers"><a href="#n7" name="n7">7</a></span> $ SeqRule (PrimRule {λ e → whileInv e ∧ lt zero (varn e) } lemma3 ) -<span class="line-numbers"><a href="#n8" name="n8">8</a></span> $ PrimRule {whileInv'} {_} {whileInv} lemma4 ) lemma5 +<ul> + <li><strong>proof1</strong> は while Program の証明</li> + <li>HTProof に 初期状態とコマンドで書かれた <strong>program</strong> と終了状態を渡す</li> + <li>lemma1~5は rule それぞれの証明</li> + <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>proof1 : HTProof initCond program termCond +<span class="line-numbers"> <a href="#n2" name="n2">2</a></span>proof1 = +<span class="line-numbers"> <a href="#n3" name="n3">3</a></span> SeqRule {λ e → true} ( PrimRule empty-case ) +<span class="line-numbers"> <a href="#n4" name="n4">4</a></span> $ SeqRule {λ e → Equal (varn e) 10} ( PrimRule lemma1 ) +<span class="line-numbers"> <a href="#n5" name="n5">5</a></span> $ WeakeningRule {λ e → (Equal (varn e) 10) ∧ (Equal (vari e) 0)} lemma2 ( +<span class="line-numbers"> <a href="#n6" name="n6">6</a></span> WhileRule {_} {λ e → Equal ((varn e) + (vari e)) 10} +<span class="line-numbers"> <a href="#n7" name="n7">7</a></span> $ SeqRule (PrimRule {λ e → whileInv e ∧ lt zero (varn e) } lemma3 ) +<span class="line-numbers"> <a href="#n8" name="n8">8</a></span> $ PrimRule {whileInv'} {_} {whileInv} lemma4 ) lemma5 +<span class="line-numbers"> <a href="#n9" name="n9">9</a></span> +<span class="line-numbers"><strong><a href="#n10" name="n10">10</a></strong></span>initCond : Cond +<span class="line-numbers"><a href="#n11" name="n11">11</a></span>initCond env = true +<span class="line-numbers"><a href="#n12" name="n12">12</a></span> +<span class="line-numbers"><a href="#n13" name="n13">13</a></span>termCond : {c10 : ℕ} → Cond +<span class="line-numbers"><a href="#n14" name="n14">14</a></span>termCond {c10} env = Equal (vari env) c10 </pre></div> </div> + </div> + </li> +</ul> + +<p><!-- 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)} )) --></p> + + + </div> +<div class='slide'> + <!-- _S9SLIDE_ --> +<h2 id="証明の一部">証明の一部</h2> +<ul> + <li>型だけ載せる</li> + <li>基本的な証明方法は Condtition を変化させて次の Condition が成り立つように変形する</li> + <li>impl⇒ + <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> lemma1 : {c10 : ℕ} → Axiom (stmt1Cond {c10}) (λ env → record { varn = varn env ; vari = 0 }) (stmt2Cond {c10}) +<span class="line-numbers"> <a href="#n2" name="n2">2</a></span> lemma1 {c10} env = impl⇒ ( λ cond → let open ≡-Reasoning in +<span class="line-numbers"> <a href="#n3" name="n3">3</a></span> begin +<span class="line-numbers"> <a href="#n4" name="n4">4</a></span> (Equal (varn env) c10 ) ∧ true +<span class="line-numbers"> <a href="#n5" name="n5">5</a></span> ≡⟨ ∧true ⟩ +<span class="line-numbers"> <a href="#n6" name="n6">6</a></span> Equal (varn env) c10 +<span class="line-numbers"> <a href="#n7" name="n7">7</a></span> ≡⟨ cond ⟩ +<span class="line-numbers"> <a href="#n8" name="n8">8</a></span> true +<span class="line-numbers"> <a href="#n9" name="n9">9</a></span> ∎ ) +</pre></div> +</div> + </div> + + <p><!-- lemma2 : {c10 : ℕ} → 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 : ℕ} → Axiom whileInv' (λ env → record { varn = varn env - 1 ; vari = vari env }) whileInv --></p> + + <p><!-- lemma5 : {c10 : ℕ} → Tautology ((λ e → Equal (varn e + vari e) c10) and (neg (λ z → lt zero (varn z)))) termCond --></p> + </li> +</ul> + </div> @@ -515,7 +611,16 @@ <li><strong>名前 : 引数 -> (Code : fa -> t) -> t</strong></li> <li><strong>t</strong> は継続</li> <li><strong>(Code : fa -> t)</strong> は次の継続先</li> - <li>DataGear は Agda での CodeGear に使われる引数</li> + <li>DataGear は 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>_g-_ : {t : Set} → ℕ → ℕ → (Code : ℕ → t) → t +<span class="line-numbers"><a href="#n2" name="n2">2</a></span>x g- zero next = next x +<span class="line-numbers"><a href="#n3" name="n3">3</a></span>zero g- _ = next zero +<span class="line-numbers"><a href="#n4" name="n4">4</a></span>(suc x) g- (suc y) = next (x g- y) +</pre></div> +</div> + </div> + </li> </ul> @@ -527,21 +632,19 @@ <h2 id="gears-をベースにした-hoarelogic">Gears をベースにした HoareLogic</h2> <ul> <li>次に Gears をベースにした while Program をみる。</li> - <li>このプログラムは c10</li> -</ul> - -<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 : ℕ } → (Code : (env : Env) -> -<span class="line-numbers"><a href="#n2" name="n2">2</a></span> ((vari env) ≡ 0) /\ ((varn env) ≡ c10) -> t) -> t -<span class="line-numbers"><a href="#n3" name="n3">3</a></span> whileTest {_} {_} {c10} next = next env proof2 -<span class="line-numbers"><a href="#n4" name="n4">4</a></span> where -<span class="line-numbers"><a href="#n5" name="n5">5</a></span> env : Env -<span class="line-numbers"><a href="#n6" name="n6">6</a></span> env = record {vari = 0 ; varn = c10} -<span class="line-numbers"><a href="#n7" name="n7">7</a></span> proof2 : ((vari env) ≡ 0) /\ ((varn env) ≡ c10) -<span class="line-numbers"><a href="#n8" name="n8">8</a></span> proof2 = record {pi1 = refl ; pi2 = refl} + <li>このプログラムは自然数と継続先を受け取って t を返す + <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> {-# TERMINATING #-} +<span class="line-numbers"><a href="#n2" name="n2">2</a></span> whileLoop : {l : Level} {t : Set l} -> Env -> (Code : Env -> t) -> t +<span class="line-numbers"><a href="#n3" name="n3">3</a></span> whileLoop env next with lt 0 (varn env) +<span class="line-numbers"><a href="#n4" name="n4">4</a></span> whileLoop env next | false = next env +<span class="line-numbers"><a href="#n5" name="n5">5</a></span> whileLoop env next | true = +<span class="line-numbers"><a href="#n6" name="n6">6</a></span> whileLoop (record {varn = (varn env) - 1 ; vari = (vari env) + 1}) next </pre></div> </div> -</div> + </div> + </li> +</ul> @@ -551,15 +654,16 @@ <!-- _S9SLIDE_ --> <h2 id="gears-と-hoarelogic-をベースにした証明">Gears と HoareLogic をベースにした証明</h2> <ul> - <li>ここでは</li> -</ul> - -<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> proofGears : {c10 : ℕ } → Set -<span class="line-numbers"><a href="#n2" name="n2">2</a></span> proofGears {c10} = whileTest {_} {_} {c10} (λ n p1 → conversion1 n p1 (λ n1 p2 → whileLoop' n1 p2 (λ n2 → ( vari n2 ≡ c10 )))) + <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> proofGears : {c10 : ℕ } → Set +<span class="line-numbers"><a href="#n2" name="n2">2</a></span> proofGears {c10} = whileTest' {_} {_} {c10} (λ n p1 → conversion1 n p1 +<span class="line-numbers"><a href="#n3" name="n3">3</a></span> (λ n1 p2 → whileLoop' n1 p2 (λ n2 → ( vari n2 ≡ c10 )))) </pre></div> </div> -</div> + </div> + </li> +</ul> <p><–! [論文目次]