comparison slide/slide.html @ 11:17b7605a5deb

add figures, some slides
author ryokka
date Sun, 13 Jan 2019 23:42:16 +0900
parents a87fec07fd78
children e8fe28afe61e
comparison
equal deleted inserted replaced
10:a87fec07fd78 11:17b7605a5deb
91 <div class='slide'> 91 <div class='slide'>
92 <!-- 発表20分、質疑応答5分 --> 92 <!-- 発表20分、質疑応答5分 -->
93 93
94 94
95 <!-- _S9SLIDE_ --> 95 <!-- _S9SLIDE_ -->
96 <h2 id="研究目的">研究目的</h2> 96 <h2 id="研究背景">研究背景</h2>
97 <!-- 後回しだ!!!!! --> 97 <ul>
98 <ul> 98 <li>OS やアプリケーションなどの信頼性は重要な課題</li>
99 <li>OS やアプリケーションなどの信頼性は重要な課題である。</li> 99 <li>信頼性を上げるために仕様を検証する必要</li>
100 <li>プログラムの信頼性を上げるためには仕様を検証する必要がある。</li> 100 <li>仕様検証の手法として Floyd-Hoare Logic (以下 HoareLogic) がある
101 <li>使用の検証手法として Floyd-Hoare Logic (以下 HoareLogic) があり。
102 <ul> 101 <ul>
103 <li>これはプログラムを Pre、Post Condition(事前、事後条件)、Command (関数)</li> 102 <li>事前条件(PreCondition)が成り立つとき、関数(Command)を実行、それが停止したとき、事後条件(PostCondition)を満たす</li>
104 </ul> 103 </ul>
105 </li> 104 </li>
106 <li>当研究室では信頼性の高い OS として GearsOS を開発している。</li> 105 <li>既存の言語ではあまり利用されていない(python の pyrefine ってコードチェッカーくらい…?)</li>
107 <li>GearsOS では CodeGear、 DataGear という単位を用いてプログラムを記述する手法を提案している。</li> 106 </ul>
108 <li>OS やアプリケーションなど、ソフトウェアの信頼性を高めることは重要である。</li> 107
109 <li>そのために当研究室では CodeGear 、 DataGear という単位を用いてプログラムを記述する手法を提案している。 108
109
110 </div>
111
112 <div class='slide'>
113 <!-- _S9SLIDE_ -->
114 <h2 id="背景">背景</h2>
115 <ul>
116 <li>当研究室では 処理の単位を <strong>CodeGear</strong>、データの単位を <strong>DataGear</strong> としてプログラムを記述する手法を提案</li>
117 <li>CodeGear は Input DataGear を受け取り、処理を行って Output DataGear に書き込む</li>
118 <li>Gear 間の接続処理はメタ計算として定義
110 <ul> 119 <ul>
111 <li>CodeGear は処理の単位で、処理が終わると次の CodeGear へと継続を行う。</li> 120 <li>メタ計算部分に検証を埋め込むことで通常処理に手を加えずに検証</li>
112 <li>このとき、 CodeGear は通常の関数呼び出しとは異なり、呼び出し前の環境を持たずに継続をする。</li>
113 <li>DataGear はデータの単位で、 CodeGear の入力、出力変数となる。</li>
114 </ul> 121 </ul>
115 </li> 122 </li>
116 <li>また、当研究室では Gears の単位を用いて作られる OS である、 GearsOS を開発している。</li> 123 <li>本研究では Gears OS の信頼性を高めるため、 Gears の単位を用いた HoareLogic ベースの検証手法を提案する</li>
117 <li> 124 </ul>
118 <p>本研究では Gears OS の信頼性を高めるため、 Gears の単位を用いた検証手法を提案する。</p> 125
119 </li> 126 <p style="text-align:center;"><img src="./pic/cgdg-small.svg" alt="" width="75%" height="75%" /></p>
120 <li>当研究室では検証しやすい単位として <strong>CodeGear</strong>、<strong>DataGear</strong> という単位を用いてプログラムを記述する手法を提案している
121 <ul>
122 <li><strong>CodeGear</strong> とはプログラムを記述する際の処理の単位</li>
123 <li><strong>DataGear</strong> は CodeGear で扱うデータの単位</li>
124 </ul>
125 </li>
126 <li>これは関数型プログラミングに近い形になる</li>
127 <li>本研究では関数型言語であり、 <strong>証明支援系</strong> 言語でもある <strong>Agda</strong> を用いて仕様を検証することにしている</li>
128 </ul>
129
130 <!-- * 動作するプログラムは高い信頼性を持っていてほしい -->
131 <!-- * そのために当研究室では CodeGear 、 DataGear を用いて記述する手法を提案している -->
132 <!-- * 処理の単位である CodeGear を継続しプログラムを記述していく -->
133 <!-- * メタ計算部分を切り替えることで CodeGear の処理を変更すること無くプログラムの検証をすることができる -->
134 <!-- * 継続に関数を呼び出すときの前提条件(pre-condition)を追加することができ、Hoare Logic を用いた証明を Agda で記述できると考えている -->
135 <!-- * 本研究では CodeGear, DataGear という単位を用いてプログラムを記述する手法の継続部分で Hoare Logic をベースにした証明手法を検討する -->
136 127
137 128
138 129
139 </div> 130 </div>
140 131
152 <li>メタ計算で信頼性の検証を行う</li> 143 <li>メタ計算で信頼性の検証を行う</li>
153 </ul> 144 </ul>
154 </li> 145 </li>
155 </ul> 146 </ul>
156 147
148 <!-- ![cgdg](./pic/codeGear_dataGear.pdf){} -->
149 <p style="text-align:center;"><img src="./pic/cgdg.svg" alt="" width="30%" height="30%" /></p>
150
157 151
158 152
159 </div> 153 </div>
160 154
161 <div class='slide'> 155 <div class='slide'>
163 <h2 id="cbc-について">CbC について</h2> 157 <h2 id="cbc-について">CbC について</h2>
164 <ul> 158 <ul>
165 <li>Gears の単位でプログラミングできる言語として CbC (Continuation based C) が存在</li> 159 <li>Gears の単位でプログラミングできる言語として CbC (Continuation based C) が存在</li>
166 <li>現在の CbC では assert での検証ができる</li> 160 <li>現在の CbC では assert での検証ができる</li>
167 <li>将来的には証明も扱えるようにしたいが現段階では未実装</li> 161 <li>将来的には証明も扱えるようにしたいが現段階では未実装</li>
168 <li>そのため Gears の単位を定理証明支援系の言語である <strong>Agda</strong> で記述できるようにし、 Agda 上で証明を行う</li> 162 <li>そのため Gears の単位を定理証明支援系の言語である <strong>Agda</strong> で記述し、 Agda 上で証明</li>
169 </ul> 163 </ul>
170 164
171 165
172 166
173 </div> 167 </div>
191 <h2 id="agda-のデータ型">Agda のデータ型</h2> 185 <h2 id="agda-のデータ型">Agda のデータ型</h2>
192 <ul> 186 <ul>
193 <li>データ型は代数的なデータ構造</li> 187 <li>データ型は代数的なデータ構造</li>
194 <li><strong>data</strong> キーワードの後に、<strong>名前 : 型</strong>、 where 句</li> 188 <li><strong>data</strong> キーワードの後に、<strong>名前 : 型</strong>、 where 句</li>
195 <li>次の行以降は<strong>コンストラクタ名 : 型</strong></li> 189 <li>次の行以降は<strong>コンストラクタ名 : 型</strong></li>
196 <li>型は<strong>-&gt;</strong>または<strong>→</strong>で繋げる事ができる</li> 190 <li>型は<strong>-&gt;</strong>または<strong>→</strong>で繋げる</li>
197 <li><strong>PrimComm -&gt; Comm</strong>は<strong>PrimComm</strong> を受け取り、 <strong>Comm</strong>を返す型</li> 191 <li>例えば、型<strong>PrimComm -&gt; Comm</strong>は<strong>PrimComm</strong> を受け取り<strong>Comm</strong>を返す型</li>
198 <li>再帰的な定義も可能</li> 192 <li>再帰的な定義も可能
199 </ul> 193 <div class="language-AGDA highlighter-coderay"><div class="CodeRay">
200
201 <div class="language-AGDA highlighter-coderay"><div class="CodeRay">
202 <div class="code"><pre><span class="line-numbers"><a href="#n1" name="n1">1</a></span> data Comm : Set where 194 <div class="code"><pre><span class="line-numbers"><a href="#n1" name="n1">1</a></span> data Comm : Set where
203 <span class="line-numbers"><a href="#n2" name="n2">2</a></span> Skip : Comm 195 <span class="line-numbers"><a href="#n2" name="n2">2</a></span> Skip : Comm
204 <span class="line-numbers"><a href="#n3" name="n3">3</a></span> Abort : Comm 196 <span class="line-numbers"><a href="#n3" name="n3">3</a></span> Abort : Comm
205 <span class="line-numbers"><a href="#n4" name="n4">4</a></span> PComm : PrimComm -&gt; Comm 197 <span class="line-numbers"><a href="#n4" name="n4">4</a></span> PComm : PrimComm -&gt; Comm
206 <span class="line-numbers"><a href="#n5" name="n5">5</a></span> Seq : Comm -&gt; Comm -&gt; Comm 198 <span class="line-numbers"><a href="#n5" name="n5">5</a></span> Seq : Comm -&gt; Comm -&gt; Comm
207 <span class="line-numbers"><a href="#n6" name="n6">6</a></span> If : Cond -&gt; Comm -&gt; Comm -&gt; Comm 199 <span class="line-numbers"><a href="#n6" name="n6">6</a></span> If : Cond -&gt; Comm -&gt; Comm -&gt; Comm
208 <span class="line-numbers"><a href="#n7" name="n7">7</a></span> While : Cond -&gt; Comm -&gt; Comm 200 <span class="line-numbers"><a href="#n7" name="n7">7</a></span> While : Cond -&gt; Comm -&gt; Comm
209 </pre></div> 201 </pre></div>
210 </div> 202 </div>
211 </div> 203 </div>
204 </li>
205 </ul>
212 206
213 <!-- - where は宣言した部分に束縛する --> 207 <!-- - where は宣言した部分に束縛する -->
214 208
215 209
216 210
219 <div class='slide'> 213 <div class='slide'>
220 <!-- _S9SLIDE_ --> 214 <!-- _S9SLIDE_ -->
221 <h2 id="agda-のレコード型">Agda のレコード型</h2> 215 <h2 id="agda-のレコード型">Agda のレコード型</h2>
222 <ul> 216 <ul>
223 <li>C 言語での構造体に近い</li> 217 <li>C 言語での構造体に近い</li>
224 <li>複数のデータ型をまとめる</li> 218 <li>複数のデータをまとめる</li>
225 <li>関数内で構築できる</li> 219 <li>関数内で構築できる</li>
226 <li>構築時は<strong>レコード名 {フィールド名 = 値}</strong></li> 220 <li>構築時は<strong>レコード名 {フィールド名 = 値}</strong></li>
227 <li>複数ある場合は <strong>{フィールド1 = 1 ; フィールド2 = 2}</strong>のように <strong>;</strong> を使って列挙</li> 221 <li>複数ある場合は <strong>{フィールド1 = 1 ; フィールド2 = 2}</strong>のように <strong>;</strong> を使って列挙
228 </ul> 222 <ul>
229 223 <li>(varn,vari の型 <strong>ℕ</strong> は Agda 上の 自然数、 データ型で zero : ℕ と succ : ℕ -&gt; ℕ で定義されてる)
230 <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> 224 <div class="language-AGDA highlighter-coderay"><div class="CodeRay">
231 <div class="code"><pre><span class="line-numbers"><a href="#n1" name="n1">1</a></span> record Env : Set where 225 <div class="code"><pre><span class="line-numbers"><a href="#n1" name="n1">1</a></span>record Env : Set where
232 <span class="line-numbers"><a href="#n2" name="n2">2</a></span> field 226 <span class="line-numbers"><a href="#n2" name="n2">2</a></span> field
233 <span class="line-numbers"><a href="#n3" name="n3">3</a></span> varn : ℕ 227 <span class="line-numbers"><a href="#n3" name="n3">3</a></span> varn : ℕ
234 <span class="line-numbers"><a href="#n4" name="n4">4</a></span> vari : ℕ 228 <span class="line-numbers"><a href="#n4" name="n4">4</a></span> vari : ℕ
235 </pre></div> 229 </pre></div>
236 </div> 230 </div>
237 </div> 231 </div>
232 </li>
233 </ul>
234 </li>
235 </ul>
238 236
239 237
240 238
241 </div> 239 </div>
242 240
245 <h2 id="agda-の関数">Agda の関数</h2> 243 <h2 id="agda-の関数">Agda の関数</h2>
246 <ul> 244 <ul>
247 <li>関数にも型が必要</li> 245 <li>関数にも型が必要</li>
248 <li>関数は <strong>関数名 = 値</strong></li> 246 <li>関数は <strong>関数名 = 値</strong></li>
249 <li>関数ではパターンマッチがかける</li> 247 <li>関数ではパターンマッチがかける</li>
250 <li><strong>_</strong> は任意の引数</li> 248 <li><strong>_</strong> は任意の引数
251 </ul> 249 <div class="language-AGDA highlighter-coderay"><div class="CodeRay">
252 250 <div class="code"><pre><span class="line-numbers"><a href="#n1" name="n1">1</a></span> _-_ : ℕ → ℕ → ℕ
253 <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> 251 <span class="line-numbers"><a href="#n2" name="n2">2</a></span> x - zero = x
254 <div class="code"><pre><span class="line-numbers"><a href="#n1" name="n1">1</a></span> _-_ : ℕ → ℕ → ℕ 252 <span class="line-numbers"><a href="#n3" name="n3">3</a></span> zero - _ = zero
255 <span class="line-numbers"><a href="#n2" name="n2">2</a></span> x - zero = x 253 <span class="line-numbers"><a href="#n4" name="n4">4</a></span> (suc x) - (suc y) = x - y
256 <span class="line-numbers"><a href="#n3" name="n3">3</a></span> zero - _ = zero 254 </pre></div>
257 <span class="line-numbers"><a href="#n4" name="n4">4</a></span> (suc x) - (suc y) = x - y 255 </div>
258 </pre></div> 256 </div>
259 </div> 257 </li>
260 </div> 258 </ul>
261 259
262 260
263 261
264 </div> 262 </div>
265 263
269 <ul> 267 <ul>
270 <li>関数の型に論理式</li> 268 <li>関数の型に論理式</li>
271 <li>関数自体にそれを満たす導出</li> 269 <li>関数自体にそれを満たす導出</li>
272 <li>完成した関数は証明</li> 270 <li>完成した関数は証明</li>
273 <li><strong>{}</strong> は暗黙的(推論される)</li> 271 <li><strong>{}</strong> は暗黙的(推論される)</li>
274 <li>下のコードは自然数に 0 を足したとき値が変わらないことの証明</li> 272 <li>下のコードは自然数に 0 を足したとき値が変わらないことの証明
275 </ul> 273 <div class="language-AGDA highlighter-coderay"><div class="CodeRay">
276 274 <div class="code"><pre><span class="line-numbers"><a href="#n1" name="n1">1</a></span> +zero : { y : ℕ } → y + zero ≡ y
277 <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> 275 <span class="line-numbers"><a href="#n2" name="n2">2</a></span> +zero {zero} = refl
278 <div class="code"><pre><span class="line-numbers"><a href="#n1" name="n1">1</a></span>+zero : {y : ℕ} → y + zero ≡ y 276 <span class="line-numbers"><a href="#n3" name="n3">3</a></span> +zero {suc y} = cong ( λ x → suc x ) ( +zero {y} )
279 <span class="line-numbers"><a href="#n2" name="n2">2</a></span>+zero {zero} = refl 277 </pre></div>
280 <span class="line-numbers"><a href="#n3" name="n3">3</a></span>+zero {suc y} = cong ( λ x → suc x ) ( +zero {y} ) 278 </div>
281 </pre></div> 279 </div>
282 </div> 280 </li>
283 </div> 281 </ul>
284 282
285 283
286 284
287 </div> 285 </div>
288 286
301 299
302 <div class='slide'> 300 <div class='slide'>
303 <!-- _S9SLIDE_ --> 301 <!-- _S9SLIDE_ -->
304 <h2 id="agda-での-hoarelogic-の理解">Agda での HoareLogic の理解</h2> 302 <h2 id="agda-での-hoarelogic-の理解">Agda での HoareLogic の理解</h2>
305 <ul> 303 <ul>
306 <li>HoareLogic を用いて次のようなプログラム(while Program)を検証した。</li> 304 <li>HoareLogic を用いて次のようなプログラム(while Program)を検証した。
307 </ul> 305 <div class="language-C highlighter-coderay"><div class="CodeRay">
308
309 <div class="language-C highlighter-coderay"><div class="CodeRay">
310 <div class="code"><pre><span class="line-numbers"><a href="#n1" name="n1">1</a></span> n = <span style="color:#00D">10</span>; 306 <div class="code"><pre><span class="line-numbers"><a href="#n1" name="n1">1</a></span> n = <span style="color:#00D">10</span>;
311 <span class="line-numbers"><a href="#n2" name="n2">2</a></span> i = <span style="color:#00D">0</span>; 307 <span class="line-numbers"><a href="#n2" name="n2">2</a></span> i = <span style="color:#00D">0</span>;
312 <span class="line-numbers"><a href="#n3" name="n3">3</a></span> 308 <span class="line-numbers"><a href="#n3" name="n3">3</a></span>
313 <span class="line-numbers"><a href="#n4" name="n4">4</a></span> <span style="color:#080;font-weight:bold">while</span> (n&gt;<span style="color:#00D">0</span>) 309 <span class="line-numbers"><a href="#n4" name="n4">4</a></span> <span style="color:#080;font-weight:bold">while</span> (n&gt;<span style="color:#00D">0</span>)
314 <span class="line-numbers"><a href="#n5" name="n5">5</a></span> { 310 <span class="line-numbers"><a href="#n5" name="n5">5</a></span> {
315 <span class="line-numbers"><a href="#n6" name="n6">6</a></span> i++; 311 <span class="line-numbers"><a href="#n6" name="n6">6</a></span> i++;
316 <span class="line-numbers"><a href="#n7" name="n7">7</a></span> n--; 312 <span class="line-numbers"><a href="#n7" name="n7">7</a></span> n--;
317 <span class="line-numbers"><a href="#n8" name="n8">8</a></span> } 313 <span class="line-numbers"><a href="#n8" name="n8">8</a></span> }
318 </pre></div> 314 </pre></div>
319 </div> 315 </div>
320 </div> 316 </div>
321 <ul> 317 </li>
322 <li>このプログラムは変数iとnをもち、 n&gt;0 の間nの値を減らし、i の値を増やす</li> 318 <li>このプログラムは変数iとnをもち、 n&gt;0 の間nの値を減らし、i の値を増やす</li>
323 <li>n==0のとき停止するため、終了時の変数の結果はi==10、n==0 になるはずである。</li> 319 <li>n==0のとき停止するため、終了時の変数の結果はi==10、n==0 になるはずである。</li>
324 </ul> 320 </ul>
325 321
326 322
345 <!-- _S9SLIDE_ --> 341 <!-- _S9SLIDE_ -->
346 <h2 id="agda-上での-hoarelogicコマンド定義">Agda 上での HoareLogic(コマンド定義)</h2> 342 <h2 id="agda-上での-hoarelogicコマンド定義">Agda 上での HoareLogic(コマンド定義)</h2>
347 <ul> 343 <ul>
348 <li>Env は while Program の変数である var n, i</li> 344 <li>Env は while Program の変数である var n, i</li>
349 <li><strong>PrimComm</strong> は代入時に使用される</li> 345 <li><strong>PrimComm</strong> は代入時に使用される</li>
350 <li><strong>Cond</strong> は Condition で Env を受け取って Boolean の値を返す</li> 346 <li><strong>Cond</strong> は Condition で Env を受け取って Boolean の値を返す
351 </ul> 347 <div class="language-AGDA highlighter-coderay"><div class="CodeRay">
352
353 <div class="language-AGDA highlighter-coderay"><div class="CodeRay">
354 <div class="code"><pre><span class="line-numbers"> <a href="#n1" name="n1">1</a></span> record Env : Set where 348 <div class="code"><pre><span class="line-numbers"> <a href="#n1" name="n1">1</a></span> record Env : Set where
355 <span class="line-numbers"> <a href="#n2" name="n2">2</a></span> field 349 <span class="line-numbers"> <a href="#n2" name="n2">2</a></span> field
356 <span class="line-numbers"> <a href="#n3" name="n3">3</a></span> varn : ℕ 350 <span class="line-numbers"> <a href="#n3" name="n3">3</a></span> varn : ℕ
357 <span class="line-numbers"> <a href="#n4" name="n4">4</a></span> vari : ℕ 351 <span class="line-numbers"> <a href="#n4" name="n4">4</a></span> vari : ℕ
358 <span class="line-numbers"> <a href="#n5" name="n5">5</a></span> 352 <span class="line-numbers"> <a href="#n5" name="n5">5</a></span>
361 <span class="line-numbers"> <a href="#n8" name="n8">8</a></span> 355 <span class="line-numbers"> <a href="#n8" name="n8">8</a></span>
362 <span class="line-numbers"> <a href="#n9" name="n9">9</a></span> Cond : Set 356 <span class="line-numbers"> <a href="#n9" name="n9">9</a></span> Cond : Set
363 <span class="line-numbers"><strong><a href="#n10" name="n10">10</a></strong></span> Cond = (Env → Bool) 357 <span class="line-numbers"><strong><a href="#n10" name="n10">10</a></strong></span> Cond = (Env → Bool)
364 </pre></div> 358 </pre></div>
365 </div> 359 </div>
366 </div> 360 </div>
361 </li>
362 </ul>
367 363
368 364
369 365
370 </div> 366 </div>
371 367
375 <ul> 371 <ul>
376 <li><strong>Comm</strong> は Agda のデータ型で定義した HoareLogic の Command 372 <li><strong>Comm</strong> は Agda のデータ型で定義した HoareLogic の Command
377 <ul> 373 <ul>
378 <li><strong>Skip</strong> は何も変更しない</li> 374 <li><strong>Skip</strong> は何も変更しない</li>
379 <li><strong>PComm</strong> は変数を代入する</li> 375 <li><strong>PComm</strong> は変数を代入する</li>
380 <li><strong>Seq</strong> は Command を次の Command に移す</li> 376 <li><strong>Seq</strong> は Command を実行して次の Command に移す</li>
381 <li><strong>If</strong> は Cond と2つの Comm を受け取り Cond の状態により実行する Comm を変える</li> 377 <li><strong>If</strong> は Cond と2つの Comm を受け取り Cond の状態により実行する Comm を変える</li>
382 <li><strong>while</strong> は Cond と Comm を受け取り Cond の中身が真である間 Comm を繰り返す</li> 378 <li><strong>while</strong> は Cond と Comm を受け取り Cond の中身が真である間 Comm を繰り返す
379 <div class="language-AGDA highlighter-coderay"><div class="CodeRay">
380 <div class="code"><pre><span class="line-numbers"><a href="#n1" name="n1">1</a></span>data Comm : Set where
381 <span class="line-numbers"><a href="#n2" name="n2">2</a></span> Skip : Comm
382 <span class="line-numbers"><a href="#n3" name="n3">3</a></span> Abort : Comm
383 <span class="line-numbers"><a href="#n4" name="n4">4</a></span> PComm : PrimComm -&gt; Comm
384 <span class="line-numbers"><a href="#n5" name="n5">5</a></span> Seq : Comm -&gt; Comm -&gt; Comm
385 <span class="line-numbers"><a href="#n6" name="n6">6</a></span> If : Cond -&gt; Comm -&gt; Comm -&gt; Comm
386 <span class="line-numbers"><a href="#n7" name="n7">7</a></span> While : Cond -&gt; Comm -&gt; Comm
387 </pre></div>
388 </div>
389 </div>
390 </li>
383 </ul> 391 </ul>
384 </li> 392 </li>
385 </ul> 393 </ul>
386 394
387 <div class="language-AGDA highlighter-coderay"><div class="CodeRay">
388 <div class="code"><pre><span class="line-numbers"><a href="#n1" name="n1">1</a></span> data Comm : Set where
389 <span class="line-numbers"><a href="#n2" name="n2">2</a></span> Skip : Comm
390 <span class="line-numbers"><a href="#n3" name="n3">3</a></span> Abort : Comm
391 <span class="line-numbers"><a href="#n4" name="n4">4</a></span> PComm : PrimComm -&gt; Comm
392 <span class="line-numbers"><a href="#n5" name="n5">5</a></span> Seq : Comm -&gt; Comm -&gt; Comm
393 <span class="line-numbers"><a href="#n6" name="n6">6</a></span> If : Cond -&gt; Comm -&gt; Comm -&gt; Comm
394 <span class="line-numbers"><a href="#n7" name="n7">7</a></span> While : Cond -&gt; Comm -&gt; Comm
395 </pre></div>
396 </div>
397 </div>
398
399 395
400 396
401 </div> 397 </div>
402 398
403 <div class='slide'> 399 <div class='slide'>
404 <!-- _S9SLIDE_ --> 400 <!-- _S9SLIDE_ -->
405 <h2 id="agda-上での-hoarelogic実際のプログラムの記述">Agda 上での HoareLogic(実際のプログラムの記述)</h2> 401 <h2 id="agda-上での-hoarelogic実際のプログラムの記述">Agda 上での HoareLogic(実際のプログラムの記述)</h2>
406 <ul> 402 <ul>
407 <li>先程の Comm を使ってwhile Program を記述した。</li> 403 <li>Command を使って while Program を記述した。</li>
408 </ul> 404 <li><strong>$</strong> は <strong>()</strong> の糖衣で行頭から行末までを ( ) で囲う
409 405 <ul>
410 <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> 406 <li>見やすさのため改行しているため 3~7 行はまとまっている</li>
407 </ul>
408 </li>
409 <li>Seq は Comm を2つ取って次の Comm に移行する
410 <div class="language-AGDA highlighter-coderay"><div class="CodeRay">
411 <div class="code"><pre><span class="line-numbers"><a href="#n1" name="n1">1</a></span> program : Comm 411 <div class="code"><pre><span class="line-numbers"><a href="#n1" name="n1">1</a></span> program : Comm
412 <span class="line-numbers"><a href="#n2" name="n2">2</a></span> program = 412 <span class="line-numbers"><a href="#n2" name="n2">2</a></span> program =
413 <span class="line-numbers"><a href="#n3" name="n3">3</a></span> Seq ( PComm (λ env → record env {varn = 10})) 413 <span class="line-numbers"><a href="#n3" name="n3">3</a></span> Seq ( PComm (λ env → record env {varn = 10}))
414 <span class="line-numbers"><a href="#n4" name="n4">4</a></span> $ Seq ( PComm (λ env → record env {vari = 0})) 414 <span class="line-numbers"><a href="#n4" name="n4">4</a></span> $ Seq ( PComm (λ env → record env {vari = 0}))
415 <span class="line-numbers"><a href="#n5" name="n5">5</a></span> $ While (λ env → lt zero (varn env ) ) 415 <span class="line-numbers"><a href="#n5" name="n5">5</a></span> $ While (λ env → lt zero (varn env ) )
416 <span class="line-numbers"><a href="#n6" name="n6">6</a></span> (Seq (PComm (λ env → record env {vari = ((vari env) + 1)} )) 416 <span class="line-numbers"><a href="#n6" name="n6">6</a></span> (Seq (PComm (λ env → record env {vari = ((vari env) + 1)} ))
417 <span class="line-numbers"><a href="#n7" name="n7">7</a></span> $ PComm (λ env → record env {varn = ((varn env) - 1)} )) 417 <span class="line-numbers"><a href="#n7" name="n7">7</a></span> $ PComm (λ env → record env {varn = ((varn env) - 1)} ))
418 </pre></div> 418 </pre></div>
419 </div> 419 </div>
420 </div> 420 </div>
421 </li>
422 </ul>
421 423
422 424
423 425
424 </div> 426 </div>
425 427
426 <div class='slide'> 428 <div class='slide'>
427 <!-- _S9SLIDE_ --> 429 <!-- _S9SLIDE_ -->
428 <h2 id="agda-上での-hoarelogicの理解">Agda 上での HoareLogicの理解</h2> 430 <h2 id="agda-上での-hoarelogicの理解">Agda 上での HoareLogicの理解</h2>
429 <ul> 431 <ul>
430 <li>証明規則は HTProof にまとめられてる</li> 432 <li>規則は HTProof にまとめられてる</li>
431 <li><strong>PrimRule</strong> は代入を</li> 433 <li><strong>PrimRule</strong> は <strong>PComm</strong> で行う代入を保証する</li>
432 </ul> 434 <li>3行目の pr の型 Axiom は PreCondition に PrimComm が適用されると PostCondition になることの記述
433 435 <ul>
434 <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> 436 <li><strong><em>⇒</em></strong> は pre, post の Condition をとって post の Condition が成り立つときに True を返す関数</li>
437 </ul>
438 </li>
439 <li>SkipRule は PreCondition を変更しないことの保証</li>
440 <li>AbortRule は プログラムが停止するときのルール
441 <div class="language-AGDA highlighter-coderay"><div class="CodeRay">
435 <div class="code"><pre><span class="line-numbers"><a href="#n1" name="n1">1</a></span> data HTProof : Cond -&gt; Comm -&gt; Cond -&gt; Set where 442 <div class="code"><pre><span class="line-numbers"><a href="#n1" name="n1">1</a></span> data HTProof : Cond -&gt; Comm -&gt; Cond -&gt; Set where
436 <span class="line-numbers"><a href="#n2" name="n2">2</a></span> PrimRule : {bPre : Cond} -&gt; {pcm : PrimComm} -&gt; {bPost : Cond} -&gt; 443 <span class="line-numbers"><a href="#n2" name="n2">2</a></span> PrimRule : {bPre : Cond} -&gt; {pcm : PrimComm} -&gt; {bPost : Cond} -&gt;
437 <span class="line-numbers"><a href="#n3" name="n3">3</a></span> (pr : Axiom bPre pcm bPost) -&gt; 444 <span class="line-numbers"><a href="#n3" name="n3">3</a></span> (pr : Axiom bPre pcm bPost) -&gt;
438 <span class="line-numbers"><a href="#n4" name="n4">4</a></span> HTProof bPre (PComm pcm) bPost 445 <span class="line-numbers"><a href="#n4" name="n4">4</a></span> HTProof bPre (PComm pcm) bPost
439 <span class="line-numbers"><a href="#n5" name="n5">5</a></span> SkipRule : (b : Cond) -&gt; HTProof b Skip b 446 <span class="line-numbers"><a href="#n5" name="n5">5</a></span> SkipRule : (b : Cond) -&gt; HTProof b Skip b
440 <span class="line-numbers"><a href="#n6" name="n6">6</a></span> AbortRule : (bPre : Cond) -&gt; (bPost : Cond) -&gt; 447 <span class="line-numbers"><a href="#n6" name="n6">6</a></span> AbortRule : (bPre : Cond) -&gt; (bPost : Cond) -&gt;
441 <span class="line-numbers"><a href="#n7" name="n7">7</a></span> HTProof bPre Abort bPost 448 <span class="line-numbers"><a href="#n7" name="n7">7</a></span> HTProof bPre Abort bPost
442 <span class="line-numbers"><a href="#n8" name="n8">8</a></span>-- 次のスライドに続く 449 <span class="line-numbers"><a href="#n8" name="n8">8</a></span>-- 次のスライドに続く
443 </pre></div> 450 </pre></div>
444 </div> 451 </div>
445 </div> 452 </div>
453 <div class="language-AGDA highlighter-coderay"><div class="CodeRay">
454 <div class="code"><pre><span class="line-numbers"><a href="#n1" name="n1">1</a></span> Axiom : Cond -&gt; PrimComm -&gt; Cond -&gt; Set
455 <span class="line-numbers"><a href="#n2" name="n2">2</a></span> Axiom pre comm post = ∀ (env : Env) → (pre env) ⇒ ( post (comm env)) ≡ true
456 </pre></div>
457 </div>
458 </div>
459 </li>
460 </ul>
446 461
447 462
448 463
449 </div> 464 </div>
450 465
451 <div class='slide'> 466 <div class='slide'>
452 <!-- _S9SLIDE_ --> 467 <!-- _S9SLIDE_ -->
453 <h2 id="agda-上での-hoarelogicの理解-1">Agda 上での HoareLogicの理解</h2> 468 <h2 id="agda-上での-hoarelogicの理解-1">Agda 上での HoareLogicの理解</h2>
454 <ul> 469 <ul>
455 <li></li> 470 <li><strong>SeqRule</strong> は Command を推移させる Seq の保証</li>
456 </ul> 471 <li><strong>IfRule</strong> は If の Command が正しく動くことを保証
457 472 <div class="language-AGDA highlighter-coderay"><div class="CodeRay">
458 <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> 473 <div class="code"><pre><span class="line-numbers"> <a href="#n1" name="n1">1</a></span>-- HTProof の続き
474 <span class="line-numbers"> <a href="#n2" name="n2">2</a></span> SeqRule : {bPre : Cond} -&gt; {cm1 : Comm} -&gt; {bMid : Cond} -&gt;
475 <span class="line-numbers"> <a href="#n3" name="n3">3</a></span> {cm2 : Comm} -&gt; {bPost : Cond} -&gt;
476 <span class="line-numbers"> <a href="#n4" name="n4">4</a></span> HTProof bPre cm1 bMid -&gt;
477 <span class="line-numbers"> <a href="#n5" name="n5">5</a></span> HTProof bMid cm2 bPost -&gt;
478 <span class="line-numbers"> <a href="#n6" name="n6">6</a></span> HTProof bPre (Seq cm1 cm2) bPost
479 <span class="line-numbers"> <a href="#n7" name="n7">7</a></span> IfRule : {cmThen : Comm} -&gt; {cmElse : Comm} -&gt;
480 <span class="line-numbers"> <a href="#n8" name="n8">8</a></span> {bPre : Cond} -&gt; {bPost : Cond} -&gt;
481 <span class="line-numbers"> <a href="#n9" name="n9">9</a></span> {b : Cond} -&gt;
482 <span class="line-numbers"><strong><a href="#n10" name="n10">10</a></strong></span> HTProof (bPre /\ b) cmThen bPost -&gt;
483 <span class="line-numbers"><a href="#n11" name="n11">11</a></span> HTProof (bPre /\ neg b) cmElse bPost -&gt;
484 <span class="line-numbers"><a href="#n12" name="n12">12</a></span> HTProof bPre (If b cmThen cmElse) bPost
485 </pre></div>
486 </div>
487 </div>
488 </li>
489 </ul>
490
491
492
493 </div>
494
495 <div class='slide'>
496 <!-- _S9SLIDE_ -->
497 <h2 id="agda-上での-hoarelogicの理解-2">Agda 上での HoareLogicの理解</h2>
498 <ul>
499 <li><strong>WeakeningRule</strong> は通常の Condition からループ不変条件(Loop Invaliant)に変換</li>
500 <li>Tautology は Condition と不変条件が等しく成り立つ</li>
501 <li><strong>WhileRule</strong> はループ不変条件が成り立つ間 Comm を繰り返す
502 <div class="language-AGDA highlighter-coderay"><div class="CodeRay">
459 <div class="code"><pre><span class="line-numbers"> <a href="#n1" name="n1">1</a></span>-- HTProof の続き 503 <div class="code"><pre><span class="line-numbers"> <a href="#n1" name="n1">1</a></span>-- HTProof の続き
460 <span class="line-numbers"> <a href="#n2" name="n2">2</a></span> WeakeningRule : {bPre : Cond} -&gt; {bPre' : Cond} -&gt; {cm : Comm} -&gt; 504 <span class="line-numbers"> <a href="#n2" name="n2">2</a></span> WeakeningRule : {bPre : Cond} -&gt; {bPre' : Cond} -&gt; {cm : Comm} -&gt;
461 <span class="line-numbers"> <a href="#n3" name="n3">3</a></span> {bPost' : Cond} -&gt; {bPost : Cond} -&gt; 505 <span class="line-numbers"> <a href="#n3" name="n3">3</a></span> {bPost' : Cond} -&gt; {bPost : Cond} -&gt;
462 <span class="line-numbers"> <a href="#n4" name="n4">4</a></span> Tautology bPre bPre' -&gt; 506 <span class="line-numbers"> <a href="#n4" name="n4">4</a></span> Tautology bPre bPre' -&gt;
463 <span class="line-numbers"> <a href="#n5" name="n5">5</a></span> HTProof bPre' cm bPost' -&gt; 507 <span class="line-numbers"> <a href="#n5" name="n5">5</a></span> HTProof bPre' cm bPost' -&gt;
464 <span class="line-numbers"> <a href="#n6" name="n6">6</a></span> Tautology bPost' bPost -&gt; 508 <span class="line-numbers"> <a href="#n6" name="n6">6</a></span> Tautology bPost' bPost -&gt;
465 <span class="line-numbers"> <a href="#n7" name="n7">7</a></span> HTProof bPre cm bPost 509 <span class="line-numbers"> <a href="#n7" name="n7">7</a></span> HTProof bPre cm bPost
466 <span class="line-numbers"> <a href="#n8" name="n8">8</a></span> SeqRule : {bPre : Cond} -&gt; {cm1 : Comm} -&gt; {bMid : Cond} -&gt; 510 <span class="line-numbers"> <a href="#n8" name="n8">8</a></span> WhileRule : {cm : Comm} -&gt; {bInv : Cond} -&gt; {b : Cond} -&gt;
467 <span class="line-numbers"> <a href="#n9" name="n9">9</a></span> {cm2 : Comm} -&gt; {bPost : Cond} -&gt; 511 <span class="line-numbers"> <a href="#n9" name="n9">9</a></span> HTProof (bInv /\ b) cm bInv -&gt;
468 <span class="line-numbers"><strong><a href="#n10" name="n10">10</a></strong></span> HTProof bPre cm1 bMid -&gt; 512 <span class="line-numbers"><strong><a href="#n10" name="n10">10</a></strong></span> HTProof bInv (While b cm) (bInv /\ neg b)
469 <span class="line-numbers"><a href="#n11" name="n11">11</a></span> HTProof bMid cm2 bPost -&gt; 513 </pre></div>
470 <span class="line-numbers"><a href="#n12" name="n12">12</a></span> HTProof bPre (Seq cm1 cm2) bPost 514 </div>
471 <span class="line-numbers"><a href="#n13" name="n13">13</a></span> IfRule : {cmThen : Comm} -&gt; {cmElse : Comm} -&gt; 515 </div>
472 <span class="line-numbers"><a href="#n14" name="n14">14</a></span> {bPre : Cond} -&gt; {bPost : Cond} -&gt; 516 <div class="language-AGDA highlighter-coderay"><div class="CodeRay">
473 <span class="line-numbers"><a href="#n15" name="n15">15</a></span> {b : Cond} -&gt; 517 <div class="code"><pre><span class="line-numbers"><a href="#n1" name="n1">1</a></span> Tautology : Cond -&gt; Cond -&gt; Set
474 <span class="line-numbers"><a href="#n16" name="n16">16</a></span> HTProof (bPre /\ b) cmThen bPost -&gt; 518 <span class="line-numbers"><a href="#n2" name="n2">2</a></span> Tautology pre post = ∀ (env : Env) → (pre env) ⇒ (post env) ≡ true
475 <span class="line-numbers"><a href="#n17" name="n17">17</a></span> HTProof (bPre /\ neg b) cmElse bPost -&gt; 519 </pre></div>
476 <span class="line-numbers"><a href="#n18" name="n18">18</a></span> HTProof bPre (If b cmThen cmElse) bPost 520 </div>
477 <span class="line-numbers"><a href="#n19" name="n19">19</a></span> WhileRule : {cm : Comm} -&gt; {bInv : Cond} -&gt; {b : Cond} -&gt; 521 </div>
478 <span class="line-numbers"><strong><a href="#n20" name="n20">20</a></strong></span> HTProof (bInv /\ b) cm bInv -&gt; 522 </li>
479 <span class="line-numbers"><a href="#n21" name="n21">21</a></span> HTProof bInv (While b cm) (bInv /\ neg b) 523 </ul>
480 </pre></div>
481 </div>
482 </div>
483 524
484 525
485 526
486 </div> 527 </div>
487 528
488 <div class='slide'> 529 <div class='slide'>
489 <!-- _S9SLIDE_ --> 530 <!-- _S9SLIDE_ -->
490 <h2 id="agda-上での-hoarelogic証明">Agda 上での HoareLogic(証明)</h2> 531 <h2 id="agda-上での-hoarelogic証明">Agda 上での HoareLogic(証明)</h2>
491 532 <ul>
492 <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> 533 <li><strong>proof1</strong> は while Program の証明</li>
493 <div class="code"><pre><span class="line-numbers"><a href="#n1" name="n1">1</a></span> proof1 : HTProof initCond program termCond 534 <li>HTProof に 初期状態とコマンドで書かれた <strong>program</strong> と終了状態を渡す</li>
494 <span class="line-numbers"><a href="#n2" name="n2">2</a></span> proof1 = 535 <li>lemma1~5は rule それぞれの証明</li>
495 <span class="line-numbers"><a href="#n3" name="n3">3</a></span> SeqRule {λ e → true} ( PrimRule empty-case ) 536 <li>
496 <span class="line-numbers"><a href="#n4" name="n4">4</a></span> $ SeqRule {λ e → Equal (varn e) 10} ( PrimRule lemma1 ) 537 <div class="language-AGDA highlighter-coderay"><div class="CodeRay">
497 <span class="line-numbers"><a href="#n5" name="n5">5</a></span> $ WeakeningRule {λ e → (Equal (varn e) 10) ∧ (Equal (vari e) 0)} lemma2 ( 538 <div class="code"><pre><span class="line-numbers"> <a href="#n1" name="n1">1</a></span>proof1 : HTProof initCond program termCond
498 <span class="line-numbers"><a href="#n6" name="n6">6</a></span> WhileRule {_} {λ e → Equal ((varn e) + (vari e)) 10} 539 <span class="line-numbers"> <a href="#n2" name="n2">2</a></span>proof1 =
499 <span class="line-numbers"><a href="#n7" name="n7">7</a></span> $ SeqRule (PrimRule {λ e → whileInv e ∧ lt zero (varn e) } lemma3 ) 540 <span class="line-numbers"> <a href="#n3" name="n3">3</a></span> SeqRule {λ e → true} ( PrimRule empty-case )
500 <span class="line-numbers"><a href="#n8" name="n8">8</a></span> $ PrimRule {whileInv'} {_} {whileInv} lemma4 ) lemma5 541 <span class="line-numbers"> <a href="#n4" name="n4">4</a></span> $ SeqRule {λ e → Equal (varn e) 10} ( PrimRule lemma1 )
501 </pre></div> 542 <span class="line-numbers"> <a href="#n5" name="n5">5</a></span> $ WeakeningRule {λ e → (Equal (varn e) 10) ∧ (Equal (vari e) 0)} lemma2 (
502 </div> 543 <span class="line-numbers"> <a href="#n6" name="n6">6</a></span> WhileRule {_} {λ e → Equal ((varn e) + (vari e)) 10}
503 </div> 544 <span class="line-numbers"> <a href="#n7" name="n7">7</a></span> $ SeqRule (PrimRule {λ e → whileInv e ∧ lt zero (varn e) } lemma3 )
545 <span class="line-numbers"> <a href="#n8" name="n8">8</a></span> $ PrimRule {whileInv'} {_} {whileInv} lemma4 ) lemma5
546 <span class="line-numbers"> <a href="#n9" name="n9">9</a></span>
547 <span class="line-numbers"><strong><a href="#n10" name="n10">10</a></strong></span>initCond : Cond
548 <span class="line-numbers"><a href="#n11" name="n11">11</a></span>initCond env = true
549 <span class="line-numbers"><a href="#n12" name="n12">12</a></span>
550 <span class="line-numbers"><a href="#n13" name="n13">13</a></span>termCond : {c10 : ℕ} → Cond
551 <span class="line-numbers"><a href="#n14" name="n14">14</a></span>termCond {c10} env = Equal (vari env) c10
552 </pre></div>
553 </div>
554 </div>
555 </li>
556 </ul>
557
558 <p><!-- program : Comm -->
559 <!-- program = -->
560 <!-- Seq ( PComm (λ env → record env {varn = 10})) -->
561 <!-- $ Seq ( PComm (λ env → record env {vari = 0})) -->
562 <!-- $ While (λ env → lt zero (varn env ) ) -->
563 <!-- (Seq (PComm (λ env → record env {vari = ((vari env) + 1)} )) -->
564 <!-- $ PComm (λ env → record env {varn = ((varn env) - 1)} )) --></p>
565
566
567
568 </div>
569
570 <div class='slide'>
571 <!-- _S9SLIDE_ -->
572 <h2 id="証明の一部">証明の一部</h2>
573 <ul>
574 <li>型だけ載せる</li>
575 <li>基本的な証明方法は Condtition を変化させて次の Condition が成り立つように変形する</li>
576 <li>impl⇒
577 <div class="language-AGDA highlighter-coderay"><div class="CodeRay">
578 <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})
579 <span class="line-numbers"> <a href="#n2" name="n2">2</a></span> lemma1 {c10} env = impl⇒ ( λ cond → let open ≡-Reasoning in
580 <span class="line-numbers"> <a href="#n3" name="n3">3</a></span> begin
581 <span class="line-numbers"> <a href="#n4" name="n4">4</a></span> (Equal (varn env) c10 ) ∧ true
582 <span class="line-numbers"> <a href="#n5" name="n5">5</a></span> ≡⟨ ∧true ⟩
583 <span class="line-numbers"> <a href="#n6" name="n6">6</a></span> Equal (varn env) c10
584 <span class="line-numbers"> <a href="#n7" name="n7">7</a></span> ≡⟨ cond ⟩
585 <span class="line-numbers"> <a href="#n8" name="n8">8</a></span> true
586 <span class="line-numbers"> <a href="#n9" name="n9">9</a></span> ∎ )
587 </pre></div>
588 </div>
589 </div>
590
591 <p><!-- lemma2 : {c10 : ℕ} → Tautology stmt2Cond whileInv --></p>
592
593 <p><!-- lemma3 : Axiom (λ e → whileInv e ∧ lt zero (varn e)) (λ env → record { varn = varn env ; vari = vari env + 1 }) whileInv' --></p>
594
595 <p><!-- lemma4 : {c10 : ℕ} → Axiom whileInv' (λ env → record { varn = varn env - 1 ; vari = vari env }) whileInv --></p>
596
597 <p><!-- lemma5 : {c10 : ℕ} → Tautology ((λ e → Equal (varn e + vari e) c10) and (neg (λ z → lt zero (varn z)))) termCond --></p>
598 </li>
599 </ul>
504 600
505 601
506 602
507 </div> 603 </div>
508 604
513 <li>Agda での CodeGear は通常の関数とは異なり、継続渡し (CPS : Continuation Passing Style) で記述された関数</li> 609 <li>Agda での CodeGear は通常の関数とは異なり、継続渡し (CPS : Continuation Passing Style) で記述された関数</li>
514 <li>CPS の関数は引数として継続を受け取って継続に計算結果を渡す</li> 610 <li>CPS の関数は引数として継続を受け取って継続に計算結果を渡す</li>
515 <li><strong>名前 : 引数 -&gt; (Code : fa -&gt; t) -&gt; t</strong></li> 611 <li><strong>名前 : 引数 -&gt; (Code : fa -&gt; t) -&gt; t</strong></li>
516 <li><strong>t</strong> は継続</li> 612 <li><strong>t</strong> は継続</li>
517 <li><strong>(Code : fa -&gt; t)</strong> は次の継続先</li> 613 <li><strong>(Code : fa -&gt; t)</strong> は次の継続先</li>
518 <li>DataGear は Agda での CodeGear に使われる引数</li> 614 <li>DataGear は Agda での CodeGear に使われる引数
615 <div class="language-AGDA highlighter-coderay"><div class="CodeRay">
616 <div class="code"><pre><span class="line-numbers"><a href="#n1" name="n1">1</a></span>_g-_ : {t : Set} → ℕ → ℕ → (Code : ℕ → t) → t
617 <span class="line-numbers"><a href="#n2" name="n2">2</a></span>x g- zero next = next x
618 <span class="line-numbers"><a href="#n3" name="n3">3</a></span>zero g- _ = next zero
619 <span class="line-numbers"><a href="#n4" name="n4">4</a></span>(suc x) g- (suc y) = next (x g- y)
620 </pre></div>
621 </div>
622 </div>
623 </li>
519 </ul> 624 </ul>
520 625
521 626
522 627
523 </div> 628 </div>
525 <div class='slide'> 630 <div class='slide'>
526 <!-- _S9SLIDE_ --> 631 <!-- _S9SLIDE_ -->
527 <h2 id="gears-をベースにした-hoarelogic">Gears をベースにした HoareLogic</h2> 632 <h2 id="gears-をベースにした-hoarelogic">Gears をベースにした HoareLogic</h2>
528 <ul> 633 <ul>
529 <li>次に Gears をベースにした while Program をみる。</li> 634 <li>次に Gears をベースにした while Program をみる。</li>
530 <li>このプログラムは c10</li> 635 <li>このプログラムは自然数と継続先を受け取って t を返す
531 </ul> 636 <div class="language-AGDA highlighter-coderay"><div class="CodeRay">
532 637 <div class="code"><pre><span class="line-numbers"><a href="#n1" name="n1">1</a></span> {-# TERMINATING #-}
533 <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> 638 <span class="line-numbers"><a href="#n2" name="n2">2</a></span> whileLoop : {l : Level} {t : Set l} -&gt; Env -&gt; (Code : Env -&gt; t) -&gt; t
534 <div class="code"><pre><span class="line-numbers"><a href="#n1" name="n1">1</a></span> whileTest : {l : Level} {t : Set l} -&gt; {c10 : ℕ } → (Code : (env : Env) -&gt; 639 <span class="line-numbers"><a href="#n3" name="n3">3</a></span> whileLoop env next with lt 0 (varn env)
535 <span class="line-numbers"><a href="#n2" name="n2">2</a></span> ((vari env) ≡ 0) /\ ((varn env) ≡ c10) -&gt; t) -&gt; t 640 <span class="line-numbers"><a href="#n4" name="n4">4</a></span> whileLoop env next | false = next env
536 <span class="line-numbers"><a href="#n3" name="n3">3</a></span> whileTest {_} {_} {c10} next = next env proof2 641 <span class="line-numbers"><a href="#n5" name="n5">5</a></span> whileLoop env next | true =
537 <span class="line-numbers"><a href="#n4" name="n4">4</a></span> where 642 <span class="line-numbers"><a href="#n6" name="n6">6</a></span> whileLoop (record {varn = (varn env) - 1 ; vari = (vari env) + 1}) next
538 <span class="line-numbers"><a href="#n5" name="n5">5</a></span> env : Env 643 </pre></div>
539 <span class="line-numbers"><a href="#n6" name="n6">6</a></span> env = record {vari = 0 ; varn = c10} 644 </div>
540 <span class="line-numbers"><a href="#n7" name="n7">7</a></span> proof2 : ((vari env) ≡ 0) /\ ((varn env) ≡ c10) 645 </div>
541 <span class="line-numbers"><a href="#n8" name="n8">8</a></span> proof2 = record {pi1 = refl ; pi2 = refl} 646 </li>
542 </pre></div> 647 </ul>
543 </div>
544 </div>
545 648
546 649
547 650
548 </div> 651 </div>
549 652
550 <div class='slide'> 653 <div class='slide'>
551 <!-- _S9SLIDE_ --> 654 <!-- _S9SLIDE_ -->
552 <h2 id="gears-と-hoarelogic-をベースにした証明">Gears と HoareLogic をベースにした証明</h2> 655 <h2 id="gears-と-hoarelogic-をベースにした証明">Gears と HoareLogic をベースにした証明</h2>
553 <ul> 656 <ul>
554 <li>ここでは</li> 657 <li>ここでは
555 </ul> 658 <div class="language-AGDA highlighter-coderay"><div class="CodeRay">
556 659 <div class="code"><pre><span class="line-numbers"><a href="#n1" name="n1">1</a></span> proofGears : {c10 : ℕ } → Set
557 <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> 660 <span class="line-numbers"><a href="#n2" name="n2">2</a></span> proofGears {c10} = whileTest' {_} {_} {c10} (λ n p1 → conversion1 n p1
558 <div class="code"><pre><span class="line-numbers"><a href="#n1" name="n1">1</a></span> proofGears : {c10 : ℕ } → Set 661 <span class="line-numbers"><a href="#n3" name="n3">3</a></span> (λ n1 p2 → whileLoop' n1 p2 (λ n2 → ( vari n2 ≡ c10 ))))
559 <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 )))) 662 </pre></div>
560 </pre></div> 663 </div>
561 </div> 664 </div>
562 </div> 665 </li>
666 </ul>
563 667
564 <p>&lt;–! 668 <p>&lt;–!
565 [論文目次] 669 [論文目次]
566 まえがき</p> 670 まえがき</p>
567 671