# mathlibdocumentation

combinatorics.hindman

# Hindman's theorem on finite sums #

We prove Hindman's theorem on finite sums, using idempotent ultrafilters.

Given an infinite sequence a₀, a₁, a₂, … of positive integers, the set FS(a₀, …) is the set of positive integers that can be expressed as a finite sum of aᵢ's, without repetition. Hindman's theorem asserts that whenever the positive integers are finitely colored, there exists a sequence a₀, a₁, a₂, … such that FS(a₀, …) is monochromatic. There is also a stronger version, saying that whenever a set of the form FS(a₀, …) is finitely colored, there exists a sequence b₀, b₁, b₂, … such that FS(b₀, …) is monochromatic and contained in FS(a₀, …). We prove both these versions for a general semigroup M instead of ℕ+ since it is no harder, although this special case implies the general case.

The idea of the proof is to extend the addition (+) : M → M → M to addition (+) : βM → βM → βM on the space βM of ultrafilters on M. One can prove that if U is an idempotent ultrafilter, i.e. U + U = U, then any U-large subset of M contains some set FS(a₀, …) (see exists_FS_of_large). And with the help of a general topological argument one can show that any set of the form FS(a₀, …) is U-large according to some idempotent ultrafilter U (see exists_idempotent_ultrafilter_le_FS). This is enough to prove the theorem since in any finite partition of a U-large set, one of the parts is U-large.

## Main results #

• FS_partition_regular: the strong form of Hindman's theorem
• exists_FS_of_finite_cover: the weak form of Hindman's theorem

## Tags #

Ramsey theory, ultrafilter

def ultrafilter.has_mul {M : Type u_1} [has_mul M] :

Multiplication of ultrafilters given by ∀ᶠ m in U*V, p m ↔ ∀ᶠ m in U, ∀ᶠ m' in V, p (m*m').

Equations

Addition of ultrafilters given by ∀ᶠ m in U+V, p m ↔ ∀ᶠ m in U, ∀ᶠ m' in V, p (m+m').

Equations
theorem ultrafilter.eventually_mul {M : Type u_1} [has_mul M] (U V : ultrafilter M) (p : M → Prop) :
(∀ᶠ (m : M) in U * V, p m) ∀ᶠ (m : M) in U, ∀ᶠ (m' : M) in V, p (m * m')
theorem ultrafilter.eventually_add {M : Type u_1} [has_add M] (U V : ultrafilter M) (p : M → Prop) :
(∀ᶠ (m : M) in (U + V), p m) ∀ᶠ (m : M) in U, ∀ᶠ (m' : M) in V, p (m + m')
def ultrafilter.semigroup {M : Type u_1} [semigroup M] :

Semigroup structure on ultrafilter M induced by a semigroup structure on M.

Equations
def ultrafilter.add_semigroup {M : Type u_1}  :

Additive semigroup structure on ultrafilter M induced by an additive semigroup structure on M.

Equations
theorem ultrafilter.continuous_add_left {M : Type u_1} (V : ultrafilter M) :
continuous (λ (_x : ultrafilter M), _x + V)
theorem ultrafilter.continuous_mul_left {M : Type u_1} [semigroup M] (V : ultrafilter M) :
continuous (λ (_x : ultrafilter M), _x * V)
inductive hindman.FS {M : Type u_1}  :
set M
• head : ∀ {M : Type u_1} [_inst_1 : (a : stream M), a.head
• tail : ∀ {M : Type u_1} [_inst_1 : (a : stream M) (m : M), m m
• cons : ∀ {M : Type u_1} [_inst_1 : (a : stream M) (m : M), m (a.head + m)

FS a is the set of finite sums in a, i.e. m ∈ FS a if m is the sum of a nonempty subsequence of a. We give a direct inductive definition instead of talking about subsequences.

inductive hindman.FP {M : Type u_1} [semigroup M] :
set M
• head : ∀ {M : Type u_1} [_inst_1 : (a : stream M), a.head
• tail : ∀ {M : Type u_1} [_inst_1 : (a : stream M) (m : M), m m
• cons : ∀ {M : Type u_1} [_inst_1 : (a : stream M) (m : M), m ((a.head) * m)

FP a is the set of finite products in a, i.e. m ∈ FP a if m is the product of a nonempty subsequence of a. We give a direct inductive definition instead of talking about subsequences.

theorem hindman.FS.add {M : Type u_1} {a : stream M} {m : M} (hm : m ) :
∃ (n : ), ∀ (m' : M), m' hindman.FS a)m + m'
theorem hindman.FP.mul {M : Type u_1} [semigroup M] {a : stream M} {m : M} (hm : m ) :
∃ (n : ), ∀ (m' : M), m' hindman.FP a)m * m'

If m and m' are finite products in M, then so is m * m', provided that m' is obtained from a subsequence of M starting sufficiently late.

theorem hindman.exists_idempotent_ultrafilter_le_FP {M : Type u_1} [semigroup M] (a : stream M) :
∃ (U : , U * U = U ∀ᶠ (m : M) in U, m
theorem hindman.exists_idempotent_ultrafilter_le_FS {M : Type u_1} (a : stream M) :
∃ (U : , U + U = U ∀ᶠ (m : M) in U, m
theorem hindman.exists_FP_of_large {M : Type u_1} [semigroup M] (U : ultrafilter M) (U_idem : U * U = U) (s₀ : set M) (sU : s₀ U) :
∃ (a : stream M), s₀
theorem hindman.exists_FS_of_large {M : Type u_1} (U : ultrafilter M) (U_idem : U + U = U) (s₀ : set M) (sU : s₀ U) :
∃ (a : stream M), s₀
theorem hindman.FS_partition_regular {M : Type u_1} (a : stream M) (s : set (set M)) (sfin : s.finite) (scov : ⋃₀s) :
∃ (c : set M) (H : c s) (b : stream M), c
theorem hindman.FP_partition_regular {M : Type u_1} [semigroup M] (a : stream M) (s : set (set M)) (sfin : s.finite) (scov : ⋃₀s) :
∃ (c : set M) (H : c s) (b : stream M), c

The strong form of Hindman's theorem: in any finite cover of an FP-set, one the parts contains an FP-set.

theorem hindman.exists_FS_of_finite_cover {M : Type u_1} [nonempty M] (s : set (set M)) (sfin : s.finite) (scov : ⋃₀s) :
∃ (c : set M) (H : c s) (a : stream M), c
theorem hindman.exists_FP_of_finite_cover {M : Type u_1} [semigroup M] [nonempty M] (s : set (set M)) (sfin : s.finite) (scov : ⋃₀s) :
∃ (c : set M) (H : c s) (a : stream M), c

The weak form of Hindman's theorem: in any finite cover of a nonempty semigroup, one of the parts contains an FP-set.

theorem hindman.FP_drop_subset_FP {M : Type u_1} [semigroup M] (a : stream M) (n : ) :
theorem hindman.FS_iter_tail_sub_FS {M : Type u_1} (a : stream M) (n : ) :
theorem hindman.FS.singleton {M : Type u_1} (a : stream M) (i : ) :
a.nth i
theorem hindman.FP.singleton {M : Type u_1} [semigroup M] (a : stream M) (i : ) :
a.nth i
theorem hindman.FP.mul_two {M : Type u_1} [semigroup M] (a : stream M) (i j : ) (ij : i < j) :
(a.nth i) * a.nth j
theorem hindman.FS.add_two {M : Type u_1} (a : stream M) (i j : ) (ij : i < j) :
a.nth i + a.nth j
theorem hindman.FP.finset_prod {M : Type u_1} [comm_monoid M] (a : stream M) (s : finset ) (hs : s.nonempty) :
∏ (i : ) in s, a.nth i
theorem hindman.FS.finset_sum {M : Type u_1} (a : stream M) (s : finset ) (hs : s.nonempty) :
∑ (i : ) in s, a.nth i