Theorem: Hindman.FP.mul
File: Mathlib/Combinatorics/Hindman.lean

tactic: induction' hm with a a m hm ih a m hm ih
state_before: M : Type u_1
inst✝ : Semigroup M
a : Stream' M
m : M
hm : m ∈ FP a
⊢ ∃ n, ∀ (m' : M), m' ∈ FP (Stream'.drop n a) → m * m' ∈ FP a

tactic: exact ⟨1, fun m hm => FP.cons a m hm⟩
state_before: case head
M : Type u_1
inst✝ : Semigroup M
a✝ : Stream' M
m : M
a : Stream' M
⊢ ∃ n, ∀ (m' : M), m' ∈ FP (Stream'.drop n a) → Stream'.head a * m' ∈ FP a

tactic: cases' ih with n hn
state_before: case tail
M : Type u_1
inst✝ : Semigroup M
a✝ : Stream' M
m✝ : M
a : Stream' M
m : M
hm : FP (Stream'.tail a) m
ih : ∃ n, ∀ (m' : M), m' ∈ FP (Stream'.drop n (Stream'.tail a)) → m * m' ∈ FP (Stream'.tail a)
⊢ ∃ n, ∀ (m' : M), m' ∈ FP (Stream'.drop n a) → m * m' ∈ FP a

tactic: use n + 1
state_before: case tail.intro
M : Type u_1
inst✝ : Semigroup M
a✝ : Stream' M
m✝ : M
a : Stream' M
m : M
hm : FP (Stream'.tail a) m
n : ℕ
hn : ∀ (m' : M), m' ∈ FP (Stream'.drop n (Stream'.tail a)) → m * m' ∈ FP (Stream'.tail a)
⊢ ∃ n, ∀ (m' : M), m' ∈ FP (Stream'.drop n a) → m * m' ∈ FP a

tactic: intro m' hm'
state_before: case tail.intro
M : Type u_1
inst✝ : Semigroup M
a✝ : Stream' M
m✝ : M
a : Stream' M
m : M
hm : FP (Stream'.tail a) m
n : ℕ
hn : ∀ (m' : M), m' ∈ FP (Stream'.drop n (Stream'.tail a)) → m * m' ∈ FP (Stream'.tail a)
⊢ ∀ (m' : M), m' ∈ FP (Stream'.drop (n + 1) a) → m * m' ∈ FP a

tactic: exact FP.tail _ _ (hn _ hm')
state_before: case tail.intro
M : Type u_1
inst✝ : Semigroup M
a✝ : Stream' M
m✝ : M
a : Stream' M
m : M
hm : FP (Stream'.tail a) m
n : ℕ
hn : ∀ (m' : M), m' ∈ FP (Stream'.drop n (Stream'.tail a)) → m * m' ∈ FP (Stream'.tail a)
m' : M
hm' : m' ∈ FP (Stream'.drop (n + 1) a)
⊢ m * m' ∈ FP a

tactic: cases' ih with n hn
state_before: case cons
M : Type u_1
inst✝ : Semigroup M
a✝ : Stream' M
m✝ : M
a : Stream' M
m : M
hm : FP (Stream'.tail a) m
ih : ∃ n, ∀ (m' : M), m' ∈ FP (Stream'.drop n (Stream'.tail a)) → m * m' ∈ FP (Stream'.tail a)
⊢ ∃ n, ∀ (m' : M), m' ∈ FP (Stream'.drop n a) → Stream'.head a * m * m' ∈ FP a

tactic: use n + 1
state_before: case cons.intro
M : Type u_1
inst✝ : Semigroup M
a✝ : Stream' M
m✝ : M
a : Stream' M
m : M
hm : FP (Stream'.tail a) m
n : ℕ
hn : ∀ (m' : M), m' ∈ FP (Stream'.drop n (Stream'.tail a)) → m * m' ∈ FP (Stream'.tail a)
⊢ ∃ n, ∀ (m' : M), m' ∈ FP (Stream'.drop n a) → Stream'.head a * m * m' ∈ FP a

tactic: intro m' hm'
state_before: case cons.intro
M : Type u_1
inst✝ : Semigroup M
a✝ : Stream' M
m✝ : M
a : Stream' M
m : M
hm : FP (Stream'.tail a) m
n : ℕ
hn : ∀ (m' : M), m' ∈ FP (Stream'.drop n (Stream'.tail a)) → m * m' ∈ FP (Stream'.tail a)
⊢ ∀ (m' : M), m' ∈ FP (Stream'.drop (n + 1) a) → Stream'.head a * m * m' ∈ FP a

tactic: rw [mul_assoc]
state_before: case cons.intro
M : Type u_1
inst✝ : Semigroup M
a✝ : Stream' M
m✝ : M
a : Stream' M
m : M
hm : FP (Stream'.tail a) m
n : ℕ
hn : ∀ (m' : M), m' ∈ FP (Stream'.drop n (Stream'.tail a)) → m * m' ∈ FP (Stream'.tail a)
m' : M
hm' : m' ∈ FP (Stream'.drop (n + 1) a)
⊢ Stream'.head a * m * m' ∈ FP a

tactic: exact FP.cons _ _ (hn _ hm')
state_before: case cons.intro
M : Type u_1
inst✝ : Semigroup M
a✝ : Stream' M
m✝ : M
a : Stream' M
m : M
hm : FP (Stream'.tail a) m
n : ℕ
hn : ∀ (m' : M), m' ∈ FP (Stream'.drop n (Stream'.tail a)) → m * m' ∈ FP (Stream'.tail a)
m' : M
hm' : m' ∈ FP (Stream'.drop (n + 1) a)
⊢ Stream'.head a * (m * m') ∈ FP a