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); |
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); |