/-- Given a continuous multilinear map `f` in `n+1` variables, split the last variable to obtain
a continuous multilinear map in `n` variables into continuous linear maps, given by
`m ↦ (x ↦ f (snoc m x))`. -/
def ContinuousMultilinearMap.curryRight (f : ContinuousMultilinearMap 𝕜 Ei G) :
    ContinuousMultilinearMap 𝕜 (fun i : Fin n => Ei <| castSucc i) (Ei (last n) →L[𝕜] G) :=
  let f' : MultilinearMap 𝕜 (fun i : Fin n => Ei <| castSucc i) (Ei (last n) →L[𝕜] G) :=
    { toFun := fun m =>
        (f.toMultilinearMap.curryRight m).mkContinuous (‖f‖ * ∏ i, ‖m i‖) fun x =>
          f.norm_map_snoc_le m x
      map_add' := fun m i x y => by
        ext
        simp
      map_smul' := fun m i c x => by
        ext
        simp }
  f'.mkContinuous ‖f‖ fun m => by
    simp only [MultilinearMap.coe_mk]
    

Proof state:
𝕜 : Type u
ι : Type v
ι' : Type v'
n : ℕ
E : ι → Type wE
E₁ : ι → Type wE₁
E' : ι' → Type wE'
Ei : Fin (Nat.succ n) → Type wEi
G : Type wG
G' : Type wG'
inst✝¹⁴ : Fintype ι
inst✝¹³ : Fintype ι'
inst✝¹² : NontriviallyNormedField 𝕜
inst✝¹¹ : (i : ι) → NormedAddCommGroup (E i)
inst✝¹⁰ : (i : ι) → NormedSpace 𝕜 (E i)
inst✝⁹ : (i : ι) → NormedAddCommGroup (E₁ i)
inst✝⁸ : (i : ι) → NormedSpace 𝕜 (E₁ i)
inst✝⁷ : (i : ι') → NormedAddCommGroup (E' i)
inst✝⁶ : (i : ι') → NormedSpace 𝕜 (E' i)
inst✝⁵ : (i : Fin (Nat.succ n)) → NormedAddCommGroup (Ei i)
inst✝⁴ : (i : Fin (Nat.succ n)) → NormedSpace 𝕜 (Ei i)
inst✝³ : NormedAddCommGroup G
inst✝² : NormedSpace 𝕜 G
inst✝¹ : NormedAddCommGroup G'
inst✝ : NormedSpace 𝕜 G'
f : ContinuousMultilinearMap 𝕜 Ei G
f' : MultilinearMap 𝕜 (fun i => Ei (castSucc i)) (Ei (last n) →L[𝕜] G) :=
  {
    toFun := fun m =>
      LinearMap.mkContinuous ((MultilinearMap.curryRight f.toMultilinearMap) m) (‖f‖ * ∏ i : Fin n, ‖m i‖)
        (_ : ∀ (x : Ei (last n)), ‖f (snoc m x)‖ ≤ (‖f‖ * ∏ i : Fin n, ‖m i‖) * ‖x‖),
    map_add' :=
      (_ :
        ∀ [inst : DecidableEq (Fin n)] (m : (i : Fin n) → Ei (castSucc i)) (i : Fin n) (x y : Ei (castSucc i)),
          (fun m =>
                LinearMap.mkContinuous ((MultilinearMap.curryRight f.toMultilinearMap) m) (‖f‖ * ∏ i : Fin n, ‖m i‖)
                  (_ : ∀ (x : Ei (last n)), ‖f (snoc m x)‖ ≤ (‖f‖ * ∏ i : Fin n, ‖m i‖) * ‖x‖))
              (update m i (x + y)) =
            (fun m =>
                  LinearMap.mkContinuous ((MultilinearMap.curryRight f.toMultilinearMap) m) (‖f‖ * ∏ i : Fin n, ‖m i‖)
                    (_ : ∀ (x : Ei (last n)), ‖f (snoc m x)‖ ≤ (‖f‖ * ∏ i : Fin n, ‖m i‖) * ‖x‖))
                (update m i x) +
              (fun m =>
                  LinearMap.mkContinuous ((MultilinearMap.curryRight f.toMultilinearMap) m) (‖f‖ * ∏ i : Fin n, ‖m i‖)
                    (_ : ∀ (x : Ei (last n)), ‖f (snoc m x)‖ ≤ (‖f‖ * ∏ i : Fin n, ‖m i‖) * ‖x‖))
                (update m i y)),
    map_smul' :=
      (_ :
        ∀ [inst : DecidableEq (Fin n)] (m : (i : Fin n) → Ei (castSucc i)) (i : Fin n) (c : 𝕜) (x : Ei (castSucc i)),
          (fun m =>
                LinearMap.mkContinuous ((MultilinearMap.curryRight f.toMultilinearMap) m) (‖f‖ * ∏ i : Fin n, ‖m i‖)
                  (_ : ∀ (x : Ei (last n)), ‖f (snoc m x)‖ ≤ (‖f‖ * ∏ i : Fin n, ‖m i‖) * ‖x‖))
              (update m i (c • x)) =
            c •
              (fun m =>
                  LinearMap.mkContinuous ((MultilinearMap.curryRight f.toMultilinearMap) m) (‖f‖ * ∏ i : Fin n, ‖m i‖)
                    (_ : ∀ (x : Ei (last n)), ‖f (snoc m x)‖ ≤ (‖f‖ * ∏ i : Fin n, ‖m i‖) * ‖x‖))
                (update m i x)) }
m : (i : Fin n) → Ei (castSucc i)
⊢ ‖LinearMap.mkContinuous ((MultilinearMap.curryRight f.toMultilinearMap) m) (‖f‖ * ∏ i : Fin n, ‖m i‖)
        (_ : ∀ (x : Ei (last n)), ‖f (snoc m x)‖ ≤ (‖f‖ * ∏ i : Fin n, ‖m i‖) * ‖x‖)‖ ≤
    ‖f‖ * ∏ i : Fin n, ‖m i‖

Next tactic:
exact LinearMap.mkContinuous_norm_le _
      (mul_nonneg (norm_nonneg _) (prod_nonneg fun _ _ => norm_nonneg _)) _