1 (* Title: ZF/AC/DC.thy |
1 (* Title: ZF/AC/DC.thy |
2 ID: $Id$ |
2 ID: $Id$ |
3 Author: Krzysztof Grabczewski |
3 Author: Krzysztof Grabczewski |
4 |
4 |
5 Theory file for the proofs concernind the Axiom of Dependent Choice |
5 The proofs concerning the Axiom of Dependent Choice |
6 *) |
6 *) |
7 |
7 |
8 DC = AC_Equiv + Hartog + Cardinal_aux + DC_lemmas + |
8 theory DC = AC_Equiv + Hartog + Cardinal_aux: |
9 |
9 |
10 consts |
10 lemma RepFun_lepoll: "Ord(a) ==> {P(b). b \<in> a} \<lesssim> a" |
11 |
11 apply (unfold lepoll_def) |
12 DC :: i => o |
12 apply (rule_tac x = "\<lambda>z \<in> RepFun (a,P) . LEAST i. z=P (i) " in exI) |
|
13 apply (rule_tac d="%z. P (z)" in lam_injective) |
|
14 apply (fast intro!: Least_in_Ord) |
|
15 apply (rule sym) |
|
16 apply (fast intro: LeastI Ord_in_Ord) |
|
17 done |
|
18 |
|
19 text{*Trivial in the presence of AC, but here we need a wellordering of X*} |
|
20 lemma image_Ord_lepoll: "[| f \<in> X->Y; Ord(X) |] ==> f``X \<lesssim> X" |
|
21 apply (unfold lepoll_def) |
|
22 apply (rule_tac x = "\<lambda>x \<in> f``X. LEAST y. f`y = x" in exI) |
|
23 apply (rule_tac d = "%z. f`z" in lam_injective) |
|
24 apply (fast intro!: Least_in_Ord apply_equality, clarify) |
|
25 apply (rule LeastI) |
|
26 apply (erule apply_equality, assumption+) |
|
27 apply (blast intro: Ord_in_Ord) |
|
28 done |
|
29 |
|
30 lemma range_subset_domain: |
|
31 "[| R \<subseteq> X*X; !!g. g \<in> X ==> \<exists>u. <g,u> \<in> R |] |
|
32 ==> range(R) \<subseteq> domain(R)" |
|
33 by (blast ); |
|
34 |
|
35 lemma cons_fun_type: "g \<in> n->X ==> cons(<n,x>, g) \<in> succ(n) -> cons(x, X)" |
|
36 apply (unfold succ_def) |
|
37 apply (fast intro!: fun_extend elim!: mem_irrefl) |
|
38 done |
|
39 |
|
40 lemma cons_fun_type2: |
|
41 "[| g \<in> n->X; x \<in> X |] ==> cons(<n,x>, g) \<in> succ(n) -> X" |
|
42 by (erule cons_absorb [THEN subst], erule cons_fun_type) |
|
43 |
|
44 lemma cons_image_n: "n \<in> nat ==> cons(<n,x>, g)``n = g``n" |
|
45 by (fast elim!: mem_irrefl) |
|
46 |
|
47 lemma cons_val_n: "g \<in> n->X ==> cons(<n,x>, g)`n = x" |
|
48 by (fast intro!: apply_equality elim!: cons_fun_type) |
|
49 |
|
50 lemma cons_image_k: "k \<in> n ==> cons(<n,x>, g)``k = g``k" |
|
51 by (fast elim: mem_asym) |
|
52 |
|
53 lemma cons_val_k: "[| k \<in> n; g \<in> n->X |] ==> cons(<n,x>, g)`k = g`k" |
|
54 by (fast intro!: apply_equality consI2 elim!: cons_fun_type apply_Pair) |
|
55 |
|
56 lemma domain_cons_eq_succ: "domain(f)=x ==> domain(cons(<x,y>, f)) = succ(x)" |
|
57 by (simp add: domain_cons succ_def) |
|
58 |
|
59 lemma restrict_cons_eq: "g \<in> n->X ==> restrict(cons(<n,x>, g), n) = g" |
|
60 apply (unfold restrict_def) |
|
61 apply (rule fun_extension) |
|
62 apply (rule lam_type) |
|
63 apply (erule cons_fun_type [THEN apply_type]) |
|
64 apply (erule succI2, assumption) |
|
65 apply (simp add: cons_val_k) |
|
66 done |
|
67 |
|
68 lemma succ_in_succ: "[| Ord(k); i \<in> k |] ==> succ(i) \<in> succ(k)" |
|
69 apply (rule Ord_linear [of "succ(i)" "succ(k)", THEN disjE]) |
|
70 apply (fast elim: Ord_in_Ord mem_irrefl mem_asym)+ |
|
71 done |
|
72 |
|
73 lemma restrict_eq_imp_val_eq: |
|
74 "[| restrict(f, domain(g)) = g; x \<in> domain(g) |] ==> f`x = g`x" |
|
75 apply (unfold restrict_def) |
|
76 apply (erule subst, simp) |
|
77 done |
|
78 |
|
79 lemma domain_eq_imp_fun_type: "[| domain(f)=A; f \<in> B->C |] ==> f \<in> A->C" |
|
80 by (frule domain_of_fun, fast) |
|
81 |
|
82 lemma ex_in_domain: "[| R \<subseteq> A * B; R \<noteq> 0 |] ==> \<exists>x. x \<in> domain(R)" |
|
83 by (fast elim!: not_emptyE) |
|
84 |
|
85 |
|
86 constdefs |
|
87 |
|
88 DC :: "i => o" |
|
89 "DC(a) == \<forall>X R. R \<subseteq> Pow(X)*X & |
|
90 (\<forall>Y \<in> Pow(X). Y \<prec> a --> (\<exists>x \<in> X. <Y,x> \<in> R)) |
|
91 --> (\<exists>f \<in> a->X. \<forall>b<a. <f``b,f`b> \<in> R)" |
|
92 |
13 DC0 :: o |
93 DC0 :: o |
14 ff :: [i, i, i, i] => i |
94 "DC0 == \<forall>A B R. R \<subseteq> A*B & R\<noteq>0 & range(R) \<subseteq> domain(R) |
15 |
95 --> (\<exists>f \<in> nat->domain(R). \<forall>n \<in> nat. <f`n,f`succ(n)>:R)" |
16 rules |
96 |
17 |
97 ff :: "[i, i, i, i] => i" |
18 DC_def "DC(a) == |
98 "ff(b, X, Q, R) == |
19 \\<forall>X R. R \\<subseteq> Pow(X)*X & |
99 transrec(b, %c r. THE x. first(x, {x \<in> X. <r``c, x> \<in> R}, Q))" |
20 (\\<forall>Y \\<in> Pow(X). Y lesspoll a --> (\\<exists>x \\<in> X. <Y,x> \\<in> R)) |
100 |
21 --> (\\<exists>f \\<in> a->X. \\<forall>b<a. <f``b,f`b> \\<in> R)" |
|
22 |
|
23 DC0_def "DC0 == \\<forall>A B R. R \\<subseteq> A*B & R\\<noteq>0 & range(R) \\<subseteq> domain(R) |
|
24 --> (\\<exists>f \\<in> nat->domain(R). \\<forall>n \\<in> nat. <f`n,f`succ(n)>:R)" |
|
25 |
|
26 ff_def "ff(b, X, Q, R) == |
|
27 transrec(b, %c r. THE x. first(x, {x \\<in> X. <r``c, x> \\<in> R}, Q))" |
|
28 |
|
29 |
101 |
30 locale DC0_imp = |
102 locale DC0_imp = |
31 fixes |
103 fixes XX and RR and X and R |
32 XX :: i |
104 |
33 RR :: i |
105 assumes all_ex: "\<forall>Y \<in> Pow(X). Y \<prec> nat --> (\<exists>x \<in> X. <Y, x> \<in> R)" |
34 X :: i |
106 |
35 R :: i |
107 defines XX_def: "XX == (\<Union>n \<in> nat. {f \<in> n->X. \<forall>k \<in> n. <f``k, f`k> \<in> R})" |
36 |
108 and RR_def: "RR == {<z1,z2>:XX*XX. domain(z2)=succ(domain(z1)) |
37 assumes |
109 & restrict(z2, domain(z1)) = z1}" |
38 all_ex "\\<forall>Y \\<in> Pow(X). Y lesspoll nat --> (\\<exists>x \\<in> X. <Y, x> \\<in> R)" |
110 |
39 |
111 |
40 defines |
112 (* ********************************************************************** *) |
41 XX_def "XX == (\\<Union>n \\<in> nat. {f \\<in> n->X. \\<forall>k \\<in> n. <f``k, f`k> \\<in> R})" |
113 (* DC ==> DC(omega) *) |
42 RR_def "RR == {<z1,z2>:XX*XX. domain(z2)=succ(domain(z1)) |
114 (* *) |
43 & restrict(z2, domain(z1)) = z1}" |
115 (* The scheme of the proof: *) |
|
116 (* *) |
|
117 (* Assume DC. Let R and X satisfy the premise of DC(omega). *) |
|
118 (* *) |
|
119 (* Define XX and RR as follows: *) |
|
120 (* *) |
|
121 (* XX = (\<Union>n \<in> nat. {f \<in> n->X. \<forall>k \<in> n. <f``k, f`k> \<in> R}) *) |
|
122 (* f RR g iff domain(g)=succ(domain(f)) & *) |
|
123 (* restrict(g, domain(f)) = f *) |
|
124 (* *) |
|
125 (* Then RR satisfies the hypotheses of DC. *) |
|
126 (* So applying DC: *) |
|
127 (* *) |
|
128 (* \<exists>f \<in> nat->XX. \<forall>n \<in> nat. f`n RR f`succ(n) *) |
|
129 (* *) |
|
130 (* Thence *) |
|
131 (* *) |
|
132 (* ff = {<n, f`succ(n)`n>. n \<in> nat} *) |
|
133 (* *) |
|
134 (* is the desired function. *) |
|
135 (* *) |
|
136 (* ********************************************************************** *) |
|
137 |
|
138 lemma (in DC0_imp) lemma1_1: "RR \<subseteq> XX*XX" |
|
139 by (unfold RR_def, fast) |
|
140 |
|
141 lemma (in DC0_imp) lemma1_2: "RR \<noteq> 0" |
|
142 apply (unfold RR_def XX_def) |
|
143 apply (rule all_ex [THEN ballE]) |
|
144 apply (erule_tac [2] notE [OF _ empty_subsetI [THEN PowI]]) |
|
145 apply (erule_tac impE [OF _ nat_0I [THEN n_lesspoll_nat]]) |
|
146 apply (erule bexE) |
|
147 apply (rule_tac a = "<0, {<0, x>}>" in not_emptyI) |
|
148 apply (rule CollectI) |
|
149 apply (rule SigmaI) |
|
150 apply (rule nat_0I [THEN UN_I]) |
|
151 apply (simp (no_asm_simp) add: nat_0I [THEN UN_I]) |
|
152 apply (rule nat_1I [THEN UN_I]) |
|
153 apply (force intro!: singleton_fun [THEN Pi_type] |
|
154 simp add: singleton_0 [symmetric]) |
|
155 apply (simp add: singleton_0) |
|
156 done |
|
157 |
|
158 lemma (in DC0_imp) lemma1_3: "range(RR) \<subseteq> domain(RR)" |
|
159 apply (unfold RR_def XX_def) |
|
160 apply (rule range_subset_domain, blast, clarify) |
|
161 apply (frule fun_is_rel [THEN image_subset, THEN PowI, |
|
162 THEN all_ex [THEN bspec]]) |
|
163 apply (erule impE[OF _ lesspoll_trans1[OF image_Ord_lepoll |
|
164 [OF _ nat_into_Ord] n_lesspoll_nat]], |
|
165 assumption+) |
|
166 apply (erule bexE) |
|
167 apply (rule_tac x = "cons (<n,x>, g) " in exI) |
|
168 apply (rule CollectI) |
|
169 apply (force elim!: cons_fun_type2 |
|
170 simp add: cons_image_n cons_val_n cons_image_k cons_val_k) |
|
171 apply (simp add: domain_of_fun succ_def restrict_cons_eq) |
|
172 done |
|
173 |
|
174 lemma (in DC0_imp) lemma2: |
|
175 "[| \<forall>n \<in> nat. <f`n, f`succ(n)> \<in> RR; f \<in> nat -> XX; n \<in> nat |] |
|
176 ==> \<exists>k \<in> nat. f`succ(n) \<in> k -> X & n \<in> k |
|
177 & <f`succ(n)``n, f`succ(n)`n> \<in> R" |
|
178 apply (induct_tac "n") |
|
179 apply (drule apply_type [OF _ nat_1I]) |
|
180 apply (drule bspec [OF _ nat_0I]) |
|
181 apply (simp add: XX_def, safe) |
|
182 apply (rule rev_bexI, assumption) |
|
183 apply (subgoal_tac "0 \<in> x", force) |
|
184 apply (force simp add: RR_def |
|
185 intro: ltD elim!: nat_0_le [THEN leE]) |
|
186 (** LEVEL 7, other subgoal **) |
|
187 apply (drule bspec [OF _ nat_succI], assumption) |
|
188 apply (subgoal_tac "f ` succ (succ (x)) \<in> succ (k) ->X") |
|
189 apply (drule apply_type [OF _ nat_succI [THEN nat_succI]], assumption) |
|
190 apply (simp (no_asm_use) add: XX_def RR_def) |
|
191 apply safe |
|
192 apply (frule_tac a="succ(k)" in domain_of_fun [symmetric, THEN trans], |
|
193 assumption) |
|
194 apply (frule_tac a="xa" in domain_of_fun [symmetric, THEN trans], |
|
195 assumption) |
|
196 apply (fast elim!: nat_into_Ord [THEN succ_in_succ] |
|
197 dest!: bspec [OF _ nat_into_Ord [THEN succ_in_succ]]) |
|
198 apply (drule domain_of_fun) |
|
199 apply (simp add: XX_def RR_def, clarify) |
|
200 apply (blast dest: domain_of_fun [symmetric, THEN trans] ) |
|
201 done |
|
202 |
|
203 lemma (in DC0_imp) lemma3_1: |
|
204 "[| \<forall>n \<in> nat. <f`n, f`succ(n)> \<in> RR; f \<in> nat -> XX; m \<in> nat |] |
|
205 ==> {f`succ(x)`x. x \<in> m} = {f`succ(m)`x. x \<in> m}" |
|
206 apply (subgoal_tac "\<forall>x \<in> m. f`succ (m) `x = f`succ (x) `x") |
|
207 apply simp |
|
208 apply (induct_tac "m", blast) |
|
209 apply (rule ballI) |
|
210 apply (erule succE) |
|
211 apply (rule restrict_eq_imp_val_eq) |
|
212 apply (drule bspec [OF _ nat_succI], assumption) |
|
213 apply (simp add: RR_def) |
|
214 apply (drule lemma2, assumption+) |
|
215 apply (fast dest!: domain_of_fun) |
|
216 apply (drule_tac x = "xa" in bspec, assumption) |
|
217 apply (erule sym [THEN trans, symmetric]) |
|
218 apply (rule restrict_eq_imp_val_eq [symmetric]) |
|
219 apply (drule bspec [OF _ nat_succI], assumption) |
|
220 apply (simp add: RR_def) |
|
221 apply (drule lemma2, assumption+) |
|
222 apply (blast dest!: domain_of_fun |
|
223 intro: nat_into_Ord OrdmemD [THEN subsetD]) |
|
224 done |
|
225 |
|
226 lemma (in DC0_imp) lemma3: |
|
227 "[| \<forall>n \<in> nat. <f`n, f`succ(n)> \<in> RR; f \<in> nat -> XX; m \<in> nat |] |
|
228 ==> (\<lambda>x \<in> nat. f`succ(x)`x) `` m = f`succ(m)``m" |
|
229 apply (erule natE, simp) |
|
230 apply (subst image_lam) |
|
231 apply (fast elim!: OrdmemD [OF nat_succI Ord_nat]) |
|
232 apply (subst lemma3_1, assumption+) |
|
233 apply fast |
|
234 apply (fast dest!: lemma2 |
|
235 elim!: image_fun [symmetric, OF _ OrdmemD [OF _ nat_into_Ord]]) |
|
236 done |
|
237 |
|
238 |
|
239 theorem DC0_imp_DC_nat: "DC0 ==> DC(nat)" |
|
240 apply (unfold DC_def DC0_def, clarify) |
|
241 apply (elim allE) |
|
242 apply (erule impE) |
|
243 (*these three results comprise Lemma 1*) |
|
244 apply (blast intro!: DC0_imp.lemma1_1 DC0_imp.lemma1_2 DC0_imp.lemma1_3) |
|
245 apply (erule bexE) |
|
246 apply (rule_tac x = "\<lambda>n \<in> nat. f`succ (n) `n" in rev_bexI) |
|
247 apply (rule lam_type, blast dest!: DC0_imp.lemma2 intro: fun_weaken_type) |
|
248 apply (rule oallI) |
|
249 apply (frule DC0_imp.lemma2, assumption) |
|
250 apply (blast intro: fun_weaken_type) |
|
251 apply (erule ltD) |
|
252 (** LEVEL 11: last subgoal **) |
|
253 apply (subst DC0_imp.lemma3, assumption+) |
|
254 apply (fast elim!: fun_weaken_type) |
|
255 apply (erule ltD, force) |
|
256 done |
|
257 |
|
258 |
|
259 (* ************************************************************************ |
|
260 DC(omega) ==> DC |
|
261 |
|
262 The scheme of the proof: |
|
263 |
|
264 Assume DC(omega). Let R and x satisfy the premise of DC. |
|
265 |
|
266 Define XX and RR as follows: |
|
267 |
|
268 XX = (\<Union>n \<in> nat. {f \<in> succ(n)->domain(R). \<forall>k \<in> n. <f`k, f`succ(k)> \<in> R}) |
|
269 |
|
270 RR = {<z1,z2>:Fin(XX)*XX. |
|
271 (domain(z2)=succ(\<Union>f \<in> z1. domain(f)) & |
|
272 (\<forall>f \<in> z1. restrict(z2, domain(f)) = f)) | |
|
273 (~ (\<exists>g \<in> XX. domain(g)=succ(\<Union>f \<in> z1. domain(f)) & |
|
274 (\<forall>f \<in> z1. restrict(g, domain(f)) = f)) & |
|
275 z2={<0,x>})} |
|
276 |
|
277 Then XX and RR satisfy the hypotheses of DC(omega). |
|
278 So applying DC: |
|
279 |
|
280 \<exists>f \<in> nat->XX. \<forall>n \<in> nat. f``n RR f`n |
|
281 |
|
282 Thence |
|
283 |
|
284 ff = {<n, f`n`n>. n \<in> nat} |
|
285 |
|
286 is the desired function. |
|
287 |
|
288 ************************************************************************* *) |
|
289 |
|
290 lemma singleton_in_funs: |
|
291 "x \<in> X ==> {<0,x>} \<in> |
|
292 (\<Union>n \<in> nat. {f \<in> succ(n)->X. \<forall>k \<in> n. <f`k, f`succ(k)> \<in> R})" |
|
293 apply (rule nat_0I [THEN UN_I]) |
|
294 apply (force simp add: singleton_0 [symmetric] |
|
295 intro!: singleton_fun [THEN Pi_type]) |
|
296 done |
44 |
297 |
45 |
298 |
46 locale imp_DC0 = |
299 locale imp_DC0 = |
47 fixes |
300 fixes XX and RR and x and R and f and allRR |
48 XX :: i |
301 defines XX_def: "XX == (\<Union>n \<in> nat. |
49 RR :: i |
302 {f \<in> succ(n)->domain(R). \<forall>k \<in> n. <f`k, f`succ(k)> \<in> R})" |
50 x :: i |
303 and RR_def: |
51 R :: i |
304 "RR == {<z1,z2>:Fin(XX)*XX. |
52 f :: i |
305 (domain(z2)=succ(\<Union>f \<in> z1. domain(f)) |
53 allRR :: o |
306 & (\<forall>f \<in> z1. restrict(z2, domain(f)) = f)) |
54 |
307 | (~ (\<exists>g \<in> XX. domain(g)=succ(\<Union>f \<in> z1. domain(f)) |
55 defines |
308 & (\<forall>f \<in> z1. restrict(g, domain(f)) = f)) & z2={<0,x>})}" |
56 XX_def "XX == (\\<Union>n \\<in> nat. |
309 and allRR_def: |
57 {f \\<in> succ(n)->domain(R). \\<forall>k \\<in> n. <f`k, f`succ(k)> \\<in> R})" |
310 "allRR == \<forall>b<nat. |
58 RR_def |
311 <f``b, f`b> \<in> |
59 "RR == {<z1,z2>:Fin(XX)*XX. |
312 {<z1,z2>\<in>Fin(XX)*XX. (domain(z2)=succ(\<Union>f \<in> z1. domain(f)) |
60 (domain(z2)=succ(\\<Union>f \\<in> z1. domain(f)) |
313 & (\<Union>f \<in> z1. domain(f)) = b |
61 & (\\<forall>f \\<in> z1. restrict(z2, domain(f)) = f)) |
314 & (\<forall>f \<in> z1. restrict(z2,domain(f)) = f))}" |
62 | (~ (\\<exists>g \\<in> XX. domain(g)=succ(\\<Union>f \\<in> z1. domain(f)) |
315 |
63 & (\\<forall>f \\<in> z1. restrict(g, domain(f)) = f)) & z2={<0,x>})}" |
316 lemma (in imp_DC0) lemma4: |
64 allRR_def |
317 "[| range(R) \<subseteq> domain(R); x \<in> domain(R) |] |
65 "allRR == \\<forall>b<nat. |
318 ==> RR \<subseteq> Pow(XX)*XX & |
66 <f``b, f`b> \\<in> |
319 (\<forall>Y \<in> Pow(XX). Y \<prec> nat --> (\<exists>x \<in> XX. <Y,x>:RR))" |
67 {<z1,z2>:Fin(XX)*XX. (domain(z2)=succ(\\<Union>f \\<in> z1. domain(f)) |
320 apply (rule conjI) |
68 & (\\<Union>f \\<in> z1. domain(f)) = b |
321 apply (force dest!: FinD [THEN PowI] simp add: RR_def) |
69 & (\\<forall>f \\<in> z1. restrict(z2,domain(f)) = f))}" |
322 apply (rule impI [THEN ballI]) |
|
323 apply (drule Finite_Fin [OF lesspoll_nat_is_Finite PowD], assumption) |
|
324 apply (case_tac |
|
325 "\<exists>g \<in> XX. domain (g) = |
|
326 succ(\<Union>f \<in> Y. domain(f)) & (\<forall>f\<in>Y. restrict(g, domain(f)) = f)") |
|
327 apply (simp add: RR_def, blast) |
|
328 apply (safe del: domainE) |
|
329 apply (unfold XX_def RR_def) |
|
330 apply (rule rev_bexI, erule singleton_in_funs) |
|
331 apply (simp add: nat_0I [THEN rev_bexI] cons_fun_type2) |
|
332 done |
|
333 |
|
334 lemma (in imp_DC0) UN_image_succ_eq: |
|
335 "[| f \<in> nat->X; n \<in> nat |] |
|
336 ==> (\<Union>x \<in> f``succ(n). P(x)) = P(f`n) Un (\<Union>x \<in> f``n. P(x))" |
|
337 by (simp add: image_fun OrdmemD) |
|
338 |
|
339 lemma (in imp_DC0) UN_image_succ_eq_succ: |
|
340 "[| (\<Union>x \<in> f``n. P(x)) = y; P(f`n) = succ(y); |
|
341 f \<in> nat -> X; n \<in> nat |] ==> (\<Union>x \<in> f``succ(n). P(x)) = succ(y)" |
|
342 by (simp add: UN_image_succ_eq, blast) |
|
343 |
|
344 lemma (in imp_DC0) apply_domain_type: |
|
345 "[| h \<in> succ(n) -> D; n \<in> nat; domain(h)=succ(y) |] ==> h`y \<in> D" |
|
346 by (fast elim: apply_type dest!: trans [OF sym domain_of_fun]) |
|
347 |
|
348 lemma (in imp_DC0) image_fun_succ: |
|
349 "[| h \<in> nat -> X; n \<in> nat |] ==> h``succ(n) = cons(h`n, h``n)" |
|
350 by (simp add: image_fun OrdmemD) |
|
351 |
|
352 lemma (in imp_DC0) f_n_type: |
|
353 "[| domain(f`n) = succ(k); f \<in> nat -> XX; n \<in> nat |] |
|
354 ==> f`n \<in> succ(k) -> domain(R)" |
|
355 apply (unfold XX_def) |
|
356 apply (drule apply_type, assumption) |
|
357 apply (fast elim: domain_eq_imp_fun_type) |
|
358 done |
|
359 |
|
360 lemma (in imp_DC0) f_n_pairs_in_R [rule_format]: |
|
361 "[| h \<in> nat -> XX; domain(h`n) = succ(k); n \<in> nat |] |
|
362 ==> \<forall>i \<in> k. <h`n`i, h`n`succ(i)> \<in> R" |
|
363 apply (unfold XX_def) |
|
364 apply (drule apply_type, assumption) |
|
365 apply (elim UN_E CollectE) |
|
366 apply (drule domain_of_fun [symmetric, THEN trans], assumption) |
|
367 apply simp |
|
368 done |
|
369 |
|
370 lemma (in imp_DC0) restrict_cons_eq_restrict: |
|
371 "[| restrict(h, domain(u))=u; h \<in> n->X; domain(u) \<subseteq> n |] |
|
372 ==> restrict(cons(<n, y>, h), domain(u)) = u" |
|
373 apply (unfold restrict_def) |
|
374 apply (erule sym [THEN trans, symmetric]) |
|
375 apply (rule fun_extension) |
|
376 apply (fast intro!: lam_type) |
|
377 apply (fast intro!: lam_type) |
|
378 apply (simp add: subsetD [THEN cons_val_k]) |
|
379 done |
|
380 |
|
381 lemma (in imp_DC0) all_in_image_restrict_eq: |
|
382 "[| \<forall>x \<in> f``n. restrict(f`n, domain(x))=x; |
|
383 f \<in> nat -> XX; |
|
384 n \<in> nat; domain(f`n) = succ(n); |
|
385 (\<Union>x \<in> f``n. domain(x)) \<subseteq> n |] |
|
386 ==> \<forall>x \<in> f``succ(n). restrict(cons(<succ(n),y>, f`n), domain(x)) = x" |
|
387 apply (rule ballI) |
|
388 apply (simp add: image_fun_succ) |
|
389 apply (drule f_n_type, assumption+) |
|
390 apply (erule disjE) |
|
391 apply (simp add: domain_of_fun restrict_cons_eq) |
|
392 apply (blast intro!: restrict_cons_eq_restrict) |
|
393 done |
|
394 |
|
395 lemma (in imp_DC0) simplify_recursion: |
|
396 "[| \<forall>b<nat. <f``b, f`b> \<in> RR; |
|
397 f \<in> nat -> XX; range(R) \<subseteq> domain(R); x \<in> domain(R)|] |
|
398 ==> allRR" |
|
399 apply (unfold RR_def allRR_def) |
|
400 apply (rule oallI, drule ltD) |
|
401 apply (erule nat_induct) |
|
402 apply (drule_tac x="0" in ospec, blast intro: Limit_has_0) |
|
403 apply (force simp add: singleton_fun [THEN domain_of_fun] singleton_in_funs) |
|
404 (*induction step*) (** LEVEL 5 **) |
|
405 (*prevent simplification of ~\<exists> to \<forall>~ *) |
|
406 apply (simp only: separation split) |
|
407 apply (drule_tac x="succ(xa)" in ospec, blast intro: ltI); |
|
408 apply (elim conjE disjE) |
|
409 apply (force elim!: trans subst_context |
|
410 intro!: UN_image_succ_eq_succ) |
|
411 apply (erule notE) |
|
412 apply (simp add: XX_def UN_image_succ_eq_succ) |
|
413 apply (elim conjE bexE) |
|
414 apply (drule apply_domain_type, assumption+) |
|
415 apply (erule domainE)+ |
|
416 apply (frule f_n_type) |
|
417 apply (simp add: XX_def, assumption+) |
|
418 apply (rule rev_bexI, erule nat_succI) |
|
419 apply (rule_tac x = "cons (<succ (xa), ya>, f`xa) " in bexI) |
|
420 prefer 2 apply (blast intro: cons_fun_type2) |
|
421 apply (rule conjI) |
|
422 prefer 2 apply (fast del: ballI subsetI |
|
423 elim: trans [OF _ subst_context, THEN domain_cons_eq_succ] |
|
424 subst_context |
|
425 all_in_image_restrict_eq [simplified XX_def] |
|
426 trans equalityD1) |
|
427 (*one remaining subgoal*) |
|
428 apply (rule ballI) |
|
429 apply (erule succE) |
|
430 (** LEVEL 25 **) |
|
431 apply (simp add: cons_val_n cons_val_k) |
|
432 (*assumption+ will not perform the required backtracking!*) |
|
433 apply (drule f_n_pairs_in_R [simplified XX_def, OF _ domain_of_fun], |
|
434 assumption, assumption, assumption) |
|
435 apply (simp add: nat_into_Ord [THEN succ_in_succ] succI2 cons_val_k) |
|
436 done |
|
437 |
|
438 |
|
439 lemma (in imp_DC0) lemma2: |
|
440 "[| allRR; f \<in> nat->XX; range(R) \<subseteq> domain(R); x \<in> domain(R); n \<in> nat |] |
|
441 ==> f`n \<in> succ(n) -> domain(R) & (\<forall>i \<in> n. <f`n`i, f`n`succ(i)>:R)" |
|
442 apply (unfold allRR_def) |
|
443 apply (drule ospec) |
|
444 apply (erule ltI [OF _ Ord_nat]) |
|
445 apply (erule CollectE, simp) |
|
446 apply (rule conjI) |
|
447 prefer 2 apply (fast elim!: f_n_pairs_in_R trans subst_context) |
|
448 apply (unfold XX_def) |
|
449 apply (fast elim!: trans [THEN domain_eq_imp_fun_type] subst_context) |
|
450 done |
|
451 |
|
452 lemma (in imp_DC0) lemma3: |
|
453 "[| allRR; f \<in> nat->XX; n\<in>nat; range(R) \<subseteq> domain(R); x \<in> domain(R) |] |
|
454 ==> f`n`n = f`succ(n)`n" |
|
455 apply (frule lemma2 [THEN conjunct1, THEN domain_of_fun], assumption+) |
|
456 apply (unfold allRR_def) |
|
457 apply (drule ospec) |
|
458 apply (drule ltI [OF nat_succI Ord_nat], assumption) |
|
459 apply simp |
|
460 apply (elim conjE ballE) |
|
461 apply (erule restrict_eq_imp_val_eq [symmetric], force) |
|
462 apply (simp add: image_fun OrdmemD) |
|
463 done |
|
464 |
|
465 |
|
466 theorem DC_nat_imp_DC0: "DC(nat) ==> DC0" |
|
467 apply (unfold DC_def DC0_def) |
|
468 apply (intro allI impI) |
|
469 apply (erule asm_rl conjE ex_in_domain [THEN exE] allE)+ |
|
470 apply (erule impE [OF _ imp_DC0.lemma4], assumption+) |
|
471 apply (erule bexE) |
|
472 apply (drule imp_DC0.simplify_recursion, assumption+) |
|
473 apply (rule_tac x = "\<lambda>n \<in> nat. f`n`n" in bexI) |
|
474 apply (rule_tac [2] lam_type) |
|
475 apply (erule_tac [2] apply_type [OF imp_DC0.lemma2 [THEN conjunct1] succI1]) |
|
476 apply (rule ballI) |
|
477 apply (frule_tac n="succ(n)" in imp_DC0.lemma2, |
|
478 (assumption|erule nat_succI)+) |
|
479 apply (drule imp_DC0.lemma3, auto) |
|
480 done |
|
481 |
|
482 (* ********************************************************************** *) |
|
483 (* \<forall>K. Card(K) --> DC(K) ==> WO3 *) |
|
484 (* ********************************************************************** *) |
|
485 |
|
486 lemma fun_Ord_inj: |
|
487 "[| f \<in> a->X; Ord(a); |
|
488 !!b c. [| b<c; c \<in> a |] ==> f`b\<noteq>f`c |] |
|
489 ==> f \<in> inj(a, X)" |
|
490 apply (unfold inj_def, simp) |
|
491 apply (intro ballI impI) |
|
492 apply (rule_tac j=x in Ord_in_Ord [THEN Ord_linear_lt], assumption+) |
|
493 apply (blast intro: Ord_in_Ord, auto) |
|
494 apply (atomize, blast dest: not_sym) |
|
495 done |
|
496 |
|
497 lemma value_in_image: "[| f \<in> X->Y; A \<subseteq> X; a \<in> A |] ==> f`a \<in> f``A" |
|
498 by (fast elim!: image_fun [THEN ssubst]); |
|
499 |
|
500 theorem DC_WO3: "(\<forall>K. Card(K) --> DC(K)) ==> WO3" |
|
501 apply (unfold DC_def WO3_def) |
|
502 apply (rule allI) |
|
503 apply (case_tac "A \<prec> Hartog (A)"); |
|
504 apply (fast dest!: lesspoll_imp_ex_lt_eqpoll |
|
505 intro!: Ord_Hartog leI [THEN le_imp_subset]) |
|
506 apply (erule allE impE)+ |
|
507 apply (rule Card_Hartog) |
|
508 apply (erule_tac x = "A" in allE) |
|
509 apply (erule_tac x = "{<z1,z2> \<in> Pow (A) *A . z1 \<prec> Hartog (A) & z2 \<notin> z1}" |
|
510 in allE) |
|
511 apply simp |
|
512 apply (erule impE, fast elim: lesspoll_lemma [THEN not_emptyE]) |
|
513 apply (erule bexE) |
|
514 apply (rule Hartog_lepoll_selfE) |
|
515 apply (rule lepoll_def [THEN def_imp_iff, THEN iffD2]) |
|
516 apply (rule exI, rule fun_Ord_inj, assumption, rule Ord_Hartog) |
|
517 apply (drule value_in_image) |
|
518 apply (drule OrdmemD, rule Ord_Hartog, assumption+, erule ltD) |
|
519 apply (drule ospec) |
|
520 apply (blast intro: ltI Ord_Hartog, force) |
|
521 done |
|
522 |
|
523 (* ********************************************************************** *) |
|
524 (* WO1 ==> \<forall>K. Card(K) --> DC(K) *) |
|
525 (* ********************************************************************** *) |
|
526 |
|
527 lemma images_eq: |
|
528 "[| \<forall>x \<in> A. f`x=g`x; f \<in> Df->Cf; g \<in> Dg->Cg; A \<subseteq> Df; A \<subseteq> Dg |] |
|
529 ==> f``A = g``A" |
|
530 apply (simp (no_asm_simp) add: image_fun) |
|
531 done |
|
532 |
|
533 lemma lam_images_eq: |
|
534 "[| Ord(a); b \<in> a |] ==> (\<lambda>x \<in> a. h(x))``b = (\<lambda>x \<in> b. h(x))``b" |
|
535 apply (rule images_eq) |
|
536 apply (rule ballI) |
|
537 apply (drule OrdmemD [THEN subsetD], assumption+) |
|
538 apply simp |
|
539 apply (fast elim!: RepFunI OrdmemD intro!: lam_type)+ |
|
540 done |
|
541 |
|
542 lemma lam_type_RepFun: "(\<lambda>b \<in> a. h(b)) \<in> a -> {h(b). b \<in> a}" |
|
543 by (fast intro!: lam_type RepFunI) |
|
544 |
|
545 lemma lemmaX: |
|
546 "[| \<forall>Y \<in> Pow(X). Y \<prec> K --> (\<exists>x \<in> X. <Y, x> \<in> R); |
|
547 b \<in> K; Z \<in> Pow(X); Z \<prec> K |] |
|
548 ==> {x \<in> X. <Z,x> \<in> R} \<noteq> 0" |
|
549 by blast |
|
550 |
|
551 |
|
552 lemma WO1_DC_lemma: |
|
553 "[| Card(K); well_ord(X,Q); |
|
554 \<forall>Y \<in> Pow(X). Y \<prec> K --> (\<exists>x \<in> X. <Y, x> \<in> R); b \<in> K |] |
|
555 ==> ff(b, X, Q, R) \<in> {x \<in> X. <(\<lambda>c \<in> b. ff(c, X, Q, R))``b, x> \<in> R}" |
|
556 apply (rule_tac P = "b \<in> K" in impE, (erule_tac [2] asm_rl)+) |
|
557 apply (rule_tac i=b in Card_is_Ord [THEN Ord_in_Ord, THEN trans_induct], |
|
558 assumption+) |
|
559 apply (rule impI) |
|
560 apply (rule ff_def [THEN def_transrec, THEN ssubst]) |
|
561 apply (erule the_first_in, fast) |
|
562 apply (simp add: image_fun [OF lam_type_RepFun subset_refl]) |
|
563 apply (erule lemmaX, assumption) |
|
564 apply (blast intro: Card_is_Ord OrdmemD [THEN subsetD]) |
|
565 apply (blast intro: lesspoll_trans1 in_Card_imp_lesspoll RepFun_lepoll) |
|
566 done |
|
567 |
|
568 theorem WO1_DC_Card: "WO1 ==> \<forall>K. Card(K) --> DC(K)" |
|
569 apply (unfold DC_def WO1_def) |
|
570 apply (rule allI impI)+ |
|
571 apply (erule allE exE conjE)+ |
|
572 apply (rule_tac x = "\<lambda>b \<in> K. ff (b, X, Ra, R) " in bexI) |
|
573 apply (simp add: lam_images_eq [OF Card_is_Ord ltD]) |
|
574 apply (fast elim!: ltE WO1_DC_lemma [THEN CollectD2]) |
|
575 apply (rule_tac lam_type) |
|
576 apply (rule WO1_DC_lemma [THEN CollectD1], assumption+) |
|
577 done |
|
578 |
70 end |
579 end |