equal
deleted
inserted
replaced
68 qed "LeadsTo_Union"; |
68 qed "LeadsTo_Union"; |
69 |
69 |
70 (*** Derived rules ***) |
70 (*** Derived rules ***) |
71 |
71 |
72 Goal "F : A leadsTo B ==> F : A LeadsTo B"; |
72 Goal "F : A leadsTo B ==> F : A LeadsTo B"; |
73 by (forward_tac [leadsToD2] 1); |
73 by (ftac leadsToD2 1); |
74 by (Clarify_tac 1); |
74 by (Clarify_tac 1); |
75 by (asm_simp_tac (simpset() addsimps [LeadsTo_eq]) 1); |
75 by (asm_simp_tac (simpset() addsimps [LeadsTo_eq]) 1); |
76 by (blast_tac (claset() addIs [leadsTo_weaken_L]) 1); |
76 by (blast_tac (claset() addIs [leadsTo_weaken_L]) 1); |
77 qed "leadsTo_imp_LeadsTo"; |
77 qed "leadsTo_imp_LeadsTo"; |
78 |
78 |
104 (*Lets us look at the starting state*) |
104 (*Lets us look at the starting state*) |
105 val [major, program] = Goal |
105 val [major, program] = Goal |
106 "[|(!!s. s:A ==> F:{s} LeadsTo B); F:program|]==>F:A LeadsTo B"; |
106 "[|(!!s. s:A ==> F:{s} LeadsTo B); F:program|]==>F:A LeadsTo B"; |
107 by (cut_facts_tac [program] 1); |
107 by (cut_facts_tac [program] 1); |
108 by (stac (UN_singleton RS sym) 1 THEN rtac LeadsTo_UN 1); |
108 by (stac (UN_singleton RS sym) 1 THEN rtac LeadsTo_UN 1); |
109 by (forward_tac [major] 1); |
109 by (ftac major 1); |
110 by Auto_tac; |
110 by Auto_tac; |
111 qed "single_LeadsTo_I"; |
111 qed "single_LeadsTo_I"; |
112 |
112 |
113 Goal "[| A <= B; F:program |] ==> F : A LeadsTo B"; |
113 Goal "[| A <= B; F:program |] ==> F : A LeadsTo B"; |
114 by (asm_simp_tac (simpset() addsimps [LeadsTo_def]) 1); |
114 by (asm_simp_tac (simpset() addsimps [LeadsTo_def]) 1); |
207 "[|(!!i. i:I ==> F: A(i) LeadsTo A'(i)); F:program |] \ |
207 "[|(!!i. i:I ==> F: A(i) LeadsTo A'(i)); F:program |] \ |
208 \ ==> F : (UN i:I. A(i)) LeadsTo (UN i:I. A'(i))"; |
208 \ ==> F : (UN i:I. A(i)) LeadsTo (UN i:I. A'(i))"; |
209 by (cut_facts_tac [minor] 1); |
209 by (cut_facts_tac [minor] 1); |
210 by (rtac LeadsTo_Union 1); |
210 by (rtac LeadsTo_Union 1); |
211 by (ALLGOALS(Clarify_tac)); |
211 by (ALLGOALS(Clarify_tac)); |
212 by (forward_tac [major] 1); |
212 by (ftac major 1); |
213 by (blast_tac (claset() addIs [LeadsTo_weaken_R]) 1); |
213 by (blast_tac (claset() addIs [LeadsTo_weaken_R]) 1); |
214 qed "LeadsTo_UN_UN"; |
214 qed "LeadsTo_UN_UN"; |
215 |
215 |
216 (*Binary union version*) |
216 (*Binary union version*) |
217 Goal "[| F:A LeadsTo A'; F:B LeadsTo B' |] ==> F:(A Un B) LeadsTo (A' Un B')"; |
217 Goal "[| F:A LeadsTo A'; F:B LeadsTo B' |] ==> F:(A Un B) LeadsTo (A' Un B')"; |
283 by (asm_simp_tac (simpset() addsimps PSP::Int_ac) 1); |
283 by (asm_simp_tac (simpset() addsimps PSP::Int_ac) 1); |
284 qed "PSP2"; |
284 qed "PSP2"; |
285 |
285 |
286 Goal |
286 Goal |
287 "[| F : A LeadsTo A'; F : B Unless B'|]==> F:(A Int B) LeadsTo ((A' Int B) Un B')"; |
287 "[| F : A LeadsTo A'; F : B Unless B'|]==> F:(A Int B) LeadsTo ((A' Int B) Un B')"; |
288 by (rewrite_goals_tac [Unless_def]); |
288 by (rewtac Unless_def); |
289 by (dtac PSP 1); |
289 by (dtac PSP 1); |
290 by (assume_tac 1); |
290 by (assume_tac 1); |
291 by (blast_tac (claset() addIs [LeadsTo_Diff, LeadsTo_weaken, subset_imp_LeadsTo]) 1); |
291 by (blast_tac (claset() addIs [LeadsTo_Diff, LeadsTo_weaken, subset_imp_LeadsTo]) 1); |
292 qed "PSP_Unless"; |
292 qed "PSP_Unless"; |
293 |
293 |