Theorem: hasStrictFDerivAt_list_prod
File: Mathlib/Analysis/Calculus/FDeriv/Mul.lean

Proof steps:
state_before: 𝕜 : Type u_1
inst✝¹⁴ : NontriviallyNormedField 𝕜
E : Type u_2
inst✝¹³ : NormedAddCommGroup E
inst✝¹² : NormedSpace 𝕜 E
F : Type u_3
inst✝¹¹ : NormedAddCommGroup F
inst✝¹⁰ : NormedSpace 𝕜 F
G : Type u_4
inst✝⁹ : NormedAddCommGroup G
inst✝⁸ : NormedSpace 𝕜 G
G' : Type u_5
inst✝⁷ : NormedAddCommGroup G'
inst✝⁶ : NormedSpace 𝕜 G'
f✝ f₀ f₁ g✝ : E → F
f'✝ f₀' f₁' g'✝ e : E →L[𝕜] F
x✝ : E
s t : Set E
L L₁ L₂ : Filter E
ι : Type u_6
𝔸 : Type u_7
𝔸' : Type u_8
inst✝⁵ : NormedRing 𝔸
inst✝⁴ : NormedCommRing 𝔸'
inst✝³ : NormedAlgebra 𝕜 𝔸
inst✝² : NormedAlgebra 𝕜 𝔸'
u : Finset ι
f : ι → E → 𝔸
f' : ι → E →L[𝕜] 𝔸
g : ι → E → 𝔸'
g' : ι → E →L[𝕜] 𝔸'
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
l : List ι
x : ι → 𝔸'
⊢ HasStrictFDerivAt (fun x => (List.map x l).prod) (List.map (fun i => (List.map x (l.erase i)).prod • proj i) l).sum x
state_after: 𝕜 : Type u_1
inst✝¹⁴ : NontriviallyNormedField 𝕜
E : Type u_2
inst✝¹³ : NormedAddCommGroup E
inst✝¹² : NormedSpace 𝕜 E
F : Type u_3
inst✝¹¹ : NormedAddCommGroup F
inst✝¹⁰ : NormedSpace 𝕜 F
G : Type u_4
inst✝⁹ : NormedAddCommGroup G
inst✝⁸ : NormedSpace 𝕜 G
G' : Type u_5
inst✝⁷ : NormedAddCommGroup G'
inst✝⁶ : NormedSpace 𝕜 G'
f✝ f₀ f₁ g✝ : E → F
f'✝ f₀' f₁' g'✝ e : E →L[𝕜] F
x✝ : E
s t : Set E
L L₁ L₂ : Filter E
ι : Type u_6
𝔸 : Type u_7
𝔸' : Type u_8
inst✝⁵ : NormedRing 𝔸
inst✝⁴ : NormedCommRing 𝔸'
inst✝³ : NormedAlgebra 𝕜 𝔸
inst✝² : NormedAlgebra 𝕜 𝔸'
u : Finset ι
f : ι → E → 𝔸
f' : ι → E →L[𝕜] 𝔸
g : ι → E → 𝔸'
g' : ι → E →L[𝕜] 𝔸'
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
l : List ι
x : ι → 𝔸'
⊢ ∑ i : Fin l.length,
      (List.map x (List.take (↑i) l)).prod • (proj (l.get i)).smulRight (List.map x (List.drop (↑i).succ l)).prod =
    (List.map (fun i => (List.map x (l.erase i)).prod • proj i) l).sum
tactic: refine .congr_fderiv hasStrictFDerivAt_list_prod' ?_
state_before: 𝕜 : Type u_1
inst✝¹⁴ : NontriviallyNormedField 𝕜
E : Type u_2
inst✝¹³ : NormedAddCommGroup E
inst✝¹² : NormedSpace 𝕜 E
F : Type u_3
inst✝¹¹ : NormedAddCommGroup F
inst✝¹⁰ : NormedSpace 𝕜 F
G : Type u_4
inst✝⁹ : NormedAddCommGroup G
inst✝⁸ : NormedSpace 𝕜 G
G' : Type u_5
inst✝⁷ : NormedAddCommGroup G'
inst✝⁶ : NormedSpace 𝕜 G'
f✝ f₀ f₁ g✝ : E → F
f'✝ f₀' f₁' g'✝ e : E →L[𝕜] F
x✝ : E
s t : Set E
L L₁ L₂ : Filter E
ι : Type u_6
𝔸 : Type u_7
𝔸' : Type u_8
inst✝⁵ : NormedRing 𝔸
inst✝⁴ : NormedCommRing 𝔸'
inst✝³ : NormedAlgebra 𝕜 𝔸
inst✝² : NormedAlgebra 𝕜 𝔸'
u : Finset ι
f : ι → E → 𝔸
f' : ι → E →L[𝕜] 𝔸
g : ι → E → 𝔸'
g' : ι → E →L[𝕜] 𝔸'
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
l : List ι
x : ι → 𝔸'
⊢ ∑ i : Fin l.length,
      (List.map x (List.take (↑i) l)).prod • (proj (l.get i)).smulRight (List.map x (List.drop (↑i).succ l)).prod =
    (List.map (fun i => (List.map x (l.erase i)).prod • proj i) l).sum
state_after: 𝕜 : Type u_1
inst✝¹⁴ : NontriviallyNormedField 𝕜
E : Type u_2
inst✝¹³ : NormedAddCommGroup E
inst✝¹² : NormedSpace 𝕜 E
F : Type u_3
inst✝¹¹ : NormedAddCommGroup F
inst✝¹⁰ : NormedSpace 𝕜 F
G : Type u_4
inst✝⁹ : NormedAddCommGroup G
inst✝⁸ : NormedSpace 𝕜 G
G' : Type u_5
inst✝⁷ : NormedAddCommGroup G'
inst✝⁶ : NormedSpace 𝕜 G'
f✝ f₀ f₁ g✝ : E → F
f'✝ f₀' f₁' g'✝ e : E →L[𝕜] F
x✝ : E
s t : Set E
L L₁ L₂ : Filter E
ι : Type u_6
𝔸 : Type u_7
𝔸' : Type u_8
inst✝⁵ : NormedRing 𝔸
inst✝⁴ : NormedCommRing 𝔸'
inst✝³ : NormedAlgebra 𝕜 𝔸
inst✝² : NormedAlgebra 𝕜 𝔸'
u : Finset ι
f : ι → E → 𝔸
f' : ι → E →L[𝕜] 𝔸
g : ι → E → 𝔸'
g' : ι → E →L[𝕜] 𝔸'
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
l : List ι
x : ι → 𝔸'
⊢ ∑ i : Fin l.length,
      (List.map x (List.take (↑i) l)).prod • (proj (l.get i)).smulRight (List.map x (List.drop (↑i).succ l)).prod =
    (List.map (fun i => (List.map x (l.erase i)).prod • proj i) (List.map l.get (List.finRange l.length))).sum
tactic: conv_rhs => arg 1; arg 2; rw [← List.finRange_map_get l]
state_before: 𝕜 : Type u_1
inst✝¹⁴ : NontriviallyNormedField 𝕜
E : Type u_2
inst✝¹³ : NormedAddCommGroup E
inst✝¹² : NormedSpace 𝕜 E
F : Type u_3
inst✝¹¹ : NormedAddCommGroup F
inst✝¹⁰ : NormedSpace 𝕜 F
G : Type u_4
inst✝⁹ : NormedAddCommGroup G
inst✝⁸ : NormedSpace 𝕜 G
G' : Type u_5
inst✝⁷ : NormedAddCommGroup G'
inst✝⁶ : NormedSpace 𝕜 G'
f✝ f₀ f₁ g✝ : E → F
f'✝ f₀' f₁' g'✝ e : E →L[𝕜] F
x✝ : E
s t : Set E
L L₁ L₂ : Filter E
ι : Type u_6
𝔸 : Type u_7
𝔸' : Type u_8
inst✝⁵ : NormedRing 𝔸
inst✝⁴ : NormedCommRing 𝔸'
inst✝³ : NormedAlgebra 𝕜 𝔸
inst✝² : NormedAlgebra 𝕜 𝔸'
u : Finset ι
f : ι → E → 𝔸
f' : ι → E →L[𝕜] 𝔸
g : ι → E → 𝔸'
g' : ι → E →L[𝕜] 𝔸'
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
l : List ι
x : ι → 𝔸'
⊢ ∑ i : Fin l.length,
      (List.map x (List.take (↑i) l)).prod • (proj (l.get i)).smulRight (List.map x (List.drop (↑i).succ l)).prod =
    (List.map (fun i => (List.map x (l.erase i)).prod • proj i) (List.map l.get (List.finRange l.length))).sum
state_after: 𝕜 : Type u_1
inst✝¹⁴ : NontriviallyNormedField 𝕜
E : Type u_2
inst✝¹³ : NormedAddCommGroup E
inst✝¹² : NormedSpace 𝕜 E
F : Type u_3
inst✝¹¹ : NormedAddCommGroup F
inst✝¹⁰ : NormedSpace 𝕜 F
G : Type u_4
inst✝⁹ : NormedAddCommGroup G
inst✝⁸ : NormedSpace 𝕜 G
G' : Type u_5
inst✝⁷ : NormedAddCommGroup G'
inst✝⁶ : NormedSpace 𝕜 G'
f✝ f₀ f₁ g✝ : E → F
f'✝ f₀' f₁' g'✝ e : E →L[𝕜] F
x✝ : E
s t : Set E
L L₁ L₂ : Filter E
ι : Type u_6
𝔸 : Type u_7
𝔸' : Type u_8
inst✝⁵ : NormedRing 𝔸
inst✝⁴ : NormedCommRing 𝔸'
inst✝³ : NormedAlgebra 𝕜 𝔸
inst✝² : NormedAlgebra 𝕜 𝔸'
u : Finset ι
f : ι → E → 𝔸
f' : ι → E →L[𝕜] 𝔸
g : ι → E → 𝔸'
g' : ι → E →L[𝕜] 𝔸'
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
l : List ι
x : ι → 𝔸'
⊢ ∑ i : Fin l.length,
      (List.map x (List.take (↑i) l)).prod • (proj (l.get i)).smulRight (List.map x (List.drop (↑i).succ l)).prod =
    ∑ x_1 : Fin l.length,
      ((List.map x (List.take (↑x_1) l)).prod * (List.map x (List.drop (↑x_1 + 1) l)).prod) • proj (l.get x_1)
tactic: simp only [List.map_map, ← List.sum_toFinset _ (List.nodup_finRange _), List.toFinset_finRange,
    Function.comp_def, ((List.erase_get _).map _).prod_eq, List.eraseIdx_eq_take_drop_succ,
    List.map_append, List.prod_append]
state_before: 𝕜 : Type u_1
inst✝¹⁴ : NontriviallyNormedField 𝕜
E : Type u_2
inst✝¹³ : NormedAddCommGroup E
inst✝¹² : NormedSpace 𝕜 E
F : Type u_3
inst✝¹¹ : NormedAddCommGroup F
inst✝¹⁰ : NormedSpace 𝕜 F
G : Type u_4
inst✝⁹ : NormedAddCommGroup G
inst✝⁸ : NormedSpace 𝕜 G
G' : Type u_5
inst✝⁷ : NormedAddCommGroup G'
inst✝⁶ : NormedSpace 𝕜 G'
f✝ f₀ f₁ g✝ : E → F
f'✝ f₀' f₁' g'✝ e : E →L[𝕜] F
x✝ : E
s t : Set E
L L₁ L₂ : Filter E
ι : Type u_6
𝔸 : Type u_7
𝔸' : Type u_8
inst✝⁵ : NormedRing 𝔸
inst✝⁴ : NormedCommRing 𝔸'
inst✝³ : NormedAlgebra 𝕜 𝔸
inst✝² : NormedAlgebra 𝕜 𝔸'
u : Finset ι
f : ι → E → 𝔸
f' : ι → E →L[𝕜] 𝔸
g : ι → E → 𝔸'
g' : ι → E →L[𝕜] 𝔸'
inst✝¹ : DecidableEq ι
inst✝ : Fintype ι
l : List ι
x : ι → 𝔸'
⊢ ∑ i : Fin l.length,
      (List.map x (List.take (↑i) l)).prod • (proj (l.get i)).smulRight (List.map x (List.drop (↑i).succ l)).prod =
    ∑ x_1 : Fin l.length,
      ((List.map x (List.take (↑x_1) l)).prod * (List.map x (List.drop (↑x_1 + 1) l)).prod) • proj (l.get x_1)
state_after: no goals
tactic: exact Finset.sum_congr rfl fun i _ ↦ by
    ext; simp only [smul_apply, smulRight_apply, smul_eq_mul]; ring