diff --git a/thys/Ordinal_Partitions/Erdos_Milner.thy b/thys/Ordinal_Partitions/Erdos_Milner.thy --- a/thys/Ordinal_Partitions/Erdos_Milner.thy +++ b/thys/Ordinal_Partitions/Erdos_Milner.thy @@ -1,1309 +1,1306 @@ theory Erdos_Milner imports Partitions begin subsection \Erdős-Milner theorem\ text \P. Erdős and E. C. Milner, A Theorem in the Partition Calculus. Canadian Math. Bull. 15:4 (1972), 501-505. Corrigendum, Canadian Math. Bull. 17:2 (1974), 305.\ text \The paper defines strong types as satisfying the criteria below. It remarks that ordinals satisfy those criteria. Here is a (too complicated) proof.\ proposition strong_ordertype_eq: assumes D: "D \ elts \" and "Ord \" obtains L where "\(List.set L) = D" "\X. X \ List.set L \ indecomposable (tp X)" and "\M. \M \ D; \X. X \ List.set L \ tp (M \ X) \ tp X\ \ tp M = tp D" proof - define \ where "\ \ inv_into D (ordermap D VWF)" then have bij_\: "bij_betw \ (elts (tp D)) D" using D bij_betw_inv_into down ordermap_bij by blast have \_cancel_left: "\d. d \ D \ \ (ordermap D VWF d) = d" by (metis D \_def bij_betw_inv_into_left down_raw ordermap_bij small_iff_range total_on_VWF wf_VWF) have \_cancel_right: "\\. \ \ elts (tp D) \ ordermap D VWF (\ \) = \" by (metis \_def f_inv_into_f ordermap_surj subsetD) have "small D" "D \ ON" using assms down elts_subset_ON [of \] by auto then have \_less_iff: "\\ \. \\ \ elts (tp D); \ \ elts (tp D)\ \ \ \ < \ \ \ \ < \" by (metis ON_imp_Ord Ord_linear2 \_def inv_into_ordermap inv_ordermap_VWF_mono_le leD less_V_def) obtain \s where "List.set \s \ ON" and "\_dec \s" and tpD_eq: "tp D = \_sum \s" using Ord_ordertype \_nf_exists by blast \ \Cantor normal form of the ordertype\ have ord [simp]: "Ord (\s ! k)" "Ord (\_sum (take k \s))" if "k < length \s" for k using that \list.set \s \ ON\ by (auto simp: dual_order.trans set_take_subset elim: ON_imp_Ord) define E where "E \ \k. lift (\_sum (take k \s)) (\\(\s!k))" define L where "L \ map (\k. \ ` (elts (E k))) [0..s]" have [simp]: "length L = length \s" by (simp add: L_def) have in_elts_E_less: "x' < x" if "x' \ elts (E k')" "x \ elts (E k)" "k's" for k k' x' x \ \The ordinals have been partitioned into disjoint intervals\ proof - have ord\: "Ord (\ \ \s ! k')" using that by auto from that id_take_nth_drop [of k' "take k \s"] obtain l where "take k \s = take k' \s @ (\s!k') # l" by (simp add: min_def) then show ?thesis using that by (auto simp: E_def lift_def add.assoc dest!: OrdmemD [OF ord\] intro: less_le_trans) qed have elts_E: "elts (E k) \ elts (\_sum \s)" if "k < length \s" for k proof - have "\ \ (\s!k) \ \_sum (drop k \s)" by (metis that Cons_nth_drop_Suc \_sum_Cons add_le_cancel_left0) then have "(+) (\_sum (take k \s)) ` elts (\ \ (\s!k)) \ elts (\_sum (take k \s) + \_sum (drop k \s))" by blast also have "\ = elts (\_sum \s)" using \_sum_take_drop by auto finally show ?thesis by (simp add: lift_def E_def) qed have \_sum_in_tpD: "\_sum (take k \s) + \ \ elts (tp D)" if "\ \ elts (\ \ \s!k)" "k < length \s" for \ k using elts_E lift_def that tpD_eq by (auto simp: E_def) have Ord_\: "Ord (\ (\_sum (take k \s) + \))" if "\ \ elts (\ \ \s!k)" "k < length \s" for \ k using \_sum_in_tpD \D \ ON\ bij_\ bij_betw_imp_surj_on that by fastforce define \ where "\ \ \k. ((\y. odiff y (\_sum (take k \s))) \ ordermap D VWF)" \ \mapping the segments of @{term D} into some power of @{term \}\ have bij_\: "bij_betw (\ k) (\ ` elts (E k)) (elts (\ \ (\s!k)))" if "k < length \s" for k using that by (auto simp: bij_betw_def \_def E_def inj_on_def lift_def image_comp \_sum_in_tpD \_cancel_right that) have \_iff: "\ k x < \ k y \ (x,y) \ VWF" if "x \ \ ` elts (E k)" "y \ \ ` elts (E k)" "k < length \s" for k x y using that by (auto simp: \_def E_def lift_def \_sum_in_tpD \_cancel_right Ord_\ \_less_iff) have tp_E_eq [simp]: "tp (\ ` elts (E k)) = \\(\s!k)" if k: "k < length \s" for k using ordertype_eq_iff \_iff bij_\ that by (meson Ord_\ Ord_oexp ord(1) ordertype_VWF_eq_iff replacement small_elts) have tp_L_eq [simp]: "tp (L!k) = \\(\s!k)" if "k < length \s" for k by (simp add: L_def that) have UL_eq_D: "\ (list.set L) = D" proof (rule antisym) show "\ (list.set L) \ D" by (force simp: L_def tpD_eq bij_betw_apply [OF bij_\] dest: elts_E) show "D \ \ (list.set L)" proof fix \ assume "\ \ D" then have "ordermap D VWF \ \ elts (\_sum \s)" by (metis \small D\ ordermap_in_ordertype tpD_eq) then show "\ \ \ (list.set L)" using \\ \ D\ \_cancel_left in_elts_\_sum by (fastforce simp: L_def E_def image_iff lift_def) qed qed show thesis proof show "indecomposable (tp X)" if "X \ list.set L" for X using that by (auto simp: L_def indecomposable_\_power) next fix M assume "M \ D" and *: "\X. X \ list.set L \ tp X \ tp (M \ X)" show "tp M = tp D" proof (rule antisym) show "tp M \ tp D" by (simp add: \M \ D\ \small D\ ordertype_VWF_mono) define \ where "\ \ \X. inv_into (M \ X) (ordermap (M \ X) VWF)" \ \The bijection from an @{term \}-power into the appropriate segment of @{term M}\ have bij_\: "bij_betw (\ X) (elts (tp (M \ X))) (M \ X)" for X unfolding \_def by (metis (no_types) \M \ D\ \small D\ bij_betw_inv_into inf_le1 ordermap_bij subset_iff_less_eq_V total_on_VWF wf_VWF) have Ord_\: "Ord (\ X \)" if "\ \ elts (tp (M \ X))" for \ X using \D \ ON\ \M \ D\ bij_betw_apply [OF bij_\] that by blast have \_cancel_right: "\\ X. \ \ elts (tp (M \ X)) \ ordermap (M \ X) VWF (\ X \) = \" by (metis \_def f_inv_into_f ordermap_surj subsetD) have smM: "small (M \ X)" for X by (meson \M \ D\ \small D\ inf_le1 subset_iff_less_eq_V) then have \_less: "\X \ \. \\ < \; \ \ elts (tp (M \ X)); \ \ elts (tp (M \ X))\ \ \ X \ < \ X \" using ordermap_mono_less bij_betw_apply [OF bij_\] VWF_iff_Ord_less \_cancel_right trans_VWF wf_VWF by (metis Ord_\ Ord_linear_lt less_imp_not_less ordermap_mono_less) have "\k < length \s. \ \ elts (E k)" if \: "\ \ elts (tp D)" for \ proof - obtain X where "X \ set L" and X: "\ \ \ X" by (metis UL_eq_D \ Union_iff \_def in_mono inv_into_into ordermap_surj) then have "\k < length \s. \ \ elts (E k) \ X = \ ` elts (E k)" apply (clarsimp simp: L_def) by (metis \ \_cancel_right elts_E in_mono tpD_eq) then show ?thesis by blast qed then obtain K where K: "\\. \ \ elts (tp D) \ K \ < length \s \ \ \ elts (E (K \))" by metis \ \The index from @{term "tp D"} to the appropriate segment number\ define \ where "\ \ \d. \ (L ! K (ordermap D VWF d)) (\ (K (ordermap D VWF d)) d)" show "tp D \ tp M" proof (rule ordertype_inc_le) show "small D" "small M" using \M \ D\ \small D\ subset_iff_less_eq_V by auto next fix d' d assume xy: "d' \ D" "d \ D" and "(d',d) \ VWF" then have "d' < d" using ON_imp_Ord \D \ ON\ by auto define \' where "\' \ ordermap D VWF d'" define \ where "\ \ ordermap D VWF d" have len': "K \' < length \s" and elts': "\' \ elts (E (K \'))" and len: "K \ < length \s" and elts: "\ \ elts (E (K \))" using K \d' \ D\ \d \ D\ by (auto simp: \'_def \_def \small D\ ordermap_in_ordertype) have **: "\X w. \X \ list.set L; w \ elts (tp X)\ \ w \ elts (tp (M \ X))" using "*" by blast have Ord_\L: "Ord (\ (L!k) (\ k d))" if "d \ \ ` elts (E k)" "k < length \s" for k d by (metis "**" Ord_\ \length L = length \s\ bij_\ bij_betw_imp_surj_on imageI nth_mem that tp_L_eq) have "\' < \" by (metis \'_def \_def \d' < d\ \small D\ \_cancel_left \_less_iff ordermap_in_ordertype xy) then have "K \' \ K \" using elts' elts by (meson in_elts_E_less leI len' less_asym) then consider (less) "K \' < K \" | (equal) "K \' = K \" by linarith then have "\ (L ! K \') (\ (K \') d') < \ (L ! K \) (\ (K \) d)" proof cases case less obtain \: "\ (L ! K \') (\ (K \') d') \ M \ L ! K \'" "\ (L ! K \) (\ (K \) d) \ M \ L ! K \" using elts' elts len' len unfolding \'_def \_def by (metis "**" \length L = length \s\ \_cancel_left bij_\ bij_\ bij_betw_imp_surj_on imageI nth_mem tp_L_eq xy) then have "ordermap D VWF (\ (L ! K \') (\ (K \') d')) \ elts (E (K \'))" "ordermap D VWF (\ (L ! K \) (\ (K \) d)) \ elts (E (K \))" using len' len elts_E tpD_eq by (fastforce simp: L_def \'_def \_def \_cancel_right)+ then have "ordermap D VWF (\ (L ! K \') (\ (K \') d')) < ordermap D VWF (\ (L ! K \) (\ (K \) d))" using in_elts_E_less len less by blast moreover have "\ (L ! K \') (\ (K \') d') \ D" "\ (L ! K \) (\ (K \) d) \ D" using \M \ D\ \ by auto ultimately show ?thesis by (metis \small D\ \_cancel_left \_less_iff ordermap_in_ordertype) next case equal show ?thesis unfolding equal proof (rule \_less) show "\ (K \) d' < \ (K \) d" by (metis equal \'_def \_def \(d', d) \ VWF\ \_cancel_left \_iff elts elts' imageI len xy) have "\ (K \) d' \ elts (tp (L ! K \))" "\ (K \) d \ elts (tp (L ! K \))" using equal \_cancel_left \'_def elts' len' \_def elts len xy by (force intro: bij_betw_apply [OF bij_\])+ then show "\ (K \) d' \ elts (tp (M \ L ! K \))" "\ (K \) d \ elts (tp (M \ L ! K \))" by (simp_all add: "**" len) qed qed moreover have "Ord (\ (L ! K \') (\ (K \') d'))" using Ord_\L \'_def \_cancel_left elts' len' xy(1) by fastforce moreover have "Ord (\ (L ! K \) (\ (K \) d))" using Ord_\L \_def \_cancel_left elts len xy by fastforce ultimately show "(\ d', \ d) \ VWF" by (simp add: \_def \'_def \_def) next show "\ ` D \ M" proof (clarsimp simp: \_def) fix d assume "d \ D" define \ where "\ \ ordermap D VWF d" have len: "K \ < length \s" and elts: "\ \ elts (E (K \))" using K \d \ D\ by (auto simp: \_def \small D\ ordermap_in_ordertype) have "\ (K \) d \ elts (tp (L! (K \)))" using bij_\ [OF len] \d \ D\ apply (simp add: L_def len) by (metis \_def \_cancel_left bij_betw_imp_surj_on elts imageI) then have "\ (L! (K \)) (\ (K \) d) \ M \ (L! (K \))" using smM bij_betw_imp_surj_on [OF ordermap_bij] \length L = length \s\ unfolding \_def by (metis (no_types) "*" inv_into_into len nth_mem vsubsetD total_on_VWF wf_VWF) then show "\ (L ! K (ordermap D VWF d)) (\ (K (ordermap D VWF d)) d) \ M" using \_def by blast qed qed auto qed qed (simp add: UL_eq_D) qed text \The ``remark'' of Erdős and E. C. Milner, Canad. Math. Bull. Vol. 17 (2), 1974\ proposition indecomposable_imp_Ex_less_sets: assumes indec: "indecomposable \" and "\ > 1" and A: "tp A = \" "small A" "A \ ON" and "x \ A" and A1: "tp A1 = \" "A1 \ A" obtains A2 where "tp A2 = \" "A2 \ A1" "{x} \ A2" proof - have "Ord \" using indec indecomposable_imp_Ord by blast have "Limit \" by (simp add: assms indecomposable_imp_Limit) define \ where "\ \ inv_into A (ordermap A VWF)" then have bij_\: "bij_betw \ (elts \) A" using A bij_betw_inv_into down ordermap_bij by blast have bij_om: "bij_betw (ordermap A VWF) A (elts \)" using A down ordermap_bij by blast define \ where "\ \ ordermap A VWF x" have \: "\ \ elts \" unfolding \_def using A \x \ A\ down by auto then have "Ord \" using Ord_in_Ord \Ord \\ by blast define B where "B \ \ ` (elts (succ \))" have B: "{y \ A. ordermap A VWF y \ ordermap A VWF x} \ B" apply (clarsimp simp add: B_def \_def image_iff \_def) by (metis Ord_linear Ord_ordermap OrdmemD bij_betw_inv_into_left bij_om leD) show thesis proof have "small A1" by (meson \small A\ A1 smaller_than_small) then have "tp (A1 - B) \ tp A1" by (simp add: ordertype_VWF_mono) moreover have "tp (A1 - B) \ \" proof - have "\ (\ \ tp B)" unfolding B_def proof (subst ordertype_VWF_inc_eq) show "elts (succ \) \ ON" by (auto simp: \_def ordertype_VWF_inc_eq intro: Ord_in_Ord) have sub: "elts (succ \) \ elts \" using Ord_trans \ \Ord \\ by auto then show "\ ` elts (succ \) \ ON" using \A \ ON\ bij_\ bij_betw_imp_surj_on by blast have "succ \ \ elts \" using \ Limit_def \Limit \\ by blast with A sub show "\ u < \ v" if "u \ elts (succ \)" and "v \ elts (succ \)" and "u < v" for u v by (metis ON_imp_Ord Ord_linear2 \_def inv_into_ordermap inv_ordermap_VWF_mono_le leD subset_iff that) show "\ \ \ tp (elts (succ \))" by (metis Limit_def Ord_succ \ \Limit \\ \Ord \\ mem_not_refl ordertype_eq_Ord vsubsetD) qed auto then show ?thesis using indecomposable_ordertype_ge [OF indec, of A1 B] \small A1\ A1 by (auto simp: B_def) qed ultimately show "tp (A1 - B) = \" using A1 by blast have "{x} \ (A - B)" using assms B apply (clarsimp simp: less_sets_def \_def subset_iff) by (metis Ord_not_le VWF_iff_Ord_less less_V_def order_refl ordermap_mono_less trans_VWF wf_VWF) with \A1 \ A\ show "{x} \ (A1 - B)" by auto qed auto qed text \the main theorem, from which they derive the headline result\ theorem Erdos_Milner_aux: assumes part: "partn_lst_VWF \ [ord_of_nat k, \] 2" and indec: "indecomposable \" and "k > 1" "Ord \" and \: "\ \ elts \1" shows "partn_lst_VWF (\*\) [ord_of_nat (2*k), min \ (\*\)] 2" -proof (cases "\=1 \ \=0") +proof (cases "\\1 \ \=0") case True + have "Ord \" + using indec indecomposable_def by blast show ?thesis proof (cases "\=0") case True moreover have "min \ 0 = 0" by (simp add: min_def) ultimately show ?thesis by (simp add: partn_lst_triv0 [where i=1]) next case False - then obtain "\=1" "Ord \" - by (meson ON_imp_Ord Ord_\1 True \ elts_subset_ON) - then obtain i where "i < Suc (Suc 0)" "[ord_of_nat k, \] ! i \ \" - using partn_lst_VWF_nontriv [OF part] by auto - then have "\ \ 1" - using \\=1\ \k > 1\ by (fastforce simp: less_Suc_eq) - then have "min \ (\*\) \ 1" - by (metis Ord_1 Ord_\ Ord_linear_le Ord_mult \Ord \\ min_def order_trans) - moreover have "elts \ \ {}" - using False by auto - ultimately show ?thesis - by (auto simp: True \Ord \\ \\\0\ \\=1\ intro!: partn_lst_triv1 [where i=1]) + then consider (0) "\=0" | (1) "\=1" + by (metis Ord_0 OrdmemD True \Ord \\ mem_0_Ord one_V_def order.antisym succ_le_iff) + then show ?thesis + proof cases + case 0 + with part show ?thesis + by (force simp add: partn_lst_def nsets_empty_iff less_Suc_eq) + next + case 1 + then obtain "Ord \" + by (meson ON_imp_Ord Ord_\1 True \ elts_subset_ON) + then obtain i where "i < Suc (Suc 0)" "[ord_of_nat k, \] ! i \ \" + using partn_lst_VWF_nontriv [OF part] 1 by auto + then have "\ \ 1" + using \\=1\ \k > 1\ by (fastforce simp: less_Suc_eq) + then have "min \ (\*\) \ 1" + by (metis Ord_1 Ord_\ Ord_linear_le Ord_mult \Ord \\ min_def order_trans) + moreover have "elts \ \ {}" + using False by auto + ultimately show ?thesis + by (auto simp: True \Ord \\ \\\0\ \\=1\ intro!: partn_lst_triv1 [where i=1]) + qed qed next case False - then have "\ \ 1" "\ \ 0" - by auto - then have "0 \ elts \" - using Ord_\1 Ord_in_Ord \ mem_0_Ord by blast + then have "\ > 1" + by (meson Ord_1 Ord_not_le indec indecomposable_def) + then have "\ \ \" + by (simp add: indec indecomposable_imp_Limit omega_le_Limit) + have "0 \ elts \" + using False Ord_\1 Ord_in_Ord \ mem_0_Ord by blast + then have "\ \ 0" + by force show ?thesis - proof (cases "\=0") - case True - have \: "[ord_of_nat (2 * k), 0] ! 1 = 0" - by simp - show ?thesis - using True assms - by (force simp: partn_lst_def nsets_empty_iff simp flip: numeral_2_eq_2 dest!: less_2_cases intro: \) - next - case False - then have "\ \ \" - using indec \\ \ 1\ - by (metis Ord_\ indecomposable_is_\_power le_oexp oexp_0_right) - then have "\ > 1" - using \_gt1 dual_order.strict_trans1 by blast - show ?thesis - unfolding partn_lst_def - proof clarsimp - fix f - assume "f \ [elts (\*\)]\<^bsup>2\<^esup> \ {.. [elts (\*\)]\<^bsup>2\<^esup> \ {..<2::nat}" - by (simp add: eval_nat_numeral) - obtain ord [iff]: "Ord \" "Ord \" "Ord (\*\)" - using Ord_\1 Ord_in_Ord \ indec indecomposable_imp_Ord Ord_mult by blast - have *: False - if i [rule_format]: "\H. tp H = ord_of_nat (2*k) \ H \ elts (\*\) \ \ f ` [H]\<^bsup>2\<^esup> \ {0}" - and ii [rule_format]: "\H. tp H = \ \ H \ elts (\*\) \ \ f ` [H]\<^bsup>2\<^esup> \ {1}" - and iii [rule_format]: "\H. tp H = (\*\) \ H \ elts (\*\) \ \ f ` [H]\<^bsup>2\<^esup> \ {1}" + unfolding partn_lst_def + proof clarsimp + fix f + assume "f \ [elts (\*\)]\<^bsup>2\<^esup> \ {.. [elts (\*\)]\<^bsup>2\<^esup> \ {..<2::nat}" + by (simp add: eval_nat_numeral) + obtain ord [iff]: "Ord \" "Ord \" "Ord (\*\)" + using Ord_\1 Ord_in_Ord \ indec indecomposable_imp_Ord Ord_mult by blast + have *: False + if i [rule_format]: "\H. tp H = ord_of_nat (2*k) \ H \ elts (\*\) \ \ f ` [H]\<^bsup>2\<^esup> \ {0}" + and ii [rule_format]: "\H. tp H = \ \ H \ elts (\*\) \ \ f ` [H]\<^bsup>2\<^esup> \ {1}" + and iii [rule_format]: "\H. tp H = (\*\) \ H \ elts (\*\) \ \ f ` [H]\<^bsup>2\<^esup> \ {1}" + proof - + have Ak0: "\X \ [A]\<^bsup>k\<^esup>. f ` [X]\<^bsup>2\<^esup> \ {0}" \\remark (8) about @{term"A \ S"}\ + if A_\\: "A \ elts (\*\)" and ot: "tp A \ \" for A proof - - have Ak0: "\X \ [A]\<^bsup>k\<^esup>. f ` [X]\<^bsup>2\<^esup> \ {0}" \\remark (8) about @{term"A \ S"}\ - if A_\\: "A \ elts (\*\)" and ot: "tp A \ \" for A - proof - - let ?g = "inv_into A (ordermap A VWF)" - have "small A" - using down that by auto - then have inj_g: "inj_on ?g (elts \)" - by (meson inj_on_inv_into less_eq_V_def ordermap_surj ot subset_trans) - have Aless: "\x y. \x \ A; y \ A; x < y\ \ (x,y) \ VWF" - by (meson Ord_in_Ord VWF_iff_Ord_less \Ord(\*\)\ subsetD that(1)) - then have om_A_less: "\x y. \x \ A; y \ A; x < y\ \ ordermap A VWF x < ordermap A VWF y" - by (auto simp: \small A\ ordermap_mono_less) - have \_sub: "elts \ \ ordermap A VWF ` A" - by (metis \small A\ elts_of_set less_eq_V_def ordertype_def ot replacement) - have g: "?g \ elts \ \ elts (\ * \)" - by (meson A_\\ Pi_I' \_sub inv_into_into subset_eq) - then have fg: "f \ (\X. ?g ` X) \ [elts \]\<^bsup>2\<^esup> \ {..<2}" - by (rule nsets_compose_image_funcset [OF f _ inj_g]) + let ?g = "inv_into A (ordermap A VWF)" + have "small A" + using down that by auto + then have inj_g: "inj_on ?g (elts \)" + by (meson inj_on_inv_into less_eq_V_def ordermap_surj ot subset_trans) + have om_A_less: "\x y. \x \ A; y \ A; x < y\ \ ordermap A VWF x < ordermap A VWF y" + using ord + by (meson A_\\ Ord_in_Ord VWF_iff_Ord_less \small A\ in_mono ordermap_mono_less trans_VWF wf_VWF) + have \_sub: "elts \ \ ordermap A VWF ` A" + by (metis \small A\ elts_of_set less_eq_V_def ordertype_def ot replacement) + have g: "?g \ elts \ \ elts (\ * \)" + by (meson A_\\ Pi_I' \_sub inv_into_into subset_eq) + then have fg: "f \ (\X. ?g ` X) \ [elts \]\<^bsup>2\<^esup> \ {..<2}" + by (rule nsets_compose_image_funcset [OF f _ inj_g]) + obtain i H where "i < 2" "H \ elts \" + and ot_eq: "tp H = [k,\]!i" "(f \ (\X. ?g ` X)) ` (nsets H 2) \ {i}" + using ii partn_lst_E [OF part fg] by (auto simp: eval_nat_numeral) + then consider (0) "i=0" | (1) "i=1" + by linarith + then show ?thesis + proof cases + case 0 + then have "f ` [inv_into A (ordermap A VWF) ` H]\<^bsup>2\<^esup> \ {0}" + using ot_eq \H \ elts \\ \_sub by (auto simp: nsets_def [of _ k] inj_on_inv_into elim!: nset_image_obtains) + moreover have "finite H \ card H = k" + using 0 ot_eq \H \ elts \\ down by (simp add: finite_ordertype_eq_card) + then have "inv_into A (ordermap A VWF) ` H \ [A]\<^bsup>k\<^esup>" + using \H \ elts \\ \_sub by (auto simp: nsets_def [of _ k] card_image inj_on_inv_into inv_into_into) + ultimately show ?thesis + by blast + next + case 1 + have gH: "?g ` H \ elts (\ * \)" + by (metis A_\\ \_sub \H \ elts \\ image_subsetI inv_into_into subset_eq) have g_less: "?g x < ?g y" if "x < y" "x \ elts \" "y \ elts \" for x y - using Pi_mem [OF g] - by (meson A_\\ Ord_in_Ord Ord_not_le ord \small A\ dual_order.trans elts_subset_ON inv_ordermap_VWF_mono_le ot that vsubsetD) - obtain i H where "i < 2" "H \ elts \" - and ot_eq: "tp H = [k,\]!i" "(f \ (\X. ?g ` X)) ` (nsets H 2) \ {i}" - using ii partn_lst_E [OF part fg] by (auto simp: eval_nat_numeral) - then consider (0) "i=0" | (1) "i=1" - by linarith - then show ?thesis - proof cases - case 0 - then have "f ` [inv_into A (ordermap A VWF) ` H]\<^bsup>2\<^esup> \ {0}" - using ot_eq \H \ elts \\ \_sub by (auto simp: nsets_def [of _ k] inj_on_inv_into elim!: nset_image_obtains) - moreover have "finite H \ card H = k" - using 0 ot_eq \H \ elts \\ down by (simp add: finite_ordertype_eq_card) - then have "inv_into A (ordermap A VWF) ` H \ [A]\<^bsup>k\<^esup>" - using \H \ elts \\ \_sub by (auto simp: nsets_def [of _ k] card_image inj_on_inv_into inv_into_into) - ultimately show ?thesis - by blast - next - case 1 - have gH: "?g ` H \ elts (\ * \)" - by (metis A_\\ \_sub \H \ elts \\ image_subsetI inv_into_into subset_eq) - have [simp]: "tp (?g ` H) = tp H" - by (meson \H \ elts \\ ord down dual_order.trans elts_subset_ON gH g_less ordertype_VWF_inc_eq subsetD) - show ?thesis - using ii [of "?g ` H"] ot_eq 1 - apply (auto simp: gH elim!: nset_image_obtains) - apply (meson \H \ elts \\ inj_g bij_betw_def inj_on_subset) - done - qed + using Pi_mem [OF g] ord that + by (meson A_\\ Ord_in_Ord Ord_not_le \small A\ dual_order.trans elts_subset_ON inv_ordermap_VWF_mono_le ot vsubsetD) + have [simp]: "tp (?g ` H) = tp H" + by (meson \H \ elts \\ ord down dual_order.trans elts_subset_ON gH g_less ordertype_VWF_inc_eq subsetD) + show ?thesis + using ii [of "?g ` H"] subset_inj_on [OF inj_g \H \ elts \\] ot_eq 1 + by (auto simp: gH elim!: nset_image_obtains) qed - define K where "K \ \i x. {y \ elts (\*\). x \ y \ f{x,y} = i}" - have small_K: "small (K i x)" for i x - by (simp add: K_def) - define KI where "KI \ \i X. (\x\X. K i x)" - have KI_disj_self: "X \ KI i X = {}" for i X - by (auto simp: KI_def K_def) - define M where "M \ \D \ x. {\::V. \ \ D \ tp (K 1 x \ \ \) \ \}" - have M_sub_D: "M D \ x \ D" for D \ x - by (auto simp: M_def) - have small_M [simp]: "small (M D \ x)" if "small D" for D \ x - by (simp add: M_def that) - have 9: "tp {x \ A. tp (M D \ x) \ tp D} \ \" (is "ordertype ?AD _ \ \") - if inD: "indecomposable (tp D)" and D: "D \ elts \" and A: "A \ elts (\*\)" and tpA: "tp A = \" - and \: "\ \ D \ {X. X \ elts (\*\) \ tp X = \}" for D A \ - \\remark (9), assuming an indecomposable order type\ - proof (rule ccontr) - define A' where "A' \ {x \ A. \ tp (M D \ x) \ tp D}" - have small [iff]: "small A" "small D" - using A D down by (auto simp: M_def) - have small_\: "small (\ \)" if "\ \ D" for \ - using that \ by (auto simp: Pi_iff subset_iff_less_eq_V) - assume not_\_le: "\ \ \ tp {x \ A. tp (M D \ x) \ tp D}" - moreover - obtain "small A" "small A'" "A' \ A" and A'_sub: "A' \ elts (\ * \)" - using A'_def A down by auto - moreover have "A' = A - ?AD" - by (force simp: A'_def) - ultimately have A'_ge: "tp A' \ \" - by (metis (no_types, lifting) dual_order.refl indec indecomposable_ordertype_eq mem_Collect_eq subsetI tpA) - obtain X where "X \ A'" "finite X" "card X = k" and fX0: "f ` [X]\<^bsup>2\<^esup> \ {0}" - using Ak0 [OF A'_sub A'_ge] by (auto simp: nsets_def [of _ k]) - then have \: "\ tp (M D \ x) \ tp D" if "x \ X" for x - using that by (auto simp: A'_def) - obtain x where "x \ X" - using \card X = k\ \k>1\ by fastforce - have "\ D \ (\ x\X. M D \ x)" - proof - assume not: "D \ (\x\X. M D \ x)" - have "\X\M D \ ` X. tp D \ tp X" - proof (rule indecomposable_ordertype_finite_ge [OF inD]) - show "M D \ ` X \ {}" - using A'_def A'_ge not not_\_le by auto - show "small (\ (M D \ ` X))" - using \finite X\ by (simp add: finite_imp_small) - qed (use \finite X\ not in auto) - then show False - by (simp add: \) - qed - then obtain \ where "\ \ D" and \: "\ \ (\ x\X. M D \ x)" - by blast - define \ where "\ \ {KI 0 X \ \ \, \x\X. K 1 x \ \ \, X \ \ \}" - have \\: "X \ elts (\*\)" "\ \ \ elts (\*\)" - using A'_sub \X \ A'\ \ \\ \ D\ by auto - then have "KI 0 X \ (\x\X. K 1 x) \ X = elts (\*\)" - using \x \ X\ f by (force simp: K_def KI_def Pi_iff less_2_cases_iff) - with \\ have \\_\: "finite \" "\ \ \ \\" - by (auto simp: \_def) - then have "\ tp (K 1 x \ \ \) \ \" if "x \ X" for x - using that \\ \ D\ \ \k > 1\ \card X = k\ by (fastforce simp: M_def) - moreover have sm_K1: "small (\x\X. K 1 x \ \ \)" - by (meson Finite_V Int_lower2 \\ \ D\ \finite X\ small_\ small_UN smaller_than_small) - ultimately have not1: "\ tp (\x\X. K 1 x \ \ \) \ \" - using \finite X\ \x \ X\ indecomposable_ordertype_finite_ge [OF indec, of "(\x. K 1 x \ \ \) ` X"] by blast - moreover have "\ tp (X \ \ \) \ \" - using \finite X\ \\ \ \\ - by (meson finite_Int mem_not_refl ordertype_VWF_\ vsubsetD) - moreover have "\ \ tp (\ \)" - using \ \\ \ D\ small_\ by fastforce+ - moreover have "small (\ \)" - using \\ \ D\ small_\ by (fastforce simp: \_def intro: smaller_than_small sm_K1) - ultimately have K0\_ge: "tp (KI 0 X \ \ \) \ \" - using indecomposable_ordertype_finite_ge [OF indec \\_\] by (auto simp: \_def) - have \\: "\ \ \ elts (\ * \)" "tp (\ \) = \" - using \\ \ D\ \ by blast+ - then obtain Y where Ysub: "Y \ KI 0 X \ \ \" and "finite Y" "card Y = k" and fY0: "f ` [Y]\<^bsup>2\<^esup> \ {0}" - using Ak0 [OF _ K0\_ge] by (auto simp: nsets_def [of _ k]) - have \: "X \ Y = {}" - using Ysub KI_disj_self by blast - then have "card (X \ Y) = 2*k" - by (simp add: \card X = k\ \card Y = k\ \finite X\ \finite Y\ card_Un_disjoint) - moreover have "X \ Y \ elts (\ * \)" - using A'_sub \X \ A'\ \\(1) \Y \ KI 0 X \ \ \\ by auto - moreover have "f ` [X \ Y]\<^bsup>2\<^esup> \ {0}" - using fX0 fY0 Ysub by (auto simp: \ nsets_disjoint_2 image_Un image_UN KI_def K_def) - ultimately show False - using i \finite X\ \finite Y\ ordertype_VWF_finite_nat by auto + qed + define K where "K \ \i x. {y \ elts (\*\). x \ y \ f{x,y} = i}" + have small_K: "small (K i x)" for i x + by (simp add: K_def) + define KI where "KI \ \i X. (\x\X. K i x)" + have KI_disj_self: "X \ KI i X = {}" for i X + by (auto simp: KI_def K_def) + define M where "M \ \D \ x. {\::V. \ \ D \ tp (K 1 x \ \ \) \ \}" + have M_sub_D: "M D \ x \ D" for D \ x + by (auto simp: M_def) + have small_M [simp]: "small (M D \ x)" if "small D" for D \ x + by (simp add: M_def that) + have 9: "tp {x \ A. tp (M D \ x) \ tp D} \ \" (is "ordertype ?AD _ \ \") + if inD: "indecomposable (tp D)" and D: "D \ elts \" and A: "A \ elts (\*\)" and tpA: "tp A = \" + and \: "\ \ D \ {X. X \ elts (\*\) \ tp X = \}" for D A \ + \\remark (9), assuming an indecomposable order type\ + proof (rule ccontr) + define A' where "A' \ {x \ A. \ tp (M D \ x) \ tp D}" + have small [iff]: "small A" "small D" + using A D down by (auto simp: M_def) + have small_\: "small (\ \)" if "\ \ D" for \ + using that \ by (auto simp: Pi_iff subset_iff_less_eq_V) + assume not_\_le: "\ \ \ tp {x \ A. tp (M D \ x) \ tp D}" + moreover + obtain "small A" "small A'" "A' \ A" and A'_sub: "A' \ elts (\ * \)" + using A'_def A down by auto + moreover have "A' = A - ?AD" + by (force simp: A'_def) + ultimately have A'_ge: "tp A' \ \" + by (metis (no_types, lifting) dual_order.refl indec indecomposable_ordertype_eq mem_Collect_eq subsetI tpA) + obtain X where "X \ A'" "finite X" "card X = k" and fX0: "f ` [X]\<^bsup>2\<^esup> \ {0}" + using Ak0 [OF A'_sub A'_ge] by (auto simp: nsets_def [of _ k]) + then have \: "\ tp (M D \ x) \ tp D" if "x \ X" for x + using that by (auto simp: A'_def) + obtain x where "x \ X" + using \card X = k\ \k>1\ by fastforce + have "\ D \ (\ x\X. M D \ x)" + proof + assume not: "D \ (\x\X. M D \ x)" + have "\X\M D \ ` X. tp D \ tp X" + proof (rule indecomposable_ordertype_finite_ge [OF inD]) + show "M D \ ` X \ {}" + using A'_def A'_ge not not_\_le by auto + show "small (\ (M D \ ` X))" + using \finite X\ by (simp add: finite_imp_small) + qed (use \finite X\ not in auto) + then show False + by (simp add: \) qed - have IX: "tp {x \ A. tp (M D \ x) \ tp D} \ \" - if D: "D \ elts \" and A: "A \ elts (\*\)" and tpA: "tp A = \" - and \: "\ \ D \ {X. X \ elts (\*\) \ tp X = \}" for D A \ - \\remark (9) for any order type\ - proof - - obtain L where UL: "\(List.set L) \ D" - and indL: "\X. X \ List.set L \ indecomposable (tp X)" - and eqL: "\M. \M \ D; \X. X \ List.set L \ tp (M \ X) \ tp X\ \ tp M = tp D" - using ord by (metis strong_ordertype_eq D order_refl) - obtain A'' where A'': "A'' \ A" "tp A'' \ \" - and "\x X. \x \ A''; X \ List.set L\ \ tp (M D \ x \ X) \ tp X" - using UL indL - proof (induction L arbitrary: thesis) - case (Cons X L) - then obtain A'' where A'': "A'' \ A" "tp A'' \ \" and "X \ D" - and ge_X: "\x X. \x \ A''; X \ List.set L\ \ tp (M D \ x \ X) \ tp X" by auto - then have tp_A'': "tp A'' = \" - by (metis A antisym down ordertype_VWF_mono tpA) - have ge_\: "tp {x \ A''. tp (M X \ x) \ tp X} \ \" - by (rule 9) (use A A'' tp_A'' Cons.prems \D \ elts \\ \X \ D\ \ in auto) - let ?A = "{x \ A''. tp (M D \ x \ X) \ tp X}" - have M_eq: "M D \ x \ X = M X \ x" if "x \ A''" for x - using that \X \ D\ by (auto simp: M_def) - show thesis - proof (rule Cons.prems) - show "\ \ tp ?A" - using ge_\ by (simp add: M_eq cong: conj_cong) - show "tp Y \ tp (M D \ x \ Y)" if "x \ ?A" "Y \ list.set (X # L)" for x Y - using that ge_X by force - qed (use A'' in auto) - qed (use tpA in auto) - then have tp_M_ge: "tp (M D \ x) \ tp D" if "x \ A''" for x - using eqL that by (auto simp: M_def) - have "\ \ tp A''" - by (simp add: A'') - also have "\ \ tp {x \ A''. tp (M D \ x) \ tp D}" - by (metis (mono_tags, lifting) tp_M_ge eq_iff mem_Collect_eq subsetI) - also have "\ \ tp {x \ A. tp D \ tp (M D \ x)}" - by (rule ordertype_mono) (use A'' A down in auto) - finally show ?thesis . - qed - have [simp]: "tp {0} = 1" - using ordertype_eq_Ord by fastforce - have IX': "tp {x \ A'. tp (K 1 x \ A) \ \} \ \" - if A: "A \ elts (\*\)" "tp A = \" and A': "A' \ elts (\*\)" "tp A' = \" for A A' - proof - - have \: "\ \ tp (K 1 t \ A)" if "t \ A'" "1 \ tp {\. \ = 0 \ \ \ tp (K 1 t \ A)}" for t - using that - by (metis Collect_empty_eq less_eq_V_0_iff ordertype_empty zero_neq_one) - have "tp {x \ A'. 1 \ tp {\. \ = 0 \ \ \ tp (K 1 x \ A)}} + then obtain \ where "\ \ D" and \: "\ \ (\ x\X. M D \ x)" + by blast + define \ where "\ \ {KI 0 X \ \ \, \x\X. K 1 x \ \ \, X \ \ \}" + have \\: "X \ elts (\*\)" "\ \ \ elts (\*\)" + using A'_sub \X \ A'\ \ \\ \ D\ by auto + then have "KI 0 X \ (\x\X. K 1 x) \ X = elts (\*\)" + using \x \ X\ f by (force simp: K_def KI_def Pi_iff less_2_cases_iff) + with \\ have \\_\: "finite \" "\ \ \ \\" + by (auto simp: \_def) + then have "\ tp (K 1 x \ \ \) \ \" if "x \ X" for x + using that \\ \ D\ \ \k > 1\ \card X = k\ by (fastforce simp: M_def) + moreover have sm_K1: "small (\x\X. K 1 x \ \ \)" + by (meson Finite_V Int_lower2 \\ \ D\ \finite X\ small_\ small_UN smaller_than_small) + ultimately have not1: "\ tp (\x\X. K 1 x \ \ \) \ \" + using \finite X\ \x \ X\ indecomposable_ordertype_finite_ge [OF indec, of "(\x. K 1 x \ \ \) ` X"] by blast + moreover have "\ tp (X \ \ \) \ \" + using \finite X\ \\ \ \\ + by (meson finite_Int mem_not_refl ordertype_VWF_\ vsubsetD) + moreover have "\ \ tp (\ \)" + using \ \\ \ D\ small_\ by fastforce+ + moreover have "small (\ \)" + using \\ \ D\ small_\ by (fastforce simp: \_def intro: smaller_than_small sm_K1) + ultimately have K0\_ge: "tp (KI 0 X \ \ \) \ \" + using indecomposable_ordertype_finite_ge [OF indec \\_\] by (auto simp: \_def) + have \\: "\ \ \ elts (\ * \)" "tp (\ \) = \" + using \\ \ D\ \ by blast+ + then obtain Y where Ysub: "Y \ KI 0 X \ \ \" and "finite Y" "card Y = k" and fY0: "f ` [Y]\<^bsup>2\<^esup> \ {0}" + using Ak0 [OF _ K0\_ge] by (auto simp: nsets_def [of _ k]) + have \: "X \ Y = {}" + using Ysub KI_disj_self by blast + then have "card (X \ Y) = 2*k" + by (simp add: \card X = k\ \card Y = k\ \finite X\ \finite Y\ card_Un_disjoint) + moreover have "X \ Y \ elts (\ * \)" + using A'_sub \X \ A'\ \\(1) \Y \ KI 0 X \ \ \\ by auto + moreover have "f ` [X \ Y]\<^bsup>2\<^esup> \ {0}" + using fX0 fY0 Ysub by (auto simp: \ nsets_disjoint_2 image_Un image_UN KI_def K_def) + ultimately show False + using i \finite X\ \finite Y\ ordertype_VWF_finite_nat by auto + qed + have IX: "tp {x \ A. tp (M D \ x) \ tp D} \ \" + if D: "D \ elts \" and A: "A \ elts (\*\)" and tpA: "tp A = \" + and \: "\ \ D \ {X. X \ elts (\*\) \ tp X = \}" for D A \ + \\remark (9) for any order type\ + proof - + obtain L where UL: "\(List.set L) \ D" + and indL: "\X. X \ List.set L \ indecomposable (tp X)" + and eqL: "\M. \M \ D; \X. X \ List.set L \ tp (M \ X) \ tp X\ \ tp M = tp D" + using ord by (metis strong_ordertype_eq D order_refl) + obtain A'' where A'': "A'' \ A" "tp A'' \ \" + and "\x X. \x \ A''; X \ List.set L\ \ tp (M D \ x \ X) \ tp X" + using UL indL + proof (induction L arbitrary: thesis) + case (Cons X L) + then obtain A'' where A'': "A'' \ A" "tp A'' \ \" and "X \ D" + and ge_X: "\x X. \x \ A''; X \ List.set L\ \ tp (M D \ x \ X) \ tp X" by auto + then have tp_A'': "tp A'' = \" + by (metis A antisym down ordertype_VWF_mono tpA) + have ge_\: "tp {x \ A''. tp (M X \ x) \ tp X} \ \" + by (rule 9) (use A A'' tp_A'' Cons.prems \D \ elts \\ \X \ D\ \ in auto) + let ?A = "{x \ A''. tp (M D \ x \ X) \ tp X}" + have M_eq: "M D \ x \ X = M X \ x" if "x \ A''" for x + using that \X \ D\ by (auto simp: M_def) + show thesis + proof (rule Cons.prems) + show "\ \ tp ?A" + using ge_\ by (simp add: M_eq cong: conj_cong) + show "tp Y \ tp (M D \ x \ Y)" if "x \ ?A" "Y \ list.set (X # L)" for x Y + using that ge_X by force + qed (use A'' in auto) + qed (use tpA in auto) + then have tp_M_ge: "tp (M D \ x) \ tp D" if "x \ A''" for x + using eqL that by (auto simp: M_def) + have "\ \ tp A''" + by (simp add: A'') + also have "\ \ tp {x \ A''. tp (M D \ x) \ tp D}" + by (metis (mono_tags, lifting) tp_M_ge eq_iff mem_Collect_eq subsetI) + also have "\ \ tp {x \ A. tp D \ tp (M D \ x)}" + by (rule ordertype_mono) (use A'' A down in auto) + finally show ?thesis . + qed + have [simp]: "tp {0} = 1" + using ordertype_eq_Ord by fastforce + have IX': "tp {x \ A'. tp (K 1 x \ A) \ \} \ \" + if A: "A \ elts (\*\)" "tp A = \" and A': "A' \ elts (\*\)" "tp A' = \" for A A' + proof - + have \: "\ \ tp (K 1 t \ A)" if "t \ A'" "1 \ tp {\. \ = 0 \ \ \ tp (K 1 t \ A)}" for t + using that + by (metis Collect_empty_eq less_eq_V_0_iff ordertype_empty zero_neq_one) + have "tp {x \ A'. 1 \ tp {\. \ = 0 \ \ \ tp (K 1 x \ A)}} \ tp {x \ A'. \ \ tp (K 1 x \ A)}" - by (rule ordertype_mono) (use "\" A' in \auto simp: down\) - then show ?thesis - using IX [of "{0}" A' "\x. A"] that \0 \ elts \\ - by (simp add: M_def cong: conj_cong) + by (rule ordertype_mono) (use "\" A' in \auto simp: down\) + then show ?thesis + using IX [of "{0}" A' "\x. A"] that \0 \ elts \\ + by (simp add: M_def cong: conj_cong) + qed + + have 10: "\x0 \ A. \g \ elts \ \ elts \. strict_mono_on g (elts \) \ (\\ \ F. g \ = \) + \ (\\ \ elts \. tp (K 1 x0 \ \ (g \)) \ \)" + if F: "finite F" "F \ elts \" + and A: "A \ elts (\*\)" "tp A = \" + and \: "\ \ elts \ \ {X. X \ elts (\ * \) \ tp X = \}" + for F A \ + proof - + define p where "p \ card F" + have "\ \ F" + using that by auto + then obtain \ :: "nat \ V" where bij\: "bij_betw \ {..p} (insert \ F)" and mon\: "strict_mono_on \ {..p}" + using ZFC_Cardinals.ex_bij_betw_strict_mono_card [of "insert \ F"] elts_subset_ON \Ord \\ F + by (simp add: p_def lessThan_Suc_atMost) blast + have less_\_I: "\ k < \ l" if "k < l" "l \ p" for k l + using mon\ that by (auto simp: strict_mono_on_def) + then have less_\_D: "k < l" if "\ k < \ l" "k \ p" for k l + by (metis less_asym linorder_neqE_nat that) + have Ord_\: "Ord (\ k)" if "k \ p" for k + by (metis (no_types, lifting) ON_imp_Ord atMost_iff insert_subset mem_Collect_eq order_trans \F \ elts \\ bij\ bij_betwE elts_subset_ON \Ord \\ that) + have le_\0 [simp]: "\j. j \ p \ \ 0 \ \ j" + by (metis eq_refl leI le_0_eq less_\_I less_imp_le) + have le_\: "\ i \ \ (j - Suc 0)" if "i < j" "j \ p" for i j + proof (cases i) + case 0 then show ?thesis + using le_\0 that by auto + next + case (Suc i') then show ?thesis + by (metis (no_types, hide_lams) Suc_pred le_less less_Suc_eq less_Suc_eq_0_disj less_\_I not_less_eq that) qed - have 10: "\x0 \ A. \g \ elts \ \ elts \. strict_mono_on g (elts \) \ (\\ \ F. g \ = \) - \ (\\ \ elts \. tp (K 1 x0 \ \ (g \)) \ \)" - if F: "finite F" "F \ elts \" - and A: "A \ elts (\*\)" "tp A = \" - and \: "\ \ elts \ \ {X. X \ elts (\ * \) \ tp X = \}" - for F A \ + have [simp]: "\ p = \" proof - - define p where "p \ card F" - have "\ \ F" - using that by auto - then obtain \ :: "nat \ V" where bij\: "bij_betw \ {..p} (insert \ F)" and mon\: "strict_mono_on \ {..p}" - using ZFC_Cardinals.ex_bij_betw_strict_mono_card [of "insert \ F"] elts_subset_ON \Ord \\ F - by (simp add: p_def lessThan_Suc_atMost) blast - have less_\_I: "\ k < \ l" if "k < l" "l \ p" for k l - using mon\ that by (auto simp: strict_mono_on_def) - then have less_\_D: "k < l" if "\ k < \ l" "k \ p" for k l - by (metis less_asym linorder_neqE_nat that) - have Ord_\: "Ord (\ k)" if "k \ p" for k - by (metis (no_types, lifting) ON_imp_Ord atMost_iff insert_subset mem_Collect_eq order_trans \F \ elts \\ bij\ bij_betwE elts_subset_ON \Ord \\ that) - have le_\0 [simp]: "\j. j \ p \ \ 0 \ \ j" - by (metis eq_refl leI le_0_eq less_\_I less_imp_le) - have le_\: "\ i \ \ (j - Suc 0)" if "i < j" "j \ p" for i j - proof (cases i) - case 0 then show ?thesis - using le_\0 that by auto - next - case (Suc i') then show ?thesis - by (metis (no_types, hide_lams) Suc_pred le_less less_Suc_eq less_Suc_eq_0_disj less_\_I not_less_eq that) - qed + obtain k where k: "\ k = \" "k \ p" + by (meson atMost_iff bij\ bij_betw_iff_bijections insertI1) + then have "k = p \ k < p" + by linarith + then show ?thesis + using bij\ ord k that(2) + by (metis OrdmemD atMost_iff bij_betw_iff_bijections insert_iff leD less_\_D order_refl subsetD) + qed - have [simp]: "\ p = \" - proof - - obtain k where k: "\ k = \" "k \ p" - by (meson atMost_iff bij\ bij_betw_iff_bijections insertI1) - then have "k = p \ k < p" - by linarith - then show ?thesis - using bij\ ord k that(2) - by (metis OrdmemD atMost_iff bij_betw_iff_bijections insert_iff leD less_\_D order_refl subsetD) - qed - - have F_imp_Ex: "\k < p. \ = \ k" if "\ \ F" for \ - proof - - obtain k where k: "k \ p" "\ = \ k" - by (metis \\ \ F\ atMost_iff bij\ bij_betw_def imageE insert_iff) - then have "k \ p" - using that F by auto - with k show ?thesis - using le_neq_implies_less by blast - qed - have F_imp_ge: "\ \ \ 0" if "\ \ F" for \ - using F_imp_Ex [OF that] by (metis dual_order.order_iff_strict le0 less_\_I) - define D where "D \ \k. (if k=0 then {..<\ 0} else {\ (k-1)<..<\ k}) \ elts \" - have D\: "D k \ elts \" for k - by (auto simp: D_def) - then have small_D [simp]: "small (D k)" for k - by (meson down) - have M_Int_D: "M (elts \) \ x \ D k = M (D k) \ x" if "k \ p" for x k - using D\ by (auto simp: M_def) - have \_le_if_D: "\ k \ \" if "\ \ D (Suc k)" for \ k - using that - by (simp add: D_def order.order_iff_strict split: if_split_asm) - have "disjnt (D i) (D j)" if "i < j" "j \ p" for i j - proof (cases j) - case (Suc j') - then show ?thesis - using that - apply (auto simp: disjnt_def D_def) - using not_less_eq by (blast intro: less_\_D less_trans Suc_leD)+ - qed (use that in auto) - then have disjnt_DD: "disjnt (D i) (D j)" if "i \ j" "i \ p" "j \ p" for i j - using disjnt_sym nat_neq_iff that by auto - have UN_D_eq: "(\l \ k. D l) = {..<\ k} \ (elts \ - F)" if "k \ p" for k + have F_imp_Ex: "\k < p. \ = \ k" if "\ \ F" for \ + proof - + obtain k where k: "k \ p" "\ = \ k" + by (metis \\ \ F\ atMost_iff bij\ bij_betw_def imageE insert_iff) + then have "k \ p" + using that F by auto + with k show ?thesis + using le_neq_implies_less by blast + qed + have F_imp_ge: "\ \ \ 0" if "\ \ F" for \ + using F_imp_Ex [OF that] by (metis dual_order.order_iff_strict le0 less_\_I) + define D where "D \ \k. (if k=0 then {..<\ 0} else {\ (k-1)<..<\ k}) \ elts \" + have D\: "D k \ elts \" for k + by (auto simp: D_def) + then have small_D [simp]: "small (D k)" for k + by (meson down) + have M_Int_D: "M (elts \) \ x \ D k = M (D k) \ x" if "k \ p" for x k + using D\ by (auto simp: M_def) + have \_le_if_D: "\ k \ \" if "\ \ D (Suc k)" for \ k + using that + by (simp add: D_def order.order_iff_strict split: if_split_asm) + have "disjnt (D i) (D j)" if "i < j" "j \ p" for i j + proof (cases j) + case (Suc j') + then show ?thesis using that - proof (induction k) - case 0 - then show ?case - by (auto simp: D_def F_imp_ge leD) - next - case (Suc k) - have "D (Suc k) \ {..<\ k} \ (elts \ - F) = {..<\ (Suc k)} \ (elts \ - F)" - (is "?lhs = ?rhs") - proof - show "?lhs \ ?rhs" - using Suc.prems - by (auto simp: D_def if_split_mem2 intro: less_\_I less_trans dest!: less_\_D F_imp_Ex) - have "\x. \x < \ (Suc k); x \ elts \; x \ F; \ k \ x\ \ \ k < x" - using Suc.prems \F \ elts \\ bij\ le_imp_less_or_eq - by (fastforce simp: bij_betw_iff_bijections) - then show "?rhs \ ?lhs" - using Suc.prems by (auto simp: D_def Ord_not_less Ord_in_Ord [OF \Ord \\] Ord_\ if_split_mem2) - qed - then - show ?case - using Suc by (simp add: atMost_Suc) - qed - have \_decomp: "elts \ = F \ (\k \ p. D k)" - using \F \ elts \\ OrdmemD [OF \Ord \\] by (auto simp: UN_D_eq) - define \idx where "\idx \ \\. @k. \ \ D k \ k \ p" - have \idx: "\ \ D (\idx \) \ \idx \ \ p" if "\ \ elts \ - F" for \ - using that by (force simp: \idx_def \_decomp intro: someI_ex del: conjI) - have any_imp_\idx: "k = \idx \" if "\ \ D k" "k \ p" for k \ - proof (rule ccontr) - assume non: "k \ \idx \" - have "\ \ F" - using that UN_D_eq by auto - then show False - using disjnt_DD [OF non] by (metis D\ Diff_iff \idx disjnt_iff subsetD that) + apply (auto simp: disjnt_def D_def) + using not_less_eq by (blast intro: less_\_D less_trans Suc_leD)+ + qed (use that in auto) + then have disjnt_DD: "disjnt (D i) (D j)" if "i \ j" "i \ p" "j \ p" for i j + using disjnt_sym nat_neq_iff that by auto + have UN_D_eq: "(\l \ k. D l) = {..<\ k} \ (elts \ - F)" if "k \ p" for k + using that + proof (induction k) + case 0 + then show ?case + by (auto simp: D_def F_imp_ge leD) + next + case (Suc k) + have "D (Suc k) \ {..<\ k} \ (elts \ - F) = {..<\ (Suc k)} \ (elts \ - F)" + (is "?lhs = ?rhs") + proof + show "?lhs \ ?rhs" + using Suc.prems + by (auto simp: D_def if_split_mem2 intro: less_\_I less_trans dest!: less_\_D F_imp_Ex) + have "\x. \x < \ (Suc k); x \ elts \; x \ F; \ k \ x\ \ \ k < x" + using Suc.prems \F \ elts \\ bij\ le_imp_less_or_eq + by (fastforce simp: bij_betw_iff_bijections) + then show "?rhs \ ?lhs" + using Suc.prems by (auto simp: D_def Ord_not_less Ord_in_Ord [OF \Ord \\] Ord_\ if_split_mem2) qed - have "\A'. A' \ A \ tp A' = \ \ (\x \ A'. F \ M (elts \) \ x)" - using F - proof induction - case (insert \ F) - then obtain A' where "A' \ A" and A': "A' \ elts (\*\)" "tp A' = \" and FN: "\x. x \ A' \ F \ M (elts \) \ x" - using A(1) by auto - define A'' where "A'' \ {x \ A'. \ \ tp (K 1 x \ \ \)}" - have "\ \ elts \" "F \ elts \" - using insert by auto - note ordertype_eq_Ord [OF \Ord \\, simp] - show ?case - proof (intro exI conjI) - show "A'' \ A" - using \A' \ A\ by (auto simp: A''_def) - have "tp A'' \ \" - using \A'' \ A\ down ordertype_VWF_mono A by blast - moreover have "\ \ \ elts (\*\)" "tp (\ \) = \" - using \ \\ \ elts \\ by auto - then have "\ \ tp A''" - using IX' [OF _ _ A'] by (simp add: A''_def) - ultimately show "tp A'' = \" - by (rule antisym) - have "\ \ M (elts \) \ x" "F \ M (elts \) \ x" - if "x \ A''" for x + then + show ?case + using Suc by (simp add: atMost_Suc) + qed + have \_decomp: "elts \ = F \ (\k \ p. D k)" + using \F \ elts \\ OrdmemD [OF \Ord \\] by (auto simp: UN_D_eq) + define \idx where "\idx \ \\. @k. \ \ D k \ k \ p" + have \idx: "\ \ D (\idx \) \ \idx \ \ p" if "\ \ elts \ - F" for \ + using that by (force simp: \idx_def \_decomp intro: someI_ex del: conjI) + have any_imp_\idx: "k = \idx \" if "\ \ D k" "k \ p" for k \ + proof (rule ccontr) + assume non: "k \ \idx \" + have "\ \ F" + using that UN_D_eq by auto + then show False + using disjnt_DD [OF non] by (metis D\ Diff_iff \idx disjnt_iff subsetD that) + qed + have "\A'. A' \ A \ tp A' = \ \ (\x \ A'. F \ M (elts \) \ x)" + using F + proof induction + case (insert \ F) + then obtain A' where "A' \ A" and A': "A' \ elts (\*\)" "tp A' = \" and FN: "\x. x \ A' \ F \ M (elts \) \ x" + using A(1) by auto + define A'' where "A'' \ {x \ A'. \ \ tp (K 1 x \ \ \)}" + have "\ \ elts \" "F \ elts \" + using insert by auto + note ordertype_eq_Ord [OF \Ord \\, simp] + show ?case + proof (intro exI conjI) + show "A'' \ A" + using \A' \ A\ by (auto simp: A''_def) + have "tp A'' \ \" + using \A'' \ A\ down ordertype_VWF_mono A by blast + moreover have "\ \ \ elts (\*\)" "tp (\ \) = \" + using \ \\ \ elts \\ by auto + then have "\ \ tp A''" + using IX' [OF _ _ A'] by (simp add: A''_def) + ultimately show "tp A'' = \" + by (rule antisym) + have "\ \ M (elts \) \ x" "F \ M (elts \) \ x" + if "x \ A''" for x + proof - + show "F \ M (elts \) \ x" + using A''_def FN that by blast + show "\ \ M (elts \) \ x" + using \\ \ elts \\ that by (simp add: M_def A''_def) + qed + then show "\x\A''. insert \ F \ M (elts \) \ x" + by blast + qed + qed (use A in auto) + then obtain A' where A': "A' \ A" "tp A' = \" and FN: "\x. x \ A' \ F \ M (elts \) \ x" + by metis + have False + if *: "\x0 g. \x0 \ A; g \ elts \ \ elts \; strict_mono_on g (elts \)\ + \ (\\\F. g \ \ \) \ (\\\elts \. tp (K 1 x0 \ \ (g \)) < \)" + proof - + { fix x \ \construction of the monotone map @{term g} mentioned above\ + assume "x \ A'" + with A' have "x \ A" by blast + have "\k. k \ p \ tp (M (D k) \ x) < tp (D k)" (is "?P") + proof (rule ccontr) + assume "\ ?P" + then have le: "tp (D k) \ tp (M (D k) \ x)" if "k \ p" for k + by (meson Ord_linear2 Ord_ordertype that) + have "\f\D k \ M (D k) \ x. inj_on f (D k) \ (strict_mono_on f (D k))" + if "k \ p" for k + using le [OF that] that VWF_iff_Ord_less + apply (clarsimp simp: ordertype_le_ordertype strict_mono_on_def) + by (metis (full_types) D\ M_sub_D Ord_in_Ord PiE VWF_iff_Ord_less ord(2) subsetD) + then obtain h where fun_h: "\k. k \ p \ h k \ D k \ M (D k) \ x" + and inj_h: "\k. k \ p \ inj_on (h k) (D k)" + and mono_h: "\k x y. k \ p \ strict_mono_on (h k) (D k)" + by metis + then have fun_hD: "\k. k \ p \ h k \ D k \ D k" + by (auto simp: M_def) + have h_increasing: "\ \ h k \" + if "k \ p" and \: "\ \ D k" for k \ + proof (rule Ord_mono_imp_increasing) + show "h k \ D k \ D k" + by (simp add: fun_hD that(1)) + show "D k \ ON" + using D\ elts_subset_ON ord(2) by blast + qed (auto simp: that mono_h) + define g where "g \ \\. if \ \ F then \ else h (\idx \) \" + have [simp]: "g \ = \" if "\ \ F" for \ + using that by (auto simp: g_def) + have fun_g: "g \ elts \ \ elts \" + proof (rule Pi_I) + fix x assume "x \ elts \" + then have "x \ D (\idx x)" "\idx x \ p" if "x \ F" + using that by (auto simp: \idx) + then show "g x \ elts \" + using fun_h D\ M_sub_D \x \ elts \\ + by (simp add: g_def) blast + qed + have h_in_D: "h (\idx \) \ \ D (\idx \)" if "\ \ F" "\ \ elts \" for \ + using \idx fun_hD that by fastforce + have 1: "\ k < h (\idx \) \" + if "k < p" and \: "\ \ F" "\ \ elts \" and "\ k < \" for k \ + using that h_in_D [OF \] \idx + by (fastforce simp: D_def dest: h_increasing split: if_split_asm) + moreover have 2: "h (\idx \) \ < \ k" + if \: "\ \ F" "\ \ elts \" and "k < p" "\ < \ k" for \ k proof - - show "F \ M (elts \) \ x" - using A''_def FN that by blast - show "\ \ M (elts \) \ x" - using \\ \ elts \\ that by (simp add: M_def A''_def) + have "\idx \ \ k" + proof (rule ccontr) + assume "\ \idx \ \ k" + then have "k < \idx \" + by linarith + then show False + using \_le_if_D \idx + by (metis Diff_iff Suc_pred le0 leD le_\ le_less_trans \ \\ < \ k\) + qed + then show ?thesis + using that h_in_D [OF \] + apply (simp add: D_def split: if_split_asm) + apply (metis (no_types) dual_order.order_iff_strict le0 less_\_I less_trans) + by (metis (no_types) dual_order.order_iff_strict less_\_I less_trans) qed - then show "\x\A''. insert \ F \ M (elts \) \ x" - by blast + moreover have "h (\idx \) \ < h (\idx \) \" + if \: "\ \ F" "\ \ elts \" and \: "\ \ F" "\ \ elts \" and "\ < \" for \ \ + proof - + have le: "\idx \ \ \idx \" if "\ (\idx \ - Suc 0) < h (\idx \) \" "h (\idx \) \ < \ (\idx \)" + by (metis 2 that Diff_iff \idx \ \ \\ < \\ dual_order.strict_implies_order dual_order.strict_trans1 h_increasing leI le_\ less_asym) + have "h 0 \ < h 0 \" if "\idx \ = 0" "\idx \ = 0" + using that mono_h unfolding strict_mono_on_def + by (metis Diff_iff \idx \ \ \\ < \\) + moreover have "h 0 \ < h (\idx \) \" + if "0 < \idx \" "h 0 \ < \ 0" and "\ (\idx \ - Suc 0) < h (\idx \) \" + by (meson DiffI \idx \ le_\ le_less_trans less_le_not_le that) + moreover have "\idx \ \ 0" + if "0 < \idx \" "h 0 \ < \ 0" "\ (\idx \ - Suc 0) < h (\idx \) \" + using le le_0_eq that by fastforce + moreover have "h (\idx \) \ < h (\idx \) \" + if "\ (\idx \ - Suc 0) < h (\idx \) \" "h (\idx \) \ < \ (\idx \)" + "h (\idx \) \ < \ (\idx \)" "\ (\idx \ - Suc 0) < h (\idx \) \" + using mono_h unfolding strict_mono_on_def + by (metis le Diff_iff \idx \ \ \\ < \\ le_\ le_less le_less_trans that) + ultimately show ?thesis + using h_in_D [OF \] h_in_D [OF \] by (simp add: D_def split: if_split_asm) + qed + ultimately have sm_g: "strict_mono_on g (elts \)" + by (auto simp: g_def strict_mono_on_def dest!: F_imp_Ex) + show False + using * [OF \x \ A\ fun_g sm_g] + proof safe + fix \ + assume "\ \ elts \" and \: "tp (K 1 x \ \ (g \)) < \" + have FM: "F \ M (elts \) \ x" + by (meson FN \x \ A'\) + have False if "tp (K (Suc 0) x \ \ \) < \" "\ \ F" + using that FM by (auto simp: M_def) + moreover have False if "tp (K (Suc 0) x \ \ (g \)) < \" "\ \ D k" "k \ p" "\ \ F" for k + proof - + have "h (\idx \) \ \ M (D (\idx \)) \ x" + using fun_h \idx \\ \ elts \\ \\ \ F\ by auto + then show False + using that by (simp add: M_def g_def leD) + qed + ultimately show False + using \\ \ elts \\ \ by (force simp: \_decomp) + qed auto qed - qed (use A in auto) - then obtain A' where A': "A' \ A" "tp A' = \" and FN: "\x. x \ A' \ F \ M (elts \) \ x" + then have "\l. l \ p \ tp (M (elts \) \ x \ D l) < tp (D l)" + using M_Int_D by auto + } + then obtain l where lp: "\x. x \ A'\ l x \ p" + and lless: "\x. x \ A'\ tp (M (elts \) \ x \ D (l x)) < tp (D (l x))" by metis - have False - if *: "\x0 g. \x0 \ A; g \ elts \ \ elts \; strict_mono_on g (elts \)\ - \ (\\\F. g \ \ \) \ (\\\elts \. tp (K 1 x0 \ \ (g \)) < \)" + obtain A'' L where "A'' \ A'" and A'': "A'' \ elts (\ * \)" "tp A'' = \" and lL: "\x. x \ A'' \ l x = L" proof - - { fix x \ \construction of the monotone map @{term g} mentioned above\ - assume "x \ A'" - with A' have "x \ A" by blast - have "\k. k \ p \ tp (M (D k) \ x) < tp (D k)" (is "?P") - proof (rule ccontr) - assume "\ ?P" - then have le: "tp (D k) \ tp (M (D k) \ x)" if "k \ p" for k - by (meson Ord_linear2 Ord_ordertype that) - have "\f\D k \ M (D k) \ x. inj_on f (D k) \ (strict_mono_on f (D k))" - if "k \ p" for k - using le [OF that] that VWF_iff_Ord_less - apply (clarsimp simp: ordertype_le_ordertype strict_mono_on_def) - by (metis (full_types) D\ M_sub_D Ord_in_Ord PiE VWF_iff_Ord_less ord(2) subsetD) - then obtain h where fun_h: "\k. k \ p \ h k \ D k \ M (D k) \ x" - and inj_h: "\k. k \ p \ inj_on (h k) (D k)" - and mono_h: "\k x y. k \ p \ strict_mono_on (h k) (D k)" - by metis - then have fun_hD: "\k. k \ p \ h k \ D k \ D k" - by (auto simp: M_def) - have h_increasing: "\ \ h k \" - if "k \ p" and \: "\ \ D k" for k \ - proof (rule Ord_mono_imp_increasing) - show "h k \ D k \ D k" - by (simp add: fun_hD that(1)) - show "D k \ ON" - using D\ elts_subset_ON ord(2) by blast - qed (auto simp: that mono_h) - define g where "g \ \\. if \ \ F then \ else h (\idx \) \" - have [simp]: "g \ = \" if "\ \ F" for \ - using that by (auto simp: g_def) - have fun_g: "g \ elts \ \ elts \" - proof (rule Pi_I) - fix x assume "x \ elts \" - then have "x \ D (\idx x)" "\idx x \ p" if "x \ F" - using that by (auto simp: \idx) - then show "g x \ elts \" - using fun_h D\ M_sub_D \x \ elts \\ - by (simp add: g_def) blast - qed - have h_in_D: "h (\idx \) \ \ D (\idx \)" if "\ \ F" "\ \ elts \" for \ - using \idx fun_hD that by fastforce - have 1: "\ k < h (\idx \) \" - if "k < p" and \: "\ \ F" "\ \ elts \" and "\ k < \" for k \ - using that h_in_D [OF \] \idx - by (fastforce simp: D_def dest: h_increasing split: if_split_asm) - moreover have 2: "h (\idx \) \ < \ k" - if \: "\ \ F" "\ \ elts \" and "k < p" "\ < \ k" for \ k - proof - - have "\idx \ \ k" - proof (rule ccontr) - assume "\ \idx \ \ k" - then have "k < \idx \" - by linarith - then show False - using \_le_if_D \idx - by (metis Diff_iff Suc_pred le0 leD le_\ le_less_trans \ \\ < \ k\) - qed - then show ?thesis - using that h_in_D [OF \] - apply (simp add: D_def split: if_split_asm) - apply (metis (no_types) dual_order.order_iff_strict le0 less_\_I less_trans) - by (metis (no_types) dual_order.order_iff_strict less_\_I less_trans) - qed - moreover have "h (\idx \) \ < h (\idx \) \" - if \: "\ \ F" "\ \ elts \" and \: "\ \ F" "\ \ elts \" and "\ < \" for \ \ - proof - - have le: "\idx \ \ \idx \" if "\ (\idx \ - Suc 0) < h (\idx \) \" "h (\idx \) \ < \ (\idx \)" - by (metis 2 that Diff_iff \idx \ \ \\ < \\ dual_order.strict_implies_order dual_order.strict_trans1 h_increasing leI le_\ less_asym) - have "h 0 \ < h 0 \" if "\idx \ = 0" "\idx \ = 0" - using that mono_h unfolding strict_mono_on_def - by (metis Diff_iff \idx \ \ \\ < \\) - moreover have "h 0 \ < h (\idx \) \" - if "0 < \idx \" "h 0 \ < \ 0" and "\ (\idx \ - Suc 0) < h (\idx \) \" - by (meson DiffI \idx \ le_\ le_less_trans less_le_not_le that) - moreover have "\idx \ \ 0" - if "0 < \idx \" "h 0 \ < \ 0" "\ (\idx \ - Suc 0) < h (\idx \) \" - using le le_0_eq that by fastforce - moreover have "h (\idx \) \ < h (\idx \) \" - if "\ (\idx \ - Suc 0) < h (\idx \) \" "h (\idx \) \ < \ (\idx \)" - "h (\idx \) \ < \ (\idx \)" "\ (\idx \ - Suc 0) < h (\idx \) \" - using mono_h unfolding strict_mono_on_def - by (metis le Diff_iff \idx \ \ \\ < \\ le_\ le_less le_less_trans that) - ultimately show ?thesis - using h_in_D [OF \] h_in_D [OF \] by (simp add: D_def split: if_split_asm) - qed - ultimately have sm_g: "strict_mono_on g (elts \)" - by (auto simp: g_def strict_mono_on_def dest!: F_imp_Ex) - show False - using * [OF \x \ A\ fun_g sm_g] - proof safe - fix \ - assume "\ \ elts \" and \: "tp (K 1 x \ \ (g \)) < \" - have FM: "F \ M (elts \) \ x" - by (meson FN \x \ A'\) - have False if "tp (K (Suc 0) x \ \ \) < \" "\ \ F" - using that FM by (auto simp: M_def) - moreover have False if "tp (K (Suc 0) x \ \ (g \)) < \" "\ \ D k" "k \ p" "\ \ F" for k - proof - - have "h (\idx \) \ \ M (D (\idx \)) \ x" - using fun_h \idx \\ \ elts \\ \\ \ F\ by auto - then show False - using that by (simp add: M_def g_def leD) - qed - ultimately show False - using \\ \ elts \\ \ by (force simp: \_decomp) - qed auto - qed - then have "\l. l \ p \ tp (M (elts \) \ x \ D l) < tp (D l)" - using M_Int_D by auto - } - then obtain l where lp: "\x. x \ A'\ l x \ p" - and lless: "\x. x \ A'\ tp (M (elts \) \ x \ D (l x)) < tp (D (l x))" - by metis - obtain A'' L where "A'' \ A'" and A'': "A'' \ elts (\ * \)" "tp A'' = \" and lL: "\x. x \ A'' \ l x = L" - proof - - have eq: "A' = (\i\p. {x \ A'. l x = i})" - using lp by auto - have "\X\(\i. {x \ A'. l x = i}) ` {..p}. \ \ tp X" - proof (rule indecomposable_ordertype_finite_ge [OF indec]) - show "small (\i\p. {x \ A'. l x = i})" - by (metis A'(1) A(1) eq down smaller_than_small) - qed (use A' eq in auto) - then show thesis - proof - fix A'' - assume A'': "A'' \ (\i. {x \ A'. l x = i}) ` {..p}" and "\ \ tp A''" - then obtain L where L: "\x. x \ A'' \ l x = L" - by auto - have "A'' \ A'" - using A'' by force - then have "tp A'' \ tp A'" - by (meson A' A down order_trans ordertype_VWF_mono) - with \\ \ tp A''\ have "tp A'' = \" - using A'(2) by auto - moreover have "A'' \ elts (\ * \)" - using A' A \A'' \ A'\ by auto - ultimately show thesis - using L that [OF \A'' \ A'\] by blast - qed + have eq: "A' = (\i\p. {x \ A'. l x = i})" + using lp by auto + have "\X\(\i. {x \ A'. l x = i}) ` {..p}. \ \ tp X" + proof (rule indecomposable_ordertype_finite_ge [OF indec]) + show "small (\i\p. {x \ A'. l x = i})" + by (metis A'(1) A(1) eq down smaller_than_small) + qed (use A' eq in auto) + then show thesis + proof + fix A'' + assume A'': "A'' \ (\i. {x \ A'. l x = i}) ` {..p}" and "\ \ tp A''" + then obtain L where L: "\x. x \ A'' \ l x = L" + by auto + have "A'' \ A'" + using A'' by force + then have "tp A'' \ tp A'" + by (meson A' A down order_trans ordertype_VWF_mono) + with \\ \ tp A''\ have "tp A'' = \" + using A'(2) by auto + moreover have "A'' \ elts (\ * \)" + using A' A \A'' \ A'\ by auto + ultimately show thesis + using L that [OF \A'' \ A'\] by blast qed - have \D: "\ \ D L \ {X. X \ elts (\ * \) \ tp X = \}" - using \ D\ by blast - have "M (elts \) \ x \ D L = M (D L) \ x" for x - using D\ by (auto simp: M_def) - then have "tp (M (D L) \ x) < tp (D L)" if "x \ A''" for x - using lless that \A'' \ A'\ lL by force - then have \: "{x \ A''. tp (D L) \ tp (M (D L) \ x)} = {}" - using leD by blast - have "\ \ tp {x \ A''. tp (D L) \ tp (M (D L) \ x)}" - using IX [OF D\ A'' \D] by simp - then show False - using \\ \ 0\ by (simp add: \) qed - then show ?thesis - by (meson Ord_linear2 Ord_ordertype \Ord \\) + have \D: "\ \ D L \ {X. X \ elts (\ * \) \ tp X = \}" + using \ D\ by blast + have "M (elts \) \ x \ D L = M (D L) \ x" for x + using D\ by (auto simp: M_def) + then have "tp (M (D L) \ x) < tp (D L)" if "x \ A''" for x + using lless that \A'' \ A'\ lL by force + then have \: "{x \ A''. tp (D L) \ tp (M (D L) \ x)} = {}" + using leD by blast + have "\ \ tp {x \ A''. tp (D L) \ tp (M (D L) \ x)}" + using IX [OF D\ A'' \D] by simp + then show False + using "\" \1 < \\ by force qed - let ?U = "UNIV :: nat set" - define \ where "\ \ fst \ from_nat_into (elts \ \ ?U)" - define q where "q \ to_nat_on (elts \ \ ?U)" - have co_\U: "countable (elts \ \ ?U)" - by (simp add: \ less_\1_imp_countable) - moreover have "elts \ \ ?U \ {}" - using \0 \ elts \\ by blast - ultimately have "range (from_nat_into (elts \ \ ?U)) = (elts \ \ ?U)" - by (metis range_from_nat_into) - then have \_in_\ [simp]: "\ i \ elts \" for i - by (metis SigmaE \_def comp_apply fst_conv range_eqI) + then show ?thesis + by (meson Ord_linear2 Ord_ordertype \Ord \\) + qed + let ?U = "UNIV :: nat set" + define \ where "\ \ fst \ from_nat_into (elts \ \ ?U)" + define q where "q \ to_nat_on (elts \ \ ?U)" + have co_\U: "countable (elts \ \ ?U)" + by (simp add: \ less_\1_imp_countable) + moreover have "elts \ \ ?U \ {}" + using \0 \ elts \\ by blast + ultimately have "range (from_nat_into (elts \ \ ?U)) = (elts \ \ ?U)" + by (metis range_from_nat_into) + then have \_in_\ [simp]: "\ i \ elts \" for i + by (metis SigmaE \_def comp_apply fst_conv range_eqI) - then have Ord_\ [simp]: "Ord (\ i)" for i - using Ord_in_Ord by blast - - have inf_\U: "infinite (elts \ \ ?U)" - using \0 \ elts \\ finite_cartesian_productD2 by auto + then have Ord_\ [simp]: "Ord (\ i)" for i + using Ord_in_Ord by blast - have 11 [simp]: "\ (q (\,n)) = \" if "\ \ elts \" for \ n - by (simp add: \_def q_def that co_\U) - have range_\ [simp]: "range \ = elts \" - by (auto simp: image_iff) (metis 11) - have [simp]: "KI i {} = UNIV" "KI i (insert a X) = K i a \ KI i X" for i a X - by (auto simp: KI_def) - define \ where "\ \ \n::nat. \\ x. (\\ \ elts \. \ \ \ elts (\*\) \ tp (\ \) = \) \ x ` {.. elts (\*\) + have inf_\U: "infinite (elts \ \ ?U)" + using \0 \ elts \\ finite_cartesian_productD2 by auto + + have 11 [simp]: "\ (q (\,n)) = \" if "\ \ elts \" for \ n + by (simp add: \_def q_def that co_\U) + have range_\ [simp]: "range \ = elts \" + by (auto simp: image_iff) (metis 11) + have [simp]: "KI i {} = UNIV" "KI i (insert a X) = K i a \ KI i X" for i a X + by (auto simp: KI_def) + define \ where "\ \ \n::nat. \\ x. (\\ \ elts \. \ \ \ elts (\*\) \ tp (\ \) = \) \ x ` {.. elts (\*\) \ (\\ \ elts \. \ \) \ KI 1 (x ` {.. strict_mono_sets (elts \) \" - define \ where "\ \ \n::nat. \g \ \' xn. g \ elts \ \ elts \ \ strict_mono_on g (elts \) \ (\i\n. g (\ i) = \ i) + define \ where "\ \ \n::nat. \g \ \' xn. g \ elts \ \ elts \ \ strict_mono_on g (elts \) \ (\i\n. g (\ i) = \ i) \ (\\ \ elts \. \' \ \ K 1 xn \ \ (g \)) \ {xn} \ (\' (\ n)) \ xn \ \ (\ n)" - let ?\0 = "\\. plus (\ * \) ` elts \" - have base: "\ 0 ?\0 x" for x - by (auto simp: \_def add_mult_less add_mult_less_add_mult ordertype_image_plus strict_mono_sets_def less_sets_def) - have step: "Ex (\(g,\',xn). \ n g \ \' xn \ \ (Suc n) \' (x(n:=xn)))" if "\ n \ x" for n \ x - proof - - have \: "\\. \ \ elts \ \ \ \ \ elts (\ * \) \ tp (\ \) = \" - and x: "x ` {.. elts (\ * \)" - and sub: "\ (\ ` elts \) \ KI (Suc 0) (x ` {..) \" - using that by (auto simp: \_def) - have \\: "\ ` {..n} \ elts \" and \sub: "\ (\ n) \ elts (\ * \)" - by (auto simp: \) - have \fun: "\ \ elts \ \ {X. X \ elts (\ * \) \ tp X = \}" - by (simp add: \) - then obtain xn g where xn: "xn \ \ (\ n)" and g: "g \ elts \ \ elts \" - and sm_g: "strict_mono_on g (elts \)" and g_\: "\\ \ \`{..n}. g \ = \" - and g_\: "\\ \ elts \. \ \ tp (K 1 xn \ \ (g \))" - using 10 [OF _ \\ \sub _ \fun] by (auto simp: \) - have tp1: "tp (K 1 xn \ \ (g \)) = \" if "\ \ elts \" for \ - proof (rule antisym) - have "tp (K 1 xn \ \ (g \)) \ tp (\ (g \))" - proof (rule ordertype_VWF_mono) - show "small (\ (g \))" - by (metis PiE \ down g that) - qed auto - also have "\ = \" - using \ g that by force - finally show "tp (K 1 xn \ \ (g \)) \ \" . - qed (use that g_\ in auto) - have tp2: "tp (\ (\ n)) = \" - by (auto simp: \) - obtain "small (\ (\ n))" "\ (\ n) \ ON" - by (meson \sub ord down elts_subset_ON subset_trans) - then obtain A2 where A2: "tp A2 = \" "A2 \ K 1 xn \ \ (\ n)" "{xn} \ A2" - using indecomposable_imp_Ex_less_sets [OF indec \\ > 1\ tp2] - by (metis \_in_\ atMost_iff image_eqI inf_le2 le_refl xn tp1 g_\) - then have A2_sub: "A2 \ \ (\ n)" by simp - let ?\ = "\\. if \ = \ n then A2 else K 1 xn \ \ (g \)" - have [simp]: "({.. {x. x \ n}) = ({.. (\x\elts \ \ {\. \ \ \ n}. \ (g x)) \ KI (Suc 0) (x ` {.. KI (Suc 0) (x ` {.. elts (\ * \)" - using \sub sub A2 by fastforce+ - moreover have "xn \ elts (\ * \)" - using \sub xn by blast - moreover have "strict_mono_sets (elts \) ?\" - using sm sm_g g g_\ A2_sub - unfolding strict_mono_sets_def strict_mono_on_def less_sets_def Pi_iff subset_iff Ball_def Bex_def image_iff - by (simp (no_asm_use) add: if_split_mem2) (smt order_refl) - ultimately have "\ (Suc n) ?\ (x(n := xn))" - using tp1 x A2 by (auto simp: \_def K_def) - with A2 show ?thesis - by (rule_tac x="(g,?\,xn)" in exI) (simp add: \_def g sm_g g_\ xn) - qed - define G where "G \ \n \ x. @(g,\',x'). \xn. \ n g \ \' xn \ x' = (x(n:=xn)) \ \ (Suc n) \' x'" - have G\: "(\(g,\',x'). \ (Suc n) \' x') (G n \ x)" - and G\: "(\(g,\',x'). \ n g \ \' (x' n)) (G n \ x)" if "\ n \ x" for n \ x - using step [OF that] by (force simp: G_def dest: some_eq_imp)+ - define H where "H \ rec_nat (id,?\0,undefined) (\n (g0,\,x0). G n \ x0)" - have H_Suc: "H (Suc n) = (case H n of (g0, xa, xb) \ G n xa xb)" for n - by (simp add: H_def) - have "(\(g,\,x). \ n \ x) (H n)" for n - proof (induction n) - case 0 show ?case - by (simp add: H_def base) - next - case (Suc n) then show ?case - using G\ by (fastforce simp: H_Suc) + let ?\0 = "\\. plus (\ * \) ` elts \" + have base: "\ 0 ?\0 x" for x + by (auto simp: \_def add_mult_less add_mult_less_add_mult ordertype_image_plus strict_mono_sets_def less_sets_def) + have step: "Ex (\(g,\',xn). \ n g \ \' xn \ \ (Suc n) \' (x(n:=xn)))" if "\ n \ x" for n \ x + proof - + have \: "\\. \ \ elts \ \ \ \ \ elts (\ * \) \ tp (\ \) = \" + and x: "x ` {.. elts (\ * \)" + and sub: "\ (\ ` elts \) \ KI (Suc 0) (x ` {..) \" + using that by (auto simp: \_def) + have \\: "\ ` {..n} \ elts \" and \sub: "\ (\ n) \ elts (\ * \)" + by (auto simp: \) + have \fun: "\ \ elts \ \ {X. X \ elts (\ * \) \ tp X = \}" + by (simp add: \) + then obtain xn g where xn: "xn \ \ (\ n)" and g: "g \ elts \ \ elts \" + and sm_g: "strict_mono_on g (elts \)" and g_\: "\\ \ \`{..n}. g \ = \" + and g_\: "\\ \ elts \. \ \ tp (K 1 xn \ \ (g \))" + using 10 [OF _ \\ \sub _ \fun] by (auto simp: \) + have tp1: "tp (K 1 xn \ \ (g \)) = \" if "\ \ elts \" for \ + proof (rule antisym) + have "tp (K 1 xn \ \ (g \)) \ tp (\ (g \))" + proof (rule ordertype_VWF_mono) + show "small (\ (g \))" + by (metis PiE \ down g that) + qed auto + also have "\ = \" + using \ g that by force + finally show "tp (K 1 xn \ \ (g \)) \ \" . + qed (use that g_\ in auto) + have tp2: "tp (\ (\ n)) = \" + by (auto simp: \) + obtain "small (\ (\ n))" "\ (\ n) \ ON" + by (meson \sub ord down elts_subset_ON subset_trans) + then obtain A2 where A2: "tp A2 = \" "A2 \ K 1 xn \ \ (\ n)" "{xn} \ A2" + using indecomposable_imp_Ex_less_sets [OF indec \\ > 1\ tp2] + by (metis \_in_\ atMost_iff image_eqI inf_le2 le_refl xn tp1 g_\) + then have A2_sub: "A2 \ \ (\ n)" by simp + let ?\ = "\\. if \ = \ n then A2 else K 1 xn \ \ (g \)" + have [simp]: "({.. {x. x \ n}) = ({.. (\x\elts \ \ {\. \ \ \ n}. \ (g x)) \ KI (Suc 0) (x ` {.. KI (Suc 0) (x ` {.. elts (\ * \)" + using \sub sub A2 by fastforce+ + moreover have "xn \ elts (\ * \)" + using \sub xn by blast + moreover have "strict_mono_sets (elts \) ?\" + using sm sm_g g g_\ A2_sub + unfolding strict_mono_sets_def strict_mono_on_def less_sets_def Pi_iff subset_iff Ball_def Bex_def image_iff + by (simp (no_asm_use) add: if_split_mem2) (smt order_refl) + ultimately have "\ (Suc n) ?\ (x(n := xn))" + using tp1 x A2 by (auto simp: \_def K_def) + with A2 show ?thesis + by (rule_tac x="(g,?\,xn)" in exI) (simp add: \_def g sm_g g_\ xn) + qed + define G where "G \ \n \ x. @(g,\',x'). \xn. \ n g \ \' xn \ x' = (x(n:=xn)) \ \ (Suc n) \' x'" + have G\: "(\(g,\',x'). \ (Suc n) \' x') (G n \ x)" + and G\: "(\(g,\',x'). \ n g \ \' (x' n)) (G n \ x)" if "\ n \ x" for n \ x + using step [OF that] by (force simp: G_def dest: some_eq_imp)+ + define H where "H \ rec_nat (id,?\0,undefined) (\n (g0,\,x0). G n \ x0)" + have H_Suc: "H (Suc n) = (case H n of (g0, xa, xb) \ G n xa xb)" for n + by (simp add: H_def) + have "(\(g,\,x). \ n \ x) (H n)" for n + proof (induction n) + case 0 show ?case + by (simp add: H_def base) + next + case (Suc n) then show ?case + using G\ by (fastforce simp: H_Suc) + qed + then have H_imp_\: "\ n \ x" if "H n = (g,\,x)" for g \ x n + by (metis case_prodD that) + then have H_imp_\: "(\(g,\',x'). let (g0,\,x) = H n in \ n g \ \' (x' n)) (H (Suc n))" for n + using G\ by (fastforce simp: H_Suc split: prod.split) + define g where "g \ \n. (\(g,\,x). g) (H (Suc n))" + have g: "g n \ elts \ \ elts \" and sm_g: "strict_mono_on (g n) (elts \)" + and 13: "\i. i\n \ g n (\ i) = \ i" for n + using H_imp_\ [of n] by (auto simp: g_def \_def) + define \ where "\ \ \n. (\(g,\,x). \) (H n)" + define x where "x \ \n. (\(g,\,x). x n) (H (Suc n))" + have 14: "\ (Suc n) \ \ K 1 (x n) \ \ n (g n \)" if "\ \ elts \" for \ n + using H_imp_\ [of n] that by (force simp: \_def \_def x_def g_def) + then have x14: "\ (Suc n) \ \ \ n (g n \)" if "\ \ elts \" for \ n + using that by blast + have 15: "x n \ \ n (\ n)" and 16: "{x n} \ (\ (Suc n) (\ n))" for n + using H_imp_\ [of n] by (force simp: \_def \_def x_def)+ + have \_\\: "\ n \ \ elts (\ * \)" if "\ \ elts \" for \ n + using H_imp_\ [of n] that by (auto simp: \_def \_def split: prod.split) + have 12: "strict_mono_sets (elts \) (\ n)" for n + using H_imp_\ [of n] that by (auto simp: \_def \_def split: prod.split) + have tp_\: "tp (\ n \) = \" if "\ \ elts \" for \ n + using H_imp_\ [of n] that by (auto simp: \_def \_def split: prod.split) + let ?Z = "range x" + have S_dec: "\ (\ (m+k) ` elts \) \ \ (\ m ` elts \)" for k m + by (induction k) (use 14 g in \fastforce+\) + have "x n \ K 1 (x m)" if "m (\\ \ elts \. \ n \)" + by (meson "15" UN_I \_in_\) + also have "\ \ (\\ \ elts \. \ (Suc m) \)" + using S_dec [of "Suc m"] less_iff_Suc_add that by auto + also have "\ \ K 1 (x m)" + using 14 by auto + finally show ?thesis . + qed + then have "f{x m, x n} = 1" if "m2\<^esup> \ {1}" + by (clarsimp simp: nsets_2_eq) (metis insert_commute less_linear) + moreover have Z_sub: "?Z \ elts (\ * \)" + using "15" \_\\ \_in_\ by blast + moreover have "tp ?Z \ \ * \" + proof - + define \ where "\ \ \i j x. wfrec (measure (\k. j-k)) (\\ k. if k (Suc k)) else x) i" + have \: "\ i j x = (if i (Suc i) j x) else x)" for i j x + by (simp add: \_def wfrec cut_apply) + have 17: "\ k j (\ i) = \ i" if "i \ k" for i j k + using wf_measure [of "\k. j-k"] that + by (induction k rule: wf_induct_rule) (simp add: "13" \ le_imp_less_Suc) + have \_in_\: "\ i j \ \ elts \" if "\ \ elts \" for i j \ + using wf_measure [of "\k. j-k"] that + proof (induction i rule: wf_induct_rule) + case (less i) + with g show ?case by (force simp: \ [of i]) qed - then have H_imp_\: "\ n \ x" if "H n = (g,\,x)" for g \ x n - by (metis case_prodD that) - then have H_imp_\: "(\(g,\',x'). let (g0,\,x) = H n in \ n g \ \' (x' n)) (H (Suc n))" for n - using G\ by (fastforce simp: H_Suc split: prod.split) - define g where "g \ \n. (\(g,\,x). g) (H (Suc n))" - have g: "g n \ elts \ \ elts \" and sm_g: "strict_mono_on (g n) (elts \)" - and 13: "\i. i\n \ g n (\ i) = \ i" for n - using H_imp_\ [of n] by (auto simp: g_def \_def) - define \ where "\ \ \n. (\(g,\,x). \) (H n)" - define x where "x \ \n. (\(g,\,x). x n) (H (Suc n))" - have 14: "\ (Suc n) \ \ K 1 (x n) \ \ n (g n \)" if "\ \ elts \" for \ n - using H_imp_\ [of n] that by (force simp: \_def \_def x_def g_def) - then have x14: "\ (Suc n) \ \ \ n (g n \)" if "\ \ elts \" for \ n - using that by blast - have 15: "x n \ \ n (\ n)" and 16: "{x n} \ (\ (Suc n) (\ n))" for n - using H_imp_\ [of n] by (force simp: \_def \_def x_def)+ - have \_\\: "\ n \ \ elts (\ * \)" if "\ \ elts \" for \ n - using H_imp_\ [of n] that by (auto simp: \_def \_def split: prod.split) - have 12: "strict_mono_sets (elts \) (\ n)" for n - using H_imp_\ [of n] that by (auto simp: \_def \_def split: prod.split) - have tp_\: "tp (\ n \) = \" if "\ \ elts \" for \ n - using H_imp_\ [of n] that by (auto simp: \_def \_def split: prod.split) - let ?Z = "range x" - have S_dec: "\ (\ (m+k) ` elts \) \ \ (\ m ` elts \)" for k m - by (induction k) (use 14 g in \fastforce+\) - have "x n \ K 1 (x m)" if "m (\\ \ elts \. \ n \)" - by (meson "15" UN_I \_in_\) - also have "\ \ (\\ \ elts \. \ (Suc m) \)" - using S_dec [of "Suc m"] less_iff_Suc_add that by auto - also have "\ \ K 1 (x m)" - using 14 by auto - finally show ?thesis . + then have \_fun: "\ i j \ elts \ \ elts \" for i j + by simp + have sm_\: "strict_mono_on (\ i j) (elts \)" for i j + using wf_measure [of "\k. j-k"] + proof (induction i rule: wf_induct_rule) + case (less i) + with sm_g show ?case + by (auto simp: \ [of i] strict_mono_on_def \_in_\) qed - then have "f{x m, x n} = 1" if "m2\<^esup> \ {1}" - by (clarsimp simp: nsets_2_eq) (metis insert_commute less_linear) - moreover have Z_sub: "?Z \ elts (\ * \)" - using "15" \_\\ \_in_\ by blast - moreover have "tp ?Z \ \ * \" - proof - - define \ where "\ \ \i j x. wfrec (measure (\k. j-k)) (\\ k. if k (Suc k)) else x) i" - have \: "\ i j x = (if i (Suc i) j x) else x)" for i j x - by (simp add: \_def wfrec cut_apply) - have 17: "\ k j (\ i) = \ i" if "i \ k" for i j k - using wf_measure [of "\k. j-k"] that - by (induction k rule: wf_induct_rule) (simp add: "13" \ le_imp_less_Suc) - have \_in_\: "\ i j \ \ elts \" if "\ \ elts \" for i j \ - using wf_measure [of "\k. j-k"] that - proof (induction i rule: wf_induct_rule) - case (less i) - with g show ?case by (force simp: \ [of i]) - qed - then have \_fun: "\ i j \ elts \ \ elts \" for i j - by simp - have sm_\: "strict_mono_on (\ i j) (elts \)" for i j - using wf_measure [of "\k. j-k"] - proof (induction i rule: wf_induct_rule) - case (less i) - with sm_g show ?case - by (auto simp: \ [of i] strict_mono_on_def \_in_\) - qed - have *: "\ j (\ j) \ \ i (\ i j (\ j))" if "i < j" for i j - using wf_measure [of "\k. j-k"] that - proof (induction i rule: wf_induct_rule) - case (less i) - then have "j - Suc i < j - i" - by (metis (no_types) Suc_diff_Suc lessI) - with less \_in_\ show ?case - by (simp add: \ [of i]) (metis 17 Suc_lessI \_in_\ order_refl order_trans x14) + have *: "\ j (\ j) \ \ i (\ i j (\ j))" if "i < j" for i j + using wf_measure [of "\k. j-k"] that + proof (induction i rule: wf_induct_rule) + case (less i) + then have "j - Suc i < j - i" + by (metis (no_types) Suc_diff_Suc lessI) + with less \_in_\ show ?case + by (simp add: \ [of i]) (metis 17 Suc_lessI \_in_\ order_refl order_trans x14) + qed + have le: "\ i j (\ j) \ \ i \ \ j \ \ i" for i j + using sm_\ unfolding strict_mono_on_def + by (metis "17" Ord_in_Ord Ord_linear2 \_in_\ leD le_refl less_V_def \Ord \\) + then have less: "\ i j (\ j) < \ i \ \ j < \ i" for i j + by (metis (no_types, lifting) "17" \_in_\ less_V_def order_refl sm_\ strict_mono_on_def) + have eq: "\ i j (\ j) = \ i \ \ j = \ i" for i j + by (metis eq_refl le less less_le) + have 18: "\ m (\ m) \ \ n (\ n) \ \ m < \ n" for m n + proof (cases n m rule: linorder_cases) + case less + show ?thesis + proof (intro iffI) + assume "\ m (\ m) \ \ n (\ n)" + moreover + have "\ \ m (\ m) \ \ n (\ n)" if "\ n = \ m" + by (metis "*" "15" eq less less_V_def less_sets_def less_sets_weaken2 that) + moreover + have "\ \ m (\ m) \ \ n (\ n)" if "\ n < \ m" + using that 12 15 * [OF less] + apply (clarsimp simp: less_sets_def strict_mono_sets_def) + by (metis Ord_in_Ord Ord_linear2 \_in_\ \_in_\ \Ord \\ le leD less_asym subsetD) + ultimately show "\ m < \ n" + by (meson Ord_in_Ord Ord_linear_lt \_in_\ \Ord \\) + next + assume "\ m < \ n" + then have "\ n (\ n m (\ m)) \ \ n (\ n)" + by (metis "12" \_in_\ \_in_\ eq le less_V_def strict_mono_sets_def) + then show "\ m (\ m) \ \ n (\ n)" + by (meson *[OF less] less_sets_weaken1) qed - have le: "\ i j (\ j) \ \ i \ \ j \ \ i" for i j - using sm_\ unfolding strict_mono_on_def - by (metis "17" Ord_in_Ord Ord_linear2 \_in_\ leD le_refl less_V_def \Ord \\) - then have less: "\ i j (\ j) < \ i \ \ j < \ i" for i j - by (metis (no_types, lifting) "17" \_in_\ less_V_def order_refl sm_\ strict_mono_on_def) - have eq: "\ i j (\ j) = \ i \ \ j = \ i" for i j - by (metis eq_refl le less less_le) - have 18: "\ m (\ m) \ \ n (\ n) \ \ m < \ n" for m n - proof (cases n m rule: linorder_cases) - case less - show ?thesis - proof (intro iffI) - assume "\ m (\ m) \ \ n (\ n)" - moreover - have "\ \ m (\ m) \ \ n (\ n)" if "\ n = \ m" - by (metis "*" "15" eq less less_V_def less_sets_def less_sets_weaken2 that) - moreover - have "\ \ m (\ m) \ \ n (\ n)" if "\ n < \ m" - using that 12 15 * [OF less] - apply (clarsimp simp: less_sets_def strict_mono_sets_def) - by (metis Ord_in_Ord Ord_linear2 \_in_\ \_in_\ \Ord \\ le leD less_asym subsetD) - ultimately show "\ m < \ n" - by (meson Ord_in_Ord Ord_linear_lt \_in_\ \Ord \\) - next - assume "\ m < \ n" - then have "\ n (\ n m (\ m)) \ \ n (\ n)" - by (metis "12" \_in_\ \_in_\ eq le less_V_def strict_mono_sets_def) - then show "\ m (\ m) \ \ n (\ n)" - by (meson *[OF less] less_sets_weaken1) - qed - next - case equal - with 15 show ?thesis by auto + next + case equal + with 15 show ?thesis by auto + next + case greater + show ?thesis + proof (intro iffI) + assume "\ m (\ m) \ \ n (\ n)" + moreover + have "\ \ m (\ m) \ \ n (\ n)" if "\ n = \ m" + by (metis "*" "15" disjnt_iff eq greater in_mono less_sets_imp_disjnt that) + moreover + have "\ \ m (\ m) \ \ n (\ n)" if "\ n < \ m" + using that 12 15 * [OF greater] + apply (clarsimp simp: less_sets_def strict_mono_sets_def) + by (meson \_in_\ \_in_\ in_mono less less_asym) + ultimately show "\ m < \ n" + by (meson Ord_\ Ord_linear_lt) next - case greater - show ?thesis - proof (intro iffI) - assume "\ m (\ m) \ \ n (\ n)" - moreover - have "\ \ m (\ m) \ \ n (\ n)" if "\ n = \ m" - by (metis "*" "15" disjnt_iff eq greater in_mono less_sets_imp_disjnt that) - moreover - have "\ \ m (\ m) \ \ n (\ n)" if "\ n < \ m" - using that 12 15 * [OF greater] - apply (clarsimp simp: less_sets_def strict_mono_sets_def) - by (meson \_in_\ \_in_\ in_mono less less_asym) - ultimately show "\ m < \ n" - by (meson Ord_\ Ord_linear_lt) - next - assume "\ m < \ n" - then have "\ m (\ m) \ (\ m (\ m n (\ n)))" - by (meson 12 Ord_in_Ord Ord_linear2 \_in_\ \_in_\ le leD ord(2) strict_mono_sets_def) - then show "\ m (\ m) \ \ n (\ n)" - by (meson "*" greater less_sets_weaken2) - qed - qed - have \_increasing_\: "\ n (\ n) \ \ m (\ m)" if "m \ n" "\ m = \ n" for m n - by (metis "*" "17" dual_order.order_iff_strict that) - moreover have INF: "infinite {n. n \ m \ \ m = \ n}" for m - proof - - have "infinite (range (\n. q (\ m, n)))" - unfolding q_def - using to_nat_on_infinite [OF co_\U inf_\U] finite_image_iff - by (simp add: finite_image_iff inj_on_def) - moreover have "(range (\n. q (\ m, n))) \ {n. \ m = \ n}" - using 11 [of "\ m"] by auto - ultimately have "infinite {n. \ m = \ n}" - using finite_subset by auto - then have "infinite ({n. \ m = \ n} - {.. n" "\ p = \ n" "\ m = \ n" "n < p" - with 16 [of n] show "x n < x p" - by (simp add: less_sets_def) (metis "*" "15" "17" Suc_lessI le_SucI subsetD) - qed - then have inj_x: "inj_on x (?eqv m)" for m - using strict_mono_on_imp_inj_on by blast - define ZA where "ZA \ \m. ?Z \ \ m (\ m)" - have small_ZA [simp]: "small (ZA m)" for m - by (metis ZA_def inf_le1 small_image_nat smaller_than_small) - have 19: "tp (ZA m) \ \" for m - proof - - have "x ` {n. m \ n \ \ m = \ n} \ ZA m" - unfolding ZA_def using "15" \_increasing_\ by blast - then have "infinite (ZA m)" - using INF [of m] finite_image_iff [OF inj_x] by (meson finite_subset) - then show ?thesis - by (simp add: ordertype_infinite_ge_\) - qed - have "\f \ elts \ \ ZA m. strict_mono_on f (elts \)" for m - proof - - obtain Z where "Z \ ZA m" "tp Z = \" - by (meson 19 Ord_\ le_ordertype_obtains_subset small_ZA) - moreover have "ZA m \ ON" - using Ord_in_Ord \_\\ \_in_\ unfolding ZA_def by blast - ultimately show ?thesis - by (metis strict_mono_on_ordertype Pi_mono small_ZA smaller_than_small subset_iff) - qed - then obtain \ where \: "\m. \ m \ elts \ \ ZA m" - and sm_\: "\m. strict_mono_on (\ m) (elts \)" - by metis - have "Ex(\(m,\). \ \ elts \ \ \ = \ * \ + ord_of_nat m)" if "\ \ elts (\ * \)" for \ - using that by (auto simp: mult [of \ \] lift_def elts_\) - then obtain split where split: "\\. \ \ elts (\ * \) \ - (\(m,\). \ \ elts \ \ \ = \ * \ + ord_of_nat m)(split \)" - by meson - have split_eq [simp]: "split (\ * \ + ord_of_nat m) = (m,\)" if "\ \ elts \" for \ m - proof - - have [simp]: "\ * \ + ord_of_nat m = \ * \ + ord_of_nat n \ \ = \ \ n = m" if "\ \ elts \" for \ n - by (metis Ord_\ that Ord_mem_iff_less_TC mult_cancellation_lemma ord_of_nat_\ ord_of_nat_inject) - show ?thesis - using split [of "\*\ + m"] that by (auto simp: mult [of \ \] lift_def cong: conj_cong) - qed - define \ where "\ \ \\. (\(m,\). \ (q(\,0)) m)(split \)" - have \_Pi: "\ \ elts (\ * \) \ (\m. ZA m)" - using \ by (fastforce simp: \_def mult [of \ \] lift_def elts_\) - moreover have "(\m. ZA m) \ ON" - unfolding ZA_def using \_\\ \_in_\ elts_subset_ON by blast - ultimately have Ord_\_Pi: "\ \ elts (\ * \) \ ON" - by fastforce - show "tp ?Z \ \ * \" - proof - - have \: "(\m. ZA m) = ?Z" - using "15" by (force simp: ZA_def) - moreover - have "tp (elts (\ * \)) \ tp (\m. ZA m)" - proof (rule ordertype_inc_le) - show "\ ` elts (\ * \) \ (\m. ZA m)" - using \_Pi by blast - next - fix u v - assume x: "u \ elts (\ * \)" and y: "v \ elts (\ * \)" and "(u,v) \ VWF" - then have "u Ord_in_Ord Ord_mult VWF_iff_Ord_less ord(2)) - moreover - obtain m \ n \ where ueq: "u = \ * \ + ord_of_nat m" and \: "\ \ elts \" - and veq: "v = \ * \ + ord_of_nat n" and \: "\ \ elts \" - using x y by (auto simp: mult [of \ \] lift_def elts_\) - ultimately have "\ \ \" - by (meson Ord_\ Ord_in_Ord Ord_linear2 \Ord \\ add_mult_less_add_mult less_asym ord_of_nat_\) - consider (eq) "\ = \" | (lt) "\ < \" - using \\ \ \\ le_neq_trans by blast - then have "\ u < \ v" - proof cases - case eq - then have "m < n" - using ueq veq \u by simp - then have "\ (q (\, 0)) m < \ (q (\, 0)) n" - using sm_\ strict_mono_onD by blast - then show ?thesis - using eq ueq veq \ \m < n\ by (simp add: \_def) - next - case lt - have "\ (q(\,0)) m \ \ (q(\,0)) (\(q(\,0)))" "\ (q (\,0)) n \ \ (q(\,0)) (\(q(\,0)))" - using \ unfolding ZA_def by blast+ - then show ?thesis - using lt ueq veq \ \ 18 [of "q(\,0)" "q(\,0)"] - by (simp add: \_def less_sets_def) - qed - then show "(\ u, \ v) \ VWF" - using \_Pi - by (metis Ord_\_Pi PiE VWF_iff_Ord_less x y mem_Collect_eq) - qed (use \ in auto) - ultimately show ?thesis by simp + assume "\ m < \ n" + then have "\ m (\ m) \ (\ m (\ m n (\ n)))" + by (meson 12 Ord_in_Ord Ord_linear2 \_in_\ \_in_\ le leD ord(2) strict_mono_sets_def) + then show "\ m (\ m) \ \ n (\ n)" + by (meson "*" greater less_sets_weaken2) qed qed - then obtain Z where "Z \ ?Z" "tp Z = \ * \" - by (meson Ord_\ Ord_mult ord Z_sub down le_ordertype_obtains_subset) - ultimately show False - using iii [of Z] by (meson dual_order.trans image_mono nsets_mono) + have \_increasing_\: "\ n (\ n) \ \ m (\ m)" if "m \ n" "\ m = \ n" for m n + by (metis "*" "17" dual_order.order_iff_strict that) + moreover have INF: "infinite {n. n \ m \ \ m = \ n}" for m + proof - + have "infinite (range (\n. q (\ m, n)))" + unfolding q_def + using to_nat_on_infinite [OF co_\U inf_\U] finite_image_iff + by (simp add: finite_image_iff inj_on_def) + moreover have "(range (\n. q (\ m, n))) \ {n. \ m = \ n}" + using 11 [of "\ m"] by auto + ultimately have "infinite {n. \ m = \ n}" + using finite_subset by auto + then have "infinite ({n. \ m = \ n} - {.. n" "\ p = \ n" "\ m = \ n" "n < p" + with 16 [of n] show "x n < x p" + by (simp add: less_sets_def) (metis "*" "15" "17" Suc_lessI le_SucI subsetD) + qed + then have inj_x: "inj_on x (?eqv m)" for m + using strict_mono_on_imp_inj_on by blast + define ZA where "ZA \ \m. ?Z \ \ m (\ m)" + have small_ZA [simp]: "small (ZA m)" for m + by (metis ZA_def inf_le1 small_image_nat smaller_than_small) + have 19: "tp (ZA m) \ \" for m + proof - + have "x ` {n. m \ n \ \ m = \ n} \ ZA m" + unfolding ZA_def using "15" \_increasing_\ by blast + then have "infinite (ZA m)" + using INF [of m] finite_image_iff [OF inj_x] by (meson finite_subset) + then show ?thesis + by (simp add: ordertype_infinite_ge_\) + qed + have "\f \ elts \ \ ZA m. strict_mono_on f (elts \)" for m + proof - + obtain Z where "Z \ ZA m" "tp Z = \" + by (meson 19 Ord_\ le_ordertype_obtains_subset small_ZA) + moreover have "ZA m \ ON" + using Ord_in_Ord \_\\ \_in_\ unfolding ZA_def by blast + ultimately show ?thesis + by (metis strict_mono_on_ordertype Pi_mono small_ZA smaller_than_small subset_iff) + qed + then obtain \ where \: "\m. \ m \ elts \ \ ZA m" + and sm_\: "\m. strict_mono_on (\ m) (elts \)" + by metis + have "Ex(\(m,\). \ \ elts \ \ \ = \ * \ + ord_of_nat m)" if "\ \ elts (\ * \)" for \ + using that by (auto simp: mult [of \ \] lift_def elts_\) + then obtain split where split: "\\. \ \ elts (\ * \) \ + (\(m,\). \ \ elts \ \ \ = \ * \ + ord_of_nat m)(split \)" + by meson + have split_eq [simp]: "split (\ * \ + ord_of_nat m) = (m,\)" if "\ \ elts \" for \ m + proof - + have [simp]: "\ * \ + ord_of_nat m = \ * \ + ord_of_nat n \ \ = \ \ n = m" if "\ \ elts \" for \ n + by (metis Ord_\ that Ord_mem_iff_less_TC mult_cancellation_lemma ord_of_nat_\ ord_of_nat_inject) + show ?thesis + using split [of "\*\ + m"] that by (auto simp: mult [of \ \] lift_def cong: conj_cong) + qed + define \ where "\ \ \\. (\(m,\). \ (q(\,0)) m)(split \)" + have \_Pi: "\ \ elts (\ * \) \ (\m. ZA m)" + using \ by (fastforce simp: \_def mult [of \ \] lift_def elts_\) + moreover have "(\m. ZA m) \ ON" + unfolding ZA_def using \_\\ \_in_\ elts_subset_ON by blast + ultimately have Ord_\_Pi: "\ \ elts (\ * \) \ ON" + by fastforce + show "tp ?Z \ \ * \" + proof - + have \: "(\m. ZA m) = ?Z" + using "15" by (force simp: ZA_def) + moreover + have "tp (elts (\ * \)) \ tp (\m. ZA m)" + proof (rule ordertype_inc_le) + show "\ ` elts (\ * \) \ (\m. ZA m)" + using \_Pi by blast + next + fix u v + assume x: "u \ elts (\ * \)" and y: "v \ elts (\ * \)" and "(u,v) \ VWF" + then have "u Ord_in_Ord Ord_mult VWF_iff_Ord_less ord(2)) + moreover + obtain m \ n \ where ueq: "u = \ * \ + ord_of_nat m" and \: "\ \ elts \" + and veq: "v = \ * \ + ord_of_nat n" and \: "\ \ elts \" + using x y by (auto simp: mult [of \ \] lift_def elts_\) + ultimately have "\ \ \" + by (meson Ord_\ Ord_in_Ord Ord_linear2 \Ord \\ add_mult_less_add_mult less_asym ord_of_nat_\) + consider (eq) "\ = \" | (lt) "\ < \" + using \\ \ \\ le_neq_trans by blast + then have "\ u < \ v" + proof cases + case eq + then have "m < n" + using ueq veq \u by simp + then have "\ (q (\, 0)) m < \ (q (\, 0)) n" + using sm_\ strict_mono_onD by blast + then show ?thesis + using eq ueq veq \ \m < n\ by (simp add: \_def) + next + case lt + have "\ (q(\,0)) m \ \ (q(\,0)) (\(q(\,0)))" "\ (q (\,0)) n \ \ (q(\,0)) (\(q(\,0)))" + using \ unfolding ZA_def by blast+ + then show ?thesis + using lt ueq veq \ \ 18 [of "q(\,0)" "q(\,0)"] + by (simp add: \_def less_sets_def) + qed + then show "(\ u, \ v) \ VWF" + using \_Pi + by (metis Ord_\_Pi PiE VWF_iff_Ord_less x y mem_Collect_eq) + qed (use \ in auto) + ultimately show ?thesis by simp + qed qed - have False - if 0: "\H. tp H = ord_of_nat (2*k) \ H \ elts (\*\) \ \ f ` [H]\<^bsup>2\<^esup> \ {0}" - and 1: "\H. tp H = min \ (\ * \) \ H \ elts (\*\) \ \ f ` [H]\<^bsup>2\<^esup> \ {1}" - proof (cases "\*\ \ \") - case True - then have \: "\H'\H. tp H' = \ * \" if "tp H = \" "small H" for H - by (metis Ord_\ Ord_\1 Ord_in_Ord Ord_mult \ le_ordertype_obtains_subset that) - have [simp]: "min \ (\*\) = \*\" - by (simp add: min_absorb2 that True) - then show ?thesis - using * [OF 0] 1 True - by simp (meson \ down image_mono nsets_mono subset_trans) - next - case False - then have \: "\H'\H. tp H' = \" if "tp H = \ * \" "small H" for H - by (metis Ord_linear_le Ord_ordertype \Ord \\ le_ordertype_obtains_subset that) - then have "\ \ \*\" - by (meson Ord_\ Ord_\1 Ord_in_Ord Ord_linear_le Ord_mult \ \Ord \\ False) - then have [simp]: "min \ (\*\) = \" - by (simp add: min_absorb1) - then show ?thesis - using * [OF 0] 1 False - by simp (meson \ down image_mono nsets_mono subset_trans) - qed - then show "\iH\elts (\*\). tp H = [ord_of_nat (2*k), min \ (\*\)] ! i \ f ` [H]\<^bsup>2\<^esup> \ {i}" - by force + then obtain Z where "Z \ ?Z" "tp Z = \ * \" + by (meson Ord_\ Ord_mult ord Z_sub down le_ordertype_obtains_subset) + ultimately show False + using iii [of Z] by (meson dual_order.trans image_mono nsets_mono) qed + have False + if 0: "\H. tp H = ord_of_nat (2*k) \ H \ elts (\*\) \ \ f ` [H]\<^bsup>2\<^esup> \ {0}" + and 1: "\H. tp H = min \ (\ * \) \ H \ elts (\*\) \ \ f ` [H]\<^bsup>2\<^esup> \ {1}" + proof (cases "\*\ \ \") + case True + then have \: "\H'\H. tp H' = \ * \" if "tp H = \" "small H" for H + by (metis Ord_\ Ord_\1 Ord_in_Ord Ord_mult \ le_ordertype_obtains_subset that) + have [simp]: "min \ (\*\) = \*\" + by (simp add: min_absorb2 that True) + then show ?thesis + using * [OF 0] 1 True + by simp (meson \ down image_mono nsets_mono subset_trans) + next + case False + then have \: "\H'\H. tp H' = \" if "tp H = \ * \" "small H" for H + by (metis Ord_linear_le Ord_ordertype \Ord \\ le_ordertype_obtains_subset that) + then have "\ \ \*\" + by (meson Ord_\ Ord_\1 Ord_in_Ord Ord_linear_le Ord_mult \ \Ord \\ False) + then have [simp]: "min \ (\*\) = \" + by (simp add: min_absorb1) + then show ?thesis + using * [OF 0] 1 False + by simp (meson \ down image_mono nsets_mono subset_trans) + qed + then show "\iH\elts (\*\). tp H = [ord_of_nat (2*k), min \ (\*\)] ! i \ f ` [H]\<^bsup>2\<^esup> \ {i}" + by force qed qed theorem Erdos_Milner: assumes \: "\ \ elts \1" shows "partn_lst_VWF (\\(1 + \ * n)) [ord_of_nat (2^n), \\(1+\)] 2" proof (induction n) case 0 then show ?case using partn_lst_VWF_degenerate [of 1 2] by simp next case (Suc n) have "Ord \" using Ord_\1 Ord_in_Ord assms by blast have "1+\ \ \+1" by (simp add: \Ord \\ one_V_def plus_Ord_le) then have [simp]: "min (\ \ (1 + \)) (\ * \ \ \) = \ \ (1+\)" by (simp add: \Ord \\ oexp_add min_def) have ind: "indecomposable (\ \ (1 + \ * ord_of_nat n))" by (simp add: \Ord \\ indecomposable_\_power) show ?case proof (cases "n = 0") case True then show ?thesis using partn_lst_VWF_\_2 \Ord \\ one_V_def by auto next case False then have "Suc 0 < 2 ^ n" using less_2_cases not_less_eq by fastforce then have "partn_lst_VWF (\ \ (1 + \ * n) * \ \ \) [ord_of_nat (2 * 2 ^ n), \ \ (1 + \)] 2" using Erdos_Milner_aux [OF Suc ind, where \ = "\\\"] \Ord \\ \ by (auto simp: countable_oexp) then show ?thesis using \Ord \\ by (simp add: mult_succ mult.assoc oexp_add) qed qed corollary remark_3: "partn_lst_VWF (\\(Suc(4*k))) [4, \\(Suc(2*k))] 2" using Erdos_Milner [of "2*k" 2] apply (simp flip: ord_of_nat_mult ord_of_nat.simps) by (simp add: one_V_def) text \Theorem 3.2 of Jean A. Larson, ibid.\ corollary Theorem_3_2: fixes k n::nat shows "partn_lst_VWF (\\(n*k)) [\\n, ord_of_nat k] 2" proof (cases "n=0 \ k=0") case True then show ?thesis by (auto intro: partn_lst_triv0 [where i=1] partn_lst_triv1 [where i=0]) next case False then have "n > 0" "k > 0" by auto have PV: "partn_lst_VWF (\ \ (1 + ord_of_nat (n-1) * ord_of_nat (k-1))) [ord_of_nat (2 ^ (k-1)), \ \ (1 + ord_of_nat (n-1))] 2" using Erdos_Milner [of "ord_of_nat (n-1)" "k-1"] Ord_\1 Ord_mem_iff_lt less_imp_le by blast have "k+n \ Suc (Suc(k-1) * Suc(n-1))" by simp also have "\ \ Suc (k * n)" using False by auto finally have "1 + (n - 1) * (k - 1) \ n*k" using False by (auto simp: algebra_simps) then have "(1 + ord_of_nat (n - 1) * ord_of_nat (k - 1)) \ ord_of_nat(n*k)" by (metis (mono_tags, lifting) One_nat_def one_V_def ord_of_nat.simps ord_of_nat_add ord_of_nat_mono_iff ord_of_nat_mult) then have x: "\ \ (1 + ord_of_nat (n - 1) * ord_of_nat (k - 1)) \ \\(n*k)" by (simp add: oexp_mono_le) then have "partn_lst_VWF (\\(n*k)) [\ \ (1 + ord_of_nat (n-1)), ord_of_nat (2 ^ (k-1))] 2" by (metis PV partn_lst_two_swap Partitions.partn_lst_greater_resource less_eq_V_def) moreover have "(1 + ord_of_nat (n-1)) = n" using ord_of_minus_1 [OF \n > 0\] by (simp add: one_V_def) ultimately have "partn_lst_VWF (\\(n*k)) [\ \ n, ord_of_nat (2 ^ (k-1))] 2" by simp then show ?thesis using power_gt_expt [of 2 "k-1"] by (force simp: less_Suc_eq intro: partn_lst_less) qed end