diff --git a/thys/Szemeredi_Regularity/Szemeredi.thy b/thys/Szemeredi_Regularity/Szemeredi.thy --- a/thys/Szemeredi_Regularity/Szemeredi.thy +++ b/thys/Szemeredi_Regularity/Szemeredi.thy @@ -1,1184 +1,1235 @@ section \Szemerédi's Regularity Lemma\ theory Szemeredi imports Complex_Main "HOL-Library.Disjoint_Sets" "Girth_Chromatic.Ugraphs" begin text\We formalise Szemerédi's Regularity Lemma, which is a major result in the study of large graphs (extremal graph theory). We follow Yufei Zhao's notes ``Graph Theory and Additive Combinatorics'' (MIT) \<^url>\https://ocw.mit.edu/courses/mathematics/18-217-graph-theory-and-additive-combinatorics-fall-2019/lecture-notes/MIT18_217F19_ch3.pdf\ and W.T. Gowers's notes ``Topics in Combinatorics'' (University of Cambridge, Lent 2004, Chapter 3) \<^url>\https://www.dpmms.cam.ac.uk/~par31/notes/tic.pdf\. We also refer to a third source, also by Zhao and also entitled ``Graph Theory and Additive Combinatorics'': \<^url>\https://yufeizhao.com/gtac/gtac17.pdf\.\ subsection \Miscellaneous\ text \A technical lemma used below in @{text \energy_graph_partition_half\}\ lemma sum_products_le: fixes a :: "'a \ 'b::linordered_idom" assumes "\i. i \ I \ a i \ 0" shows "(\i\I. a i * b i)\<^sup>2 \ (\i\I. a i) * (\i\I. a i * (b i)\<^sup>2)" using assms proof (induction I rule: infinite_finite_induct) case (insert j I) then have "(\i\insert j I. a i * b i)\<^sup>2 \ (a j * b j)\<^sup>2 + 2 * a j * b j * (\i\I. a i * b i) + (\i\I. a i) * (\i\I. a i * (b i)\<^sup>2)" using insert by (simp add: algebra_simps power2_eq_square) also have "\ \ a j * (a j * (b j)\<^sup>2) + (a j * (sum a I * (b j)\<^sup>2 + (\i\I. a i * (b i)\<^sup>2)) + sum a I * (\i\I. a i * (b i)\<^sup>2))" proof - have "0 \ (\i\I. a i * (b i - b j)\<^sup>2)" by (simp add: insert.prems sum_nonneg) then have "2 * b j * (\i\I. a i * b i) \ (sum a I * (b j)\<^sup>2) + (\i\I. a i * (b i)\<^sup>2)" by (simp add: power2_eq_square algebra_simps sum_subtractf sum.distrib sum_distrib_left) then show ?thesis by (simp add: insert.prems power2_eq_square mult.commute mult.left_commute mult_left_mono) qed finally show ?case by (simp add: insert algebra_simps) qed auto subsubsection \Partitions indexed by integers\ definition finite_graph_partition :: "[uvert set, nat \ uvert set, nat] \ bool" where "finite_graph_partition V P n \ partition_on V (P ` {.. disjoint_family_on P {..Equivalent, simpler characterisation\ lemma finite_graph_partition_eq: "finite_graph_partition V P n \ partition_on V (P ` {.. inj_on P {.. disjoint_family_on P {.. V={}" by (auto simp: finite_graph_partition_eq partition_on_def) lemma finite_graph_partition_equals: "finite_graph_partition V P n \ (\ifinite_graph_partition V P n; i \ P i \ V" using finite_graph_partition_equals by blast lemma finite_graph_partition_nonempty: "\finite_graph_partition V P n; i \ P i \ {}" by (metis finite_graph_partition_def image_eqI lessThan_iff partition_on_def) lemma trivial_graph_partition: assumes "finite_graph_partition V P 1" shows "P 0 = V" using finite_graph_partition_equals [OF assms] by auto lemma trivial_graph_partition_exists: assumes "V \ {}" shows "finite_graph_partition V (\i. V) (Suc 0)" using assms by (simp add: lessThan_Suc finite_graph_partition_eq partition_on_def) lemma finite_graph_partition_finite: assumes "finite_graph_partition V P k" "finite V" "i card V" by (metis (mono_tags, lifting) UN_I assms card_mono finite_graph_partition_equals lessThan_iff subsetI) lemma finite_graph_partition_gt0: assumes "finite_graph_partition V P k" "finite V" "i 0" by (metis assms card_gt_0_iff finite_graph_partition_def finite_graph_partition_finite imageI lessThan_iff partition_on_def) lemma card_finite_graph_partition: assumes "finite_graph_partition V P k" "finite V" shows "(\ii = card (\ (P ` {.. = card V" using assms finite_graph_partition_equals by blast finally show ?thesis . qed lemma finite_graph_partition_obtain: assumes "finite_graph_partition V P k" "x \ V" obtains i where "i < k" and "x \ P i" using assms finite_graph_partition_equals by force text \Partitions into two parts\ fun binary_partition :: "['a set, 'a set, nat] \ 'a set" where "binary_partition A B 0 = A" | "binary_partition A B (Suc 0) = B-A" lemma binary_partition2_eq [simp]: "binary_partition A B ` {..<2} = {A,B-A}" by (auto simp add: numeral_2_eq_2 lessThan_Suc) lemma inj_binary_partition: "B \ {} \ inj_on (binary_partition A B) {..<2}" by (auto simp: numeral_2_eq_2 lessThan_Suc) lemma disjoint_family_binary_partition: "disjoint_family_on (binary_partition A B) {..<2}" by (auto simp: numeral_2_eq_2 lessThan_Suc disjoint_family_on_def) lemma finite_graph_partition_binary_partition: assumes "A \ B" "A \ {}" shows "finite_graph_partition B (binary_partition A B) 2" unfolding finite_graph_partition_def partition_on_def binary_partition2_eq using assms by (force simp add: disjnt_iff pairwise_insert disjoint_family_binary_partition) subsubsection \Tools to combine the refinements of the partition @{term "P i"} for each @{term i}\ text \These are needed to retain the ``intuitive'' idea of partitions as indexed by integers.\ lemma less_sum_nat_iff: fixes b::nat and k::nat shows "b < (\i (\ji b \ b < (\ii (\!j. j (\i b \ b < (\i nat) \ nat \ nat \ nat" where "part a k b \ (THE j. j (\i b \ b < (\ii (let j = part a k b in j < k \ (\i < j. a i) \ b \ b < (\i < j. a i) + a j)" (is "?lhs = ?rhs") proof assume ?lhs then show ?rhs unfolding less_sum_nat_iff_uniq part_def by (metis (no_types, lifting) theI') qed (auto simp: less_sum_nat_iff Let_def) lemma part_Suc: "part a (Suc k) b = (if sum a {.. b \ b < sum a {..: "\j. \sum a {.. sum a {.. \ j = i" by (meson \d < a i\ leD le_add1 less_sum_nat_iff nat_add_left_cancel_less not_less_iff_gr_or_eq) show ?thesis unfolding part_def using assms by (intro the_equality) (auto simp: \
) qed lemma sum_layers_less: fixes d::nat and k::nat shows "\i < k; d < a i\ \ sum a {..Edges\ text \All edges between two sets of vertices, @{term X} and @{term Y}, in a graph, @{term G}\ definition all_edges_between :: "nat set \ nat set \ nat set \ nat set set \ (nat \ nat) set" where "all_edges_between X Y G \ {(x,y). x\X \ y\Y \ {x,y} \ uedges G}" lemma all_edges_between_subset: "all_edges_between X Y G \ X\Y" by (auto simp: all_edges_between_def) lemma max_all_edges_between: assumes "finite X" "finite Y" shows "card (all_edges_between X Y G) \ card X * card Y" by (metis assms card_mono finite_SigmaI all_edges_between_subset card_cartesian_product) lemma all_edges_between_empty [simp]: "all_edges_between {} Z G = {}" "all_edges_between Z {} G = {}" by (auto simp: all_edges_between_def) lemma all_edges_between_disjnt1: assumes "disjnt X Y" shows "disjnt (all_edges_between X Z G) (all_edges_between Y Z G)" using assms by (auto simp: all_edges_between_def disjnt_iff) lemma all_edges_between_disjnt2: assumes "disjnt Y Z" shows "disjnt (all_edges_between X Y G) (all_edges_between X Z G)" using assms by (auto simp: all_edges_between_def disjnt_iff) lemma all_edges_between_Un1: "all_edges_between (X \ Y) Z G = all_edges_between X Z G \ all_edges_between Y Z G" by (auto simp: all_edges_between_def) lemma all_edges_between_Un2: "all_edges_between X (Y \ Z) G = all_edges_between X Y G \ all_edges_between X Z G" by (auto simp: all_edges_between_def) lemma finite_all_edges_between: assumes "finite X" "finite Y" shows "finite (all_edges_between X Y G)" by (meson all_edges_between_subset assms finite_cartesian_product finite_subset) subsection \Edge Density and Regular Pairs\ text \The edge density between two sets of vertices, @{term X} and @{term Y}, in @{term G}. Authors disagree on whether the sets are assumed to be disjoint!. Quite a few authors assume disjointness, e.g. Malliaris and Shelah \<^url>\https://www.jstor.org/stable/23813167\ For the following definitions, see pages 49--50 in Zhao's notes.\ definition "edge_density X Y G \ card(all_edges_between X Y G) / (card X * card Y)" lemma edge_density_ge0: "edge_density X Y G \ 0" by (auto simp: edge_density_def) lemma edge_density_le1: "edge_density X Y G \ 1" proof (cases "finite X \ finite Y") case True then show ?thesis using of_nat_mono [OF max_all_edges_between, of X Y] by (fastforce simp add: edge_density_def divide_simps) qed (auto simp: edge_density_def) lemma all_edges_between_swap: "all_edges_between X Y G = (\(x,y). (y,x)) ` (all_edges_between Y X G)" unfolding all_edges_between_def by (auto simp add: insert_commute image_iff split: prod.split) lemma card_all_edges_between_commute: "card (all_edges_between X Y G) = card (all_edges_between Y X G)" proof - have "inj_on (\(x, y). (y, x)) A" for A :: "(nat*nat)set" by (auto simp: inj_on_def) then show ?thesis by (simp add: all_edges_between_swap [of X Y] card_image) qed lemma edge_density_commute: "edge_density X Y G = edge_density Y X G" by (simp add: edge_density_def card_all_edges_between_commute mult.commute) text \$\epsilon$-regular pairs, for two sets of vertices. Again, authors disagree on whether the sets need to be disjoint, though it seems that overlapping sets cause double-counting. Authors also disagree about whether or not to use the strict subset relation here. The proofs below are easier if it is strict but later proofs require the non-strict version. The two definitions can be proved to -be equivalent under fairly mild conditions.\ +be equivalent under fairly mild conditions, but even those conditions turn out to be onerous.\ definition regular_pair:: "uvert set \ uvert set \ ugraph \ real \ bool" where "regular_pair X Y G \ \ - \A B. A \ X \ B \ Y \ (card A \ \ * card X) \ (card B \ \ * card Y) \ + \A B. A \ X \ B \ Y \ (card A \ \ * card X) \ (card B \ \ * card Y) \ \edge_density A B G - edge_density X Y G\ \ \" for \::real lemma regular_pair_commute: "regular_pair X Y G \ \ regular_pair Y X G \" by (metis edge_density_commute regular_pair_def) abbreviation "irregular_pair X Y G \ \ \ regular_pair X Y G \" lemma irregular_pair_E: fixes \::real assumes "irregular_pair X Y G \" - obtains A B where "A \ X \ B \ Y \ (card A \ \ * card X) \ (card B \ \ * card Y)" + obtains A B where "A \ X \ B \ Y \ (card A \ \ * card X) \ (card B \ \ * card Y)" "\edge_density A B G - edge_density X Y G\ > \" using assms by (auto simp: not_le regular_pair_def) lemma irregular_pair_I: fixes \::real - assumes "A \ X" "B \ Y" "(card A \ \ * card X)" "(card B \ \ * card Y)" + assumes "A \ X" "B \ Y" "(card A \ \ * card X)" "(card B \ \ * card Y)" "\edge_density A B G - edge_density X Y G\ > \" shows "irregular_pair X Y G \" using assms by (auto simp: not_le regular_pair_def) lemma edge_density_Un: assumes "disjnt X1 X2" "finite X1" "finite X2" "finite Y" shows "edge_density (X1 \ X2) Y G = (edge_density X1 Y G * card X1 + edge_density X2 Y G * card X2) / (card X1 + card X2)" using assms unfolding edge_density_def by (simp add: all_edges_between_disjnt1 all_edges_between_Un1 finite_all_edges_between card_Un_disjnt divide_simps) lemma edge_density_partition: assumes U: "finite_graph_partition U P n" "finite U" and "finite W" shows "edge_density U W G = (\ii (P ` {.. (P ` {.. (P ` {..ii (\i \ (P ` {.. = (edge_density (P n) W G * card (P n) + edge_density (\ (P ` {.. (P ` {.. (P ` {.. (P ` {..finite W\ finU in auto) also have "\ = (edge_density (P n) W G * card (P n) + edge_density (\ (P ` {..ii = (\iiLet @{term P}, @{term Q} be partitions of a set of vertices @{term V}. Then @{term P} refines @{term Q} if for all @{term \A \ P\} there is @{term \B \ Q\} such that @{term \A \ B\}.\ definition finite_graph_refines :: "[uvert set, nat \ uvert set, nat, nat \ uvert set, nat] \ bool" where "finite_graph_refines V P n Q m \ finite_graph_partition V P n \ finite_graph_partition V Q m \ (\ij Q j)" text \For the sake of generality, and following Zhao's Online Lecture \<^url>\https://www.youtube.com/watch?v=vcsxCFSLyP8&t=16s\ we do not impose disjointness: we do not include @{term "i\j"} below.\ definition irregular_set:: "[real, ugraph, nat \ uvert set, nat] \ (nat\nat) set" where "irregular_set \ \\::real. \G P k. {(i,j)|i j. i j irregular_pair (P i) (P j) G \}" text\A regular partition may contain a few irregular pairs as long as their total size is bounded as follows.\ definition regular_partition:: "[real, ugraph, nat \ uvert set, nat] \ bool" where "regular_partition \ \\::real. \G P k. finite_graph_partition (uverts G) P k \ (\(i,j) \ irregular_set \ G P k. card (P i) * card (P j)) \ \ * (card (uverts G))\<^sup>2" lemma irregular_set_subset: "irregular_set \ G P k \ {.. {.. irregular_set \ G P k \ (j,i) \ irregular_set \ G P k" by (auto simp add: irregular_set_def regular_pair_commute) lemma finite_graph_refines_refines: assumes "finite_graph_refines V Y n X m" shows "refines V (Y ` {.. G P k)" proof - have "irregular_set \ G P k \ {0.. {0..Energy of a Graph\ text \Definition 3.7 (Energy), written @{term "q(\,\)"}\ definition energy_graph_subsets:: "[uvert set, uvert set, ugraph] \ real" where "energy_graph_subsets \ \ G \ card \ * card \ * (edge_density \ \ G)\<^sup>2 / (card (uverts G))\<^sup>2" text \Definition for partitions\ definition energy_graph_partitions_subsets :: "[ugraph, nat \ uvert set, nat, nat \ uvert set, nat] \ real" where "energy_graph_partitions_subsets G U k W l \ \ij \ G \ 0" by (auto simp: energy_graph_subsets_def) lemma energy_graph_partitions_subsets_ge0 [simp]: "energy_graph_partitions_subsets G U k W l \ 0" by (auto simp: sum_nonneg energy_graph_partitions_subsets_def) lemma energy_graph_subsets_commute: "energy_graph_subsets \ \ G = energy_graph_subsets \ \ G" by (simp add: energy_graph_subsets_def edge_density_commute) lemma energy_graph_partitions_subsets_commute: "energy_graph_partitions_subsets G W l U k = energy_graph_partitions_subsets G U k W l" by (simp add: energy_graph_partitions_subsets_def energy_graph_subsets_commute sum.swap [where A="{..Definition 3.7 (Energy of a Partition), or following Gowers, mean square density: a version of energy for a single partition of the vertex set. \ abbreviation mean_square_density :: "[ugraph, nat \ uvert set, nat] \ real" where "mean_square_density G U k \ energy_graph_partitions_subsets G U k U k" lemma mean_square_density: "mean_square_density G U k \ (\ij2) / (card (uverts G))\<^sup>2" by (simp add: energy_graph_partitions_subsets_def energy_graph_subsets_def sum_divide_distrib) text\Observation: the energy is between 0 and 1 because the edge density is bounded above by 1.\ lemma sum_partition_le: assumes "finite_graph_partition V P k" "finite V" shows "(\ij (real(card V))\<^sup>2" using assms proof (induction k arbitrary: V) case (Suc k) then have [simp]: "V \ P k = P k" using finite_graph_partition_equals by fastforce have [simp]: "finite (P i)" if "i\k" for i using Suc.prems finite_graph_partition_finite that by force have C: "card (P i) \ card V" if "i\k" for i using Suc.prems finite_graph_partition_le le_imp_less_Suc that by presburger have D [simp]: "(\j (P ` {..ij (real (card (V - P k)))\<^sup>2" by (simp add: finite_graph_partition_def lessThan_Suc partition_on_insert disjoint_family_on_insert comm_monoid_add_class.sum.distrib) have "(\ijij \ real (card (P k) * card (P k)) + 2 * (card V - card (P k)) * card (P k) + (real (card (V - P k)))\<^sup>2" using * by linarith also have "\ \ (real (card V))\<^sup>2" by (simp add: of_nat_diff C card_Diff_subset_Int algebra_simps power2_eq_square) finally show ?case . qed auto lemma mean_square_density_bounded: assumes "finite_graph_partition (uverts G) P k" "finite (uverts G)" shows "mean_square_density G P k \ 1" proof- + have \
: "edge_density (P i) (P j) G \ 1" for i j + using assms of_nat_mono [OF max_all_edges_between] + by (smt (verit, best) card.infinite divide_eq_0_iff edge_density_def edge_density_le1 mult_eq_0_iff of_nat_0) have "(\ij2) \ (\ij) also have "\ \ (real(card (uverts G)))\<^sup>2" using sum_partition_le using assms by presburger finally show ?thesis by (simp add: mean_square_density divide_simps) qed subsection \Partitioning and Energy\ text\Zhao's Lemma 3.8 and Gowers's remark after Lemma 11. Further partitioning of subsets of the vertex set cannot make the energy decrease. We follow Gowers's proof, which avoids the use of probability.\ lemma energy_graph_partition_half: assumes fin: "finite \" "finite \" and U: "finite_graph_partition \ U n" shows "card \ * (edge_density \ \ G)\<^sup>2 \ (\i G)\<^sup>2)" proof - have "card \ * (edge_density \ \ G)\<^sup>2 = (\i \ G)\<^sup>2)" by (metis \finite \\ U sum_distrib_right card_finite_graph_partition of_nat_sum) also have "\ = edge_density \ \ G * (\i \ G * card (U i))" by (simp add: sum_distrib_left power2_eq_square mult_ac) also have "\ = (\i G * real (card (U i))) * edge_density \ \ G" proof - have "edge_density \ \ G * (\n G * card (U n)) = edge_density \ \ G * (edge_density \ \ G * (\n = (\i G) * edge_density \ \ G" by (simp add: sum_distrib_left mult_ac) also have "\ = (\i G)\<^sup>2 / (\i \ (\i G)\<^sup>2)" apply (clarsimp simp add: mult_ac divide_simps simp flip: of_nat_sum) by (simp add: sum_products_le) finally show ?thesis . qed proposition energy_graph_partition_increase: assumes fin: "finite \" "finite \" and U: "finite_graph_partition \ U k" and V: "finite_graph_partition \ W l" shows "energy_graph_partitions_subsets G U k W l \ energy_graph_subsets \ \ G" proof - have "(card \ * card \) * (edge_density \ \ G)\<^sup>2 = card \ * (card \ * (edge_density \ \ G)\<^sup>2)" using fin by (simp add: mult_ac) also have "\ \ card \ * (\i G)\<^sup>2)" by (intro mult_left_mono energy_graph_partition_half fin) (use assms in auto) also have "\ = (\i * (edge_density \ (U i) G)\<^sup>2))" by (simp add: sum_distrib_left edge_density_commute mult_ac) also have "\ \ (\ij2))" proof (intro mult_left_mono energy_graph_partition_half sum_mono fin) show "finite (U i)" if "i \ {.. \ (\ij2)" by (simp add: sum_distrib_left edge_density_commute mult_ac) finally have "(card \ * card \) * (edge_density \ \ G)\<^sup>2 \ (\ij2)" . then show ?thesis unfolding energy_graph_partitions_subsets_def energy_graph_subsets_def by (simp add: divide_simps flip: sum_divide_distrib) qed lemma partition_imp_finite_graph_partition: "\partition_on A P; finite P\ \ finite_graph_partition A (from_nat_into P) (card P)" by (metis bij_betw_def bij_betw_from_nat_into_finite finite_graph_partition_eq) text \The following is the fully general version of Gowers's Lemma 11 and Zhao's Lemma 3.9. Further partitioning of subsets of the vertex set cannot make the energy decrease. Note that @{term V} should be @{term "uverts G"} even though this more general version holds.\ lemma energy_graph_partitions_subsets_increase_half: assumes ref: "finite_graph_refines V Y n X m" and "finite V" and finU: "\i. i < k \ card (U i) > 0" shows "energy_graph_partitions_subsets G X m U k \ energy_graph_partitions_subsets G Y n U k" (is "?lhs \ ?rhs") proof - have "\F. partition_on (X i) F \ F = Y ` {j. j Y j \ X i}" if "ii. i partition_on (X i) (F i) \ F i = Y ` {j. j Y j \ X i}" by fastforce have finite_X: "finite (X i)" if "ifinite V\ finite_graph_partition_finite finite_graph_refines_def ref that by auto have finite_F: "finite (F i)" if "i {}" if "iiU\F i. f U) = (\i real" proof - have Yn_eq: "Y ` {..ii. {Y i}) {..ii = (sum \ sum) f (F ` {.. = (\iU\F i. f U)" unfolding comp_apply by (metis injF sum.reindex_cong) finally show ?thesis by simp qed have "?lhs = (\ij \ (\ijx. U j) 1)" proof - have "finite_graph_partition (X i) (from_nat_into (F i)) (card (F i))" if "i < m" "j < k" for i j using partition_imp_finite_graph_partition that F by fastforce moreover have "finite_graph_partition (U j) (\x. U j) (Suc 0)" if "i < m" "j < k" for i j using that by (metis card.empty finU less_not_refl trivial_graph_partition_exists) ultimately show ?thesis by (intro sum_mono energy_graph_partition_increase; simp add: finU card_ge_0_finite finite_X) qed also have "\ = (\irj = (\iv\F i. \j = ?rhs" by (simp add: energy_graph_partitions_subsets_def F_sums_Y) finally show ?thesis . qed proposition energy_graph_partitions_subsets_increase: assumes refX: "finite_graph_refines V Y n X m" and refU: "finite_graph_refines V' W l U k" and "finite V" "finite V'" shows "energy_graph_partitions_subsets G X m U k \ energy_graph_partitions_subsets G Y n W l" (is "?lhs \ ?rhs") proof - have finU: "\i. i < k \ card (U i) > 0" and finY: "\i. i < n \ card (Y i) > 0" using finite_graph_partition_gt0 finite_graph_refines_def assms by auto have "?lhs \ energy_graph_partitions_subsets G Y n U k" using assms energy_graph_partitions_subsets_increase_half finU refX by blast also have "\ = energy_graph_partitions_subsets G U k Y n" by (meson energy_graph_partitions_subsets_commute) also have "\ \ energy_graph_partitions_subsets G W l Y n" using assms energy_graph_partitions_subsets_increase_half finY refU by blast also have "\ = ?rhs" by (simp add: energy_graph_partitions_subsets_commute) finally show ?thesis . qed text \The original version of Gowers's Lemma 11 and Zhao's Lemma 3.9 is not general enough to be used for anything.\ corollary mean_square_density_increase: assumes "finite_graph_refines V Y n X m" "finite V" shows "mean_square_density G X m \ mean_square_density G Y n" using assms energy_graph_partitions_subsets_increase by presburger text\The Energy Boost Lemma (Lemma 3.10 in Zhao's notes) says that an irregular partition increases the energy substantially. We assume that @{term "\ \ uverts G"} and @{term "\ \ uverts G"} are not irregular, as witnessed by their subsets @{term"U1 \ \"} and @{term"W1 \ \"}. The proof follows Lemma 12 of Gowers. \ +definition "bla X Y \ if X \ Y then {X,Y-X} else {Y}" + +lemma card_bla: "card (bla X Y) \ 2" + by (simp add: bla_def card_insert_if) + +lemma sum_bla: "\X \ Y; f{} = 0\ \ sum f (bla X Y) = f X + f (Y-X)" + by (force simp add: bla_def sum.insert_if) + +definition bla_partition :: "['a set, 'a set, nat] \ 'a set" + where "bla_partition A B \ if A \ B then binary_partition A B else (\i. A)" + +definition "bla_idx A B \ if A \ B then 2 else Suc 0" + +lemma bla_partition2_eq [simp]: + "bla_partition A B ` {.. B then {A,B-A} else {A})" + by (auto simp add: bla_partition_def bla_idx_def) + +lemma inj_bla_partition: + "B \ {} \ inj_on (bla_partition A B) {.. B" "A \ {}" + shows "finite_graph_partition B (bla_partition A B) (bla_idx A B)" + using assms trivial_graph_partition_exists + by (auto simp add: bla_idx_def bla_partition_def finite_graph_partition_binary_partition) + +lemma bla_sum_expand: "A\B \ (\U\bla A B. f U) = (\i::real and \ \ G defines "alpha \ edge_density \ \ G" defines "u \ \X Y. edge_density X Y G - alpha" assumes "finite \" "finite \" - and "U1 \ \" "W1 \ \" "\ > 0" + and "U1 \ \" "W1 \ \" "\ > 0" and U1: "card U1 \ \ * card \" and W1: "card W1 \ \ * card \" and gt: "\u U1 W1\ > \" - shows "(\A \ {U1, \ - U1}. \B \ {W1, \ - W1}. energy_graph_subsets A B G) + shows "(\A \ bla U1 \. \B \ bla W1 \. energy_graph_subsets A B G) \ energy_graph_subsets \ \ G + \^4 * (card \ * card \) / (card (uverts G))\<^sup>2" (is "?lhs \ ?rhs") proof - - define UF where "UF \ {U1, \ - U1}" - define WF where "WF \ {W1, \ - W1}" + define UF where "UF \ bla U1 \" + define WF where "WF \ bla W1 \" obtain [simp]: "finite \" "finite \" using assms by (meson finite_subset) + obtain 1: "card U1 > 0" "card W1 > 0" + using gt \\ > 0\ U1 W1 + by (force simp: u_def alpha_def edge_density_def mult_le_0_iff zero_less_mult_iff) then obtain 0: "card \ > 0" "card \ > 0" using assms by fastforce then obtain 1: "card U1 > 0" "card W1 > 0" by (smt (verit) U1 W1 \\ > 0\ of_nat_0_less_iff zero_less_mult_iff) then obtain [simp]: "finite U1" "finite W1" by (meson card_ge_0_finite) have 2 [simp]: "card x > 0" if "x \ UF" for x - using "1"(1) UF_def assms that by fastforce + using "1"(1) assms that by (auto simp: UF_def bla_def split: if_split_asm) have 3 [simp]: "card x > 0" if "x \ WF" for x - using "1"(2) WF_def assms that by force + using "1"(2) assms that by (auto simp: WF_def bla_def split: if_split_asm) have cardUW: "card \ = card U1 + card(\ - U1)" "card \ = card W1 + card(\ - W1)" - using 0 1 \U1 \ \\ \W1 \ \\ + using 0 1 \U1 \ \\ \W1 \ \\ by (metis card_eq_0_iff card_Diff_subset card_mono le_add_diff_inverse less_le)+ - have CU: "card (all_edges_between \ Z G) + have [simp]: "W1 \ \ - W1" + by (metis "1"(2) Diff_cancel Diff_idemp card.empty less_le) + have [simp]: "U1 \ \ - U1" + by (metis "1"(1) Diff_cancel Diff_idemp card.empty less_nat_zero_code) + + have "\ = (\ - U1) \ U1" "disjnt (\ - U1) U1" + using \U1 \ \\ by (force simp: disjnt_iff)+ + then have CU: "card (all_edges_between \ Z G) = card (all_edges_between (\ - U1) Z G) + card (all_edges_between U1 Z G)" - if "finite Z" for Z - using card_Un_disjnt all_edges_between_Un1 all_edges_between_disjnt1 \U1 \ \\ that - by (metis DiffD2 Un_Diff_cancel2 \finite U1\ \finite \\ disjnt_iff finite_Diff - finite_all_edges_between sup.strict_order_iff) + if "finite Z" for Z + by (metis \finite U1\ all_edges_between_Un1 all_edges_between_disjnt1 \finite \\ + card_Un_disjnt finite_Diff finite_all_edges_between that) - have CW: "card (all_edges_between Z \ G) + have "\ = (\ - W1) \ W1" "disjnt (\ - W1) W1" + using \W1 \ \\ by (force simp: disjnt_iff)+ + then have CW: "card (all_edges_between Z \ G) = card (all_edges_between Z (\ - W1) G) + card (all_edges_between Z W1 G)" if "finite Z" for Z - using card_Un_disjnt all_edges_between_Un2 all_edges_between_disjnt2 \W1 \ \\ that - by (metis DiffD2 Un_Diff_cancel2 \finite W1\ \finite \\ disjnt_iff finite_Diff - finite_all_edges_between sup.strict_order_iff) - have [simp]: "U1 \ \ - U1" "W1 \ \ - W1" - using assms by blast+ + by (metis \finite W1\ all_edges_between_Un2 all_edges_between_disjnt2 \finite \\ + card_Un_disjnt finite_Diff2 finite_all_edges_between that) have *: "(\i\UF. \j\WF. real (card (all_edges_between i j G))) = card (all_edges_between \ \ G)" - by (simp add: UF_def WF_def cardUW CU CW) + by (simp add: UF_def WF_def cardUW CU CW sum_bla \U1 \ \\ \W1 \ \\) + have **: "real (card \) * real (card \) = (\i\UF. \j\WF. card i * card j)" - by (simp add: UF_def WF_def cardUW algebra_simps) + by (simp add: UF_def WF_def cardUW sum_bla \U1 \ \\ \W1 \ \\ algebra_simps) let ?S = "\i\UF. \j\WF. (card i * card j) / (card \ * card \) * (edge_density i j G)\<^sup>2" have \
: "2 * (\i\UF. \j\WF. (card i * card j) / (card \ * card \) * (edge_density i j G)) = alpha + alpha * (\i\UF. \j\WF. (card i * card j) / (card \ * card \))" - unfolding alpha_def - by (simp add: * ** edge_density_def divide_simps flip: sum_divide_distrib) - + unfolding alpha_def + by (simp add: * ** edge_density_def divide_simps sum_bla \U1 \ \\ \W1 \ \\ flip: sum_divide_distrib) have "\ * \ \ u U1 W1 * u U1 W1" by (metis abs_ge_zero abs_mult_self_eq \\ > 0\ gt less_le mult_mono) then have "(\*\)*(\*\) \ (card U1 * card W1) / (card \ * card \) * (u U1 W1)\<^sup>2" using 0 mult_mono [OF U1 W1] \\ > 0\ apply (simp add: divide_simps eval_nat_numeral) by (smt (verit, del_insts) mult.assoc mult.commute mult_mono' of_nat_0_le_iff zero_le_mult_iff) also have "\ \ (\i\UF. \j\WF. (card i * card j) / (card \ * card \) * (u i j)\<^sup>2)" - by (simp add: UF_def WF_def) + by (simp add: UF_def WF_def sum_bla \U1 \ \\ \W1 \ \\) also have "\ = ?S - 2 * alpha * (\i\UF. \j\WF. (card i * card j) / (card \ * card \) * edge_density i j G) + alpha\<^sup>2 * (\i\UF. \j\WF. (card i * card j) / (card \ * card \))" by (simp add: u_def power2_diff mult_ac ring_distribs divide_simps sum_distrib_left sum_distrib_right sum_subtractf sum.distrib flip: sum_divide_distrib) also have "\ = ?S - alpha\<^sup>2" using \
by (simp add: power2_eq_square algebra_simps) finally have 12: "alpha\<^sup>2 + \^4 \ ?S" by (simp add: eval_nat_numeral) have "?rhs = (alpha\<^sup>2 + \^4) * (card \ * card \ / (card (uverts G))\<^sup>2)" unfolding alpha_def energy_graph_subsets_def by (simp add: ring_distribs divide_simps power2_eq_square) also have "\ \ ?S * (card \ * card \ / (card (uverts G))\<^sup>2)" by (rule mult_right_mono [OF 12]) auto also have "\ = ?lhs" using 0 unfolding energy_graph_subsets_def UF_def WF_def - by (auto simp add: algebra_simps) + by (auto simp add: algebra_simps sum_bla \U1 \ \\ \W1 \ \\ ) finally show ?thesis . qed subsection \Towards Zhao's Lemma 3.11\ text\Lemma 3.11 says that we can always find a refinement that increases the energy by a certain amount.\ text \A necessary lemma for the tower of exponentials in the result. Angeliki's proof\ lemma le_tower_2: "k * (2 ^ Suc k) \ 2^(2^k)" proof (induction k rule: less_induct) case (less k) show ?case proof (cases "k \ Suc (Suc 0)") case False define j where "j = k - Suc 0" have kj: "k = Suc j" using False j_def by force have "(3::nat) \ 2 ^ j" by (metis kj False Suc_leI less_trans_Suc less_exp not_less numeral_3_eq_3) then have \
: "(2^j + 3) \ (2::nat) ^ k" by (simp add: kj) have "k * (2 ^ Suc k) \ 6 * j * 2^j" using False by (simp add: kj) also have "\ \ 6 * 2^(2^j)" using kj less.IH by force also have "\ < 8 * 2^(2^j)" by simp also have "\ = 2^(2^j + 3)" by (simp add: power_add) also have "\ \ 2^2^k" using \
by (metis One_nat_def less_2_cases_iff power_increasing_iff) finally show ?thesis by simp qed (auto simp: le_Suc_eq) qed text \Zhao's actual Lemma 3.11. However, the bound $m \le k 2 ^{k+1}$ comes from a different source by Zhao: ``Graph Theory and Additive Combinatorics'', \<^url>\https://yufeizhao.com/gtac/gtac17.pdf\. Zhao's original version, and Gowers', both have incorrect bounds.\ proposition exists_refinement: assumes "finite_graph_partition (uverts G) P k" and "finite (uverts G)" and irreg: "\ regular_partition \ G P k" and "\ > 0" obtains Q m where "finite_graph_refines (uverts G) Q m P k" "mean_square_density G Q m \ mean_square_density G P k + \^5" "\i. i card {j. j Q j \ P i} \ 2 ^ Suc k" "m \ k * 2 ^ Suc k" proof - define sum_pp where "sum_pp \ (\(i,j) \ irregular_set \ G P k. card (P i) * card (P j))" have "k \ 0" using assms unfolding regular_partition_def irregular_set_def by (intro notI) auto then have G_nonempty: "0 < card (uverts G)" by (metis assms(1) assms(2) finite_graph_partition_gt0 finite_graph_partition_le gr_zeroI leD) have part_GP: "partition_on (uverts G) (P ` {.. {}" if "i \ * (card (uverts G))\<^sup>2" using assms by (metis not_le regular_partition_def sum_pp_def) then have sum_irreg_pos: "sum_pp > 0" using \\ > 0\ G_nonempty less_asym by fastforce - have "\X\P i. - \Y\P j. + have "\X\P i. + \Y\P j. \ * card (P i) \ card X \ \ * card (P j) \ card Y \ \edge_density X Y G - edge_density (P i) (P j) G\ > \" if "(i,j) \ irregular_set \ G P k" for i j using that assms(1) finite_graph_partition_subset by (simp add: irregular_set_def regular_pair_def not_le) then obtain X0 Y0 - where XY0_psub_P: "\i j. \(i,j) \ irregular_set \ G P k\ \ X0 i j \ P i \ Y0 i j \ P j" + where XY0_psub_P: "\i j. \(i,j) \ irregular_set \ G P k\ \ X0 i j \ P i \ Y0 i j \ P j" and XY0_eps: "\i j. \(i,j) \ irregular_set \ G P k\ \ \ * card (P i) \ card (X0 i j) \ \ * card (P j) \ card (Y0 i j) \ \edge_density (X0 i j) (Y0 i j) G - edge_density (P i) (P j) G\ > \" by metis define X where "X \ \i j. if j>i then Y0 j i else X0 i j" define Y where "Y \ \i j. if j>i then X0 j i else Y0 i j" - have XY_psub_P: "\i j. \(i,j) \ irregular_set \ G P k\ \ X i j \ P i \ Y i j \ P j" + have XY_psub_P: "\i j. \(i,j) \ irregular_set \ G P k\ \ X i j \ P i \ Y i j \ P j" using XY0_psub_P by (force simp: X_def Y_def irregular_set_swap) have XY_eps: "\i j. \(i,j) \ irregular_set \ G P k\ \ \ * card (P i) \ card (X i j) \ \ * card (P j) \ card (Y i j) \ \edge_density (X i j) (Y i j) G - edge_density (P i) (P j) G\ > \" using XY0_eps by (force simp: X_def Y_def edge_density_commute irregular_set_swap) - have cardP: "card (P i) > 0" if "i {}" "Y i j \ {}" if "(i,j) \ irregular_set \ G P k" for i j using XY_eps [OF that] that \\ > 0\ cardP [of i] cardP [of j] by (auto simp: irregular_set_def mult_le_0_iff) text\By the assumption that our partition is irregular, there are many irregular pairs. For each irregular pair, find pairs of subsets that witness irregularity.\ - define XP where "XP i \ ((\j. {X i j, P i - X i j}) ` {j. (i,j) \ irregular_set \ G P k})" for i - define YP where "YP j \ ((\i. {Y i j, P j - Y i j}) ` {i. (i,j) \ irregular_set \ G P k})" for j + define XP where "XP i \ ((\j. bla (X i j) (P i)) ` {j. (i,j) \ irregular_set \ G P k})" for i + define YP where "YP j \ ((\i. bla (Y i j) (P j)) ` {i. (i,j) \ irregular_set \ G P k})" for j text \include degenerate partition to ensure it works whether or not there's an irregular pair\ define PP where "PP \ \i. insert {P i} (XP i \ YP i)" have finPP: "finite (PP i)" for i unfolding PP_def XP_def YP_def by (auto simp: inj_def intro!: finite_inverse_image finite_irregular_set) have inPP_fin: "P \ PP i \ finite P" for P i - by (auto simp: PP_def XP_def YP_def) + by (auto simp: PP_def XP_def YP_def bla_def) have fin_cf: "finite (common_refinement (PP i))" for i by (simp add: finPP finite_common_refinement inPP_fin) have part_cr: "partition_on (P i) (common_refinement (PP i))" if "i < k" for i proof (intro partition_on_common_refinement partition_onI) show "\\. \ \ PP i \ {} \ \" - using that XY_nonempty XY_psub_P finP(2) by (fastforce simp add: PP_def XP_def YP_def) - qed (auto simp: disjnt_iff PP_def XP_def YP_def dest: XY_psub_P) + using that XY_nonempty XY_psub_P finP(2) by (fastforce simp add: PP_def XP_def YP_def bla_def) + qed (auto simp: disjnt_iff PP_def XP_def YP_def bla_def dest: XY_psub_P) define QS where "QS i \ from_nat_into (common_refinement (PP i))" for i define r where "r i \ card (common_refinement (PP i))" for i have to_nat_on_cr: "\x i. \x \ common_refinement (PP i); i < k\ \ to_nat_on (common_refinement (PP i)) x < r i" by (metis bij_betw_apply fin_cf lessThan_iff r_def to_nat_on_finite) have QSr_eq: "QS i ` {.. {}" if "i P i" if "i < k" "q < r i" for i q using part_cr [of i] QSr_eq that unfolding partition_on_def by blast - then have QS_inject: "i = i'" if "QS i q = QS i' q'" "i \j. (\i sumr k" define Q where "Q \ \d. QS (part r k d) (d - sumr (part r k d))" have QS_Q: "QS j q = Q (sumr j + q)" if "ji ?rhs" using QSr_eq r_def apply (simp add: image_subset_iff Ball_def Bex_def QS_def Q_def m_def) by (metis sumr_def add.right_neutral card.empty from_nat_into leD part) show "?rhs \ ?lhs" using QS_Q m_def sum_layers_less sumr_def by fastforce qed have Qm_eq: "Q ` {..i (Q ` {..i (common_refinement (PP i)))" by (auto simp add: Qm_eq) also have "\ = uverts G" using part_cr finite_graph_partition_equals assms(1) by (force simp: partition_on_def) finally show "\ (Q ` {.. Q ` {.. Q ` {.. q" for p q proof - from that obtain i j where "i common_refinement (PP i)" and j: "q \ common_refinement (PP j)" by (auto simp add: Qm_eq) show ?thesis proof (cases "i=j") case True then show ?thesis using part_cr [of i] by (metis \j < k\ i j pairwise_def partition_on_def \p \ q\) next case False have "p \ P i \ q \ P j" by (metis Union_upper \i < k\ \j < k\ i j part_cr partition_onD1) then show ?thesis using False \i < k\ \j < k\ part_GP disjfam_P - by (metis disjnt_Union1 disjnt_Union2 disjnt_def disjoint_family_on_def i j lessThan_iff part_cr partition_onD1) + by (fastforce simp add: disjoint_family_on_def disjnt_iff) qed qed show "{} \ Q ` {..i < part r k i. r i) \ i \ i < (\i < part r k i. r i) + r (part r k i)" by (metis \i < m\ m_def part sumr_def)+ then have "QS (part r k i) (i - sum r {.. P (part r k i)" by (simp add: QS_subset_P less_diff_conv2) then show "\j P j" unfolding Q_def sumr_def using \part r k i < k\ by blast qed (use assms in auto) have inj_Q: "inj_on Q {.. (\(i,j) \ irregular_set \ G P k. \^4 * (card (P i) * card (P j)) / (card (uverts G))\<^sup>2)" { fix i j assume ij: "(i,j) \ irregular_set \ G P k" then have "i^4 * (card (P i) * card (P j)) / (card (uverts G))\<^sup>2 - \ (\A \ {X i j, P i - X i j}. \B \ {Y i j, P j - Y i j}. energy_graph_subsets A B G)" + \ (\A \ bla (X i j) (P i). \B \ bla (Y i j) (P j). energy_graph_subsets A B G)" using XY_psub_P [OF ij] XY_eps [OF ij] assms by (intro energy_boost \i < k\ \j < k\ finP \\>0\) auto - also have "\ = (\a<2. \b<2. energy_graph_subsets (binary_partition (X i j) (P i) a) (binary_partition (Y i j) (P j) b) G)" - using \i < k\ \j < k\ - by (simp add: sum.reindex inj_binary_partition finP flip: binary_partition2_eq) - also have "\ = energy_graph_partitions_subsets G (binary_partition (X i j) (P i)) 2 (binary_partition (Y i j) (P j)) 2" + also have "\ = (\ab = energy_graph_partitions_subsets G (bla_partition (X i j) (P i)) (bla_idx (X i j) (P i)) (bla_partition (Y i j) (P j)) (bla_idx (Y i j) (P j))" by (simp add: energy_graph_partitions_subsets_def) finally have "energy_graph_subsets (P i) (P j) G + \^4 * (card (P i) * card (P j)) / (card (uverts G))\<^sup>2 - \ energy_graph_partitions_subsets G (binary_partition (X i j) (P i)) 2 (binary_partition (Y i j) (P j)) 2" . + \ energy_graph_partitions_subsets G (bla_partition (X i j) (P i)) (bla_idx (X i j) (P i)) (bla_partition (Y i j) (P j)) (bla_idx (Y i j) (P j))" . } note A = this { fix i j assume ij: "(i,j) \ irregular_set \ G P k" then have "i PP i" + have [simp]: "\ X i j \ P i \ X i j = P i" "\ Y i j \ P j \ Y i j = P j" + using XY_psub_P ij by blast+ + have XPX: "bla (X i j) (P i) \ PP i" using ij by (simp add: PP_def XP_def) have I: "finite_graph_partition (P i) (QS i) (r i)" by (simp add: QSr_eq \i < k\ finite_graph_partition_eq inj_QS part_cr) - moreover have "\qb<2. QS i q \ binary_partition (X i j) (P i) b" + moreover have "\qb bla_partition (X i j) (P i) b" using common_refinement_exists [OF _ XPX] - by (fastforce simp add: QS_def r_def numeral_2_eq_2 intro: from_nat_into) - ultimately have ref_XP: "finite_graph_refines (P i) (QS i) (r i) (binary_partition (X i j) (P i)) 2" + apply (clarsimp simp add: bla_def bla_idx_def bla_partition_def QS_subset_P \i < k\) + apply (simp add: QS_def r_def numeral_2_eq_2) + by (metis binary_partition.simps card.empty empty_iff from_nat_into insert_iff lessI less_nat_zero_code psubsetI zero_less_Suc) + ultimately have ref_XP: "finite_graph_refines (P i) (QS i) (r i) (bla_partition (X i j) (P i)) (bla_idx (X i j) (P i))" unfolding finite_graph_refines_def - using XY_nonempty(1) XY_psub_P finite_graph_partition_binary_partition ij by presburger - have YPY: "{Y i j, P j - Y i j} \ PP j" + using XY_nonempty(1) XY_psub_P finite_graph_partition_binary_partition ij + by (simp add: finite_graph_partition_bla_partition) + have YPY: "bla (Y i j) (P j) \ PP j" using ij by (simp add: PP_def YP_def) have J: "finite_graph_partition (P j) (QS j) (r j)" by (simp add: QSr_eq \j < k\ finite_graph_partition_eq inj_QS part_cr) - moreover have "\qb<2. QS j q \ binary_partition (Y i j) (P j) b" + moreover have "\qb bla_partition (Y i j) (P j) b" using common_refinement_exists [OF _ YPY] - by (fastforce simp add: QS_def r_def numeral_2_eq_2 intro: from_nat_into) - ultimately have ref_YP: "finite_graph_refines (P j) (QS j) (r j) (binary_partition (Y i j) (P j)) 2" + apply (clarsimp simp add: bla_def bla_idx_def bla_partition_def QS_subset_P \j < k\) + apply (simp add: QS_def r_def numeral_2_eq_2) + by (metis binary_partition.simps card.empty empty_iff from_nat_into insert_iff lessI less_nat_zero_code psubsetI zero_less_Suc) + ultimately have ref_YP: "finite_graph_refines (P j) (QS j) (r j) (bla_partition (Y i j) (P j)) (bla_idx (Y i j) (P j))" unfolding finite_graph_refines_def - using XY_nonempty(2) XY_psub_P finite_graph_partition_binary_partition ij by presburger - have "energy_graph_partitions_subsets G (binary_partition (X i j) (P i)) 2 (binary_partition (Y i j) (P j)) 2 + using XY_nonempty(2) XY_psub_P finite_graph_partition_binary_partition ij + by (simp add: finite_graph_partition_bla_partition) + have "energy_graph_partitions_subsets G (bla_partition (X i j) (P i)) (bla_idx (X i j) (P i)) (bla_partition (Y i j) (P j)) (bla_idx (Y i j) (P j)) \ energy_graph_partitions_subsets G (QS i) (r i) (QS j) (r j)" using \i < k\ \j < k\ by (simp add: finP energy_graph_partitions_subsets_increase [OF ref_XP ref_YP]) } note B = this have df_QS: "disjoint_family_on (\i. QS i ` {..^5 \ mean_square_density G P k + sum_eps" proof - have "\^5 = (\ * (card (uverts G))\<^sup>2) * (\^4 / (card (uverts G))\<^sup>2)" using G_nonempty by (simp add: field_simps eval_nat_numeral) also have "\ \ sum_pp * (sum_eps / sum_pp)" proof (rule mult_mono) show "\^4 / real ((card (uverts G))\<^sup>2) \ sum_eps / sum_pp" using sum_irreg_pos sum_eps_def sum_pp_def by (auto simp add: case_prod_unfold sum.neutral simp flip: sum_distrib_left sum_divide_distrib of_nat_sum of_nat_mult) qed (use spp sum_nonneg in auto) also have "\ \ sum_eps" by (simp add: sum_irreg_pos) finally show ?thesis by simp qed also have "\ = (\(i,j)\?REG. energy_graph_subsets (P i) (P j) G) + (\(i,j)\irregular_set \ G P k. energy_graph_subsets (P i) (P j) G) + sum_eps" by (simp add: energy_graph_partitions_subsets_def sum.cartesian_product irregular_set_subset sum.subset_diff) also have "\ \ (\(i,j) \ ?REG. energy_graph_subsets (P i) (P j) G) - + (\(i,j) \ irregular_set \ G P k. energy_graph_partitions_subsets G (binary_partition (X i j) (P i)) 2 (binary_partition (Y i j) (P j)) 2)" + + (\(i,j) \ irregular_set \ G P k. energy_graph_partitions_subsets G (bla_partition (X i j) (P i)) (bla_idx (X i j) (P i)) (bla_partition (Y i j) (P j)) (bla_idx (Y i j) (P j)))" using A unfolding sum_eps_def case_prod_unfold by (force intro: sum_mono simp flip: energy_graph_partitions_subsets_def sum.distrib) also have "\ \ (\(i,j) \ ?REG. energy_graph_partitions_subsets G (QS i) (r i) (QS j) (r j)) - + (\(i,j) \ irregular_set \ G P k. energy_graph_partitions_subsets G (binary_partition (X i j) (P i)) 2 (binary_partition (Y i j) (P j)) 2)" + + (\(i,j) \ irregular_set \ G P k. energy_graph_partitions_subsets G (bla_partition (X i j) (P i)) (bla_idx (X i j) (P i)) (bla_partition (Y i j) (P j)) (bla_idx (Y i j) (P j)))" by(auto simp: part_P_QS finP intro!: sum_mono energy_graph_partition_increase) also have "\ \ (\(i,j) \ ?REG. energy_graph_partitions_subsets G (QS i) (r i) (QS j) (r j)) + (\(i,j) \ irregular_set \ G P k. energy_graph_partitions_subsets G (QS i) (r i) (QS j) (r j))" using B proof (intro sum_mono add_mono ordered_comm_monoid_add_class.sum_mono2) qed (auto split: prod.split) also have "\ = (\(i,j) \ ?KK. energy_graph_partitions_subsets G (QS i) (r i) (QS j) (r j))" by (metis (no_types, lifting) finite_SigmaI finite_lessThan irregular_set_subset sum.subset_diff) also have "\ = (\ij = (\A \ Q ` {..B \ Q ` {.. = (\ij = mean_square_density G Q m" by (simp add: mean_square_density energy_graph_subsets_def sum_divide_distrib) finally show "mean_square_density G P k + \ ^ 5 \ mean_square_density G Q m" . let ?QinP = "\i. {j. j < m \ Q j \ P i}" show card_QP: "card (?QinP i) \ 2 ^ Suc k" if "i < k" for i proof - have card_cr: "card (common_refinement (PP i)) \ 2 ^ Suc k" proof - have "card (common_refinement (PP i)) \ prod card (PP i)" by (intro card_common_refinement finPP inPP_fin) also have "\ = prod card (XP i \ YP i)" - unfolding PP_def - proof (subst prod.insert) - have XYP_2: "\i \. \ \ XP i \ YP i \ card \ = 2" - by (auto simp: XP_def YP_def; metis Diff_iff XY_psub_P card_2_iff psubset_imp_ex_mem) - then show "{P i} \ XP i \ YP i" - by fastforce - qed (use PP_def finPP in auto) + using finPP by (simp add: PP_def prod.insert_if) also have "\ \ 2 ^ Suc k" proof (rule prod_le_power) - define XS where "XS \ (\l. {X0 i l, P i - X0 i l}) ` {..i}" - define YS where "YS \ (\l. {Y0 l i, P i - Y0 l i}) ` {i.. (\l. bla (X0 i l) (P i)) ` {..i}" + define YS where "YS \ (\l. bla (Y0 l i) (P i)) ` {i.. Suc i" "card YS \ k-i" unfolding XS_def YS_def using card_image_le by force+ with that have k': "card XS + card YS \ Suc k" by linarith have finXYS: "finite (XS \ YS)" by (simp add: XS_def YS_def) have "XP i \ YP i \ XS \ YS" by (auto simp: XP_def YP_def X_def Y_def XS_def YS_def irregular_set_def) then have "card (XP i \ YP i) \ card XS + card YS" by (meson card_Un_le card_mono finXYS order_trans) then show "card (XP i \ YP i) \ Suc k" using k' le_trans by blast fix x assume "x \ XP i \ YP i" then show "0 \ card x \ card x \ 2" - by (auto simp: XP_def YP_def card_insert_le_m1) + using XP_def YP_def card_bla by force qed auto finally show ?thesis . qed have "i' = i" if "QS i' q \ P i" "i'i < k\ inf.bounded_iff lessThan_iff subset_empty that) then have "?QinP i \ {sumr i..< sumr (Suc i)}" by (clarsimp simp: Q_def sumr_def m_def) (metis add_less_cancel_left le_add_diff_inverse part) then have "card (?QinP i) \ card {sumr i..< sumr (Suc i)}" by (meson card_mono finite_atLeastLessThan) also have "\ \ 2 ^ Suc k" using card_cr by (simp add: sumr_def r_def) finally show ?thesis . qed have "m = card {j. j < m}" by simp also have "\ \ card (\i (\i \ (\i \ (\i k * 2 ^ Suc k" by simp qed qed subsection \The Regularity Proof Itself\ text\Szemerédi's Regularity Lemma is Theorem 3.5 in Zhao's notes.\ text\We start with a trivial partition (one part). If it is already $\epsilon$-regular, we are done. If not, we refine it by applying lemma @{thm[source]"exists_refinement"} above, which increases the energy. We can repeat this step, but it cannot increase forever: by @{thm [source] mean_square_density_bounded} it cannot exceed~1. This defines an algorithm that must stop after at most $\epsilon^{-5}$ steps, resulting in an $\epsilon$-regular partition.\ theorem Szemeredi_Regularity_Lemma: assumes "\ > 0" obtains M where "\G. card (uverts G) > 0 \ \P k. regular_partition \ G P k \ k \ M" proof fix G assume "card (uverts G) > 0" then obtain finG: "finite (uverts G)" and nonempty: "uverts G \ {}" by (simp add: card_gt_0_iff) define \ where "\ \ \Q m P k. finite_graph_refines (uverts G) Q m P k \ mean_square_density G Q m \ mean_square_density G P k + \^5 \ m \ k * 2 ^ Suc k" define nxt where "nxt \ \(P,k). if regular_partition \ G P k then (P,k) else SOME (Q,m). \ Q m P k" define iter where "iter \ \i. (nxt ^^ i) ((\u. uverts G, Suc 0))" define last where "last \ Suc (nat\1 / \ ^ 5\)" have iter_Suc [simp]: "iter (Suc i) = nxt (iter i)" for i by (simp add: iter_def) have \: "\ Q m P k" if Pk: "finite_graph_partition (uverts G) P k" and irreg: "\ regular_partition \ G P k" and "(Q,m) = nxt (P,k)" for P k Q m using that exists_refinement [OF Pk finG irreg assms] irreg apply (simp add: nxt_def \_def) by (metis (mono_tags, lifting) case_prod_conv someI) have iter_finite_graph_partition: "case iter i of (P,k) \ finite_graph_partition (uverts G) P k" for i proof (induction i) case 0 then show ?case by (simp add: iter_def nonempty trivial_graph_partition_exists) next case (Suc i) with \ show ?case apply (simp add: nxt_def \_def split: prod.split) by (metis (no_types, lifting) case_prodD finite_graph_refines_def) qed have False if irreg: "\i. i\last \ (case iter i of (P,k) \ \ regular_partition \ G P k)" proof - have \_loop: "\ Q m P k" if "nxt (P,k) = (Q,m)" "iter i = (P,k)" "i\last" for i Q m P k by (metis \ case_prod_conv irreg iter_finite_graph_partition that) have iter_grow: "(case iter i of (Q,m) \ mean_square_density G Q m) \ i * \^5" if "i\last" for i using that proof (induction i) case (Suc i) then show ?case by (auto simp add: algebra_simps \_def split: prod.split prod.split_asm dest: \_loop) qed (auto simp: iter_def) have "last * \^5 \ (case iter last of (Q,m) \ mean_square_density G Q m)" by (simp add: iter_grow) also have "\ \ 1" by (metis (no_types, lifting) finG case_prod_beta iter_finite_graph_partition mean_square_density_bounded) finally have "real last * \ ^ 5 \ 1" . with assms show False unfolding last_def by (meson lessI natceiling_lessD not_less pos_divide_less_eq zero_less_power) qed then obtain i where "i \ last" and "case iter i of (P,k) \ regular_partition \ G P k" by force then have reglar: "case iter (i + d) of (P,k) \ regular_partition \ G P k" for d by (induction d) (auto simp add: nxt_def split: prod.split prod.split_asm) define tower where "tower \ \k. (power(2::nat) ^^ k) 2" have [simp]: "tower (Suc k) = 2 ^ tower k" for k by (simp add: tower_def) have iter_tower: "(case iter i of (Q,m) \ m) \ tower (2*i)" for i proof (induction i) case 0 then show ?case by (auto simp: iter_def tower_def) next case (Suc i) then obtain Q m P k where Qm: "nxt (P,k) = (Q,m)" "iter i = (P,k)" and kle: "k \ tower (2 * i)" by (metis case_prod_conv surj_pair) then have *: "m \ k * 2 ^ Suc k" using iter_finite_graph_partition [of i] \ by (smt (verit, ccfv_SIG) Suc_leD \_def case_prod_conv le_eq_less_or_eq mult_le_mono2 nxt_def power2_eq_square power2_nat_le_imp_le prod.simps(1) self_le_ge2_pow) also have "\ \ 2 ^ 2 ^ tower (2 * i)" by (metis (full_types) One_nat_def le_tower_2 lessI numeral_2_eq_2 order.trans power_increasing_iff kle) finally show ?case by (simp add: Qm) qed then show "\P k. regular_partition \ G P k \ k \ tower(2 * last)" using reglar \i \ last\ by (metis case_prod_beta nat_le_iff_add) qed text \The actual value of the bound is visible above: a tower of exponentials of height $2(1 + \epsilon^{-5})$.\ end