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

tactic: induction l with
| nil => simp [hasStrictFDerivAt_const]
| cons a l IH =>
  simp only [List.map_cons, List.prod_cons, ← proj_apply (R := 𝕜) (φ := fun _ : ι ↦ 𝔸) a]
  exact .congr_fderiv (.mul' (ContinuousLinearMap.hasStrictFDerivAt _) IH)
    (by ext; simp [Fin.sum_univ_succ, Finset.mul_sum, mul_assoc, add_comm])
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✝ : Fintype ι
l : List ι
x : ι → 𝔸
⊢ HasStrictFDerivAt (fun x => (List.map x l).prod)
    (∑ 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
state_after: no goals

tactic: simp [hasStrictFDerivAt_const]
state_before: case nil
𝕜 : 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✝ : Fintype ι
x : ι → 𝔸
⊢ HasStrictFDerivAt (fun x => (List.map x []).prod)
    (∑ i : Fin [].length,
      (List.map x (List.take ↑i [])).prod • (proj ([].get i)).smulRight (List.map x (List.drop (↑i).succ [])).prod)
    x
state_after: no goals

tactic: simp only [List.map_cons, List.prod_cons, ← proj_apply (R := 𝕜) (φ := fun _ : ι ↦ 𝔸) a]
state_before: case cons
𝕜 : 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✝ : Fintype ι
x : ι → 𝔸
a : ι
l : List ι
IH :
  HasStrictFDerivAt (fun x => (List.map x l).prod)
    (∑ 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
⊢ HasStrictFDerivAt (fun x => (List.map x (a :: l)).prod)
    (∑ i : Fin (a :: l).length,
      (List.map x (List.take (↑i) (a :: l))).prod •
        (proj ((a :: l).get i)).smulRight (List.map x (List.drop (↑i).succ (a :: l))).prod)
    x
state_after: case cons
𝕜 : 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✝ : Fintype ι
x : ι → 𝔸
a : ι
l : List ι
IH :
  HasStrictFDerivAt (fun x => (List.map x l).prod)
    (∑ 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
⊢ HasStrictFDerivAt (fun x => (proj a) x * (List.map x l).prod)
    (∑ i : Fin (a :: l).length,
      (List.map x (List.take (↑i) (a :: l))).prod •
        (proj ((a :: l).get i)).smulRight (List.map x (List.drop (↑i).succ (a :: l))).prod)
    x

tactic: exact .congr_fderiv (.mul' (ContinuousLinearMap.hasStrictFDerivAt _) IH)
  (by ext; simp [Fin.sum_univ_succ, Finset.mul_sum, mul_assoc, add_comm])
state_before: case cons
𝕜 : 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✝ : Fintype ι
x : ι → 𝔸
a : ι
l : List ι
IH :
  HasStrictFDerivAt (fun x => (List.map x l).prod)
    (∑ 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
⊢ HasStrictFDerivAt (fun x => (proj a) x * (List.map x l).prod)
    (∑ i : Fin (a :: l).length,
      (List.map x (List.take (↑i) (a :: l))).prod •
        (proj ((a :: l).get i)).smulRight (List.map x (List.drop (↑i).succ (a :: l))).prod)
    x
state_after: no goals

tactic: ext
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✝ : Fintype ι
x : ι → 𝔸
a : ι
l : List ι
IH :
  HasStrictFDerivAt (fun x => (List.map x l).prod)
    (∑ 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
⊢ (proj a) 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 +
      (proj a).smulRight (List.map x l).prod =
    ∑ i : Fin (a :: l).length,
      (List.map x (List.take (↑i) (a :: l))).prod •
        (proj ((a :: l).get i)).smulRight (List.map x (List.drop (↑i).succ (a :: l))).prod
state_after: case h
𝕜 : 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✝ : Fintype ι
x : ι → 𝔸
a : ι
l : List ι
IH :
  HasStrictFDerivAt (fun x => (List.map x l).prod)
    (∑ 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
x✝ : ι → 𝔸
⊢ ((proj a) 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 +
        (proj a).smulRight (List.map x l).prod)
      x✝ =
    (∑ i : Fin (a :: l).length,
        (List.map x (List.take (↑i) (a :: l))).prod •
          (proj ((a :: l).get i)).smulRight (List.map x (List.drop (↑i).succ (a :: l))).prod)
      x✝

tactic: simp [Fin.sum_univ_succ, Finset.mul_sum, mul_assoc, add_comm]
state_before: case h
𝕜 : 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✝ : Fintype ι
x : ι → 𝔸
a : ι
l : List ι
IH :
  HasStrictFDerivAt (fun x => (List.map x l).prod)
    (∑ 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
x✝ : ι → 𝔸
⊢ ((proj a) 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 +
        (proj a).smulRight (List.map x l).prod)
      x✝ =
    (∑ i : Fin (a :: l).length,
        (List.map x (List.take (↑i) (a :: l))).prod •
          (proj ((a :: l).get i)).smulRight (List.map x (List.drop (↑i).succ (a :: l))).prod)
      x✝
state_after: no goals