src/ZF/OrderType.ML
changeset 2493 bdeb5024353a
parent 2469 b50b8c0eec01
child 2925 b0ae2e13db93
equal deleted inserted replaced
2492:88f15198950f 2493:bdeb5024353a
    30 (*Kunen's Theorem 7.3 (i), page 16;  see also Ordinal/Ord_in_Ord
    30 (*Kunen's Theorem 7.3 (i), page 16;  see also Ordinal/Ord_in_Ord
    31   The smaller ordinal is an initial segment of the larger *)
    31   The smaller ordinal is an initial segment of the larger *)
    32 goalw OrderType.thy [pred_def, lt_def]
    32 goalw OrderType.thy [pred_def, lt_def]
    33     "!!i j. j<i ==> pred(i, j, Memrel(i)) = j";
    33     "!!i j. j<i ==> pred(i, j, Memrel(i)) = j";
    34 by (asm_simp_tac (!simpset addsimps [Memrel_iff]) 1);
    34 by (asm_simp_tac (!simpset addsimps [Memrel_iff]) 1);
    35 by (fast_tac (eq_cs addEs [Ord_trans]) 1);
    35 by (fast_tac (!claset addEs [Ord_trans]) 1);
    36 qed "lt_pred_Memrel";
    36 qed "lt_pred_Memrel";
    37 
    37 
    38 goalw OrderType.thy [pred_def,Memrel_def] 
    38 goalw OrderType.thy [pred_def,Memrel_def] 
    39       "!!A x. x:A ==> pred(A, x, Memrel(A)) = A Int x";
    39       "!!A x. x:A ==> pred(A, x, Memrel(A)) = A Int x";
    40 by (fast_tac eq_cs 1);
    40 by (Fast_tac 1);
    41 qed "pred_Memrel";
    41 qed "pred_Memrel";
    42 
    42 
    43 goal OrderType.thy
    43 goal OrderType.thy
    44     "!!i. [| j<i;  f: ord_iso(i,Memrel(i),j,Memrel(j)) |] ==> R";
    44     "!!i. [| j<i;  f: ord_iso(i,Memrel(i),j,Memrel(j)) |] ==> R";
    45 by (forward_tac [lt_pred_Memrel] 1);
    45 by (forward_tac [lt_pred_Memrel] 1);
   239 (*combining these two simplifications LOOPS! *)
   239 (*combining these two simplifications LOOPS! *)
   240 by (asm_simp_tac (!simpset addsimps [pred_pred_eq]) 1);
   240 by (asm_simp_tac (!simpset addsimps [pred_pred_eq]) 1);
   241 by (asm_full_simp_tac (!simpset addsimps [pred_def]) 1);
   241 by (asm_full_simp_tac (!simpset addsimps [pred_def]) 1);
   242 by (rtac (refl RSN (2,RepFun_cong)) 1);
   242 by (rtac (refl RSN (2,RepFun_cong)) 1);
   243 by (dtac well_ord_is_trans_on 1);
   243 by (dtac well_ord_is_trans_on 1);
   244 by (fast_tac (eq_cs addSEs [trans_onD]) 1);
   244 by (fast_tac (!claset addSEs [trans_onD]) 1);
   245 qed "ordermap_pred_eq_ordermap";
   245 qed "ordermap_pred_eq_ordermap";
   246 
   246 
   247 goalw OrderType.thy [ordertype_def]
   247 goalw OrderType.thy [ordertype_def]
   248     "ordertype(A,r) = {ordermap(A,r)`y . y : A}";
   248     "ordertype(A,r) = {ordermap(A,r)`y . y : A}";
   249 by (rtac ([ordermap_type, subset_refl] MRS image_fun) 1);
   249 by (rtac ([ordermap_type, subset_refl] MRS image_fun) 1);
   273 (*May rewrite with this -- provided no rules are supplied for proving that
   273 (*May rewrite with this -- provided no rules are supplied for proving that
   274         well_ord(pred(A,x,r), r) *)
   274         well_ord(pred(A,x,r), r) *)
   275 goal OrderType.thy
   275 goal OrderType.thy
   276     "!!A r. well_ord(A,r) ==>  \
   276     "!!A r. well_ord(A,r) ==>  \
   277 \           ordertype(A,r) = {ordertype(pred(A,x,r),r). x:A}";
   277 \           ordertype(A,r) = {ordertype(pred(A,x,r),r). x:A}";
   278 by (safe_tac (eq_cs addSIs [ordertype_pred_lt RS ltD]));
   278 by (rtac equalityI 1);
       
   279 by (safe_tac (!claset addSIs [ordertype_pred_lt RS ltD]));
   279 by (fast_tac
   280 by (fast_tac
   280     (!claset addss
   281     (!claset addss
   281      (!simpset addsimps [ordertype_def, 
   282      (!simpset addsimps [ordertype_def, 
   282                       well_ord_is_wf RS ordermap_eq_image, 
   283                       well_ord_is_wf RS ordermap_eq_image, 
   283                       ordermap_type RS image_fun, 
   284                       ordermap_type RS image_fun, 
   292 (*proof by Krzysztof Grabczewski*)
   293 (*proof by Krzysztof Grabczewski*)
   293 goalw OrderType.thy [Ord_alt_def] "!!i. Ord(i) ==> Ord_alt(i)";
   294 goalw OrderType.thy [Ord_alt_def] "!!i. Ord(i) ==> Ord_alt(i)";
   294 by (rtac conjI 1);
   295 by (rtac conjI 1);
   295 by (etac well_ord_Memrel 1);
   296 by (etac well_ord_Memrel 1);
   296 by (rewrite_goals_tac [Ord_def, Transset_def, pred_def, Memrel_def]);
   297 by (rewrite_goals_tac [Ord_def, Transset_def, pred_def, Memrel_def]);
   297 by (fast_tac eq_cs 1);
   298 by (Fast_tac 1);
   298 qed "Ord_is_Ord_alt";
   299 qed "Ord_is_Ord_alt";
   299 
   300 
   300 (*proof by lcp*)
   301 (*proof by lcp*)
   301 goalw OrderType.thy [Ord_alt_def, Ord_def, Transset_def, well_ord_def, 
   302 goalw OrderType.thy [Ord_alt_def, Ord_def, Transset_def, well_ord_def, 
   302                      tot_ord_def, part_ord_def, trans_on_def] 
   303                      tot_ord_def, part_ord_def, trans_on_def] 
   317 
   318 
   318 (** Addition with 0 **)
   319 (** Addition with 0 **)
   319 
   320 
   320 goal OrderType.thy "(lam z:A+0. case(%x.x, %y.y, z)) : bij(A+0, A)";
   321 goal OrderType.thy "(lam z:A+0. case(%x.x, %y.y, z)) : bij(A+0, A)";
   321 by (res_inst_tac [("d", "Inl")] lam_bijective 1);
   322 by (res_inst_tac [("d", "Inl")] lam_bijective 1);
   322 by (safe_tac sum_cs);
   323 by (safe_tac (!claset));
   323 by (ALLGOALS (Asm_simp_tac));
   324 by (ALLGOALS (Asm_simp_tac));
   324 qed "bij_sum_0";
   325 qed "bij_sum_0";
   325 
   326 
   326 goal OrderType.thy
   327 goal OrderType.thy
   327  "!!A r. well_ord(A,r) ==> ordertype(A+0, radd(A,r,0,s)) = ordertype(A,r)";
   328  "!!A r. well_ord(A,r) ==> ordertype(A+0, radd(A,r,0,s)) = ordertype(A,r)";
   328 by (resolve_tac [bij_sum_0 RS ord_isoI RS ordertype_eq] 1);
   329 by (resolve_tac [bij_sum_0 RS ord_isoI RS ordertype_eq] 1);
   329 by (assume_tac 2);
   330 by (assume_tac 2);
   330 by (fast_tac (sum_cs addss (!simpset addsimps [radd_Inl_iff, Memrel_iff])) 1);
   331 by (fast_tac (!claset addss (!simpset addsimps [radd_Inl_iff, Memrel_iff])) 1);
   331 qed "ordertype_sum_0_eq";
   332 qed "ordertype_sum_0_eq";
   332 
   333 
   333 goal OrderType.thy "(lam z:0+A. case(%x.x, %y.y, z)) : bij(0+A, A)";
   334 goal OrderType.thy "(lam z:0+A. case(%x.x, %y.y, z)) : bij(0+A, A)";
   334 by (res_inst_tac [("d", "Inr")] lam_bijective 1);
   335 by (res_inst_tac [("d", "Inr")] lam_bijective 1);
   335 by (safe_tac sum_cs);
   336 by (safe_tac (!claset));
   336 by (ALLGOALS (Asm_simp_tac));
   337 by (ALLGOALS (Asm_simp_tac));
   337 qed "bij_0_sum";
   338 qed "bij_0_sum";
   338 
   339 
   339 goal OrderType.thy
   340 goal OrderType.thy
   340  "!!A r. well_ord(A,r) ==> ordertype(0+A, radd(0,s,A,r)) = ordertype(A,r)";
   341  "!!A r. well_ord(A,r) ==> ordertype(0+A, radd(0,s,A,r)) = ordertype(A,r)";
   341 by (resolve_tac [bij_0_sum RS ord_isoI RS ordertype_eq] 1);
   342 by (resolve_tac [bij_0_sum RS ord_isoI RS ordertype_eq] 1);
   342 by (assume_tac 2);
   343 by (assume_tac 2);
   343 by (fast_tac (sum_cs addss (!simpset addsimps [radd_Inr_iff, Memrel_iff])) 1);
   344 by (fast_tac (!claset addss (!simpset addsimps [radd_Inr_iff, Memrel_iff])) 1);
   344 qed "ordertype_0_sum_eq";
   345 qed "ordertype_0_sum_eq";
   345 
   346 
   346 (** Initial segments of radd.  Statements by Grabczewski **)
   347 (** Initial segments of radd.  Statements by Grabczewski **)
   347 
   348 
   348 (*In fact, pred(A+B, Inl(a), radd(A,r,B,s)) = pred(A,a,r)+0 *)
   349 (*In fact, pred(A+B, Inl(a), radd(A,r,B,s)) = pred(A,a,r)+0 *)
   349 goalw OrderType.thy [pred_def]
   350 goalw OrderType.thy [pred_def]
   350  "!!A B. a:A ==>  \
   351  "!!A B. a:A ==>  \
   351 \        (lam x:pred(A,a,r). Inl(x))    \
   352 \        (lam x:pred(A,a,r). Inl(x))    \
   352 \        : bij(pred(A,a,r), pred(A+B, Inl(a), radd(A,r,B,s)))";
   353 \        : bij(pred(A,a,r), pred(A+B, Inl(a), radd(A,r,B,s)))";
   353 by (res_inst_tac [("d", "case(%x.x, %y.y)")] lam_bijective 1);
   354 by (res_inst_tac [("d", "case(%x.x, %y.y)")] lam_bijective 1);
   354 by (safe_tac sum_cs);
   355 by (safe_tac (!claset));
   355 by (ALLGOALS
   356 by (ALLGOALS
   356     (asm_full_simp_tac 
   357     (asm_full_simp_tac 
   357      (!simpset addsimps [radd_Inl_iff, radd_Inr_Inl_iff])));
   358      (!simpset addsimps [radd_Inl_iff, radd_Inr_Inl_iff])));
   358 qed "pred_Inl_bij";
   359 qed "pred_Inl_bij";
   359 
   360 
   369 goalw OrderType.thy [pred_def, id_def]
   370 goalw OrderType.thy [pred_def, id_def]
   370  "!!A B. b:B ==>  \
   371  "!!A B. b:B ==>  \
   371 \        id(A+pred(B,b,s))      \
   372 \        id(A+pred(B,b,s))      \
   372 \        : bij(A+pred(B,b,s), pred(A+B, Inr(b), radd(A,r,B,s)))";
   373 \        : bij(A+pred(B,b,s), pred(A+B, Inr(b), radd(A,r,B,s)))";
   373 by (res_inst_tac [("d", "%z.z")] lam_bijective 1);
   374 by (res_inst_tac [("d", "%z.z")] lam_bijective 1);
   374 by (safe_tac sum_cs);
   375 by (safe_tac (!claset));
   375 by (ALLGOALS (Asm_full_simp_tac));
   376 by (ALLGOALS (Asm_full_simp_tac));
   376 qed "pred_Inr_bij";
   377 qed "pred_Inr_bij";
   377 
   378 
   378 goal OrderType.thy
   379 goal OrderType.thy
   379  "!!A B. [| b:B;  well_ord(A,r);  well_ord(B,s) |] ==>  \
   380  "!!A B. [| b:B;  well_ord(A,r);  well_ord(B,s) |] ==>  \
   380 \        ordertype(pred(A+B, Inr(b), radd(A,r,B,s)), radd(A,r,B,s)) = \
   381 \        ordertype(pred(A+B, Inr(b), radd(A,r,B,s)), radd(A,r,B,s)) = \
   381 \        ordertype(A+pred(B,b,s), radd(A,r,pred(B,b,s),s))";
   382 \        ordertype(A+pred(B,b,s), radd(A,r,pred(B,b,s),s))";
   382 by (resolve_tac [pred_Inr_bij RS ord_isoI RS ord_iso_sym RS ordertype_eq] 1);
   383 by (resolve_tac [pred_Inr_bij RS ord_isoI RS ord_iso_sym RS ordertype_eq] 1);
   383 by (fast_tac (sum_cs addss (!simpset addsimps [pred_def, id_def])) 2);
   384 by (fast_tac (!claset addss (!simpset addsimps [pred_def, id_def])) 2);
   384 by (REPEAT_FIRST (ares_tac [well_ord_radd, pred_subset, well_ord_subset]));
   385 by (REPEAT_FIRST (ares_tac [well_ord_radd, pred_subset, well_ord_subset]));
   385 qed "ordertype_pred_Inr_eq";
   386 qed "ordertype_pred_Inr_eq";
   386 
   387 
   387 (*** Basic laws for ordinal addition ***)
   388 (*** Basic laws for ordinal addition ***)
   388 
   389 
   412 by (rtac ltE 1 THEN assume_tac 1);
   413 by (rtac ltE 1 THEN assume_tac 1);
   413 by (rtac ltI 1);
   414 by (rtac ltI 1);
   414 by (REPEAT (ares_tac [Ord_ordertype, well_ord_radd, well_ord_Memrel] 2));
   415 by (REPEAT (ares_tac [Ord_ordertype, well_ord_radd, well_ord_Memrel] 2));
   415 by (asm_simp_tac 
   416 by (asm_simp_tac 
   416     (!simpset addsimps [ordertype_pred_unfold, 
   417     (!simpset addsimps [ordertype_pred_unfold, 
   417 			well_ord_radd, well_ord_Memrel,
   418                         well_ord_radd, well_ord_Memrel,
   418 			ordertype_pred_Inl_eq, 
   419                         ordertype_pred_Inl_eq, 
   419 			lt_pred_Memrel, leI RS le_ordertype_Memrel]
   420                         lt_pred_Memrel, leI RS le_ordertype_Memrel]
   420            setloop rtac (InlI RSN (2,bexI))) 1);
   421            setloop rtac (InlI RSN (2,bexI))) 1);
   421 qed "lt_oadd1";
   422 qed "lt_oadd1";
   422 
   423 
   423 (*Thus also we obtain the rule  i++j = k ==> i le k *)
   424 (*Thus also we obtain the rule  i++j = k ==> i le k *)
   424 goal OrderType.thy "!!i j. [| Ord(i);  Ord(j) |] ==> i le i++j";
   425 goal OrderType.thy "!!i j. [| Ord(i);  Ord(j) |] ==> i le i++j";
   485 by (etac revcut_rl 1);
   486 by (etac revcut_rl 1);
   486 by (asm_full_simp_tac 
   487 by (asm_full_simp_tac 
   487     (!simpset addsimps [ordertype_pred_unfold, well_ord_radd,
   488     (!simpset addsimps [ordertype_pred_unfold, well_ord_radd,
   488                      well_ord_Memrel]) 1);
   489                      well_ord_Memrel]) 1);
   489 by (eresolve_tac [ltD RS RepFunE] 1);
   490 by (eresolve_tac [ltD RS RepFunE] 1);
   490 by (fast_tac (sum_cs addss 
   491 by (fast_tac (!claset addss 
   491               (!simpset addsimps [ordertype_pred_Inl_eq, well_ord_Memrel, 
   492               (!simpset addsimps [ordertype_pred_Inl_eq, well_ord_Memrel, 
   492                                ltI, lt_pred_Memrel, le_ordertype_Memrel, leI,
   493                                ltI, lt_pred_Memrel, le_ordertype_Memrel, leI,
   493                                ordertype_pred_Inr_eq, 
   494                                ordertype_pred_Inr_eq, 
   494                                ordertype_sum_Memrel])) 1);
   495                                ordertype_sum_Memrel])) 1);
   495 qed "lt_oadd_disj";
   496 qed "lt_oadd_disj";
   520 by (fast_tac (!claset addSEs [ltE]) 1);
   521 by (fast_tac (!claset addSEs [ltE]) 1);
   521 qed "oadd_unfold";
   522 qed "oadd_unfold";
   522 
   523 
   523 goal OrderType.thy "!!i. Ord(i) ==> i++1 = succ(i)";
   524 goal OrderType.thy "!!i. Ord(i) ==> i++1 = succ(i)";
   524 by (asm_simp_tac (!simpset addsimps [oadd_unfold, Ord_1, oadd_0]) 1);
   525 by (asm_simp_tac (!simpset addsimps [oadd_unfold, Ord_1, oadd_0]) 1);
   525 by (fast_tac eq_cs 1);
   526 by (Fast_tac 1);
   526 qed "oadd_1";
   527 qed "oadd_1";
   527 
   528 
   528 goal OrderType.thy
   529 goal OrderType.thy
   529     "!!i. [| Ord(i);  Ord(j) |] ==> i++succ(j) = succ(i++j)";
   530     "!!i. [| Ord(i);  Ord(j) |] ==> i++succ(j) = succ(i++j)";
   530 		(*ZF_ss prevents looping*)
   531                 (*ZF_ss prevents looping*)
   531 by (asm_simp_tac (ZF_ss addsimps [Ord_oadd, oadd_1 RS sym]) 1);
   532 by (asm_simp_tac (ZF_ss addsimps [Ord_oadd, oadd_1 RS sym]) 1);
   532 by (asm_simp_tac (!simpset addsimps [oadd_1, oadd_assoc, Ord_1]) 1);
   533 by (asm_simp_tac (!simpset addsimps [oadd_1, oadd_assoc, Ord_1]) 1);
   533 qed "oadd_succ";
   534 qed "oadd_succ";
   534 
   535 
   535 
   536 
   536 (** Ordinal addition with limit ordinals **)
   537 (** Ordinal addition with limit ordinals **)
   537 
   538 
   538 val prems = goal OrderType.thy
   539 val prems = goal OrderType.thy
   539     "[| Ord(i);  !!x. x:A ==> Ord(j(x));  a:A |] ==> \
   540     "[| Ord(i);  !!x. x:A ==> Ord(j(x));  a:A |] ==> \
   540 \    i ++ (UN x:A. j(x)) = (UN x:A. i++j(x))";
   541 \    i ++ (UN x:A. j(x)) = (UN x:A. i++j(x))";
   541 by (fast_tac (eq_cs addIs (prems @ [ltI, Ord_UN, Ord_oadd, 
   542 by (fast_tac (!claset addIs (prems @ [ltI, Ord_UN, Ord_oadd, 
   542                                     lt_oadd1 RS ltD, oadd_lt_mono2 RS ltD])
   543                                     lt_oadd1 RS ltD, oadd_lt_mono2 RS ltD])
   543                      addSEs [ltE, ltI RS lt_oadd_disj RS disjE]) 1);
   544                      addSEs [ltE, ltI RS lt_oadd_disj RS disjE]) 1);
   544 qed "oadd_UN";
   545 qed "oadd_UN";
   545 
   546 
   546 goal OrderType.thy 
   547 goal OrderType.thy 
   560 by (asm_simp_tac (!simpset addsimps [oadd_Limit]) 1);
   561 by (asm_simp_tac (!simpset addsimps [oadd_Limit]) 1);
   561 by (rtac le_trans 1);
   562 by (rtac le_trans 1);
   562 by (rtac le_implies_UN_le_UN 2);
   563 by (rtac le_implies_UN_le_UN 2);
   563 by (Fast_tac 2);
   564 by (Fast_tac 2);
   564 by (asm_simp_tac (!simpset addsimps [Union_eq_UN RS sym, Limit_Union_eq, 
   565 by (asm_simp_tac (!simpset addsimps [Union_eq_UN RS sym, Limit_Union_eq, 
   565 				     le_refl, Limit_is_Ord]) 1);
   566                                      le_refl, Limit_is_Ord]) 1);
   566 qed "oadd_le_self2";
   567 qed "oadd_le_self2";
   567 
   568 
   568 goal OrderType.thy "!!i j k. [| k le j;  Ord(i) |] ==> k++i le j++i";
   569 goal OrderType.thy "!!i j k. [| k le j;  Ord(i) |] ==> k++i le j++i";
   569 by (forward_tac [lt_Ord] 1);
   570 by (forward_tac [lt_Ord] 1);
   570 by (forward_tac [le_Ord2] 1);
   571 by (forward_tac [le_Ord2] 1);
   598 **)
   599 **)
   599 
   600 
   600 goal OrderType.thy
   601 goal OrderType.thy
   601     "!!A B. A<=B ==> (lam y:B. if(y:A, Inl(y), Inr(y))) : bij(B, A+(B-A))";
   602     "!!A B. A<=B ==> (lam y:B. if(y:A, Inl(y), Inr(y))) : bij(B, A+(B-A))";
   602 by (res_inst_tac [("d", "case(%x.x, %y.y)")] lam_bijective 1);
   603 by (res_inst_tac [("d", "case(%x.x, %y.y)")] lam_bijective 1);
   603 by (fast_tac (sum_cs addSIs [if_type]) 1);
   604 by (fast_tac (!claset addSIs [if_type]) 1);
   604 by (fast_tac (!claset addSIs [case_type]) 1);
   605 by (fast_tac (!claset addSIs [case_type]) 1);
   605 by (etac sumE 2);
   606 by (etac sumE 2);
   606 by (ALLGOALS (asm_simp_tac (!simpset setloop split_tac [expand_if])));
   607 by (ALLGOALS (asm_simp_tac (!simpset setloop split_tac [expand_if])));
   607 qed "bij_sum_Diff";
   608 qed "bij_sum_Diff";
   608 
   609 
   675 
   676 
   676 goalw OrderType.thy [pred_def]
   677 goalw OrderType.thy [pred_def]
   677  "!!A B. [| a:A;  b:B |] ==>  \
   678  "!!A B. [| a:A;  b:B |] ==>  \
   678 \        pred(A*B, <a,b>, rmult(A,r,B,s)) =     \
   679 \        pred(A*B, <a,b>, rmult(A,r,B,s)) =     \
   679 \        pred(A,a,r)*B Un ({a} * pred(B,b,s))";
   680 \        pred(A,a,r)*B Un ({a} * pred(B,b,s))";
   680 by (safe_tac eq_cs);
   681 by (rtac equalityI 1);
       
   682 by (safe_tac (!claset));
   681 by (ALLGOALS (asm_full_simp_tac (!simpset addsimps [rmult_iff])));
   683 by (ALLGOALS (asm_full_simp_tac (!simpset addsimps [rmult_iff])));
   682 by (ALLGOALS (Fast_tac));
   684 by (ALLGOALS (Fast_tac));
   683 qed "pred_Pair_eq";
   685 qed "pred_Pair_eq";
   684 
   686 
   685 goal OrderType.thy
   687 goal OrderType.thy
   728 goalw OrderType.thy [omult_def]
   730 goalw OrderType.thy [omult_def]
   729  "!!i j. [| j'<j;  i'<i |] ==> j**i' ++ j'  <  j**i";
   731  "!!i j. [| j'<j;  i'<i |] ==> j**i' ++ j'  <  j**i";
   730 by (rtac ltI 1);
   732 by (rtac ltI 1);
   731 by (asm_simp_tac
   733 by (asm_simp_tac
   732     (!simpset addsimps [Ord_ordertype, well_ord_rmult, well_ord_Memrel, 
   734     (!simpset addsimps [Ord_ordertype, well_ord_rmult, well_ord_Memrel, 
   733 			lt_Ord2]) 2);
   735                         lt_Ord2]) 2);
   734 by (asm_simp_tac 
   736 by (asm_simp_tac 
   735     (!simpset addsimps [ordertype_pred_unfold, 
   737     (!simpset addsimps [ordertype_pred_unfold, 
   736                      well_ord_rmult, well_ord_Memrel, lt_Ord2]) 1);
   738                      well_ord_rmult, well_ord_Memrel, lt_Ord2]) 1);
   737 by (rtac bexI 1);
   739 by (rtac bexI 1);
   738 by (fast_tac (!claset addSEs [ltE]) 2);
   740 by (fast_tac (!claset addSEs [ltE]) 2);
   739 by (asm_simp_tac 
   741 by (asm_simp_tac 
   740     (!simpset addsimps [ordertype_pred_Pair_lemma, ltI,
   742     (!simpset addsimps [ordertype_pred_Pair_lemma, ltI,
   741 			symmetric omult_def]) 1);
   743                         symmetric omult_def]) 1);
   742 qed "omult_oadd_lt";
   744 qed "omult_oadd_lt";
   743 
   745 
   744 goal OrderType.thy
   746 goal OrderType.thy
   745  "!!i j. [| Ord(i);  Ord(j) |] ==> j**i = (UN j':j. UN i':i. {j**i' ++ j'})";
   747  "!!i j. [| Ord(i);  Ord(j) |] ==> j**i = (UN j':j. UN i':i. {j**i' ++ j'})";
   746 by (rtac (subsetI RS equalityI) 1);
   748 by (rtac (subsetI RS equalityI) 1);
   800 by (REPEAT (ares_tac [well_ord_rmult, well_ord_radd, well_ord_Memrel, 
   802 by (REPEAT (ares_tac [well_ord_rmult, well_ord_radd, well_ord_Memrel, 
   801                       Ord_ordertype] 1));
   803                       Ord_ordertype] 1));
   802 qed "oadd_omult_distrib";
   804 qed "oadd_omult_distrib";
   803 
   805 
   804 goal OrderType.thy "!!i. [| Ord(i);  Ord(j) |] ==> i**succ(j) = (i**j)++i";
   806 goal OrderType.thy "!!i. [| Ord(i);  Ord(j) |] ==> i**succ(j) = (i**j)++i";
   805 		(*ZF_ss prevents looping*)
   807                 (*ZF_ss prevents looping*)
   806 by (asm_simp_tac (ZF_ss addsimps [oadd_1 RS sym]) 1);
   808 by (asm_simp_tac (ZF_ss addsimps [oadd_1 RS sym]) 1);
   807 by (asm_simp_tac 
   809 by (asm_simp_tac 
   808     (!simpset addsimps [omult_1, oadd_omult_distrib, Ord_1]) 1);
   810     (!simpset addsimps [omult_1, oadd_omult_distrib, Ord_1]) 1);
   809 qed "omult_succ";
   811 qed "omult_succ";
   810 
   812 
   828 
   830 
   829 val prems = goal OrderType.thy
   831 val prems = goal OrderType.thy
   830     "[| Ord(i);  !!x. x:A ==> Ord(j(x)) |] ==> \
   832     "[| Ord(i);  !!x. x:A ==> Ord(j(x)) |] ==> \
   831 \    i ** (UN x:A. j(x)) = (UN x:A. i**j(x))";
   833 \    i ** (UN x:A. j(x)) = (UN x:A. i**j(x))";
   832 by (asm_simp_tac (!simpset addsimps (prems@[Ord_UN, omult_unfold])) 1);
   834 by (asm_simp_tac (!simpset addsimps (prems@[Ord_UN, omult_unfold])) 1);
   833 by (fast_tac eq_cs 1);
   835 by (Fast_tac 1);
   834 qed "omult_UN";
   836 qed "omult_UN";
   835 
   837 
   836 goal OrderType.thy 
   838 goal OrderType.thy 
   837     "!!i j. [| Ord(i);  Limit(j) |] ==> i**j = (UN k:j. i**k)";
   839     "!!i j. [| Ord(i);  Limit(j) |] ==> i**j = (UN k:j. i**k)";
   838 by (asm_simp_tac 
   840 by (asm_simp_tac 
   907 by (asm_simp_tac (!simpset addsimps [omult_Limit]) 1);
   909 by (asm_simp_tac (!simpset addsimps [omult_Limit]) 1);
   908 by (rtac le_trans 1);
   910 by (rtac le_trans 1);
   909 by (rtac le_implies_UN_le_UN 2);
   911 by (rtac le_implies_UN_le_UN 2);
   910 by (Fast_tac 2);
   912 by (Fast_tac 2);
   911 by (asm_simp_tac (!simpset addsimps [Union_eq_UN RS sym, Limit_Union_eq, 
   913 by (asm_simp_tac (!simpset addsimps [Union_eq_UN RS sym, Limit_Union_eq, 
   912 				     Limit_is_Ord RS le_refl]) 1);
   914                                      Limit_is_Ord RS le_refl]) 1);
   913 qed "omult_le_self2";
   915 qed "omult_le_self2";
   914 
   916 
   915 
   917 
   916 (** Further properties of ordinal multiplication **)
   918 (** Further properties of ordinal multiplication **)
   917 
   919