Mercurial > hg > Papers > 2020 > ryokka-master
view slide/slide.html @ 16:ad04e3d3c747
create poster-mm
author | ryokka |
---|---|
date | Fri, 14 Feb 2020 20:55:37 +0900 |
parents | 19ab6b8055ea |
children |
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/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">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 - 伝えたいものをはっきり - 成果はどこ? - Hoare Logic の説明で - 今までの Hoare Logic でできなかったことをできるようになった - 従来の Hoare Logic は Command ベースでしかかけなかったけど自由に書けるようになった - Hoare Logic を主眼に - HoareLogic - hoare logic の説明 - while program - 使う Agda のイントロ - and と lambda - でーた分け? - Hoare logic と agda - while program - hoare logic の while program - hoare logic の検証 - htproof - htproof での while program - 検証 - cbc と hoare logic - cbc での hoare logic 記述 - cbc での while program - 内訳(関数の話とか) - cbc での while program の検証 - 記述の比較 - cbc での soundness - まとめ --> <!-- _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> </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> <!-- ## 証明の基礎 --> <!-- - A は論理式を表す変数、もしくは型Aという集合 --> <!-- - 論理式は変数と論理演算子で表される --> <!-- - 変数や演算子は構文要素 --> <!-- ``` --> <!-- A → B --> <!-- ``` --> <!-- - A → B は 「A ならば B」 --> <!-- - 関数としてみると A を受け取って B を返す関数 --> <!-- - A を仮定したとき B が証明される --> <!-- <\!-- ``` -\-> --> <!-- <\!-- A -\-> --> <!-- <\!-- --------- -\-> --> <!-- <\!-- B -\-> --> <!-- <\!-- ``` -\-> --> <!-- ## 関数適用による証明 --> <!-- - --> <!-- ``` --> <!-- λ x → y --> <!-- ``` --> <!-- - x は変数 y は項 --> <!-- - x は関数の引数と同じ扱い --> <!-- - 項には型が対応し、再帰的に定義される --> <!-- ``` --> <!-- x : A --> <!-- ``` --> <!-- - x という項が型A を持つことを表す --> <!-- x : A かつ y : B のとき --> <!-- ``` --> <!-- λ x → y : A → B --> <!-- ``` --> <!-- となる --> </div> <div class='slide'> <!-- _S9SLIDE_ --> <h2 id="agda">Agda</h2> <ul> <li>Agda は関数型言語 <div class="language-AGAD highlighter-coderay"><div class="CodeRay"> <div class="code"><pre><span class="line-numbers"><a href="#n1" name="n1">1</a></span> name : type <span class="line-numbers"><a href="#n2" name="n2">2</a></span> name = value </pre></div> </div> </div> </li> <li>関数には型と定義を与える <ul> <li>型は <strong>:</strong> で、 値は <strong>=</strong> で与える</li> </ul> </li> <li>仮定なしに使えるのは Set のみ</li> <li>構成要素としては以下の3種類 <ol> <li>関数 <ul> <li>型は A → B</li> <li>値は λ x → y</li> </ul> </li> <li>record</li> <li>data</li> </ol> </li> <li>つぎは record と data について</li> </ul> </div> <div class='slide'> <!-- _S9SLIDE_ --> <h2 id="agda-の-record-とその例-">Agda の record とその例 ∧</h2> <ul> <li>2つのものが同時に存在すること</li> <li>A ∧ B が成り立っていれば (pi1 A ∧ B) → A、 (pi2 A ∧ B) → B</li> <li>Agda ではこのような同時に存在する型を <strong>record</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> record _∧_ (A B : Set) : Set <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> pi1 : A <span class="line-numbers"><a href="#n4" name="n4">4</a></span> pi2 : B </pre></div> </div> </div> </li> <li><em>∧</em> は中間記法、変数が入る位置を _ で示せる</li> <li>実際の構築は x : A かつ y : B のとき <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 {pi1 = x ; pi2 = y} </pre></div> </div> </div> </li> <li>のように記述する</li> <li>C での構造体のようなもの</li> </ul> </div> <div class='slide'> <!-- _S9SLIDE_ --> <h2 id="agda-の-data-とその例-sum">Agda の data とその例 Sum</h2> <ul> <li>一つでも存在すること</li> <li>A ∨ B が成り立っているとき A → A ∨ B、 B → A ∨ B</li> <li>どちらかが成り立つ型を <strong>data</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> data _∨_ (A B : Set) : Set where <span class="line-numbers"><a href="#n2" name="n2">2</a></span> p1 : A → A ∨ B <span class="line-numbers"><a href="#n3" name="n3">3</a></span> p2 : B → A ∨ B </pre></div> </div> </div> </li> <li>のように記述できる</li> <li>C での union のようなもの</li> <li> <p>p1、 p2 は case 文みたいな</p> </li> <li>次は Hoare Logic</li> </ul> </div> <div class='slide'> <!-- _S9SLIDE_ --> <h2 id="hoare-logic">Hoare Logic</h2> <ul> <li>Hoare Logic はプログラム検証の手法</li> <li>事前条件(P)が成り立つとき、コマンド(C)を実行すると事後条件(Q)が成り立つ <ul> <li><strong>{P} C {Q}</strong> の形で表される</li> <li>コマンドが制限されてる</li> </ul> </li> <li>今回は以下のような while program を検証する</li> <li>n = 10 となっているが検証では n は任意の自然数 <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><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> </li> <li>次は Agda の Hoare Logic で while program をみる</li> </ul> </div> <div class='slide'> <!-- _S9SLIDE_ --> <h2 id="agda-での-hoare-logic">Agda での Hoare Logic</h2> <ul> <li>Hoare Logic のプログラムは Command で構成される</li> <li>Comm は data で記述されたコマンド</li> <li>このコマンドを使って while program を構築する <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> </div> <div class='slide'> <!-- _S9SLIDE_ --> <h2 id="hoare-logic-での-while-program">Hoare Logic での while program</h2> <ul> <li>C の 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> <span class="line-numbers"><a href="#n4" name="n4">4</a></span> <span style="color:#080;font-weight:bold">while</span> (n><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> </li> <li>Hoare Logic での while program <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 c10 = <span class="line-numbers"><a href="#n3" name="n3">3</a></span> Seq ( PComm (λ env → record env {varn = c10})) <span class="line-numbers"><a href="#n4" name="n4">4</a></span> $ Seq ( PComm (λ env → record env {vari = 0})) <span class="line-numbers"><a href="#n5" name="n5">5</a></span> $ While (λ env → lt zero (varn env ) ) <span class="line-numbers"><a href="#n6" name="n6">6</a></span> (Seq (PComm (λ env → record env {vari = ((vari env) + 1)} )) <span class="line-numbers"><a href="#n7" name="n7">7</a></span> $ PComm (λ env → record env {varn = ((varn env) - 1)} )) </pre></div> </div> </div> </li> <li>次は Hoare Logic での検証</li> </ul> <!-- TODO - 伝えたいものをはっきり - 成果はどこ? - Hoare Logic の説明で - 今までの Hoare Logic でできなかったことをできるようになった - 従来の Hoare Logic は Command ベースでしかかけなかったけど自由に書けるようになった - Hoare Logic を主眼に - hoare logic の検証 - htproof - htproof での while program - 検証 - cbc と hoare logic - cbc での hoare logic 記述 - cbc での while program - 内訳(関数の話とか) - cbc での while program の検証 - 記述の比較 - cbc での soundness - まとめ --> </div> <div class='slide'> <!-- _S9SLIDE_ --> <h2 id="hoare-logic-での-command-に対応する仕様">Hoare Logic での Command に対応する仕様</h2> <ul> <li>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> 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="#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="#n8" name="n8">8</a></span> WeakeningRule : {bPre : Cond} → {bPre' : Cond} → {cm : Comm} → <span class="line-numbers"> <a href="#n9" name="n9">9</a></span> {bPost' : Cond} → {bPost : Cond} → <span class="line-numbers"><strong><a href="#n10" name="n10">10</a></strong></span> Tautology bPre bPre' → <span class="line-numbers"><a href="#n11" name="n11">11</a></span> HTProof bPre' cm bPost' → <span class="line-numbers"><a href="#n12" name="n12">12</a></span> Tautology bPost' bPost → <span class="line-numbers"><a href="#n13" name="n13">13</a></span> HTProof bPre cm bPost <span class="line-numbers"><a href="#n14" name="n14">14</a></span> SeqRule : {bPre : Cond} → {cm1 : Comm} → {bMid : Cond} → <span class="line-numbers"><a href="#n15" name="n15">15</a></span> {cm2 : Comm} → {bPost : Cond} → <span class="line-numbers"><a href="#n16" name="n16">16</a></span> HTProof bPre cm1 bMid → <span class="line-numbers"><a href="#n17" name="n17">17</a></span> HTProof bMid cm2 bPost → <span class="line-numbers"><a href="#n18" name="n18">18</a></span> HTProof bPre (Seq cm1 cm2) bPost <span class="line-numbers"><a href="#n19" name="n19">19</a></span> IfRule : {cmThen : Comm} → {cmElse : Comm} → <span class="line-numbers"><strong><a href="#n20" name="n20">20</a></strong></span> {bPre : Cond} → {bPost : Cond} → <span class="line-numbers"><a href="#n21" name="n21">21</a></span> {b : Cond} → <span class="line-numbers"><a href="#n22" name="n22">22</a></span> HTProof (bPre and b) cmThen bPost → <span class="line-numbers"><a href="#n23" name="n23">23</a></span> HTProof (bPre and neg b) cmElse bPost → <span class="line-numbers"><a href="#n24" name="n24">24</a></span> HTProof bPre (If b cmThen cmElse) bPost <span class="line-numbers"><a href="#n25" name="n25">25</a></span> WhileRule : {cm : Comm} → {bInv : Cond} → {b : Cond} → <span class="line-numbers"><a href="#n26" name="n26">26</a></span> HTProof (bInv and b) cm bInv → <span class="line-numbers"><a href="#n27" name="n27">27</a></span> HTProof bInv (While b cm) (bInv and neg b) </pre></div> </div> </div> </li> <li>検証をするためにはこの HTProof で program と同様の仕様を構成する必要がある</li> </ul> </div> <div class='slide'> <!-- _S9SLIDE_ --> <h2 id="hoare-logic-での-仕様記述と部分正当性">Hoare Logic での 仕様記述と部分正当性</h2> <ul> <li>HTProof で記述した仕様</li> <li>lemma は事前条件からコマンドを通して事後条件が成り立つこと(部分正当性)の証明(長いので省略) <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 : (c10 : ℕ) → HTProof initCond (program c10 ) (termCond {c10}) <span class="line-numbers"><a href="#n2" name="n2">2</a></span> proof1 c10 = <span class="line-numbers"><a href="#n3" name="n3">3</a></span> SeqRule {λ e → true} ( PrimRule (init-case {c10} )) <span class="line-numbers"><a href="#n4" name="n4">4</a></span> $ SeqRule {λ e → Equal (varn e) c10} ( PrimRule lemma1 ) <span class="line-numbers"><a href="#n5" name="n5">5</a></span> $ WeakeningRule {λ e → (Equal (varn e) c10) ∧ (Equal (vari e) 0)} lemma2 ( <span class="line-numbers"><a href="#n6" name="n6">6</a></span> WhileRule {_} {λ e → Equal ((varn e) + (vari e)) c10} <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 </pre></div> </div> </div> </li> <li>比較のために元の while program <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 c10 = <span class="line-numbers"><a href="#n3" name="n3">3</a></span> Seq ( PComm (λ env → record env {varn = c10})) <span class="line-numbers"><a href="#n4" name="n4">4</a></span> $ Seq ( PComm (λ env → record env {vari = 0})) <span class="line-numbers"><a href="#n5" name="n5">5</a></span> $ While (λ env → lt zero (varn env ) ) <span class="line-numbers"><a href="#n6" name="n6">6</a></span> (Seq (PComm (λ env → record env {vari = ((vari env) + 1)} )) <span class="line-numbers"><a href="#n7" name="n7">7</a></span> $ PComm (λ env → record env {varn = ((varn env) - 1)} )) </pre></div> </div> </div> </li> <li>Command と対応した仕様があるため形がほぼ一緒 <ul> <li>while ループするときに強い条件を緩めている規則が違うくらい(Weacening Rule)</li> </ul> </li> <li>proof1 は HTProof が正しく繋げることで部分正当性まで証明</li> </ul> </div> <div class='slide'> <!-- _S9SLIDE_ --> <h2 id="hoare-logic-での健全性の証明">Hoare Logic での健全性の証明</h2> <ul> <li>proof1 は部分正当性を示せた</li> <li>実際に正しく動作すること(健全性)を証明する必要がある</li> <li>Satisfies は {P} C {Q} を受け取ってそれらが Comm で正しく成り立つ関係を返す</li> <li>PrimSoundness は HTProof を受け取って Satisfies が成り立つことを Soundness を用いて実際に証明する <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> PrimSoundness : {bPre : Cond} -> {cm : Comm} -> {bPost : Cond} -> <span class="line-numbers"><a href="#n2" name="n2">2</a></span> HTProof bPre cm bPost -> Satisfies bPre cm bPost <span class="line-numbers"><a href="#n3" name="n3">3</a></span> PrimSoundness {bPre} {cm} {bPost} ht = Soundness ht </pre></div> </div> </div> </li> <li>proofOfProgram では 実際に構築した program と proof1 を使って健全性を証明している <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> proofOfProgram : (c10 : ℕ) → (input output : Env ) <span class="line-numbers"><a href="#n2" name="n2">2</a></span> → initCond input ≡ true <span class="line-numbers"><a href="#n3" name="n3">3</a></span> → (SemComm (program c10) input output) <span class="line-numbers"><a href="#n4" name="n4">4</a></span> → termCond {c10} output ≡ true <span class="line-numbers"><a href="#n5" name="n5">5</a></span> proofOfProgram c10 input output ic sem = <span class="line-numbers"><a href="#n6" name="n6">6</a></span> PrimSoundness (proof1 c10) input output ic sem </pre></div> </div> </div> </li> </ul> </div> <div class='slide'> <!-- _S9SLIDE_ --> <h2 id="continuation-based-c-について">Continuation based C について</h2> <ul> <li>Continuation based C (CbC) は当研究室で開発してるプログラミング言語</li> <li>CbC では処理の単位を <strong>CodeGear</strong> 、データの単位を <strong>DataGear</strong> とする</li> <li>CodeGear は引数として Input の DataGear を受け取り、 Output の DataGear を返す</li> <li>Output の DataGear は次の CodeGear の Input として接続される</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> </div> <div class='slide'> <!-- _S9SLIDE_ --> <h2 id="cbc-での-hoare-logic">CbC での Hoare Logic</h2> <ul> <li>CodeGear、DataGear を用いた Hoare Logic は図のようになる</li> </ul> <p style="text-align:center;"><img src="./fig/hoare-cg-dg.svg" alt="" width="60%" height="60%" /></p> <ul> <li>CodeGear が条件を引数として受け、継続先の CodeGear が次の条件を満たす様になる</li> </ul> </div> <div class='slide'> <!-- _S9SLIDE_ --> <h2 id="cbc-での-while-program">CbC での while program</h2> <ul> <li>比較用の Hoare Logic での while program <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 c10 = <span class="line-numbers"><a href="#n3" name="n3">3</a></span> Seq ( PComm (λ env → record env {varn = c10})) <span class="line-numbers"><a href="#n4" name="n4">4</a></span> $ Seq ( PComm (λ env → record env {vari = 0})) <span class="line-numbers"><a href="#n5" name="n5">5</a></span> $ While (λ env → lt zero (varn env ) ) <span class="line-numbers"><a href="#n6" name="n6">6</a></span> (Seq (PComm (λ env → record env {vari = ((vari env) + 1)} )) <span class="line-numbers"><a href="#n7" name="n7">7</a></span> $ PComm (λ env → record env {varn = ((varn env) - 1)} )) </pre></div> </div> </div> </li> <li>CbC での while program <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> whileTestPCall : (c10 : ℕ ) → Envc <span class="line-numbers"><a href="#n2" name="n2">2</a></span> whileTestPCall c10 = whileTestP' {_} {_} c10 (λ env → loopP' env (λ env → env)) </pre></div> </div> </div> </li> <li>whileTestP’ が n = c10、 i = 0 の代入、 loopP’ が while loop に対応している</li> <li>CbC での Hoare Logic 上でコマンドは CodeGear そのもの <ul> <li>CodeGear は Hoare Logic のコマンドより自由な記述</li> </ul> </li> </ul> </div> <div class='slide'> <!-- _S9SLIDE_ --> <h2 id="cbc-での-htproof">CbC での HTProof</h2> <ul> <li>HTProof に対応するものは各 Meta CodeGear に条件を渡したもの</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> whileTestPwP : {l : Level} {t : Set l} → (c10 : ℕ) <span class="line-numbers"><a href="#n2" name="n2">2</a></span> → ((env : Envc ) → (vari env ≡ 0) ∧ (varn env ≡ c10 env) → t) → t <span class="line-numbers"><a href="#n3" name="n3">3</a></span> whileTestPwP c10 next = <span class="line-numbers"><a href="#n4" name="n4">4</a></span> next (whileTestP c10 ( λ env → env )) (record { pi1 = refl ; pi2 = refl }) </pre></div> </div> </div> </li> <li>whileTestPCallwP’ は Hoare Logic の HTProof 記述 proof1 に相当</li> <li>比較用 proof1 <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 : (c10 : ℕ) → HTProof initCond (program c10 ) (termCond {c10}) <span class="line-numbers"><a href="#n2" name="n2">2</a></span> proof1 c10 = <span class="line-numbers"><a href="#n3" name="n3">3</a></span> SeqRule {λ e → true} ( PrimRule (init-case {c10} )) <span class="line-numbers"><a href="#n4" name="n4">4</a></span> $ SeqRule {λ e → Equal (varn e) c10} ( PrimRule lemma1 ) <span class="line-numbers"><a href="#n5" name="n5">5</a></span> $ WeakeningRule {λ e → (Equal (varn e) c10) ∧ (Equal (vari e) 0)} lemma2 ( <span class="line-numbers"><a href="#n6" name="n6">6</a></span> WhileRule {_} {λ e → Equal ((varn e) + (vari e)) c10} <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 </pre></div> </div> </div> </li> <li>proof1 の lemma に相当する証明は Meta CodeGear で、継続先の 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> whileTestPCallwP' : (c : ℕ ) → Set <span class="line-numbers"><a href="#n2" name="n2">2</a></span> whileTestPCallwP' c = whileTestPwP {_} {_} c ( <span class="line-numbers"><a href="#n3" name="n3">3</a></span> λ env s → loopPwP' (varn env) env refl (conv env s) <span class="line-numbers"><a href="#n4" name="n4">4</a></span> ( λ env s → vari env ≡ c10 env ) ) </pre></div> </div> </div> </li> <li>Hoare Logic では実装、部分正当性を分けて記述していた</li> <li>CbC での Hoare Logic は実装と部分正当性を一体化できる</li> </ul> </div> <div class='slide'> <!-- _S9SLIDE_ --> <h2 id="cbc-での-soundness">CbC での Soundness</h2> <ul> <li>先程の whileTestPCallwP’ を命題として証明すると健全性が示せる <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> whileTestPCallwP' : (c : ℕ ) → Set <span class="line-numbers"><a href="#n2" name="n2">2</a></span> whileTestPCallwP' c = whileTestPwP {_} {_} c ( <span class="line-numbers"><a href="#n3" name="n3">3</a></span> λ env s → loopPwP' (varn env) env refl (conv env s) <span class="line-numbers"><a href="#n4" name="n4">4</a></span> ( λ env s → vari env ≡ c10 env ) ) </pre></div> </div> </div> </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> whileCallwP : (c : ℕ) → whileTestPCallwP' c <span class="line-numbers"><a href="#n2" name="n2">2</a></span> whileCallwP c = whileTestPwP {_} {_} c (λ env s → <span class="line-numbers"><a href="#n3" name="n3">3</a></span> loopPwP' (c10 env) env (sym (pi2 s)) (conv env s) {!!}) </pre></div> </div> </div> </li> </ul> </div> <div class='slide'> <!-- _S9SLIDE_ --> <h2 id="検証時の-loop-の解決">検証時の Loop の解決</h2> <ul> <li><strong>loopHelper</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> loopHelper : (n : ℕ) → (env : Envc ) → (eq : varn env ≡ n) <span class="line-numbers"><a href="#n2" name="n2">2</a></span> → (varn env + vari env ≡ c10 env) <span class="line-numbers"><a href="#n3" name="n3">3</a></span> → loopPwP' n env (sym eq) seq (λ env₁ x → (vari env₁ ≡ c10 env₁)) <span class="line-numbers"><a href="#n4" name="n4">4</a></span> loopHelper zero env eq refl rewrite eq = refl <span class="line-numbers"><a href="#n5" name="n5">5</a></span> loopHelper (suc n) env eq refl rewrite eq = loopHelper n <span class="line-numbers"><a href="#n6" name="n6">6</a></span> (record { c10 = suc (n + vari env) ; varn = n ; vari = suc (vari env) }) <span class="line-numbers"><a href="#n7" name="n7">7</a></span> refl (+-suc n (vari env)) </pre></div> </div> </div> </li> <li>ここでは任意の回数回る while loop が必ず最終条件を満たす</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> helperCallwP : (c : ℕ) → whileTestPCallwP' c <span class="line-numbers"><a href="#n2" name="n2">2</a></span> helperCallwP c = whileTestPwP {_} {_} c <span class="line-numbers"><a href="#n3" name="n3">3</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> <!-- ## Gears について --> <!-- - **Gears** は当研究室で提案しているプログラム記述手法 --> <!-- - 処理の単位を **CodeGear** 、データの単位を **DataGear** --> <!-- - CodeGear は引数として Input の DataGear を受け取り、 Output の DataGear を返す --> <!-- - Output の DataGear は次の CodeGear の Input として接続される --> <!-- <\!-- [fig1](file://./fig/cgdg.pdf) -\-> --> <!-- - CodeGear の接続処理などのメタ計算は Meta CodeGear として定義 --> <!-- - Meta CodeGear で信頼性の検証を行う --> <!-- <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> -\-> --> <!-- ## Agda での DataGear --> <!-- - **DataGear** は CodeGear でつかわれる引数をまとめたもの --> <!-- - Agda は CbC の上位言語 --> <!-- - メタ計算を含めて記述できる --> <!-- - DataGear は Agda の CodeGear で使うことのできる**全てのデータ** --> <!-- ## Agda での CodeGear --> <!-- - Agda での CodeGear は継続渡しで記述された関数 --> <!-- ```AGDA --> <!-- whileTest : {t : Set} → (c10 : Nat) --> <!-- → (Code : Env → t) → t --> <!-- whileTest c10 next = next (record {varn = c10 --> <!-- ; vari = 0} ) --> <!-- ``` --> <!-- - CodeGear の型は継続先を返す関数 --> <!-- - **(Code : fa → t)** は継続先 --> <!-- - 引数として継続先の CodeGear を受け取る --> <!-- ## Agda での Gears の記述(whileLoop) --> <!-- - 関数の動作を条件で変えたいときはパターンマッチを行う --> <!-- ```AGDA --> <!-- whileLoop : {l : Level} {t : Set l} → Envc --> <!-- → (next : Envc → t) → (exit : Envc → t) → t --> <!-- whileLoop env@(record { c10 = _ ; varn = zero ; vari = _ }) _ exit = exit env --> <!-- whileLoop record { c10 = _ ; varn = suc varn1 ; vari = vari } next _ = --> <!-- next (record {c10 = _ ; varn = varn1 ; vari = suc vari }) --> <!-- ``` --> <!-- - whileLoop は varn が 0 より大きい間ループする --> <!-- ## Hoare Logic をベースとした Gears での検証手法 --> <!-- ```C --> <!-- n = 10; --> <!-- i = 0; --> <!-- while (n>0) --> <!-- { --> <!-- i++; --> <!-- n--; --> <!-- } --> <!-- ``` --> <!-- - 今回 Hoare Logic で証明する次のようなコードを検証した --> <!-- - このプログラムは変数iとnをもち、 n>0 の間nの値を減らし、i の値を増やす --> <!-- - n ≡ 0 のとき停止するため、終了時の変数の結果は i ≡ 10、n ≡ 0 になる --> <!-- ## Gears をベースにしたプログラム --> <!-- ```AGDA --> <!-- test : Env --> <!-- test = whileTest 10 (λ env → whileLoop env (λ env1 → env1)) --> <!-- -- whileTest : {t : Set} → (c10 : Nat) → (Code : Env → t) → t --> <!-- -- whileLoop : {t : Set} → Env → (Code : Env → t) → t --> <!-- ``` --> <!-- - test は whileTest と whileLoop を実行した結果を返す関数 --> <!-- - whileTest の継続先にDataGear を受け取って whileLoop に渡す --> <!-- - **(λ 引数 → )**は無名の関数で引数を受け取って継続する --> <!-- ## Gears をベースにした Hoare Logic と証明(全体) --> <!-- ```AGDA --> <!-- -- 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 )))) --> <!-- ``` --> <!-- - proofGears は Hoare Logic をベースとした証明 --> <!-- - 先程のプログラムと違い、引数として証明も持っている --> <!-- - whileTest' の継続に conversion1、その継続に whileLoop' が来て最後の継続に vari が c10 と等しい --> <!-- ## Gears と Hoare Logic をベースにした証明(whileTest) --> <!-- ```AGDA --> <!-- whileTest' : {l : Level} {t : Set l} {c10 : ℕ } --> <!-- → (Code : (env : Env ) → ((vari env) ≡ 0) ∧ ((varn env) ≡ c10) → t) → t --> <!-- whileTest' {_} {_} {c10} next = next --> <!-- (record env {vari = 0 ; varn = c10 }) (record {pi1 = refl ; pi2 = refl}) --> <!-- ``` --> <!-- - 最初の Command なので PreCondition はない --> <!-- - (record {pi1 = refl ; pi2 = refl}) は **(vari env) ≡ 0** と **(varn env) ≡ c10**の証明 --> <!-- - **_∧_** は pi1 と pi2 のフィールドをもつレコード型 --> <!-- - 両方とも成り立つので **refl** --> <!-- - Gears での PostCondition は **引数 → (Code : fa → PostCondition → t) → t** --> <!-- ## Gears と Hoare Logic をベースにした証明(conversion) --> <!-- ```AGDA --> <!-- conv : (env : Envc ) → (vari env ≡ 0) ∧ (varn env ≡ c10 env) → varn env + vari env ≡ c10 env --> <!-- conv e record { pi1 = refl ; pi2 = refl } = +zero --> <!-- ``` --> <!-- - conv は制約を緩める CodeGear --> <!-- - **(vari env ≡ 0) ∧ (varn env ≡ c10 env)** が成り立つとき **varn env + vari env ≡ c10 env** が成り立つ --> <!-- <\!-- ## 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 -\-> --> <!-- <\!-- ``` -\-> --> <!-- ## Gears と Hoare Logic をベースにした証明(whileLoop) --> <!-- ```AGDA --> <!-- whileLoopPwP' : {l : Level} {t : Set l} → (n : ℕ) → (env : Envc ) → (n ≡ varn env) → whileTestStateP s2 env --> <!-- → (next : (env : Envc ) → (pred n ≡ varn env) → whileTestStateP s2 env → t) --> <!-- → (exit : (env : Envc ) → whileTestStateP sf env → t) → t --> <!-- whileLoopPwP' zero env refl refl next exit = exit env refl --> <!-- whileLoopPwP' (suc n) env refl refl next exit = --> <!-- next (record env {varn = pred (varn env) ; vari = suc (vari env) }) refl (+-suc n (vari env)) --> <!-- loopPwP' zero env refl refl exit = exit env refl --> <!-- loopPwP' (suc n) env refl refl exit = whileLoopPwP' (suc n) env refl refl --> <!-- (λ env x y → loopPwP' n env x y exit) exit --> <!-- ``` --> <!-- - whileLoop も whileTest と同様に PreCondition が CodeGear に入りそれに対する証明が記述されている --> <!-- - ループが回るごとに、**whileLoopPwP'** で停止か継続かを判断し、 **loopPwP'** でループが回る --> <!-- ## Gears と Hoare Logic をベースにした仕様記述 --> <!-- ```AGDA --> <!-- whileProofs : (c : ℕ ) → Set --> <!-- whileProofs c = whileTestPwP {_} {_} c --> <!-- ( λ env s → conv1 env s --> <!-- ( λ env s → loopPwP' (varn env) env refl s --> <!-- ( λ env s → vari env ≡ c10 env ))) --> <!-- ``` --> <!-- - **whileProofs** では最終状態が vari と c10 が等しくなるため仕様になっている --> <!-- ## Gears と Hoare Logic を用いた仕様の証明 --> <!-- ```AGDA --> <!-- -- whileProofs c = whileTestPwP {_} {_} c --> <!-- -- ( λ env s → conv1 env s --> <!-- -- ( λ env s → loopPwP' (varn env) env refl s --> <!-- -- ( λ env s → vari env ≡ c10 env ))) --> <!-- ProofGears : (c : ℕ) → whileProofs c --> <!-- ProofGears c = whileTestPwP {_} {_} c --> <!-- (λ env s → loopPwP' c (record { c10 = c ; varn = c ; vari = 0 }) refl +zero --> <!-- (λ env₁ s₁ → {!!})) --> <!-- Goal: loopPwP' c (record { c10 = c ; varn = c ; vari = 0 }) refl --> <!-- +zero (λ env₂ s₂ → vari env₂ ≡ c10 env₂) --> <!-- ------------------------------------------------------------ --> <!-- s₁ : vari env₁ ≡ c10 env₁ --> <!-- env₁ : Envc --> <!-- s : (vari env ≡ 0) ∧ (varn env ≡ c10 env) --> <!-- env : Envc --> <!-- c : ℕ --> <!-- ``` --> <!-- - 先程の **whileProofs** で行った仕様記述を型に記述し、実際に証明していく --> <!-- - しかし loopPwP' のループが進まず証明できない --> <!-- ## 検証時の Loop の解決 --> <!-- ```AGDA --> <!-- loopHelper : (n : ℕ) → (env : Envc ) → (eq : varn env ≡ n) → (seq : whileTestStateP s2 env) --> <!-- → loopPwP' n env (sym eq) seq (λ env₁ x → (vari env₁ ≡ c10 env₁)) --> <!-- loopHelper zero env eq refl rewrite eq = refl --> <!-- loopHelper (suc n) env eq refl rewrite eq = loopHelper n --> <!-- (record { c10 = suc (n + vari env) ; varn = n ; vari = suc (vari env) }) refl (+-suc n (vari env)) --> <!-- ``` --> <!-- - **loopHelper** は今回のループを解決する証明 --> <!-- - ループ解決のためにループの簡約ができた --> <!-- ## Gears と Hoare Logic を用いた仕様の証明(完成) --> <!-- ```AGDA --> <!-- -- whileProofs c = whileTestPwP {_} {_} c --> <!-- -- ( λ env s → conv1 env s --> <!-- -- ( λ env s → loopPwP' (varn env) env refl s --> <!-- -- ( λ env s → vari env ≡ c10 env ))) --> <!-- ProofGears : (c : ℕ) → whileProofs c --> <!-- ProofGears c = whileTestPwP {_} {_} c --> <!-- (λ env s → loopHelper c (record { c10 = c ; varn = c ; vari = zero }) refl +zero) --> <!-- ``` --> <!-- - **loopHelper** を使って簡約することで **whileProofs** の証明を行うことができた --> <!-- ## まとめと今後の課題 --> <!-- - CodeGear、 DataGear を用いた Hoare Logic ベースの仕様記述を導入した --> <!-- - Hoare Logic ベースの検証を実際に行うことができた --> <!-- - 証明時の任意回の有限ループに対する解決を行えた --> <!-- - 今後の課題 --> <!-- - BinaryTree の有限ループに対する証明 --> <!-- - Hoare Logic で検証されたコードの CbC 変換 --> <!-- - 並列実行での検証 --> </div> </div><!-- presentation --> </body> </html>