Mercurial > hg > Papers > 2019 > ryokka-sigss
view 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 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="外間政尊 , 河野真治" > <!-- 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"> 外間政尊 , 河野真治 - 琉球大学 : 並列信頼研究室 <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="os-の検証技術としての-hoarelogic-の問題点">OS の検証技術としての HoareLogic の問題点</h2> <ul> <li>OS やアプリケーションなどの信頼性は重要な課題</li> <li>信頼性を上げるために仕様を検証する必要</li> <li>仕様検証の手法として Floyd-Hoare Logic (以下 HoareLogic) がある <ul> <li>事前条件(Pre Condition)が成り立つとき、関数(Command)を実行、それが停止したとき、事後条件(Post Condition)を満たす</li> </ul> </li> <li>OS の検証などで使われているが、実装の記述の他に実装に対応する証明が必要となる</li> <li>HoareLogic の単位である代入や、WhileLoop に対応する分解が煩雑</li> </ul> </div> <div class='slide'> <!-- _S9SLIDE_ --> <h2 id="gearsos-によるメタ計算としての-hoarelogic-の導入">GearsOS によるメタ計算としての HoareLogic の導入</h2> <ul> <li>当研究室では 処理の単位を <strong>CodeGear</strong>、データの単位を <strong>DataGear</strong> としてプログラムを記述する手法を提案</li> <li>CodeGear は Input DataGear を受け取り、処理を行って Output DataGear に書き込む</li> <li>この単位を用いて信頼性の高い OS として GearsOS を開発している</li> <li>Gears OS の信頼性を高めるため、 Gears の単位を用いた HoareLogic ベースの検証手法を提案する</li> <li>CodeGear は CbC により、C と同等の速度で実行可能かつ Agda の継続記述にもなっている</li> <li>証明への変換を必要とせずに 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="agda-での-datagear">Agda での DataGear</h2> <ul> <li><strong>DataGear</strong> は CodeGear でつかわれる引数</li> <li><strong>データ型</strong>と<strong>レコード型</strong>がある</li> <li>データ型は一つのデータ <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> <div class="code"><pre>data Nat : Set where zero : Nat suc : Nat → Nat </pre></div> </div> </div> </li> <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-での-gears-の記述whiletest">Agda での Gears の記述(whileTest)</h2> <ul> <li>Agda での CodeGear は継続渡し (CPS : Continuation Passing Style) で記述された関数</li> <li><strong>{}</strong> は暗黙的(推論される)</li> <li>継続渡しの関数は引数として継続を受け取って継続に計算結果を渡す</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 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">Agda での Gears の記述(whileLoop)</h2> <ul> <li>関数の動作を条件で変えたいときはパターンマッチを行う</li> <li>whileLoop は varn が 0 より大きい間ループする</li> <li><strong>lt</strong> は Nat を2つ受け取って値の大小を比較する関数 <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> <div class="code"><pre>whileLoop : {t : Set} → Env → (Code : Env → t) → 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 </pre></div> </div> </div> <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> <div class="code"><pre>lt : Nat → Nat → Bool lt x y with (suc x ) ≤? y lt x y | yes p = true lt x y | no ¬p = false </pre></div> </div> </div> </li> </ul> </div> <div class='slide'> <!-- _S9SLIDE_ --> <h2 id="agda-での証明">Agda での証明</h2> <ul> <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> <li><strong>y = suc y</strong> のときは cong を使い y の数を減らして再帰的に<strong>+zero</strong>を行っている</li> <li>y の数を減らしても大丈夫なことを cong の関数として受け取った数を suc する関数で保証している <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> <div class="code"><pre>+zero : { y : Nat } → y + zero ≡ y +zero {zero} = refl +zero {suc y} = cong ( λ x → suc x ) ( +zero {y} ) </pre></div> </div> </div> </li> </ul> </li> </ul> </div> <div class='slide'> <!-- _S9SLIDE_ --> <h2 id="agda-での項変換による証明-13">Agda での項変換による証明 1/3</h2> <ul> <li>次は<strong>x + y ≡ y + x</strong> の証明 <strong>+-sym</strong></li> <li>項変換の例として zero, suc y のパターンをみる</li> <li><strong>zero + suc y</strong>を変換して<strong>suc y + zero</strong>にする</li> <li>begin の下の行に変形したい式を記述</li> <li><strong>≡⟨ ⟩</strong> に変形規則、その次の行に変換した結果、 <strong>∎</strong> が項変換終了</li> <li>{ }0, { }1 は ? で置いたあとコンパイルを通すと Agda が示してくれる <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> <div class="code"><pre>+-sym : { x y : Nat } → x + y ≡ y + x +-sym {zero} {zero} = refl +-sym {zero} {suc y} = let open ≡-Reasoning in begin zero + suc y ≡⟨ { }0 ⟩ { }1 ∎ ---------------------- ?0 : zero + suc y ≡ suc y + zero ?1 : Nat </pre></div> </div> </div> </li> </ul> </div> <div class='slide'> <!-- _S9SLIDE_ --> <h2 id="agda-での証明項変換-23">Agda での証明(項変換) 2/3</h2> <ul> <li>はじめの変換規則は何も書かずに簡約</li> <li>次に右から zero を足しても等しくなる証明規則を使いたい <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> <div class="code"><pre>+-sym {zero} {suc y} = let open ≡-Reasoning in begin zero + suc y ≡⟨⟩ suc y ≡⟨ { }0 ⟩ { }1 ∎ ---------------------- ?0 : suc y ≡ suc y + zero ?1 : Nat </pre></div> </div> </div> </li> </ul> </div> <div class='slide'> <!-- _S9SLIDE_ --> <h2 id="agda-での証明項変換-33">Agda での証明(項変換) 3/3</h2> <ul> <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> として適応することで証明ができる <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 ≡⟨⟩ suc y ≡⟨ sym +zero ⟩ suc y + zero ∎ sym : Symmetric {A = A} _≡_ sym refl = refl </pre></div> </div> </div> </li> </ul> </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> </div> <div class='slide'> <!-- _S9SLIDE_ --> <h2 id="gears-をベースにしたプログラム">Gears をベースにしたプログラム</h2> <ul> <li>test は whileTest と whileLoop を使った Gears のプログラム</li> <li>whileTest の継続先にDataGear を受け取って whileLoop に渡す <ul> <li><strong>(λ 引数 → )</strong>は無名関数で引数を受け取って継続する</li> </ul> </li> <li>説明のため whileTest と whileLoop の型を載せておく <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> <div class="code"><pre>test : Env test = whileTest 10 (λ env → whileLoop env (λ env1 → env1)) </pre></div> </div> </div> <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> <div class="code"><pre>whileTest : {t : Set} → (c10 : Nat) → (Code : Env → t) → t </pre></div> </div> </div> <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> <div class="code"><pre>whileLoop : {t : Set} → Env → (Code : Env → t) → t </pre></div> </div> </div> </li> </ul> </div> <div class='slide'> <!-- _S9SLIDE_ --> <h2 id="gears-をベースにした-hoarelogic-と証明全体">Gears をベースにした HoareLogic と証明(全体)</h2> <ul> <li>proofGears は HoareLogic をベースとした証明 <ul> <li>先程のプログラムと違い、引数として証明も持っている</li> </ul> </li> <li>whileTest’ の継続に conversion1、その継続に whileLoop’ が来て最後の継続に vari が c10 と等しい <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> <div class="code"><pre>-- test = whileTest 10 (λ env → whileLoop env (λ env1 → env1)) 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> <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' : {t : Set} → {c10 : Nat } → (Code : (env : Env) → ((vari env) ≡ 0) /\ ((varn env) ≡ c10) → t) → t whileTest' {_} {_} {c10} next = next env proof2 where env : Env env = record {vari = 0 ; varn = c10} proof2 : ((vari env) ≡ 0) /\ ((varn env) ≡ c10) 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> <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> <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 where proof4 : varn env + vari env ≡ c10 </pre></div> </div> </div> </li> </ul> </div> <div class='slide'> <!-- _S9SLIDE_ --> <h2 id="hoarelogic-の証明">HoareLogic の証明</h2> <ul> <li>HoareLogic の証明では基本的に項の書き換えを行って証明している</li> <li>proof4 の証明部分では論理式の<strong>varn env + vari env</strong> を 書き換えて <strong>c10</strong> に変換している</li> <li>変換で使っている <strong>cong</strong> は 関数と x ≡ y 受け取って両辺に関数を適応しても等しいことが変わらないことの証明</li> <li>変換後の式を次の行に書いて変換を続ける <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> <div class="code"><pre>-- precond : ((vari env) ≡ 0) /\ ((varn env) ≡ c10) conversion1 env {c10} precond next = next env proof4 where proof4 : varn env + vari env ≡ c10 proof4 = let open ≡-Reasoning in begin varn env + vari env ≡⟨ cong ( λ n → n + vari env ) (pi2 precond ) ⟩ c10 + vari env ≡⟨ cong ( λ n → c10 + n ) (pi1 precond ) ⟩ c10 + 0 ≡⟨ +-sym {c10} {0} ⟩ c10 ∎ -- +-sym : { x y : Nat } → x + y ≡ y + x </pre></div> </div> </div> </li> </ul> </div> <div class='slide'> <!-- _S9SLIDE_ --> <h2 id="gears-と-hoarelogic-をベースにした証明whileloop">Gears と HoareLogic をベースにした証明(whileLoop)</h2> <ul> <li>whileLoop も whileTest と同様に PreCondition が CodeGear に入りそれに対する証明が記述されている <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> <div class="code"><pre>-- whileLoop : {t : Set} → Env → (Code : Env → t) → t whileLoop' : {t : Set} → (env : Env) → {c10 : Nat } → ((varn env) + (vari env) ≡ c10) → (Code : Env → t) → t </pre></div> </div> </div> </li> </ul> </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>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 での 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> </div><!-- presentation --> </body> </html>