Theorem: Combinatorics.exists_mono_homothetic_copy
File: Mathlib/Combinatorics/HalesJewett.lean

Proof steps:
state_before: η : Type u_1
α : Type u_2
ι : Type u_3
κ✝ : Type u_4
M : Type u_5
κ : Type u_6
inst✝¹ : AddCommMonoid M
S : Finset M
inst✝ : Finite κ
C : M → κ
⊢ ∃ a > 0, ∃ b c, ∀ s ∈ S, C (a • s + b) = c
state_after: case intro.intro
η : Type u_1
α : Type u_2
ι✝ : Type u_3
κ✝ : Type u_4
M : Type u_5
κ : Type u_6
inst✝¹ : AddCommMonoid M
S : Finset M
inst✝ : Finite κ
C : M → κ
ι : Type
_inst : Fintype ι
hι : ∀ (C : (ι → { x // x ∈ S }) → κ), ∃ l, Line.IsMono C l
⊢ ∃ a > 0, ∃ b c, ∀ s ∈ S, C (a • s + b) = c
tactic: obtain ⟨ι, _inst, hι⟩ := Line.exists_mono_in_high_dimension S κ
state_before: case intro.intro
η : Type u_1
α : Type u_2
ι✝ : Type u_3
κ✝ : Type u_4
M : Type u_5
κ : Type u_6
inst✝¹ : AddCommMonoid M
S : Finset M
inst✝ : Finite κ
C : M → κ
ι : Type
_inst : Fintype ι
hι : ∀ (C : (ι → { x // x ∈ S }) → κ), ∃ l, Line.IsMono C l
⊢ ∃ a > 0, ∃ b c, ∀ s ∈ S, C (a • s + b) = c
state_after: case intro.intro
η : Type u_1
α : Type u_2
ι✝ : Type u_3
κ✝ : Type u_4
M : Type u_5
κ : Type u_6
inst✝¹ : AddCommMonoid M
S : Finset M
inst✝ : Finite κ
C : M → κ
ι : Type
_inst : Fintype ι
hι : ∃ l, Line.IsMono (fun v => C (∑ i : ι, ↑(v i))) l
⊢ ∃ a > 0, ∃ b c, ∀ s ∈ S, C (a • s + b) = c
tactic: specialize hι fun v => C <| ∑ i, v i
state_before: case intro.intro
η : Type u_1
α : Type u_2
ι✝ : Type u_3
κ✝ : Type u_4
M : Type u_5
κ : Type u_6
inst✝¹ : AddCommMonoid M
S : Finset M
inst✝ : Finite κ
C : M → κ
ι : Type
_inst : Fintype ι
hι : ∃ l, Line.IsMono (fun v => C (∑ i : ι, ↑(v i))) l
⊢ ∃ a > 0, ∃ b c, ∀ s ∈ S, C (a • s + b) = c
state_after: case intro.intro.intro.intro
η : Type u_1
α : Type u_2
ι✝ : Type u_3
κ✝ : Type u_4
M : Type u_5
κ : Type u_6
inst✝¹ : AddCommMonoid M
S : Finset M
inst✝ : Finite κ
C : M → κ
ι : Type
_inst : Fintype ι
l : Line { x // x ∈ S } ι
c : κ
hl : ∀ (x : { x // x ∈ S }), (fun v => C (∑ i : ι, ↑(v i))) ((fun x i => (l.idxFun i).getD x) x) = c
⊢ ∃ a > 0, ∃ b c, ∀ s ∈ S, C (a • s + b) = c
tactic: obtain ⟨l, c, hl⟩ := hι
state_before: case intro.intro.intro.intro
η : Type u_1
α : Type u_2
ι✝ : Type u_3
κ✝ : Type u_4
M : Type u_5
κ : Type u_6
inst✝¹ : AddCommMonoid M
S : Finset M
inst✝ : Finite κ
C : M → κ
ι : Type
_inst : Fintype ι
l : Line { x // x ∈ S } ι
c : κ
hl : ∀ (x : { x // x ∈ S }), (fun v => C (∑ i : ι, ↑(v i))) ((fun x i => (l.idxFun i).getD x) x) = c
⊢ ∃ a > 0, ∃ b c, ∀ s ∈ S, C (a • s + b) = c
state_after: case intro.intro.intro.intro
η : Type u_1
α : Type u_2
ι✝ : Type u_3
κ✝ : Type u_4
M : Type u_5
κ : Type u_6
inst✝¹ : AddCommMonoid M
S : Finset M
inst✝ : Finite κ
C : M → κ
ι : Type
_inst : Fintype ι
l : Line { x // x ∈ S } ι
c : κ
hl : ∀ (x : { x // x ∈ S }), (fun v => C (∑ i : ι, ↑(v i))) ((fun x i => (l.idxFun i).getD x) x) = c
s : Finset ι := Finset.filter (fun i => l.idxFun i = none) Finset.univ
hs : s = Finset.filter (fun i => l.idxFun i = none) Finset.univ
⊢ ∃ a > 0, ∃ b c, ∀ s ∈ S, C (a • s + b) = c
tactic: set s : Finset ι := Finset.univ.filter (fun i => l.idxFun i = none) with hs
state_before: case intro.intro.intro.intro
η : Type u_1
α : Type u_2
ι✝ : Type u_3
κ✝ : Type u_4
M : Type u_5
κ : Type u_6
inst✝¹ : AddCommMonoid M
S : Finset M
inst✝ : Finite κ
C : M → κ
ι : Type
_inst : Fintype ι
l : Line { x // x ∈ S } ι
c : κ
hl : ∀ (x : { x // x ∈ S }), (fun v => C (∑ i : ι, ↑(v i))) ((fun x i => (l.idxFun i).getD x) x) = c
s : Finset ι := Finset.filter (fun i => l.idxFun i = none) Finset.univ
hs : s = Finset.filter (fun i => l.idxFun i = none) Finset.univ
⊢ ∃ a > 0, ∃ b c, ∀ s ∈ S, C (a • s + b) = c
state_after: case intro.intro.intro.intro.refine_1
η : Type u_1
α : Type u_2
ι✝ : Type u_3
κ✝ : Type u_4
M : Type u_5
κ : Type u_6
inst✝¹ : AddCommMonoid M
S : Finset M
inst✝ : Finite κ
C : M → κ
ι : Type
_inst : Fintype ι
l : Line { x // x ∈ S } ι
c : κ
hl : ∀ (x : { x // x ∈ S }), (fun v => C (∑ i : ι, ↑(v i))) ((fun x i => (l.idxFun i).getD x) x) = c
s : Finset ι := Finset.filter (fun i => l.idxFun i = none) Finset.univ
hs : s = Finset.filter (fun i => l.idxFun i = none) Finset.univ
⊢ ⋯.choose ∈ s

case intro.intro.intro.intro.refine_2
η : Type u_1
α : Type u_2
ι✝ : Type u_3
κ✝ : Type u_4
M : Type u_5
κ : Type u_6
inst✝¹ : AddCommMonoid M
S : Finset M
inst✝ : Finite κ
C : M → κ
ι : Type
_inst : Fintype ι
l : Line { x // x ∈ S } ι
c : κ
hl : ∀ (x : { x // x ∈ S }), (fun v => C (∑ i : ι, ↑(v i))) ((fun x i => (l.idxFun i).getD x) x) = c
s : Finset ι := Finset.filter (fun i => l.idxFun i = none) Finset.univ
hs : s = Finset.filter (fun i => l.idxFun i = none) Finset.univ
i : ι
⊢ { x // x ∈ S } → M

case intro.intro.intro.intro.refine_3
η : Type u_1
α : Type u_2
ι✝ : Type u_3
κ✝ : Type u_4
M : Type u_5
κ : Type u_6
inst✝¹ : AddCommMonoid M
S : Finset M
inst✝ : Finite κ
C : M → κ
ι : Type
_inst : Fintype ι
l : Line { x // x ∈ S } ι
c : κ
hl : ∀ (x : { x // x ∈ S }), (fun v => C (∑ i : ι, ↑(v i))) ((fun x i => (l.idxFun i).getD x) x) = c
s : Finset ι := Finset.filter (fun i => l.idxFun i = none) Finset.univ
hs : s = Finset.filter (fun i => l.idxFun i = none) Finset.univ
⊢ ∀ s_1 ∈ S, C (s.card • s_1 + ∑ i ∈ sᶜ, (Option.map (?m.43407 i) (l.idxFun i)).getD 0) = c
tactic: refine
    ⟨s.card, Finset.card_pos.mpr ⟨l.proper.choose, ?_⟩, ∑ i ∈ sᶜ, ((l.idxFun i).map ?_).getD 0,
      c, ?_⟩
state_before: case intro.intro.intro.intro.refine_3
η : Type u_1
α : Type u_2
ι✝ : Type u_3
κ✝ : Type u_4
M : Type u_5
κ : Type u_6
inst✝¹ : AddCommMonoid M
S : Finset M
inst✝ : Finite κ
C : M → κ
ι : Type
_inst : Fintype ι
l : Line { x // x ∈ S } ι
c : κ
hl : ∀ (x : { x // x ∈ S }), (fun v => C (∑ i : ι, ↑(v i))) ((fun x i => (l.idxFun i).getD x) x) = c
s : Finset ι := Finset.filter (fun i => l.idxFun i = none) Finset.univ
hs : s = Finset.filter (fun i => l.idxFun i = none) Finset.univ
⊢ ∀ s_1 ∈ S, C (s.card • s_1 + ∑ i ∈ sᶜ, (Option.map (fun m => ↑m) (l.idxFun i)).getD 0) = c
state_after: case intro.intro.intro.intro.refine_3
η : Type u_1
α : Type u_2
ι✝ : Type u_3
κ✝ : Type u_4
M : Type u_5
κ : Type u_6
inst✝¹ : AddCommMonoid M
S : Finset M
inst✝ : Finite κ
C : M → κ
ι : Type
_inst : Fintype ι
l : Line { x // x ∈ S } ι
c : κ
hl : ∀ (x : { x // x ∈ S }), (fun v => C (∑ i : ι, ↑(v i))) ((fun x i => (l.idxFun i).getD x) x) = c
s : Finset ι := Finset.filter (fun i => l.idxFun i = none) Finset.univ
hs : s = Finset.filter (fun i => l.idxFun i = none) Finset.univ
x : M
xs : x ∈ S
⊢ C (s.card • x + ∑ i ∈ sᶜ, (Option.map (fun m => ↑m) (l.idxFun i)).getD 0) = c
tactic: intro x xs
state_before: case intro.intro.intro.intro.refine_3
η : Type u_1
α : Type u_2
ι✝ : Type u_3
κ✝ : Type u_4
M : Type u_5
κ : Type u_6
inst✝¹ : AddCommMonoid M
S : Finset M
inst✝ : Finite κ
C : M → κ
ι : Type
_inst : Fintype ι
l : Line { x // x ∈ S } ι
c : κ
hl : ∀ (x : { x // x ∈ S }), (fun v => C (∑ i : ι, ↑(v i))) ((fun x i => (l.idxFun i).getD x) x) = c
s : Finset ι := Finset.filter (fun i => l.idxFun i = none) Finset.univ
hs : s = Finset.filter (fun i => l.idxFun i = none) Finset.univ
x : M
xs : x ∈ S
⊢ C (s.card • x + ∑ i ∈ sᶜ, (Option.map (fun m => ↑m) (l.idxFun i)).getD 0) = c
state_after: case intro.intro.intro.intro.refine_3
η : Type u_1
α : Type u_2
ι✝ : Type u_3
κ✝ : Type u_4
M : Type u_5
κ : Type u_6
inst✝¹ : AddCommMonoid M
S : Finset M
inst✝ : Finite κ
C : M → κ
ι : Type
_inst : Fintype ι
l : Line { x // x ∈ S } ι
c : κ
hl : ∀ (x : { x // x ∈ S }), (fun v => C (∑ i : ι, ↑(v i))) ((fun x i => (l.idxFun i).getD x) x) = c
s : Finset ι := Finset.filter (fun i => l.idxFun i = none) Finset.univ
hs : s = Finset.filter (fun i => l.idxFun i = none) Finset.univ
x : M
xs : x ∈ S
⊢ C (s.card • x + ∑ i ∈ sᶜ, (Option.map (fun m => ↑m) (l.idxFun i)).getD 0) =
    (fun v => C (∑ i : ι, ↑(v i))) ((fun x i => (l.idxFun i).getD x) ⟨x, xs⟩)
tactic: rw [← hl ⟨x, xs⟩]
state_before: case intro.intro.intro.intro.refine_3
η : Type u_1
α : Type u_2
ι✝ : Type u_3
κ✝ : Type u_4
M : Type u_5
κ : Type u_6
inst✝¹ : AddCommMonoid M
S : Finset M
inst✝ : Finite κ
C : M → κ
ι : Type
_inst : Fintype ι
l : Line { x // x ∈ S } ι
c : κ
hl : ∀ (x : { x // x ∈ S }), (fun v => C (∑ i : ι, ↑(v i))) ((fun x i => (l.idxFun i).getD x) x) = c
s : Finset ι := Finset.filter (fun i => l.idxFun i = none) Finset.univ
hs : s = Finset.filter (fun i => l.idxFun i = none) Finset.univ
x : M
xs : x ∈ S
⊢ C (s.card • x + ∑ i ∈ sᶜ, (Option.map (fun m => ↑m) (l.idxFun i)).getD 0) =
    (fun v => C (∑ i : ι, ↑(v i))) ((fun x i => (l.idxFun i).getD x) ⟨x, xs⟩)
state_after: case intro.intro.intro.intro.refine_3
η : Type u_1
α : Type u_2
ι✝ : Type u_3
κ✝ : Type u_4
M : Type u_5
κ : Type u_6
inst✝¹ : AddCommMonoid M
S : Finset M
inst✝ : Finite κ
C : M → κ
ι : Type
_inst : Fintype ι
l : Line { x // x ∈ S } ι
c : κ
s : Finset ι := Finset.filter (fun i => l.idxFun i = none) Finset.univ
hs : s = Finset.filter (fun i => l.idxFun i = none) Finset.univ
x : M
xs : x ∈ S
⊢ C (s.card • x + ∑ i ∈ sᶜ, (Option.map (fun m => ↑m) (l.idxFun i)).getD 0) =
    (fun v => C (∑ i : ι, ↑(v i))) ((fun x i => (l.idxFun i).getD x) ⟨x, xs⟩)
tactic: clear hl
state_before: case intro.intro.intro.intro.refine_3
η : Type u_1
α : Type u_2
ι✝ : Type u_3
κ✝ : Type u_4
M : Type u_5
κ : Type u_6
inst✝¹ : AddCommMonoid M
S : Finset M
inst✝ : Finite κ
C : M → κ
ι : Type
_inst : Fintype ι
l : Line { x // x ∈ S } ι
c : κ
s : Finset ι := Finset.filter (fun i => l.idxFun i = none) Finset.univ
hs : s = Finset.filter (fun i => l.idxFun i = none) Finset.univ
x : M
xs : x ∈ S
⊢ C (s.card • x + ∑ i ∈ sᶜ, (Option.map (fun m => ↑m) (l.idxFun i)).getD 0) =
    (fun v => C (∑ i : ι, ↑(v i))) ((fun x i => (l.idxFun i).getD x) ⟨x, xs⟩)
state_after: case intro.intro.intro.intro.refine_3.e_a
η : Type u_1
α : Type u_2
ι✝ : Type u_3
κ✝ : Type u_4
M : Type u_5
κ : Type u_6
inst✝¹ : AddCommMonoid M
S : Finset M
inst✝ : Finite κ
C : M → κ
ι : Type
_inst : Fintype ι
l : Line { x // x ∈ S } ι
c : κ
s : Finset ι := Finset.filter (fun i => l.idxFun i = none) Finset.univ
hs : s = Finset.filter (fun i => l.idxFun i = none) Finset.univ
x : M
xs : x ∈ S
⊢ s.card • x + ∑ i ∈ sᶜ, (Option.map (fun m => ↑m) (l.idxFun i)).getD 0 =
    ∑ i : ι, ↑((fun x i => (l.idxFun i).getD x) ⟨x, xs⟩ i)
tactic: congr
state_before: case intro.intro.intro.intro.refine_3.e_a
η : Type u_1
α : Type u_2
ι✝ : Type u_3
κ✝ : Type u_4
M : Type u_5
κ : Type u_6
inst✝¹ : AddCommMonoid M
S : Finset M
inst✝ : Finite κ
C : M → κ
ι : Type
_inst : Fintype ι
l : Line { x // x ∈ S } ι
c : κ
s : Finset ι := Finset.filter (fun i => l.idxFun i = none) Finset.univ
hs : s = Finset.filter (fun i => l.idxFun i = none) Finset.univ
x : M
xs : x ∈ S
⊢ s.card • x + ∑ i ∈ sᶜ, (Option.map (fun m => ↑m) (l.idxFun i)).getD 0 =
    ∑ i : ι, ↑((fun x i => (l.idxFun i).getD x) ⟨x, xs⟩ i)
state_after: case intro.intro.intro.intro.refine_3.e_a
η : Type u_1
α : Type u_2
ι✝ : Type u_3
κ✝ : Type u_4
M : Type u_5
κ : Type u_6
inst✝¹ : AddCommMonoid M
S : Finset M
inst✝ : Finite κ
C : M → κ
ι : Type
_inst : Fintype ι
l : Line { x // x ∈ S } ι
c : κ
s : Finset ι := Finset.filter (fun i => l.idxFun i = none) Finset.univ
hs : s = Finset.filter (fun i => l.idxFun i = none) Finset.univ
x : M
xs : x ∈ S
⊢ s.card • x + ∑ i ∈ sᶜ, (Option.map (fun m => ↑m) (l.idxFun i)).getD 0 =
    ∑ i ∈ s, ↑((fun x i => (l.idxFun i).getD x) ⟨x, xs⟩ i) + ∑ i ∈ sᶜ, ↑((fun x i => (l.idxFun i).getD x) ⟨x, xs⟩ i)
tactic: rw [← Finset.sum_add_sum_compl s]
state_before: case intro.intro.intro.intro.refine_3.e_a
η : Type u_1
α : Type u_2
ι✝ : Type u_3
κ✝ : Type u_4
M : Type u_5
κ : Type u_6
inst✝¹ : AddCommMonoid M
S : Finset M
inst✝ : Finite κ
C : M → κ
ι : Type
_inst : Fintype ι
l : Line { x // x ∈ S } ι
c : κ
s : Finset ι := Finset.filter (fun i => l.idxFun i = none) Finset.univ
hs : s = Finset.filter (fun i => l.idxFun i = none) Finset.univ
x : M
xs : x ∈ S
⊢ s.card • x + ∑ i ∈ sᶜ, (Option.map (fun m => ↑m) (l.idxFun i)).getD 0 =
    ∑ i ∈ s, ↑((fun x i => (l.idxFun i).getD x) ⟨x, xs⟩ i) + ∑ i ∈ sᶜ, ↑((fun x i => (l.idxFun i).getD x) ⟨x, xs⟩ i)
state_after: case intro.intro.intro.intro.refine_3.e_a.e_a
η : Type u_1
α : Type u_2
ι✝ : Type u_3
κ✝ : Type u_4
M : Type u_5
κ : Type u_6
inst✝¹ : AddCommMonoid M
S : Finset M
inst✝ : Finite κ
C : M → κ
ι : Type
_inst : Fintype ι
l : Line { x // x ∈ S } ι
c : κ
s : Finset ι := Finset.filter (fun i => l.idxFun i = none) Finset.univ
hs : s = Finset.filter (fun i => l.idxFun i = none) Finset.univ
x : M
xs : x ∈ S
⊢ s.card • x = ∑ i ∈ s, ↑((fun x i => (l.idxFun i).getD x) ⟨x, xs⟩ i)

case intro.intro.intro.intro.refine_3.e_a.e_a
η : Type u_1
α : Type u_2
ι✝ : Type u_3
κ✝ : Type u_4
M : Type u_5
κ : Type u_6
inst✝¹ : AddCommMonoid M
S : Finset M
inst✝ : Finite κ
C : M → κ
ι : Type
_inst : Fintype ι
l : Line { x // x ∈ S } ι
c : κ
s : Finset ι := Finset.filter (fun i => l.idxFun i = none) Finset.univ
hs : s = Finset.filter (fun i => l.idxFun i = none) Finset.univ
x : M
xs : x ∈ S
⊢ ∑ i ∈ sᶜ, (Option.map (fun m => ↑m) (l.idxFun i)).getD 0 = ∑ i ∈ sᶜ, ↑((fun x i => (l.idxFun i).getD x) ⟨x, xs⟩ i)
tactic: congr 1