Theorem: BumpCovering.sum_toPOUFun_eq
File: Mathlib/Topology/PartitionOfUnity.lean

tactic: set s := (f.point_finite x).toFinset
state_before: ι : Type u
X : Type v
inst✝ : TopologicalSpace X
s : Set X
f : BumpCovering ι X s
x : X
⊢ ∑ᶠ (i : ι), f.toPOUFun i x = 1 - ∏ᶠ (i : ι), (1 - (f i) x)
state_after: ι : Type u
X : Type v
inst✝ : TopologicalSpace X
s✝ : Set X
f : BumpCovering ι X s✝
x : X
s : Finset ι := ⋯.toFinset
⊢ ∑ᶠ (i : ι), f.toPOUFun i x = 1 - ∏ᶠ (i : ι), (1 - (f i) x)

tactic: have hs : (s : Set ι) = { i | f i x ≠ 0 } := Finite.coe_toFinset _
state_before: ι : Type u
X : Type v
inst✝ : TopologicalSpace X
s✝ : Set X
f : BumpCovering ι X s✝
x : X
s : Finset ι := ⋯.toFinset
⊢ ∑ᶠ (i : ι), f.toPOUFun i x = 1 - ∏ᶠ (i : ι), (1 - (f i) x)
state_after: ι : Type u
X : Type v
inst✝ : TopologicalSpace X
s✝ : Set X
f : BumpCovering ι X s✝
x : X
s : Finset ι := ⋯.toFinset
hs : ↑s = {i | (f i) x ≠ 0}
⊢ ∑ᶠ (i : ι), f.toPOUFun i x = 1 - ∏ᶠ (i : ι), (1 - (f i) x)

tactic: have A : (support fun i => toPOUFun f i x) ⊆ s := by
  rw [hs]
  exact fun i hi => f.support_toPOUFun_subset i hi
state_before: ι : Type u
X : Type v
inst✝ : TopologicalSpace X
s✝ : Set X
f : BumpCovering ι X s✝
x : X
s : Finset ι := ⋯.toFinset
hs : ↑s = {i | (f i) x ≠ 0}
⊢ ∑ᶠ (i : ι), f.toPOUFun i x = 1 - ∏ᶠ (i : ι), (1 - (f i) x)
state_after: ι : Type u
X : Type v
inst✝ : TopologicalSpace X
s✝ : Set X
f : BumpCovering ι X s✝
x : X
s : Finset ι := ⋯.toFinset
hs : ↑s = {i | (f i) x ≠ 0}
A : (support fun i => f.toPOUFun i x) ⊆ ↑s
⊢ ∑ᶠ (i : ι), f.toPOUFun i x = 1 - ∏ᶠ (i : ι), (1 - (f i) x)

tactic: have B : (mulSupport fun i => 1 - f i x) ⊆ s := by
  rw [hs, mulSupport_one_sub]
  exact fun i => id
state_before: ι : Type u
X : Type v
inst✝ : TopologicalSpace X
s✝ : Set X
f : BumpCovering ι X s✝
x : X
s : Finset ι := ⋯.toFinset
hs : ↑s = {i | (f i) x ≠ 0}
A : (support fun i => f.toPOUFun i x) ⊆ ↑s
⊢ ∑ᶠ (i : ι), f.toPOUFun i x = 1 - ∏ᶠ (i : ι), (1 - (f i) x)
state_after: ι : Type u
X : Type v
inst✝ : TopologicalSpace X
s✝ : Set X
f : BumpCovering ι X s✝
x : X
s : Finset ι := ⋯.toFinset
hs : ↑s = {i | (f i) x ≠ 0}
A : (support fun i => f.toPOUFun i x) ⊆ ↑s
B : (mulSupport fun i => 1 - (f i) x) ⊆ ↑s
⊢ ∑ᶠ (i : ι), f.toPOUFun i x = 1 - ∏ᶠ (i : ι), (1 - (f i) x)

tactic: letI : LinearOrder ι := linearOrderOfSTO WellOrderingRel
state_before: ι : Type u
X : Type v
inst✝ : TopologicalSpace X
s✝ : Set X
f : BumpCovering ι X s✝
x : X
s : Finset ι := ⋯.toFinset
hs : ↑s = {i | (f i) x ≠ 0}
A : (support fun i => f.toPOUFun i x) ⊆ ↑s
B : (mulSupport fun i => 1 - (f i) x) ⊆ ↑s
⊢ ∑ᶠ (i : ι), f.toPOUFun i x = 1 - ∏ᶠ (i : ι), (1 - (f i) x)
state_after: ι : Type u
X : Type v
inst✝ : TopologicalSpace X
s✝ : Set X
f : BumpCovering ι X s✝
x : X
s : Finset ι := ⋯.toFinset
hs : ↑s = {i | (f i) x ≠ 0}
A : (support fun i => f.toPOUFun i x) ⊆ ↑s
B : (mulSupport fun i => 1 - (f i) x) ⊆ ↑s
this : LinearOrder ι := linearOrderOfSTO WellOrderingRel
⊢ ∑ᶠ (i : ι), f.toPOUFun i x = 1 - ∏ᶠ (i : ι), (1 - (f i) x)

tactic: rw [finsum_eq_sum_of_support_subset _ A, finprod_eq_prod_of_mulSupport_subset _ B,
  Finset.prod_one_sub_ordered, sub_sub_cancel]
state_before: ι : Type u
X : Type v
inst✝ : TopologicalSpace X
s✝ : Set X
f : BumpCovering ι X s✝
x : X
s : Finset ι := ⋯.toFinset
hs : ↑s = {i | (f i) x ≠ 0}
A : (support fun i => f.toPOUFun i x) ⊆ ↑s
B : (mulSupport fun i => 1 - (f i) x) ⊆ ↑s
this : LinearOrder ι := linearOrderOfSTO WellOrderingRel
⊢ ∑ᶠ (i : ι), f.toPOUFun i x = 1 - ∏ᶠ (i : ι), (1 - (f i) x)
state_after: ι : Type u
X : Type v
inst✝ : TopologicalSpace X
s✝ : Set X
f : BumpCovering ι X s✝
x : X
s : Finset ι := ⋯.toFinset
hs : ↑s = {i | (f i) x ≠ 0}
A : (support fun i => f.toPOUFun i x) ⊆ ↑s
B : (mulSupport fun i => 1 - (f i) x) ⊆ ↑s
this : LinearOrder ι := linearOrderOfSTO WellOrderingRel
⊢ ∑ i ∈ s, f.toPOUFun i x = ∑ i ∈ s, (f i) x * ∏ j ∈ Finset.filter (fun x => x < i) s, (1 - (f j) x)

tactic: refine Finset.sum_congr rfl fun i _ => ?_
state_before: ι : Type u
X : Type v
inst✝ : TopologicalSpace X
s✝ : Set X
f : BumpCovering ι X s✝
x : X
s : Finset ι := ⋯.toFinset
hs : ↑s = {i | (f i) x ≠ 0}
A : (support fun i => f.toPOUFun i x) ⊆ ↑s
B : (mulSupport fun i => 1 - (f i) x) ⊆ ↑s
this : LinearOrder ι := linearOrderOfSTO WellOrderingRel
⊢ ∑ i ∈ s, f.toPOUFun i x = ∑ i ∈ s, (f i) x * ∏ j ∈ Finset.filter (fun x => x < i) s, (1 - (f j) x)
state_after: ι : Type u
X : Type v
inst✝ : TopologicalSpace X
s✝ : Set X
f : BumpCovering ι X s✝
x : X
s : Finset ι := ⋯.toFinset
hs : ↑s = {i | (f i) x ≠ 0}
A : (support fun i => f.toPOUFun i x) ⊆ ↑s
B : (mulSupport fun i => 1 - (f i) x) ⊆ ↑s
this : LinearOrder ι := linearOrderOfSTO WellOrderingRel
i : ι
x✝ : i ∈ s
⊢ f.toPOUFun i x = (f i) x * ∏ j ∈ Finset.filter (fun x => x < i) s, (1 - (f j) x)

tactic: convert f.toPOUFun_eq_mul_prod _ _ _ fun j _ hj => _
state_before: ι : Type u
X : Type v
inst✝ : TopologicalSpace X
s✝ : Set X
f : BumpCovering ι X s✝
x : X
s : Finset ι := ⋯.toFinset
hs : ↑s = {i | (f i) x ≠ 0}
A : (support fun i => f.toPOUFun i x) ⊆ ↑s
B : (mulSupport fun i => 1 - (f i) x) ⊆ ↑s
this : LinearOrder ι := linearOrderOfSTO WellOrderingRel
i : ι
x✝ : i ∈ s
⊢ f.toPOUFun i x = (f i) x * ∏ j ∈ Finset.filter (fun x => x < i) s, (1 - (f j) x)
state_after: case convert_4
ι : Type u
X : Type v
inst✝ : TopologicalSpace X
s✝ : Set X
f : BumpCovering ι X s✝
x : X
s : Finset ι := ⋯.toFinset
hs : ↑s = {i | (f i) x ≠ 0}
A : (support fun i => f.toPOUFun i x) ⊆ ↑s
B : (mulSupport fun i => 1 - (f i) x) ⊆ ↑s
this : LinearOrder ι := linearOrderOfSTO WellOrderingRel
i : ι
x✝¹ : i ∈ s
j : ι
x✝ : WellOrderingRel j i
hj : (f j) x ≠ 0
⊢ j ∈ s

tactic: rwa [Finite.mem_toFinset]
state_before: case convert_4
ι : Type u
X : Type v
inst✝ : TopologicalSpace X
s✝ : Set X
f : BumpCovering ι X s✝
x : X
s : Finset ι := ⋯.toFinset
hs : ↑s = {i | (f i) x ≠ 0}
A : (support fun i => f.toPOUFun i x) ⊆ ↑s
B : (mulSupport fun i => 1 - (f i) x) ⊆ ↑s
this : LinearOrder ι := linearOrderOfSTO WellOrderingRel
i : ι
x✝¹ : i ∈ s
j : ι
x✝ : WellOrderingRel j i
hj : (f j) x ≠ 0
⊢ j ∈ s
state_after: no goals

tactic: rw [hs]
state_before: ι : Type u
X : Type v
inst✝ : TopologicalSpace X
s✝ : Set X
f : BumpCovering ι X s✝
x : X
s : Finset ι := ⋯.toFinset
hs : ↑s = {i | (f i) x ≠ 0}
⊢ (support fun i => f.toPOUFun i x) ⊆ ↑s
state_after: ι : Type u
X : Type v
inst✝ : TopologicalSpace X
s✝ : Set X
f : BumpCovering ι X s✝
x : X
s : Finset ι := ⋯.toFinset
hs : ↑s = {i | (f i) x ≠ 0}
⊢ (support fun i => f.toPOUFun i x) ⊆ {i | (f i) x ≠ 0}

tactic: exact fun i hi => f.support_toPOUFun_subset i hi
state_before: ι : Type u
X : Type v
inst✝ : TopologicalSpace X
s✝ : Set X
f : BumpCovering ι X s✝
x : X
s : Finset ι := ⋯.toFinset
hs : ↑s = {i | (f i) x ≠ 0}
⊢ (support fun i => f.toPOUFun i x) ⊆ {i | (f i) x ≠ 0}
state_after: no goals

tactic: rw [hs, mulSupport_one_sub]
state_before: ι : Type u
X : Type v
inst✝ : TopologicalSpace X
s✝ : Set X
f : BumpCovering ι X s✝
x : X
s : Finset ι := ⋯.toFinset
hs : ↑s = {i | (f i) x ≠ 0}
A : (support fun i => f.toPOUFun i x) ⊆ ↑s
⊢ (mulSupport fun i => 1 - (f i) x) ⊆ ↑s
state_after: ι : Type u
X : Type v
inst✝ : TopologicalSpace X
s✝ : Set X
f : BumpCovering ι X s✝
x : X
s : Finset ι := ⋯.toFinset
hs : ↑s = {i | (f i) x ≠ 0}
A : (support fun i => f.toPOUFun i x) ⊆ ↑s
⊢ (support fun i => (f i) x) ⊆ {i | (f i) x ≠ 0}

tactic: exact fun i => id
state_before: ι : Type u
X : Type v
inst✝ : TopologicalSpace X
s✝ : Set X
f : BumpCovering ι X s✝
x : X
s : Finset ι := ⋯.toFinset
hs : ↑s = {i | (f i) x ≠ 0}
A : (support fun i => f.toPOUFun i x) ⊆ ↑s
⊢ (support fun i => (f i) x) ⊆ {i | (f i) x ≠ 0}
state_after: no goals