The proof
Erdős problem 567 - part i
**Erdős Problem 567 (Q3)** Is (the 3-dimensional hypercube) Ramsey size linear?Source
Main.lean · 759 lines · 37.6 kB
-- Erdős 567 (i): the pinned statement uses the SIZE Ramsey number
-- `SimpleGraph.sizeRamsey` (minimum EDGES in an arrowing host), whereas the
-- problem asks about the ordinary Ramsey number. The size-Ramsey reading is
-- false, and this file refutes it: with H = Kₙ, a biased first moment shows no
-- host with O(n²) edges arrows (Q₃, Kₙ), while e(Kₙ) = C(n,2).
open Erdos567 SimpleGraph
open scoped Finset
-- (Everything below is extracted verbatim by assemble.py into the submission's
-- Main.lean, where `Q3`, `sizeRamsey` and `IsRamseySizeLinear` resolve to the
-- imported originals instead of the local copies above.)
theorem q3_adj_matching (a b : Bool) : Q3.Adj ![false, a, b] ![true, a, b] := by
have h : ∀ a b : Bool,
Finset.card {k | (![false, a, b] : Fin 3 → Bool) k ≠ (![true, a, b] : Fin 3 → Bool) k} = 1 := by
decide
exact h a b
/-- Every vertex of `Q3` is an endpoint of one of the four matching edges. -/
theorem q3_matching_cover (u : Fin 3 → Bool) :
∃ a b : Bool, u = ![false, a, b] ∨ u = ![true, a, b] := by
refine ⟨u 1, u 2, ?_⟩
cases hu : u 0 with
| false => exact Or.inl (by funext k; fin_cases k <;> simp [hu])
| true => exact Or.inr (by funext k; fin_cases k <;> simp [hu])
/-- The number of ordered adjacent pairs of `R` is twice its number of edges. -/
theorem card_directed_edges {N : ℕ} (R : SimpleGraph (Fin N)) [DecidableRel R.Adj] :
Nat.card {p : Fin N × Fin N // R.Adj p.1 p.2} = 2 * R.edgeSet.ncard := by
have hne : R.edgeSet.ncard = R.edgeFinset.card := by
rw [← SimpleGraph.coe_edgeFinset, Set.ncard_coe_finset]
rw [hne, SimpleGraph.two_mul_card_edgeFinset, Nat.card_eq_fintype_card, Fintype.card_subtype]
/-- **Obligation O1 + O2.** A graph with `m` edges contains at most `(2m)^4` copies of `Q3`. -/
theorem q3_copy_count {N : ℕ} (R : SimpleGraph (Fin N)) [DecidableRel R.Adj] :
Nat.card (SimpleGraph.Copy Q3 R) ≤ (2 * R.edgeSet.ncard) ^ 4 := by
have hadj : ∀ (φ : SimpleGraph.Copy Q3 R) (a b : Bool),
R.Adj (φ ![false, a, b]) (φ ![true, a, b]) := fun φ a b =>
φ.toHom.map_adj (q3_adj_matching a b)
refine le_trans (Nat.card_le_card_of_injective
(fun φ : SimpleGraph.Copy Q3 R => fun ab : Bool × Bool =>
(⟨(φ ![false, ab.1, ab.2], φ ![true, ab.1, ab.2]), hadj φ ab.1 ab.2⟩ :
{p : Fin N × Fin N // R.Adj p.1 p.2})) ?_) ?_
· intro φ ψ h
refine SimpleGraph.Copy.ext fun u => ?_
obtain ⟨a, b, hu | hu⟩ := q3_matching_cover u <;>
· have h' := congrFun h (a, b)
rw [Subtype.mk.injEq, Prod.mk.injEq] at h'
rw [hu]
first
| exact h'.1
| exact h'.2
· rw [Nat.card_fun, card_directed_edges]
simp
/-! ### The finite Ramsey theorem
Stated for finsets of an arbitrary vertex type so that the induction can pass to
the neighbourhood / non-neighbourhood of a chosen vertex. An independent set of
`G` is recorded as a clique of `Gᶜ`. -/
/-- **Finite Ramsey theorem.** For all `s t` there is an `N` such that every
finset of at least `N` vertices contains either an `s`-clique of `G` or a
`t`-clique of `Gᶜ` (i.e. an independent set of size `t`). -/
theorem ramsey_exists_bound : ∀ s t : ℕ, ∃ N : ℕ,
∀ (V : Type) (G : SimpleGraph V) (S : Finset V), N ≤ S.card →
(∃ T ⊆ S, G.IsNClique s T) ∨ (∃ T ⊆ S, Gᶜ.IsNClique t T) := by
intro s
induction s with
| zero =>
intro t
exact ⟨0, fun _ _ _ _ => Or.inl ⟨∅, Finset.empty_subset _, isNClique_empty.mpr rfl⟩⟩
| succ s ihs =>
intro t
induction t with
| zero =>
exact ⟨0, fun _ _ _ _ => Or.inr ⟨∅, Finset.empty_subset _, isNClique_empty.mpr rfl⟩⟩
| succ t iht =>
obtain ⟨N₁, hN₁⟩ := ihs (t + 1)
obtain ⟨N₂, hN₂⟩ := iht
classical
refine ⟨N₁ + N₂ + 1, fun V G S hS => ?_⟩
obtain ⟨v, hv⟩ : S.Nonempty := Finset.card_pos.mp (by omega)
obtain ⟨A, hAdef⟩ : ∃ A, A = (S.erase v).filter (fun w => G.Adj v w) := ⟨_, rfl⟩
obtain ⟨B, hBdef⟩ : ∃ B, B = (S.erase v).filter (fun w => ¬ G.Adj v w) := ⟨_, rfl⟩
have hAmem : ∀ w ∈ A, w ∈ S ∧ v ≠ w ∧ G.Adj v w := by
intro w hw
rw [hAdef, Finset.mem_filter, Finset.mem_erase] at hw
exact ⟨hw.1.2, Ne.symm hw.1.1, hw.2⟩
have hBmem : ∀ w ∈ B, w ∈ S ∧ v ≠ w ∧ ¬ G.Adj v w := by
intro w hw
rw [hBdef, Finset.mem_filter, Finset.mem_erase] at hw
exact ⟨hw.1.2, Ne.symm hw.1.1, hw.2⟩
have hcard : (S.erase v).card = S.card - 1 := Finset.card_erase_of_mem hv
have hAB : A.card + B.card = (S.erase v).card := by
rw [hAdef, hBdef]
exact Finset.card_filter_add_card_filter_not _
have hsplit : N₁ ≤ A.card ∨ N₂ ≤ B.card := by omega
rcases hsplit with h | h
· -- `v` has many neighbours: an `s`-clique among them extends by `v`.
rcases hN₁ V G A h with ⟨T, hTA, hT⟩ | ⟨T, hTA, hT⟩
· refine Or.inl ⟨insert v T, ?_, hT.insert fun b hb => (hAmem b (hTA hb)).2.2⟩
rw [Finset.insert_subset_iff]
exact ⟨hv, fun w hw => (hAmem w (hTA hw)).1⟩
· exact Or.inr ⟨T, fun w hw => (hAmem w (hTA hw)).1, hT⟩
· -- `v` has many non-neighbours: a `t`-clique of `Gᶜ` among them extends by `v`.
rcases hN₂ V G B h with ⟨T, hTB, hT⟩ | ⟨T, hTB, hT⟩
· exact Or.inl ⟨T, fun w hw => (hBmem w (hTB hw)).1, hT⟩
· refine Or.inr ⟨insert v T, ?_, hT.insert fun b hb => ?_⟩
· rw [Finset.insert_subset_iff]
exact ⟨hv, fun w hw => (hBmem w (hTB hw)).1⟩
· rw [SimpleGraph.compl_adj]
exact ⟨(hBmem b (hTB hb)).2.1, (hBmem b (hTB hb)).2.2⟩
/-- A clique on `Fintype.card α` vertices is exactly a (not necessarily induced)
copy of the complete graph on `α`. -/
theorem top_isContained_of_isNClique {V α : Type*} [Fintype α]
{H : SimpleGraph V} {T : Finset V} (hT : H.IsNClique (Fintype.card α) T) :
(⊤ : SimpleGraph α).IsContained H := by
have h : ¬ H.CliqueFree (Fintype.card α) := hT.not_cliqueFree
rw [SimpleGraph.cliqueFree_iff_top_free] at h
exact SimpleGraph.not_free.mp h
/-- On a complete host, deleting the red graph leaves exactly the complement. -/
theorem top_sdiff_eq_compl {N : ℕ} (R : SimpleGraph (Fin N)) :
(⊤ : SimpleGraph (Fin N)) \ R = Rᶜ := by
ext a b
simp [SimpleGraph.compl_adj]
/-- **Obligation O5.** Some host graph arrows `(Q₃, Kₙ)`: the complete graph on
`R(8, n)` vertices does. Every red subgraph either has an `8`-clique — which
contains `Q₃`, since containment is not required to be induced — or leaves an
independent set of size `n`, i.e. a blue `Kₙ`. -/
theorem exists_arrows (n : ℕ) :
∃ (N : ℕ) (F : SimpleGraph (Fin N)),
∀ (R : SimpleGraph (Fin N)), R ≤ F →
Q3.IsContained R ∨ (⊤ : SimpleGraph (Fin n)).IsContained (F \ R) := by
obtain ⟨N, hN⟩ := ramsey_exists_bound 8 n
refine ⟨N, ⊤, fun R _ => ?_⟩
have huniv : N ≤ (Finset.univ : Finset (Fin N)).card := by simp
rcases hN (Fin N) R Finset.univ huniv with ⟨T, -, hT⟩ | ⟨T, -, hT⟩
· -- A red `K₈` contains `Q₃`, because containment is not induced.
have h8 : R.IsNClique (Fintype.card (Fin 3 → Bool)) T := by
rw [show Fintype.card (Fin 3 → Bool) = 8 by simp]
exact hT
exact Or.inl (SimpleGraph.IsContained.mono_left le_top
(top_isContained_of_isNClique (α := Fin 3 → Bool) h8))
· -- An independent `n`-set of `R` is a blue `Kₙ`.
have hn : Rᶜ.IsNClique (Fintype.card (Fin n)) T := by
rw [Fintype.card_fin]
exact hT
refine Or.inr ?_
rw [top_sdiff_eq_compl]
exact top_isContained_of_isNClique (α := Fin n) hn
/-- The defining set of `sizeRamsey` is nonempty, so `Nat.sInf` is not junk `0`. -/
theorem sizeRamsey_set_nonempty (n : ℕ) :
{ m | ∃ (N : ℕ) (F : SimpleGraph (Fin N)),
F.edgeSet.ncard = m ∧
∀ (R : SimpleGraph (Fin N)), R ≤ F →
Q3.IsContained R ∨ (⊤ : SimpleGraph (Fin n)).IsContained (F \ R) }.Nonempty := by
obtain ⟨N, F, hF⟩ := exists_arrows n
exact ⟨F.edgeSet.ncard, N, F, rfl, hF⟩
/-- The ordered pairs of adjacent `Q3` vertices, as a `Finset`. Stating the
adjacency test inline keeps this decidable without a `DecidableRel Q3.Adj`
declaration. -/
private def q3Pairs : Finset ((Fin 3 → Bool) × (Fin 3 → Bool)) :=
Finset.univ.filter
(fun q => Finset.card (Finset.univ.filter (fun j => q.1 j ≠ q.2 j)) = 1)
/-- The edges of `Q3`, as a `Finset` of `Sym2`. -/
private def q3Edges : Finset (Sym2 (Fin 3 → Bool)) :=
q3Pairs.image (fun q => s(q.1, q.2))
private theorem mem_q3Edges {e : Sym2 (Fin 3 → Bool)} :
e ∈ q3Edges ↔ ∃ q ∈ q3Pairs, s(q.1, q.2) = e := Finset.mem_image
private theorem q3Pairs_adj {q : (Fin 3 → Bool) × (Fin 3 → Bool)} (hq : q ∈ q3Pairs) :
Q3.Adj q.1 q.2 := (Finset.mem_filter.mp hq).2
private theorem q3Pairs_mem {u v : Fin 3 → Bool} (huv : Q3.Adj u v) : (u, v) ∈ q3Pairs :=
Finset.mem_filter.mpr ⟨Finset.mem_univ _, huv⟩
/-- `Q3` has twelve edges. -/
private theorem q3Edges_card : q3Edges.card = 12 := by decide
/-! ### Part M — the weighted first moment (copied verbatim from
`parts/FirstMomentPart.lean`) -/
section PartM
variable {ι : Type*} [DecidableEq ι]
/-- The weights `w S = p ^ S.card * (1 - p) ^ (E.card - S.card)` sum to `1` over all subsets
of `E`. This is `Finset.sum_pow_mul_eq_add_pow` plus `p + (1 - p) = 1`. -/
theorem weight_total (E : Finset ι) (p : ℝ) (hp₀ : 0 ≤ p) (hp₁ : p ≤ 1) :
∑ S ∈ E.powerset, p ^ S.card * (1 - p) ^ (E.card - S.card) = 1 := by
have hsum : p + (1 - p) = 1 := by ring
rw [Finset.sum_pow_mul_eq_add_pow, hsum, one_pow]
/-- The mass of the colourings whose red set contains a fixed `T ⊆ E` is exactly
`p ^ T.card`. Proved by the bijection `S ↦ S \ T` onto `(E \ T).powerset`, with
inverse `S ↦ S ∪ T`, which factors `p ^ T.card` out of the sum. -/
theorem weight_superset (E T : Finset ι) (hT : T ⊆ E) (p : ℝ) (hp₀ : 0 ≤ p) (hp₁ : p ≤ 1) :
∑ S ∈ E.powerset.filter (T ⊆ ·), p ^ S.card * (1 - p) ^ (E.card - S.card)
= p ^ T.card := by
have key : ∑ S ∈ E.powerset.filter (T ⊆ ·), p ^ S.card * (1 - p) ^ (E.card - S.card)
= ∑ S ∈ (E \ T).powerset,
p ^ T.card * (p ^ S.card * (1 - p) ^ ((E \ T).card - S.card)) := by
refine Finset.sum_nbij' (fun S => S \ T) (fun S => S ∪ T) ?_ ?_ ?_ ?_ ?_
· intro S hS
simp only [Finset.mem_filter, Finset.mem_powerset] at hS
simp only [Finset.mem_powerset]
exact Finset.subset_sdiff.mpr ⟨Finset.sdiff_subset.trans hS.1, Finset.sdiff_disjoint⟩
· intro S hS
simp only [Finset.mem_powerset] at hS
simp only [Finset.mem_filter, Finset.mem_powerset]
exact ⟨Finset.union_subset (hS.trans Finset.sdiff_subset) hT, Finset.subset_union_right⟩
· intro S hS
simp only [Finset.mem_filter, Finset.mem_powerset] at hS
exact Finset.sdiff_union_of_subset hS.2
· intro S hS
simp only [Finset.mem_powerset] at hS
show (S ∪ T) \ T = S
rw [Finset.union_sdiff_right]
exact Finset.sdiff_eq_self_of_disjoint (Finset.subset_sdiff.mp hS).2
· intro S hS
simp only [Finset.mem_filter, Finset.mem_powerset] at hS
obtain ⟨hSE, hTS⟩ := hS
have hTScard : T.card ≤ S.card := Finset.card_le_card hTS
have hSEcard : S.card ≤ E.card := Finset.card_le_card hSE
have h1 : (S \ T).card = S.card - T.card := Finset.card_sdiff_of_subset hTS
have h2 : (E \ T).card = E.card - T.card := Finset.card_sdiff_of_subset hT
have e2 : (E \ T).card - (S \ T).card = E.card - S.card := by omega
have e1 : S.card = (S \ T).card + T.card := by omega
rw [e2, e1, pow_add]
ring
rw [key, ← Finset.mul_sum, weight_total _ p hp₀ hp₁, mul_one]
/-- The mass of the colourings whose red set avoids a fixed `T ⊆ E` is exactly
`(1 - p) ^ T.card`. Here the index set is literally `(E \ T).powerset`, and the
factor `(1 - p) ^ T.card` splits off the exponent
`E.card - S.card = ((E \ T).card - S.card) + T.card`. -/
theorem weight_disjoint (E T : Finset ι) (hT : T ⊆ E) (p : ℝ) (hp₀ : 0 ≤ p) (hp₁ : p ≤ 1) :
∑ S ∈ E.powerset.filter (fun S => Disjoint S T), p ^ S.card * (1 - p) ^ (E.card - S.card)
= (1 - p) ^ T.card := by
have hset : E.powerset.filter (fun S => Disjoint S T) = (E \ T).powerset := by
ext S
simp [Finset.mem_filter, Finset.mem_powerset, Finset.subset_sdiff]
have key : ∀ S ∈ (E \ T).powerset,
p ^ S.card * (1 - p) ^ (E.card - S.card)
= (1 - p) ^ T.card * (p ^ S.card * (1 - p) ^ ((E \ T).card - S.card)) := by
intro S hS
simp only [Finset.mem_powerset] at hS
obtain ⟨hSE, hd⟩ := Finset.subset_sdiff.mp hS
have h2 : (E \ T).card = E.card - T.card := Finset.card_sdiff_of_subset hT
have hle : S.card + T.card ≤ E.card := by
rw [← Finset.card_union_of_disjoint hd]
exact Finset.card_le_card (Finset.union_subset hSE hT)
have e2 : E.card - S.card = ((E \ T).card - S.card) + T.card := by omega
rw [e2, pow_add]
ring
rw [hset, Finset.sum_congr rfl key, ← Finset.mul_sum, weight_total _ p hp₀ hp₁, mul_one]
end PartM
/-! ### A generic weighted union bound -/
section UnionBound
variable {ι κ : Type*}
/-- Union bound. If every element of `Bad ⊆ P` satisfies at least one of the
events `Ev k` (`k` ranging over the finite index set `I`), and each event has
mass at most `b` inside `P`, then the mass of `Bad` is at most `I.card * b`. -/
theorem sum_bad_le [DecidableEq ι]
(P Bad : Finset (Finset ι)) (I : Finset κ)
(Ev : κ → Finset ι → Prop) [∀ k S, Decidable (Ev k S)]
(w : Finset ι → ℝ) (hw : ∀ S, 0 ≤ w S)
(hBad : Bad ⊆ P)
(hcov : ∀ S ∈ Bad, ∃ k ∈ I, Ev k S)
(b : ℝ) (hb : ∀ k ∈ I, ∑ S ∈ P.filter (fun S => Ev k S), w S ≤ b) :
∑ S ∈ Bad, w S ≤ I.card * b := by
have hnn : ∀ (k : κ) (S : Finset ι), 0 ≤ (if Ev k S then w S else 0) := by
intro k S
split
· exact hw S
· exact le_rfl
have step1 : ∑ S ∈ Bad, w S ≤ ∑ S ∈ Bad, ∑ k ∈ I, (if Ev k S then w S else 0) := by
refine Finset.sum_le_sum ?_
intro S hS
obtain ⟨k, hk, hEv⟩ := hcov S hS
have h := Finset.single_le_sum (f := fun k => if Ev k S then w S else 0)
(fun m _ => hnn m S) hk
simpa [hEv] using h
have step3 : ∀ k ∈ I, ∑ S ∈ Bad, (if Ev k S then w S else 0) ≤ b := by
intro k hk
rw [← Finset.sum_filter]
refine le_trans (Finset.sum_le_sum_of_subset_of_nonneg ?_ (fun x _ _ => hw x)) (hb k hk)
exact Finset.filter_subset_filter _ hBad
calc ∑ S ∈ Bad, w S
≤ ∑ S ∈ Bad, ∑ k ∈ I, (if Ev k S then w S else 0) := step1
_ = ∑ k ∈ I, ∑ S ∈ Bad, (if Ev k S then w S else 0) := Finset.sum_comm
_ ≤ ∑ k ∈ I, b := Finset.sum_le_sum step3
_ = I.card * b := by rw [Finset.sum_const, nsmul_eq_mul]
end UnionBound
/-! ### Turning the copy-count hypothesis into a `Finset` bound -/
/-- The number of adjacency-preserving embeddings `Q3 ↪ F` is bounded by the
number of copies of `Q3` in `F`. -/
theorem card_copies_le {N : ℕ} (F : SimpleGraph (Fin N)) [DecidableRel F.Adj]
(hcopy : Nat.card (SimpleGraph.Copy Q3 F) ≤ (2 * F.edgeSet.ncard) ^ 4) :
(Finset.univ.filter
(fun φ : (Fin 3 → Bool) ↪ Fin N => ∀ q ∈ q3Pairs, F.Adj (φ q.1) (φ q.2))).card
≤ (2 * F.edgeSet.ncard) ^ 4 := by
classical
haveI : Finite (SimpleGraph.Copy Q3 F) :=
Finite.of_injective (fun f : SimpleGraph.Copy Q3 F => (⇑f : (Fin 3 → Bool) → Fin N))
DFunLike.coe_injective
refine le_trans ?_ hcopy
rw [← Nat.card_eq_finsetCard]
refine Nat.card_le_card_of_injective
(fun x => (⟨⟨fun v => (x : (Fin 3 → Bool) ↪ Fin N) v,
fun {a b} hab => (Finset.mem_filter.mp x.2).2 (a, b) (q3Pairs_mem hab)⟩,
(x : (Fin 3 → Bool) ↪ Fin N).injective⟩ : SimpleGraph.Copy Q3 F)) ?_
intro x y hxy
apply Subtype.ext
exact DFunLike.ext _ _ (fun a => DFunLike.congr_fun hxy a)
/-! ### The core estimate -/
/-- **Core estimate.** Assuming the copy-count bound, for every `c ≥ 1` and all
large `n`, no graph `F` with at most `c * C(n,2)` edges arrows `(Q₃, Kₙ)`. -/
theorem no_small_host_of_copy_bound
(hcopy : ∀ {N : ℕ} (R : SimpleGraph (Fin N)) [DecidableRel R.Adj],
Nat.card (SimpleGraph.Copy Q3 R) ≤ (2 * R.edgeSet.ncard) ^ 4)
(c : ℝ) (hc : 1 ≤ c) :
∀ᶠ n in Filter.atTop, ∀ (N : ℕ) (F : SimpleGraph (Fin N)),
(F.edgeSet.ncard : ℝ) ≤ c * (n.choose 2) →
¬ (∀ (R : SimpleGraph (Fin N)), R ≤ F →
Q3.IsContained R ∨ (⊤ : SimpleGraph (Fin n)).IsContained (F \ R)) := by
classical
-- The constants. `B = 2 ^ ⌈c⌉₊` bounds the number of `n`-cliques by `B ^ n`,
-- and `A` is chosen so that `(1 - A/n) ^ C(n,2)` beats `B ^ n`.
set C : ℕ := ⌈c⌉₊ with hCdef
set B : ℕ := 2 ^ C with hBdef
have hB1 : (1 : ℝ) ≤ (B : ℝ) := by
rw [hBdef]
exact_mod_cast Nat.one_le_two_pow
have hB0 : (0 : ℝ) < (B : ℝ) := by linarith only [hB1]
have hlogB : 0 ≤ Real.log (B : ℝ) := Real.log_nonneg hB1
set A : ℝ := 2 * Real.log (B : ℝ) + 4 with hAdef
have hA4 : (4 : ℝ) ≤ A := by rw [hAdef]; linarith only [hlogB]
have hA0 : (0 : ℝ) < A := by linarith only [hA4]
clear_value A B C
filter_upwards [Filter.eventually_ge_atTop 2,
Filter.eventually_ge_atTop ⌈A⌉₊,
Filter.eventually_gt_atTop ⌈2 * c ^ 4 * A ^ 12⌉₊,
Filter.eventually_ge_atTop ⌈(Real.log (B : ℝ) + 3) / 2⌉₊]
with n hn2 hnA hnRed hnBlue
intro N F hMle harrow
haveI : DecidableRel F.Adj := Classical.decRel _
-- Numeric preliminaries about `n`.
have hnR : (2 : ℝ) ≤ (n : ℝ) := by exact_mod_cast hn2
have hn0 : (0 : ℝ) < (n : ℝ) := by linarith only [hnR]
have hAn : A ≤ (n : ℝ) := le_trans (Nat.le_ceil A) (by exact_mod_cast hnA)
have hRedn : 2 * c ^ 4 * A ^ 12 < (n : ℝ) :=
lt_of_le_of_lt (Nat.le_ceil _) (by exact_mod_cast hnRed)
have hBluen : (Real.log (B : ℝ) + 3) / 2 ≤ (n : ℝ) :=
le_trans (Nat.le_ceil _) (by exact_mod_cast hnBlue)
-- The host's edge set.
have hncard : F.edgeSet.ncard = F.edgeFinset.card := Set.ncard_eq_toFinset_card' _
have hMcast : (F.edgeFinset.card : ℝ) ≤ c * (n.choose 2 : ℕ) := by
rw [← hncard]; exact hMle
have hchoose2 : ((n.choose 2 : ℕ) : ℝ) = (n : ℝ) * ((n : ℝ) - 1) / 2 := by
rw [Nat.cast_choose_two]
-- The bias.
set p : ℝ := A / (n : ℝ) with hpdef
have hp0 : 0 ≤ p := by rw [hpdef]; exact div_nonneg hA0.le hn0.le
have hp1 : p ≤ 1 := by
rw [hpdef, div_le_one hn0]; exact hAn
have h1p : (0 : ℝ) ≤ 1 - p := by linarith only [hp1]
clear_value p
-- Weights.
set w : Finset (Sym2 (Fin N)) → ℝ :=
fun S => p ^ S.card * (1 - p) ^ (F.edgeFinset.card - S.card) with hwdef
have hwnn : ∀ S, 0 ≤ w S := by
intro S; rw [hwdef]
exact mul_nonneg (pow_nonneg hp0 _) (pow_nonneg h1p _)
-- Red subgraphs, encoded as subsets of the host's edge set.
have hsubF : ∀ S ∈ F.edgeFinset.powerset,
SimpleGraph.fromEdgeSet (↑S : Set (Sym2 (Fin N))) ≤ F := by
intro S hS a b hab
rw [SimpleGraph.fromEdgeSet_adj] at hab
have h1 : s(a, b) ∈ S := by simpa using hab.1
have h2 : s(a, b) ∈ F.edgeFinset := Finset.mem_powerset.mp hS h1
rw [SimpleGraph.mem_edgeFinset, SimpleGraph.mem_edgeSet] at h2
exact h2
-- The two bad families.
set Red : Finset (Finset (Sym2 (Fin N))) :=
F.edgeFinset.powerset.filter
(fun S => Q3.IsContained (SimpleGraph.fromEdgeSet (↑S : Set (Sym2 (Fin N))))) with hReddef
set Blue : Finset (Finset (Sym2 (Fin N))) :=
F.edgeFinset.powerset.filter
(fun S => (⊤ : SimpleGraph (Fin n)).IsContained
(F \ SimpleGraph.fromEdgeSet (↑S : Set (Sym2 (Fin N))))) with hBluedef
have hcover : F.edgeFinset.powerset ⊆ Red ∪ Blue := by
intro S hS
rcases harrow _ (hsubF S hS) with h | h
· exact Finset.mem_union_left _ (Finset.mem_filter.mpr ⟨hS, h⟩)
· exact Finset.mem_union_right _ (Finset.mem_filter.mpr ⟨hS, h⟩)
have hsplit : (1 : ℝ) ≤ ∑ S ∈ Red, w S + ∑ S ∈ Blue, w S := by
have hone : ∑ S ∈ F.edgeFinset.powerset, w S = 1 := weight_total _ p hp0 hp1
have h1 : ∑ S ∈ F.edgeFinset.powerset, w S ≤ ∑ S ∈ Red ∪ Blue, w S :=
Finset.sum_le_sum_of_subset_of_nonneg hcover (fun x _ _ => hwnn x)
have h2 : ∑ S ∈ Red ∪ Blue, w S + ∑ S ∈ Red ∩ Blue, w S
= ∑ S ∈ Red, w S + ∑ S ∈ Blue, w S := Finset.sum_union_inter
have h3 : 0 ≤ ∑ S ∈ Red ∩ Blue, w S := Finset.sum_nonneg (fun x _ => hwnn x)
linarith only [hone, h1, h2, h3]
-- The red mass
set Copies : Finset ((Fin 3 → Bool) ↪ Fin N) :=
Finset.univ.filter (fun φ => ∀ q ∈ q3Pairs, F.Adj (φ q.1) (φ q.2)) with hCopiesdef
set T : ((Fin 3 → Bool) ↪ Fin N) → Finset (Sym2 (Fin N)) :=
fun φ => q3Edges.image (Sym2.map φ) with hTdef
have hTcard : ∀ φ : (Fin 3 → Bool) ↪ Fin N, (T φ).card = 12 := by
intro φ
rw [hTdef]
simp only
rw [Finset.card_image_of_injective _ (Sym2.map.injective φ.injective), q3Edges_card]
have hTsub : ∀ φ ∈ Copies, T φ ⊆ F.edgeFinset := by
intro φ hφ e he
have hφ' : ∀ q ∈ q3Pairs, F.Adj (φ q.1) (φ q.2) := (Finset.mem_filter.mp hφ).2
rw [hTdef] at he
simp only [Finset.mem_image] at he
obtain ⟨e', he', rfl⟩ := he
obtain ⟨q, hq, rfl⟩ := mem_q3Edges.mp he'
rw [Sym2.map_pair_eq, SimpleGraph.mem_edgeFinset, SimpleGraph.mem_edgeSet]
exact hφ' q hq
have hredcov : ∀ S ∈ Red, ∃ φ ∈ Copies, T φ ⊆ S := by
intro S hS
obtain ⟨hSmem, hcon⟩ := Finset.mem_filter.mp hS
obtain ⟨ψ⟩ := hcon
refine ⟨ψ.toEmbedding, ?_, ?_⟩
· rw [hCopiesdef]
simp only [Finset.mem_filter, Finset.mem_univ, true_and]
intro q hq
exact hsubF S hSmem (ψ.toHom.map_rel' (q3Pairs_adj hq))
· intro e he
rw [hTdef] at he
simp only [Finset.mem_image] at he
obtain ⟨e', he', rfl⟩ := he
obtain ⟨q, hq, rfl⟩ := mem_q3Edges.mp he'
have hadj := ψ.toHom.map_rel' (q3Pairs_adj hq)
rw [SimpleGraph.fromEdgeSet_adj] at hadj
rw [Sym2.map_pair_eq]
simpa using hadj.1
have hredmass : ∑ S ∈ Red, w S ≤ (Copies.card : ℝ) * p ^ 12 := by
refine sum_bad_le F.edgeFinset.powerset Red Copies (fun φ S => T φ ⊆ S) w hwnn
(Finset.filter_subset _ _) hredcov (p ^ 12) ?_
intro φ hφ
have := weight_superset F.edgeFinset (T φ) (hTsub φ hφ) p hp0 hp1
rw [hwdef]
simp only
rw [this, hTcard φ]
have hCopiesCard : (Copies.card : ℝ) ≤ (2 * (F.edgeFinset.card : ℝ)) ^ 4 := by
have h := card_copies_le F (hcopy F)
rw [hncard] at h
have h' : (Copies.card : ℝ) ≤ ((2 * F.edgeFinset.card) ^ 4 : ℕ) := by exact_mod_cast h
simpa using h'
have hredlt : ∑ S ∈ Red, w S < 1 / 2 := by
have hMbound : 2 * (F.edgeFinset.card : ℝ) ≤ c * (n : ℝ) ^ 2 := by
rw [hchoose2] at hMcast
have h2M : 2 * (F.edgeFinset.card : ℝ) ≤ c * (n : ℝ) * ((n : ℝ) - 1) := by
linarith only [hMcast]
have hcn0 : (0 : ℝ) ≤ c * (n : ℝ) := mul_nonneg (by linarith only [hc]) hn0.le
have hring : c * (n : ℝ) * ((n : ℝ) - 1) = c * (n : ℝ) ^ 2 - c * (n : ℝ) := by ring
linarith only [h2M, hcn0, hring]
have hstep1 : (Copies.card : ℝ) * p ^ 12 ≤ (c * (n : ℝ) ^ 2) ^ 4 * p ^ 12 := by
have h1 : (Copies.card : ℝ) ≤ (c * (n : ℝ) ^ 2) ^ 4 := by
refine hCopiesCard.trans ?_
gcongr
have h2 : (0 : ℝ) ≤ p ^ 12 := pow_nonneg hp0 12
exact mul_le_mul_of_nonneg_right h1 h2
have hstep2 : (c * (n : ℝ) ^ 2) ^ 4 * p ^ 12 = c ^ 4 * A ^ 12 / (n : ℝ) ^ 4 := by
rw [hpdef, div_pow]
field_simp
have hstep3 : c ^ 4 * A ^ 12 / (n : ℝ) ^ 4 < 1 / 2 := by
have hn1 : (1 : ℝ) ≤ (n : ℝ) := by linarith only [hnR]
have hpow : (n : ℝ) ≤ (n : ℝ) ^ 4 := le_self_pow₀ hn1 (by norm_num)
have hnum : (0 : ℝ) ≤ c ^ 4 * A ^ 12 :=
mul_nonneg (pow_nonneg (by linarith only [hc]) 4) (pow_nonneg hA0.le 12)
have h4 : c ^ 4 * A ^ 12 / (n : ℝ) ^ 4 ≤ c ^ 4 * A ^ 12 / (n : ℝ) :=
div_le_div_of_nonneg_left hnum hn0 hpow
have h5 : c ^ 4 * A ^ 12 / (n : ℝ) < 1 / 2 := by
rw [div_lt_iff₀ hn0]
linarith only [hRedn]
linarith only [h4, h5]
calc ∑ S ∈ Red, w S ≤ (Copies.card : ℝ) * p ^ 12 := hredmass
_ ≤ (c * (n : ℝ) ^ 2) ^ 4 * p ^ 12 := hstep1
_ = c ^ 4 * A ^ 12 / (n : ℝ) ^ 4 := hstep2
_ < 1 / 2 := hstep3
-- The blue mass
set D : Finset (Fin N) := Finset.univ.filter (fun v => n - 1 ≤ F.degree v) with hDdef
set TK : Finset (Fin N) → Finset (Sym2 (Fin N)) :=
fun K => F.edgeFinset.filter (fun e => ∀ x ∈ e, x ∈ K) with hTKdef
set Cl : Finset (Finset (Fin N)) :=
(D.powersetCard n).filter (fun K => n.choose 2 ≤ (TK K).card) with hCldef
have hTKsub : ∀ K, TK K ⊆ F.edgeFinset := by
intro K; rw [hTKdef]; exact Finset.filter_subset _ _
have hbluecov : ∀ S ∈ Blue, ∃ K ∈ Cl, Disjoint S (TK K) := by
intro S hS
obtain ⟨hSmem, hcon⟩ := Finset.mem_filter.mp hS
obtain ⟨ψ⟩ := hcon
set φ : Fin n ↪ Fin N := ψ.toEmbedding with hφdef
have hψadj : ∀ a b : Fin n, a ≠ b →
(F \ SimpleGraph.fromEdgeSet (↑S : Set (Sym2 (Fin N)))).Adj (φ a) (φ b) := by
intro a b hab
exact ψ.toHom.map_rel' (by simpa using hab)
have hFadj : ∀ a b : Fin n, a ≠ b → F.Adj (φ a) (φ b) := by
intro a b hab
have h := hψadj a b hab
rw [SimpleGraph.sdiff_adj] at h
exact h.1
set K : Finset (Fin N) := Finset.univ.image φ with hKdef
have hKcard : K.card = n := by
rw [hKdef, Finset.card_image_of_injective _ φ.injective, Finset.card_univ,
Fintype.card_fin]
have hKD : K ⊆ D := by
intro v hv
rw [hKdef] at hv
simp only [Finset.mem_image, Finset.mem_univ, true_and] at hv
obtain ⟨a, rfl⟩ := hv
rw [hDdef]
simp only [Finset.mem_filter, Finset.mem_univ, true_and]
have hsub : (Finset.univ.erase a).image φ ⊆ F.neighborFinset (φ a) := by
intro x hx
simp only [Finset.mem_image, Finset.mem_erase, Finset.mem_univ, and_true] at hx
obtain ⟨b, hb, rfl⟩ := hx
rw [SimpleGraph.mem_neighborFinset]
exact hFadj a b (Ne.symm hb)
have hcard : ((Finset.univ.erase a).image φ).card = n - 1 := by
rw [Finset.card_image_of_injective _ φ.injective, Finset.card_erase_of_mem
(Finset.mem_univ a), Finset.card_univ, Fintype.card_fin]
calc n - 1 = ((Finset.univ.erase a).image φ).card := hcard.symm
_ ≤ (F.neighborFinset (φ a)).card := Finset.card_le_card hsub
_ = F.degree (φ a) := rfl
have hTKbig : n.choose 2 ≤ (TK K).card := by
have hsub : ((⊤ : SimpleGraph (Fin n)).edgeFinset).image (Sym2.map φ) ⊆ TK K := by
intro e he
simp only [Finset.mem_image] at he
obtain ⟨e', he', rfl⟩ := he
revert he'
induction e' using Sym2.ind with
| _ a b =>
intro he'
rw [SimpleGraph.mem_edgeFinset, SimpleGraph.mem_edgeSet, SimpleGraph.top_adj] at he'
rw [hTKdef]
simp only [Sym2.map_pair_eq, Finset.mem_filter, SimpleGraph.mem_edgeFinset,
SimpleGraph.mem_edgeSet]
refine ⟨hFadj a b he', ?_⟩
intro x hx
rw [Sym2.mem_iff] at hx
rw [hKdef]
rcases hx with rfl | rfl <;>
simp only [Finset.mem_image, Finset.mem_univ, true_and] <;> [exact ⟨a, rfl⟩; exact ⟨b, rfl⟩]
have hcard : (((⊤ : SimpleGraph (Fin n)).edgeFinset).image (Sym2.map φ)).card
= n.choose 2 := by
rw [Finset.card_image_of_injective _ (Sym2.map.injective φ.injective),
SimpleGraph.card_edgeFinset_top_eq_card_choose_two, Fintype.card_fin]
calc n.choose 2 = (((⊤ : SimpleGraph (Fin n)).edgeFinset).image (Sym2.map φ)).card :=
hcard.symm
_ ≤ (TK K).card := Finset.card_le_card hsub
refine ⟨K, ?_, ?_⟩
· rw [hCldef]
simp only [Finset.mem_filter, Finset.mem_powersetCard]
exact ⟨⟨hKD, hKcard⟩, hTKbig⟩
· rw [Finset.disjoint_left]
intro e heS heTK
rw [hTKdef] at heTK
simp only [Finset.mem_filter] at heTK
obtain ⟨heF, heK⟩ := heTK
revert heS heK
induction e using Sym2.ind with
| _ x y =>
intro heS heK
have hxy : x ≠ y := by
have := SimpleGraph.not_isDiag_of_mem_edgeSet F (SimpleGraph.mem_edgeFinset.mp heF)
simpa using this
have hxK : x ∈ K := heK x (by simp)
have hyK : y ∈ K := heK y (by simp)
rw [hKdef] at hxK hyK
simp only [Finset.mem_image, Finset.mem_univ, true_and] at hxK hyK
obtain ⟨a, rfl⟩ := hxK
obtain ⟨b, rfl⟩ := hyK
have hab : a ≠ b := fun h => hxy (by rw [h])
have h := hψadj a b hab
rw [SimpleGraph.sdiff_adj] at h
refine h.2 ?_
rw [SimpleGraph.fromEdgeSet_adj]
exact ⟨by simpa using heS, hxy⟩
have hbluemass : ∑ S ∈ Blue, w S ≤ (Cl.card : ℝ) * (1 - p) ^ (n.choose 2) := by
refine sum_bad_le F.edgeFinset.powerset Blue Cl (fun K S => Disjoint S (TK K)) w hwnn
(Finset.filter_subset _ _) hbluecov ((1 - p) ^ (n.choose 2)) ?_
intro K hK
have hbig : n.choose 2 ≤ (TK K).card := (Finset.mem_filter.mp hK).2
have heq := weight_disjoint F.edgeFinset (TK K) (hTKsub K) p hp0 hp1
rw [hwdef]
simp only
rw [heq]
exact pow_le_pow_of_le_one h1p (by linarith) hbig
-- The number of candidate cliques.
have hDdegsum : D.card * (n - 1) ≤ 2 * F.edgeFinset.card := by
have h1 : D.card • (n - 1) ≤ ∑ v ∈ D, F.degree v :=
Finset.card_nsmul_le_sum D (fun v => F.degree v) (n - 1)
(fun v hv => (Finset.mem_filter.mp hv).2)
have h2 : ∑ v ∈ D, F.degree v ≤ ∑ v : Fin N, F.degree v :=
Finset.sum_le_sum_of_subset (Finset.subset_univ D)
rw [smul_eq_mul] at h1
have h3 : ∑ v : Fin N, F.degree v = 2 * F.edgeFinset.card :=
SimpleGraph.sum_degrees_eq_twice_card_edges F
calc D.card * (n - 1) ≤ ∑ v ∈ D, F.degree v := h1
_ ≤ ∑ v : Fin N, F.degree v := h2
_ = 2 * F.edgeFinset.card := h3
have hDnat : D.card ≤ C * n := by
have hcastsub : ((n - 1 : ℕ) : ℝ) = (n : ℝ) - 1 := by
rw [Nat.cast_sub (by omega : 1 ≤ n), Nat.cast_one]
have h1 : (D.card : ℝ) * ((n : ℝ) - 1) ≤ 2 * (F.edgeFinset.card : ℝ) := by
have := hDdegsum
have hcast : ((D.card * (n - 1) : ℕ) : ℝ) ≤ ((2 * F.edgeFinset.card : ℕ) : ℝ) := by
exact_mod_cast this
push_cast [hcastsub] at hcast
linarith only [hcast]
have h2 : 2 * (F.edgeFinset.card : ℝ) ≤ c * (n : ℝ) * ((n : ℝ) - 1) := by
rw [hchoose2] at hMcast
linarith only [hMcast]
have h3 : (D.card : ℝ) * ((n : ℝ) - 1) ≤ (c * (n : ℝ)) * ((n : ℝ) - 1) := by
have hassoc : c * (n : ℝ) * ((n : ℝ) - 1) = (c * (n : ℝ)) * ((n : ℝ) - 1) := by ring
linarith only [h1, h2, hassoc]
have h4 : (0 : ℝ) < (n : ℝ) - 1 := by linarith only [hnR]
have h5 : (D.card : ℝ) ≤ c * (n : ℝ) := le_of_mul_le_mul_right h3 h4
have h6 : c ≤ (C : ℝ) := by rw [hCdef]; exact Nat.le_ceil c
have h7 : (D.card : ℝ) ≤ ((C * n : ℕ) : ℝ) := by
have hcn : c * (n : ℝ) ≤ (C : ℝ) * (n : ℝ) :=
mul_le_mul_of_nonneg_right h6 hn0.le
have hchain : (D.card : ℝ) ≤ (C : ℝ) * (n : ℝ) := le_trans h5 hcn
push_cast
exact hchain
exact_mod_cast h7
have hClcard : (Cl.card : ℝ) ≤ (B : ℝ) ^ n := by
have h1 : Cl.card ≤ (D.powersetCard n).card := Finset.card_filter_le _ _
have h2 : (D.powersetCard n).card = D.card.choose n := Finset.card_powersetCard _ _
have h3 : D.card.choose n ≤ B ^ n := by
calc D.card.choose n ≤ 2 ^ D.card := Nat.choose_le_two_pow _ _
_ ≤ 2 ^ (C * n) := Nat.pow_le_pow_right (by norm_num) hDnat
_ = B ^ n := by rw [hBdef, ← pow_mul]
have h4 : Cl.card ≤ B ^ n := le_trans (h1.trans (le_of_eq h2)) h3
exact_mod_cast h4
have hbluelt : ∑ S ∈ Blue, w S < 1 / 2 := by
have hexpbound : (1 - p) ^ (n.choose 2) ≤ Real.exp (-(A * ((n : ℝ) - 1) / 2)) := by
have hle : (1 - p) ≤ Real.exp (-p) := by
have h := Real.add_one_le_exp (-p); linarith only [h]
calc (1 - p) ^ (n.choose 2) ≤ (Real.exp (-p)) ^ (n.choose 2) := by gcongr
_ = Real.exp ((n.choose 2 : ℕ) * (-p)) := (Real.exp_nat_mul (-p) _).symm
_ = Real.exp (-(A * ((n : ℝ) - 1) / 2)) := by
congr 1
rw [hchoose2, hpdef]
field_simp
have hBexp : (B : ℝ) ^ n = Real.exp ((n : ℝ) * Real.log (B : ℝ)) := by
rw [Real.exp_nat_mul, Real.exp_log hB0]
have hprod : (B : ℝ) ^ n * Real.exp (-(A * ((n : ℝ) - 1) / 2))
= Real.exp ((n : ℝ) * Real.log (B : ℝ) - A * ((n : ℝ) - 1) / 2) := by
rw [hBexp, ← Real.exp_add]
ring_nf
have harg : (n : ℝ) * Real.log (B : ℝ) - A * ((n : ℝ) - 1) / 2 ≤ -1 := by
have hid : (n : ℝ) * Real.log (B : ℝ) - (2 * Real.log (B : ℝ) + 4) * ((n : ℝ) - 1) / 2
= Real.log (B : ℝ) - 2 * (n : ℝ) + 2 := by ring
rw [hAdef, hid]
linarith only [hBluen]
have hexp1 : Real.exp (-1 : ℝ) < 1 / 2 := by
have h2e : (2 : ℝ) < Real.exp 1 := by
have h := Real.exp_one_gt_d9; linarith only [h]
rw [Real.exp_neg, inv_eq_one_div, div_lt_div_iff₀ (Real.exp_pos 1) (by norm_num)]
linarith only [h2e]
have hfinal : (B : ℝ) ^ n * (1 - p) ^ (n.choose 2) < 1 / 2 := by
have hBpos : (0 : ℝ) < (B : ℝ) ^ n := pow_pos hB0 n
calc (B : ℝ) ^ n * (1 - p) ^ (n.choose 2)
≤ (B : ℝ) ^ n * Real.exp (-(A * ((n : ℝ) - 1) / 2)) := by
exact mul_le_mul_of_nonneg_left hexpbound (le_of_lt hBpos)
_ = Real.exp ((n : ℝ) * Real.log (B : ℝ) - A * ((n : ℝ) - 1) / 2) := hprod
_ ≤ Real.exp (-1 : ℝ) := Real.exp_le_exp.mpr harg
_ < 1 / 2 := hexp1
have hstep : (Cl.card : ℝ) * (1 - p) ^ (n.choose 2) ≤ (B : ℝ) ^ n * (1 - p) ^ (n.choose 2) :=
mul_le_mul_of_nonneg_right hClcard (pow_nonneg h1p _)
linarith only [hbluemass, hstep, hfinal]
linarith only [hsplit, hredlt, hbluelt]
/-- Core estimate: no host with few edges can arrow `(Q3, Kₙ)`. -/
theorem no_small_host (c : ℝ) (hc : 1 ≤ c) :
∀ᶠ n in Filter.atTop, ∀ (N : ℕ) (F : SimpleGraph (Fin N)),
(F.edgeSet.ncard : ℝ) ≤ c * (n.choose 2) →
¬ (∀ (R : SimpleGraph (Fin N)), R ≤ F →
Q3.IsContained R ∨ (⊤ : SimpleGraph (Fin n)).IsContained (F \ R)) :=
no_small_host_of_copy_bound (fun R => q3_copy_count R) c hc
/-! ### Assembly -/
/-- `Kₙ` has `n.choose 2` edges. -/
theorem top_edgeSet_ncard (n : ℕ) :
(⊤ : SimpleGraph (Fin n)).edgeSet.ncard = n.choose 2 := by
classical
rw [Set.ncard_eq_toFinset_card', ← SimpleGraph.edgeFinset,
SimpleGraph.card_edgeFinset_top_eq_card_choose_two, Fintype.card_fin]
/-- `Kₙ` has no isolated vertices once `2 ≤ n`. -/
theorem top_degree_pos {n : ℕ} (hn : 2 ≤ n) (v : Fin n) :
0 < (⊤ : SimpleGraph (Fin n)).degree v := by
classical
have : (⊤ : SimpleGraph (Fin n)).degree v = n - 1 := by
simpa using SimpleGraph.complete_graph_degree (V := Fin n) v
omega
/-- **The refutation.** -/
theorem not_isRamseySizeLinear_Q3 : ¬ IsRamseySizeLinear Q3 := by
classical
rintro ⟨c, hc, h⟩
-- Enlarging `c` only weakens the hypothesis, so we may assume `1 ≤ c`.
set c' : ℝ := max c 1 with hc'def
have hc1 : 1 ≤ c' := le_max_right _ _
have hcc' : c ≤ c' := le_max_left _ _
have h' : ∀ (n : ℕ) (H : SimpleGraph (Fin n)) [DecidableRel H.Adj],
(∀ v, 0 < H.degree v) → (sizeRamsey Q3 H : ℝ) ≤ c' * H.edgeSet.ncard := by
intro n H _ hH
refine (h n H hH).trans ?_
have : (0 : ℝ) ≤ H.edgeSet.ncard := Nat.cast_nonneg _
nlinarith
-- Pick `n` large enough for the core estimate, and at least `2`.
obtain ⟨n, hn, hn2⟩ :=
((no_small_host c' hc1).and (Filter.eventually_ge_atTop 2)).exists
-- The size-Ramsey value is attained by some host `F`.
obtain ⟨N, F, hFcard, hFarrows⟩ :=
Nat.sInf_mem (sizeRamsey_set_nonempty n)
-- That host has few edges, by the assumed linear bound.
have hbound : (F.edgeSet.ncard : ℝ) ≤ c' * (n.choose 2) := by
have hle := h' n (⊤ : SimpleGraph (Fin n)) (top_degree_pos hn2)
rw [top_edgeSet_ncard] at hle
-- `hFcard` identifies `e(F)` with the size-Ramsey value definitionally.
rwa [show F.edgeSet.ncard = sizeRamsey Q3 (⊤ : SimpleGraph (Fin n)) from hFcard]
exact hn N F hbound hFarrows
/-- The bundle's target statement. -/
theorem main : ¬ (True ↔ IsRamseySizeLinear Q3) := by
intro h
exact not_isRamseySizeLinear_Q3 (h.mp trivial)
theorem target : ¬ (fcTypeOfName% "Erdos567.erdos_567.parts.i") := main
Provenance
- Proof SHA-256
- sha256:3d728d81fce6fa76fad04a236384032d47763a284b7be0ab38bfbfa7036d0182
- Solver
- 5H3ZSq…NHznXs
- Attribution
- conjectures.io