set_option maxHeartbeats 400000 in
/-- `ContinuousLinearMap.prodMap` as a continuous linear map. -/
def prodMapL : (M₁ →L[𝕜] M₂) × (M₃ →L[𝕜] M₄) →L[𝕜] M₁ × M₃ →L[𝕜] M₂ × M₄ :=
  ContinuousLinearMap.copy
    (have Φ₁ : (M₁ →L[𝕜] M₂) →L[𝕜] M₁ →L[𝕜] M₂ × M₄ :=
      ContinuousLinearMap.compL 𝕜 M₁ M₂ (M₂ × M₄) (ContinuousLinearMap.inl 𝕜 M₂ M₄)
    have Φ₂ : (M₃ →L[𝕜] M₄) →L[𝕜] M₃ →L[𝕜] M₂ × M₄ :=
      ContinuousLinearMap.compL 𝕜 M₃ M₄ (M₂ × M₄) (ContinuousLinearMap.inr 𝕜 M₂ M₄)
    have Φ₁' :=
      (ContinuousLinearMap.compL 𝕜 (M₁ × M₃) M₁ (M₂ × M₄)).flip (ContinuousLinearMap.fst 𝕜 M₁ M₃)
    have Φ₂' :=
      (ContinuousLinearMap.compL 𝕜 (M₁ × M₃) M₃ (M₂ × M₄)).flip (ContinuousLinearMap.snd 𝕜 M₁ M₃)
    have Ψ₁ : (M₁ →L[𝕜] M₂) × (M₃ →L[𝕜] M₄) →L[𝕜] M₁ →L[𝕜] M₂ :=
      ContinuousLinearMap.fst 𝕜 (M₁ →L[𝕜] M₂) (M₃ →L[𝕜] M₄)
    have Ψ₂ : (M₁ →L[𝕜] M₂) × (M₃ →L[𝕜] M₄) →L[𝕜] M₃ →L[𝕜] M₄ :=
      ContinuousLinearMap.snd 𝕜 (M₁ →L[𝕜] M₂) (M₃ →L[𝕜] M₄)
    Φ₁' ∘L Φ₁ ∘L Ψ₁ + Φ₂' ∘L Φ₂ ∘L Ψ₂)
    (fun p : (M₁ →L[𝕜] M₂) × (M₃ →L[𝕜] M₄) => p.1.prodMap p.2) (by
      apply funext
      rintro ⟨φ, ψ⟩
      refine' ContinuousLinearMap.ext fun ⟨x₁, x₂⟩ => _
      -- Porting note: mathport suggested:
      -- ```
      -- simp only [add_apply, coe_comp', coe_fst', Function.comp_apply, compL_apply, flip_apply,
      --   coe_snd', inl_apply, inr_apply, Prod.mk_add_mk, add_zero, zero_add, coe_prodMap'
      --   Prod_map, Prod.mk.inj_iff, eq_self_iff_true, and_self_iff]
      -- rfl
      -- ```
      -- Frustratingly, in `mathlib3` we can use:
      -- ```
      -- dsimp   -- ⊢ (⇑φ x.fst, ⇑ψ x.snd) = (⇑φ x.fst + 0, 0 + ⇑ψ x.snd)
      -- simp
      -- ```
      -- Here neither `dsimp` or `simp` seem to make progress.
      repeat first | 

Proof state:
case h.mk
𝕜 : Type u_1
𝕜₂ : Type u_2
𝕜₃ : Type u_3
E : Type u_4
Eₗ : Type u_5
F : Type u_6
Fₗ : Type u_7
G : Type u_8
Gₗ : Type u_9
𝓕 : Type u_10
inst✝²⁶ : SeminormedAddCommGroup E
inst✝²⁵ : SeminormedAddCommGroup Eₗ
inst✝²⁴ : SeminormedAddCommGroup F
inst✝²³ : SeminormedAddCommGroup Fₗ
inst✝²² : SeminormedAddCommGroup G
inst✝²¹ : SeminormedAddCommGroup Gₗ
inst✝²⁰ : NontriviallyNormedField 𝕜
inst✝¹⁹ : NontriviallyNormedField 𝕜₂
inst✝¹⁸ : NontriviallyNormedField 𝕜₃
inst✝¹⁷ : NormedSpace 𝕜 E
inst✝¹⁶ : NormedSpace 𝕜 Eₗ
inst✝¹⁵ : NormedSpace 𝕜₂ F
inst✝¹⁴ : NormedSpace 𝕜 Fₗ
inst✝¹³ : NormedSpace 𝕜₃ G
inst✝¹² : NormedSpace 𝕜 Gₗ
σ₁₂ : 𝕜 →+* 𝕜₂
σ₂₃ : 𝕜₂ →+* 𝕜₃
σ₁₃ : 𝕜 →+* 𝕜₃
inst✝¹¹ : RingHomCompTriple σ₁₂ σ₂₃ σ₁₃
inst✝¹⁰ : RingHomIsometric σ₂₃
inst✝⁹ : RingHomIsometric σ₁₃
inst✝⁸ : RingHomIsometric σ₁₂
M₁ : Type u₁
inst✝⁷ : SeminormedAddCommGroup M₁
inst✝⁶ : NormedSpace 𝕜 M₁
M₂ : Type u₂
inst✝⁵ : SeminormedAddCommGroup M₂
inst✝⁴ : NormedSpace 𝕜 M₂
M₃ : Type u₃
inst✝³ : SeminormedAddCommGroup M₃
inst✝² : NormedSpace 𝕜 M₃
M₄ : Type u₄
inst✝¹ : SeminormedAddCommGroup M₄
inst✝ : NormedSpace 𝕜 M₄
φ : M₁ →L[𝕜] M₂
ψ : M₃ →L[𝕜] M₄
x✝ : M₁ × M₃
x₁ : M₁
x₂ : M₃
⊢ (prodMap (φ, ψ).1 (φ, ψ).2) (x₁, x₂) =
    (((compL 𝕜 M₁ M₂ (M₂ × M₄)) (inl 𝕜 M₂ M₄)) ((fst 𝕜 (M₁ →L[𝕜] M₂) (M₃ →L[𝕜] M₄)) (φ, ψ))) ((fst 𝕜 M₁ M₃) (x₁, x₂)) +
      (((compL 𝕜 (M₁ × M₃) M₃ (M₂ × M₄))
            (((compL 𝕜 M₃ M₄ (M₂ × M₄)) (inr 𝕜 M₂ M₄)) ((snd 𝕜 (M₁ →L[𝕜] M₂) (M₃ →L[𝕜] M₄)) (φ, ψ))))
          (snd 𝕜 M₁ M₃))
        (x₁, x₂)

Next tactic:
rw [add_apply]