l3lab/ntp-mathlib huggingface dataset:
theorem op_nnnorm_prod (f : ContinuousMultilinearMap 𝕜 E G) (g : ContinuousMultilinearMap 𝕜 E G') :
    ‖f.prod g‖₊ = max ‖f‖₊ ‖g‖₊ :=
  eq_of_forall_ge_iff fun _ ↦ by
    

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'
c : 𝕜
f✝ g✝ : ContinuousMultilinearMap 𝕜 E G
m : (i : ι) → E i
𝕜' : Type u_1
inst✝² : NormedField 𝕜'
inst✝¹ : NormedSpace 𝕜' G
inst✝ : SMulCommClass 𝕜 𝕜' G
f : ContinuousMultilinearMap 𝕜 E G
g : ContinuousMultilinearMap 𝕜 E G'
x✝ : ℝ≥0
⊢ ‖prod f g‖₊ ≤ x✝ ↔ max ‖f‖₊ ‖g‖₊ ≤ x✝

Next tactic:
simp only [op_nnnorm_le_iff, prod_apply, Prod.nnnorm_def', max_le_iff, forall_and]
theorem op_nnnorm_pi
    {ι' : Type v'} [Fintype ι'] {E' : ι' → Type wE'} [∀ i', NormedAddCommGroup (E' i')]
    [∀ i', NormedSpace 𝕜 (E' i')] (f : ∀ i', ContinuousMultilinearMap 𝕜 E (E' i')) :
    ‖pi f‖₊ = ‖f‖₊ :=
  eq_of_forall_ge_iff fun _ ↦ by 

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'
c : 𝕜
f✝ g : ContinuousMultilinearMap 𝕜 E G
m : (i : ι) → E i
𝕜' : Type u_1
inst✝⁵ : NormedField 𝕜'
inst✝⁴ : NormedSpace 𝕜' G
inst✝³ : SMulCommClass 𝕜 𝕜' G
ι' : Type v'
inst✝² : Fintype ι'
E' : ι' → Type wE'
inst✝¹ : (i' : ι') → NormedAddCommGroup (E' i')
inst✝ : (i' : ι') → NormedSpace 𝕜 (E' i')
f : (i' : ι') → ContinuousMultilinearMap 𝕜 E (E' i')
x✝ : ℝ≥0
⊢ ‖pi f‖₊ ≤ x✝ ↔ ‖f‖₊ ≤ x✝

Next tactic:
simpa [op_nnnorm_le_iff, pi_nnnorm_le_iff] using forall_swap
@[simp]
theorem norm_ofSubsingleton [Subsingleton ι] (i : ι) (f : G →L[𝕜] G') :
    ‖ofSubsingleton 𝕜 G G' i f‖ = ‖f‖ := by
  

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'
c : 𝕜
f✝ g : ContinuousMultilinearMap 𝕜 E G
m : (i : ι) → E i
𝕜' : Type u_1
inst✝³ : NormedField 𝕜'
inst✝² : NormedSpace 𝕜' G
inst✝¹ : SMulCommClass 𝕜 𝕜' G
inst✝ : Subsingleton ι
i : ι
f : G →L[𝕜] G'
⊢ ‖(ofSubsingleton 𝕜 G G' i) f‖ = ‖f‖

Next tactic:
letI : Unique ι := uniqueOfSubsingleton i
@[simp]
theorem norm_ofSubsingleton [Subsingleton ι] (i : ι) (f : G →L[𝕜] G') :
    ‖ofSubsingleton 𝕜 G G' i f‖ = ‖f‖ := by
  letI : Unique ι := uniqueOfSubsingleton i
  

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'
c : 𝕜
f✝ g : ContinuousMultilinearMap 𝕜 E G
m : (i : ι) → E i
𝕜' : Type u_1
inst✝³ : NormedField 𝕜'
inst✝² : NormedSpace 𝕜' G
inst✝¹ : SMulCommClass 𝕜 𝕜' G
inst✝ : Subsingleton ι
i : ι
f : G →L[𝕜] G'
this : Unique ι := uniqueOfSubsingleton i
⊢ ‖(ofSubsingleton 𝕜 G G' i) f‖ = ‖f‖

Next tactic:
simp [norm_def, ContinuousLinearMap.norm_def, (Equiv.funUnique _ _).symm.surjective.forall]
theorem norm_ofSubsingleton_id_le [Subsingleton ι] (i : ι) :
    ‖ofSubsingleton 𝕜 G G i (.id _ _)‖ ≤ 1 := by
  

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'
c : 𝕜
f g : ContinuousMultilinearMap 𝕜 E G
m : (i : ι) → E i
𝕜' : Type u_1
inst✝³ : NormedField 𝕜'
inst✝² : NormedSpace 𝕜' G
inst✝¹ : SMulCommClass 𝕜 𝕜' G
inst✝ : Subsingleton ι
i : ι
⊢ ‖(ofSubsingleton 𝕜 G G i) (ContinuousLinearMap.id 𝕜 G)‖ ≤ 1

Next tactic:
rw [norm_ofSubsingleton]
theorem norm_ofSubsingleton_id_le [Subsingleton ι] (i : ι) :
    ‖ofSubsingleton 𝕜 G G i (.id _ _)‖ ≤ 1 := by
  rw [norm_ofSubsingleton]
  

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'
c : 𝕜
f g : ContinuousMultilinearMap 𝕜 E G
m : (i : ι) → E i
𝕜' : Type u_1
inst✝³ : NormedField 𝕜'
inst✝² : NormedSpace 𝕜' G
inst✝¹ : SMulCommClass 𝕜 𝕜' G
inst✝ : Subsingleton ι
i : ι
⊢ ‖ContinuousLinearMap.id 𝕜 G‖ ≤ 1

Next tactic:
apply ContinuousLinearMap.norm_id_le
theorem norm_ofSubsingleton_id [Subsingleton ι] [Nontrivial G] (i : ι) :
    ‖ofSubsingleton 𝕜 G G i (.id _ _)‖ = 1 := by 

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'
c : 𝕜
f g : ContinuousMultilinearMap 𝕜 E G
m : (i : ι) → E i
𝕜' : Type u_1
inst✝⁴ : NormedField 𝕜'
inst✝³ : NormedSpace 𝕜' G
inst✝² : SMulCommClass 𝕜 𝕜' G
inst✝¹ : Subsingleton ι
inst✝ : Nontrivial G
i : ι
⊢ ‖(ofSubsingleton 𝕜 G G i) (ContinuousLinearMap.id 𝕜 G)‖ = 1

Next tactic:
simp
@[simp]
theorem norm_constOfIsEmpty [IsEmpty ι] (x : G) : ‖constOfIsEmpty 𝕜 E x‖ = ‖x‖ := by
  

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'
c : 𝕜
f g : ContinuousMultilinearMap 𝕜 E G
m : (i : ι) → E i
𝕜' : Type u_1
inst✝³ : NormedField 𝕜'
inst✝² : NormedSpace 𝕜' G
inst✝¹ : SMulCommClass 𝕜 𝕜' G
inst✝ : IsEmpty ι
x : G
⊢ ‖constOfIsEmpty 𝕜 E x‖ = ‖x‖

Next tactic:
apply le_antisymm
@[simp]
theorem norm_constOfIsEmpty [IsEmpty ι] (x : G) : ‖constOfIsEmpty 𝕜 E x‖ = ‖x‖ := by
  apply le_antisymm
  · 

Proof state:
case a
𝕜 : 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'
c : 𝕜
f g : ContinuousMultilinearMap 𝕜 E G
m : (i : ι) → E i
𝕜' : Type u_1
inst✝³ : NormedField 𝕜'
inst✝² : NormedSpace 𝕜' G
inst✝¹ : SMulCommClass 𝕜 𝕜' G
inst✝ : IsEmpty ι
x : G
⊢ ‖constOfIsEmpty 𝕜 E x‖ ≤ ‖x‖

Next tactic:
refine' op_norm_le_bound _ (norm_nonneg _) fun x => _
@[simp]
theorem norm_constOfIsEmpty [IsEmpty ι] (x : G) : ‖constOfIsEmpty 𝕜 E x‖ = ‖x‖ := by
  apply le_antisymm
  · refine' op_norm_le_bound _ (norm_nonneg _) fun x => _
    

Proof state:
case a
𝕜 : 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'
c : 𝕜
f g : ContinuousMultilinearMap 𝕜 E G
m : (i : ι) → E i
𝕜' : Type u_1
inst✝³ : NormedField 𝕜'
inst✝² : NormedSpace 𝕜' G
inst✝¹ : SMulCommClass 𝕜 𝕜' G
inst✝ : IsEmpty ι
x✝ : G
x : (i : ι) → E i
⊢ ‖(constOfIsEmpty 𝕜 E x✝) x‖ ≤ ‖x✝‖ * ∏ i : ι, ‖x i‖

Next tactic:
rw [Fintype.prod_empty, mul_one, constOfIsEmpty_apply]
@[simp]
theorem norm_constOfIsEmpty [IsEmpty ι] (x : G) : ‖constOfIsEmpty 𝕜 E x‖ = ‖x‖ := by
  apply le_antisymm
  · refine' op_norm_le_bound _ (norm_nonneg _) fun x => _
    rw [Fintype.prod_empty, mul_one, constOfIsEmpty_apply]
  · 

Proof state:
case a
𝕜 : 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'
c : 𝕜
f g : ContinuousMultilinearMap 𝕜 E G
m : (i : ι) → E i
𝕜' : Type u_1
inst✝³ : NormedField 𝕜'
inst✝² : NormedSpace 𝕜' G
inst✝¹ : SMulCommClass 𝕜 𝕜' G
inst✝ : IsEmpty ι
x : G
⊢ ‖x‖ ≤ ‖constOfIsEmpty 𝕜 E x‖

Next tactic:
simpa using (constOfIsEmpty 𝕜 E x).le_op_norm 0
/-- `ContinuousMultilinearMap.prod` as a `LinearIsometryEquiv`. -/
def prodL :
    ContinuousMultilinearMap 𝕜 E G × ContinuousMultilinearMap 𝕜 E G' ≃ₗᵢ[𝕜]
      ContinuousMultilinearMap 𝕜 E (G × G') where
  toFun f := f.1.prod f.2
  invFun f :=
    ((ContinuousLinearMap.fst 𝕜 G G').compContinuousMultilinearMap f,
      (ContinuousLinearMap.snd 𝕜 G G').compContinuousMultilinearMap f)
  map_add' f g := rfl
  map_smul' c f := rfl
  left_inv f := by 

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'
c : 𝕜
f✝ g : ContinuousMultilinearMap 𝕜 E G
m : (i : ι) → E i
𝕜' : Type u_1
inst✝² : NormedField 𝕜'
inst✝¹ : NormedSpace 𝕜' G
inst✝ : SMulCommClass 𝕜 𝕜' G
f : ContinuousMultilinearMap 𝕜 E G × ContinuousMultilinearMap 𝕜 E G'
⊢ (fun f =>
        (ContinuousLinearMap.compContinuousMultilinearMap (ContinuousLinearMap.fst 𝕜 G G') f,
          ContinuousLinearMap.compContinuousMultilinearMap (ContinuousLinearMap.snd 𝕜 G G') f))
      (AddHom.toFun
        {
            toAddHom :=
              { toFun := fun f => prod f.1 f.2,
                map_add' :=
                  (_ :
                    ∀ (f g : ContinuousMultilinearMap 𝕜 E G × ContinuousMultilinearMap 𝕜 E G'),
                      (fun f => prod f.1 f.2) (f + g) = (fun f => prod f.1 f.2) (f + g)) },
            map_smul' :=
              (_ :
                ∀ (c : 𝕜) (f : ContinuousMultilinearMap 𝕜 E G × ContinuousMultilinearMap 𝕜 E G'),
                  AddHom.toFun
                      { toFun := fun f => prod f.1 f.2,
                        map_add' :=
                          (_ :
                            ∀ (f g : ContinuousMultilinearMap 𝕜 E G × ContinuousMultilinearMap 𝕜 E G'),
                              (fun f => prod f.1 f.2) (f + g) = (fun f => prod f.1 f.2) (f + g)) }
                      (c • f) =
                    AddHom.toFun
                      { toFun := fun f => prod f.1 f.2,
                        map_add' :=
                          (_ :
                            ∀ (f g : ContinuousMultilinearMap 𝕜 E G × ContinuousMultilinearMap 𝕜 E G'),
                              (fun f => prod f.1 f.2) (f + g) = (fun f => prod f.1 f.2) (f + g)) }
                      (c • f)) }.toAddHom
        f) =
    f

Next tactic:
ext
/-- `ContinuousMultilinearMap.prod` as a `LinearIsometryEquiv`. -/
def prodL :
    ContinuousMultilinearMap 𝕜 E G × ContinuousMultilinearMap 𝕜 E G' ≃ₗᵢ[𝕜]
      ContinuousMultilinearMap 𝕜 E (G × G') where
  toFun f := f.1.prod f.2
  invFun f :=
    ((ContinuousLinearMap.fst 𝕜 G G').compContinuousMultilinearMap f,
      (ContinuousLinearMap.snd 𝕜 G G').compContinuousMultilinearMap f)
  map_add' f g := rfl
  map_smul' c f := rfl
  left_inv f := by ext <;> 

Proof state:
case a.H
𝕜 : 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'
c : 𝕜
f✝ g : ContinuousMultilinearMap 𝕜 E G
m : (i : ι) → E i
𝕜' : Type u_1
inst✝² : NormedField 𝕜'
inst✝¹ : NormedSpace 𝕜' G
inst✝ : SMulCommClass 𝕜 𝕜' G
f : ContinuousMultilinearMap 𝕜 E G × ContinuousMultilinearMap 𝕜 E G'
x✝ : (i : ι) → E i
⊢ ((fun f =>
            (ContinuousLinearMap.compContinuousMultilinearMap (ContinuousLinearMap.fst 𝕜 G G') f,
              ContinuousLinearMap.compContinuousMultilinearMap (ContinuousLinearMap.snd 𝕜 G G') f))
          (AddHom.toFun
            {
                toAddHom :=
                  { toFun := fun f => prod f.1 f.2,
                    map_add' :=
                      (_ :
                        ∀ (f g : ContinuousMultilinearMap 𝕜 E G × ContinuousMultilinearMap 𝕜 E G'),
                          (fun f => prod f.1 f.2) (f + g) = (fun f => prod f.1 f.2) (f + g)) },
                map_smul' :=
                  (_ :
                    ∀ (c : 𝕜) (f : ContinuousMultilinearMap 𝕜 E G × ContinuousMultilinearMap 𝕜 E G'),
                      AddHom.toFun
                          { toFun := fun f => prod f.1 f.2,
                            map_add' :=
                              (_ :
                                ∀ (f g : ContinuousMultilinearMap 𝕜 E G × ContinuousMultilinearMap 𝕜 E G'),
                                  (fun f => prod f.1 f.2) (f + g) = (fun f => prod f.1 f.2) (f + g)) }
                          (c • f) =
                        AddHom.toFun
                          { toFun := fun f => prod f.1 f.2,
                            map_add' :=
                              (_ :
                                ∀ (f g : ContinuousMultilinearMap 𝕜 E G × ContinuousMultilinearMap 𝕜 E G'),
                                  (fun f => prod f.1 f.2) (f + g) = (fun f => prod f.1 f.2) (f + g)) }
                          (c • f)) }.toAddHom
            f)).1
      x✝ =
    f.1 x✝

Next tactic:
rfl
/-- `ContinuousMultilinearMap.prod` as a `LinearIsometryEquiv`. -/
def prodL :
    ContinuousMultilinearMap 𝕜 E G × ContinuousMultilinearMap 𝕜 E G' ≃ₗᵢ[𝕜]
      ContinuousMultilinearMap 𝕜 E (G × G') where
  toFun f := f.1.prod f.2
  invFun f :=
    ((ContinuousLinearMap.fst 𝕜 G G').compContinuousMultilinearMap f,
      (ContinuousLinearMap.snd 𝕜 G G').compContinuousMultilinearMap f)
  map_add' f g := rfl
  map_smul' c f := rfl
  left_inv f := by ext <;> 

Proof state:
case a.H
𝕜 : 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'
c : 𝕜
f✝ g : ContinuousMultilinearMap 𝕜 E G
m : (i : ι) → E i
𝕜' : Type u_1
inst✝² : NormedField 𝕜'
inst✝¹ : NormedSpace 𝕜' G
inst✝ : SMulCommClass 𝕜 𝕜' G
f : ContinuousMultilinearMap 𝕜 E G × ContinuousMultilinearMap 𝕜 E G'
x✝ : (i : ι) → E i
⊢ ((fun f =>
            (ContinuousLinearMap.compContinuousMultilinearMap (ContinuousLinearMap.fst 𝕜 G G') f,
              ContinuousLinearMap.compContinuousMultilinearMap (ContinuousLinearMap.snd 𝕜 G G') f))
          (AddHom.toFun
            {
                toAddHom :=
                  { toFun := fun f => prod f.1 f.2,
                    map_add' :=
                      (_ :
                        ∀ (f g : ContinuousMultilinearMap 𝕜 E G × ContinuousMultilinearMap 𝕜 E G'),
                          (fun f => prod f.1 f.2) (f + g) = (fun f => prod f.1 f.2) (f + g)) },
                map_smul' :=
                  (_ :
                    ∀ (c : 𝕜) (f : ContinuousMultilinearMap 𝕜 E G × ContinuousMultilinearMap 𝕜 E G'),
                      AddHom.toFun
                          { toFun := fun f => prod f.1 f.2,
                            map_add' :=
                              (_ :
                                ∀ (f g : ContinuousMultilinearMap 𝕜 E G × ContinuousMultilinearMap 𝕜 E G'),
                                  (fun f => prod f.1 f.2) (f + g) = (fun f => prod f.1 f.2) (f + g)) }
                          (c • f) =
                        AddHom.toFun
                          { toFun := fun f => prod f.1 f.2,
                            map_add' :=
                              (_ :
                                ∀ (f g : ContinuousMultilinearMap 𝕜 E G × ContinuousMultilinearMap 𝕜 E G'),
                                  (fun f => prod f.1 f.2) (f + g) = (fun f => prod f.1 f.2) (f + g)) }
                          (c • f)) }.toAddHom
            f)).2
      x✝ =
    f.2 x✝

Next tactic:
rfl