src/ZF/OrderArith.ML
changeset 2469 b50b8c0eec01
parent 1957 58b60b558e48
child 2493 bdeb5024353a
equal deleted inserted replaced
2468:428efffe8599 2469:b50b8c0eec01
    56 
    56 
    57 goalw OrderArith.thy [radd_def] "radd(A,r,B,s) <= (A+B) * (A+B)";
    57 goalw OrderArith.thy [radd_def] "radd(A,r,B,s) <= (A+B) * (A+B)";
    58 by (rtac Collect_subset 1);
    58 by (rtac Collect_subset 1);
    59 qed "radd_type";
    59 qed "radd_type";
    60 
    60 
    61 bind_thm ("field_radd", (radd_type RS field_rel_subset));
    61 bind_thm ("field_radd", radd_type RS field_rel_subset);
    62 
    62 
    63 (** Linearity **)
    63 (** Linearity **)
    64 
    64 
    65 val radd_ss = sum_ss addsimps [radd_Inl_iff, radd_Inr_iff, 
    65 Addsimps [radd_Inl_iff, radd_Inr_iff, 
    66                                radd_Inl_Inr_iff, radd_Inr_Inl_iff];
    66 	  radd_Inl_Inr_iff, radd_Inr_Inl_iff];
    67 
    67 
    68 goalw OrderArith.thy [linear_def]
    68 goalw OrderArith.thy [linear_def]
    69     "!!r s. [| linear(A,r);  linear(B,s) |] ==> linear(A+B,radd(A,r,B,s))";
    69     "!!r s. [| linear(A,r);  linear(B,s) |] ==> linear(A+B,radd(A,r,B,s))";
    70 by (REPEAT_FIRST (ares_tac [ballI] ORELSE' etac sumE));
    70 by (REPEAT_FIRST (ares_tac [ballI] ORELSE' etac sumE));
    71 by (ALLGOALS (asm_simp_tac radd_ss));
    71 by (ALLGOALS Asm_simp_tac);
    72 qed "linear_radd";
    72 qed "linear_radd";
    73 
    73 
    74 
    74 
    75 (** Well-foundedness **)
    75 (** Well-foundedness **)
    76 
    76 
    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 
   180 
   176 
   181 goalw OrderArith.thy [rmult_def] 
   177 goalw OrderArith.thy [rmult_def] 
   182     "!!r s. <<a',b'>, <a,b>> : rmult(A,r,B,s) <->       \
   178     "!!r s. <<a',b'>, <a,b>> : rmult(A,r,B,s) <->       \
   183 \           (<a',a>: r  & a':A & a:A & b': B & b: B) |  \
   179 \           (<a',a>: r  & a':A & a:A & b': B & b: B) |  \
   184 \           (<b',b>: s  & a'=a & a:A & b': B & b: B)";
   180 \           (<b',b>: s  & a'=a & a:A & b': B & b: B)";
   185 by (fast_tac ZF_cs 1);
   181 by (Fast_tac 1);
   186 qed "rmult_iff";
   182 qed "rmult_iff";
       
   183 
       
   184 Addsimps [rmult_iff];
   187 
   185 
   188 val major::prems = goal OrderArith.thy
   186 val major::prems = goal OrderArith.thy
   189     "[| <<a',b'>, <a,b>> : rmult(A,r,B,s);              \
   187     "[| <<a',b'>, <a,b>> : rmult(A,r,B,s);              \
   190 \       [| <a',a>: r;  a':A;  a:A;  b':B;  b:B |] ==> Q;        \
   188 \       [| <a',a>: r;  a':A;  a:A;  b':B;  b:B |] ==> Q;        \
   191 \       [| <b',b>: s;  a:A;  a'=a;  b':B;  b:B |] ==> Q \
   189 \       [| <b',b>: s;  a:A;  a'=a;  b':B;  b:B |] ==> Q \
   206 
   204 
   207 val [lina,linb] = goal OrderArith.thy
   205 val [lina,linb] = goal OrderArith.thy
   208     "[| linear(A,r);  linear(B,s) |] ==> linear(A*B,rmult(A,r,B,s))";
   206     "[| linear(A,r);  linear(B,s) |] ==> linear(A*B,rmult(A,r,B,s))";
   209 by (rewtac linear_def);    (*Note! the premises are NOT rewritten*)
   207 by (rewtac linear_def);    (*Note! the premises are NOT rewritten*)
   210 by (REPEAT_FIRST (ares_tac [ballI] ORELSE' etac SigmaE));
   208 by (REPEAT_FIRST (ares_tac [ballI] ORELSE' etac SigmaE));
   211 by (asm_simp_tac (ZF_ss addsimps [rmult_iff]) 1);
   209 by (Asm_simp_tac 1);
   212 by (res_inst_tac [("x","xa"), ("y","xb")] (lina RS linearE) 1);
   210 by (res_inst_tac [("x","xa"), ("y","xb")] (lina RS linearE) 1);
   213 by (res_inst_tac [("x","ya"), ("y","yb")] (linb RS linearE) 4);
   211 by (res_inst_tac [("x","ya"), ("y","yb")] (linb RS linearE) 4);
   214 by (REPEAT_SOME (fast_tac ZF_cs));
   212 by (REPEAT_SOME (Fast_tac));
   215 qed "linear_rmult";
   213 qed "linear_rmult";
   216 
   214 
   217 
   215 
   218 (** Well-foundedness **)
   216 (** Well-foundedness **)
   219 
   217 
   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);