135 "[| F : A Co A'; B<=A; A'<=B' |] ==> F : B Co B'"; |
135 "[| F : A Co A'; B<=A; A'<=B' |] ==> F : B Co B'"; |
136 by (blast_tac (claset() addIs [constrains_weaken, st_set_subset]) 1); |
136 by (blast_tac (claset() addIs [constrains_weaken, st_set_subset]) 1); |
137 qed "Constrains_weaken"; |
137 qed "Constrains_weaken"; |
138 |
138 |
139 (** Union **) |
139 (** Union **) |
140 Goalw [Constrains_def2] |
140 Goalw [Constrains_def2] |
141 "[| F : A Co A'; F : B Co B' |] ==> F : (A Un B) Co (A' Un B')"; |
141 "[| F : A Co A'; F : B Co B' |] ==> F : (A Un B) Co (A' Un B')"; |
142 by Auto_tac; |
142 by Auto_tac; |
143 by (asm_full_simp_tac (simpset() addsimps [Int_Un_distrib2 RS sym]) 1); |
143 by (asm_full_simp_tac (simpset() addsimps [Int_Un_distrib]) 1); |
144 by (blast_tac (claset() addIs [constrains_Un]) 1); |
144 by (blast_tac (claset() addIs [constrains_Un]) 1); |
145 qed "Constrains_Un"; |
145 qed "Constrains_Un"; |
146 |
146 |
147 val [major, minor] = Goalw [Constrains_def2] |
147 val [major, minor] = Goalw [Constrains_def2] |
148 "[|(!!i. i:I==>F:A(i) Co A'(i)); F:program|] ==> F:(UN i:I. A(i)) Co (UN i:I. A'(i))"; |
148 "[|(!!i. i:I==>F:A(i) Co A'(i)); F:program|] ==> F:(UN i:I. A(i)) Co (UN i:I. A'(i))"; |
149 by (cut_facts_tac [minor] 1); |
149 by (cut_facts_tac [minor] 1); |
150 by (auto_tac (claset() addDs [major] |
150 by (auto_tac (claset() addDs [major] |
151 addIs [constrains_UN], |
151 addIs [constrains_UN], |
152 simpset() addsimps [Int_UN_distrib])); |
152 simpset() delsimps UN_simps addsimps [Int_UN_distrib])); |
153 qed "Constrains_UN"; |
153 qed "Constrains_UN"; |
154 |
154 |
155 (** Intersection **) |
155 (** Intersection **) |
156 |
156 |
157 Goalw [Constrains_def] |
157 Goalw [Constrains_def] |
168 by (case_tac "I=0" 1); |
168 by (case_tac "I=0" 1); |
169 by (asm_full_simp_tac (simpset() addsimps [Inter_def]) 1); |
169 by (asm_full_simp_tac (simpset() addsimps [Inter_def]) 1); |
170 by (subgoal_tac "reachable(F) Int Inter(RepFun(I, A)) = (INT i:I. reachable(F) Int A(i))" 1); |
170 by (subgoal_tac "reachable(F) Int Inter(RepFun(I, A)) = (INT i:I. reachable(F) Int A(i))" 1); |
171 by (force_tac (claset(), simpset() addsimps [Inter_def]) 2); |
171 by (force_tac (claset(), simpset() addsimps [Inter_def]) 2); |
172 by (asm_full_simp_tac (simpset() addsimps [Constrains_def]) 1); |
172 by (asm_full_simp_tac (simpset() addsimps [Constrains_def]) 1); |
|
173 by (subgoal_tac "reachable(F) Int Inter(RepFun(I, A)) = (INT i:I. reachable(F) Int A(i))" 1); |
|
174 by (Force_tac 2); |
|
175 by (asm_simp_tac (simpset() delsimps INT_simps) 1); |
173 by (rtac constrains_INT 1); |
176 by (rtac constrains_INT 1); |
174 by (etac not_emptyE 1); |
177 by (etac not_emptyE 1); |
175 by (dresolve_tac [major] 1); |
178 by (dresolve_tac [major] 1); |
176 by (rewrite_goal_tac [Constrains_def] 1); |
179 by (rewrite_goal_tac [Constrains_def] 1); |
177 by (ALLGOALS(Asm_full_simp_tac)); |
180 by (ALLGOALS(Asm_full_simp_tac)); |
186 by (blast_tac (claset() addIs [constrains_trans, constrains_weaken]) 1); |
189 by (blast_tac (claset() addIs [constrains_trans, constrains_weaken]) 1); |
187 qed "Constrains_trans"; |
190 qed "Constrains_trans"; |
188 |
191 |
189 Goalw [Constrains_def2] |
192 Goalw [Constrains_def2] |
190 "[| F : A Co (A' Un B); F : B Co B' |] ==> F : A Co (A' Un B')"; |
193 "[| F : A Co (A' Un B); F : B Co B' |] ==> F : A Co (A' Un B')"; |
191 by (full_simp_tac (simpset() addsimps [Int_Un_distrib2 RS sym]) 1); |
194 by (full_simp_tac (simpset() addsimps [Int_Un_distrib]) 1); |
192 by (blast_tac (claset() addIs [constrains_cancel]) 1); |
195 by (blast_tac (claset() addIs [constrains_cancel]) 1); |
193 qed "Constrains_cancel"; |
196 qed "Constrains_cancel"; |
194 |
197 |
195 (*** Stable ***) |
198 (*** Stable ***) |
196 (* Useful because there's no Stable_weaken. [Tanja Vos] *) |
199 (* Useful because there's no Stable_weaken. [Tanja Vos] *) |