Mercurial > hg > Papers > 2019 > ryokka-sigss
comparison slide/slide.html @ 14:b711209123f7
update
author | ryokka |
---|---|
date | Tue, 15 Jan 2019 17:47:18 +0900 |
parents | e8fe28afe61e |
children | 07e1ccdfd844 |
comparison
equal
deleted
inserted
replaced
13:fde9ee0cc8ae | 14:b711209123f7 |
---|---|
170 <!-- _S9SLIDE_ --> | 170 <!-- _S9SLIDE_ --> |
171 <h2 id="agda-とは">Agda とは</h2> | 171 <h2 id="agda-とは">Agda とは</h2> |
172 <ul> | 172 <ul> |
173 <li>Agda は定理証明支援系の言語</li> | 173 <li>Agda は定理証明支援系の言語</li> |
174 <li>依存型を持つ関数型言語</li> | 174 <li>依存型を持つ関数型言語</li> |
175 <li>型を明記する必要がある</li> | 175 <li>Curry-Howard の証明支援系</li> |
176 <li>型と値がある</li> | |
176 <li>Agda の文法については次のスライドから軽く説明する</li> | 177 <li>Agda の文法については次のスライドから軽く説明する</li> |
177 </ul> | 178 </ul> |
178 | 179 |
179 | 180 |
180 | 181 |
181 </div> | 182 </div> |
182 | 183 |
183 <div class='slide'> | 184 <div class='slide'> |
184 <!-- _S9SLIDE_ --> | 185 <!-- _S9SLIDE_ --> |
185 <h2 id="agda-のデータ型">Agda のデータ型</h2> | 186 <h2 id="agda-での-gears-の記述whileloop">Agda での Gears の記述(whileLoop)</h2> |
186 <ul> | 187 <ul> |
187 <li>データ型は代数的なデータ構造</li> | 188 <li>Agda での CodeGear は通常の関数とは異なり、継続渡し (CPS : Continuation Passing Style) で記述された関数</li> |
188 <li><strong>data</strong> キーワードの後に、<strong>名前 : 型</strong></li> | 189 <li>CPS の関数は引数として継続を受け取って継続に計算結果を渡す</li> |
189 <li>次の行以降は<strong>コンストラクタ名 : 型</strong></li> | 190 <li><strong>名前 : 引数 → (Code : fa → t) → t</strong></li> |
190 <li>型は<strong>-></strong>または<strong>→</strong>で繋げる | 191 <li><strong>t</strong> は継続</li> |
191 <ul> | 192 <li><strong>(Code : fa → t)</strong> は次の継続先</li> |
192 <li>例えば、suc の型<strong>Nat → Nat*は</strong>Nat** を受け取り<strong>Nat</strong>を返す型</li> | 193 <li>DataGear は Agda での CodeGear に使われる引数 |
193 <li>これにより 3 を suc (suc (suc zero)) のように表せる | 194 <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> |
194 <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> | 195 <div class="code"><pre>whileTest : {l : Level} {t : Set l} -> (c10 : ℕ) |
195 <div class="code"><pre><span class="line-numbers"><a href="#n1" name="n1">1</a></span> data Nat : Set where | 196 → (Code : Env -> t) -> t |
196 <span class="line-numbers"><a href="#n2" name="n2">2</a></span> zero : Nat | 197 whileTest c10 next = next (record {varn = c10 ; vari = 0} ) |
197 <span class="line-numbers"><a href="#n3" name="n3">3</a></span> suc : Nat → Nat | 198 </pre></div> |
198 </pre></div> | 199 </div> |
199 </div> | 200 </div> |
200 </div> | 201 </li> |
201 </li> | 202 </ul> |
202 </ul> | 203 |
203 </li> | 204 |
204 </ul> | 205 |
205 | 206 </div> |
206 <!-- - where は宣言した部分に束縛する --> | 207 |
207 | 208 <div class='slide'> |
208 | 209 <!-- _S9SLIDE_ --> |
209 | 210 <h2 id="agda-での-gears-の記述whileloop-1">Agda での Gears の記述(whileLoop)</h2> |
210 </div> | 211 <ul> |
211 | 212 <li>関数の動作を条件で変えたいときはパターンマッチを行う</li> |
212 <div class='slide'> | 213 <li>whileLoop は varn が 0 より大きい間ループする |
213 <!-- _S9SLIDE_ --> | 214 <ul> |
214 <h2 id="agda-のレコード型">Agda のレコード型</h2> | 215 <li>lt は Nat を2つ受け取って値の大小を比較 |
215 <ul> | 216 ```AGDA |
216 <li>C 言語での構造体に近い</li> | 217 {-# TERMINATING #-} |
217 <li>複数のデータをまとめる</li> | 218 whileLoop : {l : Level} {t : Set l} -> Env |
218 <li>関数内で構築できる</li> | 219 -> (Code : Env -> t) -> t |
219 <li>構築時は<strong>record レコード名 {フィールド名 = 値}</strong></li> | 220 whileLoop env next with lt 0 (varn env) |
220 <li>複数ある場合は <strong>record Env {varn = 1 ; varn = 2}</strong>のように <strong>;</strong> を使って列挙 | 221 whileLoop env next | false = next env |
221 <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> | 222 whileLoop env next | true = |
222 <div class="code"><pre><span class="line-numbers"><a href="#n1" name="n1">1</a></span> record Env : Set where | 223 whileLoop (record {varn = (varn env) - 1 |
223 <span class="line-numbers"><a href="#n2" name="n2">2</a></span> field | 224 ; vari = (vari env) + 1}) next</li> |
224 <span class="line-numbers"><a href="#n3" name="n3">3</a></span> varn : Nat | 225 </ul> |
225 <span class="line-numbers"><a href="#n4" name="n4">4</a></span> vari : Nat | 226 </li> |
226 </pre></div> | 227 </ul> |
227 </div> | 228 |
228 </div> | 229 <p>lt : Nat → Nat → Bool</p> |
229 </li> | 230 <pre><code> |
230 </ul> | 231 ## Agda での DataGear |
231 | 232 - **DataGear** は CodeGear の引数 |
232 | 233 - **データ型**と**レコード型**がある |
233 | 234 - データ型は一つのデータ |
234 </div> | 235 ```AGDA |
235 | 236 data Nat : Set where |
236 <div class='slide'> | 237 zero : Nat |
237 <!-- _S9SLIDE_ --> | 238 suc : Nat → Nat |
238 <h2 id="agda-の関数">Agda の関数</h2> | 239 </code></pre> |
239 <ul> | 240 <ul> |
240 <li>関数にも型が必要(1行目) | 241 <li>レコード型は複数のデータをまとめる |
241 <ul> | 242 <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> |
242 <li>引き算はは自然数を2つ取って結果の自然数を返す</li> | 243 <div class="code"><pre>record Env : Set where |
243 <li><strong>_</strong> は任意の値、名前で使うと受け取った引数が順番に入る</li> | 244 field |
244 </ul> | 245 varn : Nat |
245 </li> | 246 vari : Nat |
246 <li>関数本体は <strong>関数名 = 値</strong></li> | 247 </pre></div> |
247 <li>関数ではパターンマッチがかける | 248 </div> |
248 <ul> | 249 </div> |
249 <li>ここでは関数名に <strong>_</strong> を使っているため<strong>Nat</strong>の定義にから zero かそれ以外でパターンマッチ | |
250 <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> | |
251 <div class="code"><pre><span class="line-numbers"><a href="#n1" name="n1">1</a></span> _-_ : Nat → Nat → Nat | |
252 <span class="line-numbers"><a href="#n2" name="n2">2</a></span> x - zero = x | |
253 <span class="line-numbers"><a href="#n3" name="n3">3</a></span> zero - _ = zero | |
254 <span class="line-numbers"><a href="#n4" name="n4">4</a></span> (suc x) - (suc y) = x - y | |
255 </pre></div> | |
256 </div> | |
257 </div> | |
258 </li> | |
259 </ul> | |
260 </li> | 250 </li> |
261 </ul> | 251 </ul> |
262 | 252 |
263 | 253 |
264 | 254 |
274 <li><strong>{}</strong> は暗黙的(推論される)</li> | 264 <li><strong>{}</strong> は暗黙的(推論される)</li> |
275 <li>下のコードは Bool型の x と true の and を取ったものは x と等しいことの証明 | 265 <li>下のコードは Bool型の x と true の and を取ったものは x と等しいことの証明 |
276 <ul> | 266 <ul> |
277 <li><strong>refl</strong> は <strong>x == x</strong> の左右の項が等しいことの証明 | 267 <li><strong>refl</strong> は <strong>x == x</strong> の左右の項が等しいことの証明 |
278 <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> | 268 <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> |
279 <div class="code"><pre><span class="line-numbers"><a href="#n1" name="n1">1</a></span> ∧true : { x : Bool } → x ∧ true ≡ x | 269 <div class="code"><pre>∧true : { x : Bool } → x ∧ true ≡ x |
280 <span class="line-numbers"><a href="#n2" name="n2">2</a></span> ∧true {x} with x | 270 ∧true {x} with x |
281 <span class="line-numbers"><a href="#n3" name="n3">3</a></span> ∧true {x} | false = refl | 271 ∧true {x} | false = refl |
282 <span class="line-numbers"><a href="#n4" name="n4">4</a></span> ∧true {x} | true = refl | 272 ∧true {x} | true = refl |
283 </pre></div> | 273 </pre></div> |
284 </div> | 274 </div> |
285 </div> | 275 </div> |
286 </li> | 276 </li> |
277 </ul> | |
278 </li> | |
279 </ul> | |
280 | |
281 | |
282 | |
283 </div> | |
284 | |
285 <div class='slide'> | |
286 <!-- _S9SLIDE_ --> | |
287 <h2 id="gears-をベースにした-hoarelogic-と証明全体">Gears をベースにした HoareLogic と証明(全体)</h2> | |
288 <ul> | |
289 <li>Gears をベースにした while Program で実行できる | |
290 <ul> | |
291 <li>これは証明も持っている</li> | |
292 </ul> | |
293 </li> | |
294 <li>whileループを任意の回数にするため<strong>c10</strong>は引数</li> | |
295 <li>whileTest’ の継続に conversion1、その継続に whileLoop’ が来て最後の継続に vari が c10 と等しい | |
296 <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> | |
297 <div class="code"><pre>proofGears : {c10 : Nat } → Set | |
298 proofGears {c10} = whileTest' {_} {_} {c10} (λ n p1 → conversion1 n p1 | |
299 (λ n1 p2 → whileLoop' n1 p2 (λ n2 → ( vari n2 ≡ c10 )))) | |
300 </pre></div> | |
301 </div> | |
302 </div> | |
303 </li> | |
304 </ul> | |
305 | |
306 | |
307 | |
308 </div> | |
309 | |
310 <div class='slide'> | |
311 <!-- _S9SLIDE_ --> | |
312 <h2 id="gears-と-hoarelogic-をベースにした証明whiletest">Gears と HoareLogic をベースにした証明(whileTest)</h2> | |
313 <ul> | |
314 <li>最初の Command なので PreCondition がない</li> | |
315 <li>proof2は Post Condition が成り立つことの証明 | |
316 <ul> | |
317 <li><strong><em>/\</em></strong> は pi1 と pi2 のフィールドをもつレコード型</li> | |
318 <li>2つのものを引数に取り、両方が同時に成り立つことを示す</li> | |
319 </ul> | |
320 </li> | |
321 <li>Gears での PostCondition は <strong>引数 → (Code : fa → PostCondition → t) → t</strong> | |
322 <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> | |
323 <div class="code"><pre>whileTest' : {l : Level} {t : Set l} → {c10 : Nat } → | |
324 (Code : (env : Env) → | |
325 ((vari env) ≡ 0) /\ ((varn env) ≡ c10) → t) → t | |
326 hileTest' {_} {_} {c10} next = next env proof2 | |
327 where | |
328 env : Env | |
329 env = record {vari = 0 ; varn = c10} | |
330 proof2 : ((vari env) ≡ 0) /\ ((varn env) ≡ c10) <-- PostCondition | |
331 proof2 = record {pi1 = refl ; pi2 = refl} | |
332 </pre></div> | |
333 </div> | |
334 </div> | |
335 </li> | |
336 </ul> | |
337 | |
338 | |
339 | |
340 </div> | |
341 | |
342 <div class='slide'> | |
343 <!-- _S9SLIDE_ --> | |
344 <h2 id="gears-と-hoarelogic-をベースにした証明conversion">Gears と HoareLogic をベースにした証明(conversion)</h2> | |
345 <ul> | |
346 <li>conversion は Condition から LoopInvaliant への変換を行う CodeGear | |
347 <ul> | |
348 <li>Condition の条件は Loop 内では厳しいのでゆるくする</li> | |
349 </ul> | |
350 </li> | |
351 <li>proof4 は LoopInvaliant の証明</li> | |
352 <li>Gears での HoareLogic の完全な記述は <strong>引数 → PreCondition → (Code : fa → PostCondition → t) → t</strong> | |
353 ```AGDA | |
354 conversion1 : {l : Level} {t : Set l } → (env : Env) → {c10 : Nat } → | |
355 ((vari env) ≡ 0) /\ ((varn env) ≡ c10) | |
356 → (Code : (env1 : Env) → (varn env1 + vari env1 ≡ c10) → t) → t | |
357 conversion1 env {c10} p1 next = next env proof4 | |
358 where | |
359 proof4 : varn env + vari env ≡ c10</li> | |
360 </ul> | |
361 | |
362 <pre><code> | |
363 | |
364 ## Agdaでの証明(≡-Reasoning) | |
365 - Agda では証明の項を書き換える構文が用意されている | |
366 ```AGDA | |
367 proof4 : varn env + vari env ≡ c10 | |
368 proof4 = let open ≡-Reasoning in | |
369 begin | |
370 varn env + vari env | |
371 ≡⟨ cong ( λ n → n + vari env ) (pi2 p1 ) ⟩ | |
372 c10 + vari env | |
373 ≡⟨ cong ( λ n → c10 + n ) (pi1 p1 ) ⟩ | |
374 c10 + 0 | |
375 ≡⟨ +-sym {c10} {0} ⟩ | |
376 c10 | |
377 ∎ | |
378 </code></pre> | |
379 | |
380 | |
381 | |
382 </div> | |
383 | |
384 <div class='slide'> | |
385 <!-- _S9SLIDE_ --> | |
386 <h2 id="gears-と-hoarelogic-をベースにした証明全体">Gears と HoareLogic をベースにした証明(全体)</h2> | |
387 <ul> | |
388 <li>最終状態で返ってくる i の値は c10 と一致する</li> | |
389 <li>これにより証明が可能 | |
390 <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> | |
391 <div class="code"><pre> proofGears : {c10 : Nat } → Set | |
392 proofGears {c10} = whileTest' {_} {_} {c10} (λ n p1 → conversion1 n p1 | |
393 (λ n1 p2 → whileLoop' n1 p2 (λ n2 → ( vari n2 ≡ c10 )))) | |
394 </pre></div> | |
395 </div> | |
396 </div> | |
397 </li> | |
398 </ul> | |
399 | |
400 | |
401 | |
402 </div> | |
403 | |
404 <div class='slide'> | |
405 <!-- _S9SLIDE_ --> | |
406 <h2 id="まとめと今後の課題">まとめと今後の課題</h2> | |
407 <ul> | |
408 <li>HoareLogic の while を使った例題を作成、証明を行った</li> | |
409 <li>Gears を用いた HoareLogic ベースの検証方法を導入した | |
410 <ul> | |
411 <li>証明が引数として渡される記述のため証明とプログラムを一体化できた</li> | |
412 </ul> | |
413 </li> | |
414 <li>今後の課題 | |
415 <ul> | |
416 <li>RedBlackTree や SynchronizedQueue などのデータ構造の検証(HoareLogic ベースで)</li> | |
287 </ul> | 417 </ul> |
288 </li> | 418 </li> |
289 </ul> | 419 </ul> |
290 | 420 |
291 | 421 |
326 <li>HoareLogic 例として疑似コードを用意した</li> | 456 <li>HoareLogic 例として疑似コードを用意した</li> |
327 <li>このプログラムは変数iとnをもち、 n>0 の間nの値を減らし、i の値を増やす</li> | 457 <li>このプログラムは変数iとnをもち、 n>0 の間nの値を減らし、i の値を増やす</li> |
328 <li>n==0 のとき停止するため、終了時の変数の結果は i==10、n==0 になるはずである。</li> | 458 <li>n==0 のとき停止するため、終了時の変数の結果は i==10、n==0 になるはずである。</li> |
329 <li>次のスライドから Agda 上 HoareLogic を実装し、その上でこの whileProgram の検証を行う | 459 <li>次のスライドから Agda 上 HoareLogic を実装し、その上でこの whileProgram の検証を行う |
330 <div class="language-C highlighter-coderay"><div class="CodeRay"> | 460 <div class="language-C highlighter-coderay"><div class="CodeRay"> |
331 <div class="code"><pre><span class="line-numbers"><a href="#n1" name="n1">1</a></span> n = <span style="color:#00D">10</span>; | 461 <div class="code"><pre> n = <span style="color:#00D">10</span>; |
332 <span class="line-numbers"><a href="#n2" name="n2">2</a></span> i = <span style="color:#00D">0</span>; | 462 i = <span style="color:#00D">0</span>; |
333 <span class="line-numbers"><a href="#n3" name="n3">3</a></span> | 463 |
334 <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>) | 464 <span style="color:#080;font-weight:bold">while</span> (n><span style="color:#00D">0</span>) |
335 <span class="line-numbers"><a href="#n5" name="n5">5</a></span> { | 465 { |
336 <span class="line-numbers"><a href="#n6" name="n6">6</a></span> i++; | 466 i++; |
337 <span class="line-numbers"><a href="#n7" name="n7">7</a></span> n--; | 467 n--; |
338 <span class="line-numbers"><a href="#n8" name="n8">8</a></span> } | 468 } |
339 </pre></div> | 469 </pre></div> |
340 </div> | 470 </div> |
341 </div> | 471 </div> |
342 </li> | 472 </li> |
343 </ul> | 473 </ul> |
352 <ul> | 482 <ul> |
353 <li><strong>Env</strong> は while Program で必要な変数をまとめたもの</li> | 483 <li><strong>Env</strong> は while Program で必要な変数をまとめたもの</li> |
354 <li>varn、vari はそれぞれ変数 n、 i</li> | 484 <li>varn、vari はそれぞれ変数 n、 i</li> |
355 <li><strong>Cond</strong> は Pre、Post の Condition で Env を受け取って Bool 値(true か false)を返す | 485 <li><strong>Cond</strong> は Pre、Post の Condition で Env を受け取って Bool 値(true か false)を返す |
356 <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> | 486 <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> |
357 <div class="code"><pre><span class="line-numbers"><a href="#n1" name="n1">1</a></span> record Env : Set where | 487 <div class="code"><pre> record Env : Set where |
358 <span class="line-numbers"><a href="#n2" name="n2">2</a></span> field | 488 field |
359 <span class="line-numbers"><a href="#n3" name="n3">3</a></span> varn : Nat | 489 varn : Nat |
360 <span class="line-numbers"><a href="#n4" name="n4">4</a></span> vari : Nat | 490 vari : Nat |
361 <span class="line-numbers"><a href="#n5" name="n5">5</a></span> | 491 |
362 <span class="line-numbers"><a href="#n6" name="n6">6</a></span> Cond : Set | 492 Cond : Set |
363 <span class="line-numbers"><a href="#n7" name="n7">7</a></span> Cond = (Env → Bool) | 493 Cond = (Env → Bool) |
364 </pre></div> | 494 </pre></div> |
365 </div> | 495 </div> |
366 </div> | 496 </div> |
367 </li> | 497 </li> |
368 </ul> | 498 </ul> |
384 </ul> | 514 </ul> |
385 </li> | 515 </li> |
386 <li>他にも何もしないコマンドやコマンドの停止などのコマンドもある</li> | 516 <li>他にも何もしないコマンドやコマンドの停止などのコマンドもある</li> |
387 <li><strong>PrimComm</strong> は Env を受け取って Env を返す定義 | 517 <li><strong>PrimComm</strong> は Env を受け取って Env を返す定義 |
388 <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> | 518 <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> |
389 <div class="code"><pre><span class="line-numbers"><a href="#n1" name="n1">1</a></span> data Comm : Set where | 519 <div class="code"><pre> data Comm : Set where |
390 <span class="line-numbers"><a href="#n2" name="n2">2</a></span> PComm : PrimComm → Comm | 520 PComm : PrimComm → Comm |
391 <span class="line-numbers"><a href="#n3" name="n3">3</a></span> Seq : Comm → Comm → Comm | 521 Seq : Comm → Comm → Comm |
392 <span class="line-numbers"><a href="#n4" name="n4">4</a></span> If : Cond → Comm → Comm → Comm | 522 If : Cond → Comm → Comm → Comm |
393 <span class="line-numbers"><a href="#n5" name="n5">5</a></span> While : Cond → Comm → Comm | 523 While : Cond → Comm → Comm |
394 <span class="line-numbers"><a href="#n6" name="n6">6</a></span> | 524 |
395 <span class="line-numbers"><a href="#n7" name="n7">7</a></span> PrimComm : Set | 525 PrimComm : Set |
396 <span class="line-numbers"><a href="#n8" name="n8">8</a></span> PrimComm = Env → Env | 526 PrimComm = Env → Env |
397 </pre></div> | 527 </pre></div> |
398 </div> | 528 </div> |
399 </div> | 529 </div> |
400 </li> | 530 </li> |
401 </ul> | 531 </ul> |
414 </ul> | 544 </ul> |
415 </li> | 545 </li> |
416 <li><strong>$</strong> は <strong>()</strong> の糖衣で行頭から行末までを ( ) で囲う</li> | 546 <li><strong>$</strong> は <strong>()</strong> の糖衣で行頭から行末までを ( ) で囲う</li> |
417 <li>見やすさのため改行しているが 3~7 行は1行 | 547 <li>見やすさのため改行しているが 3~7 行は1行 |
418 <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> | 548 <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> |
419 <div class="code"><pre><span class="line-numbers"><a href="#n1" name="n1">1</a></span> program : ℕ → Comm | 549 <div class="code"><pre> program : ℕ → Comm |
420 <span class="line-numbers"><a href="#n2" name="n2">2</a></span> program c10 = | 550 program c10 = |
421 <span class="line-numbers"><a href="#n3" name="n3">3</a></span> Seq ( PComm (λ env → record env {varn = c10})) -- n = 10; | 551 Seq ( PComm (λ env → record env {varn = c10})) -- n = 10; |
422 <span class="line-numbers"><a href="#n4" name="n4">4</a></span> $ Seq ( PComm (λ env → record env {vari = 0})) -- i = 0; | 552 $ Seq ( PComm (λ env → record env {vari = 0})) -- i = 0; |
423 <span class="line-numbers"><a href="#n5" name="n5">5</a></span> $ While (λ env → lt zero (varn env ) ) -- while (n>0) { | 553 $ While (λ env → lt zero (varn env ) ) -- while (n>0) { |
424 <span class="line-numbers"><a href="#n6" name="n6">6</a></span> (Seq (PComm (λ env → record env {vari = ((vari env) + 1)} )) -- i++; | 554 (Seq (PComm (λ env → record env {vari = ((vari env) + 1)} )) -- i++; |
425 <span class="line-numbers"><a href="#n7" name="n7">7</a></span> $ PComm (λ env → record env {varn = ((varn env) - 1)} )) -- n--; | 555 $ PComm (λ env → record env {varn = ((varn env) - 1)} )) -- n--; |
426 </pre></div> | 556 </pre></div> |
427 </div> | 557 </div> |
428 </div> | 558 </div> |
429 </li> | 559 </li> |
430 </ul> | 560 </ul> |
441 <li><strong>PrimRule</strong> は <strong>PComm</strong> で行う代入を保証する</li> | 571 <li><strong>PrimRule</strong> は <strong>PComm</strong> で行う代入を保証する</li> |
442 <li>3行目の pr の型 Axiom は PreCondition に PrimComm が適用されると PostCondition になることの記述 | 572 <li>3行目の pr の型 Axiom は PreCondition に PrimComm が適用されると PostCondition になることの記述 |
443 <ul> | 573 <ul> |
444 <li><strong><em>⇒</em></strong> は pre, post の Condition をとって post の Condition が成り立つときに True を返す | 574 <li><strong><em>⇒</em></strong> は pre, post の Condition をとって post の Condition が成り立つときに True を返す |
445 <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> | 575 <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> |
446 <div class="code"><pre><span class="line-numbers"><a href="#n1" name="n1">1</a></span> data HTProof : Cond → Comm → Cond → Set where | 576 <div class="code"><pre> data HTProof : Cond → Comm → Cond → Set where |
447 <span class="line-numbers"><a href="#n2" name="n2">2</a></span> PrimRule : {bPre : Cond} → {pcm : PrimComm} → {bPost : Cond} → | 577 PrimRule : {bPre : Cond} → {pcm : PrimComm} → {bPost : Cond} → |
448 <span class="line-numbers"><a href="#n3" name="n3">3</a></span> (pr : Axiom bPre pcm bPost) → | 578 (pr : Axiom bPre pcm bPost) → |
449 <span class="line-numbers"><a href="#n4" name="n4">4</a></span> HTProof bPre (PComm pcm) bPost | 579 HTProof bPre (PComm pcm) bPost |
450 <span class="line-numbers"><a href="#n5" name="n5">5</a></span>-- 次のスライドに続く | 580 -- 次のスライドに続く |
451 </pre></div> | 581 </pre></div> |
452 </div> | 582 </div> |
453 </div> | 583 </div> |
454 <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> | 584 <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> |
455 <div class="code"><pre><span class="line-numbers"><a href="#n1" name="n1">1</a></span> Axiom : Cond → PrimComm → Cond → Set | 585 <div class="code"><pre> Axiom : Cond → PrimComm → Cond → Set |
456 <span class="line-numbers"><a href="#n2" name="n2">2</a></span> Axiom pre comm post = ∀ (env : Env) → (pre env) ⇒ ( post (comm env)) ≡ true | 586 Axiom pre comm post = ∀ (env : Env) → (pre env) ⇒ ( post (comm env)) ≡ true |
457 </pre></div> | 587 </pre></div> |
458 </div> | 588 </div> |
459 </div> | 589 </div> |
460 </li> | 590 </li> |
461 </ul> | 591 </ul> |
471 <h2 id="agda-上での-hoarelogicコマンド保証23">Agda 上での HoareLogic(コマンド保証)2/3</h2> | 601 <h2 id="agda-上での-hoarelogicコマンド保証23">Agda 上での HoareLogic(コマンド保証)2/3</h2> |
472 <ul> | 602 <ul> |
473 <li><strong>SeqRule</strong> は Command を推移させる Seq の保証</li> | 603 <li><strong>SeqRule</strong> は Command を推移させる Seq の保証</li> |
474 <li><strong>IfRule</strong> は If の Command が正しく動くことを保証 | 604 <li><strong>IfRule</strong> は If の Command が正しく動くことを保証 |
475 <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> | 605 <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> |
476 <div class="code"><pre><span class="line-numbers"> <a href="#n1" name="n1">1</a></span>-- HTProof の続き | 606 <div class="code"><pre>-- HTProof の続き |
477 <span class="line-numbers"> <a href="#n2" name="n2">2</a></span> SeqRule : {bPre : Cond} → {cm1 : Comm} → {bMid : Cond} → | 607 SeqRule : {bPre : Cond} → {cm1 : Comm} → {bMid : Cond} → |
478 <span class="line-numbers"> <a href="#n3" name="n3">3</a></span> {cm2 : Comm} → {bPost : Cond} → | 608 {cm2 : Comm} → {bPost : Cond} → |
479 <span class="line-numbers"> <a href="#n4" name="n4">4</a></span> HTProof bPre cm1 bMid → | 609 HTProof bPre cm1 bMid → |
480 <span class="line-numbers"> <a href="#n5" name="n5">5</a></span> HTProof bMid cm2 bPost → | 610 HTProof bMid cm2 bPost → |
481 <span class="line-numbers"> <a href="#n6" name="n6">6</a></span> HTProof bPre (Seq cm1 cm2) bPost | 611 HTProof bPre (Seq cm1 cm2) bPost |
482 <span class="line-numbers"> <a href="#n7" name="n7">7</a></span> IfRule : {cmThen : Comm} → {cmElse : Comm} → | 612 IfRule : {cmThen : Comm} → {cmElse : Comm} → |
483 <span class="line-numbers"> <a href="#n8" name="n8">8</a></span> {bPre : Cond} → {bPost : Cond} → | 613 {bPre : Cond} → {bPost : Cond} → |
484 <span class="line-numbers"> <a href="#n9" name="n9">9</a></span> {b : Cond} → | 614 {b : Cond} → |
485 <span class="line-numbers"><strong><a href="#n10" name="n10">10</a></strong></span> HTProof (bPre /\ b) cmThen bPost → | 615 HTProof (bPre /\ b) cmThen bPost → |
486 <span class="line-numbers"><a href="#n11" name="n11">11</a></span> HTProof (bPre /\ neg b) cmElse bPost → | 616 HTProof (bPre /\ neg b) cmElse bPost → |
487 <span class="line-numbers"><a href="#n12" name="n12">12</a></span> HTProof bPre (If b cmThen cmElse) bPost | 617 HTProof bPre (If b cmThen cmElse) bPost |
488 </pre></div> | 618 </pre></div> |
489 </div> | 619 </div> |
490 </div> | 620 </div> |
491 </li> | 621 </li> |
492 </ul> | 622 </ul> |
501 <ul> | 631 <ul> |
502 <li><strong>WeakeningRule</strong> は通常の Condition からループ不変条件(Loop Invaliant)に変換</li> | 632 <li><strong>WeakeningRule</strong> は通常の Condition からループ不変条件(Loop Invaliant)に変換</li> |
503 <li>Tautology は Condition と不変条件が等しく成り立つ</li> | 633 <li>Tautology は Condition と不変条件が等しく成り立つ</li> |
504 <li><strong>WhileRule</strong> はループ不変条件が成り立つ間 Comm を繰り返す | 634 <li><strong>WhileRule</strong> はループ不変条件が成り立つ間 Comm を繰り返す |
505 <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> | 635 <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> |
506 <div class="code"><pre><span class="line-numbers"> <a href="#n1" name="n1">1</a></span>-- HTProof の続き | 636 <div class="code"><pre>-- HTProof の続き |
507 <span class="line-numbers"> <a href="#n2" name="n2">2</a></span> WeakeningRule : {bPre : Cond} → {bPre' : Cond} → {cm : Comm} → | 637 WeakeningRule : {bPre : Cond} → {bPre' : Cond} → {cm : Comm} → |
508 <span class="line-numbers"> <a href="#n3" name="n3">3</a></span> {bPost' : Cond} → {bPost : Cond} → | 638 {bPost' : Cond} → {bPost : Cond} → |
509 <span class="line-numbers"> <a href="#n4" name="n4">4</a></span> Tautology bPre bPre' → | 639 Tautology bPre bPre' → |
510 <span class="line-numbers"> <a href="#n5" name="n5">5</a></span> HTProof bPre' cm bPost' → | 640 HTProof bPre' cm bPost' → |
511 <span class="line-numbers"> <a href="#n6" name="n6">6</a></span> Tautology bPost' bPost → | 641 Tautology bPost' bPost → |
512 <span class="line-numbers"> <a href="#n7" name="n7">7</a></span> HTProof bPre cm bPost | 642 HTProof bPre cm bPost |
513 <span class="line-numbers"> <a href="#n8" name="n8">8</a></span> WhileRule : {cm : Comm} → {bInv : Cond} → {b : Cond} → | 643 WhileRule : {cm : Comm} → {bInv : Cond} → {b : Cond} → |
514 <span class="line-numbers"> <a href="#n9" name="n9">9</a></span> HTProof (bInv /\ b) cm bInv → | 644 HTProof (bInv /\ b) cm bInv → |
515 <span class="line-numbers"><strong><a href="#n10" name="n10">10</a></strong></span> HTProof bInv (While b cm) (bInv /\ neg b) | 645 HTProof bInv (While b cm) (bInv /\ neg b) |
516 </pre></div> | 646 </pre></div> |
517 </div> | 647 </div> |
518 </div> | 648 </div> |
519 <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> | 649 <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> |
520 <div class="code"><pre><span class="line-numbers"><a href="#n1" name="n1">1</a></span> Tautology : Cond → Cond → Set | 650 <div class="code"><pre> Tautology : Cond → Cond → Set |
521 <span class="line-numbers"><a href="#n2" name="n2">2</a></span> Tautology pre post = ∀ (env : Env) → (pre env) ⇒ (post env) ≡ true | 651 Tautology pre post = ∀ (env : Env) → (pre env) ⇒ (post env) ≡ true |
522 </pre></div> | 652 </pre></div> |
523 </div> | 653 </div> |
524 </div> | 654 </div> |
525 </li> | 655 </li> |
526 </ul> | 656 </ul> |
536 <li><strong>proof1</strong> は while Program の証明</li> | 666 <li><strong>proof1</strong> は while Program の証明</li> |
537 <li>HTProof に 初期状態と先程コマンドで記述した whileProgram である <strong>program</strong> と終了状態を渡す</li> | 667 <li>HTProof に 初期状態と先程コマンドで記述した whileProgram である <strong>program</strong> と終了状態を渡す</li> |
538 <li>Condititon は initCond や termCond のようにそれぞれ定義する必要がある</li> | 668 <li>Condititon は initCond や termCond のようにそれぞれ定義する必要がある</li> |
539 <li>program に近い形で証明を記述できる | 669 <li>program に近い形で証明を記述できる |
540 <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> | 670 <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> |
541 <div class="code"><pre><span class="line-numbers"> <a href="#n1" name="n1">1</a></span> proof1 : (c10 : ℕ) → HTProof initCond (program c10 ) (termCond {c10}) | 671 <div class="code"><pre> proof1 : (c10 : ℕ) → HTProof initCond (program c10 ) (termCond {c10}) |
542 <span class="line-numbers"> <a href="#n2" name="n2">2</a></span> proof1 c10 = | 672 proof1 c10 = |
543 <span class="line-numbers"> <a href="#n3" name="n3">3</a></span> SeqRule {λ e → true} ( PrimRule (init-case {c10} )) | 673 SeqRule {λ e → true} ( PrimRule (init-case {c10} )) |
544 <span class="line-numbers"> <a href="#n4" name="n4">4</a></span> $ SeqRule {λ e → Equal (varn e) c10} ( PrimRule lemma1 ) | 674 $ SeqRule {λ e → Equal (varn e) c10} ( PrimRule lemma1 ) |
545 <span class="line-numbers"> <a href="#n5" name="n5">5</a></span> $ WeakeningRule {λ e → (Equal (varn e) c10) ∧ (Equal (vari e) 0)} lemma2 ( | 675 $ WeakeningRule {λ e → (Equal (varn e) c10) ∧ (Equal (vari e) 0)} lemma2 ( |
546 <span class="line-numbers"> <a href="#n6" name="n6">6</a></span> WhileRule {_} {λ e → Equal ((varn e) + (vari e)) c10} | 676 WhileRule {_} {λ e → Equal ((varn e) + (vari e)) c10} |
547 <span class="line-numbers"> <a href="#n7" name="n7">7</a></span> $ SeqRule (PrimRule {λ e → whileInv e ∧ lt zero (varn e) } lemma3 ) | 677 $ SeqRule (PrimRule {λ e → whileInv e ∧ lt zero (varn e) } lemma3 ) |
548 <span class="line-numbers"> <a href="#n8" name="n8">8</a></span> $ PrimRule {whileInv'} {_} {whileInv} lemma4 ) lemma5 | 678 $ PrimRule {whileInv'} {_} {whileInv} lemma4 ) lemma5 |
549 <span class="line-numbers"> <a href="#n9" name="n9">9</a></span> | 679 |
550 <span class="line-numbers"><strong><a href="#n10" name="n10">10</a></strong></span> initCond : Cond | 680 initCond : Cond |
551 <span class="line-numbers"><a href="#n11" name="n11">11</a></span> initCond env = true | 681 initCond env = true |
552 <span class="line-numbers"><a href="#n12" name="n12">12</a></span> | 682 |
553 <span class="line-numbers"><a href="#n13" name="n13">13</a></span> termCond : {c10 : Nat} → Cond | 683 termCond : {c10 : Nat} → Cond |
554 <span class="line-numbers"><a href="#n14" name="n14">14</a></span> termCond {c10} env = Equal (vari env) c10 | 684 termCond {c10} env = Equal (vari env) c10 |
555 </pre></div> | 685 </pre></div> |
556 </div> | 686 </div> |
557 </div> | 687 </div> |
558 <!-- * lemma1~5は rule それぞれの証明 --> | 688 <!-- * lemma1~5は rule それぞれの証明 --> |
559 <!-- program : Comm --> | 689 <!-- program : Comm --> |
584 <li>impl⇒ は x ≡ true → y ≡ true の関数(Command)を受け取って x ⇒ y ≡ true を返す関数</li> | 714 <li>impl⇒ は x ≡ true → y ≡ true の関数(Command)を受け取って x ⇒ y ≡ true を返す関数</li> |
585 </ul> | 715 </ul> |
586 </li> | 716 </li> |
587 <li><strong>≡-Reasoning</strong> は Agda での等式変形 | 717 <li><strong>≡-Reasoning</strong> は Agda での等式変形 |
588 <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> | 718 <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> |
589 <div class="code"><pre><span class="line-numbers"> <a href="#n1" name="n1">1</a></span> lemma1 : {c10 : Nat} → Axiom (stmt1Cond {c10}) | 719 <div class="code"><pre> lemma1 : {c10 : Nat} → Axiom (stmt1Cond {c10}) |
590 <span class="line-numbers"> <a href="#n2" name="n2">2</a></span> (λ env → record { varn = varn env ; vari = 0 }) (stmt2Cond {c10}) | 720 (λ env → record { varn = varn env ; vari = 0 }) (stmt2Cond {c10}) |
591 <span class="line-numbers"> <a href="#n3" name="n3">3</a></span> lemma1 {c10} env = impl⇒ ( λ cond → let open ≡-Reasoning in | 721 lemma1 {c10} env = impl⇒ ( λ cond → let open ≡-Reasoning in |
592 <span class="line-numbers"> <a href="#n4" name="n4">4</a></span> begin | 722 begin |
593 <span class="line-numbers"> <a href="#n5" name="n5">5</a></span> (Equal (varn env) c10 ) ∧ true | 723 (Equal (varn env) c10 ) ∧ true |
594 <span class="line-numbers"> <a href="#n6" name="n6">6</a></span> ≡⟨ ∧true ⟩ | 724 ≡⟨ ∧true ⟩ |
595 <span class="line-numbers"> <a href="#n7" name="n7">7</a></span> Equal (varn env) c10 | 725 Equal (varn env) c10 |
596 <span class="line-numbers"> <a href="#n8" name="n8">8</a></span> ≡⟨ cond ⟩ | 726 ≡⟨ cond ⟩ |
597 <span class="line-numbers"> <a href="#n9" name="n9">9</a></span> true | 727 true |
598 <span class="line-numbers"><strong><a href="#n10" name="n10">10</a></strong></span> ∎ ) | 728 ∎ ) |
599 <span class="line-numbers"><a href="#n11" name="n11">11</a></span> | 729 |
600 <span class="line-numbers"><a href="#n12" name="n12">12</a></span> stmt1Cond : {c10 : ℕ} → Cond | 730 stmt1Cond : {c10 : ℕ} → Cond |
601 <span class="line-numbers"><a href="#n13" name="n13">13</a></span> stmt1Cond {c10} env = Equal (varn env) c10 | 731 stmt1Cond {c10} env = Equal (varn env) c10 |
602 <span class="line-numbers"><a href="#n14" name="n14">14</a></span> | 732 |
603 <span class="line-numbers"><a href="#n15" name="n15">15</a></span> stmt2Cond : {c10 : ℕ} → Cond | 733 stmt2Cond : {c10 : ℕ} → Cond |
604 <span class="line-numbers"><a href="#n16" name="n16">16</a></span> stmt2Cond {c10} env = (Equal (varn env) c10) ∧ (Equal (vari env) 0) | 734 stmt2Cond {c10} env = (Equal (varn env) c10) ∧ (Equal (vari env) 0) |
605 </pre></div> | 735 </pre></div> |
606 </div> | 736 </div> |
607 </div> | 737 </div> |
608 | 738 |
609 <p><!-- lemma2 : {c10 : Nat} → Tautology stmt2Cond whileInv --></p> | 739 <p><!-- lemma2 : {c10 : Nat} → Tautology stmt2Cond whileInv --></p> |
614 | 744 |
615 <p><!-- lemma5 : {c10 : Nat} → Tautology ((λ e → Equal (varn e + vari e) c10) and (neg (λ z → lt zero (varn z)))) termCond --></p> | 745 <p><!-- lemma5 : {c10 : Nat} → Tautology ((λ e → Equal (varn e + vari e) c10) and (neg (λ z → lt zero (varn z)))) termCond --></p> |
616 </li> | 746 </li> |
617 </ul> | 747 </ul> |
618 | 748 |
619 | |
620 | |
621 </div> | |
622 | |
623 <div class='slide'> | |
624 <!-- _S9SLIDE_ --> | |
625 <h2 id="agda-での-gears">Agda での Gears</h2> | |
626 <ul> | |
627 <li>Agda での CodeGear は通常の関数とは異なり、継続渡し (CPS : Continuation Passing Style) で記述された関数</li> | |
628 <li>CPS の関数は引数として継続を受け取って継続に計算結果を渡す</li> | |
629 <li><strong>名前 : 引数 → (Code : fa → t) → t</strong></li> | |
630 <li><strong>t</strong> は継続</li> | |
631 <li><strong>(Code : fa → t)</strong> は次の継続先</li> | |
632 <li>DataGear は Agda での CodeGear に使われる引数 | |
633 <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> | |
634 <div class="code"><pre><span class="line-numbers"><a href="#n1" name="n1">1</a></span>_-_ : {t : Set} → Nat → Nat → (Code : Nat → t) → t | |
635 <span class="line-numbers"><a href="#n2" name="n2">2</a></span>x - zero = (λ next → next x) | |
636 <span class="line-numbers"><a href="#n3" name="n3">3</a></span>zero - _ = (λ next → next zero) | |
637 <span class="line-numbers"><a href="#n4" name="n4">4</a></span>(suc x) - (suc y) = (x - y) | |
638 </pre></div> | |
639 </div> | |
640 </div> | |
641 </li> | |
642 </ul> | |
643 | |
644 | |
645 | |
646 </div> | |
647 | |
648 <div class='slide'> | |
649 <!-- _S9SLIDE_ --> | |
650 <h2 id="gears-をベースにした-hoarelogic-と証明全体">Gears をベースにした HoareLogic と証明(全体)</h2> | |
651 <ul> | |
652 <li>Gears をベースにした while Program | |
653 <ul> | |
654 <li>これは証明でもある</li> | |
655 </ul> | |
656 </li> | |
657 <li>whileループを任意の回数にするため<strong>c10</strong>は引数</li> | |
658 <li>whileTest’ の継続に conversion1、その継続に whileLoop’ が来て最後の継続に vari が c10 と等しい | |
659 <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> | |
660 <div class="code"><pre><span class="line-numbers"><a href="#n1" name="n1">1</a></span> proofGears : {c10 : Nat } → Set | |
661 <span class="line-numbers"><a href="#n2" name="n2">2</a></span> proofGears {c10} = whileTest' {_} {_} {c10} (λ n p1 → conversion1 n p1 | |
662 <span class="line-numbers"><a href="#n3" name="n3">3</a></span> (λ n1 p2 → whileLoop' n1 p2 (λ n2 → ( vari n2 ≡ c10 )))) | |
663 </pre></div> | |
664 </div> | |
665 </div> | |
666 </li> | |
667 </ul> | |
668 | |
669 | |
670 | |
671 </div> | |
672 | |
673 <div class='slide'> | |
674 <!-- _S9SLIDE_ --> | |
675 <h2 id="gears-と-hoarelogic-をベースにした証明whiletest">Gears と HoareLogic をベースにした証明(whileTest)</h2> | |
676 <ul> | |
677 <li>ここは代入する Command</li> | |
678 <li>最初の Command なので PreCondition がない</li> | |
679 <li>もとの whileProgram では PComm を2回していたがまとめた</li> | |
680 <li>proof2は Post Condition が成り立つことの証明 | |
681 <ul> | |
682 <li><strong><em>/\</em></strong> は pi1 と pi2 のフィールドをもつレコード型</li> | |
683 <li>2つのものを引数に取り、両方が同時に成り立つことを示す</li> | |
684 </ul> | |
685 </li> | |
686 <li>Gears での PostCondition は <strong>引数 → (Code : fa → PostCondition → t) → t</strong> | |
687 <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> | |
688 <div class="code"><pre><span class="line-numbers"><a href="#n1" name="n1">1</a></span> whileTest' : {l : Level} {t : Set l} → {c10 : Nat } → | |
689 <span class="line-numbers"><a href="#n2" name="n2">2</a></span> (Code : (env : Env) → ((vari env) ≡ 0) /\ ((varn env) ≡ c10) → t) → t | |
690 <span class="line-numbers"><a href="#n3" name="n3">3</a></span> whileTest' {_} {_} {c10} next = next env proof2 | |
691 <span class="line-numbers"><a href="#n4" name="n4">4</a></span> where | |
692 <span class="line-numbers"><a href="#n5" name="n5">5</a></span> env : Env | |
693 <span class="line-numbers"><a href="#n6" name="n6">6</a></span> env = record {vari = 0 ; varn = c10} | |
694 <span class="line-numbers"><a href="#n7" name="n7">7</a></span> proof2 : ((vari env) ≡ 0) /\ ((varn env) ≡ c10) <-- PostCondition | |
695 <span class="line-numbers"><a href="#n8" name="n8">8</a></span> proof2 = record {pi1 = refl ; pi2 = refl} | |
696 </pre></div> | |
697 </div> | |
698 </div> | |
699 </li> | |
700 </ul> | |
701 | |
702 | |
703 | |
704 </div> | |
705 | |
706 <div class='slide'> | |
707 <!-- _S9SLIDE_ --> | |
708 <h2 id="gears-と-hoarelogic-をベースにした証明conversion">Gears と HoareLogic をベースにした証明(conversion)</h2> | |
709 <ul> | |
710 <li>conversion は Condition から LoopInvaliant への変換を行う CodeGear</li> | |
711 <li>proof4 は LoopInvaliant の証明</li> | |
712 <li>Gears での HoareLogic の完全な記述は <strong>引数 → PreCondition → (Code : fa → PostCondition → t) → t</strong> | |
713 <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> | |
714 <div class="code"><pre><span class="line-numbers"> <a href="#n1" name="n1">1</a></span> conversion1 : {l : Level} {t : Set l } → (env : Env) → {c10 : Nat } → | |
715 <span class="line-numbers"> <a href="#n2" name="n2">2</a></span> ((vari env) ≡ 0) /\ ((varn env) ≡ c10) | |
716 <span class="line-numbers"> <a href="#n3" name="n3">3</a></span> → (Code : (env1 : Env) → (varn env1 + vari env1 ≡ c10) → t) → t | |
717 <span class="line-numbers"> <a href="#n4" name="n4">4</a></span> conversion1 env {c10} p1 next = next env proof4 | |
718 <span class="line-numbers"> <a href="#n5" name="n5">5</a></span> where | |
719 <span class="line-numbers"> <a href="#n6" name="n6">6</a></span> proof4 : varn env + vari env ≡ c10 | |
720 <span class="line-numbers"> <a href="#n7" name="n7">7</a></span> proof4 = let open ≡-Reasoning in | |
721 <span class="line-numbers"> <a href="#n8" name="n8">8</a></span> begin | |
722 <span class="line-numbers"> <a href="#n9" name="n9">9</a></span> varn env + vari env | |
723 <span class="line-numbers"><strong><a href="#n10" name="n10">10</a></strong></span> ≡⟨ cong ( λ n → n + vari env ) (pi2 p1 ) ⟩ | |
724 <span class="line-numbers"><a href="#n11" name="n11">11</a></span> c10 + vari env | |
725 <span class="line-numbers"><a href="#n12" name="n12">12</a></span> ≡⟨ cong ( λ n → c10 + n ) (pi1 p1 ) ⟩ | |
726 <span class="line-numbers"><a href="#n13" name="n13">13</a></span> c10 + 0 | |
727 <span class="line-numbers"><a href="#n14" name="n14">14</a></span> ≡⟨ +-sym {c10} {0} ⟩ | |
728 <span class="line-numbers"><a href="#n15" name="n15">15</a></span> c10 | |
729 <span class="line-numbers"><a href="#n16" name="n16">16</a></span> ∎ | |
730 </pre></div> | |
731 </div> | |
732 </div> | |
733 </li> | |
734 </ul> | |
735 | |
736 | |
737 | |
738 </div> | |
739 | |
740 <div class='slide'> | |
741 <!-- _S9SLIDE_ --> | |
742 <h2 id="gears-と-hoarelogic-をベースにした証明whileloop">Gears と HoareLogic をベースにした証明(whileLoop)</h2> | |
743 <ul> | |
744 <li>whileLoop は loopInvaliant が true の間 WhileLoop を回し続けるCodeGear</li> | |
745 <li>この CodeGear は Agda がループが終わることが証明できてないため <strong>{-# TERMINATING #-}</strong> で明示</li> | |
746 <li>false になると次の CodeGear へ | |
747 <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> | |
748 <div class="code"><pre><span class="line-numbers"><a href="#n1" name="n1">1</a></span> {-# TERMINATING #-} | |
749 <span class="line-numbers"><a href="#n2" name="n2">2</a></span> whileLoop : {l : Level} {t : Set l} → Env → (Code : Env → t) → t | |
750 <span class="line-numbers"><a href="#n3" name="n3">3</a></span> whileLoop env next with lt 0 (varn env) | |
751 <span class="line-numbers"><a href="#n4" name="n4">4</a></span> whileLoop env next | false = next env | |
752 <span class="line-numbers"><a href="#n5" name="n5">5</a></span> whileLoop env next | true = | |
753 <span class="line-numbers"><a href="#n6" name="n6">6</a></span> whileLoop (record {varn = (varn env) - 1 ; vari = (vari env) + 1}) next | |
754 </pre></div> | |
755 </div> | |
756 </div> | |
757 </li> | |
758 </ul> | |
759 | |
760 | |
761 | |
762 </div> | |
763 | |
764 <div class='slide'> | |
765 <!-- _S9SLIDE_ --> | |
766 <h2 id="gears-と-hoarelogic-をベースにした証明全体">Gears と HoareLogic をベースにした証明(全体)</h2> | |
767 <ul> | |
768 <li>最終状態で返ってくる i の値は c10 と一致する</li> | |
769 <li>これにより証明が可能 | |
770 <div class="language-AGDA highlighter-coderay"><div class="CodeRay"> | |
771 <div class="code"><pre><span class="line-numbers"><a href="#n1" name="n1">1</a></span> proofGears : {c10 : Nat } → Set | |
772 <span class="line-numbers"><a href="#n2" name="n2">2</a></span> proofGears {c10} = whileTest' {_} {_} {c10} (λ n p1 → conversion1 n p1 | |
773 <span class="line-numbers"><a href="#n3" name="n3">3</a></span> (λ n1 p2 → whileLoop' n1 p2 (λ n2 → ( vari n2 ≡ c10 )))) | |
774 </pre></div> | |
775 </div> | |
776 </div> | |
777 </li> | |
778 </ul> | |
779 | |
780 | |
781 | |
782 </div> | |
783 | |
784 <div class='slide'> | |
785 <!-- _S9SLIDE_ --> | |
786 <h2 id="まとめと今後の課題">まとめと今後の課題</h2> | |
787 <ul> | |
788 <li>HoareLogic の while を使った例題を作成、証明を行った</li> | |
789 <li>Gears を用いた HoareLogic ベースの検証方法を導入した | |
790 <ul> | |
791 <li>証明が引数として渡される記述のため証明とプログラムを一体化できた</li> | |
792 </ul> | |
793 </li> | |
794 <li>今後の課題 | |
795 <ul> | |
796 <li>RedBlackTree や SynchronizedQueue などのデータ構造の検証(HoareLogic ベースで)</li> | |
797 </ul> | |
798 </li> | |
799 </ul> | |
800 | 749 |
801 </div> | 750 </div> |
802 | 751 |
803 | 752 |
804 </div><!-- presentation --> | 753 </div><!-- presentation --> |