Mercurial > hg > Papers > 2019 > ryokka-sigss
diff slide/slide.html @ 17:61117df82f51 default tip
fix
author | ryokka |
---|---|
date | Wed, 16 Jan 2019 12:42:49 +0900 |
parents | 07e1ccdfd844 |
children |
line wrap: on
line diff
--- a/slide/slide.html Wed Jan 16 03:19:15 2019 +0900 +++ b/slide/slide.html Wed Jan 16 12:42:49 2019 +0900 @@ -78,7 +78,7 @@ <td> <div align="left"> 外間政尊 , 河野真治 - 琉球大学 : 並列信頼研究室 + - 琉球大学 : 並列信頼研究室 <hr style="color:#ffcc00;background-color:#ffcc00;text-align:left;border:none;width:100%;height:0.2em;"> </div> </td> @@ -102,7 +102,7 @@ <li>事前条件(Pre Condition)が成り立つとき、関数(Command)を実行、それが停止したとき、事後条件(Post Condition)を満たす</li> </ul> </li> - <li>OS の検証などで使われているが、実装の記述の他に関数型の記述が必要となる</li> + <li>OS の検証などで使われているが、実装の記述の他に実装に対応する証明が必要となる</li> <li>HoareLogic の単位である代入や、WhileLoop に対応する分解が煩雑</li> </ul> @@ -119,7 +119,7 @@ <li>この単位を用いて信頼性の高い OS として GearsOS を開発している</li> <li>Gears OS の信頼性を高めるため、 Gears の単位を用いた HoareLogic ベースの検証手法を提案する</li> <li>CodeGear は CbC により、C と同等の速度で実行可能かつ Agda の継続記述にもなっている</li> - <li>変換を必要とせずに HoareLogic による証明をメタ計算として記述できる</li> + <li>証明への変換を必要とせずに HoareLogic による証明をメタ計算として記述できるようになった</li> </ul> @@ -131,7 +131,7 @@ <h2 id="gears-について">Gears について</h2> <ul> <li><strong>Gears</strong> は当研究室で提案しているプログラム記述手法</li> - <li>計算の単位を <strong>CodeGear</strong> 、データの単位を <strong>DataGear</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> @@ -158,8 +158,8 @@ <li>データ型は一つのデータ <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> <div class="code"><pre>data Nat : Set where -zero : Nat -suc : Nat → Nat + zero : Nat + suc : Nat → Nat </pre></div> </div> </div> @@ -167,9 +167,9 @@ <li>レコード型は複数のデータをまとめる <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> <div class="code"><pre>record Env : Set where -field - varn : Nat - vari : Nat + field + varn : Nat + vari : Nat </pre></div> </div> </div> @@ -187,14 +187,14 @@ <li>Agda での CodeGear は継続渡し (CPS : Continuation Passing Style) で記述された関数</li> <li><strong>{}</strong> は暗黙的(推論される)</li> <li>継続渡しの関数は引数として継続を受け取って継続に計算結果を渡す</li> - <li>CodeGear の型は<strong>名前 : 引数 → (Code : fa → t) → t</strong></li> + <li>CodeGear の型は<strong>引数 → (Code : fa → t) → t</strong></li> <li><strong>t</strong> は継続(最終的に返すもの)</li> <li><strong>(Code : fa → t)</strong> は次の継続先 <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> <div class="code"><pre>whileTest : {t : Set} → (c10 : Nat) - → (Code : Env → t) → t + → (Code : Env → t) → t whileTest c10 next = next (record {varn = c10 - ; vari = 0} ) + ; vari = 0} ) </pre></div> </div> </div> @@ -242,10 +242,12 @@ <!-- _S9SLIDE_ --> <h2 id="agda-での証明">Agda での証明</h2> <ul> - <li>証明の見た目関数と同じ</li> - <li>関数との違いは<strong>型が証明すべき論理式</strong>で<strong>関数自体がそれを満たす導出</strong></li> - <li><strong>refl</strong> は <strong>x == x</strong> で左右の項が等しいことの証明</li> - <li>変換で使っている <strong>cong</strong> は 関数と x ≡ y 受け取って両辺に関数を適応しても等しいことが変わらないことの証明</li> + <li>関数との違いは<strong>型が証明すべき論理式</strong>で<strong>関数自体がそれを満たす導出</strong> + <ul> + <li><strong>refl</strong> は <strong>x == x</strong> で左右の項が等しいことの証明</li> + <li><strong>cong</strong> は 関数と x ≡ y 受け取って、x ≡ y の両辺に関数を適応しても等しいことが変わらないことの証明</li> + </ul> + </li> <li><strong>+zero</strong> は任意の自然数の右から zero を足しても元の数と等しいことの証明 <ul> <li><strong>y = zero</strong> のときは <strong>zero ≡ zero</strong> のため refl</li> @@ -334,8 +336,8 @@ <li>証明の例で使用した<strong>+zero</strong>は<strong>y + zero ≡ y</strong></li> <li>これを使いたいが今回は<strong>y + zero ≡ y</strong></li> <li>Agda の StandartLibrary にある sym を用いて <strong>+zero</strong> を <strong>y + zero ≡ y</strong> として適応することで証明ができる -```AGDA -– +zero : { y : Nat } → y + zero ≡ y + <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> + <div class="code"><pre>-- +zero : { y : Nat } → y + zero ≡ y +-sym {zero} {suc y} = let open ≡-Reasoning in begin zero + suc y @@ -343,29 +345,43 @@ suc y ≡⟨ sym +zero ⟩ suc y + zero - ∎</li> + ∎ +sym : Symmetric {A = A} _≡_ +sym refl = refl +</pre></div> +</div> + </div> + </li> </ul> -<p>sym : Symmetric {A = A} <em>≡</em> -sym refl = refl</p> -<pre><code> -## HoareLogicをベースとした Gears での検証手法 -- 今回 HoareLogic で証明する例の疑似コードを用意した -- このプログラムは変数iとnをもち、 n>0 の間nの値を減らし、i の値を増やす -- n==0 のとき停止するため、終了時の変数の結果は i==10、n==0 になるはずである。 -```C - n = 10; - i = 0; -</code></pre> -<div class="language-c highlighter-coderay"><div class="CodeRay"> - <div class="code"><pre> <span style="color:#080;font-weight:bold">while</span> (n><span style="color:#00D">0</span>) - { - i++; - n--; - } + + +</div> + +<div class='slide'> + <!-- _S9SLIDE_ --> +<h2 id="hoarelogicをベースとした-gears-での検証手法">HoareLogicをベースとした Gears での検証手法</h2> +<ul> + <li>今回 HoareLogic で証明する次のようなコードを検証した</li> + <li>このプログラムは変数iとnをもち、 n>0 の間nの値を減らし、i の値を増やす</li> + <li>n==0 のとき停止するため、終了時の変数の結果は i==10、n==0 になるはずである。 + <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>; </pre></div> </div> + </div> + <div class="language-c highlighter-coderay"><div class="CodeRay"> + <div class="code"><pre> <span style="color:#080;font-weight:bold">while</span> (n><span style="color:#00D">0</span>) + { + i++; + n--; + } +</pre></div> </div> + </div> + </li> +</ul> @@ -441,14 +457,14 @@ <li>proof2は Post Condition が成り立つことの証明 <ul> <li><strong><em>/\</em></strong> は pi1 と pi2 のフィールドをもつレコード型</li> - <li>2つのものを引数に取り、両方が同時に成り立つことを表している</li> + <li>これは2つのものを引数に取り、両方が同時に成り立つことを表している</li> <li><strong>refl</strong> は <strong>x == x</strong> で左右の項が等しいことの証明</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 : {t : Set} → (c10 : Nat) → (Code : Env → t) → t -whileTest' : {l : Level} {t : Set l} → {c10 : Nat } → +whileTest' : {t : Set} → {c10 : Nat } → (Code : (env : Env) → ((vari env) ≡ 0) /\ ((varn env) ≡ c10) → t) → t whileTest' {_} {_} {c10} next = next env proof2 @@ -479,7 +495,7 @@ <li>proof4 は LoopInvaliant の証明</li> <li>Gears での HoareLogic の完全な記述は <strong>引数 → PreCondition → (Code : fa → PostCondition → t) → t</strong> <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> - <div class="code"><pre>conversion1 : {l : Level} {t : Set l } → (env : Env) → {c10 : Nat } → + <div class="code"><pre>conversion1 : {t : Set} → (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 @@ -552,7 +568,7 @@ <h2 id="gears-と-hoarelogic-をベースにした証明全体">Gears と HoareLogic をベースにした証明(全体)</h2> <ul> <li>最終状態で返ってくる i の値は c10 と一致する</li> - <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 @@ -589,12 +605,53 @@ <div class='slide'> <!-- _S9SLIDE_ --> -<h2 id="発表終了">発表終了</h2> +<h2 id="agda-上での-hoarelogic-記述">Agda 上での HoareLogic 記述</h2> <ul> - <li>ご清聴ありがとうございました。</li> + <li>Agda で構築した HoareLogic での whileProgram と Gears での whileProgram を見た目で比較</li> + <li>この他に証明にコマンド、コマンドの証明の定義を記述する必要がある + <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> + <div class="code"><pre>-- HoareLogic でのwhileProgram +program : ℕ → Comm +program c10 = + Seq ( PComm (λ env → record env {varn = c10})) + $ 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)} )) +-- コマンドの証明部分 +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 +</pre></div> +</div> + </div> + </li> </ul> + +</div> + +<div class='slide'> + <!-- _S9SLIDE_ --> +<h2 id="gears-での-hoarelogic-記述">Gears での HoareLogic 記述</h2> +<ul> + <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>