1
|
1 loopPPSem : (input output : Envc ) → output ≡ loopPP (varn input) input refl
|
|
2 → (whileTestStateP s2 input ) → (whileTestStateP s2 input ) implies (whileTestStateP sf output)
|
|
3 loopPPSem input output refl s2p = loopPPSemInduct (varn input) input refl refl s2p
|
|
4 where
|
|
5 lem : (n : ℕ) → (env : Envc) → n + suc (vari env) ≡ suc (n + vari env)
|
|
6 lem n env = +-suc (n) (vari env)
|
|
7 loopPPSemInduct : (n : ℕ) → (current : Envc) → (eq : n ≡ varn current) → (loopeq : output ≡ loopPP n current eq)
|
|
8 → (whileTestStateP s2 current ) → (whileTestStateP s2 current ) implies (whileTestStateP sf output)
|
|
9 loopPPSemInduct zero current refl loopeq refl rewrite loopeq = proof (λ x → refl)
|
|
10 loopPPSemInduct (suc n) current refl loopeq refl rewrite (sym (lem n current)) =
|
|
11 whileLoopPSem current refl
|
|
12 (λ output x → loopPPSemInduct n (record { c10 = n + suc (vari current) ; varn = n ; vari = suc (vari current) }) refl loopeq refl)
|
|
13 (λ output x → loopPPSemInduct n (record { c10 = n + suc (vari current) ; varn = n ; vari = suc (vari current) }) refl loopeq refl)
|
|
14
|
|
15
|
|
16 whileLoopPSemSound : {l : Level} → (input output : Envc )
|
|
17 → (varn input + vari input ≡ c10 input)
|
|
18 → output ≡ loopPP (varn input) input refl
|
|
19 → (varn input + vari input ≡ c10 input) implies (vari output ≡ c10 output)
|
|
20 whileLoopPSemSound {l} input output pre eq = loopPPSem input output eq pre
|