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.*} |