13 |
13 |
14 theory Univ imports Epsilon Cardinal begin |
14 theory Univ imports Epsilon Cardinal begin |
15 |
15 |
16 definition |
16 definition |
17 Vfrom :: "[i,i]=>i" where |
17 Vfrom :: "[i,i]=>i" where |
18 "Vfrom(A,i) == transrec(i, %x f. A Un (\<Union>y\<in>x. Pow(f`y)))" |
18 "Vfrom(A,i) == transrec(i, %x f. A \<union> (\<Union>y\<in>x. Pow(f`y)))" |
19 |
19 |
20 abbreviation |
20 abbreviation |
21 Vset :: "i=>i" where |
21 Vset :: "i=>i" where |
22 "Vset(x) == Vfrom(0,x)" |
22 "Vset(x) == Vfrom(0,x)" |
23 |
23 |
24 |
24 |
25 definition |
25 definition |
26 Vrec :: "[i, [i,i]=>i] =>i" where |
26 Vrec :: "[i, [i,i]=>i] =>i" where |
27 "Vrec(a,H) == transrec(rank(a), %x g. lam z: Vset(succ(x)). |
27 "Vrec(a,H) == transrec(rank(a), %x g. \<lambda>z\<in>Vset(succ(x)). |
28 H(z, lam w:Vset(x). g`rank(w)`w)) ` a" |
28 H(z, \<lambda>w\<in>Vset(x). g`rank(w)`w)) ` a" |
29 |
29 |
30 definition |
30 definition |
31 Vrecursor :: "[[i,i]=>i, i] =>i" where |
31 Vrecursor :: "[[i,i]=>i, i] =>i" where |
32 "Vrecursor(H,a) == transrec(rank(a), %x g. lam z: Vset(succ(x)). |
32 "Vrecursor(H,a) == transrec(rank(a), %x g. \<lambda>z\<in>Vset(succ(x)). |
33 H(lam w:Vset(x). g`rank(w)`w, z)) ` a" |
33 H(\<lambda>w\<in>Vset(x). g`rank(w)`w, z)) ` a" |
34 |
34 |
35 definition |
35 definition |
36 univ :: "i=>i" where |
36 univ :: "i=>i" where |
37 "univ(A) == Vfrom(A,nat)" |
37 "univ(A) == Vfrom(A,nat)" |
38 |
38 |
39 |
39 |
40 subsection{*Immediate Consequences of the Definition of @{term "Vfrom(A,i)"}*} |
40 subsection{*Immediate Consequences of the Definition of @{term "Vfrom(A,i)"}*} |
41 |
41 |
42 text{*NOT SUITABLE FOR REWRITING -- RECURSIVE!*} |
42 text{*NOT SUITABLE FOR REWRITING -- RECURSIVE!*} |
43 lemma Vfrom: "Vfrom(A,i) = A Un (\<Union>j\<in>i. Pow(Vfrom(A,j)))" |
43 lemma Vfrom: "Vfrom(A,i) = A \<union> (\<Union>j\<in>i. Pow(Vfrom(A,j)))" |
44 by (subst Vfrom_def [THEN def_transrec], simp) |
44 by (subst Vfrom_def [THEN def_transrec], simp) |
45 |
45 |
46 subsubsection{* Monotonicity *} |
46 subsubsection{* Monotonicity *} |
47 |
47 |
48 lemma Vfrom_mono [rule_format]: |
48 lemma Vfrom_mono [rule_format]: |
49 "A<=B ==> \<forall>j. i<=j --> Vfrom(A,i) <= Vfrom(B,j)" |
49 "A<=B ==> \<forall>j. i<=j \<longrightarrow> Vfrom(A,i) \<subseteq> Vfrom(B,j)" |
50 apply (rule_tac a=i in eps_induct) |
50 apply (rule_tac a=i in eps_induct) |
51 apply (rule impI [THEN allI]) |
51 apply (rule impI [THEN allI]) |
52 apply (subst Vfrom [of A]) |
52 apply (subst Vfrom [of A]) |
53 apply (subst Vfrom [of B]) |
53 apply (subst Vfrom [of B]) |
54 apply (erule Un_mono) |
54 apply (erule Un_mono) |
55 apply (erule UN_mono, blast) |
55 apply (erule UN_mono, blast) |
56 done |
56 done |
57 |
57 |
58 lemma VfromI: "[| a \<in> Vfrom(A,j); j<i |] ==> a \<in> Vfrom(A,i)" |
58 lemma VfromI: "[| a \<in> Vfrom(A,j); j<i |] ==> a \<in> Vfrom(A,i)" |
59 by (blast dest: Vfrom_mono [OF subset_refl le_imp_subset [OF leI]]) |
59 by (blast dest: Vfrom_mono [OF subset_refl le_imp_subset [OF leI]]) |
60 |
60 |
61 |
61 |
62 subsubsection{* A fundamental equality: Vfrom does not require ordinals! *} |
62 subsubsection{* A fundamental equality: Vfrom does not require ordinals! *} |
63 |
63 |
64 |
64 |
65 |
65 |
66 lemma Vfrom_rank_subset1: "Vfrom(A,x) <= Vfrom(A,rank(x))" |
66 lemma Vfrom_rank_subset1: "Vfrom(A,x) \<subseteq> Vfrom(A,rank(x))" |
67 proof (induct x rule: eps_induct) |
67 proof (induct x rule: eps_induct) |
68 fix x |
68 fix x |
69 assume "\<forall>y\<in>x. Vfrom(A,y) \<subseteq> Vfrom(A,rank(y))" |
69 assume "\<forall>y\<in>x. Vfrom(A,y) \<subseteq> Vfrom(A,rank(y))" |
70 thus "Vfrom(A, x) \<subseteq> Vfrom(A, rank(x))" |
70 thus "Vfrom(A, x) \<subseteq> Vfrom(A, rank(x))" |
71 by (simp add: Vfrom [of _ x] Vfrom [of _ "rank(x)"], |
71 by (simp add: Vfrom [of _ x] Vfrom [of _ "rank(x)"], |
72 blast intro!: rank_lt [THEN ltD]) |
72 blast intro!: rank_lt [THEN ltD]) |
73 qed |
73 qed |
74 |
74 |
75 lemma Vfrom_rank_subset2: "Vfrom(A,rank(x)) <= Vfrom(A,x)" |
75 lemma Vfrom_rank_subset2: "Vfrom(A,rank(x)) \<subseteq> Vfrom(A,x)" |
76 apply (rule_tac a=x in eps_induct) |
76 apply (rule_tac a=x in eps_induct) |
77 apply (subst Vfrom) |
77 apply (subst Vfrom) |
78 apply (subst Vfrom, rule subset_refl [THEN Un_mono]) |
78 apply (subst Vfrom, rule subset_refl [THEN Un_mono]) |
79 apply (rule UN_least) |
79 apply (rule UN_least) |
80 txt{*expand @{text "rank(x1) = (\<Union>y\<in>x1. succ(rank(y)))"} in assumptions*} |
80 txt{*expand @{text "rank(x1) = (\<Union>y\<in>x1. succ(rank(y)))"} in assumptions*} |
97 subsection{* Basic Closure Properties *} |
97 subsection{* Basic Closure Properties *} |
98 |
98 |
99 lemma zero_in_Vfrom: "y:x ==> 0 \<in> Vfrom(A,x)" |
99 lemma zero_in_Vfrom: "y:x ==> 0 \<in> Vfrom(A,x)" |
100 by (subst Vfrom, blast) |
100 by (subst Vfrom, blast) |
101 |
101 |
102 lemma i_subset_Vfrom: "i <= Vfrom(A,i)" |
102 lemma i_subset_Vfrom: "i \<subseteq> Vfrom(A,i)" |
103 apply (rule_tac a=i in eps_induct) |
103 apply (rule_tac a=i in eps_induct) |
104 apply (subst Vfrom, blast) |
104 apply (subst Vfrom, blast) |
105 done |
105 done |
106 |
106 |
107 lemma A_subset_Vfrom: "A <= Vfrom(A,i)" |
107 lemma A_subset_Vfrom: "A \<subseteq> Vfrom(A,i)" |
108 apply (subst Vfrom) |
108 apply (subst Vfrom) |
109 apply (rule Un_upper1) |
109 apply (rule Un_upper1) |
110 done |
110 done |
111 |
111 |
112 lemmas A_into_Vfrom = A_subset_Vfrom [THEN subsetD] |
112 lemmas A_into_Vfrom = A_subset_Vfrom [THEN subsetD] |
113 |
113 |
114 lemma subset_mem_Vfrom: "a <= Vfrom(A,i) ==> a \<in> Vfrom(A,succ(i))" |
114 lemma subset_mem_Vfrom: "a \<subseteq> Vfrom(A,i) ==> a \<in> Vfrom(A,succ(i))" |
115 by (subst Vfrom, blast) |
115 by (subst Vfrom, blast) |
116 |
116 |
117 subsubsection{* Finite sets and ordered pairs *} |
117 subsubsection{* Finite sets and ordered pairs *} |
118 |
118 |
119 lemma singleton_in_Vfrom: "a \<in> Vfrom(A,i) ==> {a} \<in> Vfrom(A,succ(i))" |
119 lemma singleton_in_Vfrom: "a \<in> Vfrom(A,i) ==> {a} \<in> Vfrom(A,succ(i))" |
124 by (rule subset_mem_Vfrom, safe) |
124 by (rule subset_mem_Vfrom, safe) |
125 |
125 |
126 lemma Pair_in_Vfrom: |
126 lemma Pair_in_Vfrom: |
127 "[| a \<in> Vfrom(A,i); b \<in> Vfrom(A,i) |] ==> <a,b> \<in> Vfrom(A,succ(succ(i)))" |
127 "[| a \<in> Vfrom(A,i); b \<in> Vfrom(A,i) |] ==> <a,b> \<in> Vfrom(A,succ(succ(i)))" |
128 apply (unfold Pair_def) |
128 apply (unfold Pair_def) |
129 apply (blast intro: doubleton_in_Vfrom) |
129 apply (blast intro: doubleton_in_Vfrom) |
130 done |
130 done |
131 |
131 |
132 lemma succ_in_Vfrom: "a <= Vfrom(A,i) ==> succ(a) \<in> Vfrom(A,succ(succ(i)))" |
132 lemma succ_in_Vfrom: "a \<subseteq> Vfrom(A,i) ==> succ(a) \<in> Vfrom(A,succ(succ(i)))" |
133 apply (intro subset_mem_Vfrom succ_subsetI, assumption) |
133 apply (intro subset_mem_Vfrom succ_subsetI, assumption) |
134 apply (erule subset_trans) |
134 apply (erule subset_trans) |
135 apply (rule Vfrom_mono [OF subset_refl subset_succI]) |
135 apply (rule Vfrom_mono [OF subset_refl subset_succI]) |
136 done |
136 done |
137 |
137 |
138 subsection{* 0, Successor and Limit Equations for @{term Vfrom} *} |
138 subsection{* 0, Successor and Limit Equations for @{term Vfrom} *} |
139 |
139 |
140 lemma Vfrom_0: "Vfrom(A,0) = A" |
140 lemma Vfrom_0: "Vfrom(A,0) = A" |
141 by (subst Vfrom, blast) |
141 by (subst Vfrom, blast) |
142 |
142 |
143 lemma Vfrom_succ_lemma: "Ord(i) ==> Vfrom(A,succ(i)) = A Un Pow(Vfrom(A,i))" |
143 lemma Vfrom_succ_lemma: "Ord(i) ==> Vfrom(A,succ(i)) = A \<union> Pow(Vfrom(A,i))" |
144 apply (rule Vfrom [THEN trans]) |
144 apply (rule Vfrom [THEN trans]) |
145 apply (rule equalityI [THEN subst_context, |
145 apply (rule equalityI [THEN subst_context, |
146 OF _ succI1 [THEN RepFunI, THEN Union_upper]]) |
146 OF _ succI1 [THEN RepFunI, THEN Union_upper]]) |
147 apply (rule UN_least) |
147 apply (rule UN_least) |
148 apply (rule subset_refl [THEN Vfrom_mono, THEN Pow_mono]) |
148 apply (rule subset_refl [THEN Vfrom_mono, THEN Pow_mono]) |
149 apply (erule ltI [THEN le_imp_subset]) |
149 apply (erule ltI [THEN le_imp_subset]) |
150 apply (erule Ord_succ) |
150 apply (erule Ord_succ) |
151 done |
151 done |
152 |
152 |
153 lemma Vfrom_succ: "Vfrom(A,succ(i)) = A Un Pow(Vfrom(A,i))" |
153 lemma Vfrom_succ: "Vfrom(A,succ(i)) = A \<union> Pow(Vfrom(A,i))" |
154 apply (rule_tac x1 = "succ (i)" in Vfrom_rank_eq [THEN subst]) |
154 apply (rule_tac x1 = "succ (i)" in Vfrom_rank_eq [THEN subst]) |
155 apply (rule_tac x1 = i in Vfrom_rank_eq [THEN subst]) |
155 apply (rule_tac x1 = i in Vfrom_rank_eq [THEN subst]) |
156 apply (subst rank_succ) |
156 apply (subst rank_succ) |
157 apply (rule Ord_rank [THEN Vfrom_succ_lemma]) |
157 apply (rule Ord_rank [THEN Vfrom_succ_lemma]) |
158 done |
158 done |
159 |
159 |
160 (*The premise distinguishes this from Vfrom(A,0); allowing X=0 forces |
160 (*The premise distinguishes this from Vfrom(A,0); allowing X=0 forces |
161 the conclusion to be Vfrom(A,Union(X)) = A Un (\<Union>y\<in>X. Vfrom(A,y)) *) |
161 the conclusion to be Vfrom(A,\<Union>(X)) = A \<union> (\<Union>y\<in>X. Vfrom(A,y)) *) |
162 lemma Vfrom_Union: "y:X ==> Vfrom(A,Union(X)) = (\<Union>y\<in>X. Vfrom(A,y))" |
162 lemma Vfrom_Union: "y:X ==> Vfrom(A,\<Union>(X)) = (\<Union>y\<in>X. Vfrom(A,y))" |
163 apply (subst Vfrom) |
163 apply (subst Vfrom) |
164 apply (rule equalityI) |
164 apply (rule equalityI) |
165 txt{*first inclusion*} |
165 txt{*first inclusion*} |
166 apply (rule Un_least) |
166 apply (rule Un_least) |
167 apply (rule A_subset_Vfrom [THEN subset_trans]) |
167 apply (rule A_subset_Vfrom [THEN subset_trans]) |
177 done |
177 done |
178 |
178 |
179 subsection{* @{term Vfrom} applied to Limit Ordinals *} |
179 subsection{* @{term Vfrom} applied to Limit Ordinals *} |
180 |
180 |
181 (*NB. limit ordinals are non-empty: |
181 (*NB. limit ordinals are non-empty: |
182 Vfrom(A,0) = A = A Un (\<Union>y\<in>0. Vfrom(A,y)) *) |
182 Vfrom(A,0) = A = A \<union> (\<Union>y\<in>0. Vfrom(A,y)) *) |
183 lemma Limit_Vfrom_eq: |
183 lemma Limit_Vfrom_eq: |
184 "Limit(i) ==> Vfrom(A,i) = (\<Union>y\<in>i. Vfrom(A,y))" |
184 "Limit(i) ==> Vfrom(A,i) = (\<Union>y\<in>i. Vfrom(A,y))" |
185 apply (rule Limit_has_0 [THEN ltD, THEN Vfrom_Union, THEN subst], assumption) |
185 apply (rule Limit_has_0 [THEN ltD, THEN Vfrom_Union, THEN subst], assumption) |
186 apply (simp add: Limit_Union_eq) |
186 apply (simp add: Limit_Union_eq) |
187 done |
187 done |
188 |
188 |
189 lemma Limit_VfromE: |
189 lemma Limit_VfromE: |
190 "[| a \<in> Vfrom(A,i); ~R ==> Limit(i); |
190 "[| a \<in> Vfrom(A,i); ~R ==> Limit(i); |
191 !!x. [| x<i; a \<in> Vfrom(A,x) |] ==> R |
191 !!x. [| x<i; a \<in> Vfrom(A,x) |] ==> R |
192 |] ==> R" |
192 |] ==> R" |
193 apply (rule classical) |
193 apply (rule classical) |
194 apply (rule Limit_Vfrom_eq [THEN equalityD1, THEN subsetD, THEN UN_E]) |
194 apply (rule Limit_Vfrom_eq [THEN equalityD1, THEN subsetD, THEN UN_E]) |
195 prefer 2 apply assumption |
195 prefer 2 apply assumption |
196 apply blast |
196 apply blast |
197 apply (blast intro: ltI Limit_is_Ord) |
197 apply (blast intro: ltI Limit_is_Ord) |
198 done |
198 done |
199 |
199 |
200 lemma singleton_in_VLimit: |
200 lemma singleton_in_VLimit: |
201 "[| a \<in> Vfrom(A,i); Limit(i) |] ==> {a} \<in> Vfrom(A,i)" |
201 "[| a \<in> Vfrom(A,i); Limit(i) |] ==> {a} \<in> Vfrom(A,i)" |
202 apply (erule Limit_VfromE, assumption) |
202 apply (erule Limit_VfromE, assumption) |
203 apply (erule singleton_in_Vfrom [THEN VfromI]) |
203 apply (erule singleton_in_Vfrom [THEN VfromI]) |
204 apply (blast intro: Limit_has_succ) |
204 apply (blast intro: Limit_has_succ) |
205 done |
205 done |
206 |
206 |
207 lemmas Vfrom_UnI1 = |
207 lemmas Vfrom_UnI1 = |
208 Un_upper1 [THEN subset_refl [THEN Vfrom_mono, THEN subsetD]] |
208 Un_upper1 [THEN subset_refl [THEN Vfrom_mono, THEN subsetD]] |
209 lemmas Vfrom_UnI2 = |
209 lemmas Vfrom_UnI2 = |
210 Un_upper2 [THEN subset_refl [THEN Vfrom_mono, THEN subsetD]] |
210 Un_upper2 [THEN subset_refl [THEN Vfrom_mono, THEN subsetD]] |
211 |
211 |
212 text{*Hard work is finding a single j:i such that {a,b}<=Vfrom(A,j)*} |
212 text{*Hard work is finding a single j:i such that {a,b}<=Vfrom(A,j)*} |
213 lemma doubleton_in_VLimit: |
213 lemma doubleton_in_VLimit: |
214 "[| a \<in> Vfrom(A,i); b \<in> Vfrom(A,i); Limit(i) |] ==> {a,b} \<in> Vfrom(A,i)" |
214 "[| a \<in> Vfrom(A,i); b \<in> Vfrom(A,i); Limit(i) |] ==> {a,b} \<in> Vfrom(A,i)" |
221 lemma Pair_in_VLimit: |
221 lemma Pair_in_VLimit: |
222 "[| a \<in> Vfrom(A,i); b \<in> Vfrom(A,i); Limit(i) |] ==> <a,b> \<in> Vfrom(A,i)" |
222 "[| a \<in> Vfrom(A,i); b \<in> Vfrom(A,i); Limit(i) |] ==> <a,b> \<in> Vfrom(A,i)" |
223 txt{*Infer that a, b occur at ordinals x,xa < i.*} |
223 txt{*Infer that a, b occur at ordinals x,xa < i.*} |
224 apply (erule Limit_VfromE, assumption) |
224 apply (erule Limit_VfromE, assumption) |
225 apply (erule Limit_VfromE, assumption) |
225 apply (erule Limit_VfromE, assumption) |
226 txt{*Infer that succ(succ(x Un xa)) < i *} |
226 txt{*Infer that @{term"succ(succ(x \<union> xa)) < i"} *} |
227 apply (blast intro: VfromI [OF Pair_in_Vfrom] |
227 apply (blast intro: VfromI [OF Pair_in_Vfrom] |
228 Vfrom_UnI1 Vfrom_UnI2 Limit_has_succ Un_least_lt) |
228 Vfrom_UnI1 Vfrom_UnI2 Limit_has_succ Un_least_lt) |
229 done |
229 done |
230 |
230 |
231 lemma product_VLimit: "Limit(i) ==> Vfrom(A,i) * Vfrom(A,i) <= Vfrom(A,i)" |
231 lemma product_VLimit: "Limit(i) ==> Vfrom(A,i) * Vfrom(A,i) \<subseteq> Vfrom(A,i)" |
232 by (blast intro: Pair_in_VLimit) |
232 by (blast intro: Pair_in_VLimit) |
233 |
233 |
234 lemmas Sigma_subset_VLimit = |
234 lemmas Sigma_subset_VLimit = |
235 subset_trans [OF Sigma_mono product_VLimit] |
235 subset_trans [OF Sigma_mono product_VLimit] |
236 |
236 |
281 apply (rule Un_least [OF _ subset_refl]) |
281 apply (rule Un_least [OF _ subset_refl]) |
282 apply (rule A_subset_Vfrom [THEN subset_trans]) |
282 apply (rule A_subset_Vfrom [THEN subset_trans]) |
283 apply (erule Transset_Vfrom [THEN Transset_iff_Pow [THEN iffD1]]) |
283 apply (erule Transset_Vfrom [THEN Transset_iff_Pow [THEN iffD1]]) |
284 done |
284 done |
285 |
285 |
286 lemma Transset_Pair_subset: "[| <a,b> <= C; Transset(C) |] ==> a: C & b: C" |
286 lemma Transset_Pair_subset: "[| <a,b> \<subseteq> C; Transset(C) |] ==> a: C & b: C" |
287 by (unfold Pair_def Transset_def, blast) |
287 by (unfold Pair_def Transset_def, blast) |
288 |
288 |
289 lemma Transset_Pair_subset_VLimit: |
289 lemma Transset_Pair_subset_VLimit: |
290 "[| <a,b> <= Vfrom(A,i); Transset(A); Limit(i) |] |
290 "[| <a,b> \<subseteq> Vfrom(A,i); Transset(A); Limit(i) |] |
291 ==> <a,b> \<in> Vfrom(A,i)" |
291 ==> <a,b> \<in> Vfrom(A,i)" |
292 apply (erule Transset_Pair_subset [THEN conjE]) |
292 apply (erule Transset_Pair_subset [THEN conjE]) |
293 apply (erule Transset_Vfrom) |
293 apply (erule Transset_Vfrom) |
294 apply (blast intro: Pair_in_VLimit) |
294 apply (blast intro: Pair_in_VLimit) |
295 done |
295 done |
296 |
296 |
297 lemma Union_in_Vfrom: |
297 lemma Union_in_Vfrom: |
298 "[| X \<in> Vfrom(A,j); Transset(A) |] ==> Union(X) \<in> Vfrom(A, succ(j))" |
298 "[| X \<in> Vfrom(A,j); Transset(A) |] ==> \<Union>(X) \<in> Vfrom(A, succ(j))" |
299 apply (drule Transset_Vfrom) |
299 apply (drule Transset_Vfrom) |
300 apply (rule subset_mem_Vfrom) |
300 apply (rule subset_mem_Vfrom) |
301 apply (unfold Transset_def, blast) |
301 apply (unfold Transset_def, blast) |
302 done |
302 done |
303 |
303 |
304 lemma Union_in_VLimit: |
304 lemma Union_in_VLimit: |
305 "[| X \<in> Vfrom(A,i); Limit(i); Transset(A) |] ==> Union(X) \<in> Vfrom(A,i)" |
305 "[| X \<in> Vfrom(A,i); Limit(i); Transset(A) |] ==> \<Union>(X) \<in> Vfrom(A,i)" |
306 apply (rule Limit_VfromE, assumption+) |
306 apply (rule Limit_VfromE, assumption+) |
307 apply (blast intro: Limit_has_succ VfromI Union_in_Vfrom) |
307 apply (blast intro: Limit_has_succ VfromI Union_in_Vfrom) |
308 done |
308 done |
309 |
309 |
310 |
310 |
315 |
315 |
316 text{*General theorem for membership in Vfrom(A,i) when i is a limit ordinal*} |
316 text{*General theorem for membership in Vfrom(A,i) when i is a limit ordinal*} |
317 lemma in_VLimit: |
317 lemma in_VLimit: |
318 "[| a \<in> Vfrom(A,i); b \<in> Vfrom(A,i); Limit(i); |
318 "[| a \<in> Vfrom(A,i); b \<in> Vfrom(A,i); Limit(i); |
319 !!x y j. [| j<i; 1:j; x \<in> Vfrom(A,j); y \<in> Vfrom(A,j) |] |
319 !!x y j. [| j<i; 1:j; x \<in> Vfrom(A,j); y \<in> Vfrom(A,j) |] |
320 ==> EX k. h(x,y) \<in> Vfrom(A,k) & k<i |] |
320 ==> \<exists>k. h(x,y) \<in> Vfrom(A,k) & k<i |] |
321 ==> h(a,b) \<in> Vfrom(A,i)" |
321 ==> h(a,b) \<in> Vfrom(A,i)" |
322 txt{*Infer that a, b occur at ordinals x,xa < i.*} |
322 txt{*Infer that a, b occur at ordinals x,xa < i.*} |
323 apply (erule Limit_VfromE, assumption) |
323 apply (erule Limit_VfromE, assumption) |
324 apply (erule Limit_VfromE, assumption, atomize) |
324 apply (erule Limit_VfromE, assumption, atomize) |
325 apply (drule_tac x=a in spec) |
325 apply (drule_tac x=a in spec) |
326 apply (drule_tac x=b in spec) |
326 apply (drule_tac x=b in spec) |
327 apply (drule_tac x="x Un xa Un 2" in spec) |
327 apply (drule_tac x="x \<union> xa \<union> 2" in spec) |
328 apply (simp add: Un_least_lt_iff lt_Ord Vfrom_UnI1 Vfrom_UnI2) |
328 apply (simp add: Un_least_lt_iff lt_Ord Vfrom_UnI1 Vfrom_UnI2) |
329 apply (blast intro: Limit_has_0 Limit_has_succ VfromI) |
329 apply (blast intro: Limit_has_0 Limit_has_succ VfromI) |
330 done |
330 done |
331 |
331 |
332 subsubsection{* Products *} |
332 subsubsection{* Products *} |
333 |
333 |
445 declare Ord_rank [THEN rank_of_Ord, simp] |
445 declare Ord_rank [THEN rank_of_Ord, simp] |
446 |
446 |
447 lemma rank_Vset: "Ord(i) ==> rank(Vset(i)) = i" |
447 lemma rank_Vset: "Ord(i) ==> rank(Vset(i)) = i" |
448 apply (subst rank) |
448 apply (subst rank) |
449 apply (rule equalityI, safe) |
449 apply (rule equalityI, safe) |
450 apply (blast intro: VsetD [THEN ltD]) |
450 apply (blast intro: VsetD [THEN ltD]) |
451 apply (blast intro: VsetD [THEN ltD] Ord_trans) |
451 apply (blast intro: VsetD [THEN ltD] Ord_trans) |
452 apply (blast intro: i_subset_Vfrom [THEN subsetD] |
452 apply (blast intro: i_subset_Vfrom [THEN subsetD] |
453 Ord_in_Ord [THEN rank_of_Ord, THEN ssubst]) |
453 Ord_in_Ord [THEN rank_of_Ord, THEN ssubst]) |
454 done |
454 done |
455 |
455 |
456 lemma Finite_Vset: "i \<in> nat ==> Finite(Vset(i))"; |
456 lemma Finite_Vset: "i \<in> nat ==> Finite(Vset(i))"; |
457 apply (erule nat_induct) |
457 apply (erule nat_induct) |
458 apply (simp add: Vfrom_0) |
458 apply (simp add: Vfrom_0) |
459 apply (simp add: Vset_succ) |
459 apply (simp add: Vset_succ) |
460 done |
460 done |
461 |
461 |
462 subsubsection{* Reasoning about Sets in Terms of Their Elements' Ranks *} |
462 subsubsection{* Reasoning about Sets in Terms of Their Elements' Ranks *} |
463 |
463 |
464 lemma arg_subset_Vset_rank: "a <= Vset(rank(a))" |
464 lemma arg_subset_Vset_rank: "a \<subseteq> Vset(rank(a))" |
465 apply (rule subsetI) |
465 apply (rule subsetI) |
466 apply (erule rank_lt [THEN VsetI]) |
466 apply (erule rank_lt [THEN VsetI]) |
467 done |
467 done |
468 |
468 |
469 lemma Int_Vset_subset: |
469 lemma Int_Vset_subset: |
470 "[| !!i. Ord(i) ==> a Int Vset(i) <= b |] ==> a <= b" |
470 "[| !!i. Ord(i) ==> a \<inter> Vset(i) \<subseteq> b |] ==> a \<subseteq> b" |
471 apply (rule subset_trans) |
471 apply (rule subset_trans) |
472 apply (rule Int_greatest [OF subset_refl arg_subset_Vset_rank]) |
472 apply (rule Int_greatest [OF subset_refl arg_subset_Vset_rank]) |
473 apply (blast intro: Ord_rank) |
473 apply (blast intro: Ord_rank) |
474 done |
474 done |
475 |
475 |
476 subsubsection{* Set Up an Environment for Simplification *} |
476 subsubsection{* Set Up an Environment for Simplification *} |
477 |
477 |
478 lemma rank_Inl: "rank(a) < rank(Inl(a))" |
478 lemma rank_Inl: "rank(a) < rank(Inl(a))" |
488 lemmas rank_rls = rank_Inl rank_Inr rank_pair1 rank_pair2 |
488 lemmas rank_rls = rank_Inl rank_Inr rank_pair1 rank_pair2 |
489 |
489 |
490 subsubsection{* Recursion over Vset Levels! *} |
490 subsubsection{* Recursion over Vset Levels! *} |
491 |
491 |
492 text{*NOT SUITABLE FOR REWRITING: recursive!*} |
492 text{*NOT SUITABLE FOR REWRITING: recursive!*} |
493 lemma Vrec: "Vrec(a,H) = H(a, lam x:Vset(rank(a)). Vrec(x,H))" |
493 lemma Vrec: "Vrec(a,H) = H(a, \<lambda>x\<in>Vset(rank(a)). Vrec(x,H))" |
494 apply (unfold Vrec_def) |
494 apply (unfold Vrec_def) |
495 apply (subst transrec, simp) |
495 apply (subst transrec, simp) |
496 apply (rule refl [THEN lam_cong, THEN subst_context], simp add: lt_def) |
496 apply (rule refl [THEN lam_cong, THEN subst_context], simp add: lt_def) |
497 done |
497 done |
498 |
498 |
499 text{*This form avoids giant explosions in proofs. NOTE USE OF == *} |
499 text{*This form avoids giant explosions in proofs. NOTE USE OF == *} |
500 lemma def_Vrec: |
500 lemma def_Vrec: |
501 "[| !!x. h(x)==Vrec(x,H) |] ==> |
501 "[| !!x. h(x)==Vrec(x,H) |] ==> |
502 h(a) = H(a, lam x: Vset(rank(a)). h(x))" |
502 h(a) = H(a, \<lambda>x\<in>Vset(rank(a)). h(x))" |
503 apply simp |
503 apply simp |
504 apply (rule Vrec) |
504 apply (rule Vrec) |
505 done |
505 done |
506 |
506 |
507 text{*NOT SUITABLE FOR REWRITING: recursive!*} |
507 text{*NOT SUITABLE FOR REWRITING: recursive!*} |
508 lemma Vrecursor: |
508 lemma Vrecursor: |
509 "Vrecursor(H,a) = H(lam x:Vset(rank(a)). Vrecursor(H,x), a)" |
509 "Vrecursor(H,a) = H(\<lambda>x\<in>Vset(rank(a)). Vrecursor(H,x), a)" |
510 apply (unfold Vrecursor_def) |
510 apply (unfold Vrecursor_def) |
511 apply (subst transrec, simp) |
511 apply (subst transrec, simp) |
512 apply (rule refl [THEN lam_cong, THEN subst_context], simp add: lt_def) |
512 apply (rule refl [THEN lam_cong, THEN subst_context], simp add: lt_def) |
513 done |
513 done |
514 |
514 |
515 text{*This form avoids giant explosions in proofs. NOTE USE OF == *} |
515 text{*This form avoids giant explosions in proofs. NOTE USE OF == *} |
516 lemma def_Vrecursor: |
516 lemma def_Vrecursor: |
517 "h == Vrecursor(H) ==> h(a) = H(lam x: Vset(rank(a)). h(x), a)" |
517 "h == Vrecursor(H) ==> h(a) = H(\<lambda>x\<in>Vset(rank(a)). h(x), a)" |
518 apply simp |
518 apply simp |
519 apply (rule Vrecursor) |
519 apply (rule Vrecursor) |
520 done |
520 done |
521 |
521 |
522 |
522 |
523 subsection{* The Datatype Universe: @{term "univ(A)"} *} |
523 subsection{* The Datatype Universe: @{term "univ(A)"} *} |
524 |
524 |
525 lemma univ_mono: "A<=B ==> univ(A) <= univ(B)" |
525 lemma univ_mono: "A<=B ==> univ(A) \<subseteq> univ(B)" |
526 apply (unfold univ_def) |
526 apply (unfold univ_def) |
527 apply (erule Vfrom_mono) |
527 apply (erule Vfrom_mono) |
528 apply (rule subset_refl) |
528 apply (rule subset_refl) |
529 done |
529 done |
530 |
530 |
538 lemma univ_eq_UN: "univ(A) = (\<Union>i\<in>nat. Vfrom(A,i))" |
538 lemma univ_eq_UN: "univ(A) = (\<Union>i\<in>nat. Vfrom(A,i))" |
539 apply (unfold univ_def) |
539 apply (unfold univ_def) |
540 apply (rule Limit_nat [THEN Limit_Vfrom_eq]) |
540 apply (rule Limit_nat [THEN Limit_Vfrom_eq]) |
541 done |
541 done |
542 |
542 |
543 lemma subset_univ_eq_Int: "c <= univ(A) ==> c = (\<Union>i\<in>nat. c Int Vfrom(A,i))" |
543 lemma subset_univ_eq_Int: "c \<subseteq> univ(A) ==> c = (\<Union>i\<in>nat. c \<inter> Vfrom(A,i))" |
544 apply (rule subset_UN_iff_eq [THEN iffD1]) |
544 apply (rule subset_UN_iff_eq [THEN iffD1]) |
545 apply (erule univ_eq_UN [THEN subst]) |
545 apply (erule univ_eq_UN [THEN subst]) |
546 done |
546 done |
547 |
547 |
548 lemma univ_Int_Vfrom_subset: |
548 lemma univ_Int_Vfrom_subset: |
549 "[| a <= univ(X); |
549 "[| a \<subseteq> univ(X); |
550 !!i. i:nat ==> a Int Vfrom(X,i) <= b |] |
550 !!i. i:nat ==> a \<inter> Vfrom(X,i) \<subseteq> b |] |
551 ==> a <= b" |
551 ==> a \<subseteq> b" |
552 apply (subst subset_univ_eq_Int, assumption) |
552 apply (subst subset_univ_eq_Int, assumption) |
553 apply (rule UN_least, simp) |
553 apply (rule UN_least, simp) |
554 done |
554 done |
555 |
555 |
556 lemma univ_Int_Vfrom_eq: |
556 lemma univ_Int_Vfrom_eq: |
557 "[| a <= univ(X); b <= univ(X); |
557 "[| a \<subseteq> univ(X); b \<subseteq> univ(X); |
558 !!i. i:nat ==> a Int Vfrom(X,i) = b Int Vfrom(X,i) |
558 !!i. i:nat ==> a \<inter> Vfrom(X,i) = b \<inter> Vfrom(X,i) |
559 |] ==> a = b" |
559 |] ==> a = b" |
560 apply (rule equalityI) |
560 apply (rule equalityI) |
561 apply (rule univ_Int_Vfrom_subset, assumption) |
561 apply (rule univ_Int_Vfrom_subset, assumption) |
562 apply (blast elim: equalityCE) |
562 apply (blast elim: equalityCE) |
563 apply (rule univ_Int_Vfrom_subset, assumption) |
563 apply (rule univ_Int_Vfrom_subset, assumption) |
564 apply (blast elim: equalityCE) |
564 apply (blast elim: equalityCE) |
565 done |
565 done |
566 |
566 |
567 subsection{* Closure Properties for @{term "univ(A)"}*} |
567 subsection{* Closure Properties for @{term "univ(A)"}*} |
568 |
568 |
569 lemma zero_in_univ: "0 \<in> univ(A)" |
569 lemma zero_in_univ: "0 \<in> univ(A)" |
570 apply (unfold univ_def) |
570 apply (unfold univ_def) |
571 apply (rule nat_0I [THEN zero_in_Vfrom]) |
571 apply (rule nat_0I [THEN zero_in_Vfrom]) |
572 done |
572 done |
573 |
573 |
574 lemma zero_subset_univ: "{0} <= univ(A)" |
574 lemma zero_subset_univ: "{0} \<subseteq> univ(A)" |
575 by (blast intro: zero_in_univ) |
575 by (blast intro: zero_in_univ) |
576 |
576 |
577 lemma A_subset_univ: "A <= univ(A)" |
577 lemma A_subset_univ: "A \<subseteq> univ(A)" |
578 apply (unfold univ_def) |
578 apply (unfold univ_def) |
579 apply (rule A_subset_Vfrom) |
579 apply (rule A_subset_Vfrom) |
580 done |
580 done |
581 |
581 |
582 lemmas A_into_univ = A_subset_univ [THEN subsetD] |
582 lemmas A_into_univ = A_subset_univ [THEN subsetD] |
599 apply (unfold univ_def) |
599 apply (unfold univ_def) |
600 apply (blast intro: Pair_in_VLimit Limit_nat) |
600 apply (blast intro: Pair_in_VLimit Limit_nat) |
601 done |
601 done |
602 |
602 |
603 lemma Union_in_univ: |
603 lemma Union_in_univ: |
604 "[| X: univ(A); Transset(A) |] ==> Union(X) \<in> univ(A)" |
604 "[| X: univ(A); Transset(A) |] ==> \<Union>(X) \<in> univ(A)" |
605 apply (unfold univ_def) |
605 apply (unfold univ_def) |
606 apply (blast intro: Union_in_VLimit Limit_nat) |
606 apply (blast intro: Union_in_VLimit Limit_nat) |
607 done |
607 done |
608 |
608 |
609 lemma product_univ: "univ(A)*univ(A) <= univ(A)" |
609 lemma product_univ: "univ(A)*univ(A) \<subseteq> univ(A)" |
610 apply (unfold univ_def) |
610 apply (unfold univ_def) |
611 apply (rule Limit_nat [THEN product_VLimit]) |
611 apply (rule Limit_nat [THEN product_VLimit]) |
612 done |
612 done |
613 |
613 |
614 |
614 |
615 subsubsection{* The Natural Numbers *} |
615 subsubsection{* The Natural Numbers *} |
616 |
616 |
617 lemma nat_subset_univ: "nat <= univ(A)" |
617 lemma nat_subset_univ: "nat \<subseteq> univ(A)" |
618 apply (unfold univ_def) |
618 apply (unfold univ_def) |
619 apply (rule i_subset_Vfrom) |
619 apply (rule i_subset_Vfrom) |
620 done |
620 done |
621 |
621 |
622 text{* n:nat ==> n:univ(A) *} |
622 text{* n:nat ==> n:univ(A) *} |
651 lemma Inr_in_univ: "b: univ(A) ==> Inr(b) \<in> univ(A)" |
651 lemma Inr_in_univ: "b: univ(A) ==> Inr(b) \<in> univ(A)" |
652 apply (unfold univ_def) |
652 apply (unfold univ_def) |
653 apply (erule Inr_in_VLimit [OF _ Limit_nat]) |
653 apply (erule Inr_in_VLimit [OF _ Limit_nat]) |
654 done |
654 done |
655 |
655 |
656 lemma sum_univ: "univ(C)+univ(C) <= univ(C)" |
656 lemma sum_univ: "univ(C)+univ(C) \<subseteq> univ(C)" |
657 apply (unfold univ_def) |
657 apply (unfold univ_def) |
658 apply (rule Limit_nat [THEN sum_VLimit]) |
658 apply (rule Limit_nat [THEN sum_VLimit]) |
659 done |
659 done |
660 |
660 |
661 lemmas sum_subset_univ = subset_trans [OF sum_mono sum_univ] |
661 lemmas sum_subset_univ = subset_trans [OF sum_mono sum_univ] |
662 |
662 |
663 lemma Sigma_subset_univ: |
663 lemma Sigma_subset_univ: |
664 "[|A \<subseteq> univ(D); \<And>x. x \<in> A \<Longrightarrow> B(x) \<subseteq> univ(D)|] ==> Sigma(A,B) \<subseteq> univ(D)" |
664 "[|A \<subseteq> univ(D); \<And>x. x \<in> A \<Longrightarrow> B(x) \<subseteq> univ(D)|] ==> Sigma(A,B) \<subseteq> univ(D)" |
665 apply (simp add: univ_def) |
665 apply (simp add: univ_def) |
666 apply (blast intro: Sigma_subset_VLimit del: subsetI) |
666 apply (blast intro: Sigma_subset_VLimit del: subsetI) |
667 done |
667 done |
668 |
668 |
669 |
669 |
670 (*Closure under binary union -- use Un_least |
670 (*Closure under binary union -- use Un_least |
671 Closure under Collect -- use Collect_subset [THEN subset_trans] |
671 Closure under Collect -- use Collect_subset [THEN subset_trans] |
675 subsection{* Finite Branching Closure Properties *} |
675 subsection{* Finite Branching Closure Properties *} |
676 |
676 |
677 subsubsection{* Closure under Finite Powerset *} |
677 subsubsection{* Closure under Finite Powerset *} |
678 |
678 |
679 lemma Fin_Vfrom_lemma: |
679 lemma Fin_Vfrom_lemma: |
680 "[| b: Fin(Vfrom(A,i)); Limit(i) |] ==> EX j. b <= Vfrom(A,j) & j<i" |
680 "[| b: Fin(Vfrom(A,i)); Limit(i) |] ==> \<exists>j. b \<subseteq> Vfrom(A,j) & j<i" |
681 apply (erule Fin_induct) |
681 apply (erule Fin_induct) |
682 apply (blast dest!: Limit_has_0, safe) |
682 apply (blast dest!: Limit_has_0, safe) |
683 apply (erule Limit_VfromE, assumption) |
683 apply (erule Limit_VfromE, assumption) |
684 apply (blast intro!: Un_least_lt intro: Vfrom_UnI1 Vfrom_UnI2) |
684 apply (blast intro!: Un_least_lt intro: Vfrom_UnI1 Vfrom_UnI2) |
685 done |
685 done |
686 |
686 |
687 lemma Fin_VLimit: "Limit(i) ==> Fin(Vfrom(A,i)) <= Vfrom(A,i)" |
687 lemma Fin_VLimit: "Limit(i) ==> Fin(Vfrom(A,i)) \<subseteq> Vfrom(A,i)" |
688 apply (rule subsetI) |
688 apply (rule subsetI) |
689 apply (drule Fin_Vfrom_lemma, safe) |
689 apply (drule Fin_Vfrom_lemma, safe) |
690 apply (rule Vfrom [THEN ssubst]) |
690 apply (rule Vfrom [THEN ssubst]) |
691 apply (blast dest!: ltD) |
691 apply (blast dest!: ltD) |
692 done |
692 done |
693 |
693 |
694 lemmas Fin_subset_VLimit = subset_trans [OF Fin_mono Fin_VLimit] |
694 lemmas Fin_subset_VLimit = subset_trans [OF Fin_mono Fin_VLimit] |
695 |
695 |
696 lemma Fin_univ: "Fin(univ(A)) <= univ(A)" |
696 lemma Fin_univ: "Fin(univ(A)) \<subseteq> univ(A)" |
697 apply (unfold univ_def) |
697 apply (unfold univ_def) |
698 apply (rule Limit_nat [THEN Fin_VLimit]) |
698 apply (rule Limit_nat [THEN Fin_VLimit]) |
699 done |
699 done |
700 |
700 |
701 subsubsection{* Closure under Finite Powers: Functions from a Natural Number *} |
701 subsubsection{* Closure under Finite Powers: Functions from a Natural Number *} |
702 |
702 |
703 lemma nat_fun_VLimit: |
703 lemma nat_fun_VLimit: |
704 "[| n: nat; Limit(i) |] ==> n -> Vfrom(A,i) <= Vfrom(A,i)" |
704 "[| n: nat; Limit(i) |] ==> n -> Vfrom(A,i) \<subseteq> Vfrom(A,i)" |
705 apply (erule nat_fun_subset_Fin [THEN subset_trans]) |
705 apply (erule nat_fun_subset_Fin [THEN subset_trans]) |
706 apply (blast del: subsetI |
706 apply (blast del: subsetI |
707 intro: subset_refl Fin_subset_VLimit Sigma_subset_VLimit nat_subset_VLimit) |
707 intro: subset_refl Fin_subset_VLimit Sigma_subset_VLimit nat_subset_VLimit) |
708 done |
708 done |
709 |
709 |
710 lemmas nat_fun_subset_VLimit = subset_trans [OF Pi_mono nat_fun_VLimit] |
710 lemmas nat_fun_subset_VLimit = subset_trans [OF Pi_mono nat_fun_VLimit] |
711 |
711 |
712 lemma nat_fun_univ: "n: nat ==> n -> univ(A) <= univ(A)" |
712 lemma nat_fun_univ: "n: nat ==> n -> univ(A) \<subseteq> univ(A)" |
713 apply (unfold univ_def) |
713 apply (unfold univ_def) |
714 apply (erule nat_fun_VLimit [OF _ Limit_nat]) |
714 apply (erule nat_fun_VLimit [OF _ Limit_nat]) |
715 done |
715 done |
716 |
716 |
717 |
717 |
718 subsubsection{* Closure under Finite Function Space *} |
718 subsubsection{* Closure under Finite Function Space *} |
719 |
719 |
720 text{*General but seldom-used version; normally the domain is fixed*} |
720 text{*General but seldom-used version; normally the domain is fixed*} |
721 lemma FiniteFun_VLimit1: |
721 lemma FiniteFun_VLimit1: |
722 "Limit(i) ==> Vfrom(A,i) -||> Vfrom(A,i) <= Vfrom(A,i)" |
722 "Limit(i) ==> Vfrom(A,i) -||> Vfrom(A,i) \<subseteq> Vfrom(A,i)" |
723 apply (rule FiniteFun.dom_subset [THEN subset_trans]) |
723 apply (rule FiniteFun.dom_subset [THEN subset_trans]) |
724 apply (blast del: subsetI |
724 apply (blast del: subsetI |
725 intro: Fin_subset_VLimit Sigma_subset_VLimit subset_refl) |
725 intro: Fin_subset_VLimit Sigma_subset_VLimit subset_refl) |
726 done |
726 done |
727 |
727 |
728 lemma FiniteFun_univ1: "univ(A) -||> univ(A) <= univ(A)" |
728 lemma FiniteFun_univ1: "univ(A) -||> univ(A) \<subseteq> univ(A)" |
729 apply (unfold univ_def) |
729 apply (unfold univ_def) |
730 apply (rule Limit_nat [THEN FiniteFun_VLimit1]) |
730 apply (rule Limit_nat [THEN FiniteFun_VLimit1]) |
731 done |
731 done |
732 |
732 |
733 text{*Version for a fixed domain*} |
733 text{*Version for a fixed domain*} |
734 lemma FiniteFun_VLimit: |
734 lemma FiniteFun_VLimit: |
735 "[| W <= Vfrom(A,i); Limit(i) |] ==> W -||> Vfrom(A,i) <= Vfrom(A,i)" |
735 "[| W \<subseteq> Vfrom(A,i); Limit(i) |] ==> W -||> Vfrom(A,i) \<subseteq> Vfrom(A,i)" |
736 apply (rule subset_trans) |
736 apply (rule subset_trans) |
737 apply (erule FiniteFun_mono [OF _ subset_refl]) |
737 apply (erule FiniteFun_mono [OF _ subset_refl]) |
738 apply (erule FiniteFun_VLimit1) |
738 apply (erule FiniteFun_VLimit1) |
739 done |
739 done |
740 |
740 |
741 lemma FiniteFun_univ: |
741 lemma FiniteFun_univ: |
742 "W <= univ(A) ==> W -||> univ(A) <= univ(A)" |
742 "W \<subseteq> univ(A) ==> W -||> univ(A) \<subseteq> univ(A)" |
743 apply (unfold univ_def) |
743 apply (unfold univ_def) |
744 apply (erule FiniteFun_VLimit [OF _ Limit_nat]) |
744 apply (erule FiniteFun_VLimit [OF _ Limit_nat]) |
745 done |
745 done |
746 |
746 |
747 lemma FiniteFun_in_univ: |
747 lemma FiniteFun_in_univ: |
748 "[| f: W -||> univ(A); W <= univ(A) |] ==> f \<in> univ(A)" |
748 "[| f: W -||> univ(A); W \<subseteq> univ(A) |] ==> f \<in> univ(A)" |
749 by (erule FiniteFun_univ [THEN subsetD], assumption) |
749 by (erule FiniteFun_univ [THEN subsetD], assumption) |
750 |
750 |
751 text{*Remove <= from the rule above*} |
751 text{*Remove @{text "\<subseteq>"} from the rule above*} |
752 lemmas FiniteFun_in_univ' = FiniteFun_in_univ [OF _ subsetI] |
752 lemmas FiniteFun_in_univ' = FiniteFun_in_univ [OF _ subsetI] |
753 |
753 |
754 |
754 |
755 subsection{** For QUniv. Properties of Vfrom analogous to the "take-lemma" **} |
755 subsection{** For QUniv. Properties of Vfrom analogous to the "take-lemma" **} |
756 |
756 |
758 |
758 |
759 text{*This version says a, b exist one level down, in the smaller set Vfrom(X,i)*} |
759 text{*This version says a, b exist one level down, in the smaller set Vfrom(X,i)*} |
760 lemma doubleton_in_Vfrom_D: |
760 lemma doubleton_in_Vfrom_D: |
761 "[| {a,b} \<in> Vfrom(X,succ(i)); Transset(X) |] |
761 "[| {a,b} \<in> Vfrom(X,succ(i)); Transset(X) |] |
762 ==> a \<in> Vfrom(X,i) & b \<in> Vfrom(X,i)" |
762 ==> a \<in> Vfrom(X,i) & b \<in> Vfrom(X,i)" |
763 by (drule Transset_Vfrom_succ [THEN equalityD1, THEN subsetD, THEN PowD], |
763 by (drule Transset_Vfrom_succ [THEN equalityD1, THEN subsetD, THEN PowD], |
764 assumption, fast) |
764 assumption, fast) |
765 |
765 |
766 text{*This weaker version says a, b exist at the same level*} |
766 text{*This weaker version says a, b exist at the same level*} |
767 lemmas Vfrom_doubleton_D = Transset_Vfrom [THEN Transset_doubleton_D] |
767 lemmas Vfrom_doubleton_D = Transset_Vfrom [THEN Transset_doubleton_D] |
768 |
768 |
769 (** Using only the weaker theorem would prove <a,b> \<in> Vfrom(X,i) |
769 (** Using only the weaker theorem would prove <a,b> : Vfrom(X,i) |
770 implies a, b \<in> Vfrom(X,i), which is useless for induction. |
770 implies a, b : Vfrom(X,i), which is useless for induction. |
771 Using only the stronger theorem would prove <a,b> \<in> Vfrom(X,succ(succ(i))) |
771 Using only the stronger theorem would prove <a,b> : Vfrom(X,succ(succ(i))) |
772 implies a, b \<in> Vfrom(X,i), leaving the succ(i) case untreated. |
772 implies a, b : Vfrom(X,i), leaving the succ(i) case untreated. |
773 The combination gives a reduction by precisely one level, which is |
773 The combination gives a reduction by precisely one level, which is |
774 most convenient for proofs. |
774 most convenient for proofs. |
775 **) |
775 **) |
776 |
776 |
777 lemma Pair_in_Vfrom_D: |
777 lemma Pair_in_Vfrom_D: |