1 (* Title: ZF/OrderType.thy |
1 (* Title: ZF/OrderType.thy |
2 ID: $Id$ |
2 ID: $Id$ |
3 Author: Lawrence C Paulson, Cambridge University Computer Laboratory |
3 Author: Lawrence C Paulson, Cambridge University Computer Laboratory |
4 Copyright 1994 University of Cambridge |
4 Copyright 1994 University of Cambridge |
5 |
5 |
6 Order types and ordinal arithmetic in Zermelo-Fraenkel Set Theory |
|
7 |
|
8 The order type of a well-ordering is the least ordinal isomorphic to it. |
|
9 |
|
10 Ordinal arithmetic is traditionally defined in terms of order types, as here. |
|
11 But a definition by transfinite recursion would be much simpler! |
|
12 *) |
6 *) |
13 |
7 |
|
8 header{*Order Types and Ordinal Arithmetic*} |
|
9 |
14 theory OrderType = OrderArith + OrdQuant + Nat: |
10 theory OrderType = OrderArith + OrdQuant + Nat: |
|
11 |
|
12 text{*The order type of a well-ordering is the least ordinal isomorphic to it. |
|
13 Ordinal arithmetic is traditionally defined in terms of order types, as it is |
|
14 here. But a definition by transfinite recursion would be much simpler!*} |
15 |
15 |
16 constdefs |
16 constdefs |
17 |
17 |
18 ordermap :: "[i,i]=>i" |
18 ordermap :: "[i,i]=>i" |
19 "ordermap(A,r) == lam x:A. wfrec[A](r, x, %x f. f `` pred(A,x,r))" |
19 "ordermap(A,r) == lam x:A. wfrec[A](r, x, %x f. f `` pred(A,x,r))" |
106 apply (unfold ordermap_def ordertype_def) |
106 apply (unfold ordermap_def ordertype_def) |
107 apply (rule lam_type) |
107 apply (rule lam_type) |
108 apply (rule lamI [THEN imageI], assumption+) |
108 apply (rule lamI [THEN imageI], assumption+) |
109 done |
109 done |
110 |
110 |
111 (*** Unfolding of ordermap ***) |
111 subsubsection{*Unfolding of ordermap *} |
112 |
112 |
113 (*Useful for cardinality reasoning; see CardinalArith.ML*) |
113 (*Useful for cardinality reasoning; see CardinalArith.ML*) |
114 lemma ordermap_eq_image: |
114 lemma ordermap_eq_image: |
115 "[| wf[A](r); x:A |] |
115 "[| wf[A](r); x:A |] |
116 ==> ordermap(A,r) ` x = ordermap(A,r) `` pred(A,x,r)" |
116 ==> ordermap(A,r) ` x = ordermap(A,r) `` pred(A,x,r)" |
143 |
143 |
144 might eliminate the need for r to be transitive. |
144 might eliminate the need for r to be transitive. |
145 *) |
145 *) |
146 |
146 |
147 |
147 |
148 (*** Showing that ordermap, ordertype yield ordinals ***) |
148 subsubsection{*Showing that ordermap, ordertype yield ordinals *} |
149 |
149 |
150 lemma Ord_ordermap: |
150 lemma Ord_ordermap: |
151 "[| well_ord(A,r); x:A |] ==> Ord(ordermap(A,r) ` x)" |
151 "[| well_ord(A,r); x:A |] ==> Ord(ordermap(A,r) ` x)" |
152 apply (unfold well_ord_def tot_ord_def part_ord_def, safe) |
152 apply (unfold well_ord_def tot_ord_def part_ord_def, safe) |
153 apply (rule_tac a=x in wf_on_induct, assumption+) |
153 apply (rule_tac a=x in wf_on_induct, assumption+) |
168 apply (blast intro: trans_onD |
168 apply (blast intro: trans_onD |
169 dest!: ordermap_unfold [THEN equalityD1]) |
169 dest!: ordermap_unfold [THEN equalityD1]) |
170 done |
170 done |
171 |
171 |
172 |
172 |
173 (*** ordermap preserves the orderings in both directions ***) |
173 subsubsection{*ordermap preserves the orderings in both directions *} |
174 |
174 |
175 lemma ordermap_mono: |
175 lemma ordermap_mono: |
176 "[| <w,x>: r; wf[A](r); w: A; x: A |] |
176 "[| <w,x>: r; wf[A](r); w: A; x: A |] |
177 ==> ordermap(A,r)`w : ordermap(A,r)`x" |
177 ==> ordermap(A,r)`w : ordermap(A,r)`x" |
178 apply (erule_tac x1 = x in ordermap_unfold [THEN ssubst], assumption, blast) |
178 apply (erule_tac x1 = x in ordermap_unfold [THEN ssubst], assumption, blast) |
197 apply (force intro!: ordermap_type ordermap_surj |
197 apply (force intro!: ordermap_type ordermap_surj |
198 elim: linearE dest: ordermap_mono |
198 elim: linearE dest: ordermap_mono |
199 simp add: mem_not_refl) |
199 simp add: mem_not_refl) |
200 done |
200 done |
201 |
201 |
202 (*** Isomorphisms involving ordertype ***) |
202 subsubsection{*Isomorphisms involving ordertype *} |
203 |
203 |
204 lemma ordertype_ord_iso: |
204 lemma ordertype_ord_iso: |
205 "well_ord(A,r) |
205 "well_ord(A,r) |
206 ==> ordermap(A,r) : ord_iso(A,r, ordertype(A,r), Memrel(ordertype(A,r)))" |
206 ==> ordermap(A,r) : ord_iso(A,r, ordertype(A,r), Memrel(ordertype(A,r)))" |
207 apply (unfold ord_iso_def) |
207 apply (unfold ord_iso_def) |
225 apply (rule ordertype_ord_iso [THEN ord_iso_trans], assumption) |
225 apply (rule ordertype_ord_iso [THEN ord_iso_trans], assumption) |
226 apply (erule ssubst) |
226 apply (erule ssubst) |
227 apply (erule ordertype_ord_iso [THEN ord_iso_sym]) |
227 apply (erule ordertype_ord_iso [THEN ord_iso_sym]) |
228 done |
228 done |
229 |
229 |
230 (*** Basic equalities for ordertype ***) |
230 subsubsection{*Basic equalities for ordertype *} |
231 |
231 |
232 (*Ordertype of Memrel*) |
232 (*Ordertype of Memrel*) |
233 lemma le_ordertype_Memrel: "j le i ==> ordertype(j,Memrel(i)) = j" |
233 lemma le_ordertype_Memrel: "j le i ==> ordertype(j,Memrel(i)) = j" |
234 apply (rule Ord_iso_implies_eq [symmetric]) |
234 apply (rule Ord_iso_implies_eq [symmetric]) |
235 apply (erule ltE, assumption) |
235 apply (erule ltE, assumption) |
253 |
253 |
254 (*Ordertype of rvimage: [| f: bij(A,B); well_ord(B,s) |] ==> |
254 (*Ordertype of rvimage: [| f: bij(A,B); well_ord(B,s) |] ==> |
255 ordertype(A, rvimage(A,f,s)) = ordertype(B,s) *) |
255 ordertype(A, rvimage(A,f,s)) = ordertype(B,s) *) |
256 lemmas bij_ordertype_vimage = ord_iso_rvimage [THEN ordertype_eq] |
256 lemmas bij_ordertype_vimage = ord_iso_rvimage [THEN ordertype_eq] |
257 |
257 |
258 (*** A fundamental unfolding law for ordertype. ***) |
258 subsubsection{*A fundamental unfolding law for ordertype. *} |
259 |
259 |
260 (*Ordermap returns the same result if applied to an initial segment*) |
260 (*Ordermap returns the same result if applied to an initial segment*) |
261 lemma ordermap_pred_eq_ordermap: |
261 lemma ordermap_pred_eq_ordermap: |
262 "[| well_ord(A,r); y:A; z: pred(A,y,r) |] |
262 "[| well_ord(A,r); y:A; z: pred(A,y,r) |] |
263 ==> ordermap(pred(A,y,r), r) ` z = ordermap(A, r) ` z" |
263 ==> ordermap(pred(A,y,r), r) ` z = ordermap(A, r) ` z" |
330 done |
330 done |
331 |
331 |
332 |
332 |
333 subsection{*Ordinal Addition*} |
333 subsection{*Ordinal Addition*} |
334 |
334 |
335 (*** Order Type calculations for radd ***) |
335 subsubsection{*Order Type calculations for radd *} |
336 |
336 |
337 (** Addition with 0 **) |
337 (** Addition with 0 **) |
338 |
338 |
339 lemma bij_sum_0: "(lam z:A+0. case(%x. x, %y. y, z)) : bij(A+0, A)" |
339 lemma bij_sum_0: "(lam z:A+0. case(%x. x, %y. y, z)) : bij(A+0, A)" |
340 apply (rule_tac d = Inl in lam_bijective, safe) |
340 apply (rule_tac d = Inl in lam_bijective, safe) |
396 prefer 2 apply (force simp add: pred_def id_def, assumption) |
396 prefer 2 apply (force simp add: pred_def id_def, assumption) |
397 apply (blast intro: well_ord_radd well_ord_subset [OF _ pred_subset]) |
397 apply (blast intro: well_ord_radd well_ord_subset [OF _ pred_subset]) |
398 done |
398 done |
399 |
399 |
400 |
400 |
401 (*** ordify: trivial coercion to an ordinal ***) |
401 subsubsection{*ordify: trivial coercion to an ordinal *} |
402 |
402 |
403 lemma Ord_ordify [iff, TC]: "Ord(ordify(x))" |
403 lemma Ord_ordify [iff, TC]: "Ord(ordify(x))" |
404 by (simp add: ordify_def) |
404 by (simp add: ordify_def) |
405 |
405 |
406 (*Collapsing*) |
406 (*Collapsing*) |
407 lemma ordify_idem [simp]: "ordify(ordify(x)) = ordify(x)" |
407 lemma ordify_idem [simp]: "ordify(ordify(x)) = ordify(x)" |
408 by (simp add: ordify_def) |
408 by (simp add: ordify_def) |
409 |
409 |
410 |
410 |
411 (*** Basic laws for ordinal addition ***) |
411 subsubsection{*Basic laws for ordinal addition *} |
412 |
412 |
413 lemma Ord_raw_oadd: "[|Ord(i); Ord(j)|] ==> Ord(raw_oadd(i,j))" |
413 lemma Ord_raw_oadd: "[|Ord(i); Ord(j)|] ==> Ord(raw_oadd(i,j))" |
414 by (simp add: raw_oadd_def ordify_def Ord_ordertype well_ord_radd |
414 by (simp add: raw_oadd_def ordify_def Ord_ordertype well_ord_radd |
415 well_ord_Memrel) |
415 well_ord_Memrel) |
416 |
416 |
550 lt_pred_Memrel le_ordertype_Memrel leI |
550 lt_pred_Memrel le_ordertype_Memrel leI |
551 ordertype_pred_Inr_eq ordertype_sum_Memrel) |
551 ordertype_pred_Inr_eq ordertype_sum_Memrel) |
552 done |
552 done |
553 |
553 |
554 |
554 |
555 (*** Ordinal addition with successor -- via associativity! ***) |
555 subsubsection{*Ordinal addition with successor -- via associativity! *} |
556 |
556 |
557 lemma oadd_assoc: "(i++j)++k = i++(j++k)" |
557 lemma oadd_assoc: "(i++j)++k = i++(j++k)" |
558 apply (simp add: oadd_eq_if_raw_oadd Ord_raw_oadd raw_oadd_0 raw_oadd_0_left, clarify) |
558 apply (simp add: oadd_eq_if_raw_oadd Ord_raw_oadd raw_oadd_0 raw_oadd_0_left, clarify) |
559 apply (simp add: raw_oadd_def) |
559 apply (simp add: raw_oadd_def) |
560 apply (rule ordertype_eq [THEN trans]) |
560 apply (rule ordertype_eq [THEN trans]) |
597 oadd_lt_mono2 [THEN ltD] |
597 oadd_lt_mono2 [THEN ltD] |
598 elim!: ltE dest!: ltI [THEN lt_oadd_disj]) |
598 elim!: ltE dest!: ltI [THEN lt_oadd_disj]) |
599 |
599 |
600 lemma oadd_Limit: "Limit(j) ==> i++j = (UN k:j. i++k)" |
600 lemma oadd_Limit: "Limit(j) ==> i++j = (UN k:j. i++k)" |
601 apply (frule Limit_has_0 [THEN ltD]) |
601 apply (frule Limit_has_0 [THEN ltD]) |
602 apply (simp (no_asm_simp) add: Limit_is_Ord [THEN Ord_in_Ord] oadd_UN [symmetric] Union_eq_UN [symmetric] Limit_Union_eq) |
602 apply (simp add: Limit_is_Ord [THEN Ord_in_Ord] oadd_UN [symmetric] |
|
603 Union_eq_UN [symmetric] Limit_Union_eq) |
603 done |
604 done |
604 |
605 |
605 lemma oadd_eq_0_iff: "[| Ord(i); Ord(j) |] ==> (i ++ j) = 0 <-> i=0 & j=0" |
606 lemma oadd_eq_0_iff: "[| Ord(i); Ord(j) |] ==> (i ++ j) = 0 <-> i=0 & j=0" |
606 apply (erule trans_induct3 [of j]) |
607 apply (erule trans_induct3 [of j]) |
607 apply (simp_all add: oadd_Limit) |
608 apply (simp_all add: oadd_Limit) |
632 apply (simp (no_asm_simp) add: oadd_succ succ_leI) |
633 apply (simp (no_asm_simp) add: oadd_succ succ_leI) |
633 apply (simp (no_asm_simp) add: oadd_Limit) |
634 apply (simp (no_asm_simp) add: oadd_Limit) |
634 apply (rule le_trans) |
635 apply (rule le_trans) |
635 apply (rule_tac [2] le_implies_UN_le_UN) |
636 apply (rule_tac [2] le_implies_UN_le_UN) |
636 apply (erule_tac [2] bspec) |
637 apply (erule_tac [2] bspec) |
637 prefer 2 apply assumption |
638 prefer 2 apply assumption |
638 apply (simp (no_asm_simp) add: Union_eq_UN [symmetric] Limit_Union_eq le_refl Limit_is_Ord) |
639 apply (simp add: Union_eq_UN [symmetric] Limit_Union_eq le_refl Limit_is_Ord) |
639 done |
640 done |
640 |
641 |
641 lemma oadd_le_mono1: "k le j ==> k++i le j++i" |
642 lemma oadd_le_mono1: "k le j ==> k++i le j++i" |
642 apply (frule lt_Ord) |
643 apply (frule lt_Ord) |
643 apply (frule le_Ord2) |
644 apply (frule le_Ord2) |
750 "[| Ord(i); Ord(j) |] ==> Ord(i**j)" |
751 "[| Ord(i); Ord(j) |] ==> Ord(i**j)" |
751 apply (unfold omult_def) |
752 apply (unfold omult_def) |
752 apply (blast intro: Ord_ordertype well_ord_rmult well_ord_Memrel) |
753 apply (blast intro: Ord_ordertype well_ord_rmult well_ord_Memrel) |
753 done |
754 done |
754 |
755 |
755 (*** A useful unfolding law ***) |
756 subsubsection{*A useful unfolding law *} |
756 |
757 |
757 lemma pred_Pair_eq: |
758 lemma pred_Pair_eq: |
758 "[| a:A; b:B |] ==> pred(A*B, <a,b>, rmult(A,r,B,s)) = |
759 "[| a:A; b:B |] ==> pred(A*B, <a,b>, rmult(A,r,B,s)) = |
759 pred(A,a,r)*B Un ({a} * pred(B,b,s))" |
760 pred(A,a,r)*B Un ({a} * pred(B,b,s))" |
760 apply (unfold pred_def, blast) |
761 apply (unfold pred_def, blast) |
777 "[| i'<i; j'<j |] |
778 "[| i'<i; j'<j |] |
778 ==> ordertype(pred(i*j, <i',j'>, rmult(i,Memrel(i),j,Memrel(j))), |
779 ==> ordertype(pred(i*j, <i',j'>, rmult(i,Memrel(i),j,Memrel(j))), |
779 rmult(i,Memrel(i),j,Memrel(j))) = |
780 rmult(i,Memrel(i),j,Memrel(j))) = |
780 raw_oadd (j**i', j')" |
781 raw_oadd (j**i', j')" |
781 apply (unfold raw_oadd_def omult_def) |
782 apply (unfold raw_oadd_def omult_def) |
782 apply (simp (no_asm_simp) add: ordertype_pred_Pair_eq lt_pred_Memrel ltD lt_Ord2 well_ord_Memrel) |
783 apply (simp add: ordertype_pred_Pair_eq lt_pred_Memrel ltD lt_Ord2 |
|
784 well_ord_Memrel) |
783 apply (rule trans) |
785 apply (rule trans) |
784 apply (rule_tac [2] ordertype_ord_iso [THEN sum_ord_iso_cong, THEN ordertype_eq]) |
786 apply (rule_tac [2] ordertype_ord_iso |
785 apply (rule_tac [3] ord_iso_refl) |
787 [THEN sum_ord_iso_cong, THEN ordertype_eq]) |
|
788 apply (rule_tac [3] ord_iso_refl) |
786 apply (rule id_bij [THEN ord_isoI, THEN ordertype_eq]) |
789 apply (rule id_bij [THEN ord_isoI, THEN ordertype_eq]) |
787 apply (elim SigmaE sumE ltE ssubst) |
790 apply (elim SigmaE sumE ltE ssubst) |
788 apply (simp_all add: well_ord_rmult well_ord_radd well_ord_Memrel |
791 apply (simp_all add: well_ord_rmult well_ord_radd well_ord_Memrel |
789 Ord_ordertype lt_Ord lt_Ord2) |
792 Ord_ordertype lt_Ord lt_Ord2) |
790 apply (blast intro: Ord_trans)+ |
793 apply (blast intro: Ord_trans)+ |
805 "[| j'<j; i'<i |] ==> j**i' ++ j' < j**i" |
808 "[| j'<j; i'<i |] ==> j**i' ++ j' < j**i" |
806 apply (unfold omult_def) |
809 apply (unfold omult_def) |
807 apply (rule ltI) |
810 apply (rule ltI) |
808 prefer 2 |
811 prefer 2 |
809 apply (simp add: Ord_ordertype well_ord_rmult well_ord_Memrel lt_Ord2) |
812 apply (simp add: Ord_ordertype well_ord_rmult well_ord_Memrel lt_Ord2) |
810 apply (simp (no_asm_simp) add: ordertype_pred_unfold well_ord_rmult well_ord_Memrel lt_Ord2) |
813 apply (simp add: ordertype_pred_unfold well_ord_rmult well_ord_Memrel lt_Ord2) |
811 apply (rule bexI) |
814 apply (rule bexI) |
812 prefer 2 apply (blast elim!: ltE) |
815 prefer 2 apply (blast elim!: ltE) |
813 apply (simp add: ordertype_pred_Pair_lemma ltI omult_def [symmetric]) |
816 apply (simp add: ordertype_pred_Pair_lemma ltI omult_def [symmetric]) |
814 apply (simp add: lt_Ord lt_Ord2 raw_oadd_eq_oadd) |
817 apply (simp add: lt_Ord lt_Ord2 raw_oadd_eq_oadd) |
815 done |
818 done |
822 apply (simp_all add: Ord_omult) |
825 apply (simp_all add: Ord_omult) |
823 apply (blast elim!: ltE) |
826 apply (blast elim!: ltE) |
824 apply (blast intro: omult_oadd_lt [THEN ltD] ltI) |
827 apply (blast intro: omult_oadd_lt [THEN ltD] ltI) |
825 done |
828 done |
826 |
829 |
827 (*** Basic laws for ordinal multiplication ***) |
830 subsubsection{*Basic laws for ordinal multiplication *} |
828 |
831 |
829 (** Ordinal multiplication by zero **) |
832 (** Ordinal multiplication by zero **) |
830 |
833 |
831 lemma omult_0 [simp]: "i**0 = 0" |
834 lemma omult_0 [simp]: "i**0 = 0" |
832 apply (unfold omult_def) |
835 apply (unfold omult_def) |
884 apply (unfold omult_def) |
887 apply (unfold omult_def) |
885 apply (rule ordertype_eq [THEN trans]) |
888 apply (rule ordertype_eq [THEN trans]) |
886 apply (rule prod_ord_iso_cong [OF ord_iso_refl |
889 apply (rule prod_ord_iso_cong [OF ord_iso_refl |
887 ordertype_ord_iso [THEN ord_iso_sym]]) |
890 ordertype_ord_iso [THEN ord_iso_sym]]) |
888 apply (blast intro: well_ord_rmult well_ord_Memrel)+ |
891 apply (blast intro: well_ord_rmult well_ord_Memrel)+ |
889 apply (rule prod_assoc_ord_iso [THEN ord_iso_sym, THEN ordertype_eq, THEN trans]) |
892 apply (rule prod_assoc_ord_iso |
|
893 [THEN ord_iso_sym, THEN ordertype_eq, THEN trans]) |
890 apply (rule_tac [2] ordertype_eq) |
894 apply (rule_tac [2] ordertype_eq) |
891 apply (rule_tac [2] prod_ord_iso_cong [OF ordertype_ord_iso ord_iso_refl]) |
895 apply (rule_tac [2] prod_ord_iso_cong [OF ordertype_ord_iso ord_iso_refl]) |
892 apply (blast intro: well_ord_rmult well_ord_Memrel Ord_ordertype)+ |
896 apply (blast intro: well_ord_rmult well_ord_Memrel Ord_ordertype)+ |
893 done |
897 done |
894 |
898 |
903 lemma omult_Limit: "[| Ord(i); Limit(j) |] ==> i**j = (UN k:j. i**k)" |
907 lemma omult_Limit: "[| Ord(i); Limit(j) |] ==> i**j = (UN k:j. i**k)" |
904 by (simp add: Limit_is_Ord [THEN Ord_in_Ord] omult_UN [symmetric] |
908 by (simp add: Limit_is_Ord [THEN Ord_in_Ord] omult_UN [symmetric] |
905 Union_eq_UN [symmetric] Limit_Union_eq) |
909 Union_eq_UN [symmetric] Limit_Union_eq) |
906 |
910 |
907 |
911 |
908 (*** Ordering/monotonicity properties of ordinal multiplication ***) |
912 subsubsection{*Ordering/monotonicity properties of ordinal multiplication *} |
909 |
913 |
910 (*As a special case we have "[| 0<i; 0<j |] ==> 0 < i**j" *) |
914 (*As a special case we have "[| 0<i; 0<j |] ==> 0 < i**j" *) |
911 lemma lt_omult1: "[| k<i; 0<j |] ==> k < i**j" |
915 lemma lt_omult1: "[| k<i; 0<j |] ==> k < i**j" |
912 apply (safe elim!: ltE intro!: ltI Ord_omult) |
916 apply (safe elim!: ltE intro!: ltI Ord_omult) |
913 apply (force simp add: omult_unfold) |
917 apply (force simp add: omult_unfold) |