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

tactic: rw [Finsupp.curry, Finsupp.curry, Finsupp.sum, Finsupp.sum, filter_sum, support_filter,
  sum_filter]
state_before: α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝² : AddCommMonoid M
inst✝¹ : AddCommMonoid N
f : α × β →₀ M
p : α → Prop
inst✝ : DecidablePred p
⊢ (filter (fun a => p a.1) f).curry = filter p f.curry
state_after: α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝² : AddCommMonoid M
inst✝¹ : AddCommMonoid N
f : α × β →₀ M
p : α → Prop
inst✝ : DecidablePred p
⊢ (∑ a ∈ f.support, if p a.1 then single a.1 (single a.2 ((filter (fun a => p a.1) f) a)) else 0) =
    ∑ a ∈ f.support, filter p (single a.1 (single a.2 (f a)))

tactic: refine Finset.sum_congr rfl ?_
state_before: α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝² : AddCommMonoid M
inst✝¹ : AddCommMonoid N
f : α × β →₀ M
p : α → Prop
inst✝ : DecidablePred p
⊢ (∑ a ∈ f.support, if p a.1 then single a.1 (single a.2 ((filter (fun a => p a.1) f) a)) else 0) =
    ∑ a ∈ f.support, filter p (single a.1 (single a.2 (f a)))
state_after: α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝² : AddCommMonoid M
inst✝¹ : AddCommMonoid N
f : α × β →₀ M
p : α → Prop
inst✝ : DecidablePred p
⊢ ∀ x ∈ f.support,
    (if p x.1 then single x.1 (single x.2 ((filter (fun a => p a.1) f) x)) else 0) =
      filter p (single x.1 (single x.2 (f x)))

tactic: rintro ⟨a₁, a₂⟩ _
state_before: α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝² : AddCommMonoid M
inst✝¹ : AddCommMonoid N
f : α × β →₀ M
p : α → Prop
inst✝ : DecidablePred p
⊢ ∀ x ∈ f.support,
    (if p x.1 then single x.1 (single x.2 ((filter (fun a => p a.1) f) x)) else 0) =
      filter p (single x.1 (single x.2 (f x)))
state_after: case mk
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝² : AddCommMonoid M
inst✝¹ : AddCommMonoid N
f : α × β →₀ M
p : α → Prop
inst✝ : DecidablePred p
a₁ : α
a₂ : β
a✝ : (a₁, a₂) ∈ f.support
⊢ (if p (a₁, a₂).1 then single (a₁, a₂).1 (single (a₁, a₂).2 ((filter (fun a => p a.1) f) (a₁, a₂))) else 0) =
    filter p (single (a₁, a₂).1 (single (a₁, a₂).2 (f (a₁, a₂))))

tactic: split_ifs with h
state_before: case mk
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝² : AddCommMonoid M
inst✝¹ : AddCommMonoid N
f : α × β →₀ M
p : α → Prop
inst✝ : DecidablePred p
a₁ : α
a₂ : β
a✝ : (a₁, a₂) ∈ f.support
⊢ (if p (a₁, a₂).1 then single (a₁, a₂).1 (single (a₁, a₂).2 ((filter (fun a => p a.1) f) (a₁, a₂))) else 0) =
    filter p (single (a₁, a₂).1 (single (a₁, a₂).2 (f (a₁, a₂))))
state_after: case pos
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝² : AddCommMonoid M
inst✝¹ : AddCommMonoid N
f : α × β →₀ M
p : α → Prop
inst✝ : DecidablePred p
a₁ : α
a₂ : β
a✝ : (a₁, a₂) ∈ f.support
h : p (a₁, a₂).1
⊢ single (a₁, a₂).1 (single (a₁, a₂).2 ((filter (fun a => p a.1) f) (a₁, a₂))) =
    filter p (single (a₁, a₂).1 (single (a₁, a₂).2 (f (a₁, a₂))))

case neg
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝² : AddCommMonoid M
inst✝¹ : AddCommMonoid N
f : α × β →₀ M
p : α → Prop
inst✝ : DecidablePred p
a₁ : α
a₂ : β
a✝ : (a₁, a₂) ∈ f.support
h : ¬p (a₁, a₂).1
⊢ 0 = filter p (single (a₁, a₂).1 (single (a₁, a₂).2 (f (a₁, a₂))))

tactic: rw [filter_apply_pos, filter_single_of_pos] <;> exact h
state_before: case pos
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝² : AddCommMonoid M
inst✝¹ : AddCommMonoid N
f : α × β →₀ M
p : α → Prop
inst✝ : DecidablePred p
a₁ : α
a₂ : β
a✝ : (a₁, a₂) ∈ f.support
h : p (a₁, a₂).1
⊢ single (a₁, a₂).1 (single (a₁, a₂).2 ((filter (fun a => p a.1) f) (a₁, a₂))) =
    filter p (single (a₁, a₂).1 (single (a₁, a₂).2 (f (a₁, a₂))))
state_after: no goals

tactic: rwa [filter_single_of_neg]
state_before: case neg
α : Type u_1
β : Type u_2
γ : Type u_3
ι : Type u_4
M : Type u_5
M' : Type u_6
N : Type u_7
P : Type u_8
G : Type u_9
H : Type u_10
R : Type u_11
S : Type u_12
inst✝² : AddCommMonoid M
inst✝¹ : AddCommMonoid N
f : α × β →₀ M
p : α → Prop
inst✝ : DecidablePred p
a₁ : α
a₂ : β
a✝ : (a₁, a₂) ∈ f.support
h : ¬p (a₁, a₂).1
⊢ 0 = filter p (single (a₁, a₂).1 (single (a₁, a₂).2 (f (a₁, a₂))))
state_after: no goals