src/ZF/Ordinal.thy
changeset 46953 2b6e55924af3
parent 46935 38ecb2dc3636
child 46954 d8b3412cdb99
equal deleted inserted replaced
46952:5e1bcfdcb175 46953:2b6e55924af3
    64 apply (simp add: Pair_def)
    64 apply (simp add: Pair_def)
    65 apply (blast dest: Transset_doubleton_D)
    65 apply (blast dest: Transset_doubleton_D)
    66 done
    66 done
    67 
    67 
    68 lemma Transset_includes_domain:
    68 lemma Transset_includes_domain:
    69     "[| Transset(C); A*B \<subseteq> C; b: B |] ==> A \<subseteq> C"
    69     "[| Transset(C); A*B \<subseteq> C; b \<in> B |] ==> A \<subseteq> C"
    70 by (blast dest: Transset_Pair_D)
    70 by (blast dest: Transset_Pair_D)
    71 
    71 
    72 lemma Transset_includes_range:
    72 lemma Transset_includes_range:
    73     "[| Transset(C); A*B \<subseteq> C; a: A |] ==> B \<subseteq> C"
    73     "[| Transset(C); A*B \<subseteq> C; a \<in> A |] ==> B \<subseteq> C"
    74 by (blast dest: Transset_Pair_D)
    74 by (blast dest: Transset_Pair_D)
    75 
    75 
    76 subsubsection{*Closure Properties*}
    76 subsubsection{*Closure Properties*}
    77 
    77 
    78 lemma Transset_0: "Transset(0)"
    78 lemma Transset_0: "Transset(0)"
   274 
   274 
   275 (*The lemmas MemrelI/E give better speed than [iff] here*)
   275 (*The lemmas MemrelI/E give better speed than [iff] here*)
   276 lemma Memrel_iff [simp]: "<a,b> \<in> Memrel(A) <-> a\<in>b & a\<in>A & b\<in>A"
   276 lemma Memrel_iff [simp]: "<a,b> \<in> Memrel(A) <-> a\<in>b & a\<in>A & b\<in>A"
   277 by (unfold Memrel_def, blast)
   277 by (unfold Memrel_def, blast)
   278 
   278 
   279 lemma MemrelI [intro!]: "[| a: b;  a: A;  b: A |] ==> <a,b> \<in> Memrel(A)"
   279 lemma MemrelI [intro!]: "[| a \<in> b;  a \<in> A;  b \<in> A |] ==> <a,b> \<in> Memrel(A)"
   280 by auto
   280 by auto
   281 
   281 
   282 lemma MemrelE [elim!]:
   282 lemma MemrelE [elim!]:
   283     "[| <a,b> \<in> Memrel(A);
   283     "[| <a,b> \<in> Memrel(A);
   284         [| a: A;  b: A;  a\<in>b |]  ==> P |]
   284         [| a \<in> A;  b \<in> A;  a\<in>b |]  ==> P |]
   285      ==> P"
   285      ==> P"
   286 by auto
   286 by auto
   287 
   287 
   288 lemma Memrel_type: "Memrel(A) \<subseteq> A*A"
   288 lemma Memrel_type: "Memrel(A) \<subseteq> A*A"
   289 by (unfold Memrel_def, blast)
   289 by (unfold Memrel_def, blast)
   325 
   325 
   326 subsection{*Transfinite Induction*}
   326 subsection{*Transfinite Induction*}
   327 
   327 
   328 (*Epsilon induction over a transitive set*)
   328 (*Epsilon induction over a transitive set*)
   329 lemma Transset_induct:
   329 lemma Transset_induct:
   330     "[| i: k;  Transset(k);
   330     "[| i \<in> k;  Transset(k);
   331         !!x.[| x: k;  \<forall>y\<in>x. P(y) |] ==> P(x) |]
   331         !!x.[| x \<in> k;  \<forall>y\<in>x. P(y) |] ==> P(x) |]
   332      ==>  P(i)"
   332      ==>  P(i)"
   333 apply (simp add: Transset_def)
   333 apply (simp add: Transset_def)
   334 apply (erule wf_Memrel [THEN wf_induct2], blast+)
   334 apply (erule wf_Memrel [THEN wf_induct2], blast+)
   335 done
   335 done
   336 
   336 
   362 done
   362 done
   363 
   363 
   364 text{*The trichotomy law for ordinals*}
   364 text{*The trichotomy law for ordinals*}
   365 lemma Ord_linear_lt:
   365 lemma Ord_linear_lt:
   366  assumes o: "Ord(i)" "Ord(j)"
   366  assumes o: "Ord(i)" "Ord(j)"
   367  obtains (lt) "i<j" | (eq) "i=j" | (gt) "j<i" 
   367  obtains (lt) "i<j" | (eq) "i=j" | (gt) "j<i"
   368 apply (simp add: lt_def)
   368 apply (simp add: lt_def)
   369 apply (rule_tac i1=i and j1=j in Ord_linear [THEN disjE])
   369 apply (rule_tac i1=i and j1=j in Ord_linear [THEN disjE])
   370 apply (blast intro: o)+
   370 apply (blast intro: o)+
   371 done
   371 done
   372 
   372 
   373 lemma Ord_linear2:
   373 lemma Ord_linear2:
   374  assumes o: "Ord(i)" "Ord(j)"
   374  assumes o: "Ord(i)" "Ord(j)"
   375  obtains (lt) "i<j" | (ge) "j \<le> i" 
   375  obtains (lt) "i<j" | (ge) "j \<le> i"
   376 apply (rule_tac i = i and j = j in Ord_linear_lt)
   376 apply (rule_tac i = i and j = j in Ord_linear_lt)
   377 apply (blast intro: leI le_eqI sym o) +
   377 apply (blast intro: leI le_eqI sym o) +
   378 done
   378 done
   379 
   379 
   380 lemma Ord_linear_le:
   380 lemma Ord_linear_le:
   381  assumes o: "Ord(i)" "Ord(j)"
   381  assumes o: "Ord(i)" "Ord(j)"
   382  obtains (le) "i \<le> j" | (ge) "j \<le> i" 
   382  obtains (le) "i \<le> j" | (ge) "j \<le> i"
   383 apply (rule_tac i = i and j = j in Ord_linear_lt)
   383 apply (rule_tac i = i and j = j in Ord_linear_lt)
   384 apply (blast intro: leI le_eqI o) +
   384 apply (blast intro: leI le_eqI o) +
   385 done
   385 done
   386 
   386 
   387 lemma le_imp_not_lt: "j \<le> i ==> ~ i<j"
   387 lemma le_imp_not_lt: "j \<le> i ==> ~ i<j"
   596 lemma UN_upper_lt:
   596 lemma UN_upper_lt:
   597      "[| a\<in>A;  i < b(a);  Ord(\<Union>x\<in>A. b(x)) |] ==> i < (\<Union>x\<in>A. b(x))"
   597      "[| a\<in>A;  i < b(a);  Ord(\<Union>x\<in>A. b(x)) |] ==> i < (\<Union>x\<in>A. b(x))"
   598 by (unfold lt_def, blast)
   598 by (unfold lt_def, blast)
   599 
   599 
   600 lemma UN_upper_le:
   600 lemma UN_upper_le:
   601      "[| a: A;  i \<le> b(a);  Ord(\<Union>x\<in>A. b(x)) |] ==> i \<le> (\<Union>x\<in>A. b(x))"
   601      "[| a \<in> A;  i \<le> b(a);  Ord(\<Union>x\<in>A. b(x)) |] ==> i \<le> (\<Union>x\<in>A. b(x))"
   602 apply (frule ltD)
   602 apply (frule ltD)
   603 apply (rule le_imp_subset [THEN subset_trans, THEN subset_imp_le])
   603 apply (rule le_imp_subset [THEN subset_trans, THEN subset_imp_le])
   604 apply (blast intro: lt_Ord UN_upper)+
   604 apply (blast intro: lt_Ord UN_upper)+
   605 done
   605 done
   606 
   606 
   607 lemma lt_Union_iff: "\<forall>i\<in>A. Ord(i) ==> (j < \<Union>(A)) <-> (\<exists>i\<in>A. j<i)"
   607 lemma lt_Union_iff: "\<forall>i\<in>A. Ord(i) ==> (j < \<Union>(A)) <-> (\<exists>i\<in>A. j<i)"
   608 by (auto simp: lt_def Ord_Union)
   608 by (auto simp: lt_def Ord_Union)
   609 
   609 
   610 lemma Union_upper_le:
   610 lemma Union_upper_le:
   611      "[| j: J;  i\<le>j;  Ord(\<Union>(J)) |] ==> i \<le> \<Union>J"
   611      "[| j \<in> J;  i\<le>j;  Ord(\<Union>(J)) |] ==> i \<le> \<Union>J"
   612 apply (subst Union_eq_UN)
   612 apply (subst Union_eq_UN)
   613 apply (rule UN_upper_le, auto)
   613 apply (rule UN_upper_le, auto)
   614 done
   614 done
   615 
   615 
   616 lemma le_implies_UN_le_UN:
   616 lemma le_implies_UN_le_UN:
   675 proof -
   675 proof -
   676   have Oi: "Ord(i)" using i by (simp add: lt_def)
   676   have Oi: "Ord(i)" using i by (simp add: lt_def)
   677   { fix y
   677   { fix y
   678     assume yi: "y<i"
   678     assume yi: "y<i"
   679     hence Osy: "Ord(succ(y))" by (simp add: lt_Ord Ord_succ)
   679     hence Osy: "Ord(succ(y))" by (simp add: lt_Ord Ord_succ)
   680     have "~ i \<le> y" using yi by (blast dest: le_imp_not_lt) 
   680     have "~ i \<le> y" using yi by (blast dest: le_imp_not_lt)
   681     hence "succ(y) < i" using nsucc [of y] 
   681     hence "succ(y) < i" using nsucc [of y]
   682       by (blast intro: Ord_linear_lt [OF Osy Oi]) }
   682       by (blast intro: Ord_linear_lt [OF Osy Oi]) }
   683   thus ?thesis using i Oi by (auto simp add: Limit_def) 
   683   thus ?thesis using i Oi by (auto simp add: Limit_def)
   684 qed
   684 qed
   685 
   685 
   686 lemma succ_LimitE [elim!]: "Limit(succ(i)) ==> P"
   686 lemma succ_LimitE [elim!]: "Limit(succ(i)) ==> P"
   687 apply (rule lt_irrefl)
   687 apply (rule lt_irrefl)
   688 apply (rule Limit_has_succ, assumption)
   688 apply (rule Limit_has_succ, assumption)
   701 lemma Ord_cases_disj: "Ord(i) ==> i=0 | (\<exists>j. Ord(j) & i=succ(j)) | Limit(i)"
   701 lemma Ord_cases_disj: "Ord(i) ==> i=0 | (\<exists>j. Ord(j) & i=succ(j)) | Limit(i)"
   702 by (blast intro!: non_succ_LimitI Ord_0_lt)
   702 by (blast intro!: non_succ_LimitI Ord_0_lt)
   703 
   703 
   704 lemma Ord_cases:
   704 lemma Ord_cases:
   705  assumes i: "Ord(i)"
   705  assumes i: "Ord(i)"
   706  obtains (0) "i=0" | (succ) j where "Ord(j)" "i=succ(j)" | (limit) "Limit(i)" 
   706  obtains (0) "i=0" | (succ) j where "Ord(j)" "i=succ(j)" | (limit) "Limit(i)"
   707 by (insert Ord_cases_disj [OF i], auto)
   707 by (insert Ord_cases_disj [OF i], auto)
   708 
   708 
   709 lemma trans_induct3_raw:
   709 lemma trans_induct3_raw:
   710      "[| Ord(i);
   710      "[| Ord(i);
   711          P(0);
   711          P(0);
   720 
   720 
   721 text{*A set of ordinals is either empty, contains its own union, or its
   721 text{*A set of ordinals is either empty, contains its own union, or its
   722 union is a limit ordinal.*}
   722 union is a limit ordinal.*}
   723 
   723 
   724 lemma Union_le: "[| !!x. x\<in>I ==> x\<le>j; Ord(j) |] ==> \<Union>(I) \<le> j"
   724 lemma Union_le: "[| !!x. x\<in>I ==> x\<le>j; Ord(j) |] ==> \<Union>(I) \<le> j"
   725   by (auto simp add: le_subset_iff Union_least) 
   725   by (auto simp add: le_subset_iff Union_least)
   726 
   726 
   727 lemma Ord_set_cases:
   727 lemma Ord_set_cases:
   728   assumes I: "\<forall>i\<in>I. Ord(i)"
   728   assumes I: "\<forall>i\<in>I. Ord(i)"
   729   shows "I=0 \<or> \<Union>(I) \<in> I \<or> (\<Union>(I) \<notin> I \<and> Limit(\<Union>(I)))"
   729   shows "I=0 \<or> \<Union>(I) \<in> I \<or> (\<Union>(I) \<notin> I \<and> Limit(\<Union>(I)))"
   730 proof (cases "\<Union>(I)" rule: Ord_cases)
   730 proof (cases "\<Union>(I)" rule: Ord_cases)
   732 next
   732 next
   733   assume "\<Union>I = 0" thus ?thesis by (simp, blast intro: subst_elem)
   733   assume "\<Union>I = 0" thus ?thesis by (simp, blast intro: subst_elem)
   734 next
   734 next
   735   fix j
   735   fix j
   736   assume j: "Ord(j)" and UIj:"\<Union>(I) = succ(j)"
   736   assume j: "Ord(j)" and UIj:"\<Union>(I) = succ(j)"
   737   { assume "\<forall>i\<in>I. i\<le>j" 
   737   { assume "\<forall>i\<in>I. i\<le>j"
   738     hence "\<Union>(I) \<le> j" 
   738     hence "\<Union>(I) \<le> j"
   739       by (simp add: Union_le j) 
   739       by (simp add: Union_le j)
   740     hence False 
   740     hence False
   741       by (simp add: UIj lt_not_refl) }
   741       by (simp add: UIj lt_not_refl) }
   742   then obtain i where i: "i \<in> I" "succ(j) \<le> i" using I j
   742   then obtain i where i: "i \<in> I" "succ(j) \<le> i" using I j
   743     by (atomize, auto simp add: not_le_iff_lt) 
   743     by (atomize, auto simp add: not_le_iff_lt)
   744   have "\<Union>(I) \<le> succ(j)" using UIj j by auto
   744   have "\<Union>(I) \<le> succ(j)" using UIj j by auto
   745   hence "i \<le> succ(j)" using i
   745   hence "i \<le> succ(j)" using i
   746     by (simp add: le_subset_iff Union_subset_iff) 
   746     by (simp add: le_subset_iff Union_subset_iff)
   747   hence "succ(j) = i" using i 
   747   hence "succ(j) = i" using i
   748     by (blast intro: le_anti_sym) 
   748     by (blast intro: le_anti_sym)
   749   hence "succ(j) \<in> I" by (simp add: i)
   749   hence "succ(j) \<in> I" by (simp add: i)
   750   thus ?thesis by (simp add: UIj) 
   750   thus ?thesis by (simp add: UIj)
   751 next
   751 next
   752   assume "Limit(\<Union>I)" thus ?thesis by auto
   752   assume "Limit(\<Union>I)" thus ?thesis by auto
   753 qed
   753 qed
   754 
   754 
   755 text{*If the union of a set of ordinals is a successor, then it is an element of that set.*}
   755 text{*If the union of a set of ordinals is a successor, then it is an element of that set.*}