src/ZF/AC/AC17_AC1.thy
changeset 13535 007559e981c7
parent 13339 0f89104dd377
child 14171 0cab06e3bbd0
equal deleted inserted replaced
13534:ca6debb89d77 13535:007559e981c7
    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                                                            *)