-- 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
⊢ List.Forall₂ (fun x1 x2 => x1 ≤ x2)
    (List.map ((fun x => ‖x‖) ∘ ⇑(lift f.toMultilinearMap) ∘ fun x => x.1 • ⨂ₜ[𝕜] (i : ι), x.2 i) p)
    (List.map (fun x => ‖f‖ • x) (List.map (fun p => ‖p.1‖ * ∏ i : ι, ‖p.2 i‖) p))

Tactic:
simp only [smul_eq_mul, List.map_map, List.forall₂_map_right_iff, Function.comp_apply,
  List.forall₂_map_left_iff, map_smul, lift.tprod, ContinuousMultilinearMap.coe_coe,
  List.forall₂_same, Prod.forall]

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 : 𝕜) (b : (i : ι) → E i), (a, b) ∈ p → ‖a • f fun i => b i‖ ≤ ‖f‖ * (‖a‖ * ∏ x : ι, ‖b 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 : 𝕜) (b : (i : ι) → E i), (a, b) ∈ p → ‖a • f fun i => b i‖ ≤ ‖f‖ * (‖a‖ * ∏ x : ι, ‖b x‖)

Tactic:
intro a m _

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‖ ≤ ‖f‖ * (‖a‖ * ∏ 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
⊢ (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

Tactic:
refine List.Forall₂.sum_le_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.Forall₂ (fun x1 x2 => x1 ≤ x2)
    (List.map ((fun x => ‖x‖) ∘ ⇑(lift f.toMultilinearMap) ∘ fun x => x.1 • ⨂ₜ[𝕜] (i : ι), x.2 i) p)
    (List.map (fun x => ‖f‖ • x) (List.map (fun p => ‖p.1‖ * ∏ i : ι, ‖p.2 i‖) p))

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
⊢ ‖(lift f.toMultilinearMap) x‖ ≤ (List.sum ∘ List.map fun p => ‖p.1‖ * ∏ i : ι, ‖p.2 i‖) ↑⟨p, hp⟩ * ‖f‖

Tactic:
rw [mem_lifts_iff] at hp

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
⊢ ‖(lift f.toMultilinearMap) x‖ ≤ (List.sum ∘ List.map fun p => ‖p.1‖ * ∏ i : ι, ‖p.2 i‖) ↑⟨p, hp✝⟩ * ‖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 (⇑(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‖

Tactic:
refine le_trans (norm_multiset_sum_le _) ?_

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
⊢ (Multiset.map (fun x => ‖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‖