-- Mathlib/Analysis/Analytic/Composition.lean
theorem compAlongComposition_bound {n : ℕ} (p : FormalMultilinearSeries 𝕜 E F) (c : Composition n)
    (f : F [×c.length]→L[𝕜] G) (v : Fin n → E) :
    ‖f.compAlongComposition p c v‖ ≤ (‖f‖ * ∏ i, ‖p (c.blocksFun i)‖) * ∏ i : Fin n, ‖v i‖ :=
  calc
    ‖f.compAlongComposition p c v‖ = ‖f (p.applyComposition c v)‖ := rfl
    _ ≤ ‖f‖ * ∏ i, ‖p.applyComposition c v i‖ := ContinuousMultilinearMap.le_opNorm _ _
    _ ≤ ‖f‖ * ∏ i, ‖p (c.blocksFun i)‖ * ∏ j : Fin (c.blocksFun i), ‖(v ∘ c.embedding i) j‖

Proof state:
𝕜 : Type u_1
E : Type u_2
F : Type u_3
G : Type u_4
inst✝⁶ : NontriviallyNormedField 𝕜
inst✝⁵ : NormedAddCommGroup E
inst✝⁴ : NormedSpace 𝕜 E
inst✝³ : NormedAddCommGroup F
inst✝² : NormedSpace 𝕜 F
inst✝¹ : NormedAddCommGroup G
inst✝ : NormedSpace 𝕜 G
n : ℕ
p : FormalMultilinearSeries 𝕜 E F
c : Composition n
f : ContinuousMultilinearMap 𝕜 (fun i => F) G
v : Fin n → E
⊢ ‖f‖ * ∏ i : Fin c.length, ‖p (c.blocksFun i)‖ * ∏ j : Fin (c.blocksFun i), ‖(v ∘ ⇑(c.embedding i)) j‖ =
    (‖f‖ * ∏ i : Fin c.length, ‖p (c.blocksFun i)‖) *
      ∏ i : Fin c.length, ∏ j : Fin (c.blocksFun i), ‖(v ∘ ⇑(c.embedding i)) j‖

Tactic:
rw [Finset.prod_mul_distrib, mul_assoc]

Result:
no goals

Proof state:
𝕜 : Type u_1
E : Type u_2
F : Type u_3
G : Type u_4
inst✝⁶ : NontriviallyNormedField 𝕜
inst✝⁵ : NormedAddCommGroup E
inst✝⁴ : NormedSpace 𝕜 E
inst✝³ : NormedAddCommGroup F
inst✝² : NormedSpace 𝕜 F
inst✝¹ : NormedAddCommGroup G
inst✝ : NormedSpace 𝕜 G
n : ℕ
p : FormalMultilinearSeries 𝕜 E F
c : Composition n
f : ContinuousMultilinearMap 𝕜 (fun i => F) G
v : Fin n → E
⊢ ‖f‖ * ∏ i : Fin c.length, ‖p.applyComposition c v i‖ ≤
    ‖f‖ * ∏ i : Fin c.length, ‖p (c.blocksFun i)‖ * ∏ j : Fin (c.blocksFun i), ‖(v ∘ ⇑(c.embedding i)) j‖

Tactic:
apply mul_le_mul_of_nonneg_left _ (norm_nonneg _)

Result:
𝕜 : Type u_1
E : Type u_2
F : Type u_3
G : Type u_4
inst✝⁶ : NontriviallyNormedField 𝕜
inst✝⁵ : NormedAddCommGroup E
inst✝⁴ : NormedSpace 𝕜 E
inst✝³ : NormedAddCommGroup F
inst✝² : NormedSpace 𝕜 F
inst✝¹ : NormedAddCommGroup G
inst✝ : NormedSpace 𝕜 G
n : ℕ
p : FormalMultilinearSeries 𝕜 E F
c : Composition n
f : ContinuousMultilinearMap 𝕜 (fun i => F) G
v : Fin n → E
⊢ ∏ i : Fin c.length, ‖p.applyComposition c v i‖ ≤
    ∏ i : Fin c.length, ‖p (c.blocksFun i)‖ * ∏ j : Fin (c.blocksFun i), ‖(v ∘ ⇑(c.embedding i)) j‖

Proof state:
𝕜 : Type u_1
E : Type u_2
F : Type u_3
G : Type u_4
inst✝⁶ : NontriviallyNormedField 𝕜
inst✝⁵ : NormedAddCommGroup E
inst✝⁴ : NormedSpace 𝕜 E
inst✝³ : NormedAddCommGroup F
inst✝² : NormedSpace 𝕜 F
inst✝¹ : NormedAddCommGroup G
inst✝ : NormedSpace 𝕜 G
n : ℕ
p : FormalMultilinearSeries 𝕜 E F
c : Composition n
f : ContinuousMultilinearMap 𝕜 (fun i => F) G
v : Fin n → E
⊢ (‖f‖ * ∏ i : Fin c.length, ‖p (c.blocksFun i)‖) *
      ∏ i : Fin c.length, ∏ j : Fin (c.blocksFun i), ‖(v ∘ ⇑(c.embedding i)) j‖ =
    (‖f‖ * ∏ i : Fin c.length, ‖p (c.blocksFun i)‖) *
      ∏ a : Fin c.length, ∏ s : Fin (c.blocksFun a), ‖v (c.blocksFinEquiv ⟨a, s⟩)‖

Tactic:
congr

Result:
no goals

Proof state:
𝕜 : Type u_1
E : Type u_2
F : Type u_3
G : Type u_4
inst✝⁶ : NontriviallyNormedField 𝕜
inst✝⁵ : NormedAddCommGroup E
inst✝⁴ : NormedSpace 𝕜 E
inst✝³ : NormedAddCommGroup F
inst✝² : NormedSpace 𝕜 F
inst✝¹ : NormedAddCommGroup G
inst✝ : NormedSpace 𝕜 G
n : ℕ
p : FormalMultilinearSeries 𝕜 E F
c : Composition n
f : ContinuousMultilinearMap 𝕜 (fun i => F) G
v : Fin n → E
⊢ (‖f‖ * ∏ i : Fin c.length, ‖p (c.blocksFun i)‖) *
      ∏ i : Fin c.length, ∏ j : Fin (c.blocksFun i), ‖(v ∘ ⇑(c.embedding i)) j‖ =
    (‖f‖ * ∏ i : Fin c.length, ‖p (c.blocksFun i)‖) * ∏ i : Fin n, ‖v i‖

Tactic:
rw [← c.blocksFinEquiv.prod_comp, ← Finset.univ_sigma_univ, Finset.prod_sigma]

Result:
𝕜 : Type u_1
E : Type u_2
F : Type u_3
G : Type u_4
inst✝⁶ : NontriviallyNormedField 𝕜
inst✝⁵ : NormedAddCommGroup E
inst✝⁴ : NormedSpace 𝕜 E
inst✝³ : NormedAddCommGroup F
inst✝² : NormedSpace 𝕜 F
inst✝¹ : NormedAddCommGroup G
inst✝ : NormedSpace 𝕜 G
n : ℕ
p : FormalMultilinearSeries 𝕜 E F
c : Composition n
f : ContinuousMultilinearMap 𝕜 (fun i => F) G
v : Fin n → E
⊢ (‖f‖ * ∏ i : Fin c.length, ‖p (c.blocksFun i)‖) *
      ∏ i : Fin c.length, ∏ j : Fin (c.blocksFun i), ‖(v ∘ ⇑(c.embedding i)) j‖ =
    (‖f‖ * ∏ i : Fin c.length, ‖p (c.blocksFun i)‖) *
      ∏ a : Fin c.length, ∏ s : Fin (c.blocksFun a), ‖v (c.blocksFinEquiv ⟨a, s⟩)‖

Proof state:
𝕜 : Type u_1
E : Type u_2
F : Type u_3
G : Type u_4
inst✝⁶ : NontriviallyNormedField 𝕜
inst✝⁵ : NormedAddCommGroup E
inst✝⁴ : NormedSpace 𝕜 E
inst✝³ : NormedAddCommGroup F
inst✝² : NormedSpace 𝕜 F
inst✝¹ : NormedAddCommGroup G
inst✝ : NormedSpace 𝕜 G
n : ℕ
p : FormalMultilinearSeries 𝕜 E F
c : Composition n
f : ContinuousMultilinearMap 𝕜 (fun i => F) G
v : Fin n → E
i : Fin c.length
_hi : i ∈ Finset.univ
⊢ ‖p.applyComposition c v i‖ ≤ ‖p (c.blocksFun i)‖ * ∏ j : Fin (c.blocksFun i), ‖(v ∘ ⇑(c.embedding i)) j‖

Tactic:
apply ContinuousMultilinearMap.le_opNorm

Result:
no goals

Proof state:
𝕜 : Type u_1
E : Type u_2
F : Type u_3
G : Type u_4
inst✝⁶ : NontriviallyNormedField 𝕜
inst✝⁵ : NormedAddCommGroup E
inst✝⁴ : NormedSpace 𝕜 E
inst✝³ : NormedAddCommGroup F
inst✝² : NormedSpace 𝕜 F
inst✝¹ : NormedAddCommGroup G
inst✝ : NormedSpace 𝕜 G
n : ℕ
p : FormalMultilinearSeries 𝕜 E F
c : Composition n
f : ContinuousMultilinearMap 𝕜 (fun i => F) G
v : Fin n → E
⊢ ∏ i : Fin c.length, ‖p.applyComposition c v i‖ ≤
    ∏ i : Fin c.length, ‖p (c.blocksFun i)‖ * ∏ j : Fin (c.blocksFun i), ‖(v ∘ ⇑(c.embedding i)) j‖

Tactic:
refine Finset.prod_le_prod (fun i _hi => norm_nonneg _) fun i _hi => ?_

Result:
𝕜 : Type u_1
E : Type u_2
F : Type u_3
G : Type u_4
inst✝⁶ : NontriviallyNormedField 𝕜
inst✝⁵ : NormedAddCommGroup E
inst✝⁴ : NormedSpace 𝕜 E
inst✝³ : NormedAddCommGroup F
inst✝² : NormedSpace 𝕜 F
inst✝¹ : NormedAddCommGroup G
inst✝ : NormedSpace 𝕜 G
n : ℕ
p : FormalMultilinearSeries 𝕜 E F
c : Composition n
f : ContinuousMultilinearMap 𝕜 (fun i => F) G
v : Fin n → E
i : Fin c.length
_hi : i ∈ Finset.univ
⊢ ‖p.applyComposition c v i‖ ≤ ‖p (c.blocksFun i)‖ * ∏ j : Fin (c.blocksFun i), ‖(v ∘ ⇑(c.embedding i)) j‖