src/ZF/AC/AC16_WO4.ML
changeset 1208 bc3093616ba4
parent 1200 d4551b1a6da7
child 1461 6bcb44e4d6e5
equal deleted inserted replaced
1207:3f460842e919 1208:bc3093616ba4
     1 (*  Title: 	ZF/AC/AC16_WO4.ML
     1 (*  Title: 	ZF/AC/AC16_WO4.ML
     2     ID:         $Id$
     2     ID:         $Id$
     3     Author: 	Krzysztof Gr`abczewski
     3     Author: 	Krzysztof Grabczewski
     4 
     4 
     5   The proof of AC16(n, k) ==> WO4(n-k)
     5   The proof of AC16(n, k) ==> WO4(n-k)
     6 *)
     6 *)
     7 
     7 
     8 open AC16_WO4;
     8 open AC16_WO4;
    12 (* ********************************************************************** *)
    12 (* ********************************************************************** *)
    13 
    13 
    14 goalw thy [Finite_def] "!!A. [| Finite(A); 0<m; m:nat |] ==>  \
    14 goalw thy [Finite_def] "!!A. [| Finite(A); 0<m; m:nat |] ==>  \
    15 \	EX a f. Ord(a) & domain(f) = a &  \
    15 \	EX a f. Ord(a) & domain(f) = a &  \
    16 \		(UN b<a. f`b) = A & (ALL b<a. f`b lepoll m)";
    16 \		(UN b<a. f`b) = A & (ALL b<a. f`b lepoll m)";
    17 by (eresolve_tac [bexE] 1);
    17 by (etac bexE 1);
    18 by (dresolve_tac [eqpoll_sym RS (eqpoll_def RS def_imp_iff RS iffD1)] 1);
    18 by (dresolve_tac [eqpoll_sym RS (eqpoll_def RS def_imp_iff RS iffD1)] 1);
    19 by (eresolve_tac [exE] 1);
    19 by (etac exE 1);
    20 by (res_inst_tac [("x","n")] exI 1);
    20 by (res_inst_tac [("x","n")] exI 1);
    21 by (res_inst_tac [("x","lam i:n. {f`i}")] exI 1);
    21 by (res_inst_tac [("x","lam i:n. {f`i}")] exI 1);
    22 by (asm_full_simp_tac AC_ss 1);
    22 by (asm_full_simp_tac AC_ss 1);
    23 by (rewrite_goals_tac [bij_def, surj_def]);
    23 by (rewrite_goals_tac [bij_def, surj_def]);
    24 by (fast_tac (AC_cs addSIs [ltI, nat_into_Ord, lam_funtype RS domain_of_fun,
    24 by (fast_tac (AC_cs addSIs [ltI, nat_into_Ord, lam_funtype RS domain_of_fun,
   102 val [prem] = goalw thy [s_u_def]
   102 val [prem] = goalw thy [s_u_def]
   103 	"(ALL v:s_u(u, t_n, k, y). k eqpoll v Int y ==> False)  \
   103 	"(ALL v:s_u(u, t_n, k, y). k eqpoll v Int y ==> False)  \
   104 \	==> EX v : s_u(u, t_n, k, y). succ(k) lepoll v Int y";
   104 \	==> EX v : s_u(u, t_n, k, y). succ(k) lepoll v Int y";
   105 by (excluded_middle_tac "?P" 1 THEN (assume_tac 2));
   105 by (excluded_middle_tac "?P" 1 THEN (assume_tac 2));
   106 by (resolve_tac [prem RS FalseE] 1);
   106 by (resolve_tac [prem RS FalseE] 1);
   107 by (resolve_tac [ballI] 1);
   107 by (rtac ballI 1);
   108 by (eresolve_tac [CollectE] 1);
   108 by (etac CollectE 1);
   109 by (eresolve_tac [conjE] 1);
   109 by (etac conjE 1);
   110 by (eresolve_tac [swap] 1);
   110 by (etac swap 1);
   111 by (fast_tac (AC_cs addSEs [succ_not_lepoll_imp_eqpoll]) 1);
   111 by (fast_tac (AC_cs addSEs [succ_not_lepoll_imp_eqpoll]) 1);
   112 val suppose_not = result();
   112 val suppose_not = result();
   113 
   113 
   114 (* ********************************************************************** *)
   114 (* ********************************************************************** *)
   115 (* There is a k-2 element subset of y					  *)
   115 (* There is a k-2 element subset of y					  *)
   125 val ordertype_eqpoll =
   125 val ordertype_eqpoll =
   126 	ordermap_bij RS (exI RS (eqpoll_def RS def_imp_iff RS iffD2));
   126 	ordermap_bij RS (exI RS (eqpoll_def RS def_imp_iff RS iffD2));
   127 
   127 
   128 goal thy "!!y. [| well_ord(y,R); ~Finite(y); n:nat  \
   128 goal thy "!!y. [| well_ord(y,R); ~Finite(y); n:nat  \
   129 \	|] ==> EX z. z<=y & n eqpoll z";
   129 \	|] ==> EX z. z<=y & n eqpoll z";
   130 by (eresolve_tac [nat_lepoll_imp_ex_eqpoll_n] 1);
   130 by (etac nat_lepoll_imp_ex_eqpoll_n 1);
   131 by (resolve_tac [ordertype_eqpoll RS eqpoll_sym RS eqpoll_imp_lepoll
   131 by (resolve_tac [ordertype_eqpoll RS eqpoll_sym RS eqpoll_imp_lepoll
   132 	RSN (2, lepoll_trans)] 1 THEN (assume_tac 2));
   132 	RSN (2, lepoll_trans)] 1 THEN (assume_tac 2));
   133 by (fast_tac (AC_cs addSIs [nat_le_infinite_Ord RS le_imp_lepoll]
   133 by (fast_tac (AC_cs addSIs [nat_le_infinite_Ord RS le_imp_lepoll]
   134 		addSEs [Ord_ordertype, ordertype_eqpoll RS eqpoll_imp_lepoll
   134 		addSEs [Ord_ordertype, ordertype_eqpoll RS eqpoll_imp_lepoll
   135 			RS lepoll_infinite]) 1);
   135 			RS lepoll_infinite]) 1);
   183 goal thy
   183 goal thy
   184 	"!!y. [| ALL z:{z: Pow(x Un y) . z eqpoll succ(succ(k))}.  \
   184 	"!!y. [| ALL z:{z: Pow(x Un y) . z eqpoll succ(succ(k))}.  \
   185 \	EX! w. w:t_n & z <= w; \
   185 \	EX! w. w:t_n & z <= w; \
   186 \	k eqpoll a; a <= y; b : y - a; u : x; x Int y = 0 |]  \
   186 \	k eqpoll a; a <= y; b : y - a; u : x; x Int y = 0 |]  \
   187 \	==> EX! c. c:{v:s_u(u, t_n, succ(k), y). a <= v} & b:c";
   187 \	==> EX! c. c:{v:s_u(u, t_n, succ(k), y). a <= v} & b:c";
   188 by (eresolve_tac [ballE] 1);
   188 by (etac ballE 1);
   189 by (fast_tac (FOL_cs addSIs [CollectI, cons_cons_subset,
   189 by (fast_tac (FOL_cs addSIs [CollectI, cons_cons_subset,
   190 		eqpoll_sym RS cons_cons_eqpoll]) 2);
   190 		eqpoll_sym RS cons_cons_eqpoll]) 2);
   191 by (eresolve_tac [ex1E] 1);
   191 by (etac ex1E 1);
   192 by (res_inst_tac [("a","w")] ex1I 1);
   192 by (res_inst_tac [("a","w")] ex1I 1);
   193 by (resolve_tac [conjI] 1);
   193 by (rtac conjI 1);
   194 by (resolve_tac [CollectI] 1);
   194 by (rtac CollectI 1);
   195 by (fast_tac (FOL_cs addSEs [s_uI]) 1);
   195 by (fast_tac (FOL_cs addSEs [s_uI]) 1);
   196 by (fast_tac AC_cs 1);
   196 by (fast_tac AC_cs 1);
   197 by (fast_tac AC_cs 1);
   197 by (fast_tac AC_cs 1);
   198 by (eresolve_tac [allE] 1);
   198 by (etac allE 1);
   199 by (eresolve_tac [impE] 1);
   199 by (etac impE 1);
   200 by (assume_tac 2);
   200 by (assume_tac 2);
   201 by (fast_tac (AC_cs addSEs [s_u_subset RS subsetD, in_s_u_imp_u_in]) 1);
   201 by (fast_tac (AC_cs addSEs [s_u_subset RS subsetD, in_s_u_imp_u_in]) 1);
   202 val ex1_superset_a = result();
   202 val ex1_superset_a = result();
   203 
   203 
   204 goal thy
   204 goal thy
   205 	"!!A. [| succ(k) eqpoll A; k eqpoll B; B <= A; a : A-B; k:nat  \
   205 	"!!A. [| succ(k) eqpoll A; k eqpoll B; B <= A; a : A-B; k:nat  \
   206 \	|] ==> A = cons(a, B)";
   206 \	|] ==> A = cons(a, B)";
   207 by (resolve_tac [equalityI] 1);
   207 by (rtac equalityI 1);
   208 by (fast_tac AC_cs 2);
   208 by (fast_tac AC_cs 2);
   209 by (resolve_tac [Diff_eq_0_iff RS iffD1] 1);
   209 by (resolve_tac [Diff_eq_0_iff RS iffD1] 1);
   210 by (resolve_tac [equals0I] 1);
   210 by (rtac equals0I 1);
   211 by (dresolve_tac [eqpoll_sym RS eqpoll_imp_lepoll] 1);
   211 by (dresolve_tac [eqpoll_sym RS eqpoll_imp_lepoll] 1);
   212 by (dresolve_tac [eqpoll_sym RS cons_eqpoll_succ] 1);
   212 by (dresolve_tac [eqpoll_sym RS cons_eqpoll_succ] 1);
   213 by (fast_tac AC_cs 1);
   213 by (fast_tac AC_cs 1);
   214 by (dresolve_tac [cons_eqpoll_succ] 1);
   214 by (dtac cons_eqpoll_succ 1);
   215 by (fast_tac AC_cs 1);
   215 by (fast_tac AC_cs 1);
   216 by (fast_tac (AC_cs addSIs [nat_succI]
   216 by (fast_tac (AC_cs addSIs [nat_succI]
   217 	addSEs [[eqpoll_sym RS eqpoll_imp_lepoll, subset_imp_lepoll] MRS
   217 	addSEs [[eqpoll_sym RS eqpoll_imp_lepoll, subset_imp_lepoll] MRS
   218 	(lepoll_trans RS lepoll_trans) RS succ_lepoll_natE]) 1);
   218 	(lepoll_trans RS lepoll_trans) RS succ_lepoll_natE]) 1);
   219 val set_eq_cons = result();
   219 val set_eq_cons = result();
   224 \	ALL v:s_u(u, t_n, succ(k), y). succ(k) eqpoll v Int y;  \
   224 \	ALL v:s_u(u, t_n, succ(k), y). succ(k) eqpoll v Int y;  \
   225 \	k eqpoll a; a <= y; b : y - a; u : x; x Int y = 0; k:nat   \
   225 \	k eqpoll a; a <= y; b : y - a; u : x; x Int y = 0; k:nat   \
   226 \	|] ==> (THE c. c:{v:s_u(u, t_n, succ(k), y). a <= v} & b:c)  \
   226 \	|] ==> (THE c. c:{v:s_u(u, t_n, succ(k), y). a <= v} & b:c)  \
   227 \	Int y = cons(b, a)";
   227 \	Int y = cons(b, a)";
   228 by (dresolve_tac [ex1_superset_a RS theI] 1 THEN REPEAT (assume_tac 1));
   228 by (dresolve_tac [ex1_superset_a RS theI] 1 THEN REPEAT (assume_tac 1));
   229 by (resolve_tac [set_eq_cons] 1);
   229 by (rtac set_eq_cons 1);
   230 by (REPEAT (fast_tac AC_cs 1));
   230 by (REPEAT (fast_tac AC_cs 1));
   231 val the_eq_cons = result();
   231 val the_eq_cons = result();
   232 
   232 
   233 goal thy "!!a. [| cons(x,a) = cons(y,a); x~: a |] ==> x = y ";
   233 goal thy "!!a. [| cons(x,a) = cons(y,a); x~: a |] ==> x = y ";
   234 by (fast_tac (AC_cs addSEs [equalityE]) 1);
   234 by (fast_tac (AC_cs addSEs [equalityE]) 1);
   259 	THEN REPEAT (assume_tac 1));
   259 	THEN REPEAT (assume_tac 1));
   260 by (res_inst_tac [("f3","lam b:y-a.  \
   260 by (res_inst_tac [("f3","lam b:y-a.  \
   261 \	THE c. c:{v:s_u(u, t_n, succ(k), y). a <= v} & b:c")]
   261 \	THE c. c:{v:s_u(u, t_n, succ(k), y). a <= v} & b:c")]
   262 	(exI RS (lepoll_def RS def_imp_iff RS iffD2)) 1);
   262 	(exI RS (lepoll_def RS def_imp_iff RS iffD2)) 1);
   263 by (resolve_tac [inj_def RS def_imp_eq RS ssubst] 1);
   263 by (resolve_tac [inj_def RS def_imp_eq RS ssubst] 1);
   264 by (resolve_tac [CollectI] 1);
   264 by (rtac CollectI 1);
   265 by (resolve_tac [lam_type] 1);
   265 by (rtac lam_type 1);
   266 by (resolve_tac [ex1_superset_a RS theI RS conjunct1] 1
   266 by (resolve_tac [ex1_superset_a RS theI RS conjunct1] 1
   267 	THEN REPEAT (assume_tac 1));
   267 	THEN REPEAT (assume_tac 1));
   268 by (resolve_tac [ballI] 1);
   268 by (rtac ballI 1);
   269 by (resolve_tac [ballI] 1);
   269 by (rtac ballI 1);
   270 by (resolve_tac [beta RS ssubst] 1 THEN (assume_tac 1));
   270 by (resolve_tac [beta RS ssubst] 1 THEN (assume_tac 1));
   271 by (resolve_tac [beta RS ssubst] 1 THEN (assume_tac 1));
   271 by (resolve_tac [beta RS ssubst] 1 THEN (assume_tac 1));
   272 by (resolve_tac [impI] 1);
   272 by (rtac impI 1);
   273 by (resolve_tac [cons_eqE] 1);
   273 by (rtac cons_eqE 1);
   274 by (fast_tac AC_cs 2);
   274 by (fast_tac AC_cs 2);
   275 by (dres_inst_tac [("A","THE c. ?P(c)"), ("C","y")] eq_imp_Int_eq 1);
   275 by (dres_inst_tac [("A","THE c. ?P(c)"), ("C","y")] eq_imp_Int_eq 1);
   276 by (eresolve_tac [[asm_rl, the_eq_cons, the_eq_cons] MRS msubst] 1
   276 by (eresolve_tac [[asm_rl, the_eq_cons, the_eq_cons] MRS msubst] 1
   277 	THEN REPEAT (assume_tac 1));
   277 	THEN REPEAT (assume_tac 1));
   278 val y_lepoll_subset_s_u = result();
   278 val y_lepoll_subset_s_u = result();
   291 by (REPEAT (resolve_tac [allI,impI] 1));
   291 by (REPEAT (resolve_tac [allI,impI] 1));
   292 by (resolve_tac [succ_lepoll_imp_not_empty RS not_emptyE] 1);
   292 by (resolve_tac [succ_lepoll_imp_not_empty RS not_emptyE] 1);
   293 by (fast_tac AC_cs 1);
   293 by (fast_tac AC_cs 1);
   294 by (eres_inst_tac [("x","A - {xa}")] allE 1);
   294 by (eres_inst_tac [("x","A - {xa}")] allE 1);
   295 by (eres_inst_tac [("x","B - {xa}")] allE 1);
   295 by (eres_inst_tac [("x","B - {xa}")] allE 1);
   296 by (eresolve_tac [impE] 1);
   296 by (etac impE 1);
   297 by (asm_full_simp_tac (AC_ss addsimps [add_succ]) 1);
   297 by (asm_full_simp_tac (AC_ss addsimps [add_succ]) 1);
   298 by (fast_tac (AC_cs addSIs [Diff_sing_eqpoll, lepoll_Diff_sing]) 1);
   298 by (fast_tac (AC_cs addSIs [Diff_sing_eqpoll, lepoll_Diff_sing]) 1);
   299 by (res_inst_tac [("P","%z. z lepoll m")] subst 1 THEN (assume_tac 2));
   299 by (res_inst_tac [("P","%z. z lepoll m")] subst 1 THEN (assume_tac 2));
   300 by (fast_tac (AC_cs addSIs [equalityI]) 1);
   300 by (fast_tac (AC_cs addSIs [equalityI]) 1);
   301 val eqpoll_sum_imp_Diff_lepoll_lemma = result();
   301 val eqpoll_sum_imp_Diff_lepoll_lemma = result();
   322 by (REPEAT (resolve_tac [allI,impI] 1));
   322 by (REPEAT (resolve_tac [allI,impI] 1));
   323 by (resolve_tac [succ_lepoll_imp_not_empty RS not_emptyE] 1);
   323 by (resolve_tac [succ_lepoll_imp_not_empty RS not_emptyE] 1);
   324 by (fast_tac (AC_cs addSEs [eqpoll_imp_lepoll]) 1);
   324 by (fast_tac (AC_cs addSEs [eqpoll_imp_lepoll]) 1);
   325 by (eres_inst_tac [("x","A - {xa}")] allE 1);
   325 by (eres_inst_tac [("x","A - {xa}")] allE 1);
   326 by (eres_inst_tac [("x","B - {xa}")] allE 1);
   326 by (eres_inst_tac [("x","B - {xa}")] allE 1);
   327 by (eresolve_tac [impE] 1);
   327 by (etac impE 1);
   328 by (fast_tac (AC_cs addSIs [Diff_sing_eqpoll,
   328 by (fast_tac (AC_cs addSIs [Diff_sing_eqpoll,
   329 	eqpoll_sym RSN (2, Diff_sing_eqpoll) RS eqpoll_sym]
   329 	eqpoll_sym RSN (2, Diff_sing_eqpoll) RS eqpoll_sym]
   330 	addss (AC_ss addsimps [add_succ])) 1);
   330 	addss (AC_ss addsimps [add_succ])) 1);
   331 by (res_inst_tac [("P","%z. z eqpoll m")] subst 1 THEN (assume_tac 2));
   331 by (res_inst_tac [("P","%z. z eqpoll m")] subst 1 THEN (assume_tac 2));
   332 by (fast_tac (AC_cs addSIs [equalityI]) 1);
   332 by (fast_tac (AC_cs addSIs [equalityI]) 1);
   353 goal thy "!!w. [| w:{v:s_u(u, t_n, succ(l), y). a <= v};  \
   353 goal thy "!!w. [| w:{v:s_u(u, t_n, succ(l), y). a <= v};  \
   354 \	l eqpoll a; t_n <= {v:Pow(x Un y). v eqpoll succ(succ(l) #+ m)};  \
   354 \	l eqpoll a; t_n <= {v:Pow(x Un y). v eqpoll succ(succ(l) #+ m)};  \
   355 \	m:nat; l:nat; x Int y = 0; u : x;  \
   355 \	m:nat; l:nat; x Int y = 0; u : x;  \
   356 \	ALL v:s_u(u, t_n, succ(l), y). succ(l) eqpoll v Int y  \
   356 \	ALL v:s_u(u, t_n, succ(l), y). succ(l) eqpoll v Int y  \
   357 \	|] ==> w Int (x - {u}) eqpoll m";
   357 \	|] ==> w Int (x - {u}) eqpoll m";
   358 by (eresolve_tac [CollectE] 1);
   358 by (etac CollectE 1);
   359 by (resolve_tac [w_Int_eq_w_Diff RS ssubst] 1 THEN (assume_tac 1));
   359 by (resolve_tac [w_Int_eq_w_Diff RS ssubst] 1 THEN (assume_tac 1));
   360 by (fast_tac (AC_cs addSDs [s_u_subset RS subsetD]) 1);
   360 by (fast_tac (AC_cs addSDs [s_u_subset RS subsetD]) 1);
   361 by (fast_tac (AC_cs addEs [equals0D] addSDs [bspec]
   361 by (fast_tac (AC_cs addEs [equals0D] addSDs [bspec]
   362 	addDs [s_u_subset RS subsetD]
   362 	addDs [s_u_subset RS subsetD]
   363 	addSEs [eqpoll_sym RS cons_eqpoll_succ RS eqpoll_sym, in_s_u_imp_u_in]
   363 	addSEs [eqpoll_sym RS cons_eqpoll_succ RS eqpoll_sym, in_s_u_imp_u_in]
   391 \		lepoll {v:Pow(x). v eqpoll m}";
   391 \		lepoll {v:Pow(x). v eqpoll m}";
   392 by (res_inst_tac [("f3","lam w:{v:s_u(u, t_n, succ(l), y). a <= v}.  \
   392 by (res_inst_tac [("f3","lam w:{v:s_u(u, t_n, succ(l), y). a <= v}.  \
   393 \	w Int (x - {u})")] 
   393 \	w Int (x - {u})")] 
   394 	(exI RS (lepoll_def RS def_imp_iff RS iffD2)) 1);
   394 	(exI RS (lepoll_def RS def_imp_iff RS iffD2)) 1);
   395 by (resolve_tac [inj_def RS def_imp_eq RS ssubst] 1);
   395 by (resolve_tac [inj_def RS def_imp_eq RS ssubst] 1);
   396 by (resolve_tac [CollectI] 1);
   396 by (rtac CollectI 1);
   397 by (resolve_tac [lam_type] 1);
   397 by (rtac lam_type 1);
   398 by (resolve_tac [CollectI] 1);
   398 by (rtac CollectI 1);
   399 by (fast_tac AC_cs 1);
   399 by (fast_tac AC_cs 1);
   400 by (resolve_tac [w_Int_eqpoll_m] 1 THEN REPEAT (assume_tac 1));
   400 by (rtac w_Int_eqpoll_m 1 THEN REPEAT (assume_tac 1));
   401 by (simp_tac AC_ss 1);
   401 by (simp_tac AC_ss 1);
   402 by (REPEAT (resolve_tac [ballI, impI] 1));
   402 by (REPEAT (resolve_tac [ballI, impI] 1));
   403 by (eresolve_tac [w_Int_eqpoll_m RSN (2, eqpoll_m_not_empty) RS not_emptyE] 1
   403 by (eresolve_tac [w_Int_eqpoll_m RSN (2, eqpoll_m_not_empty) RS not_emptyE] 1
   404 	THEN REPEAT (assume_tac 1));
   404 	THEN REPEAT (assume_tac 1));
   405 by (dresolve_tac [equalityD1 RS subsetD] 1 THEN (assume_tac 1));
   405 by (dresolve_tac [equalityD1 RS subsetD] 1 THEN (assume_tac 1));
   406 by (dresolve_tac [cons_cons_in RSN (2, bspec)] 1 THEN REPEAT (assume_tac 1));
   406 by (dresolve_tac [cons_cons_in RSN (2, bspec)] 1 THEN REPEAT (assume_tac 1));
   407 by (eresolve_tac [ex1_two_eq] 1);
   407 by (etac ex1_two_eq 1);
   408 by (fast_tac (AC_cs addSEs [s_u_subset RS subsetD, in_s_u_imp_u_in]) 1);
   408 by (fast_tac (AC_cs addSEs [s_u_subset RS subsetD, in_s_u_imp_u_in]) 1);
   409 by (fast_tac (AC_cs addSEs [s_u_subset RS subsetD, in_s_u_imp_u_in]) 1);
   409 by (fast_tac (AC_cs addSEs [s_u_subset RS subsetD, in_s_u_imp_u_in]) 1);
   410 val subset_s_u_lepoll_w = result();
   410 val subset_s_u_lepoll_w = result();
   411 
   411 
   412 goal thy "!!k. [| 0<k; k:nat |] ==> EX l:nat. k = succ(l)";
   412 goal thy "!!k. [| 0<k; k:nat |] ==> EX l:nat. k = succ(l)";
   413 by (eresolve_tac [natE] 1);
   413 by (etac natE 1);
   414 by (fast_tac (empty_cs addSEs [ltE, mem_irrefl]) 1);
   414 by (fast_tac (empty_cs addSEs [ltE, mem_irrefl]) 1);
   415 by (fast_tac (empty_cs addSIs [refl, bexI]) 1);
   415 by (fast_tac (empty_cs addSIs [refl, bexI]) 1);
   416 val ex_eq_succ = result();
   416 val ex_eq_succ = result();
   417 
   417 
   418 goal thy
   418 goal thy
   420 \	EX! w. w:t_n & z <= w; \
   420 \	EX! w. w:t_n & z <= w; \
   421 \	well_ord(y,R); ~Finite(y); u:x; x Int y = 0;  \
   421 \	well_ord(y,R); ~Finite(y); u:x; x Int y = 0;  \
   422 \	t_n <= {v:Pow(x Un y). v eqpoll succ(k #+ m)};  \
   422 \	t_n <= {v:Pow(x Un y). v eqpoll succ(k #+ m)};  \
   423 \	~ y lepoll {v:Pow(x). v eqpoll m}; 0<k; 0<m; k:nat; m:nat  \
   423 \	~ y lepoll {v:Pow(x). v eqpoll m}; 0<k; 0<m; k:nat; m:nat  \
   424 \	|] ==> EX v : s_u(u, t_n, k, y). succ(k) lepoll v Int y";
   424 \	|] ==> EX v : s_u(u, t_n, k, y). succ(k) lepoll v Int y";
   425 by (resolve_tac [suppose_not] 1);
   425 by (rtac suppose_not 1);
   426 by (eresolve_tac [ex_eq_succ RS bexE] 1 THEN (assume_tac 1));
   426 by (eresolve_tac [ex_eq_succ RS bexE] 1 THEN (assume_tac 1));
   427 by (hyp_subst_tac 1);
   427 by (hyp_subst_tac 1);
   428 by (res_inst_tac [("n1","xa")] (ex_subset_eqpoll_n RS exE) 1
   428 by (res_inst_tac [("n1","xa")] (ex_subset_eqpoll_n RS exE) 1
   429 	THEN REPEAT (assume_tac 1));
   429 	THEN REPEAT (assume_tac 1));
   430 by (eresolve_tac [conjE] 1);
   430 by (etac conjE 1);
   431 by (forward_tac [[y_lepoll_subset_s_u, subset_s_u_lepoll_w] MRS lepoll_trans] 1
   431 by (forward_tac [[y_lepoll_subset_s_u, subset_s_u_lepoll_w] MRS lepoll_trans] 1
   432 	THEN REPEAT (assume_tac 1));
   432 	THEN REPEAT (assume_tac 1));
   433 by (contr_tac 1);
   433 by (contr_tac 1);
   434 val exists_proper_in_s_u = result();
   434 val exists_proper_in_s_u = result();
   435 
   435 
   487 (* well_ord_subsets_lepoll_n						  *)
   487 (* well_ord_subsets_lepoll_n						  *)
   488 (* ********************************************************************** *)
   488 (* ********************************************************************** *)
   489 
   489 
   490 goal thy "!!y r. [| well_ord(y,r); ~Finite(y); n:nat |] ==>  \
   490 goal thy "!!y r. [| well_ord(y,r); ~Finite(y); n:nat |] ==>  \
   491 \	EX R. well_ord({z:Pow(y). z lepoll n}, R)";
   491 \	EX R. well_ord({z:Pow(y). z lepoll n}, R)";
   492 by (eresolve_tac [nat_induct] 1);
   492 by (etac nat_induct 1);
   493 by (fast_tac (ZF_cs addSIs [well_ord_unit]
   493 by (fast_tac (ZF_cs addSIs [well_ord_unit]
   494 	addss (ZF_ss addsimps [subsets_lepoll_0_eq_unit])) 1);
   494 	addss (ZF_ss addsimps [subsets_lepoll_0_eq_unit])) 1);
   495 by (eresolve_tac [exE] 1);
   495 by (etac exE 1);
   496 by (eresolve_tac [well_ord_subsets_eqpoll_n RS exE] 1 
   496 by (eresolve_tac [well_ord_subsets_eqpoll_n RS exE] 1 
   497 	THEN REPEAT (assume_tac 1));
   497 	THEN REPEAT (assume_tac 1));
   498 by (asm_simp_tac (ZF_ss addsimps [subsets_lepoll_succ]) 1);
   498 by (asm_simp_tac (ZF_ss addsimps [subsets_lepoll_succ]) 1);
   499 by (dresolve_tac [well_ord_radd] 1 THEN (assume_tac 1));
   499 by (dtac well_ord_radd 1 THEN (assume_tac 1));
   500 by (eresolve_tac [Int_empty RS disj_Un_eqpoll_sum RS 
   500 by (eresolve_tac [Int_empty RS disj_Un_eqpoll_sum RS 
   501 		(eqpoll_def RS def_imp_iff RS iffD1) RS exE] 1);
   501 		(eqpoll_def RS def_imp_iff RS iffD1) RS exE] 1);
   502 by (fast_tac (ZF_cs addSEs [bij_is_inj RS well_ord_rvimage]) 1);
   502 by (fast_tac (ZF_cs addSEs [bij_is_inj RS well_ord_rvimage]) 1);
   503 val well_ord_subsets_lepoll_n = result();
   503 val well_ord_subsets_lepoll_n = result();
   504 
   504 
   531 by (resolve_tac [lepoll_imp_eqpoll_subset RS exE] 1 THEN (assume_tac 1));
   531 by (resolve_tac [lepoll_imp_eqpoll_subset RS exE] 1 THEN (assume_tac 1));
   532 by (eres_inst_tac [("x","xa")] ballE 1);
   532 by (eres_inst_tac [("x","xa")] ballE 1);
   533 by (fast_tac (AC_cs addSEs [eqpoll_sym]) 2);
   533 by (fast_tac (AC_cs addSEs [eqpoll_sym]) 2);
   534 by (res_inst_tac [("a","v")] ex1I 1);
   534 by (res_inst_tac [("a","v")] ex1I 1);
   535 by (fast_tac AC_cs 1);
   535 by (fast_tac AC_cs 1);
   536 by (eresolve_tac [ex1E] 1);
   536 by (etac ex1E 1);
   537 by (res_inst_tac [("x","v")] allE 1 THEN (assume_tac 1));
   537 by (res_inst_tac [("x","v")] allE 1 THEN (assume_tac 1));
   538 by (eres_inst_tac [("x","xb")] allE 1);
   538 by (eres_inst_tac [("x","xb")] allE 1);
   539 by (fast_tac AC_cs 1);
   539 by (fast_tac AC_cs 1);
   540 val unique_superset_in_MM = result();
   540 val unique_superset_in_MM = result();
   541 
   541 
   574 \	well_ord(y,R); ~Finite(y); u:x; x Int y = 0;  \
   574 \	well_ord(y,R); ~Finite(y); u:x; x Int y = 0;  \
   575 \	t_n <= {v:Pow(x Un y). v eqpoll succ(k #+ m)};  \
   575 \	t_n <= {v:Pow(x Un y). v eqpoll succ(k #+ m)};  \
   576 \	~ y lepoll {v:Pow(x). v eqpoll m}; 0<k; 0<m; k:nat; m:nat  \
   576 \	~ y lepoll {v:Pow(x). v eqpoll m}; 0<k; 0<m; k:nat; m:nat  \
   577 \	|] ==> EX w:LL(t_n, succ(k), y). u:GG(t_n, succ(k), y)`w";
   577 \	|] ==> EX w:LL(t_n, succ(k), y). u:GG(t_n, succ(k), y)`w";
   578 by (forward_tac [exists_in_MM] 1 THEN REPEAT (assume_tac 1));
   578 by (forward_tac [exists_in_MM] 1 THEN REPEAT (assume_tac 1));
   579 by (eresolve_tac [bexE] 1);
   579 by (etac bexE 1);
   580 by (res_inst_tac [("x","w Int y")] bexI 1);
   580 by (res_inst_tac [("x","w Int y")] bexI 1);
   581 by (eresolve_tac [Int_in_LL] 2);
   581 by (etac Int_in_LL 2);
   582 by (rewrite_goals_tac [GG_def]);
   582 by (rewtac GG_def);
   583 by (asm_full_simp_tac (AC_ss addsimps [Int_in_LL]) 1);
   583 by (asm_full_simp_tac (AC_ss addsimps [Int_in_LL]) 1);
   584 by (eresolve_tac [unique_superset_in_MM RS the_equality2 RS ssubst] 1
   584 by (eresolve_tac [unique_superset_in_MM RS the_equality2 RS ssubst] 1
   585 	THEN (assume_tac 1));
   585 	THEN (assume_tac 1));
   586 by (REPEAT (fast_tac (AC_cs addEs [equals0D] addSEs [Int_in_LL]) 1));
   586 by (REPEAT (fast_tac (AC_cs addEs [equals0D] addSEs [Int_in_LL]) 1));
   587 val exists_in_LL = result();
   587 val exists_in_LL = result();
   609 \	t_n <= {v:Pow(x Un y). v eqpoll n};  \
   609 \	t_n <= {v:Pow(x Un y). v eqpoll n};  \
   610 \	v : LL(t_n, k, y) |]  \
   610 \	v : LL(t_n, k, y) |]  \
   611 \	==> GG(t_n, k, y) ` v <= x";
   611 \	==> GG(t_n, k, y) ` v <= x";
   612 by (asm_full_simp_tac AC_ss 1);
   612 by (asm_full_simp_tac AC_ss 1);
   613 by (forward_tac [the_in_MM_subset] 1 THEN REPEAT (assume_tac 1));
   613 by (forward_tac [the_in_MM_subset] 1 THEN REPEAT (assume_tac 1));
   614 by (dresolve_tac [in_LL_eq_Int] 1 THEN REPEAT (assume_tac 1));
   614 by (dtac in_LL_eq_Int 1 THEN REPEAT (assume_tac 1));
   615 by (resolve_tac [subsetI] 1);
   615 by (rtac subsetI 1);
   616 by (eresolve_tac [DiffE] 1);
   616 by (etac DiffE 1);
   617 by (eresolve_tac [swap] 1);
   617 by (etac swap 1);
   618 by (fast_tac (AC_cs addEs [ssubst]) 1);
   618 by (fast_tac (AC_cs addEs [ssubst]) 1);
   619 val GG_subset = result();
   619 val GG_subset = result();
   620 
   620 
   621 goal thy  
   621 goal thy  
   622 	"!!x. [| well_ord(LL(t_n, succ(k), y), S);  \
   622 	"!!x. [| well_ord(LL(t_n, succ(k), y), S);  \
   625 \	t_n <= {v:Pow(x Un y). v eqpoll succ(k #+ m)};  \
   625 \	t_n <= {v:Pow(x Un y). v eqpoll succ(k #+ m)};  \
   626 \	~ y lepoll {v:Pow(x). v eqpoll m}; 0<k; 0<m; k:nat; m:nat  \
   626 \	~ y lepoll {v:Pow(x). v eqpoll m}; 0<k; 0<m; k:nat; m:nat  \
   627 \	|] ==> (UN b<ordertype(LL(t_n, succ(k), y), S).  \
   627 \	|] ==> (UN b<ordertype(LL(t_n, succ(k), y), S).  \
   628 \	(GG(t_n, succ(k), y)) `  \
   628 \	(GG(t_n, succ(k), y)) `  \
   629 \	(converse(ordermap(LL(t_n, succ(k), y), S)) ` b)) = x";
   629 \	(converse(ordermap(LL(t_n, succ(k), y), S)) ` b)) = x";
   630 by (resolve_tac [equalityI] 1);
   630 by (rtac equalityI 1);
   631 by (resolve_tac [subsetI] 1);
   631 by (rtac subsetI 1);
   632 by (eresolve_tac [OUN_E] 1);
   632 by (etac OUN_E 1);
   633 by (eresolve_tac [GG_subset RS subsetD] 1 THEN TRYALL assume_tac);
   633 by (eresolve_tac [GG_subset RS subsetD] 1 THEN TRYALL assume_tac);
   634 by (eresolve_tac [ordermap_bij RS bij_converse_bij RS
   634 by (eresolve_tac [ordermap_bij RS bij_converse_bij RS
   635 		bij_is_fun RS apply_type] 1);
   635 		bij_is_fun RS apply_type] 1);
   636 by (eresolve_tac [ltD] 1);
   636 by (etac ltD 1);
   637 by (resolve_tac [subsetI] 1);
   637 by (rtac subsetI 1);
   638 by (eresolve_tac [exists_in_LL RS bexE] 1 THEN REPEAT (assume_tac 1));
   638 by (eresolve_tac [exists_in_LL RS bexE] 1 THEN REPEAT (assume_tac 1));
   639 by (resolve_tac [OUN_I] 1);
   639 by (rtac OUN_I 1);
   640 by (resolve_tac [Ord_ordertype RSN (2, ltI)] 1 THEN (assume_tac 2));
   640 by (resolve_tac [Ord_ordertype RSN (2, ltI)] 1 THEN (assume_tac 2));
   641 by (eresolve_tac [ordermap_type RS apply_type] 1);
   641 by (eresolve_tac [ordermap_type RS apply_type] 1);
   642 by (eresolve_tac [ordermap_bij RS bij_is_inj RS left_inverse RS ssubst] 1
   642 by (eresolve_tac [ordermap_bij RS bij_is_inj RS left_inverse RS ssubst] 1
   643 	THEN REPEAT (assume_tac 1));
   643 	THEN REPEAT (assume_tac 1));
   644 val OUN_eq_x = result();
   644 val OUN_eq_x = result();
   664 \	t_n <= {v:Pow(x Un y). v eqpoll succ(k #+ m)};  \
   664 \	t_n <= {v:Pow(x Un y). v eqpoll succ(k #+ m)};  \
   665 \	well_ord(LL(t_n, succ(k), y), S); k:nat; m:nat |]  \
   665 \	well_ord(LL(t_n, succ(k), y), S); k:nat; m:nat |]  \
   666 \	==> ALL b<ordertype(LL(t_n, succ(k), y), S).  \
   666 \	==> ALL b<ordertype(LL(t_n, succ(k), y), S).  \
   667 \	(GG(t_n, succ(k), y)) `  \
   667 \	(GG(t_n, succ(k), y)) `  \
   668 \	(converse(ordermap(LL(t_n, succ(k), y), S)) ` b) lepoll m";
   668 \	(converse(ordermap(LL(t_n, succ(k), y), S)) ` b) lepoll m";
   669 by (resolve_tac [oallI] 1);
   669 by (rtac oallI 1);
   670 by (asm_full_simp_tac (AC_ss addsimps [ltD,
   670 by (asm_full_simp_tac (AC_ss addsimps [ltD,
   671 	ordermap_bij RS bij_converse_bij RS bij_is_fun RS apply_type]) 1);
   671 	ordermap_bij RS bij_converse_bij RS bij_is_fun RS apply_type]) 1);
   672 by (resolve_tac [eqpoll_sum_imp_Diff_lepoll] 1);
   672 by (rtac eqpoll_sum_imp_Diff_lepoll 1);
   673 by (REPEAT (fast_tac (FOL_cs addSDs [ltD]
   673 by (REPEAT (fast_tac (FOL_cs addSDs [ltD]
   674 	addSIs [eqpoll_sum_imp_Diff_lepoll, in_LL_eqpoll_n]
   674 	addSIs [eqpoll_sum_imp_Diff_lepoll, in_LL_eqpoll_n]
   675 	addEs [unique_superset_in_MM RS theI RS conjunct1 RS in_MM_eqpoll_n,
   675 	addEs [unique_superset_in_MM RS theI RS conjunct1 RS in_MM_eqpoll_n,
   676 	in_LL_eq_Int RS equalityD1 RS (Int_lower1 RSN (2, subset_trans)),
   676 	in_LL_eq_Int RS equalityD1 RS (Int_lower1 RSN (2, subset_trans)),
   677 	ordermap_bij RS bij_converse_bij RS bij_is_fun RS apply_type]) 1));
   677 	ordermap_bij RS bij_converse_bij RS bij_is_fun RS apply_type]) 1));
   681 (* The main theorem AC16(n, k) ==> WO4(n-k)				  *)
   681 (* The main theorem AC16(n, k) ==> WO4(n-k)				  *)
   682 (* ********************************************************************** *)
   682 (* ********************************************************************** *)
   683 
   683 
   684 goalw thy [AC16_def,WO4_def]
   684 goalw thy [AC16_def,WO4_def]
   685 	"!!n k. [| AC16(k #+ m, k); 0 < k; 0 < m; k:nat; m:nat |] ==> WO4(m)";
   685 	"!!n k. [| AC16(k #+ m, k); 0 < k; 0 < m; k:nat; m:nat |] ==> WO4(m)";
   686 by (resolve_tac [allI] 1);
   686 by (rtac allI 1);
   687 by (excluded_middle_tac "Finite(A)" 1);
   687 by (excluded_middle_tac "Finite(A)" 1);
   688 by (resolve_tac [lemma1] 2 THEN REPEAT (assume_tac 2));
   688 by (rtac lemma1 2 THEN REPEAT (assume_tac 2));
   689 by (resolve_tac [lemma2 RS revcut_rl] 1);
   689 by (resolve_tac [lemma2 RS revcut_rl] 1);
   690 by (REPEAT (eresolve_tac [exE, conjE] 1));
   690 by (REPEAT (eresolve_tac [exE, conjE] 1));
   691 by (eres_inst_tac [("x","A Un y")] allE 1);
   691 by (eres_inst_tac [("x","A Un y")] allE 1);
   692 by (forward_tac [infinite_Un] 1 THEN (mp_tac 1));
   692 by (forward_tac [infinite_Un] 1 THEN (mp_tac 1));
   693 by (REPEAT (eresolve_tac [exE, conjE] 1));
   693 by (REPEAT (eresolve_tac [exE, conjE] 1));