src/ZF/OrderArith.ML
changeset 1095 6d0aad5f50a5
parent 859 bc5f424c8c04
child 1461 6bcb44e4d6e5
equal deleted inserted replaced
1094:840554ac0451 1095:6d0aad5f50a5
   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);