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

tactic: have : ∀ b : α × β, single b.fst (single b.snd (f b)) x y = if b = (x, y) then f b else 0 := by
  rintro ⟨b₁, b₂⟩
  simp [single_apply, ite_apply, Prod.ext_iff, ite_and]
  split_ifs <;> simp [single_apply, *]
state_before: α : Type u_2
β : Type u_1
γ : Type ?u.528340
ι : Type ?u.528343
M : Type u_3
M' : Type ?u.528349
N : Type ?u.528352
P : Type ?u.528355
G : Type ?u.528358
H : Type ?u.528361
R : Type ?u.528364
S : Type ?u.528367
inst✝¹ : AddCommMonoid M
inst✝ : AddCommMonoid N
f : α × β →₀ M
x : α
y : β
⊢ ↑(↑(Finsupp.curry f) x) y = ↑f (x, y)

tactic: rw [Finsupp.curry, sum_apply, sum_apply, Finsupp.sum, Finset.sum_eq_single, this, if_pos rfl]
state_before: α : Type u_2
β : Type u_1
γ : Type ?u.528340
ι : Type ?u.528343
M : Type u_3
M' : Type ?u.528349
N : Type ?u.528352
P : Type ?u.528355
G : Type ?u.528358
H : Type ?u.528361
R : Type ?u.528364
S : Type ?u.528367
inst✝¹ : AddCommMonoid M
inst✝ : AddCommMonoid N
f : α × β →₀ M
x : α
y : β
this : ∀ (b : α × β), ↑(↑(single b.fst (single b.snd (↑f b))) x) y = if b = (x, y) then ↑f b else 0
⊢ ↑(↑(Finsupp.curry f) x) y = ↑f (x, y)

tactic: rintro ⟨b₁, b₂⟩
state_before: α : Type u_2
β : Type u_1
γ : Type ?u.528340
ι : Type ?u.528343
M : Type u_3
M' : Type ?u.528349
N : Type ?u.528352
P : Type ?u.528355
G : Type ?u.528358
H : Type ?u.528361
R : Type ?u.528364
S : Type ?u.528367
inst✝¹ : AddCommMonoid M
inst✝ : AddCommMonoid N
f : α × β →₀ M
x : α
y : β
⊢ ∀ (b : α × β), ↑(↑(single b.fst (single b.snd (↑f b))) x) y = if b = (x, y) then ↑f b else 0

tactic: simp [single_apply, ite_apply, Prod.ext_iff, ite_and]
state_before: case mk
α : Type u_2
β : Type u_1
γ : Type ?u.528340
ι : Type ?u.528343
M : Type u_3
M' : Type ?u.528349
N : Type ?u.528352
P : Type ?u.528355
G : Type ?u.528358
H : Type ?u.528361
R : Type ?u.528364
S : Type ?u.528367
inst✝¹ : AddCommMonoid M
inst✝ : AddCommMonoid N
f : α × β →₀ M
x : α
y : β
b₁ : α
b₂ : β
⊢ ↑(↑(single (b₁, b₂).fst (single (b₁, b₂).snd (↑f (b₁, b₂)))) x) y = if (b₁, b₂) = (x, y) then ↑f (b₁, b₂) else 0

tactic: split_ifs <;> simp [single_apply, *]
state_before: case mk
α : Type u_2
β : Type u_1
γ : Type ?u.528340
ι : Type ?u.528343
M : Type u_3
M' : Type ?u.528349
N : Type ?u.528352
P : Type ?u.528355
G : Type ?u.528358
H : Type ?u.528361
R : Type ?u.528364
S : Type ?u.528367
inst✝¹ : AddCommMonoid M
inst✝ : AddCommMonoid N
f : α × β →₀ M
x : α
y : β
b₁ : α
b₂ : β
⊢ ↑(if b₁ = x then single b₂ (↑f (b₁, b₂)) else 0) y = if b₁ = x then if b₂ = y then ↑f (b₁, b₂) else 0 else 0

tactic: intro b _ b_ne
state_before: case h₀
α : Type u_2
β : Type u_1
γ : Type ?u.528340
ι : Type ?u.528343
M : Type u_3
M' : Type ?u.528349
N : Type ?u.528352
P : Type ?u.528355
G : Type ?u.528358
H : Type ?u.528361
R : Type ?u.528364
S : Type ?u.528367
inst✝¹ : AddCommMonoid M
inst✝ : AddCommMonoid N
f : α × β →₀ M
x : α
y : β
this : ∀ (b : α × β), ↑(↑(single b.fst (single b.snd (↑f b))) x) y = if b = (x, y) then ↑f b else 0
⊢ ∀ (b : α × β), b ∈ f.support → b ≠ (x, y) → ↑(↑(single b.fst (single b.snd (↑f b))) x) y = 0

tactic: rw [this b, if_neg b_ne]
state_before: case h₀
α : Type u_2
β : Type u_1
γ : Type ?u.528340
ι : Type ?u.528343
M : Type u_3
M' : Type ?u.528349
N : Type ?u.528352
P : Type ?u.528355
G : Type ?u.528358
H : Type ?u.528361
R : Type ?u.528364
S : Type ?u.528367
inst✝¹ : AddCommMonoid M
inst✝ : AddCommMonoid N
f : α × β →₀ M
x : α
y : β
this : ∀ (b : α × β), ↑(↑(single b.fst (single b.snd (↑f b))) x) y = if b = (x, y) then ↑f b else 0
b : α × β
a✝ : b ∈ f.support
b_ne : b ≠ (x, y)
⊢ ↑(↑(single b.fst (single b.snd (↑f b))) x) y = 0

tactic: intro hxy
state_before: case h₁
α : Type u_2
β : Type u_1
γ : Type ?u.528340
ι : Type ?u.528343
M : Type u_3
M' : Type ?u.528349
N : Type ?u.528352
P : Type ?u.528355
G : Type ?u.528358
H : Type ?u.528361
R : Type ?u.528364
S : Type ?u.528367
inst✝¹ : AddCommMonoid M
inst✝ : AddCommMonoid N
f : α × β →₀ M
x : α
y : β
this : ∀ (b : α × β), ↑(↑(single b.fst (single b.snd (↑f b))) x) y = if b = (x, y) then ↑f b else 0
⊢ ¬(x, y) ∈ f.support → ↑(↑(single (x, y).fst (single (x, y).snd (↑f (x, y)))) x) y = 0

tactic: rw [this (x, y), if_pos rfl, not_mem_support_iff.mp hxy]
state_before: case h₁
α : Type u_2
β : Type u_1
γ : Type ?u.528340
ι : Type ?u.528343
M : Type u_3
M' : Type ?u.528349
N : Type ?u.528352
P : Type ?u.528355
G : Type ?u.528358
H : Type ?u.528361
R : Type ?u.528364
S : Type ?u.528367
inst✝¹ : AddCommMonoid M
inst✝ : AddCommMonoid N
f : α × β →₀ M
x : α
y : β
this : ∀ (b : α × β), ↑(↑(single b.fst (single b.snd (↑f b))) x) y = if b = (x, y) then ↑f b else 0
hxy : ¬(x, y) ∈ f.support
⊢ ↑(↑(single (x, y).fst (single (x, y).snd (↑f (x, y)))) x) y = 0