# HG changeset patch # User paulson # Date 1709045856 0 # Node ID d11cee9c3a7c24959ddaf4c14989ca250e3ad7b3 # Parent 6dbe7910dcfc72cd8b63b90b391335f33bd88024 Some new material about Ramsey's theorem, also sharpening the proof to deliver the Erdős–Szekeres upper bound on Ramsey numbers diff -r 6dbe7910dcfc -r d11cee9c3a7c src/HOL/Library/Ramsey.thy --- a/src/HOL/Library/Ramsey.thy Tue Feb 27 10:49:48 2024 +0100 +++ b/src/HOL/Library/Ramsey.thy Tue Feb 27 14:57:36 2024 +0000 @@ -5,7 +5,7 @@ section \Ramsey's Theorem\ theory Ramsey - imports Infinite_Set FuncSet + imports Infinite_Set Equipollence FuncSet begin subsection \Preliminary definitions\ @@ -194,7 +194,7 @@ assumes "g \ S \ T" and "inj_on g S" shows "(\X. g ` X) \ [S]\<^bsup>k\<^esup> \ [T]\<^bsup>k\<^esup>" using assms - by (fastforce simp add: nsets_def card_image inj_on_subset subset_iff simp flip: image_subset_iff_funcset) + by (fastforce simp: nsets_def card_image inj_on_subset subset_iff simp flip: image_subset_iff_funcset) lemma nsets_compose_image_funcset: assumes f: "f \ [T]\<^bsup>k\<^esup> \ D" and "g \ S \ T" and "inj_on g S" @@ -206,14 +206,84 @@ using f by fastforce qed +subsubsection \Further properties, involving equipollence\ + +lemma nsets_lepoll_cong: + assumes "A \ B" + shows "[A]\<^bsup>k\<^esup> \ [B]\<^bsup>k\<^esup>" +proof - + obtain f where f: "inj_on f A" "f ` A \ B" + by (meson assms lepoll_def) + define F where "F \ \N. f ` N" + have "inj_on F ([A]\<^bsup>k\<^esup>)" + using F_def f inj_on_nsets by blast + moreover + have "F ` ([A]\<^bsup>k\<^esup>) \ [B]\<^bsup>k\<^esup>" + by (metis F_def bij_betw_def bij_betw_nsets f nsets_mono) + ultimately show ?thesis + by (meson lepoll_def) +qed + +lemma nsets_eqpoll_cong: + assumes "A\B" + shows "[A]\<^bsup>k\<^esup> \ [B]\<^bsup>k\<^esup>" + by (meson assms eqpoll_imp_lepoll eqpoll_sym lepoll_antisym nsets_lepoll_cong) + +lemma infinite_imp_infinite_nsets: + assumes inf: "infinite A" and "k>0" + shows "infinite ([A]\<^bsup>k\<^esup>)" +proof - + obtain B where "B \ A" "A\B" + by (meson inf infinite_iff_psubset) + then obtain a where a: "a \ A" "a \ B" + by blast + then obtain N where "N \ B" "finite N" "card N = k-1" "a \ N" + by (metis \A \ B\ inf eqpoll_finite_iff infinite_arbitrarily_large subset_eq) + with a \k>0\ \B \ A\ have "insert a N \ [A]\<^bsup>k\<^esup>" + by (simp add: nsets_def) + with a have "nsets B k \ nsets A k" + by (metis (no_types, lifting) in_mono insertI1 mem_Collect_eq nsets_def) + moreover have "nsets B k \ nsets A k" + using \B \ A\ nsets_mono by auto + ultimately show ?thesis + unfolding infinite_iff_psubset_le + by (meson \A \ B\ eqpoll_imp_lepoll nsets_eqpoll_cong psubsetI) +qed + +lemma finite_nsets_iff: + assumes "k>0" + shows "finite ([A]\<^bsup>k\<^esup>) \ finite A" + using assms finite_imp_finite_nsets infinite_imp_infinite_nsets by blast + +lemma card_nsets [simp]: "card (nsets A k) = card A choose k" +proof (cases "finite A") + case True + then show ?thesis + by (metis bij_betw_nsets bij_betw_same_card binomial_eq_nsets ex_bij_betw_nat_finite) +next + case False + then show ?thesis + by (cases "k=0"; simp add: finite_nsets_iff) +qed + subsubsection \Partition predicates\ +definition "monochromatic \ \\ \ \ f i. \H \ nsets \ \. f ` (nsets H \) \ {i}" + +text \uniform partition sizes\ definition partn :: "'a set \ nat \ nat \ 'b set \ bool" - where "partn \ \ \ \ \ \f \ nsets \ \ \ \. \H \ nsets \ \. \\\\. f ` (nsets H \) \ {\}" + where "partn \ \ \ \ \ \f \ nsets \ \ \ \. \\\\. monochromatic \ \ \ f \" +text \partition sizes enumerated in a list\ definition partn_lst :: "'a set \ nat list \ nat \ bool" - where "partn_lst \ \ \ \ \f \ nsets \ \ \ {..}. - \i < length \. \H \ nsets \ (\!i). f ` (nsets H \) \ {i}" + where "partn_lst \ \ \ \ \f \ nsets \ \ \ {..}. \i < length \. monochromatic \ (\!i) \ f i" + +text \There's always a 0-clique\ +lemma partn_lst_0: "\ > 0 \ partn_lst \ (0#\) \" + by (force simp: partn_lst_def monochromatic_def nsets_empty_iff) + +lemma partn_lst_0': "\ > 0 \ partn_lst \ (a#0#\) \" + by (force simp: partn_lst_def monochromatic_def nsets_empty_iff) lemma partn_lst_greater_resource: fixes M::nat @@ -225,11 +295,11 @@ then have "f \ nsets {.. \ {..}" by (meson Pi_anti_mono \M \ N\ lessThan_subset_iff nsets_mono subsetD) then obtain i H where i: "i < length \" and H: "H \ nsets {.. ! i)" and subi: "f ` nsets H \ \ {i}" - using M partn_lst_def by blast + using M unfolding partn_lst_def monochromatic_def by blast have "H \ nsets {.. ! i)" using \M \ N\ H by (auto simp: nsets_def subset_iff) - then show "\i. \H\nsets {.. ! i). f ` nsets H \ \ {i}" - using i subi by blast + then show "\i. monochromatic {..!i) \ f i" + using i subi unfolding monochromatic_def by blast qed lemma partn_lst_fewer_colours: @@ -242,8 +312,8 @@ and H: "H \ [\]\<^bsup>((n # \) ! i)\<^esup>" and hom: "\x\[H]\<^bsup>\\<^esup>. Suc (f x) = i" using \n \ \\ major [unfolded partn_lst_def, rule_format, of "Suc o f"] - by (fastforce simp: image_subset_iff nsets_eq_empty_iff) - show "\i. \H\nsets \ (\ ! i). f ` [H]\<^bsup>\\<^esup> \ {i}" + by (fastforce simp: image_subset_iff nsets_eq_empty_iff monochromatic_def) + show "\i. monochromatic \ (\!i) \ f i" proof (cases i) case 0 then have "[H]\<^bsup>\\<^esup> = {}" @@ -254,7 +324,7 @@ next case (Suc i') then show ?thesis - using i H hom by auto + unfolding monochromatic_def using i H hom by auto qed qed @@ -265,7 +335,7 @@ lemma partn_lstE: assumes "partn_lst \ \ \" "f \ nsets \ \ \ {.. = l" obtains i H where "i < length \" "H \ nsets \ (\!i)" "f ` (nsets H \) \ {i}" - using partn_lst_def assms by blast + using partn_lst_def monochromatic_def assms by metis lemma partn_lst_less: assumes M: "partn_lst \ \ n" and eq: "length \' = length \" @@ -277,13 +347,14 @@ then obtain i H where i: "i < length \" and "H \ \" and H: "card H = (\!i)" and "finite H" and fi: "f ` nsets H n \ {i}" - using assms by (auto simp: partn_lst_def nsets_def) + using assms by (auto simp: partn_lst_def monochromatic_def nsets_def) then obtain bij where bij: "bij_betw bij H {0..<\!i}" by (metis ex_bij_betw_finite_nat) then have inj: "inj_on (inv_into H bij) {0..<\' ! i}" by (metis bij_betw_def dual_order.refl i inj_on_inv_into ivl_subset le) define H' where "H' = inv_into H bij ` {0..<\'!i}" - show "\i'. \H\[\]\<^bsup>(\' ! i)\<^esup>. f ` [H]\<^bsup>n\<^esup> \ {i}" + show "\i'. monochromatic \ (\'!i) n f i" + unfolding monochromatic_def proof (intro exI bexI conjI) show "i < length \'" by (simp add: assms(2) i) @@ -306,51 +377,298 @@ text \ To distinguish the finite and infinite ones, lower and upper case - names are used. + names are used (ramsey vs Ramsey). \ +subsubsection \The Erdős--Szekeres theorem exhibits an upper bound for Ramsey numbers\ + +text \The Erdős--Szekeres bound, essentially extracted from the proof\ +fun ES :: "[nat,nat,nat] \ nat" + where "ES 0 k l = max k l" + | "ES (Suc r) k l = + (if r=0 then k+l-1 + else if k=0 \ l=0 then 1 else Suc (ES r (ES (Suc r) (k-1) l) (ES (Suc r) k (l-1))))" + +declare ES.simps [simp del] + +lemma ES_0 [simp]: "ES 0 k l = max k l" + using ES.simps(1) by blast + +lemma ES_1 [simp]: "ES 1 k l = k+l-1" + using ES.simps(2) [of 0 k l] by simp + +lemma ES_2: "ES 2 k l = (if k=0 \ l=0 then 1 else ES 2 (k-1) l + ES 2 k (l-1))" + unfolding numeral_2_eq_2 + by (smt (verit) ES.elims One_nat_def Suc_pred add_gr_0 neq0_conv nat.inject zero_less_Suc) + +text \The Erdős--Szekeres upper bound\ +lemma ES2_choose: "ES 2 k l = (k+l) choose k" +proof (induct n \ "k+l" arbitrary: k l) + case 0 + then show ?case + by (auto simp: ES_2) +next + case (Suc n) + then have "k>0 \ l>0 \ ES 2 (k - 1) l + ES 2 k (l - 1) = k + l choose k" + using choose_reduce_nat by force + then show ?case + by (metis ES_2 Nat.add_0_right binomial_n_0 binomial_n_n gr0I) +qed + subsubsection \Trivial cases\ text \Vacuous, since we are dealing with 0-sets!\ lemma ramsey0: "\N::nat. partn_lst {..Just the pigeon hole principle, since we are dealing with 1-sets\ -lemma ramsey1: "\N::nat. partn_lst {..iH\nsets {.. {i}" - if "f \ nsets {.. {..iH\nsets {.. {i}" + if "f \ nsets {.. {.. \i. {q. q \ q0+q1 \ f {q} = i}" - have "A 0 \ A 1 = {..q0 + q1}" + define A where "A \ \i. {q. q < q0+q1-1 \ f {q} = i}" + have "A 0 \ A 1 = {.. A 1 = {}" by (auto simp: A_def) - ultimately have "q0 + q1 \ card (A 0) + card (A 1)" - by (metis card_Un_le card_atMost eq_imp_le le_SucI le_trans) + ultimately have "q0 + q1 \ card (A 0) + card (A 1) + 1" + by (metis card_Un_le card_lessThan le_diff_conv) then consider "card (A 0) \ q0" | "card (A 1) \ q1" by linarith then obtain i where "i < Suc (Suc 0)" "card (A i) \ [q0, q1] ! i" by (metis One_nat_def lessI nth_Cons_0 nth_Cons_Suc zero_less_Suc) then obtain B where "B \ A i" "card B = [q0, q1] ! i" "finite B" by (meson obtain_subset_with_card_n) - then have "B \ nsets {.. f ` nsets B (Suc 0) \ {i}" + then have "B \ nsets {.. f ` nsets B (Suc 0) \ {i}" by (auto simp: A_def nsets_def card_1_singleton_iff) then show ?thesis using \i < Suc (Suc 0)\ by auto qed then show ?thesis - by (clarsimp simp: partn_lst_def) blast + by (simp add: partn_lst_def monochromatic_def) qed +lemma ramsey1: "\N::nat. partn_lst {..Ramsey's theorem with two colours and arbitrary exponents (hypergraph version)\ +subsubsection \Ramsey's theorem with TWO colours and arbitrary exponents (hypergraph version)\ -proposition ramsey2_full: "\N::nat. partn_lst {..0" "q2>0" + shows "partn_lst {..iH\nsets {..p} ([q1,q2] ! i). f ` nsets H (Suc r) \ {i}" + if f: "f \ nsets {..p} (Suc r) \ {.. \R. f (insert p R)" + have "f (insert p i) \ {.. nsets {.. nsets {.. {.. {i}" + and U: "U \ nsets {.. {.. nsets {.. nsets {..p} n" if "X \ nsets {.. \R. f (u ` R)" + have "h \ nsets {.. {.. {j}" + and V: "V \ nsets {.. {.. u ` {.. nsets {.. nsets {.. nsets {..p} q1" + unfolding nsets_def using \q1 > 0\ card_insert_if by fastforce + have invu_nsets: "inv_into {.. nsets V r" + if "X \ nsets (u ` V) r" for X r + proof - + have "X \ u ` V \ finite X \ card X = r" + using nsets_def that by auto + then have [simp]: "card (inv_into {.. nsets ?W (Suc r)" for X + proof (cases "p \ X") + case True + then have Xp: "X - {p} \ nsets (u ` V) r" + using X by (auto simp: nsets_def) + moreover have "u ` V \ U" + using Vsub bij_betwE u by blast + ultimately have "X - {p} \ nsets U r" + by (meson in_mono nsets_mono) + then have "g (X - {p}) = i" + using gi by blast + have "f X = i" + using gi True \X - {p} \ nsets U r\ insert_Diff + by (fastforce simp: g_def image_subset_iff) + then show ?thesis + by (simp add: \f X = i\ \g (X - {p}) = i\) + next + case False + then have Xim: "X \ nsets (u ` V) (Suc r)" + using X by (auto simp: nsets_def subset_insert) + then have "u ` inv_into {.. nsets {..p} q1" + by (simp add: izero inq1) + ultimately show ?thesis + by (metis izero image_subsetI insertI1 nth_Cons_0 zero_less_Suc) + next + case jone + then have "u ` V \ nsets {..p} q2" + using V u_nsets by auto + moreover have "f ` nsets (u ` V) (Suc r) \ {j}" + using hj + by (force simp: h_def image_subset_iff nsets_def subset_image_inj card_image dest: finite_imageD) + ultimately show ?thesis + using jone not_less_eq by fastforce + qed + next + case ione + then have "U \ nsets {.. nsets {..p} n" if "X \ nsets {.. \R. f (u ` R)" + have "h \ nsets {.. {.. {j}" + and V: "V \ nsets {.. {.. u ` {.. nsets {.. nsets {.. nsets {..p} q2" + unfolding nsets_def using \q2 > 0\ card_insert_if by fastforce + have invu_nsets: "inv_into {.. nsets V r" + if "X \ nsets (u ` V) r" for X r + proof - + have "X \ u ` V \ finite X \ card X = r" + using nsets_def that by auto + then have [simp]: "card (inv_into {.. nsets ?W (Suc r)" for X + proof (cases "p \ X") + case True + then have Xp: "X - {p} \ nsets (u ` V) r" + using X by (auto simp: nsets_def) + moreover have "u ` V \ U" + using Vsub bij_betwE u by blast + ultimately have "X - {p} \ nsets U r" + by (meson in_mono nsets_mono) + then have "g (X - {p}) = i" + using gi by blast + have "f X = i" + using gi True \X - {p} \ nsets U r\ insert_Diff + by (fastforce simp: g_def image_subset_iff) + then show ?thesis + by (simp add: \f X = i\ \g (X - {p}) = i\) + next + case False + then have Xim: "X \ nsets (u ` V) (Suc r)" + using X by (auto simp: nsets_def subset_insert) + then have "u ` inv_into {.. nsets {..p} q2" + by (simp add: ione inq1) + ultimately show ?thesis + by (metis ione image_subsetI insertI1 lessI nth_Cons_0 nth_Cons_Suc) + next + case jzero + then have "u ` V \ nsets {..p} q1" + using V u_nsets by auto + moreover have "f ` nsets (u ` V) (Suc r) \ {j}" + using hj + apply (clarsimp simp add: h_def image_subset_iff nsets_def) + by (metis Zero_not_Suc card_eq_0_iff card_image subset_image_inj) + ultimately show ?thesis + using jzero not_less_eq by fastforce + qed + qed + qed + then show "?thesis" + using lessThan_Suc lessThan_Suc_atMost + by (auto simp: partn_lst_def monochromatic_def insert_commute) +qed + +proposition ramsey2_full: "partn_lst {.. 0" @@ -367,231 +685,28 @@ using Suc.prems proof (induct k \ "q1 + q2" arbitrary: q1 q2) case 0 - show ?case - proof - show "partn_lst {..<1::nat} [q1, q2] (Suc r)" - using nsets_empty_iff subset_insert 0 - by (fastforce simp: partn_lst_def funcset_to_empty_iff nsets_eq_empty image_subset_iff) - qed + with partn_lst_0 show ?case by auto next case (Suc k) consider "q1 = 0 \ q2 = 0" | "q1 \ 0" "q2 \ 0" by auto then show ?case proof cases case 1 - then have "partn_lst {..< Suc 0} [q1, q2] (Suc r)" - unfolding partn_lst_def using \r > 0\ - by (fastforce simp add: nsets_empty_iff nsets_singleton_iff lessThan_Suc) - then show ?thesis by blast + with False partn_lst_0 partn_lst_0' show ?thesis + by blast next + define p1 where "p1 \ ES (Suc r) (q1-1) q2" + define p2 where "p2 \ ES (Suc r) q1 (q2-1)" + define p where "p \ ES r p1 p2" case 2 - with Suc have "k = (q1 - 1) + q2" "k = q1 + (q2 - 1)" by auto - then obtain p1 p2::nat where p1: "partn_lst {..iH\nsets {..p} ([q1,q2] ! i). f ` nsets H (Suc r) \ {i}" - if f: "f \ nsets {..p} (Suc r) \ {.. \R. f (insert p R)" - have "f (insert p i) \ {.. nsets {.. nsets {.. {.. {i}" - and U: "U \ nsets {.. {.. nsets {.. nsets {..p} n" if "X \ nsets {.. \R. f (u ` R)" - have "h \ nsets {.. {.. {j}" - and V: "V \ nsets {.. {.. u ` {.. nsets {.. nsets {.. nsets {..p} q1" - unfolding nsets_def using \q1 \ 0\ card_insert_if by fastforce - have invu_nsets: "inv_into {.. nsets V r" - if "X \ nsets (u ` V) r" for X r - proof - - have "X \ u ` V \ finite X \ card X = r" - using nsets_def that by auto - then have [simp]: "card (inv_into {.. nsets ?W (Suc r)" for X - proof (cases "p \ X") - case True - then have Xp: "X - {p} \ nsets (u ` V) r" - using X by (auto simp: nsets_def) - moreover have "u ` V \ U" - using Vsub bij_betwE u by blast - ultimately have "X - {p} \ nsets U r" - by (meson in_mono nsets_mono) - then have "g (X - {p}) = i" - using gi by blast - have "f X = i" - using gi True \X - {p} \ nsets U r\ insert_Diff - by (fastforce simp add: g_def image_subset_iff) - then show ?thesis - by (simp add: \f X = i\ \g (X - {p}) = i\) - next - case False - then have Xim: "X \ nsets (u ` V) (Suc r)" - using X by (auto simp: nsets_def subset_insert) - then have "u ` inv_into {.. nsets {..p} q1" - by (simp add: izero inq1) - ultimately show ?thesis - by (metis izero image_subsetI insertI1 nth_Cons_0 zero_less_Suc) - next - case jone - then have "u ` V \ nsets {..p} q2" - using V u_nsets by auto - moreover have "f ` nsets (u ` V) (Suc r) \ {j}" - using hj - by (force simp add: h_def image_subset_iff nsets_def subset_image_inj card_image dest: finite_imageD) - ultimately show ?thesis - using jone not_less_eq by fastforce - qed - next - case ione - then have "U \ nsets {.. nsets {..p} n" if "X \ nsets {.. \R. f (u ` R)" - have "h \ nsets {.. {.. {j}" - and V: "V \ nsets {.. {.. u ` {.. nsets {.. nsets {.. nsets {..p} q2" - unfolding nsets_def using \q2 \ 0\ card_insert_if by fastforce - have invu_nsets: "inv_into {.. nsets V r" - if "X \ nsets (u ` V) r" for X r - proof - - have "X \ u ` V \ finite X \ card X = r" - using nsets_def that by auto - then have [simp]: "card (inv_into {.. nsets ?W (Suc r)" for X - proof (cases "p \ X") - case True - then have Xp: "X - {p} \ nsets (u ` V) r" - using X by (auto simp: nsets_def) - moreover have "u ` V \ U" - using Vsub bij_betwE u by blast - ultimately have "X - {p} \ nsets U r" - by (meson in_mono nsets_mono) - then have "g (X - {p}) = i" - using gi by blast - have "f X = i" - using gi True \X - {p} \ nsets U r\ insert_Diff - by (fastforce simp add: g_def image_subset_iff) - then show ?thesis - by (simp add: \f X = i\ \g (X - {p}) = i\) - next - case False - then have Xim: "X \ nsets (u ` V) (Suc r)" - using X by (auto simp: nsets_def subset_insert) - then have "u ` inv_into {.. nsets {..p} q2" - by (simp add: ione inq1) - ultimately show ?thesis - by (metis ione image_subsetI insertI1 lessI nth_Cons_0 nth_Cons_Suc) - next - case jzero - then have "u ` V \ nsets {..p} q1" - using V u_nsets by auto - moreover have "f ` nsets (u ` V) (Suc r) \ {j}" - using hj - apply (clarsimp simp add: h_def image_subset_iff nsets_def) - by (metis Zero_not_Suc card_eq_0_iff card_image subset_image_inj) - ultimately show ?thesis - using jzero not_less_eq by fastforce - qed - qed - qed - then show "partn_lst {.. {i}" and U: "U \ nsets {..iH\nsets {.. {i}" + using p keq by (auto simp: partn_lst_def monochromatic_def) + show "\i nsets {.. {0, Suc 0}" using U gi unfolding g_def by (auto simp: image_subset_iff) then obtain u where u: "bij_betw u {.. {.. nsets {.. nsets {.. \X. f (u ` X)" have "f (u ` X) < Suc (Suc 0)" if "X \ nsets {.. {j}" and V: "V \ nsets {..A. \A \ [U]\<^bsup>r\<^esup>\ \ f A = Suc i" + by (metis Suc_pred diff_0_eq_0 g_def gi image_subset_iff not_gr0 singletonD) show ?thesis + unfolding monochromatic_def proof (intro exI conjI bexI) show "Suc i < length qs" using Suc.hyps(2) i by auto show "f ` nsets U r \ {Suc i}" - using i gi False - apply (auto simp: g_def image_subset_iff) - by (metis Suc_lessD Suc_pred g_def gi image_subset_iff not_less_eq singleton_iff) + using False by (auto simp: eq) show "U \ nsets {.. (\v\V. \w\V. v \ w \ {v, w} \ E)" definition "indep V E \ (\v\V. \w\V. v \ w \ {v, w} \ E)" +lemma clique_Un: "\clique K F; clique L F; \v\K. \w\L. v\w \ {v,w} \ F\ \ clique (K \ L) F" + by (metis UnE clique_def doubleton_eq_iff) + +lemma null_clique[simp]: "clique {} E" and null_indep[simp]: "indep {} E" + by (auto simp: clique_def indep_def) + +lemma smaller_clique: "\clique R E; R' \ R\ \ clique R' E" + by (auto simp: clique_def) + +lemma smaller_indep: "\indep R E; R' \ R\ \ indep R' E" + by (auto simp: indep_def) + lemma ramsey2: "\r\1. \(V::'a set) (E::'a set set). finite V \ card V \ r \ (\R \ V. card R = m \ clique R E \ card R = n \ indep R E)" @@ -727,7 +856,7 @@ by (simp add: f_def) then obtain i U where i: "i < 2" and gi: "f ` nsets U 2 \ {i}" and U: "U \ nsets {.. V" @@ -745,7 +874,7 @@ qed -subsection \Preliminaries\ +subsection \Preliminaries for the infinitary version\ subsubsection \``Axiom'' of Dependent Choice\ @@ -827,7 +956,7 @@ from Suc.prems have infYY': "infinite (YY - {yy})" by auto from Suc.prems have partf': "part_fn r s (YY - {yy}) (f \ insert yy)" by (simp add: o_def part_fn_Suc_imp_part_fn yy) - have transr: "trans ?ramr" by (force simp add: trans_def) + have transr: "trans ?ramr" by (force simp: trans_def) from Suc.hyps [OF infYY' partf'] obtain Y0 and t0 where "Y0 \ YY - {yy}" "infinite Y0" "t0 < s" "X \ Y0 \ finite X \ card X = r \ (f \ insert yy) X = t0" for X @@ -944,7 +1073,7 @@ shows "\Y t. Y \ Z \ infinite Y \ t < s \ (\x\Y. \y\Y. x\y \ f {x, y} = t)" proof - from part have part2: "\X. X \ Z \ finite X \ card X = 2 \ f X < s" - by (fastforce simp add: eval_nat_numeral card_Suc_eq) + by (fastforce simp: eval_nat_numeral card_Suc_eq) obtain Y t where *: "Y \ Z" "infinite Y" "t < s" "(\X. X \ Y \ finite X \ card X = 2 \ f X = t)" by (insert Ramsey [OF infZ part2]) auto @@ -994,7 +1123,7 @@ proof - have *: "\T n. \\i \ (T ` {.. \ (\i r)) \ r = (\i r)" - by (force simp add: wf_Int1) + by (force simp: wf_Int1) show ?thesis unfolding disj_wf_def by auto (metis "*") qed