-- Mathlib/Analysis/NormedSpace/PiTensorProduct/ProjectiveSeminorm.lean
theorem norm_eval_le_projectiveSeminorm (x : ⨂[𝕜] i, E i) (G : Type*) [SeminormedAddCommGroup G]
    [NormedSpace 𝕜 G] (f : ContinuousMultilinearMap 𝕜 E G) :
    ‖lift f.toMultilinearMap x‖ ≤ projectiveSeminorm x * ‖f‖

Proof state:
ι : Type uι
inst✝⁵ : Fintype ι
𝕜 : Type u𝕜
inst✝⁴ : NontriviallyNormedField 𝕜
E : ι → Type uE
inst✝³ : (i : ι) → SeminormedAddCommGroup (E i)
inst✝² : (i : ι) → NormedSpace 𝕜 (E i)
x : ⨂[𝕜] (i : ι), E i
G : Type u_1
inst✝¹ : SeminormedAddCommGroup G
inst✝ : NormedSpace 𝕜 G
f : ContinuousMultilinearMap 𝕜 E G
this : Nonempty (Subtype (Membership.mem x.lifts)) := nonempty_subtype.mpr (nonempty_lifts x)
p : FreeAddMonoid (𝕜 × ((i : ι) → E i))
hp✝ : p ∈ x.lifts
hp : (List.map (fun x => x.1 • ⨂ₜ[𝕜] (i : ι), x.2 i) p).sum = x
a : 𝕜
m : (i : ι) → E i
a✝ : (a, m) ∈ p
⊢ ‖a • f fun i => m i‖ ≤ ‖f‖ * (‖a‖ * ∏ x : ι, ‖m x‖)

Tactic:
rw [norm_smul, ← mul_assoc, mul_comm ‖f‖ _, mul_assoc]

Result:
ι : Type uι
inst✝⁵ : Fintype ι
𝕜 : Type u𝕜
inst✝⁴ : NontriviallyNormedField 𝕜
E : ι → Type uE
inst✝³ : (i : ι) → SeminormedAddCommGroup (E i)
inst✝² : (i : ι) → NormedSpace 𝕜 (E i)
x : ⨂[𝕜] (i : ι), E i
G : Type u_1
inst✝¹ : SeminormedAddCommGroup G
inst✝ : NormedSpace 𝕜 G
f : ContinuousMultilinearMap 𝕜 E G
this : Nonempty (Subtype (Membership.mem x.lifts)) := nonempty_subtype.mpr (nonempty_lifts x)
p : FreeAddMonoid (𝕜 × ((i : ι) → E i))
hp✝ : p ∈ x.lifts
hp : (List.map (fun x => x.1 • ⨂ₜ[𝕜] (i : ι), x.2 i) p).sum = x
a : 𝕜
m : (i : ι) → E i
a✝ : (a, m) ∈ p
⊢ ‖a‖ * ‖f fun i => m i‖ ≤ ‖a‖ * (‖f‖ * ∏ x : ι, ‖m x‖)

Proof state:
ι : Type uι
inst✝⁵ : Fintype ι
𝕜 : Type u𝕜
inst✝⁴ : NontriviallyNormedField 𝕜
E : ι → Type uE
inst✝³ : (i : ι) → SeminormedAddCommGroup (E i)
inst✝² : (i : ι) → NormedSpace 𝕜 (E i)
x : ⨂[𝕜] (i : ι), E i
G : Type u_1
inst✝¹ : SeminormedAddCommGroup G
inst✝ : NormedSpace 𝕜 G
f : ContinuousMultilinearMap 𝕜 E G
this : Nonempty (Subtype (Membership.mem x.lifts)) := nonempty_subtype.mpr (nonempty_lifts x)
p : FreeAddMonoid (𝕜 × ((i : ι) → E i))
hp✝ : p ∈ x.lifts
hp : (List.map (fun x => x.1 • ⨂ₜ[𝕜] (i : ι), x.2 i) p).sum = x
a : 𝕜
m : (i : ι) → E i
a✝ : (a, m) ∈ p
⊢ ‖a‖ * ‖f fun i => m i‖ ≤ ‖a‖ * (‖f‖ * ∏ x : ι, ‖m x‖)

Tactic:
exact mul_le_mul_of_nonneg_left (f.le_opNorm _) (norm_nonneg _)

Result:
no goals

Proof state:
ι : Type uι
inst✝⁵ : Fintype ι
𝕜 : Type u𝕜
inst✝⁴ : NontriviallyNormedField 𝕜
E : ι → Type uE
inst✝³ : (i : ι) → SeminormedAddCommGroup (E i)
inst✝² : (i : ι) → NormedSpace 𝕜 (E i)
x : ⨂[𝕜] (i : ι), E i
G : Type u_1
inst✝¹ : SeminormedAddCommGroup G
inst✝ : NormedSpace 𝕜 G
f : ContinuousMultilinearMap 𝕜 E G
⊢ ‖(lift f.toMultilinearMap) x‖ ≤ projectiveSeminorm x * ‖f‖

Tactic:
letI := nonempty_subtype.mpr (nonempty_lifts x)

Result:
ι : Type uι
inst✝⁵ : Fintype ι
𝕜 : Type u𝕜
inst✝⁴ : NontriviallyNormedField 𝕜
E : ι → Type uE
inst✝³ : (i : ι) → SeminormedAddCommGroup (E i)
inst✝² : (i : ι) → NormedSpace 𝕜 (E i)
x : ⨂[𝕜] (i : ι), E i
G : Type u_1
inst✝¹ : SeminormedAddCommGroup G
inst✝ : NormedSpace 𝕜 G
f : ContinuousMultilinearMap 𝕜 E G
this : Nonempty (Subtype (Membership.mem x.lifts)) := nonempty_subtype.mpr (nonempty_lifts x)
⊢ ‖(lift f.toMultilinearMap) x‖ ≤ projectiveSeminorm x * ‖f‖

Proof state:
ι : Type uι
inst✝⁵ : Fintype ι
𝕜 : Type u𝕜
inst✝⁴ : NontriviallyNormedField 𝕜
E : ι → Type uE
inst✝³ : (i : ι) → SeminormedAddCommGroup (E i)
inst✝² : (i : ι) → NormedSpace 𝕜 (E i)
x : ⨂[𝕜] (i : ι), E i
G : Type u_1
inst✝¹ : SeminormedAddCommGroup G
inst✝ : NormedSpace 𝕜 G
f : ContinuousMultilinearMap 𝕜 E G
this : Nonempty (Subtype (Membership.mem x.lifts)) := nonempty_subtype.mpr (nonempty_lifts x)
⊢ ‖(lift f.toMultilinearMap) x‖ ≤ ⨅ i, (List.sum ∘ List.map fun p => ‖p.1‖ * ∏ i : ι, ‖p.2 i‖) ↑i * ‖f‖

Tactic:
refine le_ciInf ?_

Result:
ι : Type uι
inst✝⁵ : Fintype ι
𝕜 : Type u𝕜
inst✝⁴ : NontriviallyNormedField 𝕜
E : ι → Type uE
inst✝³ : (i : ι) → SeminormedAddCommGroup (E i)
inst✝² : (i : ι) → NormedSpace 𝕜 (E i)
x : ⨂[𝕜] (i : ι), E i
G : Type u_1
inst✝¹ : SeminormedAddCommGroup G
inst✝ : NormedSpace 𝕜 G
f : ContinuousMultilinearMap 𝕜 E G
this : Nonempty (Subtype (Membership.mem x.lifts)) := nonempty_subtype.mpr (nonempty_lifts x)
⊢ ∀ (x_1 : ↑x.lifts), ‖(lift f.toMultilinearMap) x‖ ≤ (List.sum ∘ List.map fun p => ‖p.1‖ * ∏ i : ι, ‖p.2 i‖) ↑x_1 * ‖f‖

Proof state:
ι : Type uι
inst✝⁵ : Fintype ι
𝕜 : Type u𝕜
inst✝⁴ : NontriviallyNormedField 𝕜
E : ι → Type uE
inst✝³ : (i : ι) → SeminormedAddCommGroup (E i)
inst✝² : (i : ι) → NormedSpace 𝕜 (E i)
x : ⨂[𝕜] (i : ι), E i
G : Type u_1
inst✝¹ : SeminormedAddCommGroup G
inst✝ : NormedSpace 𝕜 G
f : ContinuousMultilinearMap 𝕜 E G
this : Nonempty (Subtype (Membership.mem x.lifts)) := nonempty_subtype.mpr (nonempty_lifts x)
p : FreeAddMonoid (𝕜 × ((i : ι) → E i))
hp✝ : p ∈ x.lifts
hp : (List.map (fun x => x.1 • ⨂ₜ[𝕜] (i : ι), x.2 i) p).sum = x
⊢ (List.map ((fun x => ‖x‖) ∘ ⇑(lift f.toMultilinearMap) ∘ fun x => x.1 • ⨂ₜ[𝕜] (i : ι), x.2 i) p).sum ≤
    (List.map (fun p => ‖p.1‖ * ∏ i : ι, ‖p.2 i‖) p).sum * ‖f‖

Tactic:
rw [mul_comm, ← smul_eq_mul, List.smul_sum]

Result:
ι : Type uι
inst✝⁵ : Fintype ι
𝕜 : Type u𝕜
inst✝⁴ : NontriviallyNormedField 𝕜
E : ι → Type uE
inst✝³ : (i : ι) → SeminormedAddCommGroup (E i)
inst✝² : (i : ι) → NormedSpace 𝕜 (E i)
x : ⨂[𝕜] (i : ι), E i
G : Type u_1
inst✝¹ : SeminormedAddCommGroup G
inst✝ : NormedSpace 𝕜 G
f : ContinuousMultilinearMap 𝕜 E G
this : Nonempty (Subtype (Membership.mem x.lifts)) := nonempty_subtype.mpr (nonempty_lifts x)
p : FreeAddMonoid (𝕜 × ((i : ι) → E i))
hp✝ : p ∈ x.lifts
hp : (List.map (fun x => x.1 • ⨂ₜ[𝕜] (i : ι), x.2 i) p).sum = x
⊢ (List.map ((fun x => ‖x‖) ∘ ⇑(lift f.toMultilinearMap) ∘ fun x => x.1 • ⨂ₜ[𝕜] (i : ι), x.2 i) p).sum ≤
    (List.map (fun x => ‖f‖ • x) (List.map (fun p => ‖p.1‖ * ∏ i : ι, ‖p.2 i‖) p)).sum

Proof state:
ι : Type uι
inst✝⁵ : Fintype ι
𝕜 : Type u𝕜
inst✝⁴ : NontriviallyNormedField 𝕜
E : ι → Type uE
inst✝³ : (i : ι) → SeminormedAddCommGroup (E i)
inst✝² : (i : ι) → NormedSpace 𝕜 (E i)
x : ⨂[𝕜] (i : ι), E i
G : Type u_1
inst✝¹ : SeminormedAddCommGroup G
inst✝ : NormedSpace 𝕜 G
f : ContinuousMultilinearMap 𝕜 E G
this : Nonempty (Subtype (Membership.mem x.lifts)) := nonempty_subtype.mpr (nonempty_lifts x)
p : FreeAddMonoid (𝕜 × ((i : ι) → E i))
hp✝ : p ∈ x.lifts
hp : (List.map (fun x => x.1 • ⨂ₜ[𝕜] (i : ι), x.2 i) p).sum = x
⊢ ‖(lift f.toMultilinearMap) x‖ ≤ (List.sum ∘ List.map fun p => ‖p.1‖ * ∏ i : ι, ‖p.2 i‖) ↑⟨p, hp✝⟩ * ‖f‖

Tactic:
conv_lhs => rw [← hp, ← List.sum_map_hom, ← Multiset.sum_coe]

Result:
ι : Type uι
inst✝⁵ : Fintype ι
𝕜 : Type u𝕜
inst✝⁴ : NontriviallyNormedField 𝕜
E : ι → Type uE
inst✝³ : (i : ι) → SeminormedAddCommGroup (E i)
inst✝² : (i : ι) → NormedSpace 𝕜 (E i)
x : ⨂[𝕜] (i : ι), E i
G : Type u_1
inst✝¹ : SeminormedAddCommGroup G
inst✝ : NormedSpace 𝕜 G
f : ContinuousMultilinearMap 𝕜 E G
this : Nonempty (Subtype (Membership.mem x.lifts)) := nonempty_subtype.mpr (nonempty_lifts x)
p : FreeAddMonoid (𝕜 × ((i : ι) → E i))
hp✝ : p ∈ x.lifts
hp : (List.map (fun x => x.1 • ⨂ₜ[𝕜] (i : ι), x.2 i) p).sum = x
⊢ ‖(↑(List.map (⇑(lift f.toMultilinearMap) ∘ fun x => x.1 • ⨂ₜ[𝕜] (i : ι), x.2 i) p)).sum‖ ≤
    (List.sum ∘ List.map fun p => ‖p.1‖ * ∏ i : ι, ‖p.2 i‖) ↑⟨p, hp✝⟩ * ‖f‖