Continuation based C での Hoare Logic を用いた記述と検証

外間政尊 - 琉球大学 : 並列信頼研究室

OS の検証技術としての Hoare Logic の問題点

Hoare Logic をベースにした Gears 単位での検証

Gears について

Agda のデータ型

Agda のデータ型と DataGear

Agda での Gears の記述(whileTest)

Agda での Gears の記述(whileLoop)

Agda での証明

Hoare Logic をベースとした Gears での検証手法

Gears をベースにしたプログラム

1    test : Env
2    test = whileTest 10 (λ env → whileLoop env (λ env1 → env1))
3
4    -- whileTest : {t : Set} → (c10 : Nat) → (Code : Env → t) → t
5    -- whileLoop : {t : Set} → Env → (Code : Env → t) → t

Gears をベースにした Hoare Logic と証明(全体)

Gears と Hoare Logic をベースにした証明(whileTest)

Gears と Hoare Logic をベースにした証明(conversion)

1    conv : (env : Envc ) → (vari env ≡ 0) /\ (varn env ≡ c10 env) → varn env + vari env ≡ c10 env
2    conv e record { pi1 = refl ; pi2 = refl } = +zero

Hoare Logic の証明

Gears と Hoare Logic をベースにした証明(whileLoop)

 1    whileLoopPwP' : {l : Level} {t : Set l} → (n : ℕ) → (env : Envc ) → (n ≡ varn env) → whileTestStateP s2 env
 2      → (next : (env : Envc ) → (pred n ≡ varn env) → whileTestStateP s2 env  → t)
 3      → (exit : (env : Envc ) → whileTestStateP sf env  → t) → t
 4    whileLoopPwP' zero env refl refl next exit = exit env refl
 5    whileLoopPwP' (suc n) env refl refl next exit = 
 6      next (record env {varn = pred (varn env) ; vari = suc (vari env) }) refl (+-suc n (vari env))
 7
 8    loopPwP' zero env refl refl exit = exit env refl
 9    loopPwP' (suc n) env refl refl exit  = whileLoopPwP' (suc n) env refl refl 
10        (λ env x y → loopPwP' n env x y exit) exit

Gears と Hoare Logic をベースにした仕様記述

1    whileProofs : (c :  ℕ ) → Set
2    whileProofs c = whileTestPwP {_} {_} c 
3       ( λ env s → conv1 env s 
4       ( λ env s → loopPwP' (varn env) env refl s 
5       ( λ env s → vari env ≡ c10 env )))

Gears と Hoare Logic を用いた仕様の証明

 1--    whileProofs c = whileTestPwP {_} {_} c 
 2--       ( λ env s → conv1 env s 
 3--       ( λ env s → loopPwP' (varn env) env refl s 
 4--       ( λ env s → vari env ≡ c10 env )))
 5
 6    ProofGears : (c : ℕ) → whileProofs c
 7    ProofGears c = whileTestPwP {_} {_} c
 8      (λ env s →  loopPwP' c (record { c10 = c ; varn = c ; vari = 0 }) refl +zero
 9      (λ env₁ s₁ → {!!}))
10
11    Goal: loopPwP' c (record { c10 = c ; varn = c ; vari = 0 }) refl
12          +zero (λ env₂ s₂ → vari env₂ ≡ c10 env₂)
13    ------------------------------------------------------------
14    s₁   : vari env₁ ≡ c10 env₁
15    env₁ : Envc
16    s    : (vari env ≡ 0) /\ (varn env ≡ c10 env)
17    env  : Envc
18    c    : ℕ

検証時の Loop の解決

1    loopHelper : (n : ℕ) → (env : Envc ) → (eq : varn env ≡ n) → (seq : whileTestStateP s2 env) 
2      → loopPwP' n env (sym eq) seq (λ env₁ x → (vari env₁ ≡ c10 env₁))
3    loopHelper zero env eq refl rewrite eq = refl
4    loopHelper (suc n) env eq refl rewrite eq = loopHelper n 
5      (record { c10 = suc (n + vari env) ; varn = n ; vari = suc (vari env) }) refl (+-suc n (vari env))

Gears と Hoare Logic を用いた仕様の証明(完成)

1    --    whileProofs c = whileTestPwP {_} {_} c 
2    --       ( λ env s → conv1 env s 
3    --       ( λ env s → loopPwP' (varn env) env refl s 
4    --       ( λ env s → vari env ≡ c10 env )))
5    ProofGears : (c : ℕ) → whileProofs c
6    ProofGears c = whileTestPwP {_} {_} c 
7       (λ env s → loopHelper c (record { c10 = c ; varn = c ; vari = zero }) refl +zero)

まとめと今後の課題