252 |
252 |
253 (** An ord_iso congruence law **) |
253 (** An ord_iso congruence law **) |
254 |
254 |
255 goal OrderArith.thy |
255 goal OrderArith.thy |
256 "!!f g. [| f: bij(A,C); g: bij(B,D) |] ==> \ |
256 "!!f g. [| f: bij(A,C); g: bij(B,D) |] ==> \ |
257 \ (lam z:A*B. split(%x y. <f`x, g`y>, z)) : bij(A*B, C*D)"; |
257 \ (lam <x,y>:A*B. <f`x, g`y>) : bij(A*B, C*D)"; |
258 by (res_inst_tac [("d", "split(%x y. <converse(f)`x, converse(g)`y>)")] |
258 by (res_inst_tac [("d", "%<x,y>. <converse(f)`x, converse(g)`y>")] |
259 lam_bijective 1); |
259 lam_bijective 1); |
260 by (safe_tac ZF_cs); |
260 by (safe_tac ZF_cs); |
261 by (ALLGOALS (asm_simp_tac bij_inverse_ss)); |
261 by (ALLGOALS (asm_simp_tac bij_inverse_ss)); |
262 qed "prod_bij"; |
262 qed "prod_bij"; |
263 |
263 |
264 goalw OrderArith.thy [ord_iso_def] |
264 goalw OrderArith.thy [ord_iso_def] |
265 "!!r s. [| f: ord_iso(A,r,A',r'); g: ord_iso(B,s,B',s') |] ==> \ |
265 "!!r s. [| f: ord_iso(A,r,A',r'); g: ord_iso(B,s,B',s') |] ==> \ |
266 \ (lam z:A*B. split(%x y. <f`x, g`y>, z)) \ |
266 \ (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'))"; |
267 \ : 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])); |
268 by (safe_tac (ZF_cs addSIs [prod_bij])); |
269 by (ALLGOALS |
269 by (ALLGOALS |
270 (asm_full_simp_tac |
270 (asm_full_simp_tac |
271 (ZF_ss addsimps [rmult_iff, bij_is_fun RS apply_type]))); |
271 (ZF_ss addsimps [rmult_iff, bij_is_fun RS apply_type]))); |
321 qed "prod_sum_singleton_ord_iso"; |
321 qed "prod_sum_singleton_ord_iso"; |
322 |
322 |
323 (** Distributive law **) |
323 (** Distributive law **) |
324 |
324 |
325 goal OrderArith.thy |
325 goal OrderArith.thy |
326 "(lam z:(A+B)*C. split(%x z. case(%y.Inl(<y,z>), %y.Inr(<y,z>), x), z)) \ |
326 "(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))"; |
327 \ : bij((A+B)*C, (A*C)+(B*C))"; |
328 by (res_inst_tac |
328 by (res_inst_tac |
329 [("d", "case(split(%x y.<Inl(x),y>), split(%x y.<Inr(x),y>))")] |
329 [("d", "case(%<x,y>.<Inl(x),y>, %<x,y>.<Inr(x),y>)")] lam_bijective 1); |
330 lam_bijective 1); |
|
331 by (safe_tac (ZF_cs addSEs [sumE])); |
330 by (safe_tac (ZF_cs addSEs [sumE])); |
332 by (ALLGOALS (asm_simp_tac case_ss)); |
331 by (ALLGOALS (asm_simp_tac case_ss)); |
333 qed "sum_prod_distrib_bij"; |
332 qed "sum_prod_distrib_bij"; |
334 |
333 |
335 goal OrderArith.thy |
334 goal OrderArith.thy |
336 "(lam z:(A+B)*C. split(%x z. case(%y.Inl(<y,z>), %y.Inr(<y,z>), x), z)) \ |
335 "(lam <x,z>:(A+B)*C. case(%y.Inl(<y,z>), %y.Inr(<y,z>), x)) \ |
337 \ : ord_iso((A+B)*C, rmult(A+B, radd(A,r,B,s), C, t), \ |
336 \ : ord_iso((A+B)*C, rmult(A+B, radd(A,r,B,s), C, t), \ |
338 \ (A*C)+(B*C), radd(A*C, rmult(A,r,C,t), B*C, rmult(B,s,C,t)))"; |
337 \ (A*C)+(B*C), radd(A*C, rmult(A,r,C,t), B*C, rmult(B,s,C,t)))"; |
339 by (resolve_tac [sum_prod_distrib_bij RS ord_isoI] 1); |
338 by (resolve_tac [sum_prod_distrib_bij RS ord_isoI] 1); |
340 by (REPEAT_FIRST (eresolve_tac [SigmaE, sumE])); |
339 by (REPEAT_FIRST (eresolve_tac [SigmaE, sumE])); |
341 by (ALLGOALS (asm_simp_tac (radd_ss addsimps [rmult_iff]))); |
340 by (ALLGOALS (asm_simp_tac (radd_ss addsimps [rmult_iff]))); |
342 qed "sum_prod_distrib_ord_iso"; |
341 qed "sum_prod_distrib_ord_iso"; |
343 |
342 |
344 (** Associativity **) |
343 (** Associativity **) |
345 |
344 |
346 goal OrderArith.thy |
345 goal OrderArith.thy |
347 "(lam z:(A*B)*C. split(%w z. split(%x y. <x,<y,z>>, w), z)) \ |
346 "(lam <<x,y>, z>:(A*B)*C. <x,<y,z>>) : bij((A*B)*C, A*(B*C))"; |
348 \ : bij((A*B)*C, A*(B*C))"; |
347 by (res_inst_tac [("d", "%<x, <y,z>>. <<x,y>, z>")] lam_bijective 1); |
349 by (res_inst_tac [("d", "split(%x. split(%y z. <<x,y>, z>))")] |
|
350 lam_bijective 1); |
|
351 by (ALLGOALS (asm_simp_tac (case_ss setloop etac SigmaE))); |
348 by (ALLGOALS (asm_simp_tac (case_ss setloop etac SigmaE))); |
352 qed "prod_assoc_bij"; |
349 qed "prod_assoc_bij"; |
353 |
350 |
354 goal OrderArith.thy |
351 goal OrderArith.thy |
355 "(lam z:(A*B)*C. split(%w z. split(%x y. <x,<y,z>>, w), z)) \ |
352 "(lam <<x,y>, z>:(A*B)*C. <x,<y,z>>) \ |
356 \ : ord_iso((A*B)*C, rmult(A*B, rmult(A,r,B,s), C, t), \ |
353 \ : ord_iso((A*B)*C, rmult(A*B, rmult(A,r,B,s), C, t), \ |
357 \ A*(B*C), rmult(A, r, B*C, rmult(B,s,C,t)))"; |
354 \ A*(B*C), rmult(A, r, B*C, rmult(B,s,C,t)))"; |
358 by (resolve_tac [prod_assoc_bij RS ord_isoI] 1); |
355 by (resolve_tac [prod_assoc_bij RS ord_isoI] 1); |
359 by (REPEAT_FIRST (eresolve_tac [SigmaE, ssubst])); |
356 by (REPEAT_FIRST (eresolve_tac [SigmaE, ssubst])); |
360 by (asm_simp_tac (ZF_ss addsimps [rmult_iff]) 1); |
357 by (asm_simp_tac (ZF_ss addsimps [rmult_iff]) 1); |