8 From Misra, "A Logic for Concurrent Programming", 1994 |
8 From Misra, "A Logic for Concurrent Programming", 1994 |
9 *) |
9 *) |
10 |
10 |
11 open WFair; |
11 open WFair; |
12 |
12 |
13 goal thy "Union(B) Int A = Union((%C. C Int A)``B)"; |
13 Goal "Union(B) Int A = Union((%C. C Int A)``B)"; |
14 by (Blast_tac 1); |
14 by (Blast_tac 1); |
15 qed "Int_Union_Union"; |
15 qed "Int_Union_Union"; |
16 |
16 |
17 |
17 |
18 (*** transient ***) |
18 (*** transient ***) |
19 |
19 |
20 goalw thy [stable_def, constrains_def, transient_def] |
20 Goalw [stable_def, constrains_def, transient_def] |
21 "!!A. [| stable Acts A; transient Acts A |] ==> A = {}"; |
21 "!!A. [| stable Acts A; transient Acts A |] ==> A = {}"; |
22 by (Blast_tac 1); |
22 by (Blast_tac 1); |
23 qed "stable_transient_empty"; |
23 qed "stable_transient_empty"; |
24 |
24 |
25 goalw thy [transient_def] |
25 Goalw [transient_def] |
26 "!!A. [| transient Acts A; B<=A |] ==> transient Acts B"; |
26 "!!A. [| transient Acts A; B<=A |] ==> transient Acts B"; |
27 by (Clarify_tac 1); |
27 by (Clarify_tac 1); |
28 by (rtac bexI 1 THEN assume_tac 2); |
28 by (rtac bexI 1 THEN assume_tac 2); |
29 by (Blast_tac 1); |
29 by (Blast_tac 1); |
30 qed "transient_strengthen"; |
30 qed "transient_strengthen"; |
31 |
31 |
32 goalw thy [transient_def] |
32 Goalw [transient_def] |
33 "!!A. [| act:Acts; A <= Domain act; act^^A <= Compl A |] \ |
33 "!!A. [| act:Acts; A <= Domain act; act^^A <= Compl A |] \ |
34 \ ==> transient Acts A"; |
34 \ ==> transient Acts A"; |
35 by (Blast_tac 1); |
35 by (Blast_tac 1); |
36 qed "transient_mem"; |
36 qed "transient_mem"; |
37 |
37 |
38 |
38 |
39 (*** ensures ***) |
39 (*** ensures ***) |
40 |
40 |
41 goalw thy [ensures_def] |
41 Goalw [ensures_def] |
42 "!!Acts. [| constrains Acts (A-B) (A Un B); transient Acts (A-B) |] \ |
42 "!!Acts. [| constrains Acts (A-B) (A Un B); transient Acts (A-B) |] \ |
43 \ ==> ensures Acts A B"; |
43 \ ==> ensures Acts A B"; |
44 by (Blast_tac 1); |
44 by (Blast_tac 1); |
45 qed "ensuresI"; |
45 qed "ensuresI"; |
46 |
46 |
47 goalw thy [ensures_def] |
47 Goalw [ensures_def] |
48 "!!Acts. ensures Acts A B \ |
48 "!!Acts. ensures Acts A B \ |
49 \ ==> constrains Acts (A-B) (A Un B) & transient Acts (A-B)"; |
49 \ ==> constrains Acts (A-B) (A Un B) & transient Acts (A-B)"; |
50 by (Blast_tac 1); |
50 by (Blast_tac 1); |
51 qed "ensuresD"; |
51 qed "ensuresD"; |
52 |
52 |
53 (*The L-version (precondition strengthening) doesn't hold for ENSURES*) |
53 (*The L-version (precondition strengthening) doesn't hold for ENSURES*) |
54 goalw thy [ensures_def] |
54 Goalw [ensures_def] |
55 "!!Acts. [| ensures Acts A A'; A'<=B' |] ==> ensures Acts A B'"; |
55 "!!Acts. [| ensures Acts A A'; A'<=B' |] ==> ensures Acts A B'"; |
56 by (blast_tac (claset() addIs [constrains_weaken, transient_strengthen]) 1); |
56 by (blast_tac (claset() addIs [constrains_weaken, transient_strengthen]) 1); |
57 qed "ensures_weaken_R"; |
57 qed "ensures_weaken_R"; |
58 |
58 |
59 goalw thy [ensures_def, constrains_def, transient_def] |
59 Goalw [ensures_def, constrains_def, transient_def] |
60 "!!Acts. Acts ~= {} ==> ensures Acts A UNIV"; |
60 "!!Acts. Acts ~= {} ==> ensures Acts A UNIV"; |
61 by (Asm_simp_tac 1); (*omitting this causes PROOF FAILED, even with Safe_tac*) |
61 by (Asm_simp_tac 1); (*omitting this causes PROOF FAILED, even with Safe_tac*) |
62 by (Blast_tac 1); |
62 by (Blast_tac 1); |
63 qed "ensures_UNIV"; |
63 qed "ensures_UNIV"; |
64 |
64 |
65 goalw thy [ensures_def] |
65 Goalw [ensures_def] |
66 "!!Acts. [| stable Acts C; \ |
66 "!!Acts. [| stable Acts C; \ |
67 \ constrains Acts (C Int (A - A')) (A Un A'); \ |
67 \ constrains Acts (C Int (A - A')) (A Un A'); \ |
68 \ transient Acts (C Int (A-A')) |] \ |
68 \ transient Acts (C Int (A-A')) |] \ |
69 \ ==> ensures Acts (C Int A) (C Int A')"; |
69 \ ==> ensures Acts (C Int A) (C Int A')"; |
70 by (asm_simp_tac (simpset() addsimps [Int_Un_distrib RS sym, |
70 by (asm_simp_tac (simpset() addsimps [Int_Un_distrib RS sym, |
77 |
77 |
78 (*Synonyms for the theorems produced by the inductive defn package*) |
78 (*Synonyms for the theorems produced by the inductive defn package*) |
79 bind_thm ("leadsTo_Basis", leadsto.Basis); |
79 bind_thm ("leadsTo_Basis", leadsto.Basis); |
80 bind_thm ("leadsTo_Trans", leadsto.Trans); |
80 bind_thm ("leadsTo_Trans", leadsto.Trans); |
81 |
81 |
82 goal thy "!!Acts. act: Acts ==> leadsTo Acts A UNIV"; |
82 Goal "!!Acts. act: Acts ==> leadsTo Acts A UNIV"; |
83 by (blast_tac (claset() addIs [ensures_UNIV RS leadsTo_Basis]) 1); |
83 by (blast_tac (claset() addIs [ensures_UNIV RS leadsTo_Basis]) 1); |
84 qed "leadsTo_UNIV"; |
84 qed "leadsTo_UNIV"; |
85 Addsimps [leadsTo_UNIV]; |
85 Addsimps [leadsTo_UNIV]; |
86 |
86 |
87 (*Useful with cancellation, disjunction*) |
87 (*Useful with cancellation, disjunction*) |
88 goal thy "!!Acts. leadsTo Acts A (A' Un A') ==> leadsTo Acts A A'"; |
88 Goal "!!Acts. leadsTo Acts A (A' Un A') ==> leadsTo Acts A A'"; |
89 by (asm_full_simp_tac (simpset() addsimps Un_ac) 1); |
89 by (asm_full_simp_tac (simpset() addsimps Un_ac) 1); |
90 qed "leadsTo_Un_duplicate"; |
90 qed "leadsTo_Un_duplicate"; |
91 |
91 |
92 goal thy "!!Acts. leadsTo Acts A (A' Un C Un C) ==> leadsTo Acts A (A' Un C)"; |
92 Goal "!!Acts. leadsTo Acts A (A' Un C Un C) ==> leadsTo Acts A (A' Un C)"; |
93 by (asm_full_simp_tac (simpset() addsimps Un_ac) 1); |
93 by (asm_full_simp_tac (simpset() addsimps Un_ac) 1); |
94 qed "leadsTo_Un_duplicate2"; |
94 qed "leadsTo_Un_duplicate2"; |
95 |
95 |
96 (*The Union introduction rule as we should have liked to state it*) |
96 (*The Union introduction rule as we should have liked to state it*) |
97 val prems = goal thy |
97 val prems = goal thy |
136 Addsimps [empty_leadsTo]; |
136 Addsimps [empty_leadsTo]; |
137 |
137 |
138 |
138 |
139 (*There's a direct proof by leadsTo_Trans and subset_imp_leadsTo, but it |
139 (*There's a direct proof by leadsTo_Trans and subset_imp_leadsTo, but it |
140 needs the extra premise id:Acts*) |
140 needs the extra premise id:Acts*) |
141 goal thy "!!Acts. leadsTo Acts A A' ==> A'<=B' --> leadsTo Acts A B'"; |
141 Goal "!!Acts. leadsTo Acts A A' ==> A'<=B' --> leadsTo Acts A B'"; |
142 by (etac leadsTo_induct 1); |
142 by (etac leadsTo_induct 1); |
143 by (Clarify_tac 3); |
143 by (Clarify_tac 3); |
144 by (blast_tac (claset() addIs [leadsTo_Union]) 3); |
144 by (blast_tac (claset() addIs [leadsTo_Union]) 3); |
145 by (blast_tac (claset() addIs [leadsTo_Trans]) 2); |
145 by (blast_tac (claset() addIs [leadsTo_Trans]) 2); |
146 by (blast_tac (claset() addIs [leadsTo_Basis, ensures_weaken_R]) 1); |
146 by (blast_tac (claset() addIs [leadsTo_Basis, ensures_weaken_R]) 1); |
147 qed_spec_mp "leadsTo_weaken_R"; |
147 qed_spec_mp "leadsTo_weaken_R"; |
148 |
148 |
149 |
149 |
150 goal thy "!!Acts. [| leadsTo Acts A A'; B<=A; id: Acts |] ==> \ |
150 Goal "!!Acts. [| leadsTo Acts A A'; B<=A; id: Acts |] ==> \ |
151 \ leadsTo Acts B A'"; |
151 \ leadsTo Acts B A'"; |
152 by (blast_tac (claset() addIs [leadsTo_Basis, leadsTo_Trans, |
152 by (blast_tac (claset() addIs [leadsTo_Basis, leadsTo_Trans, |
153 subset_imp_leadsTo]) 1); |
153 subset_imp_leadsTo]) 1); |
154 qed_spec_mp "leadsTo_weaken_L"; |
154 qed_spec_mp "leadsTo_weaken_L"; |
155 |
155 |
156 (*Distributes over binary unions*) |
156 (*Distributes over binary unions*) |
157 goal thy |
157 Goal |
158 "!!C. id: Acts ==> \ |
158 "!!C. id: Acts ==> \ |
159 \ leadsTo Acts (A Un B) C = (leadsTo Acts A C & leadsTo Acts B C)"; |
159 \ leadsTo Acts (A Un B) C = (leadsTo Acts A C & leadsTo Acts B C)"; |
160 by (blast_tac (claset() addIs [leadsTo_Un, leadsTo_weaken_L]) 1); |
160 by (blast_tac (claset() addIs [leadsTo_Un, leadsTo_weaken_L]) 1); |
161 qed "leadsTo_Un_distrib"; |
161 qed "leadsTo_Un_distrib"; |
162 |
162 |
163 goal thy |
163 Goal |
164 "!!C. id: Acts ==> \ |
164 "!!C. id: Acts ==> \ |
165 \ leadsTo Acts (UN i:I. A i) B = (ALL i : I. leadsTo Acts (A i) B)"; |
165 \ leadsTo Acts (UN i:I. A i) B = (ALL i : I. leadsTo Acts (A i) B)"; |
166 by (blast_tac (claset() addIs [leadsTo_UN, leadsTo_weaken_L]) 1); |
166 by (blast_tac (claset() addIs [leadsTo_UN, leadsTo_weaken_L]) 1); |
167 qed "leadsTo_UN_distrib"; |
167 qed "leadsTo_UN_distrib"; |
168 |
168 |
169 goal thy |
169 Goal |
170 "!!C. id: Acts ==> \ |
170 "!!C. id: Acts ==> \ |
171 \ leadsTo Acts (Union S) B = (ALL A : S. leadsTo Acts A B)"; |
171 \ leadsTo Acts (Union S) B = (ALL A : S. leadsTo Acts A B)"; |
172 by (blast_tac (claset() addIs [leadsTo_Union, leadsTo_weaken_L]) 1); |
172 by (blast_tac (claset() addIs [leadsTo_Union, leadsTo_weaken_L]) 1); |
173 qed "leadsTo_Union_distrib"; |
173 qed "leadsTo_Union_distrib"; |
174 |
174 |
175 |
175 |
176 goal thy |
176 Goal |
177 "!!Acts. [| leadsTo Acts A A'; id: Acts; B<=A; A'<=B' |] \ |
177 "!!Acts. [| leadsTo Acts A A'; id: Acts; B<=A; A'<=B' |] \ |
178 \ ==> leadsTo Acts B B'"; |
178 \ ==> leadsTo Acts B B'"; |
179 (*PROOF FAILED: why?*) |
179 (*PROOF FAILED: why?*) |
180 by (blast_tac (claset() addIs [leadsTo_Trans, leadsTo_weaken_R, |
180 by (blast_tac (claset() addIs [leadsTo_Trans, leadsTo_weaken_R, |
181 leadsTo_weaken_L]) 1); |
181 leadsTo_weaken_L]) 1); |
182 qed "leadsTo_weaken"; |
182 qed "leadsTo_weaken"; |
183 |
183 |
184 |
184 |
185 (*Set difference: maybe combine with leadsTo_weaken_L??*) |
185 (*Set difference: maybe combine with leadsTo_weaken_L??*) |
186 goal thy |
186 Goal |
187 "!!C. [| leadsTo Acts (A-B) C; leadsTo Acts B C; id: Acts |] \ |
187 "!!C. [| leadsTo Acts (A-B) C; leadsTo Acts B C; id: Acts |] \ |
188 \ ==> leadsTo Acts A C"; |
188 \ ==> leadsTo Acts A C"; |
189 by (blast_tac (claset() addIs [leadsTo_Un, leadsTo_weaken]) 1); |
189 by (blast_tac (claset() addIs [leadsTo_Un, leadsTo_weaken]) 1); |
190 qed "leadsTo_Diff"; |
190 qed "leadsTo_Diff"; |
191 |
191 |
209 by (blast_tac (claset() addIs [leadsTo_UN_UN] |
209 by (blast_tac (claset() addIs [leadsTo_UN_UN] |
210 addIs prems) 1); |
210 addIs prems) 1); |
211 qed "leadsTo_UN_UN_noindex"; |
211 qed "leadsTo_UN_UN_noindex"; |
212 |
212 |
213 (*Version with no index set*) |
213 (*Version with no index set*) |
214 goal thy |
214 Goal |
215 "!!Acts. ALL i. leadsTo Acts (A i) (A' i) \ |
215 "!!Acts. ALL i. leadsTo Acts (A i) (A' i) \ |
216 \ ==> leadsTo Acts (UN i. A i) (UN i. A' i)"; |
216 \ ==> leadsTo Acts (UN i. A i) (UN i. A' i)"; |
217 by (blast_tac (claset() addIs [leadsTo_UN_UN]) 1); |
217 by (blast_tac (claset() addIs [leadsTo_UN_UN]) 1); |
218 qed "all_leadsTo_UN_UN"; |
218 qed "all_leadsTo_UN_UN"; |
219 |
219 |
220 |
220 |
221 (*Binary union version*) |
221 (*Binary union version*) |
222 goal thy "!!Acts. [| leadsTo Acts A A'; leadsTo Acts B B' |] \ |
222 Goal "!!Acts. [| leadsTo Acts A A'; leadsTo Acts B B' |] \ |
223 \ ==> leadsTo Acts (A Un B) (A' Un B')"; |
223 \ ==> leadsTo Acts (A Un B) (A' Un B')"; |
224 by (blast_tac (claset() addIs [leadsTo_Un, |
224 by (blast_tac (claset() addIs [leadsTo_Un, |
225 leadsTo_weaken_R]) 1); |
225 leadsTo_weaken_R]) 1); |
226 qed "leadsTo_Un_Un"; |
226 qed "leadsTo_Un_Un"; |
227 |
227 |
228 |
228 |
229 (** The cancellation law **) |
229 (** The cancellation law **) |
230 |
230 |
231 goal thy |
231 Goal |
232 "!!Acts. [| leadsTo Acts A (A' Un B); leadsTo Acts B B'; id: Acts |] \ |
232 "!!Acts. [| leadsTo Acts A (A' Un B); leadsTo Acts B B'; id: Acts |] \ |
233 \ ==> leadsTo Acts A (A' Un B')"; |
233 \ ==> leadsTo Acts A (A' Un B')"; |
234 by (blast_tac (claset() addIs [leadsTo_Un_Un, |
234 by (blast_tac (claset() addIs [leadsTo_Un_Un, |
235 subset_imp_leadsTo, leadsTo_Trans]) 1); |
235 subset_imp_leadsTo, leadsTo_Trans]) 1); |
236 qed "leadsTo_cancel2"; |
236 qed "leadsTo_cancel2"; |
237 |
237 |
238 goal thy |
238 Goal |
239 "!!Acts. [| leadsTo Acts A (A' Un B); leadsTo Acts (B-A') B'; id: Acts |] \ |
239 "!!Acts. [| leadsTo Acts A (A' Un B); leadsTo Acts (B-A') B'; id: Acts |] \ |
240 \ ==> leadsTo Acts A (A' Un B')"; |
240 \ ==> leadsTo Acts A (A' Un B')"; |
241 by (rtac leadsTo_cancel2 1); |
241 by (rtac leadsTo_cancel2 1); |
242 by (assume_tac 2); |
242 by (assume_tac 2); |
243 by (ALLGOALS Asm_simp_tac); |
243 by (ALLGOALS Asm_simp_tac); |
244 qed "leadsTo_cancel_Diff2"; |
244 qed "leadsTo_cancel_Diff2"; |
245 |
245 |
246 goal thy |
246 Goal |
247 "!!Acts. [| leadsTo Acts A (B Un A'); leadsTo Acts B B'; id: Acts |] \ |
247 "!!Acts. [| leadsTo Acts A (B Un A'); leadsTo Acts B B'; id: Acts |] \ |
248 \ ==> leadsTo Acts A (B' Un A')"; |
248 \ ==> leadsTo Acts A (B' Un A')"; |
249 by (asm_full_simp_tac (simpset() addsimps [Un_commute]) 1); |
249 by (asm_full_simp_tac (simpset() addsimps [Un_commute]) 1); |
250 by (blast_tac (claset() addSIs [leadsTo_cancel2]) 1); |
250 by (blast_tac (claset() addSIs [leadsTo_cancel2]) 1); |
251 qed "leadsTo_cancel1"; |
251 qed "leadsTo_cancel1"; |
252 |
252 |
253 goal thy |
253 Goal |
254 "!!Acts. [| leadsTo Acts A (B Un A'); leadsTo Acts (B-A') B'; id: Acts |] \ |
254 "!!Acts. [| leadsTo Acts A (B Un A'); leadsTo Acts (B-A') B'; id: Acts |] \ |
255 \ ==> leadsTo Acts A (B' Un A')"; |
255 \ ==> leadsTo Acts A (B' Un A')"; |
256 by (rtac leadsTo_cancel1 1); |
256 by (rtac leadsTo_cancel1 1); |
257 by (assume_tac 2); |
257 by (assume_tac 2); |
258 by (ALLGOALS Asm_simp_tac); |
258 by (ALLGOALS Asm_simp_tac); |
260 |
260 |
261 |
261 |
262 |
262 |
263 (** The impossibility law **) |
263 (** The impossibility law **) |
264 |
264 |
265 goal thy "!!Acts. leadsTo Acts A B ==> B={} --> A={}"; |
265 Goal "!!Acts. leadsTo Acts A B ==> B={} --> A={}"; |
266 by (etac leadsTo_induct 1); |
266 by (etac leadsTo_induct 1); |
267 by (ALLGOALS Asm_simp_tac); |
267 by (ALLGOALS Asm_simp_tac); |
268 by (rewrite_goals_tac [ensures_def, constrains_def, transient_def]); |
268 by (rewrite_goals_tac [ensures_def, constrains_def, transient_def]); |
269 by (Blast_tac 1); |
269 by (Blast_tac 1); |
270 val lemma = result() RS mp; |
270 val lemma = result() RS mp; |
271 |
271 |
272 goal thy "!!Acts. leadsTo Acts A {} ==> A={}"; |
272 Goal "!!Acts. leadsTo Acts A {} ==> A={}"; |
273 by (blast_tac (claset() addSIs [lemma]) 1); |
273 by (blast_tac (claset() addSIs [lemma]) 1); |
274 qed "leadsTo_empty"; |
274 qed "leadsTo_empty"; |
275 |
275 |
276 |
276 |
277 (** PSP: Progress-Safety-Progress **) |
277 (** PSP: Progress-Safety-Progress **) |
278 |
278 |
279 (*Special case of PSP: Misra's "stable conjunction". Doesn't need id:Acts. *) |
279 (*Special case of PSP: Misra's "stable conjunction". Doesn't need id:Acts. *) |
280 goalw thy [stable_def] |
280 Goalw [stable_def] |
281 "!!Acts. [| leadsTo Acts A A'; stable Acts B |] \ |
281 "!!Acts. [| leadsTo Acts A A'; stable Acts B |] \ |
282 \ ==> leadsTo Acts (A Int B) (A' Int B)"; |
282 \ ==> leadsTo Acts (A Int B) (A' Int B)"; |
283 by (etac leadsTo_induct 1); |
283 by (etac leadsTo_induct 1); |
284 by (simp_tac (simpset() addsimps [Int_Union_Union]) 3); |
284 by (simp_tac (simpset() addsimps [Int_Union_Union]) 3); |
285 by (blast_tac (claset() addIs [leadsTo_Union]) 3); |
285 by (blast_tac (claset() addIs [leadsTo_Union]) 3); |
289 (simpset() addsimps [ensures_def, |
289 (simpset() addsimps [ensures_def, |
290 Diff_Int_distrib2 RS sym, Int_Un_distrib2 RS sym]) 1); |
290 Diff_Int_distrib2 RS sym, Int_Un_distrib2 RS sym]) 1); |
291 by (blast_tac (claset() addIs [transient_strengthen, constrains_Int]) 1); |
291 by (blast_tac (claset() addIs [transient_strengthen, constrains_Int]) 1); |
292 qed "PSP_stable"; |
292 qed "PSP_stable"; |
293 |
293 |
294 goal thy |
294 Goal |
295 "!!Acts. [| leadsTo Acts A A'; stable Acts B |] \ |
295 "!!Acts. [| leadsTo Acts A A'; stable Acts B |] \ |
296 \ ==> leadsTo Acts (B Int A) (B Int A')"; |
296 \ ==> leadsTo Acts (B Int A) (B Int A')"; |
297 by (asm_simp_tac (simpset() addsimps (PSP_stable::Int_ac)) 1); |
297 by (asm_simp_tac (simpset() addsimps (PSP_stable::Int_ac)) 1); |
298 qed "PSP_stable2"; |
298 qed "PSP_stable2"; |
299 |
299 |
300 |
300 |
301 goalw thy [ensures_def] |
301 Goalw [ensures_def] |
302 "!!Acts. [| ensures Acts A A'; constrains Acts B B' |] \ |
302 "!!Acts. [| ensures Acts A A'; constrains Acts B B' |] \ |
303 \ ==> ensures Acts (A Int B) ((A' Int B) Un (B' - B))"; |
303 \ ==> ensures Acts (A Int B) ((A' Int B) Un (B' - B))"; |
304 by Safe_tac; |
304 by Safe_tac; |
305 by (blast_tac (claset() addIs [constrainsI] addDs [constrainsD]) 1); |
305 by (blast_tac (claset() addIs [constrainsI] addDs [constrainsD]) 1); |
306 by (etac transient_strengthen 1); |
306 by (etac transient_strengthen 1); |
307 by (Blast_tac 1); |
307 by (Blast_tac 1); |
308 qed "PSP_ensures"; |
308 qed "PSP_ensures"; |
309 |
309 |
310 |
310 |
311 goal thy |
311 Goal |
312 "!!Acts. [| leadsTo Acts A A'; constrains Acts B B'; id: Acts |] \ |
312 "!!Acts. [| leadsTo Acts A A'; constrains Acts B B'; id: Acts |] \ |
313 \ ==> leadsTo Acts (A Int B) ((A' Int B) Un (B' - B))"; |
313 \ ==> leadsTo Acts (A Int B) ((A' Int B) Un (B' - B))"; |
314 by (etac leadsTo_induct 1); |
314 by (etac leadsTo_induct 1); |
315 by (simp_tac (simpset() addsimps [Int_Union_Union]) 3); |
315 by (simp_tac (simpset() addsimps [Int_Union_Union]) 3); |
316 by (blast_tac (claset() addIs [leadsTo_Union]) 3); |
316 by (blast_tac (claset() addIs [leadsTo_Union]) 3); |
321 by (asm_full_simp_tac (simpset() addsimps [Int_Diff, Diff_triv]) 2); |
321 by (asm_full_simp_tac (simpset() addsimps [Int_Diff, Diff_triv]) 2); |
322 (*Basis case*) |
322 (*Basis case*) |
323 by (blast_tac (claset() addIs [leadsTo_Basis, PSP_ensures]) 1); |
323 by (blast_tac (claset() addIs [leadsTo_Basis, PSP_ensures]) 1); |
324 qed "PSP"; |
324 qed "PSP"; |
325 |
325 |
326 goal thy |
326 Goal |
327 "!!Acts. [| leadsTo Acts A A'; constrains Acts B B'; id: Acts |] \ |
327 "!!Acts. [| leadsTo Acts A A'; constrains Acts B B'; id: Acts |] \ |
328 \ ==> leadsTo Acts (B Int A) ((B Int A') Un (B' - B))"; |
328 \ ==> leadsTo Acts (B Int A) ((B Int A') Un (B' - B))"; |
329 by (asm_simp_tac (simpset() addsimps (PSP::Int_ac)) 1); |
329 by (asm_simp_tac (simpset() addsimps (PSP::Int_ac)) 1); |
330 qed "PSP2"; |
330 qed "PSP2"; |
331 |
331 |
332 |
332 |
333 goalw thy [unless_def] |
333 Goalw [unless_def] |
334 "!!Acts. [| leadsTo Acts A A'; unless Acts B B'; id: Acts |] \ |
334 "!!Acts. [| leadsTo Acts A A'; unless Acts B B'; id: Acts |] \ |
335 \ ==> leadsTo Acts (A Int B) ((A' Int B) Un B')"; |
335 \ ==> leadsTo Acts (A Int B) ((A' Int B) Un B')"; |
336 by (dtac PSP 1); |
336 by (dtac PSP 1); |
337 by (assume_tac 1); |
337 by (assume_tac 1); |
338 by (asm_full_simp_tac (simpset() addsimps [Un_Diff_Diff, Int_Diff_Un]) 2); |
338 by (asm_full_simp_tac (simpset() addsimps [Un_Diff_Diff, Int_Diff_Un]) 2); |
388 by (blast_tac (claset() addIs [subset_imp_leadsTo]) 1); |
388 by (blast_tac (claset() addIs [subset_imp_leadsTo]) 1); |
389 qed "bounded_induct"; |
389 qed "bounded_induct"; |
390 |
390 |
391 |
391 |
392 (*Alternative proof is via the lemma leadsTo Acts (A Int f-``(lessThan m)) B*) |
392 (*Alternative proof is via the lemma leadsTo Acts (A Int f-``(lessThan m)) B*) |
393 goal thy |
393 Goal |
394 "!!Acts. [| ALL m. leadsTo Acts (A Int f-``{m}) \ |
394 "!!Acts. [| ALL m. leadsTo Acts (A Int f-``{m}) \ |
395 \ ((A Int f-``(lessThan m)) Un B); \ |
395 \ ((A Int f-``(lessThan m)) Un B); \ |
396 \ id: Acts |] \ |
396 \ id: Acts |] \ |
397 \ ==> leadsTo Acts A B"; |
397 \ ==> leadsTo Acts A B"; |
398 by (rtac (wf_less_than RS leadsTo_wf_induct) 1); |
398 by (rtac (wf_less_than RS leadsTo_wf_induct) 1); |
399 by (assume_tac 2); |
399 by (assume_tac 2); |
400 by (Asm_simp_tac 1); |
400 by (Asm_simp_tac 1); |
401 qed "lessThan_induct"; |
401 qed "lessThan_induct"; |
402 |
402 |
403 goal thy |
403 Goal |
404 "!!Acts. [| ALL m:(greaterThan l). leadsTo Acts (A Int f-``{m}) \ |
404 "!!Acts. [| ALL m:(greaterThan l). leadsTo Acts (A Int f-``{m}) \ |
405 \ ((A Int f-``(lessThan m)) Un B); \ |
405 \ ((A Int f-``(lessThan m)) Un B); \ |
406 \ id: Acts |] \ |
406 \ id: Acts |] \ |
407 \ ==> leadsTo Acts A ((A Int (f-``(atMost l))) Un B)"; |
407 \ ==> leadsTo Acts A ((A Int (f-``(atMost l))) Un B)"; |
408 by (simp_tac (HOL_ss addsimps [Diff_eq RS sym, vimage_Compl, Compl_greaterThan RS sym]) 1); |
408 by (simp_tac (HOL_ss addsimps [Diff_eq RS sym, vimage_Compl, Compl_greaterThan RS sym]) 1); |
409 by (rtac (wf_less_than RS bounded_induct) 1); |
409 by (rtac (wf_less_than RS bounded_induct) 1); |
410 by (assume_tac 2); |
410 by (assume_tac 2); |
411 by (Asm_simp_tac 1); |
411 by (Asm_simp_tac 1); |
412 qed "lessThan_bounded_induct"; |
412 qed "lessThan_bounded_induct"; |
413 |
413 |
414 goal thy |
414 Goal |
415 "!!Acts. [| ALL m:(lessThan l). leadsTo Acts (A Int f-``{m}) \ |
415 "!!Acts. [| ALL m:(lessThan l). leadsTo Acts (A Int f-``{m}) \ |
416 \ ((A Int f-``(greaterThan m)) Un B); \ |
416 \ ((A Int f-``(greaterThan m)) Un B); \ |
417 \ id: Acts |] \ |
417 \ id: Acts |] \ |
418 \ ==> leadsTo Acts A ((A Int (f-``(atLeast l))) Un B)"; |
418 \ ==> leadsTo Acts A ((A Int (f-``(atLeast l))) Un B)"; |
419 by (res_inst_tac [("f","f"),("f1", "%k. l - k")] |
419 by (res_inst_tac [("f","f"),("f1", "%k. l - k")] |
429 |
429 |
430 |
430 |
431 (*** wlt ****) |
431 (*** wlt ****) |
432 |
432 |
433 (*Misra's property W3*) |
433 (*Misra's property W3*) |
434 goalw thy [wlt_def] "leadsTo Acts (wlt Acts B) B"; |
434 Goalw [wlt_def] "leadsTo Acts (wlt Acts B) B"; |
435 by (blast_tac (claset() addSIs [leadsTo_Union]) 1); |
435 by (blast_tac (claset() addSIs [leadsTo_Union]) 1); |
436 qed "wlt_leadsTo"; |
436 qed "wlt_leadsTo"; |
437 |
437 |
438 goalw thy [wlt_def] "!!Acts. leadsTo Acts A B ==> A <= wlt Acts B"; |
438 Goalw [wlt_def] "!!Acts. leadsTo Acts A B ==> A <= wlt Acts B"; |
439 by (blast_tac (claset() addSIs [leadsTo_Union]) 1); |
439 by (blast_tac (claset() addSIs [leadsTo_Union]) 1); |
440 qed "leadsTo_subset"; |
440 qed "leadsTo_subset"; |
441 |
441 |
442 (*Misra's property W2*) |
442 (*Misra's property W2*) |
443 goal thy "!!Acts. id: Acts ==> leadsTo Acts A B = (A <= wlt Acts B)"; |
443 Goal "!!Acts. id: Acts ==> leadsTo Acts A B = (A <= wlt Acts B)"; |
444 by (blast_tac (claset() addSIs [leadsTo_subset, |
444 by (blast_tac (claset() addSIs [leadsTo_subset, |
445 wlt_leadsTo RS leadsTo_weaken_L]) 1); |
445 wlt_leadsTo RS leadsTo_weaken_L]) 1); |
446 qed "leadsTo_eq_subset_wlt"; |
446 qed "leadsTo_eq_subset_wlt"; |
447 |
447 |
448 (*Misra's property W4*) |
448 (*Misra's property W4*) |
449 goal thy "!!Acts. id: Acts ==> B <= wlt Acts B"; |
449 Goal "!!Acts. id: Acts ==> B <= wlt Acts B"; |
450 by (asm_simp_tac (simpset() addsimps [leadsTo_eq_subset_wlt RS sym, |
450 by (asm_simp_tac (simpset() addsimps [leadsTo_eq_subset_wlt RS sym, |
451 subset_imp_leadsTo]) 1); |
451 subset_imp_leadsTo]) 1); |
452 qed "wlt_increasing"; |
452 qed "wlt_increasing"; |
453 |
453 |
454 |
454 |
455 (*Used in the Trans case below*) |
455 (*Used in the Trans case below*) |
456 goalw thy [constrains_def] |
456 Goalw [constrains_def] |
457 "!!Acts. [| B <= A2; \ |
457 "!!Acts. [| B <= A2; \ |
458 \ constrains Acts (A1 - B) (A1 Un B); \ |
458 \ constrains Acts (A1 - B) (A1 Un B); \ |
459 \ constrains Acts (A2 - C) (A2 Un C) |] \ |
459 \ constrains Acts (A2 - C) (A2 Un C) |] \ |
460 \ ==> constrains Acts (A1 Un A2 - C) (A1 Un A2 Un C)"; |
460 \ ==> constrains Acts (A1 Un A2 - C) (A1 Un A2 Un C)"; |
461 by (Clarify_tac 1); |
461 by (Clarify_tac 1); |
462 by (blast_tac (claset() addSDs [bspec]) 1); |
462 by (blast_tac (claset() addSDs [bspec]) 1); |
463 val lemma1 = result(); |
463 val lemma1 = result(); |
464 |
464 |
465 |
465 |
466 (*Lemma (1,2,3) of Misra's draft book, Chapter 4, "Progress"*) |
466 (*Lemma (1,2,3) of Misra's draft book, Chapter 4, "Progress"*) |
467 goal thy |
467 Goal |
468 "!!Acts. [| leadsTo Acts A A'; id: Acts |] ==> \ |
468 "!!Acts. [| leadsTo Acts A A'; id: Acts |] ==> \ |
469 \ EX B. A<=B & leadsTo Acts B A' & constrains Acts (B-A') (B Un A')"; |
469 \ EX B. A<=B & leadsTo Acts B A' & constrains Acts (B-A') (B Un A')"; |
470 by (etac leadsTo_induct 1); |
470 by (etac leadsTo_induct 1); |
471 (*Basis*) |
471 (*Basis*) |
472 by (blast_tac (claset() addIs [leadsTo_Basis] |
472 by (blast_tac (claset() addIs [leadsTo_Basis] |
517 (*Blast_tac gives PROOF FAILED*) |
517 (*Blast_tac gives PROOF FAILED*) |
518 by (best_tac (claset() addIs [leadsTo_Trans]) 1); |
518 by (best_tac (claset() addIs [leadsTo_Trans]) 1); |
519 qed "stable_completion"; |
519 qed "stable_completion"; |
520 |
520 |
521 |
521 |
522 goal thy |
522 Goal |
523 "!!Acts. [| finite I; id: Acts |] \ |
523 "!!Acts. [| finite I; id: Acts |] \ |
524 \ ==> (ALL i:I. leadsTo Acts (A i) (A' i)) --> \ |
524 \ ==> (ALL i:I. leadsTo Acts (A i) (A' i)) --> \ |
525 \ (ALL i:I. stable Acts (A' i)) --> \ |
525 \ (ALL i:I. stable Acts (A' i)) --> \ |
526 \ leadsTo Acts (INT i:I. A i) (INT i:I. A' i)"; |
526 \ leadsTo Acts (INT i:I. A i) (INT i:I. A' i)"; |
527 by (etac finite_induct 1); |
527 by (etac finite_induct 1); |
530 (simpset() addsimps [stable_completion, stable_def, |
530 (simpset() addsimps [stable_completion, stable_def, |
531 ball_constrains_INT]) 1); |
531 ball_constrains_INT]) 1); |
532 qed_spec_mp "finite_stable_completion"; |
532 qed_spec_mp "finite_stable_completion"; |
533 |
533 |
534 |
534 |
535 goal thy |
535 Goal |
536 "!!Acts. [| W = wlt Acts (B' Un C); \ |
536 "!!Acts. [| W = wlt Acts (B' Un C); \ |
537 \ leadsTo Acts A (A' Un C); constrains Acts A' (A' Un C); \ |
537 \ leadsTo Acts A (A' Un C); constrains Acts A' (A' Un C); \ |
538 \ leadsTo Acts B (B' Un C); constrains Acts B' (B' Un C); \ |
538 \ leadsTo Acts B (B' Un C); constrains Acts B' (B' Un C); \ |
539 \ id: Acts |] \ |
539 \ id: Acts |] \ |
540 \ ==> leadsTo Acts (A Int B) ((A' Int B') Un C)"; |
540 \ ==> leadsTo Acts (A Int B) ((A' Int B') Un C)"; |
560 delrules [subsetI]) 2); |
560 delrules [subsetI]) 2); |
561 by (blast_tac (claset() addIs [leadsTo_Trans, subset_imp_leadsTo]) 1); |
561 by (blast_tac (claset() addIs [leadsTo_Trans, subset_imp_leadsTo]) 1); |
562 bind_thm("completion", refl RS result()); |
562 bind_thm("completion", refl RS result()); |
563 |
563 |
564 |
564 |
565 goal thy |
565 Goal |
566 "!!Acts. [| finite I; id: Acts |] \ |
566 "!!Acts. [| finite I; id: Acts |] \ |
567 \ ==> (ALL i:I. leadsTo Acts (A i) (A' i Un C)) --> \ |
567 \ ==> (ALL i:I. leadsTo Acts (A i) (A' i Un C)) --> \ |
568 \ (ALL i:I. constrains Acts (A' i) (A' i Un C)) --> \ |
568 \ (ALL i:I. constrains Acts (A' i) (A' i Un C)) --> \ |
569 \ leadsTo Acts (INT i:I. A i) ((INT i:I. A' i) Un C)"; |
569 \ leadsTo Acts (INT i:I. A i) ((INT i:I. A' i) Un C)"; |
570 by (etac finite_induct 1); |
570 by (etac finite_induct 1); |