76 apply (erule swap) |
76 apply (erule swap) |
77 apply (rule_tac x = "Union (A)" in exI) |
77 apply (rule_tac x = "Union (A)" in exI) |
78 apply (blast intro: lam_type) |
78 apply (blast intro: lam_type) |
79 done |
79 done |
80 |
80 |
81 lemma lemma1: |
81 lemma AC17_AC1_aux1: |
82 "[| \<forall>f \<in> Pow(x) - {0} -> x. \<exists>u \<in> Pow(x) - {0}. f`u\<notin>u; |
82 "[| \<forall>f \<in> Pow(x) - {0} -> x. \<exists>u \<in> Pow(x) - {0}. f`u\<notin>u; |
83 \<exists>f \<in> Pow(x)-{0}->x. |
83 \<exists>f \<in> Pow(x)-{0}->x. |
84 x - (\<Union>a \<in> (LEAST i. HH(\<lambda>X \<in> Pow(x)-{0}. {f`X},x,i)={x}). |
84 x - (\<Union>a \<in> (LEAST i. HH(\<lambda>X \<in> Pow(x)-{0}. {f`X},x,i)={x}). |
85 HH(\<lambda>X \<in> Pow(x)-{0}. {f`X},x,a)) = 0 |] |
85 HH(\<lambda>X \<in> Pow(x)-{0}. {f`X},x,a)) = 0 |] |
86 ==> P" |
86 ==> P" |
92 apply (erule notE) |
92 apply (erule notE) |
93 apply (rule Pi_type, assumption) |
93 apply (rule Pi_type, assumption) |
94 apply (blast dest: apply_type) |
94 apply (blast dest: apply_type) |
95 done |
95 done |
96 |
96 |
97 lemma lemma2: |
97 lemma AC17_AC1_aux2: |
98 "~ (\<exists>f \<in> Pow(x)-{0}->x. x - F(f) = 0) |
98 "~ (\<exists>f \<in> Pow(x)-{0}->x. x - F(f) = 0) |
99 ==> (\<lambda>f \<in> Pow(x)-{0}->x . x - F(f)) |
99 ==> (\<lambda>f \<in> Pow(x)-{0}->x . x - F(f)) |
100 \<in> (Pow(x) -{0} -> x) -> Pow(x) - {0}" |
100 \<in> (Pow(x) -{0} -> x) -> Pow(x) - {0}" |
101 by (fast intro!: lam_type dest!: Diff_eq_0_iff [THEN iffD1]) |
101 by (fast intro!: lam_type dest!: Diff_eq_0_iff [THEN iffD1]) |
102 |
102 |
103 lemma lemma3: |
103 lemma AC17_AC1_aux3: |
104 "[| f`Z \<in> Z; Z \<in> Pow(x)-{0} |] |
104 "[| f`Z \<in> Z; Z \<in> Pow(x)-{0} |] |
105 ==> (\<lambda>X \<in> Pow(x)-{0}. {f`X})`Z \<in> Pow(Z)-{0}" |
105 ==> (\<lambda>X \<in> Pow(x)-{0}. {f`X})`Z \<in> Pow(Z)-{0}" |
106 by auto |
106 by auto |
107 |
107 |
108 lemma lemma4: |
108 lemma AC17_AC1_aux4: |
109 "\<exists>f \<in> F. f`((\<lambda>f \<in> F. Q(f))`f) \<in> (\<lambda>f \<in> F. Q(f))`f |
109 "\<exists>f \<in> F. f`((\<lambda>f \<in> F. Q(f))`f) \<in> (\<lambda>f \<in> F. Q(f))`f |
110 ==> \<exists>f \<in> F. f`Q(f) \<in> Q(f)" |
110 ==> \<exists>f \<in> F. f`Q(f) \<in> Q(f)" |
111 by simp |
111 by simp |
112 |
112 |
113 lemma AC17_AC1: "AC17 ==> AC1" |
113 lemma AC17_AC1: "AC17 ==> AC1" |
115 apply (rule classical) |
115 apply (rule classical) |
116 apply (erule not_AC1_imp_ex [THEN exE]) |
116 apply (erule not_AC1_imp_ex [THEN exE]) |
117 apply (case_tac |
117 apply (case_tac |
118 "\<exists>f \<in> Pow(x)-{0} -> x. |
118 "\<exists>f \<in> Pow(x)-{0} -> x. |
119 x - (\<Union>a \<in> (LEAST i. HH (\<lambda>X \<in> Pow (x) -{0}. {f`X},x,i) ={x}) . HH (\<lambda>X \<in> Pow (x) -{0}. {f`X},x,a)) = 0") |
119 x - (\<Union>a \<in> (LEAST i. HH (\<lambda>X \<in> Pow (x) -{0}. {f`X},x,i) ={x}) . HH (\<lambda>X \<in> Pow (x) -{0}. {f`X},x,a)) = 0") |
120 apply (erule lemma1, assumption) |
120 apply (erule AC17_AC1_aux1, assumption) |
121 apply (drule lemma2) |
121 apply (drule AC17_AC1_aux2) |
122 apply (erule allE) |
122 apply (erule allE) |
123 apply (drule bspec, assumption) |
123 apply (drule bspec, assumption) |
124 apply (drule lemma4) |
124 apply (drule AC17_AC1_aux4) |
125 apply (erule bexE) |
125 apply (erule bexE) |
126 apply (drule apply_type, assumption) |
126 apply (drule apply_type, assumption) |
127 apply (simp add: HH_Least_eq_x del: Diff_iff ) |
127 apply (simp add: HH_Least_eq_x del: Diff_iff ) |
128 apply (drule lemma3, assumption) |
128 apply (drule AC17_AC1_aux3, assumption) |
129 apply (fast dest!: subst_elem [OF _ HH_Least_eq_x [symmetric]] |
129 apply (fast dest!: subst_elem [OF _ HH_Least_eq_x [symmetric]] |
130 f_subset_imp_HH_subset elim!: mem_irrefl) |
130 f_subset_imp_HH_subset elim!: mem_irrefl) |
131 done |
131 done |
132 |
132 |
133 |
133 |
140 |
140 |
141 (* ********************************************************************** *) |
141 (* ********************************************************************** *) |
142 (* AC1 ==> AC2 *) |
142 (* AC1 ==> AC2 *) |
143 (* ********************************************************************** *) |
143 (* ********************************************************************** *) |
144 |
144 |
145 lemma lemma1: |
145 lemma AC1_AC2_aux1: |
146 "[| f:(\<Pi>X \<in> A. X); B \<in> A; 0\<notin>A |] ==> {f`B} \<subseteq> B Int {f`C. C \<in> A}" |
146 "[| f:(\<Pi>X \<in> A. X); B \<in> A; 0\<notin>A |] ==> {f`B} \<subseteq> B Int {f`C. C \<in> A}" |
147 by (fast elim!: apply_type) |
147 by (fast elim!: apply_type) |
148 |
148 |
149 lemma lemma2: |
149 lemma AC1_AC2_aux2: |
150 "[| pairwise_disjoint(A); B \<in> A; C \<in> A; D \<in> B; D \<in> C |] ==> f`B = f`C" |
150 "[| pairwise_disjoint(A); B \<in> A; C \<in> A; D \<in> B; D \<in> C |] ==> f`B = f`C" |
151 by (unfold pairwise_disjoint_def, fast) |
151 by (unfold pairwise_disjoint_def, fast) |
152 |
152 |
153 lemma AC1_AC2: "AC1 ==> AC2" |
153 lemma AC1_AC2: "AC1 ==> AC2" |
154 apply (unfold AC1_def AC2_def) |
154 apply (unfold AC1_def AC2_def) |
155 apply (rule allI) |
155 apply (rule allI) |
156 apply (rule impI) |
156 apply (rule impI) |
157 apply (elim asm_rl conjE allE exE impE, assumption) |
157 apply (elim asm_rl conjE allE exE impE, assumption) |
158 apply (intro exI ballI equalityI) |
158 apply (intro exI ballI equalityI) |
159 prefer 2 apply (rule lemma1, assumption+) |
159 prefer 2 apply (rule AC1_AC2_aux1, assumption+) |
160 apply (fast elim!: lemma2 elim: apply_type) |
160 apply (fast elim!: AC1_AC2_aux2 elim: apply_type) |
161 done |
161 done |
162 |
162 |
163 |
163 |
164 (* ********************************************************************** *) |
164 (* ********************************************************************** *) |
165 (* AC2 ==> AC1 *) |
165 (* AC2 ==> AC1 *) |
166 (* ********************************************************************** *) |
166 (* ********************************************************************** *) |
167 |
167 |
168 lemma lemma1: "0\<notin>A ==> 0 \<notin> {B*{B}. B \<in> A}" |
168 lemma AC2_AC1_aux1: "0\<notin>A ==> 0 \<notin> {B*{B}. B \<in> A}" |
169 by (fast dest!: sym [THEN Sigma_empty_iff [THEN iffD1]]) |
169 by (fast dest!: sym [THEN Sigma_empty_iff [THEN iffD1]]) |
170 |
170 |
171 lemma lemma2: "[| X*{X} Int C = {y}; X \<in> A |] |
171 lemma AC2_AC1_aux2: "[| X*{X} Int C = {y}; X \<in> A |] |
172 ==> (THE y. X*{X} Int C = {y}): X*A" |
172 ==> (THE y. X*{X} Int C = {y}): X*A" |
173 apply (rule subst_elem [of y]) |
173 apply (rule subst_elem [of y]) |
174 apply (blast elim!: equalityE) |
174 apply (blast elim!: equalityE) |
175 apply (auto simp add: singleton_eq_iff) |
175 apply (auto simp add: singleton_eq_iff) |
176 done |
176 done |
177 |
177 |
178 lemma lemma3: |
178 lemma AC2_AC1_aux3: |
179 "\<forall>D \<in> {E*{E}. E \<in> A}. \<exists>y. D Int C = {y} |
179 "\<forall>D \<in> {E*{E}. E \<in> A}. \<exists>y. D Int C = {y} |
180 ==> (\<lambda>x \<in> A. fst(THE z. (x*{x} Int C = {z}))) \<in> (\<Pi>X \<in> A. X)" |
180 ==> (\<lambda>x \<in> A. fst(THE z. (x*{x} Int C = {z}))) \<in> (\<Pi>X \<in> A. X)" |
181 apply (rule lam_type) |
181 apply (rule lam_type) |
182 apply (drule bspec, blast) |
182 apply (drule bspec, blast) |
183 apply (blast intro: lemma2 fst_type) |
183 apply (blast intro: AC2_AC1_aux2 fst_type) |
184 done |
184 done |
185 |
185 |
186 lemma AC2_AC1: "AC2 ==> AC1" |
186 lemma AC2_AC1: "AC2 ==> AC1" |
187 apply (unfold AC1_def AC2_def pairwise_disjoint_def) |
187 apply (unfold AC1_def AC2_def pairwise_disjoint_def) |
188 apply (intro allI impI) |
188 apply (intro allI impI) |
189 apply (elim allE impE) |
189 apply (elim allE impE) |
190 prefer 2 apply (fast elim!: lemma3) |
190 prefer 2 apply (fast elim!: AC2_AC1_aux3) |
191 apply (blast intro!: lemma1) |
191 apply (blast intro!: AC2_AC1_aux1) |
192 done |
192 done |
193 |
193 |
194 |
194 |
195 (* ********************************************************************** *) |
195 (* ********************************************************************** *) |
196 (* AC1 ==> AC4 *) |
196 (* AC1 ==> AC4 *) |
209 |
209 |
210 (* ********************************************************************** *) |
210 (* ********************************************************************** *) |
211 (* AC4 ==> AC3 *) |
211 (* AC4 ==> AC3 *) |
212 (* ********************************************************************** *) |
212 (* ********************************************************************** *) |
213 |
213 |
214 lemma lemma1: "f \<in> A->B ==> (\<Union>z \<in> A. {z}*f`z) \<subseteq> A*Union(B)" |
214 lemma AC4_AC3_aux1: "f \<in> A->B ==> (\<Union>z \<in> A. {z}*f`z) \<subseteq> A*Union(B)" |
215 by (fast dest!: apply_type) |
215 by (fast dest!: apply_type) |
216 |
216 |
217 lemma lemma2: "domain(\<Union>z \<in> A. {z}*f(z)) = {a \<in> A. f(a)\<noteq>0}" |
217 lemma AC4_AC3_aux2: "domain(\<Union>z \<in> A. {z}*f(z)) = {a \<in> A. f(a)\<noteq>0}" |
218 by blast |
218 by blast |
219 |
219 |
220 lemma lemma3: "x \<in> A ==> (\<Union>z \<in> A. {z}*f(z))``{x} = f(x)" |
220 lemma AC4_AC3_aux3: "x \<in> A ==> (\<Union>z \<in> A. {z}*f(z))``{x} = f(x)" |
221 by fast |
221 by fast |
222 |
222 |
223 lemma AC4_AC3: "AC4 ==> AC3" |
223 lemma AC4_AC3: "AC4 ==> AC3" |
224 apply (unfold AC3_def AC4_def) |
224 apply (unfold AC3_def AC4_def) |
225 apply (intro allI ballI) |
225 apply (intro allI ballI) |
226 apply (elim allE impE) |
226 apply (elim allE impE) |
227 apply (erule lemma1) |
227 apply (erule AC4_AC3_aux1) |
228 apply (simp add: lemma2 lemma3 cong add: Pi_cong) |
228 apply (simp add: AC4_AC3_aux2 AC4_AC3_aux3 cong add: Pi_cong) |
229 done |
229 done |
230 |
230 |
231 (* ********************************************************************** *) |
231 (* ********************************************************************** *) |
232 (* AC3 ==> AC1 *) |
232 (* AC3 ==> AC1 *) |
233 (* ********************************************************************** *) |
233 (* ********************************************************************** *) |
262 |
262 |
263 (* ********************************************************************** *) |
263 (* ********************************************************************** *) |
264 (* AC5 ==> AC4, Rubin & Rubin, p. 11 *) |
264 (* AC5 ==> AC4, Rubin & Rubin, p. 11 *) |
265 (* ********************************************************************** *) |
265 (* ********************************************************************** *) |
266 |
266 |
267 lemma lemma1: "R \<subseteq> A*B ==> (\<lambda>x \<in> R. fst(x)) \<in> R -> A" |
267 lemma AC5_AC4_aux1: "R \<subseteq> A*B ==> (\<lambda>x \<in> R. fst(x)) \<in> R -> A" |
268 by (fast intro!: lam_type fst_type) |
268 by (fast intro!: lam_type fst_type) |
269 |
269 |
270 lemma lemma2: "R \<subseteq> A*B ==> range(\<lambda>x \<in> R. fst(x)) = domain(R)" |
270 lemma AC5_AC4_aux2: "R \<subseteq> A*B ==> range(\<lambda>x \<in> R. fst(x)) = domain(R)" |
271 by (unfold lam_def, force) |
271 by (unfold lam_def, force) |
272 |
272 |
273 lemma lemma3: "[| \<exists>f \<in> A->C. P(f,domain(f)); A=B |] ==> \<exists>f \<in> B->C. P(f,B)" |
273 lemma AC5_AC4_aux3: "[| \<exists>f \<in> A->C. P(f,domain(f)); A=B |] ==> \<exists>f \<in> B->C. P(f,B)" |
274 apply (erule bexE) |
274 apply (erule bexE) |
275 apply (frule domain_of_fun, fast) |
275 apply (frule domain_of_fun, fast) |
276 done |
276 done |
277 |
277 |
278 lemma lemma4: "[| R \<subseteq> A*B; g \<in> C->R; \<forall>x \<in> C. (\<lambda>z \<in> R. fst(z))` (g`x) = x |] |
278 lemma AC5_AC4_aux4: "[| R \<subseteq> A*B; g \<in> C->R; \<forall>x \<in> C. (\<lambda>z \<in> R. fst(z))` (g`x) = x |] |
279 ==> (\<lambda>x \<in> C. snd(g`x)): (\<Pi>x \<in> C. R``{x})" |
279 ==> (\<lambda>x \<in> C. snd(g`x)): (\<Pi>x \<in> C. R``{x})" |
280 apply (rule lam_type) |
280 apply (rule lam_type) |
281 apply (force dest: apply_type) |
281 apply (force dest: apply_type) |
282 done |
282 done |
283 |
283 |
284 lemma AC5_AC4: "AC5 ==> AC4" |
284 lemma AC5_AC4: "AC5 ==> AC4" |
285 apply (unfold AC4_def AC5_def, clarify) |
285 apply (unfold AC4_def AC5_def, clarify) |
286 apply (elim allE ballE) |
286 apply (elim allE ballE) |
287 apply (drule lemma3 [OF _ lemma2], assumption) |
287 apply (drule AC5_AC4_aux3 [OF _ AC5_AC4_aux2], assumption) |
288 apply (fast elim!: lemma4) |
288 apply (fast elim!: AC5_AC4_aux4) |
289 apply (blast intro: lemma1) |
289 apply (blast intro: AC5_AC4_aux1) |
290 done |
290 done |
291 |
291 |
292 |
292 |
293 (* ********************************************************************** *) |
293 (* ********************************************************************** *) |
294 (* AC1 <-> AC6 *) |
294 (* AC1 <-> AC6 *) |