1 (*---------------------------------------------------------------------------*)
5 Description: This file proves the unity compositionality theorems and
8 Author: (c) Copyright 1989-2008 by Flemming Andersen
10 Last Update: December 30, 2007
12 (*---------------------------------------------------------------------------*)
14 (*---------------------------------------------------------------------------*)
18 (*---------------------------------------------------------------------------*)
23 (p UNLESS q) (APPEND FPr GPr) ==> (p UNLESS q) FPr /\ (p UNLESS q) GPr
25 let COMP_UNLESS_thm1_lemma_1 = TAC_PROOF
27 (`!(p:'a->bool) q FPr GPr.
28 (p UNLESS q) (APPEND FPr GPr) ==> (p UNLESS q) FPr /\ (p UNLESS q) GPr`)),
30 SPEC_TAC ((`GPr:('a->'a)list`),(`GPr:('a->'a)list`)) THEN
31 SPEC_TAC ((`FPr:('a->'a)list`),(`FPr:('a->'a)list`)) THEN
34 REWRITE_TAC [UNLESS;APPEND]
36 REWRITE_TAC [APPEND] THEN
37 REWRITE_TAC [UNLESS] THEN
38 REPEAT STRIP_TAC THENL
49 (p UNLESS q) FPr /\ (p UNLESS q) GPr ==> (p UNLESS q) (APPEND FPr GPr)
51 let COMP_UNLESS_thm1_lemma_2 = TAC_PROOF
53 (`!(p:'a->bool) q FPr GPr.
54 (p UNLESS q) FPr /\ (p UNLESS q) GPr ==> (p UNLESS q) (APPEND FPr GPr)`)),
56 SPEC_TAC ((`GPr:('a->'a)list`),(`GPr:('a->'a)list`)) THEN
57 SPEC_TAC ((`FPr:('a->'a)list`),(`FPr:('a->'a)list`)) THEN
60 REWRITE_TAC [UNLESS;APPEND]
62 REWRITE_TAC [APPEND] THEN
63 REWRITE_TAC [UNLESS] THEN
64 REPEAT STRIP_TAC THENL
75 (p UNLESS q) (APPEND FPr GPr) = (p UNLESS q) FPr /\ (p UNLESS q) GPr
77 let COMP_UNLESS_thm1 = prove_thm
79 (`!(p:'a->bool) q FPr GPr.
80 (p UNLESS q) (APPEND FPr GPr) <=> (p UNLESS q) FPr /\ (p UNLESS q) GPr`),
82 STRIP_ASSUME_TAC (IMP_ANTISYM_RULE
83 (SPEC_ALL COMP_UNLESS_thm1_lemma_1)
84 (SPEC_ALL COMP_UNLESS_thm1_lemma_2)));;
90 (p ENSURES q) (APPEND FPr GPr) ==> (p ENSURES q) FPr /\ (p UNLESS q) GPr \/
91 (p ENSURES q) GPr /\ (p UNLESS q) FPr
93 let COMP_ENSURES_thm1_lemma_1 = TAC_PROOF
95 (`!(p:'a->bool) q FPr GPr.
96 (p ENSURES q) (APPEND FPr GPr) ==> (p ENSURES q) FPr /\ (p UNLESS q) GPr \/
97 (p ENSURES q) GPr /\ (p UNLESS q) FPr`)),
99 SPEC_TAC ((`GPr:('a->'a)list`),(`GPr:('a->'a)list`)) THEN
100 SPEC_TAC ((`FPr:('a->'a)list`),(`FPr:('a->'a)list`)) THEN
101 LIST_INDUCT_TAC THENL
103 REWRITE_TAC [ENSURES;EXIST_TRANSITION;UNLESS;APPEND]
106 REWRITE_TAC [ENSURES;EXIST_TRANSITION;UNLESS;APPEND] THEN
107 REPEAT STRIP_TAC THEN
108 ASM_REWRITE_TAC [] THENL
111 ASM_REWRITE_TAC [] THEN
112 ASM_REWRITE_TAC [GEN_ALL (SYM (SPEC_ALL COMP_UNLESS_thm1))]
114 ASSUME_TAC (UNDISCH_ALL (SPECL
115 [(`((p:'a->bool) UNLESS q)(APPEND t GPr)`);
116 (`((p:'a->bool) EXIST_TRANSITION q)(APPEND t GPr)`)]
118 UNDISCH_TAC (`((p:'a->bool) UNLESS q)(APPEND t GPr) /\
119 (p EXIST_TRANSITION q)(APPEND t GPr)`) THEN
120 REWRITE_TAC [SPECL [(`q:'a->bool`); (`p:'a->bool`);
121 (`APPEND (t:('a->'a)list) GPr`)]
122 (GEN_ALL (SYM (SPEC_ALL ENSURES)))] THEN
126 UNDISCH_TAC (`((p:'a->bool) ENSURES q) t`) THEN
127 REWRITE_TAC [ENSURES] THEN
131 UNDISCH_TAC (`((p:'a->bool) ENSURES q) GPr`) THEN
132 REWRITE_TAC [ENSURES] THEN
140 (p ENSURES q) FPr /\ (p UNLESS q) GPr \/
141 (p ENSURES q) GPr /\ (p UNLESS q) FPr ==> (p ENSURES q) (APPEND FPr GPr)
143 let COMP_ENSURES_thm1_lemma_2 = TAC_PROOF
145 `!(p:'a->bool) q FPr GPr.
146 ((p ENSURES q) FPr /\ (p UNLESS q) GPr \/
147 (p ENSURES q) GPr /\ (p UNLESS q) FPr)
148 ==> (p ENSURES q) (APPEND FPr GPr)`),
149 GEN_TAC THEN GEN_TAC THEN
151 REWRITE_TAC [ENSURES;EXIST_TRANSITION;UNLESS;APPEND] THEN
152 REPEAT STRIP_TAC THEN
154 ASM_REWRITE_TAC [COMP_UNLESS_thm1;ENSURES;EXIST_TRANSITION;
156 REWRITE_TAC [UNDISCH_ALL (ONCE_REWRITE_RULE [EXIST_TRANSITION_thm12]
157 (SPEC_ALL EXIST_TRANSITION_thm8))] THENL
160 [ONCE_REWRITE_RULE [EXIST_TRANSITION_thm12] (UNDISCH_ALL (SPECL
161 [`p:'a->bool`;`q:'a->bool`;`t:('a->'a)list`;`GPr:('a->'a)list`]
162 EXIST_TRANSITION_thm8))]
166 (SPECL [`p:'a->bool`;`q:'a->bool`;`GPr:('a->'a)list`;`t:('a->'a)list`]
167 EXIST_TRANSITION_thm8)]
173 (p ENSURES q) (APPEND FPr GPr) = (p ENSURES q) FPr /\ (p UNLESS q) GPr \/
174 (p ENSURES q) GPr /\ (p UNLESS q) FPr
176 let COMP_ENSURES_thm1 = prove_thm
177 ("COMP_ENSURES_thm1",
178 (`!(p:'a->bool) q FPr GPr.
179 (p ENSURES q) (APPEND FPr GPr) <=>
180 ((p ENSURES q) FPr /\ (p UNLESS q) GPr \/
181 (p ENSURES q) GPr /\ (p UNLESS q) FPr)`),
183 STRIP_ASSUME_TAC (IMP_ANTISYM_RULE
184 (SPEC_ALL COMP_ENSURES_thm1_lemma_1)
185 (SPEC_ALL COMP_ENSURES_thm1_lemma_2)));;
190 (p ENSURES q)FPr /\ (p UNLESS q)GPr ==> (p ENSURES q)(APPEND FPr GPr)
192 let COMP_ENSURES_cor0 = prove_thm
193 ("COMP_ENSURES_cor0",
194 (`!(p:'a->bool) q FPr GPr.
195 (p ENSURES q) FPr /\ (p UNLESS q) GPr
196 ==> (p ENSURES q) (APPEND FPr GPr)`),
197 REPEAT STRIP_TAC THEN
198 ACCEPT_TAC (REWRITE_RULE
199 [ASSUME (`((p:'a->bool) ENSURES q)FPr`);ASSUME (`((p:'a->bool) UNLESS q)GPr`)]
200 (SPEC_ALL COMP_ENSURES_thm1)));;
206 (p ENSURES q)GPr /\ (p UNLESS q)FPr ==> (p ENSURES q)(APPEND FPr GPr)
208 let COMP_ENSURES_cor1 = prove_thm
209 ("COMP_ENSURES_cor1",
210 (`!(p:'a->bool) q FPr GPr.
211 (p ENSURES q) GPr /\ (p UNLESS q) FPr
212 ==> (p ENSURES q) (APPEND FPr GPr)`),
213 REPEAT STRIP_TAC THEN
214 ACCEPT_TAC (REWRITE_RULE
215 [ASSUME (`((p:'a->bool) ENSURES q)GPr`);ASSUME (`((p:'a->bool) UNLESS q)FPr`)]
216 (SPEC_ALL COMP_ENSURES_thm1)));;
222 (p INVARIANT q) (APPEND FPr GPr) =
223 (p INVARIANT q) FPr /\ (p INVARIANT q) GPr
225 let COMP_UNITY_cor0 = prove_thm
227 (`!(p0:'a->bool) p FPr GPr.
228 (p INVARIANT (p0, APPEND FPr GPr)) =
229 (p INVARIANT (p0,FPr) /\ p INVARIANT (p0,GPr))`),
230 REWRITE_TAC [INVARIANT;STABLE;COMP_UNLESS_thm1] THEN
231 REPEAT GEN_TAC THEN EQ_TAC THEN REPEAT STRIP_TAC THEN
232 RES_TAC THEN ASM_REWRITE_TAC []);;
238 p STABLE (APPEND FPr GPr) = p STABLE FPr /\ p STABLE GPr
240 let COMP_UNITY_cor1 = prove_thm
242 (`!(p:'a->bool) FPr GPr.
243 (p STABLE (APPEND FPr GPr)) = (p STABLE FPr /\ p STABLE GPr)`),
244 REWRITE_TAC [STABLE;COMP_UNLESS_thm1]);;
250 (p UNLESS q) FPr /\ p STABLE GPr ==>(p UNLESS q) (APPEND FPr GPr)
252 let COMP_UNITY_cor2 = prove_thm
254 (`!(p:'a->bool) q FPr GPr.
255 (p UNLESS q) FPr /\ p STABLE GPr ==>(p UNLESS q) (APPEND FPr GPr)`),
256 REWRITE_TAC [STABLE;COMP_UNLESS_thm1] THEN
257 REPEAT STRIP_TAC THENL
261 UNDISCH_TAC (`((p:'a->bool) UNLESS False)GPr`) THEN
262 SPEC_TAC ((`GPr:('a->'a)list`),(`GPr:('a->'a)list`)) THEN
263 LIST_INDUCT_TAC THENL
267 REWRITE_TAC [UNLESS;UNLESS_STMT] THEN
268 CONV_TAC (DEPTH_CONV BETA_CONV) THEN
269 REPEAT STRIP_TAC THENL
273 (`~(False:'a->bool) s ==> (p:'a->bool)(h s) \/ False(h s)`) THEN
274 REWRITE_TAC [FALSE_def;NOT_CLAUSES;OR_INTRO_THM1]
282 p INVARIANT (p0; FPr) /\ p STABLE GPr
283 ==> p INVARIANT (p0; (APPEND FPr GPr))
285 let COMP_UNITY_cor3 = prove_thm
287 (`!(p0:'a->bool) p FPr GPr.
288 p INVARIANT (p0, FPr) /\ p STABLE GPr ==>
289 p INVARIANT (p0, (APPEND FPr GPr))`),
290 REWRITE_TAC [INVARIANT;STABLE;COMP_UNLESS_thm1] THEN
291 REPEAT STRIP_TAC THENL
297 ASM_REWRITE_TAC []]);;
303 (p ENSURES q) FPr /\ p STABLE GPr ==> (p ENSURES q) (APPEND FPr GPr)
305 let COMP_UNITY_cor4 = prove_thm
307 (`!(p:'a->bool) q FPr GPr.
308 (p ENSURES q) FPr /\ p STABLE GPr ==> (p ENSURES q) (APPEND FPr GPr)`),
309 REPEAT STRIP_TAC THEN
310 ASSUME_TAC (UNDISCH_ALL (SPECL
311 [(`p:'a->bool`);(`q:'a->bool`);(`FPr:('a->'a)list`)] ENSURES_cor2)) THEN
312 ASSUME_TAC (UNDISCH_ALL (SPECL
313 [(`((p:'a->bool) UNLESS q)FPr`);(`(p:'a->bool) STABLE GPr`)]
315 ASSUME_TAC (UNDISCH_ALL (SPECL
316 [(`p:'a->bool`);(`q:'a->bool`);(`FPr:('a->'a)list`);(`GPr:('a->'a)list`)]
317 COMP_UNITY_cor2)) THEN
318 REWRITE_TAC [ENSURES] THEN
319 ASM_REWRITE_TAC [] THEN
320 UNDISCH_TAC (`((p:'a->bool) ENSURES q)FPr`) THEN
321 REWRITE_TAC [ENSURES] THEN
323 UNDISCH_TAC (`((p:'a->bool) EXIST_TRANSITION q)FPr`) THEN
324 SPEC_TAC ((`FPr:('a->'a)list`),(`FPr:('a->'a)list`)) THEN
325 LIST_INDUCT_TAC THENL
327 REWRITE_TAC [EXIST_TRANSITION]
329 REWRITE_TAC [APPEND;EXIST_TRANSITION] THEN
330 REPEAT STRIP_TAC THENL
335 ASM_REWRITE_TAC []]]);;
339 !p q FPr GPr. (p UNLESS q)(APPEND FPr GPr) ==> (p UNLESS q) GPr
341 let COMP_UNITY_cor5 = prove_thm
343 (`!(p:'a->bool) q FPr GPr. (p UNLESS q)(APPEND FPr GPr) ==> (p UNLESS q) GPr`),
344 REWRITE_TAC [COMP_UNLESS_thm1] THEN
349 !p q FPr GPr. (p UNLESS q)(APPEND FPr GPr) ==> (p UNLESS q) FPr
351 let COMP_UNITY_cor6 = prove_thm
353 (`!(p:'a->bool) q FPr GPr. (p UNLESS q)(APPEND FPr GPr) ==> (p UNLESS q) FPr`),
354 REWRITE_TAC [COMP_UNLESS_thm1] THEN
359 !p q st FPr. (p UNLESS q)(CONS st FPr) ==> (p UNLESS q) FPr
361 let COMP_UNITY_cor7 = prove_thm
363 (`!(p:'a->bool) q st FPr. (p UNLESS q)(CONS st FPr) ==> (p UNLESS q) FPr`),
364 REWRITE_TAC [UNLESS] THEN
370 (p ENSURES (NotX p)) FPr ==> (p ENSURES (NotX p)) (APPEND FPr GPr)
372 let COMP_UNITY_cor8 = prove_thm
374 (`!(p:'a->bool) FPr GPr.
375 (p ENSURES (Not p)) FPr ==> (p ENSURES (Not p)) (APPEND FPr GPr)`),
378 REWRITE_TAC [APPEND;ENSURES;UNLESS;EXIST_TRANSITION] THEN
379 REPEAT STRIP_TAC THEN
381 ASM_REWRITE_TAC [UNLESS_thm2] THEN
382 REWRITE_TAC [UNDISCH_ALL (ONCE_REWRITE_RULE [EXIST_TRANSITION_thm12] (SPECL
383 [`p:'a->bool`;`Not (p:'a->bool)`;`t:('a->'a)list`;`GPr:('a->'a)list`]
384 EXIST_TRANSITION_thm8))]);;
389 p STABLE FPr /\ (p UNLESS q) GPr ==> (p UNLESS q) (APPEND FPr GPr)
391 let COMP_UNITY_cor9 = prove_thm
393 (`!(p:'a->bool) q FPr GPr.
394 p STABLE FPr /\ (p UNLESS q) GPr ==> (p UNLESS q) (APPEND FPr GPr)`),
395 REWRITE_TAC [STABLE;COMP_UNLESS_thm1] THEN
396 REPEAT STRIP_TAC THENL
398 UNDISCH_TAC (`((p:'a->bool) UNLESS False)FPr`) THEN
399 SPEC_TAC ((`FPr:('a->'a)list`),(`FPr:('a->'a)list`)) THEN
400 LIST_INDUCT_TAC THENL
404 REWRITE_TAC [UNLESS;UNLESS_STMT] THEN
406 REPEAT STRIP_TAC THENL
410 (`~(False:'a->bool) s ==> (p:'a->bool)(h s) \/ False(h s)`) THEN
411 REWRITE_TAC [FALSE_def;NOT_CLAUSES;OR_INTRO_THM1]
424 (p UNLESS q) (APPEND FPr GPr) = (p UNLESS q) (APPEND GPr FPr)
426 let COMP_UNITY_cor10 = prove_thm
428 (`!(p:'a->bool) q FPr GPr.
429 (p UNLESS q) (APPEND FPr GPr) = (p UNLESS q) (APPEND GPr FPr)`),
431 REWRITE_TAC [COMP_UNLESS_thm1] THEN
433 REPEAT STRIP_TAC THEN
434 ASM_REWRITE_TAC []);;
439 (p ENSURES q) (APPEND FPr GPr) = (p ENSURES q) (APPEND GPr FPr)
441 let COMP_UNITY_cor11 = prove_thm
443 (`!(p:'a->bool) q FPr GPr.
444 (p ENSURES q) (APPEND FPr GPr) = (p ENSURES q) (APPEND GPr FPr)`),
446 REWRITE_TAC [COMP_ENSURES_thm1] THEN
447 EQ_TAC THEN REPEAT STRIP_TAC THEN ASM_REWRITE_TAC []);;
452 (p LEADSTO q) (APPEND FPr GPr) = (p LEADSTO q) (APPEND GPr FPr)
457 ((p' ENSURES q')(APPEND Pr1 Pr2) ==> (p' LEADSTO q')(APPEND Pr2 Pr1)) /\
459 (p' LEADSTO r)(APPEND Pr1 Pr2) /\ (p' LEADSTO r)(APPEND Pr2 Pr1) /\
460 (r LEADSTO q')(APPEND Pr1 Pr2) /\ (r LEADSTO q')(APPEND Pr2 Pr1) ==>
461 (p' LEADSTO q')(APPEND Pr1 Pr2) ==> (p' LEADSTO q')(APPEND Pr2 Pr1)) /\
463 (!i. ((P i) LEADSTO q')(APPEND Pr1 Pr2)) /\
464 (!i. ((P i) LEADSTO q')(APPEND Pr2 Pr1)) ==>
465 (($ExistsX P) LEADSTO q')(APPEND Pr1 Pr2) ==>
466 (($ExistsX P) LEADSTO q')(APPEND Pr2 Pr1)))
468 (p LEADSTO q)(APPEND Pr1 Pr2) ==> (p LEADSTO q)(APPEND Pr2 Pr1)
470 let COMP_UNITY_cor12_lemma00 = (BETA_RULE (SPECL
471 [(`\(p:'a->bool) q. (p LEADSTO q)(APPEND Pr2 Pr1)`);
472 (`p:'a->bool`);(`q:'a->bool`);(`APPEND (Pr1:('a->'a)list) Pr2`)] LEADSTO_thm37));;
474 let COMP_UNITY_cor12_lemma01 = TAC_PROOF
476 (`!(p':'a->bool) q' Pr1 Pr2.
477 (p' ENSURES q')(APPEND Pr1 Pr2) ==> (p' LEADSTO q')(APPEND Pr2 Pr1)`)),
478 REPEAT STRIP_TAC THEN
479 ASSUME_TAC (ONCE_REWRITE_RULE [COMP_UNITY_cor11] (ASSUME
480 (`((p':'a->bool) ENSURES q')(APPEND Pr1 Pr2)`))) THEN
481 IMP_RES_TAC LEADSTO_thm0);;
483 let COMP_UNITY_cor12_lemma02 = TAC_PROOF
485 (`!(p':'a->bool) q' Pr1 Pr2.
487 (p' LEADSTO r)(APPEND Pr1 Pr2) /\ (p' LEADSTO r)(APPEND Pr2 Pr1) /\
488 (r LEADSTO q')(APPEND Pr1 Pr2) /\ (r LEADSTO q')(APPEND Pr2 Pr1)
489 ==> (p' LEADSTO q')(APPEND Pr2 Pr1))`)),
490 REPEAT STRIP_TAC THEN
491 IMP_RES_TAC LEADSTO_thm1);;
493 let COMP_UNITY_cor12_lemma03 = TAC_PROOF
495 (`!(p':'a->bool) q' Pr1 Pr2.
496 (!P:('a->bool)->bool.
497 (!p''. p'' In P ==> (p'' LEADSTO q')(APPEND Pr1 Pr2)) /\
498 (!p''. p'' In P ==> (p'' LEADSTO q')(APPEND Pr2 Pr1))
499 ==> ((LUB P) LEADSTO q')(APPEND Pr2 Pr1))`)),
500 REPEAT STRIP_TAC THEN
501 IMP_RES_TAC LEADSTO_thm3a);;
505 (p LEADSTO q)(APPEND Pr1 Pr2) ==> (p LEADSTO q)(APPEND Pr2 Pr1)
507 let COMP_UNITY_cor12_lemma04 = (GEN_ALL (REWRITE_RULE
508 [COMP_UNITY_cor12_lemma01;COMP_UNITY_cor12_lemma02;COMP_UNITY_cor12_lemma03]
509 (SPEC_ALL COMP_UNITY_cor12_lemma00)));;
512 |- !p q Pr1 Pr2. (p LEADSTO q)(APPEND Pr1 Pr2) = (p LEADSTO q)(APPEND Pr2 Pr1)
514 let COMP_UNITY_cor12 = prove_thm
516 (`!(p:'a->bool) q Pr1 Pr2.
517 (p LEADSTO q)(APPEND Pr1 Pr2) = (p LEADSTO q)(APPEND Pr2 Pr1)`),
519 EQ_TAC THEN REWRITE_TAC [COMP_UNITY_cor12_lemma04]);;
522 |- !p FPr GPr. p STABLE (APPEND FPr GPr) = p STABLE (APPEND GPr FPr)
524 let COMP_UNITY_cor13 = prove_thm
526 (`!(p:'a->bool) FPr GPr.
527 (p STABLE (APPEND FPr GPr)) = (p STABLE (APPEND GPr FPr))`),
529 REWRITE_TAC [STABLE] THEN
532 ONCE_REWRITE_TAC [COMP_UNITY_cor10] THEN
533 ASM_REWRITE_TAC []);;
538 p INVARIANT (p0, APPEND FPr GPr) = p INVARIANT (p0, APPEND GPr FPr)
540 let COMP_UNITY_cor14 = prove_thm
542 (`!(p0:'a->bool) p FPr GPr.
543 (p INVARIANT (p0, (APPEND FPr GPr)))
545 (p INVARIANT (p0, (APPEND GPr FPr)))`),
547 REWRITE_TAC [INVARIANT] THEN
550 ONCE_REWRITE_TAC [COMP_UNITY_cor13] THEN
551 ASM_REWRITE_TAC []);;