Mercurial > hg > Members > ryokka > HoareLogic
comparison whileTestPrim.agda @ 10:bc819bdda374
proof completed
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Sat, 15 Dec 2018 16:59:52 +0900 |
parents | e4f087b823d4 |
children | a622d1700a1b |
comparison
equal
deleted
inserted
replaced
9:46b301ad4478 | 10:bc819bdda374 |
---|---|
5 open import Data.Bool hiding ( _≟_ ) | 5 open import Data.Bool hiding ( _≟_ ) |
6 open import Level renaming ( suc to succ ; zero to Zero ) | 6 open import Level renaming ( suc to succ ; zero to Zero ) |
7 open import Relation.Nullary using (¬_; Dec; yes; no) | 7 open import Relation.Nullary using (¬_; Dec; yes; no) |
8 open import Relation.Binary.PropositionalEquality | 8 open import Relation.Binary.PropositionalEquality |
9 | 9 |
10 open import utilities | |
10 | 11 |
11 record Env : Set where | 12 record Env : Set where |
12 field | 13 field |
13 varn : ℕ | 14 varn : ℕ |
14 vari : ℕ | 15 vari : ℕ |
25 Abort : Comm | 26 Abort : Comm |
26 PComm : PrimComm -> Comm | 27 PComm : PrimComm -> Comm |
27 Seq : Comm -> Comm -> Comm | 28 Seq : Comm -> Comm -> Comm |
28 If : Cond -> Comm -> Comm -> Comm | 29 If : Cond -> Comm -> Comm -> Comm |
29 While : Cond -> Comm -> Comm | 30 While : Cond -> Comm -> Comm |
30 | |
31 _-_ : ℕ -> ℕ -> ℕ | |
32 x - zero = x | |
33 zero - _ = zero | |
34 (suc x) - (suc y) = x - y | |
35 | |
36 lt : ℕ -> ℕ -> Bool | |
37 lt x y with suc x ≤? y | |
38 lt x y | yes p = true | |
39 lt x y | no ¬p = false | |
40 | |
41 Equal : ℕ -> ℕ -> Bool | |
42 Equal x y with x ≟ y | |
43 Equal x y | yes p = true | |
44 Equal x y | no ¬p = false | |
45 | |
46 --------------------------- | |
47 | |
48 implies : Bool → Bool → Bool | |
49 implies false _ = true | |
50 implies true true = true | |
51 implies true false = false | |
52 | |
53 impl-1 : {x : Bool} → implies x true ≡ true | |
54 impl-1 {x} with x | |
55 impl-1 {x} | false = refl | |
56 impl-1 {x} | true = refl | |
57 | |
58 impl-2 : {x : Bool} → implies false x ≡ true | |
59 impl-2 {x} with x | |
60 impl-2 {x} | false = refl | |
61 impl-2 {x} | true = refl | |
62 | |
63 and-lemma-1 : { x y : Bool } → x ∧ y ≡ true → x ≡ true | |
64 and-lemma-1 {x} {y} eq with x | y | eq | |
65 and-lemma-1 {x} {y} eq | false | b | () | |
66 and-lemma-1 {x} {y} eq | true | false | () | |
67 and-lemma-1 {x} {y} eq | true | true | refl = refl | |
68 | |
69 and-lemma-2 : { x y : Bool } → x ∧ y ≡ true → y ≡ true | |
70 and-lemma-2 {x} {y} eq with x | y | eq | |
71 and-lemma-2 {x} {y} eq | false | b | () | |
72 and-lemma-2 {x} {y} eq | true | false | () | |
73 and-lemma-2 {x} {y} eq | true | true | refl = refl | |
74 | |
75 bool-case : ( x : Bool ) { p : Set } → ( x ≡ true → p ) → ( x ≡ false → p ) → p | |
76 bool-case x T F with x | |
77 bool-case x T F | false = F refl | |
78 bool-case x T F | true = T refl | |
79 | |
80 impl : {x y : Bool} → (x ≡ true → y ≡ true ) → implies x y ≡ true | |
81 impl {x} {y} p = bool-case x (λ x=t → let open ≡-Reasoning in | |
82 begin | |
83 implies x y | |
84 ≡⟨ cong ( \ z -> implies x z ) (p x=t ) ⟩ | |
85 implies x true | |
86 ≡⟨ impl-1 ⟩ | |
87 true | |
88 ∎ | |
89 ) ( λ x=f → let open ≡-Reasoning in | |
90 begin | |
91 implies x y | |
92 ≡⟨ cong ( \ z -> implies z y ) x=f ⟩ | |
93 true | |
94 ∎ | |
95 ) | |
96 | |
97 eqlemma : { x y : ℕ } → Equal x y ≡ true → x ≡ y | |
98 eqlemma {x} {y} eq with x ≟ y | |
99 eqlemma {x} {y} refl | yes refl = refl | |
100 eqlemma {x} {y} () | no ¬p | |
101 | |
102 eqlemma1 : { x y : ℕ } → Equal x y ≡ Equal (suc x) (suc y) | |
103 eqlemma1 {x} {y} with x ≟ y | |
104 eqlemma1 {x} {.x} | yes refl = refl | |
105 eqlemma1 {x} {y} | no ¬p = refl | |
106 | |
107 add-lemma1 : { x : ℕ } → x + 1 ≡ suc x | |
108 add-lemma1 {zero} = refl | |
109 add-lemma1 {suc x} = cong ( \ z -> suc z ) ( add-lemma1 {x} ) | |
110 | 31 |
111 --------------------------- | 32 --------------------------- |
112 | 33 |
113 program : Comm | 34 program : Comm |
114 program = | 35 program = |
149 empty-case : (env : Env) → (( λ e → true ) env ) ≡ true | 70 empty-case : (env : Env) → (( λ e → true ) env ) ≡ true |
150 empty-case _ = refl | 71 empty-case _ = refl |
151 | 72 |
152 | 73 |
153 Axiom : Cond -> PrimComm -> Cond -> Set | 74 Axiom : Cond -> PrimComm -> Cond -> Set |
154 Axiom pre comm post = ∀ (env : Env) → implies (pre env) ( post (comm env)) ≡ true | 75 Axiom pre comm post = ∀ (env : Env) → (pre env) ⇒ ( post (comm env)) ≡ true |
155 | 76 |
156 Tautology : Cond -> Cond -> Set | 77 Tautology : Cond -> Cond -> Set |
157 Tautology pre post = ∀ (env : Env) → implies (pre env) (post env) ≡ true | 78 Tautology pre post = ∀ (env : Env) → (pre env) ⇒ (post env) ≡ true |
158 | 79 |
159 _/\_ : Cond -> Cond -> Cond | 80 _and_ : Cond -> Cond -> Cond |
160 x /\ y = λ env → x env ∧ y env | 81 x and y = λ env → x env ∧ y env |
161 | 82 |
162 neg : Cond -> Cond | 83 neg : Cond -> Cond |
163 neg x = λ env → not ( x env ) | 84 neg x = λ env → not ( x env ) |
164 | 85 |
165 data HTProof : Cond -> Comm -> Cond -> Set where | 86 data HTProof : Cond -> Comm -> Cond -> Set where |
181 HTProof bMid cm2 bPost -> | 102 HTProof bMid cm2 bPost -> |
182 HTProof bPre (Seq cm1 cm2) bPost | 103 HTProof bPre (Seq cm1 cm2) bPost |
183 IfRule : {cmThen : Comm} -> {cmElse : Comm} -> | 104 IfRule : {cmThen : Comm} -> {cmElse : Comm} -> |
184 {bPre : Cond} -> {bPost : Cond} -> | 105 {bPre : Cond} -> {bPost : Cond} -> |
185 {b : Cond} -> | 106 {b : Cond} -> |
186 HTProof (bPre /\ b) cmThen bPost -> | 107 HTProof (bPre and b) cmThen bPost -> |
187 HTProof (bPre /\ neg b) cmElse bPost -> | 108 HTProof (bPre and neg b) cmElse bPost -> |
188 HTProof bPre (If b cmThen cmElse) bPost | 109 HTProof bPre (If b cmThen cmElse) bPost |
189 WhileRule : {cm : Comm} -> {bInv : Cond} -> {b : Cond} -> | 110 WhileRule : {cm : Comm} -> {bInv : Cond} -> {b : Cond} -> |
190 HTProof (bInv /\ b) cm bInv -> | 111 HTProof (bInv and b) cm bInv -> |
191 HTProof bInv (While b cm) (bInv /\ neg b) | 112 HTProof bInv (While b cm) (bInv and neg b) |
192 | 113 |
193 initCond : Cond | 114 initCond : Cond |
194 initCond env = true | 115 initCond env = true |
195 | 116 |
196 stmt1Cond : Cond | 117 stmt1Cond : Cond |
201 | 122 |
202 whileInv : Cond | 123 whileInv : Cond |
203 whileInv env = Equal ((varn env) + (vari env)) 10 | 124 whileInv env = Equal ((varn env) + (vari env)) 10 |
204 | 125 |
205 whileInv' : Cond | 126 whileInv' : Cond |
206 whileInv' env = Equal ((varn env) + (vari env)) 11 | 127 whileInv' env = Equal ((varn env) + (vari env)) 11 ∧ lt zero (varn env) |
207 | 128 |
208 termCond : Cond | 129 termCond : Cond |
209 termCond env = Equal (vari env) 10 | 130 termCond env = Equal (vari env) 10 |
210 | 131 |
211 proofs : HTProof initCond simple stmt2Cond | 132 proofs : HTProof initCond simple stmt2Cond |
234 lemma1 : Axiom stmt1Cond (λ env → record { varn = varn env ; vari = 0 }) stmt2Cond | 155 lemma1 : Axiom stmt1Cond (λ env → record { varn = varn env ; vari = 0 }) stmt2Cond |
235 lemma1 env with stmt1Cond env | 156 lemma1 env with stmt1Cond env |
236 lemma1 env | false = refl | 157 lemma1 env | false = refl |
237 lemma1 env | true = refl | 158 lemma1 env | true = refl |
238 lemma21 : {env : Env } → stmt2Cond env ≡ true → varn env ≡ 10 | 159 lemma21 : {env : Env } → stmt2Cond env ≡ true → varn env ≡ 10 |
239 lemma21 eq = eqlemma (and-lemma-1 eq) | 160 lemma21 eq = Equal→≡ (∧-pi1 eq) |
240 lemma22 : {env : Env } → stmt2Cond env ≡ true → vari env ≡ 0 | 161 lemma22 : {env : Env } → stmt2Cond env ≡ true → vari env ≡ 0 |
241 lemma22 eq = eqlemma (and-lemma-2 eq) | 162 lemma22 eq = Equal→≡ (∧-pi2 eq) |
242 lemma23 : {env : Env } → stmt2Cond env ≡ true → varn env + vari env ≡ 10 | 163 lemma23 : {env : Env } → stmt2Cond env ≡ true → varn env + vari env ≡ 10 |
243 lemma23 {env} eq = let open ≡-Reasoning in | 164 lemma23 {env} eq = let open ≡-Reasoning in |
244 begin | 165 begin |
245 varn env + vari env | 166 varn env + vari env |
246 ≡⟨ cong ( \ x -> x + vari env ) (lemma21 eq ) ⟩ | 167 ≡⟨ cong ( \ x -> x + vari env ) (lemma21 eq ) ⟩ |
250 ∎ | 171 ∎ |
251 lemma2 : Tautology stmt2Cond whileInv | 172 lemma2 : Tautology stmt2Cond whileInv |
252 lemma2 env = bool-case (stmt2Cond env) ( | 173 lemma2 env = bool-case (stmt2Cond env) ( |
253 λ eq → let open ≡-Reasoning in | 174 λ eq → let open ≡-Reasoning in |
254 begin | 175 begin |
255 implies (stmt2Cond env) (whileInv env) | 176 (stmt2Cond env) ⇒ (whileInv env) |
256 ≡⟨⟩ | 177 ≡⟨⟩ |
257 implies (stmt2Cond env) ( Equal (varn env + vari env) 10 ) | 178 (stmt2Cond env) ⇒ ( Equal (varn env + vari env) 10 ) |
258 ≡⟨ cong ( \ x -> implies (stmt2Cond env) ( Equal x 10 ) ) ( lemma23 {env} eq ) ⟩ | 179 ≡⟨ cong ( \ x -> (stmt2Cond env) ⇒ ( Equal x 10 ) ) ( lemma23 {env} eq ) ⟩ |
259 implies (stmt2Cond env) (Equal 10 10) | 180 (stmt2Cond env) ⇒ (Equal 10 10) |
260 ≡⟨⟩ | 181 ≡⟨⟩ |
261 implies (stmt2Cond env) true | 182 (stmt2Cond env) ⇒ true |
262 ≡⟨ impl-1 ⟩ | 183 ≡⟨ ⇒t ⟩ |
263 true | 184 true |
264 ∎ | 185 ∎ |
265 ) ( | 186 ) ( |
266 λ ne → let open ≡-Reasoning in | 187 λ ne → let open ≡-Reasoning in |
267 begin | 188 begin |
268 implies (stmt2Cond env) (whileInv env) | 189 (stmt2Cond env) ⇒ (whileInv env) |
269 ≡⟨ cong ( \ x -> implies x (whileInv env) ) ne ⟩ | 190 ≡⟨ cong ( \ x -> x ⇒ (whileInv env) ) ne ⟩ |
270 implies false (whileInv env) | 191 false ⇒ (whileInv env) |
271 ≡⟨ impl-2 {whileInv env} ⟩ | 192 ≡⟨ f⇒ {whileInv env} ⟩ |
272 true | 193 true |
273 ∎ | 194 ∎ |
274 ) | 195 ) |
275 lemma3 : Axiom (λ e → whileInv e ∧ lt zero (varn e)) (λ env → record { varn = varn env ; vari = vari env + 1 }) whileInv' | 196 lemma3 : Axiom (λ e → whileInv e ∧ lt zero (varn e)) (λ env → record { varn = varn env ; vari = vari env + 1 }) whileInv' |
276 lemma3 env = impl ( λ cond → let open ≡-Reasoning in | 197 lemma3 env = impl⇒ ( λ cond → let open ≡-Reasoning in |
277 begin | 198 begin |
278 whileInv' (record { varn = varn env ; vari = vari env + 1 }) | 199 whileInv' (record { varn = varn env ; vari = vari env + 1 }) |
279 ≡⟨⟩ | 200 ≡⟨⟩ |
201 Equal (varn env + (vari env + 1)) 11 ∧ (lt 0 (varn env) ) | |
202 ≡⟨ cong ( λ z → Equal (varn env + (vari env + 1)) 11 ∧ z ) (∧-pi2 cond ) ⟩ | |
203 Equal (varn env + (vari env + 1)) 11 ∧ true | |
204 ≡⟨ ∧true ⟩ | |
280 Equal (varn env + (vari env + 1)) 11 | 205 Equal (varn env + (vari env + 1)) 11 |
281 ≡⟨ cong ( \ x -> Equal x 11 ) (sym (+-assoc (varn env) (vari env) 1)) ⟩ | 206 ≡⟨ cong ( \ x -> Equal x 11 ) (sym (+-assoc (varn env) (vari env) 1)) ⟩ |
282 Equal ((varn env + vari env) + 1) 11 | 207 Equal ((varn env + vari env) + 1) 11 |
283 ≡⟨ cong ( \ x -> Equal x 11 ) add-lemma1 ⟩ | 208 ≡⟨ cong ( \ x -> Equal x 11 ) +1≡suc ⟩ |
284 Equal (suc (varn env + vari env)) 11 | 209 Equal (suc (varn env + vari env)) 11 |
285 ≡⟨ sym eqlemma1 ⟩ | 210 ≡⟨ sym Equal+1 ⟩ |
286 Equal ((varn env + vari env) ) 10 | 211 Equal ((varn env + vari env) ) 10 |
287 ≡⟨ and-lemma-1 cond ⟩ | 212 ≡⟨ ∧-pi1 cond ⟩ |
288 true | 213 true |
289 ∎ ) | 214 ∎ ) |
215 lemma41 : (env : Env ) → (varn env + vari env) ≡ 11 → lt 0 (varn env) ≡ true → Equal ((varn env - 1) + vari env) 10 ≡ true | |
216 lemma41 env c1 c2 = let open ≡-Reasoning in | |
217 begin | |
218 Equal ((varn env - 1) + vari env) 10 | |
219 ≡⟨ cong ( λ z → Equal ((z - 1 ) + vari env ) 10 ) (sym (suc-predℕ=n c2) ) ⟩ | |
220 Equal ((suc (predℕ {varn env} c2 ) - 1) + vari env) 10 | |
221 ≡⟨⟩ | |
222 Equal ((predℕ {varn env} c2 ) + vari env) 10 | |
223 ≡⟨ Equal+1 ⟩ | |
224 Equal ((suc (predℕ {varn env} c2 )) + vari env) 11 | |
225 ≡⟨ cong ( λ z → Equal (z + vari env ) 11 ) (suc-predℕ=n c2 ) ⟩ | |
226 Equal (varn env + vari env) 11 | |
227 ≡⟨ cong ( λ z → (Equal z 11 )) c1 ⟩ | |
228 Equal 11 11 | |
229 ≡⟨⟩ | |
230 true | |
231 ∎ | |
290 lemma4 : Axiom whileInv' (λ env → record { varn = varn env - 1 ; vari = vari env }) whileInv | 232 lemma4 : Axiom whileInv' (λ env → record { varn = varn env - 1 ; vari = vari env }) whileInv |
291 lemma4 env = {!!} | 233 lemma4 env = impl⇒ ( λ cond → let open ≡-Reasoning in |
292 lemma5 : Tautology ((λ e → Equal (varn e + vari e) 10) /\ neg (λ z → lt zero (varn z))) termCond | 234 begin |
293 lemma5 env = {!!} | 235 whileInv (record { varn = varn env - 1 ; vari = vari env }) |
294 | 236 ≡⟨⟩ |
295 | 237 Equal ((varn env - 1) + vari env) 10 |
238 ≡⟨ lemma41 env (Equal→≡ (∧-pi1 cond)) (∧-pi2 cond) ⟩ | |
239 true | |
240 ∎ | |
241 ) | |
242 lemma51 : (z : Env ) → neg (λ z → lt zero (varn z)) z ≡ true → varn z ≡ zero | |
243 lemma51 z cond with lt zero (varn z) | (suc zero) ≤? (varn z) | |
244 lemma51 z () | false | yes p | |
245 lemma51 z () | true | yes p | |
246 lemma51 z refl | _ | no ¬p with varn z | |
247 lemma51 z refl | _ | no ¬p | zero = refl | |
248 lemma51 z refl | _ | no ¬p | suc x = ⊥-elim ( ¬p (s≤s z≤n ) ) | |
249 lemma5 : Tautology ((λ e → Equal (varn e + vari e) 10) and (neg (λ z → lt zero (varn z)))) termCond | |
250 lemma5 env = impl⇒ ( λ cond → let open ≡-Reasoning in | |
251 begin | |
252 termCond env | |
253 ≡⟨⟩ | |
254 Equal (vari env) 10 | |
255 ≡⟨⟩ | |
256 Equal (zero + vari env) 10 | |
257 ≡⟨ cong ( λ z → Equal (z + vari env) 10 ) (sym ( lemma51 env ( ∧-pi2 cond ) )) ⟩ | |
258 Equal (varn env + vari env) 10 | |
259 ≡⟨ ∧-pi1 cond ⟩ | |
260 true | |
261 ∎ | |
262 ) | |
263 | |
264 | |
265 |