Theorem: Finsupp.prod_option_index
File: Mathlib/Data/Finsupp/Basic.lean

tactic: apply induction_linear f
state_before: α : Type u_3
β : Type ?u.326281
γ : Type ?u.326284
ι : Type ?u.326287
M : Type u_1
M' : Type ?u.326293
N : Type u_2
P : Type ?u.326299
G : Type ?u.326302
H : Type ?u.326305
R : Type ?u.326308
S : Type ?u.326311
inst✝¹ : AddCommMonoid M
inst✝ : CommMonoid N
f : Option α →₀ M
b : Option α → M → N
h_zero : ∀ (o : Option α), b o 0 = 1
h_add : ∀ (o : Option α) (m₁ m₂ : M), b o (m₁ + m₂) = b o m₁ * b o m₂
⊢ prod f b = b none (↑f none) * prod (some f) fun a => b (Option.some a)

tactic: simp [some_zero, h_zero]
state_before: case h0
α : Type u_3
β : Type ?u.326281
γ : Type ?u.326284
ι : Type ?u.326287
M : Type u_1
M' : Type ?u.326293
N : Type u_2
P : Type ?u.326299
G : Type ?u.326302
H : Type ?u.326305
R : Type ?u.326308
S : Type ?u.326311
inst✝¹ : AddCommMonoid M
inst✝ : CommMonoid N
f : Option α →₀ M
b : Option α → M → N
h_zero : ∀ (o : Option α), b o 0 = 1
h_add : ∀ (o : Option α) (m₁ m₂ : M), b o (m₁ + m₂) = b o m₁ * b o m₂
⊢ prod 0 b = b none (↑0 none) * prod (some 0) fun a => b (Option.some a)

tactic: intro f₁ f₂ h₁ h₂
state_before: case hadd
α : Type u_3
β : Type ?u.326281
γ : Type ?u.326284
ι : Type ?u.326287
M : Type u_1
M' : Type ?u.326293
N : Type u_2
P : Type ?u.326299
G : Type ?u.326302
H : Type ?u.326305
R : Type ?u.326308
S : Type ?u.326311
inst✝¹ : AddCommMonoid M
inst✝ : CommMonoid N
f : Option α →₀ M
b : Option α → M → N
h_zero : ∀ (o : Option α), b o 0 = 1
h_add : ∀ (o : Option α) (m₁ m₂ : M), b o (m₁ + m₂) = b o m₁ * b o m₂
⊢ ∀ (f g : Option α →₀ M),
    (prod f b = b none (↑f none) * prod (some f) fun a => b (Option.some a)) →
      (prod g b = b none (↑g none) * prod (some g) fun a => b (Option.some a)) →
        prod (f + g) b = b none (↑(f + g) none) * prod (some (f + g)) fun a => b (Option.some a)

tactic: rw [Finsupp.prod_add_index, h₁, h₂, some_add, Finsupp.prod_add_index]
state_before: case hadd
α : Type u_3
β : Type ?u.326281
γ : Type ?u.326284
ι : Type ?u.326287
M : Type u_1
M' : Type ?u.326293
N : Type u_2
P : Type ?u.326299
G : Type ?u.326302
H : Type ?u.326305
R : Type ?u.326308
S : Type ?u.326311
inst✝¹ : AddCommMonoid M
inst✝ : CommMonoid N
f : Option α →₀ M
b : Option α → M → N
h_zero : ∀ (o : Option α), b o 0 = 1
h_add : ∀ (o : Option α) (m₁ m₂ : M), b o (m₁ + m₂) = b o m₁ * b o m₂
f₁ f₂ : Option α →₀ M
h₁ : prod f₁ b = b none (↑f₁ none) * prod (some f₁) fun a => b (Option.some a)
h₂ : prod f₂ b = b none (↑f₂ none) * prod (some f₂) fun a => b (Option.some a)
⊢ prod (f₁ + f₂) b = b none (↑(f₁ + f₂) none) * prod (some (f₁ + f₂)) fun a => b (Option.some a)

tactic: simp only [h_add, Pi.add_apply, Finsupp.coe_add]
state_before: case hadd
α : Type u_3
β : Type ?u.326281
γ : Type ?u.326284
ι : Type ?u.326287
M : Type u_1
M' : Type ?u.326293
N : Type u_2
P : Type ?u.326299
G : Type ?u.326302
H : Type ?u.326305
R : Type ?u.326308
S : Type ?u.326311
inst✝¹ : AddCommMonoid M
inst✝ : CommMonoid N
f : Option α →₀ M
b : Option α → M → N
h_zero : ∀ (o : Option α), b o 0 = 1
h_add : ∀ (o : Option α) (m₁ m₂ : M), b o (m₁ + m₂) = b o m₁ * b o m₂
f₁ f₂ : Option α →₀ M
h₁ : prod f₁ b = b none (↑f₁ none) * prod (some f₁) fun a => b (Option.some a)
h₂ : prod f₂ b = b none (↑f₂ none) * prod (some f₂) fun a => b (Option.some a)
⊢ (b none (↑f₁ none) * prod (some f₁) fun a => b (Option.some a)) *
      (b none (↑f₂ none) * prod (some f₂) fun a => b (Option.some a)) =
    b none (↑(f₁ + f₂) none) * ((prod (some f₁) fun a => b (Option.some a)) * prod (some f₂) fun a => b (Option.some a))

case hadd.h_zero
α : Type u_3
β : Type ?u.326281
γ : Type ?u.326284
ι : Type ?u.326287
M : Type u_1
M' : Type ?u.326293
N : Type u_2
P : Type ?u.326299
G : Type ?u.326302
H : Type ?u.326305
R : Type ?u.326308
S : Type ?u.326311
inst✝¹ : AddCommMonoid M
inst✝ : CommMonoid N
f : Option α →₀ M
b : Option α → M → N
h_zero : ∀ (o : Option α), b o 0 = 1
h_add : ∀ (o : Option α) (m₁ m₂ : M), b o (m₁ + m₂) = b o m₁ * b o m₂
f₁ f₂ : Option α →₀ M
h₁ : prod f₁ b = b none (↑f₁ none) * prod (some f₁) fun a => b (Option.some a)
h₂ : prod f₂ b = b none (↑f₂ none) * prod (some f₂) fun a => b (Option.some a)
⊢ ∀ (a : α), a ∈ (some f₁).support ∪ (some f₂).support → b (Option.some a) 0 = 1

case hadd.h_add
α : Type u_3
β : Type ?u.326281
γ : Type ?u.326284
ι : Type ?u.326287
M : Type u_1
M' : Type ?u.326293
N : Type u_2
P : Type ?u.326299
G : Type ?u.326302
H : Type ?u.326305
R : Type ?u.326308
S : Type ?u.326311
inst✝¹ : AddCommMonoid M
inst✝ : CommMonoid N
f : Option α →₀ M
b : Option α → M → N
h_zero : ∀ (o : Option α), b o 0 = 1
h_add : ∀ (o : Option α) (m₁ m₂ : M), b o (m₁ + m₂) = b o m₁ * b o m₂
f₁ f₂ : Option α →₀ M
h₁ : prod f₁ b = b none (↑f₁ none) * prod (some f₁) fun a => b (Option.some a)
h₂ : prod f₂ b = b none (↑f₂ none) * prod (some f₂) fun a => b (Option.some a)
⊢ ∀ (a : α),
    a ∈ (some f₁).support ∪ (some f₂).support →
      ∀ (b₁ b₂ : M), b (Option.some a) (b₁ + b₂) = b (Option.some a) b₁ * b (Option.some a) b₂

case hadd.h_zero
α : Type u_3
β : Type ?u.326281
γ : Type ?u.326284
ι : Type ?u.326287
M : Type u_1
M' : Type ?u.326293
N : Type u_2
P : Type ?u.326299
G : Type ?u.326302
H : Type ?u.326305
R : Type ?u.326308
S : Type ?u.326311
inst✝¹ : AddCommMonoid M
inst✝ : CommMonoid N
f : Option α →₀ M
b : Option α → M → N
h_zero : ∀ (o : Option α), b o 0 = 1
h_add : ∀ (o : Option α) (m₁ m₂ : M), b o (m₁ + m₂) = b o m₁ * b o m₂
f₁ f₂ : Option α →₀ M
h₁ : prod f₁ b = b none (↑f₁ none) * prod (some f₁) fun a => b (Option.some a)
h₂ : prod f₂ b = b none (↑f₂ none) * prod (some f₂) fun a => b (Option.some a)
⊢ ∀ (a : Option α), a ∈ f₁.support ∪ f₂.support → b a 0 = 1

case hadd.h_add
α : Type u_3
β : Type ?u.326281
γ : Type ?u.326284
ι : Type ?u.326287
M : Type u_1
M' : Type ?u.326293
N : Type u_2
P : Type ?u.326299
G : Type ?u.326302
H : Type ?u.326305
R : Type ?u.326308
S : Type ?u.326311
inst✝¹ : AddCommMonoid M
inst✝ : CommMonoid N
f : Option α →₀ M
b : Option α → M → N
h_zero : ∀ (o : Option α), b o 0 = 1
h_add : ∀ (o : Option α) (m₁ m₂ : M), b o (m₁ + m₂) = b o m₁ * b o m₂
f₁ f₂ : Option α →₀ M
h₁ : prod f₁ b = b none (↑f₁ none) * prod (some f₁) fun a => b (Option.some a)
h₂ : prod f₂ b = b none (↑f₂ none) * prod (some f₂) fun a => b (Option.some a)
⊢ ∀ (a : Option α), a ∈ f₁.support ∪ f₂.support → ∀ (b₁ b₂ : M), b a (b₁ + b₂) = b a b₁ * b a b₂

tactic: rw [mul_mul_mul_comm]
state_before: case hadd
α : Type u_3
β : Type ?u.326281
γ : Type ?u.326284
ι : Type ?u.326287
M : Type u_1
M' : Type ?u.326293
N : Type u_2
P : Type ?u.326299
G : Type ?u.326302
H : Type ?u.326305
R : Type ?u.326308
S : Type ?u.326311
inst✝¹ : AddCommMonoid M
inst✝ : CommMonoid N
f : Option α →₀ M
b : Option α → M → N
h_zero : ∀ (o : Option α), b o 0 = 1
h_add : ∀ (o : Option α) (m₁ m₂ : M), b o (m₁ + m₂) = b o m₁ * b o m₂
f₁ f₂ : Option α →₀ M
h₁ : prod f₁ b = b none (↑f₁ none) * prod (some f₁) fun a => b (Option.some a)
h₂ : prod f₂ b = b none (↑f₂ none) * prod (some f₂) fun a => b (Option.some a)
⊢ (b none (↑f₁ none) * prod (some f₁) fun a => b (Option.some a)) *
      (b none (↑f₂ none) * prod (some f₂) fun a => b (Option.some a)) =
    b none (↑f₁ none) * b none (↑f₂ none) *
      ((prod (some f₁) fun a => b (Option.some a)) * prod (some f₂) fun a => b (Option.some a))

case hadd.h_zero
α : Type u_3
β : Type ?u.326281
γ : Type ?u.326284
ι : Type ?u.326287
M : Type u_1
M' : Type ?u.326293
N : Type u_2
P : Type ?u.326299
G : Type ?u.326302
H : Type ?u.326305
R : Type ?u.326308
S : Type ?u.326311
inst✝¹ : AddCommMonoid M
inst✝ : CommMonoid N
f : Option α →₀ M
b : Option α → M → N
h_zero : ∀ (o : Option α), b o 0 = 1
h_add : ∀ (o : Option α) (m₁ m₂ : M), b o (m₁ + m₂) = b o m₁ * b o m₂
f₁ f₂ : Option α →₀ M
h₁ : prod f₁ b = b none (↑f₁ none) * prod (some f₁) fun a => b (Option.some a)
h₂ : prod f₂ b = b none (↑f₂ none) * prod (some f₂) fun a => b (Option.some a)
⊢ ∀ (a : α), a ∈ (some f₁).support ∪ (some f₂).support → b (Option.some a) 0 = 1

case hadd.h_add
α : Type u_3
β : Type ?u.326281
γ : Type ?u.326284
ι : Type ?u.326287
M : Type u_1
M' : Type ?u.326293
N : Type u_2
P : Type ?u.326299
G : Type ?u.326302
H : Type ?u.326305
R : Type ?u.326308
S : Type ?u.326311
inst✝¹ : AddCommMonoid M
inst✝ : CommMonoid N
f : Option α →₀ M
b : Option α → M → N
h_zero : ∀ (o : Option α), b o 0 = 1
h_add : ∀ (o : Option α) (m₁ m₂ : M), b o (m₁ + m₂) = b o m₁ * b o m₂
f₁ f₂ : Option α →₀ M
h₁ : prod f₁ b = b none (↑f₁ none) * prod (some f₁) fun a => b (Option.some a)
h₂ : prod f₂ b = b none (↑f₂ none) * prod (some f₂) fun a => b (Option.some a)
⊢ ∀ (a : α),
    a ∈ (some f₁).support ∪ (some f₂).support →
      ∀ (b₁ b₂ : M), b (Option.some a) (b₁ + b₂) = b (Option.some a) b₁ * b (Option.some a) b₂

case hadd.h_zero
α : Type u_3
β : Type ?u.326281
γ : Type ?u.326284
ι : Type ?u.326287
M : Type u_1
M' : Type ?u.326293
N : Type u_2
P : Type ?u.326299
G : Type ?u.326302
H : Type ?u.326305
R : Type ?u.326308
S : Type ?u.326311
inst✝¹ : AddCommMonoid M
inst✝ : CommMonoid N
f : Option α →₀ M
b : Option α → M → N
h_zero : ∀ (o : Option α), b o 0 = 1
h_add : ∀ (o : Option α) (m₁ m₂ : M), b o (m₁ + m₂) = b o m₁ * b o m₂
f₁ f₂ : Option α →₀ M
h₁ : prod f₁ b = b none (↑f₁ none) * prod (some f₁) fun a => b (Option.some a)
h₂ : prod f₂ b = b none (↑f₂ none) * prod (some f₂) fun a => b (Option.some a)
⊢ ∀ (a : Option α), a ∈ f₁.support ∪ f₂.support → b a 0 = 1

case hadd.h_add
α : Type u_3
β : Type ?u.326281
γ : Type ?u.326284
ι : Type ?u.326287
M : Type u_1
M' : Type ?u.326293
N : Type u_2
P : Type ?u.326299
G : Type ?u.326302
H : Type ?u.326305
R : Type ?u.326308
S : Type ?u.326311
inst✝¹ : AddCommMonoid M
inst✝ : CommMonoid N
f : Option α →₀ M
b : Option α → M → N
h_zero : ∀ (o : Option α), b o 0 = 1
h_add : ∀ (o : Option α) (m₁ m₂ : M), b o (m₁ + m₂) = b o m₁ * b o m₂
f₁ f₂ : Option α →₀ M
h₁ : prod f₁ b = b none (↑f₁ none) * prod (some f₁) fun a => b (Option.some a)
h₂ : prod f₂ b = b none (↑f₂ none) * prod (some f₂) fun a => b (Option.some a)
⊢ ∀ (a : Option α), a ∈ f₁.support ∪ f₂.support → ∀ (b₁ b₂ : M), b a (b₁ + b₂) = b a b₁ * b a b₂

tactic: all_goals simp [h_zero, h_add]
state_before: case hadd.h_zero
α : Type u_3
β : Type ?u.326281
γ : Type ?u.326284
ι : Type ?u.326287
M : Type u_1
M' : Type ?u.326293
N : Type u_2
P : Type ?u.326299
G : Type ?u.326302
H : Type ?u.326305
R : Type ?u.326308
S : Type ?u.326311
inst✝¹ : AddCommMonoid M
inst✝ : CommMonoid N
f : Option α →₀ M
b : Option α → M → N
h_zero : ∀ (o : Option α), b o 0 = 1
h_add : ∀ (o : Option α) (m₁ m₂ : M), b o (m₁ + m₂) = b o m₁ * b o m₂
f₁ f₂ : Option α →₀ M
h₁ : prod f₁ b = b none (↑f₁ none) * prod (some f₁) fun a => b (Option.some a)
h₂ : prod f₂ b = b none (↑f₂ none) * prod (some f₂) fun a => b (Option.some a)
⊢ ∀ (a : α), a ∈ (some f₁).support ∪ (some f₂).support → b (Option.some a) 0 = 1

case hadd.h_add
α : Type u_3
β : Type ?u.326281
γ : Type ?u.326284
ι : Type ?u.326287
M : Type u_1
M' : Type ?u.326293
N : Type u_2
P : Type ?u.326299
G : Type ?u.326302
H : Type ?u.326305
R : Type ?u.326308
S : Type ?u.326311
inst✝¹ : AddCommMonoid M
inst✝ : CommMonoid N
f : Option α →₀ M
b : Option α → M → N
h_zero : ∀ (o : Option α), b o 0 = 1
h_add : ∀ (o : Option α) (m₁ m₂ : M), b o (m₁ + m₂) = b o m₁ * b o m₂
f₁ f₂ : Option α →₀ M
h₁ : prod f₁ b = b none (↑f₁ none) * prod (some f₁) fun a => b (Option.some a)
h₂ : prod f₂ b = b none (↑f₂ none) * prod (some f₂) fun a => b (Option.some a)
⊢ ∀ (a : α),
    a ∈ (some f₁).support ∪ (some f₂).support →
      ∀ (b₁ b₂ : M), b (Option.some a) (b₁ + b₂) = b (Option.some a) b₁ * b (Option.some a) b₂

case hadd.h_zero
α : Type u_3
β : Type ?u.326281
γ : Type ?u.326284
ι : Type ?u.326287
M : Type u_1
M' : Type ?u.326293
N : Type u_2
P : Type ?u.326299
G : Type ?u.326302
H : Type ?u.326305
R : Type ?u.326308
S : Type ?u.326311
inst✝¹ : AddCommMonoid M
inst✝ : CommMonoid N
f : Option α →₀ M
b : Option α → M → N
h_zero : ∀ (o : Option α), b o 0 = 1
h_add : ∀ (o : Option α) (m₁ m₂ : M), b o (m₁ + m₂) = b o m₁ * b o m₂
f₁ f₂ : Option α →₀ M
h₁ : prod f₁ b = b none (↑f₁ none) * prod (some f₁) fun a => b (Option.some a)
h₂ : prod f₂ b = b none (↑f₂ none) * prod (some f₂) fun a => b (Option.some a)
⊢ ∀ (a : Option α), a ∈ f₁.support ∪ f₂.support → b a 0 = 1

case hadd.h_add
α : Type u_3
β : Type ?u.326281
γ : Type ?u.326284
ι : Type ?u.326287
M : Type u_1
M' : Type ?u.326293
N : Type u_2
P : Type ?u.326299
G : Type ?u.326302
H : Type ?u.326305
R : Type ?u.326308
S : Type ?u.326311
inst✝¹ : AddCommMonoid M
inst✝ : CommMonoid N
f : Option α →₀ M
b : Option α → M → N
h_zero : ∀ (o : Option α), b o 0 = 1
h_add : ∀ (o : Option α) (m₁ m₂ : M), b o (m₁ + m₂) = b o m₁ * b o m₂
f₁ f₂ : Option α →₀ M
h₁ : prod f₁ b = b none (↑f₁ none) * prod (some f₁) fun a => b (Option.some a)
h₂ : prod f₂ b = b none (↑f₂ none) * prod (some f₂) fun a => b (Option.some a)
⊢ ∀ (a : Option α), a ∈ f₁.support ∪ f₂.support → ∀ (b₁ b₂ : M), b a (b₁ + b₂) = b a b₁ * b a b₂

tactic: simp [h_zero, h_add]
state_before: case hadd.h_add
α : Type u_3
β : Type ?u.326281
γ : Type ?u.326284
ι : Type ?u.326287
M : Type u_1
M' : Type ?u.326293
N : Type u_2
P : Type ?u.326299
G : Type ?u.326302
H : Type ?u.326305
R : Type ?u.326308
S : Type ?u.326311
inst✝¹ : AddCommMonoid M
inst✝ : CommMonoid N
f : Option α →₀ M
b : Option α → M → N
h_zero : ∀ (o : Option α), b o 0 = 1
h_add : ∀ (o : Option α) (m₁ m₂ : M), b o (m₁ + m₂) = b o m₁ * b o m₂
f₁ f₂ : Option α →₀ M
h₁ : prod f₁ b = b none (↑f₁ none) * prod (some f₁) fun a => b (Option.some a)
h₂ : prod f₂ b = b none (↑f₂ none) * prod (some f₂) fun a => b (Option.some a)
⊢ ∀ (a : Option α), a ∈ f₁.support ∪ f₂.support → ∀ (b₁ b₂ : M), b a (b₁ + b₂) = b a b₁ * b a b₂

tactic: rintro (_ | a) m <;> simp [h_zero, h_add]
state_before: case hsingle
α : Type u_3
β : Type ?u.326281
γ : Type ?u.326284
ι : Type ?u.326287
M : Type u_1
M' : Type ?u.326293
N : Type u_2
P : Type ?u.326299
G : Type ?u.326302
H : Type ?u.326305
R : Type ?u.326308
S : Type ?u.326311
inst✝¹ : AddCommMonoid M
inst✝ : CommMonoid N
f : Option α →₀ M
b : Option α → M → N
h_zero : ∀ (o : Option α), b o 0 = 1
h_add : ∀ (o : Option α) (m₁ m₂ : M), b o (m₁ + m₂) = b o m₁ * b o m₂
⊢ ∀ (a : Option α) (b_1 : M),
    prod (single a b_1) b = b none (↑(single a b_1) none) * prod (some (single a b_1)) fun a => b (Option.some a)