5 |
5 |
6 header{*Infinite-Branching Datatype Definitions*} |
6 header{*Infinite-Branching Datatype Definitions*} |
7 |
7 |
8 theory InfDatatype imports Datatype_ZF Univ Finite Cardinal_AC begin |
8 theory InfDatatype imports Datatype_ZF Univ Finite Cardinal_AC begin |
9 |
9 |
10 lemmas fun_Limit_VfromE = |
10 lemmas fun_Limit_VfromE = |
11 Limit_VfromE [OF apply_funtype InfCard_csucc [THEN InfCard_is_Limit]] |
11 Limit_VfromE [OF apply_funtype InfCard_csucc [THEN InfCard_is_Limit]] |
12 |
12 |
13 lemma fun_Vcsucc_lemma: |
13 lemma fun_Vcsucc_lemma: |
14 "[| f: D -> Vfrom(A,csucc(K)); |D| le K; InfCard(K) |] |
14 "[| f: D -> Vfrom(A,csucc(K)); |D| \<le> K; InfCard(K) |] |
15 ==> EX j. f: D -> Vfrom(A,j) & j < csucc(K)" |
15 ==> \<exists>j. f: D -> Vfrom(A,j) & j < csucc(K)" |
16 apply (rule_tac x = "\<Union>d\<in>D. LEAST i. f`d : Vfrom (A,i) " in exI) |
16 apply (rule_tac x = "\<Union>d\<in>D. LEAST i. f`d \<in> Vfrom (A,i) " in exI) |
17 apply (rule conjI) |
17 apply (rule conjI) |
18 apply (rule_tac [2] le_UN_Ord_lt_csucc) |
18 apply (rule_tac [2] le_UN_Ord_lt_csucc) |
19 apply (rule_tac [4] ballI, erule_tac [4] fun_Limit_VfromE, simp_all) |
19 apply (rule_tac [4] ballI, erule_tac [4] fun_Limit_VfromE, simp_all) |
20 prefer 2 apply (fast elim: Least_le [THEN lt_trans1] ltE) |
20 prefer 2 apply (fast elim: Least_le [THEN lt_trans1] ltE) |
21 apply (rule Pi_type) |
21 apply (rule Pi_type) |
22 apply (rename_tac [2] d) |
22 apply (rename_tac [2] d) |
23 apply (erule_tac [2] fun_Limit_VfromE, simp_all) |
23 apply (erule_tac [2] fun_Limit_VfromE, simp_all) |
24 apply (subgoal_tac "f`d : Vfrom (A, LEAST i. f`d : Vfrom (A,i))") |
24 apply (subgoal_tac "f`d \<in> Vfrom (A, LEAST i. f`d \<in> Vfrom (A,i))") |
25 apply (erule Vfrom_mono [OF subset_refl UN_upper, THEN subsetD]) |
25 apply (erule Vfrom_mono [OF subset_refl UN_upper, THEN subsetD]) |
26 apply assumption |
26 apply assumption |
27 apply (fast elim: LeastI ltE) |
27 apply (fast elim: LeastI ltE) |
28 done |
28 done |
29 |
29 |
30 lemma subset_Vcsucc: |
30 lemma subset_Vcsucc: |
31 "[| D <= Vfrom(A,csucc(K)); |D| le K; InfCard(K) |] |
31 "[| D \<subseteq> Vfrom(A,csucc(K)); |D| \<le> K; InfCard(K) |] |
32 ==> EX j. D <= Vfrom(A,j) & j < csucc(K)" |
32 ==> \<exists>j. D \<subseteq> Vfrom(A,j) & j < csucc(K)" |
33 by (simp add: subset_iff_id fun_Vcsucc_lemma) |
33 by (simp add: subset_iff_id fun_Vcsucc_lemma) |
34 |
34 |
35 (*Version for arbitrary index sets*) |
35 (*Version for arbitrary index sets*) |
36 lemma fun_Vcsucc: |
36 lemma fun_Vcsucc: |
37 "[| |D| le K; InfCard(K); D <= Vfrom(A,csucc(K)) |] ==> |
37 "[| |D| \<le> K; InfCard(K); D \<subseteq> Vfrom(A,csucc(K)) |] ==> |
38 D -> Vfrom(A,csucc(K)) <= Vfrom(A,csucc(K))" |
38 D -> Vfrom(A,csucc(K)) \<subseteq> Vfrom(A,csucc(K))" |
39 apply (safe dest!: fun_Vcsucc_lemma subset_Vcsucc) |
39 apply (safe dest!: fun_Vcsucc_lemma subset_Vcsucc) |
40 apply (rule Vfrom [THEN ssubst]) |
40 apply (rule Vfrom [THEN ssubst]) |
41 apply (drule fun_is_rel) |
41 apply (drule fun_is_rel) |
42 (*This level includes the function, and is below csucc(K)*) |
42 (*This level includes the function, and is below csucc(K)*) |
43 apply (rule_tac a1 = "succ (succ (j Un ja))" in UN_I [THEN UnI2]) |
43 apply (rule_tac a1 = "succ (succ (j \<union> ja))" in UN_I [THEN UnI2]) |
44 apply (blast intro: ltD InfCard_csucc InfCard_is_Limit Limit_has_succ |
44 apply (blast intro: ltD InfCard_csucc InfCard_is_Limit Limit_has_succ |
45 Un_least_lt) |
45 Un_least_lt) |
46 apply (erule subset_trans [THEN PowI]) |
46 apply (erule subset_trans [THEN PowI]) |
47 apply (fast intro: Pair_in_Vfrom Vfrom_UnI1 Vfrom_UnI2) |
47 apply (fast intro: Pair_in_Vfrom Vfrom_UnI1 Vfrom_UnI2) |
48 done |
48 done |
49 |
49 |
50 lemma fun_in_Vcsucc: |
50 lemma fun_in_Vcsucc: |
51 "[| f: D -> Vfrom(A, csucc(K)); |D| le K; InfCard(K); |
51 "[| f: D -> Vfrom(A, csucc(K)); |D| \<le> K; InfCard(K); |
52 D <= Vfrom(A,csucc(K)) |] |
52 D \<subseteq> Vfrom(A,csucc(K)) |] |
53 ==> f: Vfrom(A,csucc(K))" |
53 ==> f: Vfrom(A,csucc(K))" |
54 by (blast intro: fun_Vcsucc [THEN subsetD]) |
54 by (blast intro: fun_Vcsucc [THEN subsetD]) |
55 |
55 |
56 (*Remove <= from the rule above*) |
56 text{*Remove @{text "\<subseteq>"} from the rule above*} |
57 lemmas fun_in_Vcsucc' = fun_in_Vcsucc [OF _ _ _ subsetI] |
57 lemmas fun_in_Vcsucc' = fun_in_Vcsucc [OF _ _ _ subsetI] |
58 |
58 |
59 (** Version where K itself is the index set **) |
59 (** Version where K itself is the index set **) |
60 |
60 |
61 lemma Card_fun_Vcsucc: |
61 lemma Card_fun_Vcsucc: |
62 "InfCard(K) ==> K -> Vfrom(A,csucc(K)) <= Vfrom(A,csucc(K))" |
62 "InfCard(K) ==> K -> Vfrom(A,csucc(K)) \<subseteq> Vfrom(A,csucc(K))" |
63 apply (frule InfCard_is_Card [THEN Card_is_Ord]) |
63 apply (frule InfCard_is_Card [THEN Card_is_Ord]) |
64 apply (blast del: subsetI |
64 apply (blast del: subsetI |
65 intro: fun_Vcsucc Ord_cardinal_le i_subset_Vfrom |
65 intro: fun_Vcsucc Ord_cardinal_le i_subset_Vfrom |
66 lt_csucc [THEN leI, THEN le_imp_subset, THEN subset_trans]) |
66 lt_csucc [THEN leI, THEN le_imp_subset, THEN subset_trans]) |
67 done |
67 done |
68 |
68 |
69 lemma Card_fun_in_Vcsucc: |
69 lemma Card_fun_in_Vcsucc: |
70 "[| f: K -> Vfrom(A, csucc(K)); InfCard(K) |] ==> f: Vfrom(A,csucc(K))" |
70 "[| f: K -> Vfrom(A, csucc(K)); InfCard(K) |] ==> f: Vfrom(A,csucc(K))" |
71 by (blast intro: Card_fun_Vcsucc [THEN subsetD]) |
71 by (blast intro: Card_fun_Vcsucc [THEN subsetD]) |
72 |
72 |
73 lemma Limit_csucc: "InfCard(K) ==> Limit(csucc(K))" |
73 lemma Limit_csucc: "InfCard(K) ==> Limit(csucc(K))" |
74 by (erule InfCard_csucc [THEN InfCard_is_Limit]) |
74 by (erule InfCard_csucc [THEN InfCard_is_Limit]) |
75 |
75 |
76 lemmas Pair_in_Vcsucc = Pair_in_VLimit [OF _ _ Limit_csucc] |
76 lemmas Pair_in_Vcsucc = Pair_in_VLimit [OF _ _ Limit_csucc] |
77 lemmas Inl_in_Vcsucc = Inl_in_VLimit [OF _ Limit_csucc] |
77 lemmas Inl_in_Vcsucc = Inl_in_VLimit [OF _ Limit_csucc] |
78 lemmas Inr_in_Vcsucc = Inr_in_VLimit [OF _ Limit_csucc] |
78 lemmas Inr_in_Vcsucc = Inr_in_VLimit [OF _ Limit_csucc] |
79 lemmas zero_in_Vcsucc = Limit_csucc [THEN zero_in_VLimit] |
79 lemmas zero_in_Vcsucc = Limit_csucc [THEN zero_in_VLimit] |
80 lemmas nat_into_Vcsucc = nat_into_VLimit [OF _ Limit_csucc] |
80 lemmas nat_into_Vcsucc = nat_into_VLimit [OF _ Limit_csucc] |
81 |
81 |
82 (*For handling Cardinals of the form (nat Un |X|) *) |
82 (*For handling Cardinals of the form @{term"nat \<union> |X|"} *) |
83 |
83 |
84 lemmas InfCard_nat_Un_cardinal = InfCard_Un [OF InfCard_nat Card_cardinal] |
84 lemmas InfCard_nat_Un_cardinal = InfCard_Un [OF InfCard_nat Card_cardinal] |
85 |
85 |
86 lemmas le_nat_Un_cardinal = |
86 lemmas le_nat_Un_cardinal = |
87 Un_upper2_le [OF Ord_nat Card_cardinal [THEN Card_is_Ord]] |
87 Un_upper2_le [OF Ord_nat Card_cardinal [THEN Card_is_Ord]] |