94 by (best_tac (sum_cs addSEs [raddE]) 1); |
94 by (best_tac (sum_cs addSEs [raddE]) 1); |
95 qed "wf_on_radd"; |
95 qed "wf_on_radd"; |
96 |
96 |
97 goal OrderArith.thy |
97 goal OrderArith.thy |
98 "!!r s. [| wf(r); wf(s) |] ==> wf(radd(field(r),r,field(s),s))"; |
98 "!!r s. [| wf(r); wf(s) |] ==> wf(radd(field(r),r,field(s),s))"; |
99 by (asm_full_simp_tac (ZF_ss addsimps [wf_iff_wf_on_field]) 1); |
99 by (asm_full_simp_tac (!simpset addsimps [wf_iff_wf_on_field]) 1); |
100 by (rtac (field_radd RSN (2, wf_on_subset_A)) 1); |
100 by (rtac (field_radd RSN (2, wf_on_subset_A)) 1); |
101 by (REPEAT (ares_tac [wf_on_radd] 1)); |
101 by (REPEAT (ares_tac [wf_on_radd] 1)); |
102 qed "wf_radd"; |
102 qed "wf_radd"; |
103 |
103 |
104 goal OrderArith.thy |
104 goal OrderArith.thy |
105 "!!r s. [| well_ord(A,r); well_ord(B,s) |] ==> \ |
105 "!!r s. [| well_ord(A,r); well_ord(B,s) |] ==> \ |
106 \ well_ord(A+B, radd(A,r,B,s))"; |
106 \ well_ord(A+B, radd(A,r,B,s))"; |
107 by (rtac well_ordI 1); |
107 by (rtac well_ordI 1); |
108 by (asm_full_simp_tac (ZF_ss addsimps [well_ord_def, wf_on_radd]) 1); |
108 by (asm_full_simp_tac (!simpset addsimps [well_ord_def, wf_on_radd]) 1); |
109 by (asm_full_simp_tac |
109 by (asm_full_simp_tac |
110 (ZF_ss addsimps [well_ord_def, tot_ord_def, linear_radd]) 1); |
110 (!simpset addsimps [well_ord_def, tot_ord_def, linear_radd]) 1); |
111 qed "well_ord_radd"; |
111 qed "well_ord_radd"; |
112 |
112 |
113 (** An ord_iso congruence law **) |
113 (** An ord_iso congruence law **) |
114 |
|
115 val case_ss = |
|
116 bij_inverse_ss addsimps [Inl_iff, Inl_Inr_iff, Inr_iff, Inr_Inl_iff, |
|
117 case_Inl, case_Inr, InlI, InrI]; |
|
118 |
114 |
119 goal OrderArith.thy |
115 goal OrderArith.thy |
120 "!!f g. [| f: bij(A,C); g: bij(B,D) |] ==> \ |
116 "!!f g. [| f: bij(A,C); g: bij(B,D) |] ==> \ |
121 \ (lam z:A+B. case(%x. Inl(f`x), %y. Inr(g`y), z)) : bij(A+B, C+D)"; |
117 \ (lam z:A+B. case(%x. Inl(f`x), %y. Inr(g`y), z)) : bij(A+B, C+D)"; |
122 by (res_inst_tac |
118 by (res_inst_tac |
123 [("d", "case(%x. Inl(converse(f)`x), %y. Inr(converse(g)`y))")] |
119 [("d", "case(%x. Inl(converse(f)`x), %y. Inr(converse(g)`y))")] |
124 lam_bijective 1); |
120 lam_bijective 1); |
125 by (safe_tac (ZF_cs addSEs [sumE])); |
121 by (safe_tac (!claset addSEs [sumE])); |
126 by (ALLGOALS (asm_simp_tac case_ss)); |
122 by (ALLGOALS (asm_simp_tac bij_inverse_ss)); |
127 qed "sum_bij"; |
123 qed "sum_bij"; |
128 |
124 |
129 goalw OrderArith.thy [ord_iso_def] |
125 goalw OrderArith.thy [ord_iso_def] |
130 "!!r s. [| f: ord_iso(A,r,A',r'); g: ord_iso(B,s,B',s') |] ==> \ |
126 "!!r s. [| f: ord_iso(A,r,A',r'); g: ord_iso(B,s,B',s') |] ==> \ |
131 \ (lam z:A+B. case(%x. Inl(f`x), %y. Inr(g`y), z)) \ |
127 \ (lam z:A+B. case(%x. Inl(f`x), %y. Inr(g`y), z)) \ |
132 \ : ord_iso(A+B, radd(A,r,B,s), A'+B', radd(A',r',B',s'))"; |
128 \ : ord_iso(A+B, radd(A,r,B,s), A'+B', radd(A',r',B',s'))"; |
133 by (safe_tac (ZF_cs addSIs [sum_bij])); |
129 by (safe_tac (!claset addSIs [sum_bij])); |
134 (*Do the beta-reductions now*) |
130 (*Do the beta-reductions now*) |
135 by (ALLGOALS (asm_full_simp_tac ZF_ss)); |
131 by (ALLGOALS (Asm_full_simp_tac)); |
136 by (safe_tac sum_cs); |
132 by (safe_tac sum_cs); |
137 (*8 subgoals!*) |
133 (*8 subgoals!*) |
138 by (ALLGOALS |
134 by (ALLGOALS |
139 (asm_full_simp_tac |
135 (asm_full_simp_tac |
140 (radd_ss addcongs [conj_cong] addsimps [bij_is_fun RS apply_type]))); |
136 (!simpset addcongs [conj_cong] addsimps [bij_is_fun RS apply_type]))); |
141 qed "sum_ord_iso_cong"; |
137 qed "sum_ord_iso_cong"; |
142 |
138 |
143 (*Could we prove an ord_iso result? Perhaps |
139 (*Could we prove an ord_iso result? Perhaps |
144 ord_iso(A+B, radd(A,r,B,s), A Un B, r Un s) *) |
140 ord_iso(A+B, radd(A,r,B,s), A Un B, r Un s) *) |
145 goal OrderArith.thy |
141 goal OrderArith.thy |
148 by (res_inst_tac [("d", "%z. if(z:A, Inl(z), Inr(z))")] |
144 by (res_inst_tac [("d", "%z. if(z:A, Inl(z), Inr(z))")] |
149 lam_bijective 1); |
145 lam_bijective 1); |
150 by (fast_tac (sum_cs addSIs [if_type]) 2); |
146 by (fast_tac (sum_cs addSIs [if_type]) 2); |
151 by (DEPTH_SOLVE_1 (eresolve_tac [case_type, UnI1, UnI2] 1)); |
147 by (DEPTH_SOLVE_1 (eresolve_tac [case_type, UnI1, UnI2] 1)); |
152 by (safe_tac sum_cs); |
148 by (safe_tac sum_cs); |
153 by (ALLGOALS (asm_simp_tac (sum_ss setloop split_tac [expand_if]))); |
149 by (ALLGOALS (asm_simp_tac (!simpset setloop split_tac [expand_if]))); |
154 by (fast_tac (ZF_cs addEs [equalityE]) 1); |
150 by (fast_tac (!claset addEs [equalityE]) 1); |
155 qed "sum_disjoint_bij"; |
151 qed "sum_disjoint_bij"; |
156 |
152 |
157 (** Associativity **) |
153 (** Associativity **) |
158 |
154 |
159 goal OrderArith.thy |
155 goal OrderArith.thy |
160 "(lam z:(A+B)+C. case(case(Inl, %y.Inr(Inl(y))), %y. Inr(Inr(y)), z)) \ |
156 "(lam z:(A+B)+C. case(case(Inl, %y.Inr(Inl(y))), %y. Inr(Inr(y)), z)) \ |
161 \ : bij((A+B)+C, A+(B+C))"; |
157 \ : bij((A+B)+C, A+(B+C))"; |
162 by (res_inst_tac [("d", "case(%x.Inl(Inl(x)), case(%x.Inl(Inr(x)), Inr))")] |
158 by (res_inst_tac [("d", "case(%x.Inl(Inl(x)), case(%x.Inl(Inr(x)), Inr))")] |
163 lam_bijective 1); |
159 lam_bijective 1); |
164 by (ALLGOALS (asm_simp_tac (case_ss setloop etac sumE))); |
160 by (ALLGOALS (asm_simp_tac (!simpset setloop etac sumE))); |
165 qed "sum_assoc_bij"; |
161 qed "sum_assoc_bij"; |
166 |
162 |
167 goal OrderArith.thy |
163 goal OrderArith.thy |
168 "(lam z:(A+B)+C. case(case(Inl, %y.Inr(Inl(y))), %y. Inr(Inr(y)), z)) \ |
164 "(lam z:(A+B)+C. case(case(Inl, %y.Inr(Inl(y))), %y. Inr(Inr(y)), z)) \ |
169 \ : ord_iso((A+B)+C, radd(A+B, radd(A,r,B,s), C, t), \ |
165 \ : ord_iso((A+B)+C, radd(A+B, radd(A,r,B,s), C, t), \ |
170 \ A+(B+C), radd(A, r, B+C, radd(B,s,C,t)))"; |
166 \ A+(B+C), radd(A, r, B+C, radd(B,s,C,t)))"; |
171 by (resolve_tac [sum_assoc_bij RS ord_isoI] 1); |
167 by (resolve_tac [sum_assoc_bij RS ord_isoI] 1); |
172 by (REPEAT_FIRST (etac sumE)); |
168 by (REPEAT_FIRST (etac sumE)); |
173 by (ALLGOALS (asm_simp_tac radd_ss)); |
169 by (ALLGOALS Asm_simp_tac); |
174 qed "sum_assoc_ord_iso"; |
170 qed "sum_assoc_ord_iso"; |
175 |
171 |
176 |
172 |
177 (**** Multiplication of relations -- lexicographic product ****) |
173 (**** Multiplication of relations -- lexicographic product ****) |
178 |
174 |
221 "!!r s. [| wf[A](r); wf[B](s) |] ==> wf[A*B](rmult(A,r,B,s))"; |
219 "!!r s. [| wf[A](r); wf[B](s) |] ==> wf[A*B](rmult(A,r,B,s))"; |
222 by (rtac wf_onI2 1); |
220 by (rtac wf_onI2 1); |
223 by (etac SigmaE 1); |
221 by (etac SigmaE 1); |
224 by (etac ssubst 1); |
222 by (etac ssubst 1); |
225 by (subgoal_tac "ALL b:B. <x,b>: Ba" 1); |
223 by (subgoal_tac "ALL b:B. <x,b>: Ba" 1); |
226 by (fast_tac ZF_cs 1); |
224 by (Fast_tac 1); |
227 by (eres_inst_tac [("a","x")] wf_on_induct 1 THEN assume_tac 1); |
225 by (eres_inst_tac [("a","x")] wf_on_induct 1 THEN assume_tac 1); |
228 by (rtac ballI 1); |
226 by (rtac ballI 1); |
229 by (eres_inst_tac [("a","b")] wf_on_induct 1 THEN assume_tac 1); |
227 by (eres_inst_tac [("a","b")] wf_on_induct 1 THEN assume_tac 1); |
230 by (etac (bspec RS mp) 1); |
228 by (etac (bspec RS mp) 1); |
231 by (fast_tac ZF_cs 1); |
229 by (Fast_tac 1); |
232 by (best_tac (ZF_cs addSEs [rmultE]) 1); |
230 by (best_tac (!claset addSEs [rmultE]) 1); |
233 qed "wf_on_rmult"; |
231 qed "wf_on_rmult"; |
234 |
232 |
235 |
233 |
236 goal OrderArith.thy |
234 goal OrderArith.thy |
237 "!!r s. [| wf(r); wf(s) |] ==> wf(rmult(field(r),r,field(s),s))"; |
235 "!!r s. [| wf(r); wf(s) |] ==> wf(rmult(field(r),r,field(s),s))"; |
238 by (asm_full_simp_tac (ZF_ss addsimps [wf_iff_wf_on_field]) 1); |
236 by (asm_full_simp_tac (!simpset addsimps [wf_iff_wf_on_field]) 1); |
239 by (rtac (field_rmult RSN (2, wf_on_subset_A)) 1); |
237 by (rtac (field_rmult RSN (2, wf_on_subset_A)) 1); |
240 by (REPEAT (ares_tac [wf_on_rmult] 1)); |
238 by (REPEAT (ares_tac [wf_on_rmult] 1)); |
241 qed "wf_rmult"; |
239 qed "wf_rmult"; |
242 |
240 |
243 goal OrderArith.thy |
241 goal OrderArith.thy |
244 "!!r s. [| well_ord(A,r); well_ord(B,s) |] ==> \ |
242 "!!r s. [| well_ord(A,r); well_ord(B,s) |] ==> \ |
245 \ well_ord(A*B, rmult(A,r,B,s))"; |
243 \ well_ord(A*B, rmult(A,r,B,s))"; |
246 by (rtac well_ordI 1); |
244 by (rtac well_ordI 1); |
247 by (asm_full_simp_tac (ZF_ss addsimps [well_ord_def, wf_on_rmult]) 1); |
245 by (asm_full_simp_tac (!simpset addsimps [well_ord_def, wf_on_rmult]) 1); |
248 by (asm_full_simp_tac |
246 by (asm_full_simp_tac |
249 (ZF_ss addsimps [well_ord_def, tot_ord_def, linear_rmult]) 1); |
247 (!simpset addsimps [well_ord_def, tot_ord_def, linear_rmult]) 1); |
250 qed "well_ord_rmult"; |
248 qed "well_ord_rmult"; |
251 |
249 |
252 |
250 |
253 (** An ord_iso congruence law **) |
251 (** An ord_iso congruence law **) |
254 |
252 |
255 goal OrderArith.thy |
253 goal OrderArith.thy |
256 "!!f g. [| f: bij(A,C); g: bij(B,D) |] ==> \ |
254 "!!f g. [| f: bij(A,C); g: bij(B,D) |] ==> \ |
257 \ (lam <x,y>:A*B. <f`x, g`y>) : bij(A*B, C*D)"; |
255 \ (lam <x,y>:A*B. <f`x, g`y>) : bij(A*B, C*D)"; |
258 by (res_inst_tac [("d", "%<x,y>. <converse(f)`x, converse(g)`y>")] |
256 by (res_inst_tac [("d", "%<x,y>. <converse(f)`x, converse(g)`y>")] |
259 lam_bijective 1); |
257 lam_bijective 1); |
260 by (safe_tac ZF_cs); |
258 by (safe_tac (!claset)); |
261 by (ALLGOALS (asm_simp_tac bij_inverse_ss)); |
259 by (ALLGOALS (asm_simp_tac bij_inverse_ss)); |
262 qed "prod_bij"; |
260 qed "prod_bij"; |
263 |
261 |
264 goalw OrderArith.thy [ord_iso_def] |
262 goalw OrderArith.thy [ord_iso_def] |
265 "!!r s. [| f: ord_iso(A,r,A',r'); g: ord_iso(B,s,B',s') |] ==> \ |
263 "!!r s. [| f: ord_iso(A,r,A',r'); g: ord_iso(B,s,B',s') |] ==> \ |
266 \ (lam <x,y>:A*B. <f`x, g`y>) \ |
264 \ (lam <x,y>:A*B. <f`x, g`y>) \ |
267 \ : ord_iso(A*B, rmult(A,r,B,s), A'*B', rmult(A',r',B',s'))"; |
265 \ : ord_iso(A*B, rmult(A,r,B,s), A'*B', rmult(A',r',B',s'))"; |
268 by (safe_tac (ZF_cs addSIs [prod_bij])); |
266 by (safe_tac (!claset addSIs [prod_bij])); |
269 by (ALLGOALS |
267 by (ALLGOALS |
270 (asm_full_simp_tac |
268 (asm_full_simp_tac (!simpset addsimps [bij_is_fun RS apply_type]))); |
271 (ZF_ss addsimps [rmult_iff, bij_is_fun RS apply_type]))); |
269 by (Fast_tac 1); |
272 by (fast_tac ZF_cs 1); |
270 by (fast_tac (!claset addSEs [bij_is_inj RS inj_apply_equality]) 1); |
273 by (fast_tac (ZF_cs addSEs [bij_is_inj RS inj_apply_equality]) 1); |
|
274 qed "prod_ord_iso_cong"; |
271 qed "prod_ord_iso_cong"; |
275 |
272 |
276 goal OrderArith.thy "(lam z:A. <x,z>) : bij(A, {x}*A)"; |
273 goal OrderArith.thy "(lam z:A. <x,z>) : bij(A, {x}*A)"; |
277 by (res_inst_tac [("d", "snd")] lam_bijective 1); |
274 by (res_inst_tac [("d", "snd")] lam_bijective 1); |
278 by (safe_tac ZF_cs); |
275 by (safe_tac (!claset)); |
279 by (ALLGOALS (asm_simp_tac ZF_ss)); |
276 by (ALLGOALS Asm_simp_tac); |
280 qed "singleton_prod_bij"; |
277 qed "singleton_prod_bij"; |
281 |
278 |
282 (*Used??*) |
279 (*Used??*) |
283 goal OrderArith.thy |
280 goal OrderArith.thy |
284 "!!x xr. well_ord({x},xr) ==> \ |
281 "!!x xr. well_ord({x},xr) ==> \ |
285 \ (lam z:A. <x,z>) : ord_iso(A, r, {x}*A, rmult({x}, xr, A, r))"; |
282 \ (lam z:A. <x,z>) : ord_iso(A, r, {x}*A, rmult({x}, xr, A, r))"; |
286 by (resolve_tac [singleton_prod_bij RS ord_isoI] 1); |
283 by (resolve_tac [singleton_prod_bij RS ord_isoI] 1); |
287 by (asm_simp_tac (ZF_ss addsimps [rmult_iff]) 1); |
284 by (Asm_simp_tac 1); |
288 by (fast_tac (ZF_cs addEs [well_ord_is_wf RS wf_on_not_refl RS notE]) 1); |
285 by (fast_tac (!claset addEs [well_ord_is_wf RS wf_on_not_refl RS notE]) 1); |
289 qed "singleton_prod_ord_iso"; |
286 qed "singleton_prod_ord_iso"; |
290 |
287 |
291 (*Here we build a complicated function term, then simplify it using |
288 (*Here we build a complicated function term, then simplify it using |
292 case_cong, id_conv, comp_lam, case_case.*) |
289 case_cong, id_conv, comp_lam, case_case.*) |
293 goal OrderArith.thy |
290 goal OrderArith.thy |
297 by (rtac subst_elem 1); |
294 by (rtac subst_elem 1); |
298 by (resolve_tac [id_bij RS sum_bij RS comp_bij] 1); |
295 by (resolve_tac [id_bij RS sum_bij RS comp_bij] 1); |
299 by (rtac singleton_prod_bij 1); |
296 by (rtac singleton_prod_bij 1); |
300 by (rtac sum_disjoint_bij 1); |
297 by (rtac sum_disjoint_bij 1); |
301 by (fast_tac eq_cs 1); |
298 by (fast_tac eq_cs 1); |
302 by (asm_simp_tac (ZF_ss addcongs [case_cong] addsimps [id_conv]) 1); |
299 by (asm_simp_tac (!simpset addcongs [case_cong] addsimps [id_conv]) 1); |
303 by (resolve_tac [comp_lam RS trans RS sym] 1); |
300 by (resolve_tac [comp_lam RS trans RS sym] 1); |
304 by (fast_tac (sum_cs addSEs [case_type]) 1); |
301 by (fast_tac (sum_cs addSEs [case_type]) 1); |
305 by (asm_simp_tac (ZF_ss addsimps [case_case]) 1); |
302 by (asm_simp_tac (!simpset addsimps [case_case]) 1); |
306 qed "prod_sum_singleton_bij"; |
303 qed "prod_sum_singleton_bij"; |
307 |
304 |
308 goal OrderArith.thy |
305 goal OrderArith.thy |
309 "!!A. [| a:A; well_ord(A,r) |] ==> \ |
306 "!!A. [| a:A; well_ord(A,r) |] ==> \ |
310 \ (lam x:pred(A,a,r)*B + pred(B,b,s). case(%x.x, %y.<a,y>, x)) \ |
307 \ (lam x:pred(A,a,r)*B + pred(B,b,s). case(%x.x, %y.<a,y>, x)) \ |
311 \ : ord_iso(pred(A,a,r)*B + pred(B,b,s), \ |
308 \ : ord_iso(pred(A,a,r)*B + pred(B,b,s), \ |
312 \ radd(A*B, rmult(A,r,B,s), B, s), \ |
309 \ radd(A*B, rmult(A,r,B,s), B, s), \ |
313 \ pred(A,a,r)*B Un {a}*pred(B,b,s), rmult(A,r,B,s))"; |
310 \ pred(A,a,r)*B Un {a}*pred(B,b,s), rmult(A,r,B,s))"; |
314 by (resolve_tac [prod_sum_singleton_bij RS ord_isoI] 1); |
311 by (resolve_tac [prod_sum_singleton_bij RS ord_isoI] 1); |
315 by (asm_simp_tac |
312 by (asm_simp_tac |
316 (ZF_ss addsimps [pred_iff, well_ord_is_wf RS wf_on_not_refl]) 1); |
313 (!simpset addsimps [pred_iff, well_ord_is_wf RS wf_on_not_refl]) 1); |
317 by (asm_simp_tac ZF_ss 1); |
314 by (Asm_simp_tac 1); |
318 by (REPEAT_FIRST (eresolve_tac [SigmaE, sumE, predE])); |
315 by (REPEAT_FIRST (eresolve_tac [SigmaE, sumE, predE])); |
319 by (ALLGOALS (asm_simp_tac (radd_ss addsimps [rmult_iff]))); |
316 by (ALLGOALS (Asm_simp_tac)); |
320 by (ALLGOALS (fast_tac (ZF_cs addEs [well_ord_is_wf RS wf_on_asym]))); |
317 by (ALLGOALS (fast_tac (!claset addEs [well_ord_is_wf RS wf_on_asym]))); |
321 qed "prod_sum_singleton_ord_iso"; |
318 qed "prod_sum_singleton_ord_iso"; |
322 |
319 |
323 (** Distributive law **) |
320 (** Distributive law **) |
324 |
321 |
325 goal OrderArith.thy |
322 goal OrderArith.thy |
326 "(lam <x,z>:(A+B)*C. case(%y.Inl(<y,z>), %y.Inr(<y,z>), x)) \ |
323 "(lam <x,z>:(A+B)*C. case(%y.Inl(<y,z>), %y.Inr(<y,z>), x)) \ |
327 \ : bij((A+B)*C, (A*C)+(B*C))"; |
324 \ : bij((A+B)*C, (A*C)+(B*C))"; |
328 by (res_inst_tac |
325 by (res_inst_tac |
329 [("d", "case(%<x,y>.<Inl(x),y>, %<x,y>.<Inr(x),y>)")] lam_bijective 1); |
326 [("d", "case(%<x,y>.<Inl(x),y>, %<x,y>.<Inr(x),y>)")] lam_bijective 1); |
330 by (safe_tac (ZF_cs addSEs [sumE])); |
327 by (safe_tac (!claset addSEs [sumE])); |
331 by (ALLGOALS (asm_simp_tac case_ss)); |
328 by (ALLGOALS Asm_simp_tac); |
332 qed "sum_prod_distrib_bij"; |
329 qed "sum_prod_distrib_bij"; |
333 |
330 |
334 goal OrderArith.thy |
331 goal OrderArith.thy |
335 "(lam <x,z>:(A+B)*C. case(%y.Inl(<y,z>), %y.Inr(<y,z>), x)) \ |
332 "(lam <x,z>:(A+B)*C. case(%y.Inl(<y,z>), %y.Inr(<y,z>), x)) \ |
336 \ : ord_iso((A+B)*C, rmult(A+B, radd(A,r,B,s), C, t), \ |
333 \ : ord_iso((A+B)*C, rmult(A+B, radd(A,r,B,s), C, t), \ |
337 \ (A*C)+(B*C), radd(A*C, rmult(A,r,C,t), B*C, rmult(B,s,C,t)))"; |
334 \ (A*C)+(B*C), radd(A*C, rmult(A,r,C,t), B*C, rmult(B,s,C,t)))"; |
338 by (resolve_tac [sum_prod_distrib_bij RS ord_isoI] 1); |
335 by (resolve_tac [sum_prod_distrib_bij RS ord_isoI] 1); |
339 by (REPEAT_FIRST (eresolve_tac [SigmaE, sumE])); |
336 by (REPEAT_FIRST (eresolve_tac [SigmaE, sumE])); |
340 by (ALLGOALS (asm_simp_tac (radd_ss addsimps [rmult_iff]))); |
337 by (ALLGOALS (Asm_simp_tac)); |
341 qed "sum_prod_distrib_ord_iso"; |
338 qed "sum_prod_distrib_ord_iso"; |
342 |
339 |
343 (** Associativity **) |
340 (** Associativity **) |
344 |
341 |
345 goal OrderArith.thy |
342 goal OrderArith.thy |
346 "(lam <<x,y>, z>:(A*B)*C. <x,<y,z>>) : bij((A*B)*C, A*(B*C))"; |
343 "(lam <<x,y>, z>:(A*B)*C. <x,<y,z>>) : bij((A*B)*C, A*(B*C))"; |
347 by (res_inst_tac [("d", "%<x, <y,z>>. <<x,y>, z>")] lam_bijective 1); |
344 by (res_inst_tac [("d", "%<x, <y,z>>. <<x,y>, z>")] lam_bijective 1); |
348 by (ALLGOALS (asm_simp_tac (case_ss setloop etac SigmaE))); |
345 by (ALLGOALS (asm_simp_tac (!simpset setloop etac SigmaE))); |
349 qed "prod_assoc_bij"; |
346 qed "prod_assoc_bij"; |
350 |
347 |
351 goal OrderArith.thy |
348 goal OrderArith.thy |
352 "(lam <<x,y>, z>:(A*B)*C. <x,<y,z>>) \ |
349 "(lam <<x,y>, z>:(A*B)*C. <x,<y,z>>) \ |
353 \ : ord_iso((A*B)*C, rmult(A*B, rmult(A,r,B,s), C, t), \ |
350 \ : ord_iso((A*B)*C, rmult(A*B, rmult(A,r,B,s), C, t), \ |
354 \ A*(B*C), rmult(A, r, B*C, rmult(B,s,C,t)))"; |
351 \ A*(B*C), rmult(A, r, B*C, rmult(B,s,C,t)))"; |
355 by (resolve_tac [prod_assoc_bij RS ord_isoI] 1); |
352 by (resolve_tac [prod_assoc_bij RS ord_isoI] 1); |
356 by (REPEAT_FIRST (eresolve_tac [SigmaE, ssubst])); |
353 by (REPEAT_FIRST (eresolve_tac [SigmaE, ssubst])); |
357 by (asm_simp_tac (ZF_ss addsimps [rmult_iff]) 1); |
354 by (Asm_simp_tac 1); |
358 by (fast_tac ZF_cs 1); |
355 by (Fast_tac 1); |
359 qed "prod_assoc_ord_iso"; |
356 qed "prod_assoc_ord_iso"; |
360 |
357 |
361 (**** Inverse image of a relation ****) |
358 (**** Inverse image of a relation ****) |
362 |
359 |
363 (** Rewrite rule **) |
360 (** Rewrite rule **) |
364 |
361 |
365 goalw OrderArith.thy [rvimage_def] |
362 goalw OrderArith.thy [rvimage_def] |
366 "<a,b> : rvimage(A,f,r) <-> <f`a,f`b>: r & a:A & b:A"; |
363 "<a,b> : rvimage(A,f,r) <-> <f`a,f`b>: r & a:A & b:A"; |
367 by (fast_tac ZF_cs 1); |
364 by (Fast_tac 1); |
368 qed "rvimage_iff"; |
365 qed "rvimage_iff"; |
369 |
366 |
370 (** Type checking **) |
367 (** Type checking **) |
371 |
368 |
372 goalw OrderArith.thy [rvimage_def] "rvimage(A,f,r) <= A*A"; |
369 goalw OrderArith.thy [rvimage_def] "rvimage(A,f,r) <= A*A"; |
383 |
380 |
384 (** Partial Ordering Properties **) |
381 (** Partial Ordering Properties **) |
385 |
382 |
386 goalw OrderArith.thy [irrefl_def, rvimage_def] |
383 goalw OrderArith.thy [irrefl_def, rvimage_def] |
387 "!!A B. [| f: inj(A,B); irrefl(B,r) |] ==> irrefl(A, rvimage(A,f,r))"; |
384 "!!A B. [| f: inj(A,B); irrefl(B,r) |] ==> irrefl(A, rvimage(A,f,r))"; |
388 by (fast_tac (ZF_cs addIs [inj_is_fun RS apply_type]) 1); |
385 by (fast_tac (!claset addIs [inj_is_fun RS apply_type]) 1); |
389 qed "irrefl_rvimage"; |
386 qed "irrefl_rvimage"; |
390 |
387 |
391 goalw OrderArith.thy [trans_on_def, rvimage_def] |
388 goalw OrderArith.thy [trans_on_def, rvimage_def] |
392 "!!A B. [| f: inj(A,B); trans[B](r) |] ==> trans[A](rvimage(A,f,r))"; |
389 "!!A B. [| f: inj(A,B); trans[B](r) |] ==> trans[A](rvimage(A,f,r))"; |
393 by (fast_tac (ZF_cs addIs [inj_is_fun RS apply_type]) 1); |
390 by (fast_tac (!claset addIs [inj_is_fun RS apply_type]) 1); |
394 qed "trans_on_rvimage"; |
391 qed "trans_on_rvimage"; |
395 |
392 |
396 goalw OrderArith.thy [part_ord_def] |
393 goalw OrderArith.thy [part_ord_def] |
397 "!!A B. [| f: inj(A,B); part_ord(B,r) |] ==> part_ord(A, rvimage(A,f,r))"; |
394 "!!A B. [| f: inj(A,B); part_ord(B,r) |] ==> part_ord(A, rvimage(A,f,r))"; |
398 by (fast_tac (ZF_cs addSIs [irrefl_rvimage, trans_on_rvimage]) 1); |
395 by (fast_tac (!claset addSIs [irrefl_rvimage, trans_on_rvimage]) 1); |
399 qed "part_ord_rvimage"; |
396 qed "part_ord_rvimage"; |
400 |
397 |
401 (** Linearity **) |
398 (** Linearity **) |
402 |
399 |
403 val [finj,lin] = goalw OrderArith.thy [inj_def] |
400 val [finj,lin] = goalw OrderArith.thy [inj_def] |
404 "[| f: inj(A,B); linear(B,r) |] ==> linear(A,rvimage(A,f,r))"; |
401 "[| f: inj(A,B); linear(B,r) |] ==> linear(A,rvimage(A,f,r))"; |
405 by (rewtac linear_def); (*Note! the premises are NOT rewritten*) |
402 by (rewtac linear_def); (*Note! the premises are NOT rewritten*) |
406 by (REPEAT_FIRST (ares_tac [ballI])); |
403 by (REPEAT_FIRST (ares_tac [ballI])); |
407 by (asm_simp_tac (ZF_ss addsimps [rvimage_iff]) 1); |
404 by (asm_simp_tac (!simpset addsimps [rvimage_iff]) 1); |
408 by (cut_facts_tac [finj] 1); |
405 by (cut_facts_tac [finj] 1); |
409 by (res_inst_tac [("x","f`x"), ("y","f`y")] (lin RS linearE) 1); |
406 by (res_inst_tac [("x","f`x"), ("y","f`y")] (lin RS linearE) 1); |
410 by (REPEAT_SOME (fast_tac (ZF_cs addSIs [apply_type]))); |
407 by (REPEAT_SOME (fast_tac (!claset addSIs [apply_type]))); |
411 qed "linear_rvimage"; |
408 qed "linear_rvimage"; |
412 |
409 |
413 goalw OrderArith.thy [tot_ord_def] |
410 goalw OrderArith.thy [tot_ord_def] |
414 "!!A B. [| f: inj(A,B); tot_ord(B,r) |] ==> tot_ord(A, rvimage(A,f,r))"; |
411 "!!A B. [| f: inj(A,B); tot_ord(B,r) |] ==> tot_ord(A, rvimage(A,f,r))"; |
415 by (fast_tac (ZF_cs addSIs [part_ord_rvimage, linear_rvimage]) 1); |
412 by (fast_tac (!claset addSIs [part_ord_rvimage, linear_rvimage]) 1); |
416 qed "tot_ord_rvimage"; |
413 qed "tot_ord_rvimage"; |
417 |
414 |
418 |
415 |
419 (** Well-foundedness **) |
416 (** Well-foundedness **) |
420 |
417 |
421 goal OrderArith.thy |
418 goal OrderArith.thy |
422 "!!r. [| f: A->B; wf[B](r) |] ==> wf[A](rvimage(A,f,r))"; |
419 "!!r. [| f: A->B; wf[B](r) |] ==> wf[A](rvimage(A,f,r))"; |
423 by (rtac wf_onI2 1); |
420 by (rtac wf_onI2 1); |
424 by (subgoal_tac "ALL z:A. f`z=f`y --> z: Ba" 1); |
421 by (subgoal_tac "ALL z:A. f`z=f`y --> z: Ba" 1); |
425 by (fast_tac ZF_cs 1); |
422 by (Fast_tac 1); |
426 by (eres_inst_tac [("a","f`y")] wf_on_induct 1); |
423 by (eres_inst_tac [("a","f`y")] wf_on_induct 1); |
427 by (fast_tac (ZF_cs addSIs [apply_type]) 1); |
424 by (fast_tac (!claset addSIs [apply_type]) 1); |
428 by (best_tac (ZF_cs addSIs [apply_type] addSDs [rvimage_iff RS iffD1]) 1); |
425 by (best_tac (!claset addSIs [apply_type] addSDs [rvimage_iff RS iffD1]) 1); |
429 qed "wf_on_rvimage"; |
426 qed "wf_on_rvimage"; |
430 |
427 |
431 (*Note that we need only wf[A](...) and linear(A,...) to get the result!*) |
428 (*Note that we need only wf[A](...) and linear(A,...) to get the result!*) |
432 goal OrderArith.thy |
429 goal OrderArith.thy |
433 "!!r. [| f: inj(A,B); well_ord(B,r) |] ==> well_ord(A, rvimage(A,f,r))"; |
430 "!!r. [| f: inj(A,B); well_ord(B,r) |] ==> well_ord(A, rvimage(A,f,r))"; |
434 by (rtac well_ordI 1); |
431 by (rtac well_ordI 1); |
435 by (rewrite_goals_tac [well_ord_def, tot_ord_def]); |
432 by (rewrite_goals_tac [well_ord_def, tot_ord_def]); |
436 by (fast_tac (ZF_cs addSIs [wf_on_rvimage, inj_is_fun]) 1); |
433 by (fast_tac (!claset addSIs [wf_on_rvimage, inj_is_fun]) 1); |
437 by (fast_tac (ZF_cs addSIs [linear_rvimage]) 1); |
434 by (fast_tac (!claset addSIs [linear_rvimage]) 1); |
438 qed "well_ord_rvimage"; |
435 qed "well_ord_rvimage"; |
439 |
436 |
440 goalw OrderArith.thy [ord_iso_def] |
437 goalw OrderArith.thy [ord_iso_def] |
441 "!!A B. f: bij(A,B) ==> f: ord_iso(A, rvimage(A,f,s), B, s)"; |
438 "!!A B. f: bij(A,B) ==> f: ord_iso(A, rvimage(A,f,s), B, s)"; |
442 by (asm_full_simp_tac (ZF_ss addsimps [rvimage_iff]) 1); |
439 by (asm_full_simp_tac (!simpset addsimps [rvimage_iff]) 1); |
443 qed "ord_iso_rvimage"; |
440 qed "ord_iso_rvimage"; |
444 |
441 |
445 goalw OrderArith.thy [ord_iso_def, rvimage_def] |
442 goalw OrderArith.thy [ord_iso_def, rvimage_def] |
446 "!!A B. f: ord_iso(A,r, B,s) ==> rvimage(A,f,s) = r Int A*A"; |
443 "!!A B. f: ord_iso(A,r, B,s) ==> rvimage(A,f,s) = r Int A*A"; |
447 by (fast_tac eq_cs 1); |
444 by (fast_tac eq_cs 1); |