/-
Copyright 2026 The Formal Conjectures Authors.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
https://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-/modulepublicimportFormalConjecturesForMathlib.Combinatorics.RamseypublicimportMathlib.Data.Nat.Choose.Central
Erdős–Szekeres 1935 upper bound for the diagonal Ramsey number
Statement (Erdős–Szekeres 1935): For every k : ℕ, the diagonal Ramsey number satisfies
Combinatorics.hypergraphRamsey 2 k ≤ 4 ^ k.
Proof sketch. Use the symmetric recursion R(s, t) ≤ R(s-1, t) + R(s, t-1) with base
cases R(0, t) = R(s, 0) = 1. Induction on s + t then gives R(s, t) ≤ C(s+t, s); for
s = t = k this is R(k, k) ≤ C(2k, k) ≤ 4 ^ k (the Catalan-like central binomial
coefficient bound).
The whole argument is phrased directly on the Mathlib-style coloring data
c : Finset (Fin m) → Bool of 2-element subsets — no auxiliary "edge colouring" structure
is introduced.
Reference: [ES35] Erdős, P. and Szekeres, G. (1935). "A combinatorial problem in
geometry." Compositio Math.2, pp. 463–470.
Off-diagonal Ramsey via a subset-indexed predicate
Rather than introduce an auxiliary edge-colouring structure, we phrase the off-diagonal
Ramsey statement as a property of an arbitrary Finset (Fin m) of sufficient cardinality
inside a Bool-valued coloring of all subsets of Fin m. We only ever query the coloring
on 2-element subsets. This setup matches the shape of
Combinatorics.hypergraphRamsey 2 directly.
HasRamseyProperty N s t asserts: for every m, every coloring
c : Finset (Fin m) → Bool, and every V : Finset (Fin m) with V.card ≥ N, the subset
V contains either a subset of size s whose 2-element subsets are all false-coloured,
or a subset of size t whose 2-element subsets are all true-coloured.
This is the "off-diagonal Ramsey number does not exceed N" form of the classical
Erdős–Szekeres Ramsey recurrence, packaged in the same shape used by
Combinatorics.hypergraphRamsey.
Pigeonhole step: splitting V \ {v} by colour. For any vertex v ∈ V, the set
V.erase v partitions into false-neighbours of v and true-neighbours of v, and the
cardinalities sum to V.card - 1.
Extending a b-monochromatic clique S by a vertex v that is b-adjacent to every
element of S. Parameterised over the colour b : Bool, this covers both the false and
true extension steps used in HasRamseyProperty.step.
privatelemmamono_insert{m:ℕ}{c:Finset(Finm)→Bool}{b:Bool}{S:Finset(Finm)}(hSmono:∀e⊆S,e.card=2→ce=b){v:Finm}(hvAdj:∀u∈S,c{v,u}=b):∀e⊆insertvS,e.card=2→ce=b:=bym:ℕc:Finset(Finm)→Boolb:BoolS:Finset(Finm)hSmono:∀e⊆S,e.card=2→ce=bv:FinmhvAdj:∀u∈S,c{v,u}=b⊢ ∀e⊆insertvS,e.card=2→ce=bclassicalintroehehecardm:ℕc:Finset(Finm)→Boolb:BoolS:Finset(Finm)hSmono:∀e⊆S,e.card=2→ce=bv:FinmhvAdj:∀u∈S,c{v,u}=be:Finset(Finm)he:e⊆insertvShecard:e.card=2⊢ ce=bobtain⟨x,y,hxy,rfl⟩:=Finset.card_eq_two.mphecardm:ℕc:Finset(Finm)→Boolb:BoolS:Finset(Finm)hSmono:∀e⊆S,e.card=2→ce=bv:FinmhvAdj:∀u∈S,c{v,u}=bx:Finmy:Finmhxy:x≠yhe:{x,y}⊆insertvShecard:{x,y}.card=2⊢ c{x,y}=b-- Each of x, y is in insert v S, so equals v or lives in S.havehx:x∈insertvS:=he(Finset.mem_insert_self__)m:ℕc:Finset(Finm)→Boolb:BoolS:Finset(Finm)hSmono:∀e⊆S,e.card=2→ce=bv:FinmhvAdj:∀u∈S,c{v,u}=bx:Finmy:Finmhxy:x≠yhe:{x,y}⊆insertvShecard:{x,y}.card=2hx:x∈insertvS⊢ c{x,y}=bhavehy:y∈insertvS:=he(Finset.mem_insert_of_mem(Finset.mem_singleton.mprrfl))m:ℕc:Finset(Finm)→Boolb:BoolS:Finset(Finm)hSmono:∀e⊆S,e.card=2→ce=bv:FinmhvAdj:∀u∈S,c{v,u}=bx:Finmy:Finmhxy:x≠yhe:{x,y}⊆insertvShecard:{x,y}.card=2hx:x∈insertvShy:y∈insertvS⊢ c{x,y}=brcasesFinset.mem_insert.mphxwithhx_eq|hxSinlm:ℕc:Finset(Finm)→Boolb:BoolS:Finset(Finm)hSmono:∀e⊆S,e.card=2→ce=bv:FinmhvAdj:∀u∈S,c{v,u}=bx:Finmy:Finmhxy:x≠yhe:{x,y}⊆insertvShecard:{x,y}.card=2hx:x∈insertvShy:y∈insertvShx_eq:x=v⊢ c{x,y}=binrm:ℕc:Finset(Finm)→Boolb:BoolS:Finset(Finm)hSmono:∀e⊆S,e.card=2→ce=bv:FinmhvAdj:∀u∈S,c{v,u}=bx:Finmy:Finmhxy:x≠yhe:{x,y}⊆insertvShecard:{x,y}.card=2hx:x∈insertvShy:y∈insertvShxS:x∈S⊢ c{x,y}=b·inlm:ℕc:Finset(Finm)→Boolb:BoolS:Finset(Finm)hSmono:∀e⊆S,e.card=2→ce=bv:FinmhvAdj:∀u∈S,c{v,u}=bx:Finmy:Finmhxy:x≠yhe:{x,y}⊆insertvShecard:{x,y}.card=2hx:x∈insertvShy:y∈insertvShx_eq:x=v⊢ c{x,y}=brcasesFinset.mem_insert.mphywithhy_eq|hySinl.inlm:ℕc:Finset(Finm)→Boolb:BoolS:Finset(Finm)hSmono:∀e⊆S,e.card=2→ce=bv:FinmhvAdj:∀u∈S,c{v,u}=bx:Finmy:Finmhxy:x≠yhe:{x,y}⊆insertvShecard:{x,y}.card=2hx:x∈insertvShy:y∈insertvShx_eq:x=vhy_eq:y=v⊢ c{x,y}=binl.inrm:ℕc:Finset(Finm)→Boolb:BoolS:Finset(Finm)hSmono:∀e⊆S,e.card=2→ce=bv:FinmhvAdj:∀u∈S,c{v,u}=bx:Finmy:Finmhxy:x≠yhe:{x,y}⊆insertvShecard:{x,y}.card=2hx:x∈insertvShy:y∈insertvShx_eq:x=vhyS:y∈S⊢ c{x,y}=b·inl.inlm:ℕc:Finset(Finm)→Boolb:BoolS:Finset(Finm)hSmono:∀e⊆S,e.card=2→ce=bv:FinmhvAdj:∀u∈S,c{v,u}=bx:Finmy:Finmhxy:x≠yhe:{x,y}⊆insertvShecard:{x,y}.card=2hx:x∈insertvShy:y∈insertvShx_eq:x=vhy_eq:y=v⊢ c{x,y}=bexact(hxy(hx_eq.transhy_eq.symm)).elimAll goals completed! 🐙·inl.inrm:ℕc:Finset(Finm)→Boolb:BoolS:Finset(Finm)hSmono:∀e⊆S,e.card=2→ce=bv:FinmhvAdj:∀u∈S,c{v,u}=bx:Finmy:Finmhxy:x≠yhe:{x,y}⊆insertvShecard:{x,y}.card=2hx:x∈insertvShy:y∈insertvShx_eq:x=vhyS:y∈S⊢ c{x,y}=b-- x = v, y ∈ S; pair {x, y} = {v, y}, use hvAdj.rw[hx_eqinl.inrm:ℕc:Finset(Finm)→Boolb:BoolS:Finset(Finm)hSmono:∀e⊆S,e.card=2→ce=bv:FinmhvAdj:∀u∈S,c{v,u}=bx:Finmy:Finmhxy:x≠yhe:{x,y}⊆insertvShecard:{x,y}.card=2hx:x∈insertvShy:y∈insertvShx_eq:x=vhyS:y∈S⊢ c{v,y}=binl.inrm:ℕc:Finset(Finm)→Boolb:BoolS:Finset(Finm)hSmono:∀e⊆S,e.card=2→ce=bv:FinmhvAdj:∀u∈S,c{v,u}=bx:Finmy:Finmhxy:x≠yhe:{x,y}⊆insertvShecard:{x,y}.card=2hx:x∈insertvShy:y∈insertvShx_eq:x=vhyS:y∈S⊢ c{v,y}=b]inl.inrm:ℕc:Finset(Finm)→Boolb:BoolS:Finset(Finm)hSmono:∀e⊆S,e.card=2→ce=bv:FinmhvAdj:∀u∈S,c{v,u}=bx:Finmy:Finmhxy:x≠yhe:{x,y}⊆insertvShecard:{x,y}.card=2hx:x∈insertvShy:y∈insertvShx_eq:x=vhyS:y∈S⊢ c{v,y}=b;exacthvAdjyhySAll goals completed! 🐙·inrm:ℕc:Finset(Finm)→Boolb:BoolS:Finset(Finm)hSmono:∀e⊆S,e.card=2→ce=bv:FinmhvAdj:∀u∈S,c{v,u}=bx:Finmy:Finmhxy:x≠yhe:{x,y}⊆insertvShecard:{x,y}.card=2hx:x∈insertvShy:y∈insertvShxS:x∈S⊢ c{x,y}=brcasesFinset.mem_insert.mphywithhy_eq|hySinr.inlm:ℕc:Finset(Finm)→Boolb:BoolS:Finset(Finm)hSmono:∀e⊆S,e.card=2→ce=bv:FinmhvAdj:∀u∈S,c{v,u}=bx:Finmy:Finmhxy:x≠yhe:{x,y}⊆insertvShecard:{x,y}.card=2hx:x∈insertvShy:y∈insertvShxS:x∈Shy_eq:y=v⊢ c{x,y}=binr.inrm:ℕc:Finset(Finm)→Boolb:BoolS:Finset(Finm)hSmono:∀e⊆S,e.card=2→ce=bv:FinmhvAdj:∀u∈S,c{v,u}=bx:Finmy:Finmhxy:x≠yhe:{x,y}⊆insertvShecard:{x,y}.card=2hx:x∈insertvShy:y∈insertvShxS:x∈ShyS:y∈S⊢ c{x,y}=b·inr.inlm:ℕc:Finset(Finm)→Boolb:BoolS:Finset(Finm)hSmono:∀e⊆S,e.card=2→ce=bv:FinmhvAdj:∀u∈S,c{v,u}=bx:Finmy:Finmhxy:x≠yhe:{x,y}⊆insertvShecard:{x,y}.card=2hx:x∈insertvShy:y∈insertvShxS:x∈Shy_eq:y=v⊢ c{x,y}=b-- x ∈ S, y = v; pair {x, y} = {x, v} = {v, x}.rw[hy_eq,inr.inlm:ℕc:Finset(Finm)→Boolb:BoolS:Finset(Finm)hSmono:∀e⊆S,e.card=2→ce=bv:FinmhvAdj:∀u∈S,c{v,u}=bx:Finmy:Finmhxy:x≠yhe:{x,y}⊆insertvShecard:{x,y}.card=2hx:x∈insertvShy:y∈insertvShxS:x∈Shy_eq:y=v⊢ c{x,v}=binr.inlm:ℕc:Finset(Finm)→Boolb:BoolS:Finset(Finm)hSmono:∀e⊆S,e.card=2→ce=bv:FinmhvAdj:∀u∈S,c{v,u}=bx:Finmy:Finmhxy:x≠yhe:{x,y}⊆insertvShecard:{x,y}.card=2hx:x∈insertvShy:y∈insertvShxS:x∈Shy_eq:y=v⊢ c{v,x}=bFinset.pair_comminr.inlm:ℕc:Finset(Finm)→Boolb:BoolS:Finset(Finm)hSmono:∀e⊆S,e.card=2→ce=bv:FinmhvAdj:∀u∈S,c{v,u}=bx:Finmy:Finmhxy:x≠yhe:{x,y}⊆insertvShecard:{x,y}.card=2hx:x∈insertvShy:y∈insertvShxS:x∈Shy_eq:y=v⊢ c{v,x}=binr.inlm:ℕc:Finset(Finm)→Boolb:BoolS:Finset(Finm)hSmono:∀e⊆S,e.card=2→ce=bv:FinmhvAdj:∀u∈S,c{v,u}=bx:Finmy:Finmhxy:x≠yhe:{x,y}⊆insertvShecard:{x,y}.card=2hx:x∈insertvShy:y∈insertvShxS:x∈Shy_eq:y=v⊢ c{v,x}=b]inr.inlm:ℕc:Finset(Finm)→Boolb:BoolS:Finset(Finm)hSmono:∀e⊆S,e.card=2→ce=bv:FinmhvAdj:∀u∈S,c{v,u}=bx:Finmy:Finmhxy:x≠yhe:{x,y}⊆insertvShecard:{x,y}.card=2hx:x∈insertvShy:y∈insertvShxS:x∈Shy_eq:y=v⊢ c{v,x}=b;exacthvAdjxhxSAll goals completed! 🐙·inr.inrm:ℕc:Finset(Finm)→Boolb:BoolS:Finset(Finm)hSmono:∀e⊆S,e.card=2→ce=bv:FinmhvAdj:∀u∈S,c{v,u}=bx:Finmy:Finmhxy:x≠yhe:{x,y}⊆insertvShecard:{x,y}.card=2hx:x∈insertvShy:y∈insertvShxS:x∈ShyS:y∈S⊢ c{x,y}=b-- {x, y} ⊆ S.havehsub:({x,y}:Finset(Finm))⊆S:=bym:ℕc:Finset(Finm)→Boolb:BoolS:Finset(Finm)hSmono:∀e⊆S,e.card=2→ce=bv:FinmhvAdj:∀u∈S,c{v,u}=b⊢ ∀e⊆insertvS,e.card=2→ce=binr.inrm:ℕc:Finset(Finm)→Boolb:BoolS:Finset(Finm)hSmono:∀e⊆S,e.card=2→ce=bv:FinmhvAdj:∀u∈S,c{v,u}=bx:Finmy:Finmhxy:x≠yhe:{x,y}⊆insertvShecard:{x,y}.card=2hx:x∈insertvShy:y∈insertvShxS:x∈ShyS:y∈Shsub:{x,y}⊆S⊢ c{x,y}=bintrozhzm:ℕc:Finset(Finm)→Boolb:BoolS:Finset(Finm)hSmono:∀e⊆S,e.card=2→ce=bv:FinmhvAdj:∀u∈S,c{v,u}=bx:Finmy:Finmhxy:x≠yhe:{x,y}⊆insertvShecard:{x,y}.card=2hx:x∈insertvShy:y∈insertvShxS:x∈ShyS:y∈Sz:Finmhz:z∈{x,y}⊢ z∈Sinr.inrm:ℕc:Finset(Finm)→Boolb:BoolS:Finset(Finm)hSmono:∀e⊆S,e.card=2→ce=bv:FinmhvAdj:∀u∈S,c{v,u}=bx:Finmy:Finmhxy:x≠yhe:{x,y}⊆insertvShecard:{x,y}.card=2hx:x∈insertvShy:y∈insertvShxS:x∈ShyS:y∈Shsub:{x,y}⊆S⊢ c{x,y}=brcasesFinset.mem_insert.mphzwithhz_eq|hz'inlm:ℕc:Finset(Finm)→Boolb:BoolS:Finset(Finm)hSmono:∀e⊆S,e.card=2→ce=bv:FinmhvAdj:∀u∈S,c{v,u}=bx:Finmy:Finmhxy:x≠yhe:{x,y}⊆insertvShecard:{x,y}.card=2hx:x∈insertvShy:y∈insertvShxS:x∈ShyS:y∈Sz:Finmhz:z∈{x,y}hz_eq:z=x⊢ z∈Sinrm:ℕc:Finset(Finm)→Boolb:BoolS:Finset(Finm)hSmono:∀e⊆S,e.card=2→ce=bv:FinmhvAdj:∀u∈S,c{v,u}=bx:Finmy:Finmhxy:x≠yhe:{x,y}⊆insertvShecard:{x,y}.card=2hx:x∈insertvShy:y∈insertvShxS:x∈ShyS:y∈Sz:Finmhz:z∈{x,y}hz':z∈{y}⊢ z∈Sinr.inrm:ℕc:Finset(Finm)→Boolb:BoolS:Finset(Finm)hSmono:∀e⊆S,e.card=2→ce=bv:FinmhvAdj:∀u∈S,c{v,u}=bx:Finmy:Finmhxy:x≠yhe:{x,y}⊆insertvShecard:{x,y}.card=2hx:x∈insertvShy:y∈insertvShxS:x∈ShyS:y∈Shsub:{x,y}⊆S⊢ c{x,y}=b·inlm:ℕc:Finset(Finm)→Boolb:BoolS:Finset(Finm)hSmono:∀e⊆S,e.card=2→ce=bv:FinmhvAdj:∀u∈S,c{v,u}=bx:Finmy:Finmhxy:x≠yhe:{x,y}⊆insertvShecard:{x,y}.card=2hx:x∈insertvShy:y∈insertvShxS:x∈ShyS:y∈Sz:Finmhz:z∈{x,y}hz_eq:z=x⊢ z∈Sinr.inrm:ℕc:Finset(Finm)→Boolb:BoolS:Finset(Finm)hSmono:∀e⊆S,e.card=2→ce=bv:FinmhvAdj:∀u∈S,c{v,u}=bx:Finmy:Finmhxy:x≠yhe:{x,y}⊆insertvShecard:{x,y}.card=2hx:x∈insertvShy:y∈insertvShxS:x∈ShyS:y∈Shsub:{x,y}⊆S⊢ c{x,y}=brw[hz_eqinlm:ℕc:Finset(Finm)→Boolb:BoolS:Finset(Finm)hSmono:∀e⊆S,e.card=2→ce=bv:FinmhvAdj:∀u∈S,c{v,u}=bx:Finmy:Finmhxy:x≠yhe:{x,y}⊆insertvShecard:{x,y}.card=2hx:x∈insertvShy:y∈insertvShxS:x∈ShyS:y∈Sz:Finmhz:z∈{x,y}hz_eq:z=x⊢ x∈Sinlm:ℕc:Finset(Finm)→Boolb:BoolS:Finset(Finm)hSmono:∀e⊆S,e.card=2→ce=bv:FinmhvAdj:∀u∈S,c{v,u}=bx:Finmy:Finmhxy:x≠yhe:{x,y}⊆insertvShecard:{x,y}.card=2hx:x∈insertvShy:y∈insertvShxS:x∈ShyS:y∈Sz:Finmhz:z∈{x,y}hz_eq:z=x⊢ x∈Sinr.inrm:ℕc:Finset(Finm)→Boolb:BoolS:Finset(Finm)hSmono:∀e⊆S,e.card=2→ce=bv:FinmhvAdj:∀u∈S,c{v,u}=bx:Finmy:Finmhxy:x≠yhe:{x,y}⊆insertvShecard:{x,y}.card=2hx:x∈insertvShy:y∈insertvShxS:x∈ShyS:y∈Shsub:{x,y}⊆S⊢ c{x,y}=b]inlm:ℕc:Finset(Finm)→Boolb:BoolS:Finset(Finm)hSmono:∀e⊆S,e.card=2→ce=bv:FinmhvAdj:∀u∈S,c{v,u}=bx:Finmy:Finmhxy:x≠yhe:{x,y}⊆insertvShecard:{x,y}.card=2hx:x∈insertvShy:y∈insertvShxS:x∈ShyS:y∈Sz:Finmhz:z∈{x,y}hz_eq:z=x⊢ x∈Sinr.inrm:ℕc:Finset(Finm)→Boolb:BoolS:Finset(Finm)hSmono:∀e⊆S,e.card=2→ce=bv:FinmhvAdj:∀u∈S,c{v,u}=bx:Finmy:Finmhxy:x≠yhe:{x,y}⊆insertvShecard:{x,y}.card=2hx:x∈insertvShy:y∈insertvShxS:x∈ShyS:y∈Shsub:{x,y}⊆S⊢ c{x,y}=b;exacthxSAll goals completed! 🐙inr.inrm:ℕc:Finset(Finm)→Boolb:BoolS:Finset(Finm)hSmono:∀e⊆S,e.card=2→ce=bv:FinmhvAdj:∀u∈S,c{v,u}=bx:Finmy:Finmhxy:x≠yhe:{x,y}⊆insertvShecard:{x,y}.card=2hx:x∈insertvShy:y∈insertvShxS:x∈ShyS:y∈Shsub:{x,y}⊆S⊢ c{x,y}=b·inrm:ℕc:Finset(Finm)→Boolb:BoolS:Finset(Finm)hSmono:∀e⊆S,e.card=2→ce=bv:FinmhvAdj:∀u∈S,c{v,u}=bx:Finmy:Finmhxy:x≠yhe:{x,y}⊆insertvShecard:{x,y}.card=2hx:x∈insertvShy:y∈insertvShxS:x∈ShyS:y∈Sz:Finmhz:z∈{x,y}hz':z∈{y}⊢ z∈Sinr.inrm:ℕc:Finset(Finm)→Boolb:BoolS:Finset(Finm)hSmono:∀e⊆S,e.card=2→ce=bv:FinmhvAdj:∀u∈S,c{v,u}=bx:Finmy:Finmhxy:x≠yhe:{x,y}⊆insertvShecard:{x,y}.card=2hx:x∈insertvShy:y∈insertvShxS:x∈ShyS:y∈Shsub:{x,y}⊆S⊢ c{x,y}=brw[Finset.mem_singleton.mphz'inrm:ℕc:Finset(Finm)→Boolb:BoolS:Finset(Finm)hSmono:∀e⊆S,e.card=2→ce=bv:FinmhvAdj:∀u∈S,c{v,u}=bx:Finmy:Finmhxy:x≠yhe:{x,y}⊆insertvShecard:{x,y}.card=2hx:x∈insertvShy:y∈insertvShxS:x∈ShyS:y∈Sz:Finmhz:z∈{x,y}hz':z∈{y}⊢ y∈Sinrm:ℕc:Finset(Finm)→Boolb:BoolS:Finset(Finm)hSmono:∀e⊆S,e.card=2→ce=bv:FinmhvAdj:∀u∈S,c{v,u}=bx:Finmy:Finmhxy:x≠yhe:{x,y}⊆insertvShecard:{x,y}.card=2hx:x∈insertvShy:y∈insertvShxS:x∈ShyS:y∈Sz:Finmhz:z∈{x,y}hz':z∈{y}⊢ y∈Sinr.inrm:ℕc:Finset(Finm)→Boolb:BoolS:Finset(Finm)hSmono:∀e⊆S,e.card=2→ce=bv:FinmhvAdj:∀u∈S,c{v,u}=bx:Finmy:Finmhxy:x≠yhe:{x,y}⊆insertvShecard:{x,y}.card=2hx:x∈insertvShy:y∈insertvShxS:x∈ShyS:y∈Shsub:{x,y}⊆S⊢ c{x,y}=b]inrm:ℕc:Finset(Finm)→Boolb:BoolS:Finset(Finm)hSmono:∀e⊆S,e.card=2→ce=bv:FinmhvAdj:∀u∈S,c{v,u}=bx:Finmy:Finmhxy:x≠yhe:{x,y}⊆insertvShecard:{x,y}.card=2hx:x∈insertvShy:y∈insertvShxS:x∈ShyS:y∈Sz:Finmhz:z∈{x,y}hz':z∈{y}⊢ y∈Sinr.inrm:ℕc:Finset(Finm)→Boolb:BoolS:Finset(Finm)hSmono:∀e⊆S,e.card=2→ce=bv:FinmhvAdj:∀u∈S,c{v,u}=bx:Finmy:Finmhxy:x≠yhe:{x,y}⊆insertvShecard:{x,y}.card=2hx:x∈insertvShy:y∈insertvShxS:x∈ShyS:y∈Shsub:{x,y}⊆S⊢ c{x,y}=b;exacthySinr.inrm:ℕc:Finset(Finm)→Boolb:BoolS:Finset(Finm)hSmono:∀e⊆S,e.card=2→ce=bv:FinmhvAdj:∀u∈S,c{v,u}=bx:Finmy:Finmhxy:x≠yhe:{x,y}⊆insertvShecard:{x,y}.card=2hx:x∈insertvShy:y∈insertvShxS:x∈ShyS:y∈Shsub:{x,y}⊆S⊢ c{x,y}=binr.inrm:ℕc:Finset(Finm)→Boolb:BoolS:Finset(Finm)hSmono:∀e⊆S,e.card=2→ce=bv:FinmhvAdj:∀u∈S,c{v,u}=bx:Finmy:Finmhxy:x≠yhe:{x,y}⊆insertvShecard:{x,y}.card=2hx:x∈insertvShy:y∈insertvShxS:x∈ShyS:y∈Shsub:{x,y}⊆S⊢ c{x,y}=bhavehcard2:({x,y}:Finset(Finm)).card=2:=bym:ℕc:Finset(Finm)→Boolb:BoolS:Finset(Finm)hSmono:∀e⊆S,e.card=2→ce=bv:FinmhvAdj:∀u∈S,c{v,u}=b⊢ ∀e⊆insertvS,e.card=2→ce=binr.inrm:ℕc:Finset(Finm)→Boolb:BoolS:Finset(Finm)hSmono:∀e⊆S,e.card=2→ce=bv:FinmhvAdj:∀u∈S,c{v,u}=bx:Finmy:Finmhxy:x≠yhe:{x,y}⊆insertvShecard:{x,y}.card=2hx:x∈insertvShy:y∈insertvShxS:x∈ShyS:y∈Shsub:{x,y}⊆Shcard2:{x,y}.card=2⊢ c{x,y}=brw[Finset.card_insert_of_notMem(bym:ℕc:Finset(Finm)→Boolb:BoolS:Finset(Finm)hSmono:∀e⊆S,e.card=2→ce=bv:FinmhvAdj:∀u∈S,c{v,u}=bx:Finmy:Finmhxy:x≠yhe:{x,y}⊆insertvShecard:{x,y}.card=2hx:x∈insertvShy:y∈insertvShxS:x∈ShyS:y∈Shsub:{x,y}⊆S⊢ x∉{y}inr.inrm:ℕc:Finset(Finm)→Boolb:BoolS:Finset(Finm)hSmono:∀e⊆S,e.card=2→ce=bv:FinmhvAdj:∀u∈S,c{v,u}=bx:Finmy:Finmhxy:x≠yhe:{x,y}⊆insertvShecard:{x,y}.card=2hx:x∈insertvShy:y∈insertvShxS:x∈ShyS:y∈Shsub:{x,y}⊆Shcard2:{x,y}.card=2⊢ c{x,y}=bsimpausinghxyAll goals completed! 🐙inr.inrm:ℕc:Finset(Finm)→Boolb:BoolS:Finset(Finm)hSmono:∀e⊆S,e.card=2→ce=bv:FinmhvAdj:∀u∈S,c{v,u}=bx:Finmy:Finmhxy:x≠yhe:{x,y}⊆insertvShecard:{x,y}.card=2hx:x∈insertvShy:y∈insertvShxS:x∈ShyS:y∈Shsub:{x,y}⊆Shcard2:{x,y}.card=2⊢ c{x,y}=b),Finset.card_singletonm:ℕc:Finset(Finm)→Boolb:BoolS:Finset(Finm)hSmono:∀e⊆S,e.card=2→ce=bv:FinmhvAdj:∀u∈S,c{v,u}=bx:Finmy:Finmhxy:x≠yhe:{x,y}⊆insertvShecard:{x,y}.card=2hx:x∈insertvShy:y∈insertvShxS:x∈ShyS:y∈Shsub:{x,y}⊆S⊢ 1+1=2inr.inrm:ℕc:Finset(Finm)→Boolb:BoolS:Finset(Finm)hSmono:∀e⊆S,e.card=2→ce=bv:FinmhvAdj:∀u∈S,c{v,u}=bx:Finmy:Finmhxy:x≠yhe:{x,y}⊆insertvShecard:{x,y}.card=2hx:x∈insertvShy:y∈insertvShxS:x∈ShyS:y∈Shsub:{x,y}⊆Shcard2:{x,y}.card=2⊢ c{x,y}=b]inr.inrm:ℕc:Finset(Finm)→Boolb:BoolS:Finset(Finm)hSmono:∀e⊆S,e.card=2→ce=bv:FinmhvAdj:∀u∈S,c{v,u}=bx:Finmy:Finmhxy:x≠yhe:{x,y}⊆insertvShecard:{x,y}.card=2hx:x∈insertvShy:y∈insertvShxS:x∈ShyS:y∈Shsub:{x,y}⊆Shcard2:{x,y}.card=2⊢ c{x,y}=binr.inrm:ℕc:Finset(Finm)→Boolb:BoolS:Finset(Finm)hSmono:∀e⊆S,e.card=2→ce=bv:FinmhvAdj:∀u∈S,c{v,u}=bx:Finmy:Finmhxy:x≠yhe:{x,y}⊆insertvShecard:{x,y}.card=2hx:x∈insertvShy:y∈insertvShxS:x∈ShyS:y∈Shsub:{x,y}⊆Shcard2:{x,y}.card=2⊢ c{x,y}=bexacthSmono_hsubhcard2All goals completed! 🐙
Recurrence. If HasRamseyProperty Ns s (t+1) and HasRamseyProperty Nt (s+1) t
hold, then HasRamseyProperty (Ns + Nt) (s+1) (t+1) holds.
This is the core Erdős–Szekeres 1935 pigeonhole step: pick any vertex v ∈ V, split
V.erase v into false-neighbours R_v and true-neighbours B_v; by pigeonhole
|R_v| ≥ Ns or |B_v| ≥ Nt. In the first case, invoke HasRamseyProperty Ns s (t+1)
on R_v: either we get a false-mono K_s on R_v (extend by v to a false-mono
K_{s+1} on V), or a true-mono K_{t+1} on R_v ⊆ V (done). The second case is
symmetric.
lemmaHasRamseyProperty.step{NsNtst:ℕ}(hs:HasRamseyPropertyNss(t+1))(ht:HasRamseyPropertyNt(s+1)t)(hNs:1≤Ns):HasRamseyProperty(Ns+Nt)(s+1)(t+1):=byNs:ℕNt:ℕs:ℕt:ℕhs:HasRamseyPropertyNss(t+1)ht:HasRamseyPropertyNt(s+1)thNs:1≤Ns⊢ HasRamseyProperty(Ns+Nt)(s+1)(t+1)classicalintromcVhVNs:ℕNt:ℕs:ℕt:ℕhs:HasRamseyPropertyNss(t+1)ht:HasRamseyPropertyNt(s+1)thNs:1≤Nsm:ℕc:Finset(Finm)→BoolV:Finset(Finm)hV:Ns+Nt≤V.card⊢ (∃S⊆V,S.card=s+1∧∀e⊆S,e.card=2→ce=false)∨∃S⊆V,S.card=t+1∧∀e⊆S,e.card=2→ce=true-- V is nonempty since V.card ≥ Ns + Nt ≥ 1.havehVpos:0<V.card:=byNs:ℕNt:ℕs:ℕt:ℕhs:HasRamseyPropertyNss(t+1)ht:HasRamseyPropertyNt(s+1)thNs:1≤Ns⊢ HasRamseyProperty(Ns+Nt)(s+1)(t+1)Ns:ℕNt:ℕs:ℕt:ℕhs:HasRamseyPropertyNss(t+1)ht:HasRamseyPropertyNt(s+1)thNs:1≤Nsm:ℕc:Finset(Finm)→BoolV:Finset(Finm)hV:Ns+Nt≤V.cardhVpos:0<V.card⊢ (∃S⊆V,S.card=s+1∧∀e⊆S,e.card=2→ce=false)∨∃S⊆V,S.card=t+1∧∀e⊆S,e.card=2→ce=truehave:1≤V.card:=Nat.le_transhNs(Nat.le_trans(Nat.le_add_right__)hV)Ns:ℕNt:ℕs:ℕt:ℕhs:HasRamseyPropertyNss(t+1)ht:HasRamseyPropertyNt(s+1)thNs:1≤Nsm:ℕc:Finset(Finm)→BoolV:Finset(Finm)hV:Ns+Nt≤V.cardthis:1≤V.card⊢ 0<V.cardNs:ℕNt:ℕs:ℕt:ℕhs:HasRamseyPropertyNss(t+1)ht:HasRamseyPropertyNt(s+1)thNs:1≤Nsm:ℕc:Finset(Finm)→BoolV:Finset(Finm)hV:Ns+Nt≤V.cardhVpos:0<V.card⊢ (∃S⊆V,S.card=s+1∧∀e⊆S,e.card=2→ce=false)∨∃S⊆V,S.card=t+1∧∀e⊆S,e.card=2→ce=trueexactthisNs:ℕNt:ℕs:ℕt:ℕhs:HasRamseyPropertyNss(t+1)ht:HasRamseyPropertyNt(s+1)thNs:1≤Nsm:ℕc:Finset(Finm)→BoolV:Finset(Finm)hV:Ns+Nt≤V.cardhVpos:0<V.card⊢ (∃S⊆V,S.card=s+1∧∀e⊆S,e.card=2→ce=false)∨∃S⊆V,S.card=t+1∧∀e⊆S,e.card=2→ce=trueNs:ℕNt:ℕs:ℕt:ℕhs:HasRamseyPropertyNss(t+1)ht:HasRamseyPropertyNt(s+1)thNs:1≤Nsm:ℕc:Finset(Finm)→BoolV:Finset(Finm)hV:Ns+Nt≤V.cardhVpos:0<V.card⊢ (∃S⊆V,S.card=s+1∧∀e⊆S,e.card=2→ce=false)∨∃S⊆V,S.card=t+1∧∀e⊆S,e.card=2→ce=trueobtain⟨v,hv⟩:=Finset.card_pos.mphVposNs:ℕNt:ℕs:ℕt:ℕhs:HasRamseyPropertyNss(t+1)ht:HasRamseyPropertyNt(s+1)thNs:1≤Nsm:ℕc:Finset(Finm)→BoolV:Finset(Finm)hV:Ns+Nt≤V.cardhVpos:0<V.cardv:Finmhv:v∈V⊢ (∃S⊆V,S.card=s+1∧∀e⊆S,e.card=2→ce=false)∨∃S⊆V,S.card=t+1∧∀e⊆S,e.card=2→ce=true-- Split V.erase v by colour of pair {v, u}.setR:=(V.erasev).filter(funu=>c{v,u}=false)withhR_defNs:ℕNt:ℕs:ℕt:ℕhs:HasRamseyPropertyNss(t+1)ht:HasRamseyPropertyNt(s+1)thNs:1≤Nsm:ℕc:Finset(Finm)→BoolV:Finset(Finm)hV:Ns+Nt≤V.cardhVpos:0<V.cardv:Finmhv:v∈VR:Finset(Finm):={u∈V.erasev|c{v,u}=false}hR_def:R={u∈V.erasev|c{v,u}=false}⊢ (∃S⊆V,S.card=s+1∧∀e⊆S,e.card=2→ce=false)∨∃S⊆V,S.card=t+1∧∀e⊆S,e.card=2→ce=truesetB:=(V.erasev).filter(funu=>c{v,u}=true)withhB_defNs:ℕNt:ℕs:ℕt:ℕhs:HasRamseyPropertyNss(t+1)ht:HasRamseyPropertyNt(s+1)thNs:1≤Nsm:ℕc:Finset(Finm)→BoolV:Finset(Finm)hV:Ns+Nt≤V.cardhVpos:0<V.cardv:Finmhv:v∈VR:Finset(Finm):={u∈V.erasev|c{v,u}=false}hR_def:R={u∈V.erasev|c{v,u}=false}B:Finset(Finm):={u∈V.erasev|c{v,u}=true}hB_def:B={u∈V.erasev|c{v,u}=true}⊢ (∃S⊆V,S.card=s+1∧∀e⊆S,e.card=2→ce=false)∨∃S⊆V,S.card=t+1∧∀e⊆S,e.card=2→ce=truehavehsplit:R.card+B.card=V.card-1:=card_false_true_splitcVhvNs:ℕNt:ℕs:ℕt:ℕhs:HasRamseyPropertyNss(t+1)ht:HasRamseyPropertyNt(s+1)thNs:1≤Nsm:ℕc:Finset(Finm)→BoolV:Finset(Finm)hV:Ns+Nt≤V.cardhVpos:0<V.cardv:Finmhv:v∈VR:Finset(Finm):={u∈V.erasev|c{v,u}=false}hR_def:R={u∈V.erasev|c{v,u}=false}B:Finset(Finm):={u∈V.erasev|c{v,u}=true}hB_def:B={u∈V.erasev|c{v,u}=true}hsplit:R.card+B.card=V.card-1⊢ (∃S⊆V,S.card=s+1∧∀e⊆S,e.card=2→ce=false)∨∃S⊆V,S.card=t+1∧∀e⊆S,e.card=2→ce=truehavehRsubV:R⊆V:=(Finset.filter_subset__).trans(Finset.erase_subset__)Ns:ℕNt:ℕs:ℕt:ℕhs:HasRamseyPropertyNss(t+1)ht:HasRamseyPropertyNt(s+1)thNs:1≤Nsm:ℕc:Finset(Finm)→BoolV:Finset(Finm)hV:Ns+Nt≤V.cardhVpos:0<V.cardv:Finmhv:v∈VR:Finset(Finm):={u∈V.erasev|c{v,u}=false}hR_def:R={u∈V.erasev|c{v,u}=false}B:Finset(Finm):={u∈V.erasev|c{v,u}=true}hB_def:B={u∈V.erasev|c{v,u}=true}hsplit:R.card+B.card=V.card-1hRsubV:R⊆V⊢ (∃S⊆V,S.card=s+1∧∀e⊆S,e.card=2→ce=false)∨∃S⊆V,S.card=t+1∧∀e⊆S,e.card=2→ce=truehavehBsubV:B⊆V:=(Finset.filter_subset__).trans(Finset.erase_subset__)Ns:ℕNt:ℕs:ℕt:ℕhs:HasRamseyPropertyNss(t+1)ht:HasRamseyPropertyNt(s+1)thNs:1≤Nsm:ℕc:Finset(Finm)→BoolV:Finset(Finm)hV:Ns+Nt≤V.cardhVpos:0<V.cardv:Finmhv:v∈VR:Finset(Finm):={u∈V.erasev|c{v,u}=false}hR_def:R={u∈V.erasev|c{v,u}=false}B:Finset(Finm):={u∈V.erasev|c{v,u}=true}hB_def:B={u∈V.erasev|c{v,u}=true}hsplit:R.card+B.card=V.card-1hRsubV:R⊆VhBsubV:B⊆V⊢ (∃S⊆V,S.card=s+1∧∀e⊆S,e.card=2→ce=false)∨∃S⊆V,S.card=t+1∧∀e⊆S,e.card=2→ce=truehavehvnR:v∉R:=funh=>Finset.notMem_erase__(Finset.mem_of_mem_filter_h)Ns:ℕNt:ℕs:ℕt:ℕhs:HasRamseyPropertyNss(t+1)ht:HasRamseyPropertyNt(s+1)thNs:1≤Nsm:ℕc:Finset(Finm)→BoolV:Finset(Finm)hV:Ns+Nt≤V.cardhVpos:0<V.cardv:Finmhv:v∈VR:Finset(Finm):={u∈V.erasev|c{v,u}=false}hR_def:R={u∈V.erasev|c{v,u}=false}B:Finset(Finm):={u∈V.erasev|c{v,u}=true}hB_def:B={u∈V.erasev|c{v,u}=true}hsplit:R.card+B.card=V.card-1hRsubV:R⊆VhBsubV:B⊆VhvnR:v∉R⊢ (∃S⊆V,S.card=s+1∧∀e⊆S,e.card=2→ce=false)∨∃S⊆V,S.card=t+1∧∀e⊆S,e.card=2→ce=truehavehvnB:v∉B:=funh=>Finset.notMem_erase__(Finset.mem_of_mem_filter_h)Ns:ℕNt:ℕs:ℕt:ℕhs:HasRamseyPropertyNss(t+1)ht:HasRamseyPropertyNt(s+1)thNs:1≤Nsm:ℕc:Finset(Finm)→BoolV:Finset(Finm)hV:Ns+Nt≤V.cardhVpos:0<V.cardv:Finmhv:v∈VR:Finset(Finm):={u∈V.erasev|c{v,u}=false}hR_def:R={u∈V.erasev|c{v,u}=false}B:Finset(Finm):={u∈V.erasev|c{v,u}=true}hB_def:B={u∈V.erasev|c{v,u}=true}hsplit:R.card+B.card=V.card-1hRsubV:R⊆VhBsubV:B⊆VhvnR:v∉RhvnB:v∉B⊢ (∃S⊆V,S.card=s+1∧∀e⊆S,e.card=2→ce=false)∨∃S⊆V,S.card=t+1∧∀e⊆S,e.card=2→ce=true-- Pigeonhole: either R.card ≥ Ns or B.card ≥ Nt.obtainhRcard|hRcard:=le_or_gtNsR.cardinlNs:ℕNt:ℕs:ℕt:ℕhs:HasRamseyPropertyNss(t+1)ht:HasRamseyPropertyNt(s+1)thNs:1≤Nsm:ℕc:Finset(Finm)→BoolV:Finset(Finm)hV:Ns+Nt≤V.cardhVpos:0<V.cardv:Finmhv:v∈VR:Finset(Finm):={u∈V.erasev|c{v,u}=false}hR_def:R={u∈V.erasev|c{v,u}=false}B:Finset(Finm):={u∈V.erasev|c{v,u}=true}hB_def:B={u∈V.erasev|c{v,u}=true}hsplit:R.card+B.card=V.card-1hRsubV:R⊆VhBsubV:B⊆VhvnR:v∉RhvnB:v∉BhRcard:Ns≤R.card⊢ (∃S⊆V,S.card=s+1∧∀e⊆S,e.card=2→ce=false)∨∃S⊆V,S.card=t+1∧∀e⊆S,e.card=2→ce=trueinrNs:ℕNt:ℕs:ℕt:ℕhs:HasRamseyPropertyNss(t+1)ht:HasRamseyPropertyNt(s+1)thNs:1≤Nsm:ℕc:Finset(Finm)→BoolV:Finset(Finm)hV:Ns+Nt≤V.cardhVpos:0<V.cardv:Finmhv:v∈VR:Finset(Finm):={u∈V.erasev|c{v,u}=false}hR_def:R={u∈V.erasev|c{v,u}=false}B:Finset(Finm):={u∈V.erasev|c{v,u}=true}hB_def:B={u∈V.erasev|c{v,u}=true}hsplit:R.card+B.card=V.card-1hRsubV:R⊆VhBsubV:B⊆VhvnR:v∉RhvnB:v∉BhRcard:R.card<Ns⊢ (∃S⊆V,S.card=s+1∧∀e⊆S,e.card=2→ce=false)∨∃S⊆V,S.card=t+1∧∀e⊆S,e.card=2→ce=true·inlNs:ℕNt:ℕs:ℕt:ℕhs:HasRamseyPropertyNss(t+1)ht:HasRamseyPropertyNt(s+1)thNs:1≤Nsm:ℕc:Finset(Finm)→BoolV:Finset(Finm)hV:Ns+Nt≤V.cardhVpos:0<V.cardv:Finmhv:v∈VR:Finset(Finm):={u∈V.erasev|c{v,u}=false}hR_def:R={u∈V.erasev|c{v,u}=false}B:Finset(Finm):={u∈V.erasev|c{v,u}=true}hB_def:B={u∈V.erasev|c{v,u}=true}hsplit:R.card+B.card=V.card-1hRsubV:R⊆VhBsubV:B⊆VhvnR:v∉RhvnB:v∉BhRcard:Ns≤R.card⊢ (∃S⊆V,S.card=s+1∧∀e⊆S,e.card=2→ce=false)∨∃S⊆V,S.card=t+1∧∀e⊆S,e.card=2→ce=true-- Case 1: apply `hs` on R to get false K_s (extend by v) or true K_{t+1}.rcaseshscRhRcardwith⟨S,hSsub,hScard,hSmono⟩|⟨S,hSsub,hScard,hSmono⟩inl.inlNs:ℕNt:ℕs:ℕt:ℕhs:HasRamseyPropertyNss(t+1)ht:HasRamseyPropertyNt(s+1)thNs:1≤Nsm:ℕc:Finset(Finm)→BoolV:Finset(Finm)hV:Ns+Nt≤V.cardhVpos:0<V.cardv:Finmhv:v∈VR:Finset(Finm):={u∈V.erasev|c{v,u}=false}hR_def:R={u∈V.erasev|c{v,u}=false}B:Finset(Finm):={u∈V.erasev|c{v,u}=true}hB_def:B={u∈V.erasev|c{v,u}=true}hsplit:R.card+B.card=V.card-1hRsubV:R⊆VhBsubV:B⊆VhvnR:v∉RhvnB:v∉BhRcard:Ns≤R.cardS:Finset(Finm)hSsub:S⊆RhScard:S.card=shSmono:∀e⊆S,e.card=2→ce=false⊢ (∃S⊆V,S.card=s+1∧∀e⊆S,e.card=2→ce=false)∨∃S⊆V,S.card=t+1∧∀e⊆S,e.card=2→ce=trueinl.inrNs:ℕNt:ℕs:ℕt:ℕhs:HasRamseyPropertyNss(t+1)ht:HasRamseyPropertyNt(s+1)thNs:1≤Nsm:ℕc:Finset(Finm)→BoolV:Finset(Finm)hV:Ns+Nt≤V.cardhVpos:0<V.cardv:Finmhv:v∈VR:Finset(Finm):={u∈V.erasev|c{v,u}=false}hR_def:R={u∈V.erasev|c{v,u}=false}B:Finset(Finm):={u∈V.erasev|c{v,u}=true}hB_def:B={u∈V.erasev|c{v,u}=true}hsplit:R.card+B.card=V.card-1hRsubV:R⊆VhBsubV:B⊆VhvnR:v∉RhvnB:v∉BhRcard:Ns≤R.cardS:Finset(Finm)hSsub:S⊆RhScard:S.card=t+1hSmono:∀e⊆S,e.card=2→ce=true⊢ (∃S⊆V,S.card=s+1∧∀e⊆S,e.card=2→ce=false)∨∃S⊆V,S.card=t+1∧∀e⊆S,e.card=2→ce=true·inl.inlNs:ℕNt:ℕs:ℕt:ℕhs:HasRamseyPropertyNss(t+1)ht:HasRamseyPropertyNt(s+1)thNs:1≤Nsm:ℕc:Finset(Finm)→BoolV:Finset(Finm)hV:Ns+Nt≤V.cardhVpos:0<V.cardv:Finmhv:v∈VR:Finset(Finm):={u∈V.erasev|c{v,u}=false}hR_def:R={u∈V.erasev|c{v,u}=false}B:Finset(Finm):={u∈V.erasev|c{v,u}=true}hB_def:B={u∈V.erasev|c{v,u}=true}hsplit:R.card+B.card=V.card-1hRsubV:R⊆VhBsubV:B⊆VhvnR:v∉RhvnB:v∉BhRcard:Ns≤R.cardS:Finset(Finm)hSsub:S⊆RhScard:S.card=shSmono:∀e⊆S,e.card=2→ce=false⊢ (∃S⊆V,S.card=s+1∧∀e⊆S,e.card=2→ce=false)∨∃S⊆V,S.card=t+1∧∀e⊆S,e.card=2→ce=true-- false K_s on R ⊆ V; extend by v (false-adjacent to all of R) to false K_{s+1}.havehvS:v∉S:=funh=>hvnR(hSsubh)inl.inlNs:ℕNt:ℕs:ℕt:ℕhs:HasRamseyPropertyNss(t+1)ht:HasRamseyPropertyNt(s+1)thNs:1≤Nsm:ℕc:Finset(Finm)→BoolV:Finset(Finm)hV:Ns+Nt≤V.cardhVpos:0<V.cardv:Finmhv:v∈VR:Finset(Finm):={u∈V.erasev|c{v,u}=false}hR_def:R={u∈V.erasev|c{v,u}=false}B:Finset(Finm):={u∈V.erasev|c{v,u}=true}hB_def:B={u∈V.erasev|c{v,u}=true}hsplit:R.card+B.card=V.card-1hRsubV:R⊆VhBsubV:B⊆VhvnR:v∉RhvnB:v∉BhRcard:Ns≤R.cardS:Finset(Finm)hSsub:S⊆RhScard:S.card=shSmono:∀e⊆S,e.card=2→ce=falsehvS:v∉S⊢ (∃S⊆V,S.card=s+1∧∀e⊆S,e.card=2→ce=false)∨∃S⊆V,S.card=t+1∧∀e⊆S,e.card=2→ce=truerefineOr.inl⟨insertvS,?_,?_,?_⟩inl.inl.refine_1Ns:ℕNt:ℕs:ℕt:ℕhs:HasRamseyPropertyNss(t+1)ht:HasRamseyPropertyNt(s+1)thNs:1≤Nsm:ℕc:Finset(Finm)→BoolV:Finset(Finm)hV:Ns+Nt≤V.cardhVpos:0<V.cardv:Finmhv:v∈VR:Finset(Finm):={u∈V.erasev|c{v,u}=false}hR_def:R={u∈V.erasev|c{v,u}=false}B:Finset(Finm):={u∈V.erasev|c{v,u}=true}hB_def:B={u∈V.erasev|c{v,u}=true}hsplit:R.card+B.card=V.card-1hRsubV:R⊆VhBsubV:B⊆VhvnR:v∉RhvnB:v∉BhRcard:Ns≤R.cardS:Finset(Finm)hSsub:S⊆RhScard:S.card=shSmono:∀e⊆S,e.card=2→ce=falsehvS:v∉S⊢ insertvS⊆Vinl.inl.refine_2Ns:ℕNt:ℕs:ℕt:ℕhs:HasRamseyPropertyNss(t+1)ht:HasRamseyPropertyNt(s+1)thNs:1≤Nsm:ℕc:Finset(Finm)→BoolV:Finset(Finm)hV:Ns+Nt≤V.cardhVpos:0<V.cardv:Finmhv:v∈VR:Finset(Finm):={u∈V.erasev|c{v,u}=false}hR_def:R={u∈V.erasev|c{v,u}=false}B:Finset(Finm):={u∈V.erasev|c{v,u}=true}hB_def:B={u∈V.erasev|c{v,u}=true}hsplit:R.card+B.card=V.card-1hRsubV:R⊆VhBsubV:B⊆VhvnR:v∉RhvnB:v∉BhRcard:Ns≤R.cardS:Finset(Finm)hSsub:S⊆RhScard:S.card=shSmono:∀e⊆S,e.card=2→ce=falsehvS:v∉S⊢ (insertvS).card=s+1inl.inl.refine_3Ns:ℕNt:ℕs:ℕt:ℕhs:HasRamseyPropertyNss(t+1)ht:HasRamseyPropertyNt(s+1)thNs:1≤Nsm:ℕc:Finset(Finm)→BoolV:Finset(Finm)hV:Ns+Nt≤V.cardhVpos:0<V.cardv:Finmhv:v∈VR:Finset(Finm):={u∈V.erasev|c{v,u}=false}hR_def:R={u∈V.erasev|c{v,u}=false}B:Finset(Finm):={u∈V.erasev|c{v,u}=true}hB_def:B={u∈V.erasev|c{v,u}=true}hsplit:R.card+B.card=V.card-1hRsubV:R⊆VhBsubV:B⊆VhvnR:v∉RhvnB:v∉BhRcard:Ns≤R.cardS:Finset(Finm)hSsub:S⊆RhScard:S.card=shSmono:∀e⊆S,e.card=2→ce=falsehvS:v∉S⊢ ∀e⊆insertvS,e.card=2→ce=false·inl.inl.refine_1Ns:ℕNt:ℕs:ℕt:ℕhs:HasRamseyPropertyNss(t+1)ht:HasRamseyPropertyNt(s+1)thNs:1≤Nsm:ℕc:Finset(Finm)→BoolV:Finset(Finm)hV:Ns+Nt≤V.cardhVpos:0<V.cardv:Finmhv:v∈VR:Finset(Finm):={u∈V.erasev|c{v,u}=false}hR_def:R={u∈V.erasev|c{v,u}=false}B:Finset(Finm):={u∈V.erasev|c{v,u}=true}hB_def:B={u∈V.erasev|c{v,u}=true}hsplit:R.card+B.card=V.card-1hRsubV:R⊆VhBsubV:B⊆VhvnR:v∉RhvnB:v∉BhRcard:Ns≤R.cardS:Finset(Finm)hSsub:S⊆RhScard:S.card=shSmono:∀e⊆S,e.card=2→ce=falsehvS:v∉S⊢ insertvS⊆Vintrouhuinl.inl.refine_1Ns:ℕNt:ℕs:ℕt:ℕhs:HasRamseyPropertyNss(t+1)ht:HasRamseyPropertyNt(s+1)thNs:1≤Nsm:ℕc:Finset(Finm)→BoolV:Finset(Finm)hV:Ns+Nt≤V.cardhVpos:0<V.cardv:Finmhv:v∈VR:Finset(Finm):={u∈V.erasev|c{v,u}=false}hR_def:R={u∈V.erasev|c{v,u}=false}B:Finset(Finm):={u∈V.erasev|c{v,u}=true}hB_def:B={u∈V.erasev|c{v,u}=true}hsplit:R.card+B.card=V.card-1hRsubV:R⊆VhBsubV:B⊆VhvnR:v∉RhvnB:v∉BhRcard:Ns≤R.cardS:Finset(Finm)hSsub:S⊆RhScard:S.card=shSmono:∀e⊆S,e.card=2→ce=falsehvS:v∉Su:Finmhu:u∈insertvS⊢ u∈VrcasesFinset.mem_insert.mphuwithrfl|hu'inl.inl.refine_1.inlNs:ℕNt:ℕs:ℕt:ℕhs:HasRamseyPropertyNss(t+1)ht:HasRamseyPropertyNt(s+1)thNs:1≤Nsm:ℕc:Finset(Finm)→BoolV:Finset(Finm)hV:Ns+Nt≤V.cardhVpos:0<V.cardS:Finset(Finm)hScard:S.card=shSmono:∀e⊆S,e.card=2→ce=falseu:Finmhv:u∈VR:Finset(Finm):={u_1∈V.eraseu|c{u,u_1}=false}hR_def:R={u_1∈V.eraseu|c{u,u_1}=false}B:Finset(Finm):={u_1∈V.eraseu|c{u,u_1}=true}hB_def:B={u_1∈V.eraseu|c{u,u_1}=true}hsplit:R.card+B.card=V.card-1hRsubV:R⊆VhBsubV:B⊆VhvnR:u∉RhvnB:u∉BhRcard:Ns≤R.cardhSsub:S⊆RhvS:u∉Shu:u∈insertuS⊢ u∈Vinl.inl.refine_1.inrNs:ℕNt:ℕs:ℕt:ℕhs:HasRamseyPropertyNss(t+1)ht:HasRamseyPropertyNt(s+1)thNs:1≤Nsm:ℕc:Finset(Finm)→BoolV:Finset(Finm)hV:Ns+Nt≤V.cardhVpos:0<V.cardv:Finmhv:v∈VR:Finset(Finm):={u∈V.erasev|c{v,u}=false}hR_def:R={u∈V.erasev|c{v,u}=false}B:Finset(Finm):={u∈V.erasev|c{v,u}=true}hB_def:B={u∈V.erasev|c{v,u}=true}hsplit:R.card+B.card=V.card-1hRsubV:R⊆VhBsubV:B⊆VhvnR:v∉RhvnB:v∉BhRcard:Ns≤R.cardS:Finset(Finm)hSsub:S⊆RhScard:S.card=shSmono:∀e⊆S,e.card=2→ce=falsehvS:v∉Su:Finmhu:u∈insertvShu':u∈S⊢ u∈V·inl.inl.refine_1.inlNs:ℕNt:ℕs:ℕt:ℕhs:HasRamseyPropertyNss(t+1)ht:HasRamseyPropertyNt(s+1)thNs:1≤Nsm:ℕc:Finset(Finm)→BoolV:Finset(Finm)hV:Ns+Nt≤V.cardhVpos:0<V.cardS:Finset(Finm)hScard:S.card=shSmono:∀e⊆S,e.card=2→ce=falseu:Finmhv:u∈VR:Finset(Finm):={u_1∈V.eraseu|c{u,u_1}=false}hR_def:R={u_1∈V.eraseu|c{u,u_1}=false}B:Finset(Finm):={u_1∈V.eraseu|c{u,u_1}=true}hB_def:B={u_1∈V.eraseu|c{u,u_1}=true}hsplit:R.card+B.card=V.card-1hRsubV:R⊆VhBsubV:B⊆VhvnR:u∉RhvnB:u∉BhRcard:Ns≤R.cardhSsub:S⊆RhvS:u∉Shu:u∈insertuS⊢ u∈VexacthvAll goals completed! 🐙·inl.inl.refine_1.inrNs:ℕNt:ℕs:ℕt:ℕhs:HasRamseyPropertyNss(t+1)ht:HasRamseyPropertyNt(s+1)thNs:1≤Nsm:ℕc:Finset(Finm)→BoolV:Finset(Finm)hV:Ns+Nt≤V.cardhVpos:0<V.cardv:Finmhv:v∈VR:Finset(Finm):={u∈V.erasev|c{v,u}=false}hR_def:R={u∈V.erasev|c{v,u}=false}B:Finset(Finm):={u∈V.erasev|c{v,u}=true}hB_def:B={u∈V.erasev|c{v,u}=true}hsplit:R.card+B.card=V.card-1hRsubV:R⊆VhBsubV:B⊆VhvnR:v∉RhvnB:v∉BhRcard:Ns≤R.cardS:Finset(Finm)hSsub:S⊆RhScard:S.card=shSmono:∀e⊆S,e.card=2→ce=falsehvS:v∉Su:Finmhu:u∈insertvShu':u∈S⊢ u∈VexacthRsubV(hSsubhu')All goals completed! 🐙·inl.inl.refine_2Ns:ℕNt:ℕs:ℕt:ℕhs:HasRamseyPropertyNss(t+1)ht:HasRamseyPropertyNt(s+1)thNs:1≤Nsm:ℕc:Finset(Finm)→BoolV:Finset(Finm)hV:Ns+Nt≤V.cardhVpos:0<V.cardv:Finmhv:v∈VR:Finset(Finm):={u∈V.erasev|c{v,u}=false}hR_def:R={u∈V.erasev|c{v,u}=false}B:Finset(Finm):={u∈V.erasev|c{v,u}=true}hB_def:B={u∈V.erasev|c{v,u}=true}hsplit:R.card+B.card=V.card-1hRsubV:R⊆VhBsubV:B⊆VhvnR:v∉RhvnB:v∉BhRcard:Ns≤R.cardS:Finset(Finm)hSsub:S⊆RhScard:S.card=shSmono:∀e⊆S,e.card=2→ce=falsehvS:v∉S⊢ (insertvS).card=s+1rw[Finset.card_insert_of_notMemhvS,inl.inl.refine_2Ns:ℕNt:ℕs:ℕt:ℕhs:HasRamseyPropertyNss(t+1)ht:HasRamseyPropertyNt(s+1)thNs:1≤Nsm:ℕc:Finset(Finm)→BoolV:Finset(Finm)hV:Ns+Nt≤V.cardhVpos:0<V.cardv:Finmhv:v∈VR:Finset(Finm):={u∈V.erasev|c{v,u}=false}hR_def:R={u∈V.erasev|c{v,u}=false}B:Finset(Finm):={u∈V.erasev|c{v,u}=true}hB_def:B={u∈V.erasev|c{v,u}=true}hsplit:R.card+B.card=V.card-1hRsubV:R⊆VhBsubV:B⊆VhvnR:v∉RhvnB:v∉BhRcard:Ns≤R.cardS:Finset(Finm)hSsub:S⊆RhScard:S.card=shSmono:∀e⊆S,e.card=2→ce=falsehvS:v∉S⊢ S.card+1=s+1All goals completed! 🐙hScardinl.inl.refine_2Ns:ℕNt:ℕs:ℕt:ℕhs:HasRamseyPropertyNss(t+1)ht:HasRamseyPropertyNt(s+1)thNs:1≤Nsm:ℕc:Finset(Finm)→BoolV:Finset(Finm)hV:Ns+Nt≤V.cardhVpos:0<V.cardv:Finmhv:v∈VR:Finset(Finm):={u∈V.erasev|c{v,u}=false}hR_def:R={u∈V.erasev|c{v,u}=false}B:Finset(Finm):={u∈V.erasev|c{v,u}=true}hB_def:B={u∈V.erasev|c{v,u}=true}hsplit:R.card+B.card=V.card-1hRsubV:R⊆VhBsubV:B⊆VhvnR:v∉RhvnB:v∉BhRcard:Ns≤R.cardS:Finset(Finm)hSsub:S⊆RhScard:S.card=shSmono:∀e⊆S,e.card=2→ce=falsehvS:v∉S⊢ s+1=s+1All goals completed! 🐙]All goals completed! 🐙·inl.inl.refine_3Ns:ℕNt:ℕs:ℕt:ℕhs:HasRamseyPropertyNss(t+1)ht:HasRamseyPropertyNt(s+1)thNs:1≤Nsm:ℕc:Finset(Finm)→BoolV:Finset(Finm)hV:Ns+Nt≤V.cardhVpos:0<V.cardv:Finmhv:v∈VR:Finset(Finm):={u∈V.erasev|c{v,u}=false}hR_def:R={u∈V.erasev|c{v,u}=false}B:Finset(Finm):={u∈V.erasev|c{v,u}=true}hB_def:B={u∈V.erasev|c{v,u}=true}hsplit:R.card+B.card=V.card-1hRsubV:R⊆VhBsubV:B⊆VhvnR:v∉RhvnB:v∉BhRcard:Ns≤R.cardS:Finset(Finm)hSsub:S⊆RhScard:S.card=shSmono:∀e⊆S,e.card=2→ce=falsehvS:v∉S⊢ ∀e⊆insertvS,e.card=2→ce=falseapplymono_inserthSmonoinl.inl.refine_3Ns:ℕNt:ℕs:ℕt:ℕhs:HasRamseyPropertyNss(t+1)ht:HasRamseyPropertyNt(s+1)thNs:1≤Nsm:ℕc:Finset(Finm)→BoolV:Finset(Finm)hV:Ns+Nt≤V.cardhVpos:0<V.cardv:Finmhv:v∈VR:Finset(Finm):={u∈V.erasev|c{v,u}=false}hR_def:R={u∈V.erasev|c{v,u}=false}B:Finset(Finm):={u∈V.erasev|c{v,u}=true}hB_def:B={u∈V.erasev|c{v,u}=true}hsplit:R.card+B.card=V.card-1hRsubV:R⊆VhBsubV:B⊆VhvnR:v∉RhvnB:v∉BhRcard:Ns≤R.cardS:Finset(Finm)hSsub:S⊆RhScard:S.card=shSmono:∀e⊆S,e.card=2→ce=falsehvS:v∉S⊢ ∀u∈S,c{v,u}=falseintrouhuinl.inl.refine_3Ns:ℕNt:ℕs:ℕt:ℕhs:HasRamseyPropertyNss(t+1)ht:HasRamseyPropertyNt(s+1)thNs:1≤Nsm:ℕc:Finset(Finm)→BoolV:Finset(Finm)hV:Ns+Nt≤V.cardhVpos:0<V.cardv:Finmhv:v∈VR:Finset(Finm):={u∈V.erasev|c{v,u}=false}hR_def:R={u∈V.erasev|c{v,u}=false}B:Finset(Finm):={u∈V.erasev|c{v,u}=true}hB_def:B={u∈V.erasev|c{v,u}=true}hsplit:R.card+B.card=V.card-1hRsubV:R⊆VhBsubV:B⊆VhvnR:v∉RhvnB:v∉BhRcard:Ns≤R.cardS:Finset(Finm)hSsub:S⊆RhScard:S.card=shSmono:∀e⊆S,e.card=2→ce=falsehvS:v∉Su:Finmhu:u∈S⊢ c{v,u}=falsehavehu':u∈R:=hSsubhuinl.inl.refine_3Ns:ℕNt:ℕs:ℕt:ℕhs:HasRamseyPropertyNss(t+1)ht:HasRamseyPropertyNt(s+1)thNs:1≤Nsm:ℕc:Finset(Finm)→BoolV:Finset(Finm)hV:Ns+Nt≤V.cardhVpos:0<V.cardv:Finmhv:v∈VR:Finset(Finm):={u∈V.erasev|c{v,u}=false}hR_def:R={u∈V.erasev|c{v,u}=false}B:Finset(Finm):={u∈V.erasev|c{v,u}=true}hB_def:B={u∈V.erasev|c{v,u}=true}hsplit:R.card+B.card=V.card-1hRsubV:R⊆VhBsubV:B⊆VhvnR:v∉RhvnB:v∉BhRcard:Ns≤R.cardS:Finset(Finm)hSsub:S⊆RhScard:S.card=shSmono:∀e⊆S,e.card=2→ce=falsehvS:v∉Su:Finmhu:u∈Shu':u∈R⊢ c{v,u}=falseexact(Finset.mem_filter.mphu').2All goals completed! 🐙·inl.inrNs:ℕNt:ℕs:ℕt:ℕhs:HasRamseyPropertyNss(t+1)ht:HasRamseyPropertyNt(s+1)thNs:1≤Nsm:ℕc:Finset(Finm)→BoolV:Finset(Finm)hV:Ns+Nt≤V.cardhVpos:0<V.cardv:Finmhv:v∈VR:Finset(Finm):={u∈V.erasev|c{v,u}=false}hR_def:R={u∈V.erasev|c{v,u}=false}B:Finset(Finm):={u∈V.erasev|c{v,u}=true}hB_def:B={u∈V.erasev|c{v,u}=true}hsplit:R.card+B.card=V.card-1hRsubV:R⊆VhBsubV:B⊆VhvnR:v∉RhvnB:v∉BhRcard:Ns≤R.cardS:Finset(Finm)hSsub:S⊆RhScard:S.card=t+1hSmono:∀e⊆S,e.card=2→ce=true⊢ (∃S⊆V,S.card=s+1∧∀e⊆S,e.card=2→ce=false)∨∃S⊆V,S.card=t+1∧∀e⊆S,e.card=2→ce=true-- true K_{t+1} on R ⊆ V.exactOr.inr⟨S,hSsub.transhRsubV,hScard,hSmono⟩All goals completed! 🐙·inrNs:ℕNt:ℕs:ℕt:ℕhs:HasRamseyPropertyNss(t+1)ht:HasRamseyPropertyNt(s+1)thNs:1≤Nsm:ℕc:Finset(Finm)→BoolV:Finset(Finm)hV:Ns+Nt≤V.cardhVpos:0<V.cardv:Finmhv:v∈VR:Finset(Finm):={u∈V.erasev|c{v,u}=false}hR_def:R={u∈V.erasev|c{v,u}=false}B:Finset(Finm):={u∈V.erasev|c{v,u}=true}hB_def:B={u∈V.erasev|c{v,u}=true}hsplit:R.card+B.card=V.card-1hRsubV:R⊆VhBsubV:B⊆VhvnR:v∉RhvnB:v∉BhRcard:R.card<Ns⊢ (∃S⊆V,S.card=s+1∧∀e⊆S,e.card=2→ce=false)∨∃S⊆V,S.card=t+1∧∀e⊆S,e.card=2→ce=true-- Case 2: R.card < Ns, so B.card ≥ Nt. Apply `ht` on B symmetrically.rcaseshtcB(byNs:ℕNt:ℕs:ℕt:ℕhs:HasRamseyPropertyNss(t+1)ht:HasRamseyPropertyNt(s+1)thNs:1≤Nsm:ℕc:Finset(Finm)→BoolV:Finset(Finm)hV:Ns+Nt≤V.cardhVpos:0<V.cardv:Finmhv:v∈VR:Finset(Finm):={u∈V.erasev|c{v,u}=false}hR_def:R={u∈V.erasev|c{v,u}=false}B:Finset(Finm):={u∈V.erasev|c{v,u}=true}hB_def:B={u∈V.erasev|c{v,u}=true}hsplit:R.card+B.card=V.card-1hRsubV:R⊆VhBsubV:B⊆VhvnR:v∉RhvnB:v∉BhRcard:R.card<Ns⊢ Nt≤B.cardliaAll goals completed! 🐙)with⟨S,hSsub,hScard,hSmono⟩|⟨S,hSsub,hScard,hSmono⟩·inr.inlNs:ℕNt:ℕs:ℕt:ℕhs:HasRamseyPropertyNss(t+1)ht:HasRamseyPropertyNt(s+1)thNs:1≤Nsm:ℕc:Finset(Finm)→BoolV:Finset(Finm)hV:Ns+Nt≤V.cardhVpos:0<V.cardv:Finmhv:v∈VR:Finset(Finm):={u∈V.erasev|c{v,u}=false}hR_def:R={u∈V.erasev|c{v,u}=false}B:Finset(Finm):={u∈V.erasev|c{v,u}=true}hB_def:B={u∈V.erasev|c{v,u}=true}hsplit:R.card+B.card=V.card-1hRsubV:R⊆VhBsubV:B⊆VhvnR:v∉RhvnB:v∉BhRcard:R.card<NsS:Finset(Finm)hSsub:S⊆BhScard:S.card=s+1hSmono:∀e⊆S,e.card=2→ce=false⊢ (∃S⊆V,S.card=s+1∧∀e⊆S,e.card=2→ce=false)∨∃S⊆V,S.card=t+1∧∀e⊆S,e.card=2→ce=true-- false K_{s+1} on B ⊆ V.exactOr.inl⟨S,hSsub.transhBsubV,hScard,hSmono⟩All goals completed! 🐙·inr.inrNs:ℕNt:ℕs:ℕt:ℕhs:HasRamseyPropertyNss(t+1)ht:HasRamseyPropertyNt(s+1)thNs:1≤Nsm:ℕc:Finset(Finm)→BoolV:Finset(Finm)hV:Ns+Nt≤V.cardhVpos:0<V.cardv:Finmhv:v∈VR:Finset(Finm):={u∈V.erasev|c{v,u}=false}hR_def:R={u∈V.erasev|c{v,u}=false}B:Finset(Finm):={u∈V.erasev|c{v,u}=true}hB_def:B={u∈V.erasev|c{v,u}=true}hsplit:R.card+B.card=V.card-1hRsubV:R⊆VhBsubV:B⊆VhvnR:v∉RhvnB:v∉BhRcard:R.card<NsS:Finset(Finm)hSsub:S⊆BhScard:S.card=thSmono:∀e⊆S,e.card=2→ce=true⊢ (∃S⊆V,S.card=s+1∧∀e⊆S,e.card=2→ce=false)∨∃S⊆V,S.card=t+1∧∀e⊆S,e.card=2→ce=true-- true K_t on B; extend by v (true-adjacent to all of B) to true K_{t+1}.havehvS:v∉S:=funh=>hvnB(hSsubh)inr.inrNs:ℕNt:ℕs:ℕt:ℕhs:HasRamseyPropertyNss(t+1)ht:HasRamseyPropertyNt(s+1)thNs:1≤Nsm:ℕc:Finset(Finm)→BoolV:Finset(Finm)hV:Ns+Nt≤V.cardhVpos:0<V.cardv:Finmhv:v∈VR:Finset(Finm):={u∈V.erasev|c{v,u}=false}hR_def:R={u∈V.erasev|c{v,u}=false}B:Finset(Finm):={u∈V.erasev|c{v,u}=true}hB_def:B={u∈V.erasev|c{v,u}=true}hsplit:R.card+B.card=V.card-1hRsubV:R⊆VhBsubV:B⊆VhvnR:v∉RhvnB:v∉BhRcard:R.card<NsS:Finset(Finm)hSsub:S⊆BhScard:S.card=thSmono:∀e⊆S,e.card=2→ce=truehvS:v∉S⊢ (∃S⊆V,S.card=s+1∧∀e⊆S,e.card=2→ce=false)∨∃S⊆V,S.card=t+1∧∀e⊆S,e.card=2→ce=truerefineOr.inr⟨insertvS,?_,?_,?_⟩inr.inr.refine_1Ns:ℕNt:ℕs:ℕt:ℕhs:HasRamseyPropertyNss(t+1)ht:HasRamseyPropertyNt(s+1)thNs:1≤Nsm:ℕc:Finset(Finm)→BoolV:Finset(Finm)hV:Ns+Nt≤V.cardhVpos:0<V.cardv:Finmhv:v∈VR:Finset(Finm):={u∈V.erasev|c{v,u}=false}hR_def:R={u∈V.erasev|c{v,u}=false}B:Finset(Finm):={u∈V.erasev|c{v,u}=true}hB_def:B={u∈V.erasev|c{v,u}=true}hsplit:R.card+B.card=V.card-1hRsubV:R⊆VhBsubV:B⊆VhvnR:v∉RhvnB:v∉BhRcard:R.card<NsS:Finset(Finm)hSsub:S⊆BhScard:S.card=thSmono:∀e⊆S,e.card=2→ce=truehvS:v∉S⊢ insertvS⊆Vinr.inr.refine_2Ns:ℕNt:ℕs:ℕt:ℕhs:HasRamseyPropertyNss(t+1)ht:HasRamseyPropertyNt(s+1)thNs:1≤Nsm:ℕc:Finset(Finm)→BoolV:Finset(Finm)hV:Ns+Nt≤V.cardhVpos:0<V.cardv:Finmhv:v∈VR:Finset(Finm):={u∈V.erasev|c{v,u}=false}hR_def:R={u∈V.erasev|c{v,u}=false}B:Finset(Finm):={u∈V.erasev|c{v,u}=true}hB_def:B={u∈V.erasev|c{v,u}=true}hsplit:R.card+B.card=V.card-1hRsubV:R⊆VhBsubV:B⊆VhvnR:v∉RhvnB:v∉BhRcard:R.card<NsS:Finset(Finm)hSsub:S⊆BhScard:S.card=thSmono:∀e⊆S,e.card=2→ce=truehvS:v∉S⊢ (insertvS).card=t+1inr.inr.refine_3Ns:ℕNt:ℕs:ℕt:ℕhs:HasRamseyPropertyNss(t+1)ht:HasRamseyPropertyNt(s+1)thNs:1≤Nsm:ℕc:Finset(Finm)→BoolV:Finset(Finm)hV:Ns+Nt≤V.cardhVpos:0<V.cardv:Finmhv:v∈VR:Finset(Finm):={u∈V.erasev|c{v,u}=false}hR_def:R={u∈V.erasev|c{v,u}=false}B:Finset(Finm):={u∈V.erasev|c{v,u}=true}hB_def:B={u∈V.erasev|c{v,u}=true}hsplit:R.card+B.card=V.card-1hRsubV:R⊆VhBsubV:B⊆VhvnR:v∉RhvnB:v∉BhRcard:R.card<NsS:Finset(Finm)hSsub:S⊆BhScard:S.card=thSmono:∀e⊆S,e.card=2→ce=truehvS:v∉S⊢ ∀e⊆insertvS,e.card=2→ce=true·inr.inr.refine_1Ns:ℕNt:ℕs:ℕt:ℕhs:HasRamseyPropertyNss(t+1)ht:HasRamseyPropertyNt(s+1)thNs:1≤Nsm:ℕc:Finset(Finm)→BoolV:Finset(Finm)hV:Ns+Nt≤V.cardhVpos:0<V.cardv:Finmhv:v∈VR:Finset(Finm):={u∈V.erasev|c{v,u}=false}hR_def:R={u∈V.erasev|c{v,u}=false}B:Finset(Finm):={u∈V.erasev|c{v,u}=true}hB_def:B={u∈V.erasev|c{v,u}=true}hsplit:R.card+B.card=V.card-1hRsubV:R⊆VhBsubV:B⊆VhvnR:v∉RhvnB:v∉BhRcard:R.card<NsS:Finset(Finm)hSsub:S⊆BhScard:S.card=thSmono:∀e⊆S,e.card=2→ce=truehvS:v∉S⊢ insertvS⊆Vintrouhuinr.inr.refine_1Ns:ℕNt:ℕs:ℕt:ℕhs:HasRamseyPropertyNss(t+1)ht:HasRamseyPropertyNt(s+1)thNs:1≤Nsm:ℕc:Finset(Finm)→BoolV:Finset(Finm)hV:Ns+Nt≤V.cardhVpos:0<V.cardv:Finmhv:v∈VR:Finset(Finm):={u∈V.erasev|c{v,u}=false}hR_def:R={u∈V.erasev|c{v,u}=false}B:Finset(Finm):={u∈V.erasev|c{v,u}=true}hB_def:B={u∈V.erasev|c{v,u}=true}hsplit:R.card+B.card=V.card-1hRsubV:R⊆VhBsubV:B⊆VhvnR:v∉RhvnB:v∉BhRcard:R.card<NsS:Finset(Finm)hSsub:S⊆BhScard:S.card=thSmono:∀e⊆S,e.card=2→ce=truehvS:v∉Su:Finmhu:u∈insertvS⊢ u∈VrcasesFinset.mem_insert.mphuwithrfl|hu'inr.inr.refine_1.inlNs:ℕNt:ℕs:ℕt:ℕhs:HasRamseyPropertyNss(t+1)ht:HasRamseyPropertyNt(s+1)thNs:1≤Nsm:ℕc:Finset(Finm)→BoolV:Finset(Finm)hV:Ns+Nt≤V.cardhVpos:0<V.cardS:Finset(Finm)hScard:S.card=thSmono:∀e⊆S,e.card=2→ce=trueu:Finmhv:u∈VR:Finset(Finm):={u_1∈V.eraseu|c{u,u_1}=false}hR_def:R={u_1∈V.eraseu|c{u,u_1}=false}B:Finset(Finm):={u_1∈V.eraseu|c{u,u_1}=true}hB_def:B={u_1∈V.eraseu|c{u,u_1}=true}hsplit:R.card+B.card=V.card-1hRsubV:R⊆VhBsubV:B⊆VhvnR:u∉RhvnB:u∉BhRcard:R.card<NshSsub:S⊆BhvS:u∉Shu:u∈insertuS⊢ u∈Vinr.inr.refine_1.inrNs:ℕNt:ℕs:ℕt:ℕhs:HasRamseyPropertyNss(t+1)ht:HasRamseyPropertyNt(s+1)thNs:1≤Nsm:ℕc:Finset(Finm)→BoolV:Finset(Finm)hV:Ns+Nt≤V.cardhVpos:0<V.cardv:Finmhv:v∈VR:Finset(Finm):={u∈V.erasev|c{v,u}=false}hR_def:R={u∈V.erasev|c{v,u}=false}B:Finset(Finm):={u∈V.erasev|c{v,u}=true}hB_def:B={u∈V.erasev|c{v,u}=true}hsplit:R.card+B.card=V.card-1hRsubV:R⊆VhBsubV:B⊆VhvnR:v∉RhvnB:v∉BhRcard:R.card<NsS:Finset(Finm)hSsub:S⊆BhScard:S.card=thSmono:∀e⊆S,e.card=2→ce=truehvS:v∉Su:Finmhu:u∈insertvShu':u∈S⊢ u∈V·inr.inr.refine_1.inlNs:ℕNt:ℕs:ℕt:ℕhs:HasRamseyPropertyNss(t+1)ht:HasRamseyPropertyNt(s+1)thNs:1≤Nsm:ℕc:Finset(Finm)→BoolV:Finset(Finm)hV:Ns+Nt≤V.cardhVpos:0<V.cardS:Finset(Finm)hScard:S.card=thSmono:∀e⊆S,e.card=2→ce=trueu:Finmhv:u∈VR:Finset(Finm):={u_1∈V.eraseu|c{u,u_1}=false}hR_def:R={u_1∈V.eraseu|c{u,u_1}=false}B:Finset(Finm):={u_1∈V.eraseu|c{u,u_1}=true}hB_def:B={u_1∈V.eraseu|c{u,u_1}=true}hsplit:R.card+B.card=V.card-1hRsubV:R⊆VhBsubV:B⊆VhvnR:u∉RhvnB:u∉BhRcard:R.card<NshSsub:S⊆BhvS:u∉Shu:u∈insertuS⊢ u∈VexacthvAll goals completed! 🐙·inr.inr.refine_1.inrNs:ℕNt:ℕs:ℕt:ℕhs:HasRamseyPropertyNss(t+1)ht:HasRamseyPropertyNt(s+1)thNs:1≤Nsm:ℕc:Finset(Finm)→BoolV:Finset(Finm)hV:Ns+Nt≤V.cardhVpos:0<V.cardv:Finmhv:v∈VR:Finset(Finm):={u∈V.erasev|c{v,u}=false}hR_def:R={u∈V.erasev|c{v,u}=false}B:Finset(Finm):={u∈V.erasev|c{v,u}=true}hB_def:B={u∈V.erasev|c{v,u}=true}hsplit:R.card+B.card=V.card-1hRsubV:R⊆VhBsubV:B⊆VhvnR:v∉RhvnB:v∉BhRcard:R.card<NsS:Finset(Finm)hSsub:S⊆BhScard:S.card=thSmono:∀e⊆S,e.card=2→ce=truehvS:v∉Su:Finmhu:u∈insertvShu':u∈S⊢ u∈VexacthBsubV(hSsubhu')All goals completed! 🐙·inr.inr.refine_2Ns:ℕNt:ℕs:ℕt:ℕhs:HasRamseyPropertyNss(t+1)ht:HasRamseyPropertyNt(s+1)thNs:1≤Nsm:ℕc:Finset(Finm)→BoolV:Finset(Finm)hV:Ns+Nt≤V.cardhVpos:0<V.cardv:Finmhv:v∈VR:Finset(Finm):={u∈V.erasev|c{v,u}=false}hR_def:R={u∈V.erasev|c{v,u}=false}B:Finset(Finm):={u∈V.erasev|c{v,u}=true}hB_def:B={u∈V.erasev|c{v,u}=true}hsplit:R.card+B.card=V.card-1hRsubV:R⊆VhBsubV:B⊆VhvnR:v∉RhvnB:v∉BhRcard:R.card<NsS:Finset(Finm)hSsub:S⊆BhScard:S.card=thSmono:∀e⊆S,e.card=2→ce=truehvS:v∉S⊢ (insertvS).card=t+1rw[Finset.card_insert_of_notMemhvS,inr.inr.refine_2Ns:ℕNt:ℕs:ℕt:ℕhs:HasRamseyPropertyNss(t+1)ht:HasRamseyPropertyNt(s+1)thNs:1≤Nsm:ℕc:Finset(Finm)→BoolV:Finset(Finm)hV:Ns+Nt≤V.cardhVpos:0<V.cardv:Finmhv:v∈VR:Finset(Finm):={u∈V.erasev|c{v,u}=false}hR_def:R={u∈V.erasev|c{v,u}=false}B:Finset(Finm):={u∈V.erasev|c{v,u}=true}hB_def:B={u∈V.erasev|c{v,u}=true}hsplit:R.card+B.card=V.card-1hRsubV:R⊆VhBsubV:B⊆VhvnR:v∉RhvnB:v∉BhRcard:R.card<NsS:Finset(Finm)hSsub:S⊆BhScard:S.card=thSmono:∀e⊆S,e.card=2→ce=truehvS:v∉S⊢ S.card+1=t+1All goals completed! 🐙hScardinr.inr.refine_2Ns:ℕNt:ℕs:ℕt:ℕhs:HasRamseyPropertyNss(t+1)ht:HasRamseyPropertyNt(s+1)thNs:1≤Nsm:ℕc:Finset(Finm)→BoolV:Finset(Finm)hV:Ns+Nt≤V.cardhVpos:0<V.cardv:Finmhv:v∈VR:Finset(Finm):={u∈V.erasev|c{v,u}=false}hR_def:R={u∈V.erasev|c{v,u}=false}B:Finset(Finm):={u∈V.erasev|c{v,u}=true}hB_def:B={u∈V.erasev|c{v,u}=true}hsplit:R.card+B.card=V.card-1hRsubV:R⊆VhBsubV:B⊆VhvnR:v∉RhvnB:v∉BhRcard:R.card<NsS:Finset(Finm)hSsub:S⊆BhScard:S.card=thSmono:∀e⊆S,e.card=2→ce=truehvS:v∉S⊢ t+1=t+1All goals completed! 🐙]All goals completed! 🐙·inr.inr.refine_3Ns:ℕNt:ℕs:ℕt:ℕhs:HasRamseyPropertyNss(t+1)ht:HasRamseyPropertyNt(s+1)thNs:1≤Nsm:ℕc:Finset(Finm)→BoolV:Finset(Finm)hV:Ns+Nt≤V.cardhVpos:0<V.cardv:Finmhv:v∈VR:Finset(Finm):={u∈V.erasev|c{v,u}=false}hR_def:R={u∈V.erasev|c{v,u}=false}B:Finset(Finm):={u∈V.erasev|c{v,u}=true}hB_def:B={u∈V.erasev|c{v,u}=true}hsplit:R.card+B.card=V.card-1hRsubV:R⊆VhBsubV:B⊆VhvnR:v∉RhvnB:v∉BhRcard:R.card<NsS:Finset(Finm)hSsub:S⊆BhScard:S.card=thSmono:∀e⊆S,e.card=2→ce=truehvS:v∉S⊢ ∀e⊆insertvS,e.card=2→ce=trueapplymono_inserthSmonoinr.inr.refine_3Ns:ℕNt:ℕs:ℕt:ℕhs:HasRamseyPropertyNss(t+1)ht:HasRamseyPropertyNt(s+1)thNs:1≤Nsm:ℕc:Finset(Finm)→BoolV:Finset(Finm)hV:Ns+Nt≤V.cardhVpos:0<V.cardv:Finmhv:v∈VR:Finset(Finm):={u∈V.erasev|c{v,u}=false}hR_def:R={u∈V.erasev|c{v,u}=false}B:Finset(Finm):={u∈V.erasev|c{v,u}=true}hB_def:B={u∈V.erasev|c{v,u}=true}hsplit:R.card+B.card=V.card-1hRsubV:R⊆VhBsubV:B⊆VhvnR:v∉RhvnB:v∉BhRcard:R.card<NsS:Finset(Finm)hSsub:S⊆BhScard:S.card=thSmono:∀e⊆S,e.card=2→ce=truehvS:v∉S⊢ ∀u∈S,c{v,u}=trueintrouhuinr.inr.refine_3Ns:ℕNt:ℕs:ℕt:ℕhs:HasRamseyPropertyNss(t+1)ht:HasRamseyPropertyNt(s+1)thNs:1≤Nsm:ℕc:Finset(Finm)→BoolV:Finset(Finm)hV:Ns+Nt≤V.cardhVpos:0<V.cardv:Finmhv:v∈VR:Finset(Finm):={u∈V.erasev|c{v,u}=false}hR_def:R={u∈V.erasev|c{v,u}=false}B:Finset(Finm):={u∈V.erasev|c{v,u}=true}hB_def:B={u∈V.erasev|c{v,u}=true}hsplit:R.card+B.card=V.card-1hRsubV:R⊆VhBsubV:B⊆VhvnR:v∉RhvnB:v∉BhRcard:R.card<NsS:Finset(Finm)hSsub:S⊆BhScard:S.card=thSmono:∀e⊆S,e.card=2→ce=truehvS:v∉Su:Finmhu:u∈S⊢ c{v,u}=truehavehu':u∈B:=hSsubhuinr.inr.refine_3Ns:ℕNt:ℕs:ℕt:ℕhs:HasRamseyPropertyNss(t+1)ht:HasRamseyPropertyNt(s+1)thNs:1≤Nsm:ℕc:Finset(Finm)→BoolV:Finset(Finm)hV:Ns+Nt≤V.cardhVpos:0<V.cardv:Finmhv:v∈VR:Finset(Finm):={u∈V.erasev|c{v,u}=false}hR_def:R={u∈V.erasev|c{v,u}=false}B:Finset(Finm):={u∈V.erasev|c{v,u}=true}hB_def:B={u∈V.erasev|c{v,u}=true}hsplit:R.card+B.card=V.card-1hRsubV:R⊆VhBsubV:B⊆VhvnR:v∉RhvnB:v∉BhRcard:R.card<NsS:Finset(Finm)hSsub:S⊆BhScard:S.card=thSmono:∀e⊆S,e.card=2→ce=truehvS:v∉Su:Finmhu:u∈Shu':u∈B⊢ c{v,u}=trueexact(Finset.mem_filter.mphu').2All goals completed! 🐙
Binomial bound via Erdős–Szekeres induction.HasRamseyProperty (Nat.choose (s + t) s) s t for all s, t.
lemmahasRamseyProperty_choose:∀(st:ℕ),HasRamseyProperty(Nat.choose(s+t)s)st:=by⊢ ∀(st:ℕ),HasRamseyProperty((s+t).chooses)st-- Induction on `s + t` via `Nat.strong_induction_on`.sufficesh:∀(n:ℕ),∀(st:ℕ),s+t=n→HasRamseyProperty(Nat.choosens)stbyh:∀(nst:ℕ),s+t=n→HasRamseyProperty(n.chooses)st⊢ ∀(st:ℕ),HasRamseyProperty((s+t).chooses)st⊢ ∀(nst:ℕ),s+t=n→HasRamseyProperty(n.chooses)stintrosth:∀(nst:ℕ),s+t=n→HasRamseyProperty(n.chooses)sts:ℕt:ℕ⊢ HasRamseyProperty((s+t).chooses)st⊢ ∀(nst:ℕ),s+t=n→HasRamseyProperty(n.chooses)stexacth(s+t)strfl⊢ ∀(nst:ℕ),s+t=n→HasRamseyProperty(n.chooses)st⊢ ∀(nst:ℕ),s+t=n→HasRamseyProperty(n.chooses)stintronn:ℕ⊢ ∀(st:ℕ),s+t=n→HasRamseyProperty(n.chooses)stinductionnusingNat.strong_induction_onwith|_nih=>hn:ℕih:∀m<n,∀(st:ℕ),s+t=m→HasRamseyProperty(m.chooses)st⊢ ∀(st:ℕ),s+t=n→HasRamseyProperty(n.chooses)stintrosthsthn:ℕih:∀m<n,∀(st:ℕ),s+t=m→HasRamseyProperty(m.chooses)sts:ℕt:ℕhst:s+t=n⊢ HasRamseyProperty(n.chooses)stmatchs,t,hstwith|0,t,hst=>n:ℕih:∀m<n,∀(st:ℕ),s+t=m→HasRamseyProperty(m.chooses)sts:ℕt✝:ℕhst✝:s+t=nt:ℕhst:0+t=n⊢ HasRamseyProperty(n.choose0)0t-- C(n, 0) = 1; we want HasRamseyProperty 1 0 t, which follows from the s = 0 base.showHasRamseyProperty(Nat.choosen0)0tn:ℕih:∀m<n,∀(st:ℕ),s+t=m→HasRamseyProperty(m.chooses)sts:ℕt✝:ℕhst✝:s+t=nt:ℕhst:0+t=n⊢ HasRamseyProperty(n.choose0)0trw[Nat.choose_zero_rightn:ℕih:∀m<n,∀(st:ℕ),s+t=m→HasRamseyProperty(m.chooses)sts:ℕt✝:ℕhst✝:s+t=nt:ℕhst:0+t=n⊢ HasRamseyProperty10tn:ℕih:∀m<n,∀(st:ℕ),s+t=m→HasRamseyProperty(m.chooses)sts:ℕt✝:ℕhst✝:s+t=nt:ℕhst:0+t=n⊢ HasRamseyProperty10t]n:ℕih:∀m<n,∀(st:ℕ),s+t=m→HasRamseyProperty(m.chooses)sts:ℕt✝:ℕhst✝:s+t=nt:ℕhst:0+t=n⊢ HasRamseyProperty10texactHasRamseyProperty.mono(Nat.zero_le_)(hasRamseyProperty_zero_left0t)All goals completed! 🐙|s+1,0,hst=>n:ℕih:∀m<n,∀(st:ℕ),s+t=m→HasRamseyProperty(m.chooses)sts✝:ℕt:ℕhst✝:s+t=ns:ℕhst:s+1+0=n⊢ HasRamseyProperty(n.choose(s+1))(s+1)0-- C(n, s+1) with t = 0. Use the t = 0 base case.showHasRamseyProperty(Nat.choosen(s+1))(s+1)0n:ℕih:∀m<n,∀(st:ℕ),s+t=m→HasRamseyProperty(m.chooses)sts✝:ℕt:ℕhst✝:s+t=ns:ℕhst:s+1+0=n⊢ HasRamseyProperty(n.choose(s+1))(s+1)0exactHasRamseyProperty.mono(Nat.zero_le_)(hasRamseyProperty_zero_right0(s+1))All goals completed! 🐙|s+1,t+1,hst=>n:ℕih:∀m<n,∀(st:ℕ),s+t=m→HasRamseyProperty(m.chooses)sts✝:ℕt✝:ℕhst✝:s+t=ns:ℕt:ℕhst:s+1+(t+1)=n⊢ HasRamseyProperty(n.choose(s+1))(s+1)(t+1)-- Pascal: C(n, s+1) = C(n-1, s) + C(n-1, s+1), where n = s+1+t+1 = s+t+2.-- i.e. n - 1 = s + (t+1) = (s+1) + t.havehn_pred:n-1+1=n:=by⊢ ∀(st:ℕ),HasRamseyProperty((s+t).chooses)stn:ℕih:∀m<n,∀(st:ℕ),s+t=m→HasRamseyProperty(m.chooses)sts✝:ℕt✝:ℕhst✝:s+t=ns:ℕt:ℕhst:s+1+(t+1)=nhn_pred:n-1+1=n⊢ HasRamseyProperty(n.choose(s+1))(s+1)(t+1)omegan:ℕih:∀m<n,∀(st:ℕ),s+t=m→HasRamseyProperty(m.chooses)sts✝:ℕt✝:ℕhst✝:s+t=ns:ℕt:ℕhst:s+1+(t+1)=nhn_pred:n-1+1=n⊢ HasRamseyProperty(n.choose(s+1))(s+1)(t+1)n:ℕih:∀m<n,∀(st:ℕ),s+t=m→HasRamseyProperty(m.chooses)sts✝:ℕt✝:ℕhst✝:s+t=ns:ℕt:ℕhst:s+1+(t+1)=nhn_pred:n-1+1=n⊢ HasRamseyProperty(n.choose(s+1))(s+1)(t+1)havehs_ih:HasRamseyProperty(Nat.choose(n-1)s)s(t+1):=by⊢ ∀(st:ℕ),HasRamseyProperty((s+t).chooses)stn:ℕih:∀m<n,∀(st:ℕ),s+t=m→HasRamseyProperty(m.chooses)sts✝:ℕt✝:ℕhst✝:s+t=ns:ℕt:ℕhst:s+1+(t+1)=nhn_pred:n-1+1=nhs_ih:HasRamseyProperty((n-1).chooses)s(t+1)⊢ HasRamseyProperty(n.choose(s+1))(s+1)(t+1)applyih(n-1)(byn:ℕih:∀m<n,∀(st:ℕ),s+t=m→HasRamseyProperty(m.chooses)sts✝:ℕt✝:ℕhst✝:s+t=ns:ℕt:ℕhst:s+1+(t+1)=nhn_pred:n-1+1=n⊢ n-1<nn:ℕih:∀m<n,∀(st:ℕ),s+t=m→HasRamseyProperty(m.chooses)sts✝:ℕt✝:ℕhst✝:s+t=ns:ℕt:ℕhst:s+1+(t+1)=nhn_pred:n-1+1=nhs_ih:HasRamseyProperty((n-1).chooses)s(t+1)⊢ HasRamseyProperty(n.choose(s+1))(s+1)(t+1)omegaAll goals completed! 🐙n:ℕih:∀m<n,∀(st:ℕ),s+t=m→HasRamseyProperty(m.chooses)sts✝:ℕt✝:ℕhst✝:s+t=ns:ℕt:ℕhst:s+1+(t+1)=nhn_pred:n-1+1=nhs_ih:HasRamseyProperty((n-1).chooses)s(t+1)⊢ HasRamseyProperty(n.choose(s+1))(s+1)(t+1))s(t+1)omegan:ℕih:∀m<n,∀(st:ℕ),s+t=m→HasRamseyProperty(m.chooses)sts✝:ℕt✝:ℕhst✝:s+t=ns:ℕt:ℕhst:s+1+(t+1)=nhn_pred:n-1+1=nhs_ih:HasRamseyProperty((n-1).chooses)s(t+1)⊢ HasRamseyProperty(n.choose(s+1))(s+1)(t+1)n:ℕih:∀m<n,∀(st:ℕ),s+t=m→HasRamseyProperty(m.chooses)sts✝:ℕt✝:ℕhst✝:s+t=ns:ℕt:ℕhst:s+1+(t+1)=nhn_pred:n-1+1=nhs_ih:HasRamseyProperty((n-1).chooses)s(t+1)⊢ HasRamseyProperty(n.choose(s+1))(s+1)(t+1)haveht_ih:HasRamseyProperty(Nat.choose(n-1)(s+1))(s+1)t:=by⊢ ∀(st:ℕ),HasRamseyProperty((s+t).chooses)stn:ℕih:∀m<n,∀(st:ℕ),s+t=m→HasRamseyProperty(m.chooses)sts✝:ℕt✝:ℕhst✝:s+t=ns:ℕt:ℕhst:s+1+(t+1)=nhn_pred:n-1+1=nhs_ih:HasRamseyProperty((n-1).chooses)s(t+1)ht_ih:HasRamseyProperty((n-1).choose(s+1))(s+1)t⊢ HasRamseyProperty(n.choose(s+1))(s+1)(t+1)applyih(n-1)(byn:ℕih:∀m<n,∀(st:ℕ),s+t=m→HasRamseyProperty(m.chooses)sts✝:ℕt✝:ℕhst✝:s+t=ns:ℕt:ℕhst:s+1+(t+1)=nhn_pred:n-1+1=nhs_ih:HasRamseyProperty((n-1).chooses)s(t+1)⊢ n-1<nn:ℕih:∀m<n,∀(st:ℕ),s+t=m→HasRamseyProperty(m.chooses)sts✝:ℕt✝:ℕhst✝:s+t=ns:ℕt:ℕhst:s+1+(t+1)=nhn_pred:n-1+1=nhs_ih:HasRamseyProperty((n-1).chooses)s(t+1)ht_ih:HasRamseyProperty((n-1).choose(s+1))(s+1)t⊢ HasRamseyProperty(n.choose(s+1))(s+1)(t+1)omegaAll goals completed! 🐙n:ℕih:∀m<n,∀(st:ℕ),s+t=m→HasRamseyProperty(m.chooses)sts✝:ℕt✝:ℕhst✝:s+t=ns:ℕt:ℕhst:s+1+(t+1)=nhn_pred:n-1+1=nhs_ih:HasRamseyProperty((n-1).chooses)s(t+1)ht_ih:HasRamseyProperty((n-1).choose(s+1))(s+1)t⊢ HasRamseyProperty(n.choose(s+1))(s+1)(t+1))(s+1)tomegan:ℕih:∀m<n,∀(st:ℕ),s+t=m→HasRamseyProperty(m.chooses)sts✝:ℕt✝:ℕhst✝:s+t=ns:ℕt:ℕhst:s+1+(t+1)=nhn_pred:n-1+1=nhs_ih:HasRamseyProperty((n-1).chooses)s(t+1)ht_ih:HasRamseyProperty((n-1).choose(s+1))(s+1)t⊢ HasRamseyProperty(n.choose(s+1))(s+1)(t+1)n:ℕih:∀m<n,∀(st:ℕ),s+t=m→HasRamseyProperty(m.chooses)sts✝:ℕt✝:ℕhst✝:s+t=ns:ℕt:ℕhst:s+1+(t+1)=nhn_pred:n-1+1=nhs_ih:HasRamseyProperty((n-1).chooses)s(t+1)ht_ih:HasRamseyProperty((n-1).choose(s+1))(s+1)t⊢ HasRamseyProperty(n.choose(s+1))(s+1)(t+1)havehNs_pos:1≤Nat.choose(n-1)s:=by⊢ ∀(st:ℕ),HasRamseyProperty((s+t).chooses)stn:ℕih:∀m<n,∀(st:ℕ),s+t=m→HasRamseyProperty(m.chooses)sts✝:ℕt✝:ℕhst✝:s+t=ns:ℕt:ℕhst:s+1+(t+1)=nhn_pred:n-1+1=nhs_ih:HasRamseyProperty((n-1).chooses)s(t+1)ht_ih:HasRamseyProperty((n-1).choose(s+1))(s+1)thNs_pos:1≤(n-1).chooses⊢ HasRamseyProperty(n.choose(s+1))(s+1)(t+1)have:s≤n-1:=by⊢ ∀(st:ℕ),HasRamseyProperty((s+t).chooses)stn:ℕih:∀m<n,∀(st:ℕ),s+t=m→HasRamseyProperty(m.chooses)sts✝:ℕt✝:ℕhst✝:s+t=ns:ℕt:ℕhst:s+1+(t+1)=nhn_pred:n-1+1=nhs_ih:HasRamseyProperty((n-1).chooses)s(t+1)ht_ih:HasRamseyProperty((n-1).choose(s+1))(s+1)tthis:s≤n-1⊢ 1≤(n-1).choosesn:ℕih:∀m<n,∀(st:ℕ),s+t=m→HasRamseyProperty(m.chooses)sts✝:ℕt✝:ℕhst✝:s+t=ns:ℕt:ℕhst:s+1+(t+1)=nhn_pred:n-1+1=nhs_ih:HasRamseyProperty((n-1).chooses)s(t+1)ht_ih:HasRamseyProperty((n-1).choose(s+1))(s+1)thNs_pos:1≤(n-1).chooses⊢ HasRamseyProperty(n.choose(s+1))(s+1)(t+1)omegan:ℕih:∀m<n,∀(st:ℕ),s+t=m→HasRamseyProperty(m.chooses)sts✝:ℕt✝:ℕhst✝:s+t=ns:ℕt:ℕhst:s+1+(t+1)=nhn_pred:n-1+1=nhs_ih:HasRamseyProperty((n-1).chooses)s(t+1)ht_ih:HasRamseyProperty((n-1).choose(s+1))(s+1)tthis:s≤n-1⊢ 1≤(n-1).choosesn:ℕih:∀m<n,∀(st:ℕ),s+t=m→HasRamseyProperty(m.chooses)sts✝:ℕt✝:ℕhst✝:s+t=ns:ℕt:ℕhst:s+1+(t+1)=nhn_pred:n-1+1=nhs_ih:HasRamseyProperty((n-1).chooses)s(t+1)ht_ih:HasRamseyProperty((n-1).choose(s+1))(s+1)thNs_pos:1≤(n-1).chooses⊢ HasRamseyProperty(n.choose(s+1))(s+1)(t+1)n:ℕih:∀m<n,∀(st:ℕ),s+t=m→HasRamseyProperty(m.chooses)sts✝:ℕt✝:ℕhst✝:s+t=ns:ℕt:ℕhst:s+1+(t+1)=nhn_pred:n-1+1=nhs_ih:HasRamseyProperty((n-1).chooses)s(t+1)ht_ih:HasRamseyProperty((n-1).choose(s+1))(s+1)tthis:s≤n-1⊢ 1≤(n-1).choosesn:ℕih:∀m<n,∀(st:ℕ),s+t=m→HasRamseyProperty(m.chooses)sts✝:ℕt✝:ℕhst✝:s+t=ns:ℕt:ℕhst:s+1+(t+1)=nhn_pred:n-1+1=nhs_ih:HasRamseyProperty((n-1).chooses)s(t+1)ht_ih:HasRamseyProperty((n-1).choose(s+1))(s+1)thNs_pos:1≤(n-1).chooses⊢ HasRamseyProperty(n.choose(s+1))(s+1)(t+1)exactNat.choose_posthisn:ℕih:∀m<n,∀(st:ℕ),s+t=m→HasRamseyProperty(m.chooses)sts✝:ℕt✝:ℕhst✝:s+t=ns:ℕt:ℕhst:s+1+(t+1)=nhn_pred:n-1+1=nhs_ih:HasRamseyProperty((n-1).chooses)s(t+1)ht_ih:HasRamseyProperty((n-1).choose(s+1))(s+1)thNs_pos:1≤(n-1).chooses⊢ HasRamseyProperty(n.choose(s+1))(s+1)(t+1)n:ℕih:∀m<n,∀(st:ℕ),s+t=m→HasRamseyProperty(m.chooses)sts✝:ℕt✝:ℕhst✝:s+t=ns:ℕt:ℕhst:s+1+(t+1)=nhn_pred:n-1+1=nhs_ih:HasRamseyProperty((n-1).chooses)s(t+1)ht_ih:HasRamseyProperty((n-1).choose(s+1))(s+1)thNs_pos:1≤(n-1).chooses⊢ HasRamseyProperty(n.choose(s+1))(s+1)(t+1)havehrec:HasRamseyProperty(Nat.choose(n-1)s+Nat.choose(n-1)(s+1))(s+1)(t+1):=HasRamseyProperty.stephs_ihht_ihhNs_posn:ℕih:∀m<n,∀(st:ℕ),s+t=m→HasRamseyProperty(m.chooses)sts✝:ℕt✝:ℕhst✝:s+t=ns:ℕt:ℕhst:s+1+(t+1)=nhn_pred:n-1+1=nhs_ih:HasRamseyProperty((n-1).chooses)s(t+1)ht_ih:HasRamseyProperty((n-1).choose(s+1))(s+1)thNs_pos:1≤(n-1).chooseshrec:HasRamseyProperty((n-1).chooses+(n-1).choose(s+1))(s+1)(t+1)⊢ HasRamseyProperty(n.choose(s+1))(s+1)(t+1)-- Pascal's identity: C(n, s+1) = C(n-1, s) + C(n-1, s+1) when n ≥ 1.havehpascal:Nat.choosen(s+1)=Nat.choose(n-1)s+Nat.choose(n-1)(s+1):=by⊢ ∀(st:ℕ),HasRamseyProperty((s+t).chooses)stn:ℕih:∀m<n,∀(st:ℕ),s+t=m→HasRamseyProperty(m.chooses)sts✝:ℕt✝:ℕhst✝:s+t=ns:ℕt:ℕhst:s+1+(t+1)=nhn_pred:n-1+1=nhs_ih:HasRamseyProperty((n-1).chooses)s(t+1)ht_ih:HasRamseyProperty((n-1).choose(s+1))(s+1)thNs_pos:1≤(n-1).chooseshrec:HasRamseyProperty((n-1).chooses+(n-1).choose(s+1))(s+1)(t+1)hpascal:n.choose(s+1)=(n-1).chooses+(n-1).choose(s+1)⊢ HasRamseyProperty(n.choose(s+1))(s+1)(t+1)conv_lhs=>rw[←hn_pred]n:ℕih:∀m<n,∀(st:ℕ),s+t=m→HasRamseyProperty(m.chooses)sts✝:ℕt✝:ℕhst✝:s+t=ns:ℕt:ℕhst:s+1+(t+1)=nhn_pred:n-1+1=nhs_ih:HasRamseyProperty((n-1).chooses)s(t+1)ht_ih:HasRamseyProperty((n-1).choose(s+1))(s+1)thNs_pos:1≤(n-1).chooseshrec:HasRamseyProperty((n-1).chooses+(n-1).choose(s+1))(s+1)(t+1)| (n-1+1).choose(s+1)n:ℕih:∀m<n,∀(st:ℕ),s+t=m→HasRamseyProperty(m.chooses)sts✝:ℕt✝:ℕhst✝:s+t=ns:ℕt:ℕhst:s+1+(t+1)=nhn_pred:n-1+1=nhs_ih:HasRamseyProperty((n-1).chooses)s(t+1)ht_ih:HasRamseyProperty((n-1).choose(s+1))(s+1)thNs_pos:1≤(n-1).chooseshrec:HasRamseyProperty((n-1).chooses+(n-1).choose(s+1))(s+1)(t+1)hpascal:n.choose(s+1)=(n-1).chooses+(n-1).choose(s+1)⊢ HasRamseyProperty(n.choose(s+1))(s+1)(t+1)rw[Nat.choose_succ_succn:ℕih:∀m<n,∀(st:ℕ),s+t=m→HasRamseyProperty(m.chooses)sts✝:ℕt✝:ℕhst✝:s+t=ns:ℕt:ℕhst:s+1+(t+1)=nhn_pred:n-1+1=nhs_ih:HasRamseyProperty((n-1).chooses)s(t+1)ht_ih:HasRamseyProperty((n-1).choose(s+1))(s+1)thNs_pos:1≤(n-1).chooseshrec:HasRamseyProperty((n-1).chooses+(n-1).choose(s+1))(s+1)(t+1)⊢ (n-1).chooses+(n-1).chooses.succ=(n-1).chooses+(n-1).choose(s+1)n:ℕih:∀m<n,∀(st:ℕ),s+t=m→HasRamseyProperty(m.chooses)sts✝:ℕt✝:ℕhst✝:s+t=ns:ℕt:ℕhst:s+1+(t+1)=nhn_pred:n-1+1=nhs_ih:HasRamseyProperty((n-1).chooses)s(t+1)ht_ih:HasRamseyProperty((n-1).choose(s+1))(s+1)thNs_pos:1≤(n-1).chooseshrec:HasRamseyProperty((n-1).chooses+(n-1).choose(s+1))(s+1)(t+1)hpascal:n.choose(s+1)=(n-1).chooses+(n-1).choose(s+1)⊢ HasRamseyProperty(n.choose(s+1))(s+1)(t+1)]n:ℕih:∀m<n,∀(st:ℕ),s+t=m→HasRamseyProperty(m.chooses)sts✝:ℕt✝:ℕhst✝:s+t=ns:ℕt:ℕhst:s+1+(t+1)=nhn_pred:n-1+1=nhs_ih:HasRamseyProperty((n-1).chooses)s(t+1)ht_ih:HasRamseyProperty((n-1).choose(s+1))(s+1)thNs_pos:1≤(n-1).chooseshrec:HasRamseyProperty((n-1).chooses+(n-1).choose(s+1))(s+1)(t+1)hpascal:n.choose(s+1)=(n-1).chooses+(n-1).choose(s+1)⊢ HasRamseyProperty(n.choose(s+1))(s+1)(t+1)n:ℕih:∀m<n,∀(st:ℕ),s+t=m→HasRamseyProperty(m.chooses)sts✝:ℕt✝:ℕhst✝:s+t=ns:ℕt:ℕhst:s+1+(t+1)=nhn_pred:n-1+1=nhs_ih:HasRamseyProperty((n-1).chooses)s(t+1)ht_ih:HasRamseyProperty((n-1).choose(s+1))(s+1)thNs_pos:1≤(n-1).chooseshrec:HasRamseyProperty((n-1).chooses+(n-1).choose(s+1))(s+1)(t+1)hpascal:n.choose(s+1)=(n-1).chooses+(n-1).choose(s+1)⊢ HasRamseyProperty(n.choose(s+1))(s+1)(t+1)showHasRamseyProperty(Nat.choosen(s+1))(s+1)(t+1)n:ℕih:∀m<n,∀(st:ℕ),s+t=m→HasRamseyProperty(m.chooses)sts✝:ℕt✝:ℕhst✝:s+t=ns:ℕt:ℕhst:s+1+(t+1)=nhn_pred:n-1+1=nhs_ih:HasRamseyProperty((n-1).chooses)s(t+1)ht_ih:HasRamseyProperty((n-1).choose(s+1))(s+1)thNs_pos:1≤(n-1).chooseshrec:HasRamseyProperty((n-1).chooses+(n-1).choose(s+1))(s+1)(t+1)hpascal:n.choose(s+1)=(n-1).chooses+(n-1).choose(s+1)⊢ HasRamseyProperty(n.choose(s+1))(s+1)(t+1)rw[hpascaln:ℕih:∀m<n,∀(st:ℕ),s+t=m→HasRamseyProperty(m.chooses)sts✝:ℕt✝:ℕhst✝:s+t=ns:ℕt:ℕhst:s+1+(t+1)=nhn_pred:n-1+1=nhs_ih:HasRamseyProperty((n-1).chooses)s(t+1)ht_ih:HasRamseyProperty((n-1).choose(s+1))(s+1)thNs_pos:1≤(n-1).chooseshrec:HasRamseyProperty((n-1).chooses+(n-1).choose(s+1))(s+1)(t+1)hpascal:n.choose(s+1)=(n-1).chooses+(n-1).choose(s+1)⊢ HasRamseyProperty((n-1).chooses+(n-1).choose(s+1))(s+1)(t+1)n:ℕih:∀m<n,∀(st:ℕ),s+t=m→HasRamseyProperty(m.chooses)sts✝:ℕt✝:ℕhst✝:s+t=ns:ℕt:ℕhst:s+1+(t+1)=nhn_pred:n-1+1=nhs_ih:HasRamseyProperty((n-1).chooses)s(t+1)ht_ih:HasRamseyProperty((n-1).choose(s+1))(s+1)thNs_pos:1≤(n-1).chooseshrec:HasRamseyProperty((n-1).chooses+(n-1).choose(s+1))(s+1)(t+1)hpascal:n.choose(s+1)=(n-1).chooses+(n-1).choose(s+1)⊢ HasRamseyProperty((n-1).chooses+(n-1).choose(s+1))(s+1)(t+1)]n:ℕih:∀m<n,∀(st:ℕ),s+t=m→HasRamseyProperty(m.chooses)sts✝:ℕt✝:ℕhst✝:s+t=ns:ℕt:ℕhst:s+1+(t+1)=nhn_pred:n-1+1=nhs_ih:HasRamseyProperty((n-1).chooses)s(t+1)ht_ih:HasRamseyProperty((n-1).choose(s+1))(s+1)thNs_pos:1≤(n-1).chooseshrec:HasRamseyProperty((n-1).chooses+(n-1).choose(s+1))(s+1)(t+1)hpascal:n.choose(s+1)=(n-1).chooses+(n-1).choose(s+1)⊢ HasRamseyProperty((n-1).chooses+(n-1).choose(s+1))(s+1)(t+1)exacthrecAll goals completed! 🐙endDiagonal
Erdős–Szekeres 1935 in hypergraphRamsey form:
Combinatorics.hypergraphRamsey 2 k ≤ 4 ^ k for all k.
Proof.Diagonal.hasRamseyProperty_choose applied at s = t = k and the full vertex
set V = Finset.univ of Fin (C(2k, k)) shows that C(2k, k) is a member of the defining
set of hypergraphRamsey 2 k, hence by Nat.sInf_le we get
hypergraphRamsey 2 k ≤ C(2k, k); the central binomial bound
C(2k, k) ≤ 4 ^ k closes the result.