src/ZF/OrderType.thy
changeset 13356 c9cfe1638bf2
parent 13339 0f89104dd377
child 13611 2edf034c902a
equal deleted inserted replaced
13355:d19cdbd8b559 13356:c9cfe1638bf2
     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)