Theorem: Finset.sum_powerset_apply_card
File: Mathlib/Data/Nat/Choose/Sum.lean

tactic: trans ∑ m ∈ range (x.card + 1), ∑ j ∈ x.powerset.filter fun z ↦ z.card = m, f j.card
state_before: R : Type u_1
α : Type u_2
β : Type u_3
inst✝ : AddCommMonoid α
f : ℕ → α
x : Finset β
⊢ ∑ m ∈ x.powerset, f m.card = ∑ m ∈ range (x.card + 1), x.card.choose m • f m
state_after: R : Type u_1
α : Type u_2
β : Type u_3
inst✝ : AddCommMonoid α
f : ℕ → α
x : Finset β
⊢ ∑ m ∈ x.powerset, f m.card = ∑ m ∈ range (x.card + 1), ∑ j ∈ filter (fun z => z.card = m) x.powerset, f j.card

R : Type u_1
α : Type u_2
β : Type u_3
inst✝ : AddCommMonoid α
f : ℕ → α
x : Finset β
⊢ ∑ m ∈ range (x.card + 1), ∑ j ∈ filter (fun z => z.card = m) x.powerset, f j.card =
    ∑ m ∈ range (x.card + 1), x.card.choose m • f m

tactic: refine (sum_fiberwise_of_maps_to ?_ _).symm
state_before: R : Type u_1
α : Type u_2
β : Type u_3
inst✝ : AddCommMonoid α
f : ℕ → α
x : Finset β
⊢ ∑ m ∈ x.powerset, f m.card = ∑ m ∈ range (x.card + 1), ∑ j ∈ filter (fun z => z.card = m) x.powerset, f j.card
state_after: R : Type u_1
α : Type u_2
β : Type u_3
inst✝ : AddCommMonoid α
f : ℕ → α
x : Finset β
⊢ ∀ i ∈ x.powerset, i.card ∈ range (x.card + 1)

tactic: intro y hy
state_before: R : Type u_1
α : Type u_2
β : Type u_3
inst✝ : AddCommMonoid α
f : ℕ → α
x : Finset β
⊢ ∀ i ∈ x.powerset, i.card ∈ range (x.card + 1)
state_after: R : Type u_1
α : Type u_2
β : Type u_3
inst✝ : AddCommMonoid α
f : ℕ → α
x y : Finset β
hy : y ∈ x.powerset
⊢ y.card ∈ range (x.card + 1)

tactic: rw [mem_range, Nat.lt_succ_iff]
state_before: R : Type u_1
α : Type u_2
β : Type u_3
inst✝ : AddCommMonoid α
f : ℕ → α
x y : Finset β
hy : y ∈ x.powerset
⊢ y.card ∈ range (x.card + 1)
state_after: R : Type u_1
α : Type u_2
β : Type u_3
inst✝ : AddCommMonoid α
f : ℕ → α
x y : Finset β
hy : y ∈ x.powerset
⊢ y.card ≤ x.card

tactic: rw [mem_powerset] at hy
state_before: R : Type u_1
α : Type u_2
β : Type u_3
inst✝ : AddCommMonoid α
f : ℕ → α
x y : Finset β
hy : y ∈ x.powerset
⊢ y.card ≤ x.card
state_after: R : Type u_1
α : Type u_2
β : Type u_3
inst✝ : AddCommMonoid α
f : ℕ → α
x y : Finset β
hy : y ⊆ x
⊢ y.card ≤ x.card

tactic: exact card_le_card hy
state_before: R : Type u_1
α : Type u_2
β : Type u_3
inst✝ : AddCommMonoid α
f : ℕ → α
x y : Finset β
hy : y ⊆ x
⊢ y.card ≤ x.card
state_after: no goals

tactic: refine sum_congr rfl fun y _ ↦ ?_
state_before: R : Type u_1
α : Type u_2
β : Type u_3
inst✝ : AddCommMonoid α
f : ℕ → α
x : Finset β
⊢ ∑ m ∈ range (x.card + 1), ∑ j ∈ filter (fun z => z.card = m) x.powerset, f j.card =
    ∑ m ∈ range (x.card + 1), x.card.choose m • f m
state_after: R : Type u_1
α : Type u_2
β : Type u_3
inst✝ : AddCommMonoid α
f : ℕ → α
x : Finset β
y : ℕ
x✝ : y ∈ range (x.card + 1)
⊢ ∑ j ∈ filter (fun z => z.card = y) x.powerset, f j.card = x.card.choose y • f y

tactic: rw [← card_powersetCard, ← sum_const]
state_before: R : Type u_1
α : Type u_2
β : Type u_3
inst✝ : AddCommMonoid α
f : ℕ → α
x : Finset β
y : ℕ
x✝ : y ∈ range (x.card + 1)
⊢ ∑ j ∈ filter (fun z => z.card = y) x.powerset, f j.card = x.card.choose y • f y
state_after: R : Type u_1
α : Type u_2
β : Type u_3
inst✝ : AddCommMonoid α
f : ℕ → α
x : Finset β
y : ℕ
x✝ : y ∈ range (x.card + 1)
⊢ ∑ j ∈ filter (fun z => z.card = y) x.powerset, f j.card = ∑ _x ∈ powersetCard y x, f y

tactic: refine sum_congr powersetCard_eq_filter.symm fun z hz ↦ ?_
state_before: R : Type u_1
α : Type u_2
β : Type u_3
inst✝ : AddCommMonoid α
f : ℕ → α
x : Finset β
y : ℕ
x✝ : y ∈ range (x.card + 1)
⊢ ∑ j ∈ filter (fun z => z.card = y) x.powerset, f j.card = ∑ _x ∈ powersetCard y x, f y
state_after: R : Type u_1
α : Type u_2
β : Type u_3
inst✝ : AddCommMonoid α
f : ℕ → α
x : Finset β
y : ℕ
x✝ : y ∈ range (x.card + 1)
z : Finset β
hz : z ∈ powersetCard y x
⊢ f z.card = f y

tactic: rw [(mem_powersetCard.1 hz).2]
state_before: R : Type u_1
α : Type u_2
β : Type u_3
inst✝ : AddCommMonoid α
f : ℕ → α
x : Finset β
y : ℕ
x✝ : y ∈ range (x.card + 1)
z : Finset β
hz : z ∈ powersetCard y x
⊢ f z.card = f y
state_after: no goals