src/ZF/AC/DC.thy
changeset 12776 249600a63ba9
parent 11317 7f9e4c389318
child 12820 02e2ff3e4d37
equal deleted inserted replaced
12775:1748c16c2df3 12776:249600a63ba9
     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