2
2
Copyright (c) 2018 Patrick Massot. All rights reserved.
3
3
Released under Apache 2.0 license as described in the file LICENSE.
4
4
Authors: Patrick Massot, Johannes Hölzl
5
-
6
- Continuous linear functions -- functions between normed vector spaces which are bounded and linear.
7
5
-/
8
6
import analysis.normed_space.multilinear
9
7
8
+ /-!
9
+ # Continuous linear maps
10
+
11
+ This file defines a class stating that a map between normed vector spaces is (bi)linear and
12
+ continuous.
13
+ Instead of asking for continuity, the definition takes the equivalent condition (because the space
14
+ is normed) that `∥f x∥` is bounded by a multiple of `∥x∥`. Hence the "bounded" in the name refers to
15
+ `∥f x∥/∥x∥` rather than `∥f x∥` itself.
16
+
17
+ ## Main declarations
18
+
19
+ * `is_bounded_linear_map`: Class stating that a map `f : E → F` is linear and has `∥f x∥` bounded
20
+ by a multiple of `∥x∥`.
21
+ * `is_bounded_bilinear_map`: Class stating that a map `f : E × F → G` is bilinear and continuous,
22
+ but through the simpler to provide statement that `∥f (x, y)∥` is bounded by a multiple of
23
+ `∥x∥ * ∥y∥`
24
+ * `is_bounded_bilinear_map.linear_deriv`: Derivative of a continuous bilinear map as a linear map.
25
+ * `is_bounded_bilinear_map.deriv`: Derivative of a continuous bilinear map as a continuous linear
26
+ map. The proof that it is indeed the derivative is `is_bounded_bilinear_map.has_fderiv_at` in
27
+ `analysis.calculus.fderiv`.
28
+ * `linear_map.norm_apply_of_isometry`: A linear isometry preserves the norm.
29
+
30
+ ## Notes
31
+
32
+ The main use of this file is `is_bounded_bilinear_map`. The file `analysis.normed_space.multilinear`
33
+ already expounds the theory of multilinear maps, but the `2`-variables case is sufficiently simpler
34
+ to currently deserve its own treatment.
35
+
36
+ `is_bounded_linear_map` is effectively an unbundled version of `continuous_linear_map` (defined
37
+ in `topology.algebra.module`, theory over normed spaces developed in
38
+ `analysis.normed_space.operator_norm`), albeit the name disparity. A bundled
39
+ `continuous_linear_map` is to be preferred over a `is_bounded_linear_map` hypothesis. Historical
40
+ artifact, really.
41
+ -/
42
+
10
43
noncomputable theory
11
44
open_locale classical big_operators topological_space
12
45
13
- open filter (tendsto)
14
- open metric
46
+ open filter (tendsto) metric
15
47
16
48
variables {𝕜 : Type *} [nondiscrete_normed_field 𝕜]
17
- variables {E : Type *} [normed_group E] [normed_space 𝕜 E]
18
- variables {F : Type *} [normed_group F] [normed_space 𝕜 F]
19
- variables {G : Type *} [normed_group G] [normed_space 𝕜 G]
49
+ {E : Type *} [normed_group E] [normed_space 𝕜 E]
50
+ {F : Type *} [normed_group F] [normed_space 𝕜 F]
51
+ {G : Type *} [normed_group G] [normed_space 𝕜 G]
20
52
21
53
22
54
/-- A function `f` satisfies `is_bounded_linear_map 𝕜 f` if it is linear and satisfies the
23
- inequality `∥ f x ∥ ≤ M * ∥ x ∥` for some positive constant `M`. -/
55
+ inequality `∥f x∥ ≤ M * ∥x ∥` for some positive constant `M`. -/
24
56
structure is_bounded_linear_map (𝕜 : Type *) [normed_field 𝕜]
25
57
{E : Type *} [normed_group E] [normed_space 𝕜 E]
26
58
{F : Type *} [normed_group F] [normed_space 𝕜 F] (f : E → F)
27
59
extends is_linear_map 𝕜 f : Prop :=
28
- (bound : ∃ M, 0 < M ∧ ∀ x : E, ∥ f x ∥ ≤ M * ∥ x ∥)
60
+ (bound : ∃ M, 0 < M ∧ ∀ x : E, ∥f x∥ ≤ M * ∥x ∥)
29
61
30
62
lemma is_linear_map.with_bound
31
- {f : E → F} (hf : is_linear_map 𝕜 f) (M : ℝ) (h : ∀ x : E, ∥ f x ∥ ≤ M * ∥ x ∥) :
63
+ {f : E → F} (hf : is_linear_map 𝕜 f) (M : ℝ) (h : ∀ x : E, ∥f x∥ ≤ M * ∥x ∥) :
32
64
is_bounded_linear_map 𝕜 f :=
33
65
⟨ hf, classical.by_cases
34
- (assume : M ≤ 0 , ⟨1 , zero_lt_one, assume x,
35
- le_trans (h x) $ mul_le_mul_of_nonneg_right (le_trans this zero_le_one) (norm_nonneg x)⟩)
66
+ (assume : M ≤ 0 , ⟨1 , zero_lt_one, λ x,
67
+ (h x).trans $ mul_le_mul_of_nonneg_right (this.trans zero_le_one) (norm_nonneg x)⟩)
36
68
(assume : ¬ M ≤ 0 , ⟨M, lt_of_not_ge this , h⟩)⟩
37
69
38
70
/-- A continuous linear map satisfies `is_bounded_linear_map` -/
@@ -59,24 +91,24 @@ linear_map.id.is_linear.with_bound 1 $ by simp [le_refl]
59
91
60
92
lemma fst : is_bounded_linear_map 𝕜 (λ x : E × F, x.1 ) :=
61
93
begin
62
- refine (linear_map.fst 𝕜 E F).is_linear.with_bound 1 (λx , _),
94
+ refine (linear_map.fst 𝕜 E F).is_linear.with_bound 1 (λ x , _),
63
95
rw one_mul,
64
96
exact le_max_left _ _
65
97
end
66
98
67
99
lemma snd : is_bounded_linear_map 𝕜 (λ x : E × F, x.2 ) :=
68
100
begin
69
- refine (linear_map.snd 𝕜 E F).is_linear.with_bound 1 (λx , _),
101
+ refine (linear_map.snd 𝕜 E F).is_linear.with_bound 1 (λ x , _),
70
102
rw one_mul,
71
103
exact le_max_right _ _
72
104
end
73
105
74
- variables { f g : E → F }
106
+ variables {f g : E → F}
75
107
76
108
lemma smul (c : 𝕜) (hf : is_bounded_linear_map 𝕜 f) :
77
- is_bounded_linear_map 𝕜 (λ e, c • f e ) :=
109
+ is_bounded_linear_map 𝕜 (c • f) :=
78
110
let ⟨hlf, M, hMp, hM⟩ := hf in
79
- (c • hlf.mk' f).is_linear.with_bound (∥c∥ * M) $ assume x,
111
+ (c • hlf.mk' f).is_linear.with_bound (∥c∥ * M) $ λ x,
80
112
calc ∥c • f x∥ = ∥c∥ * ∥f x∥ : norm_smul c (f x)
81
113
... ≤ ∥c∥ * (M * ∥x∥) : mul_le_mul_of_nonneg_left (hM _) (norm_nonneg _)
82
114
... = (∥c∥ * M) * ∥x∥ : (mul_assoc _ _ _).symm
@@ -92,7 +124,7 @@ lemma add (hf : is_bounded_linear_map 𝕜 f) (hg : is_bounded_linear_map 𝕜 g
92
124
is_bounded_linear_map 𝕜 (λ e, f e + g e) :=
93
125
let ⟨hlf, Mf, hMfp, hMf⟩ := hf in
94
126
let ⟨hlg, Mg, hMgp, hMg⟩ := hg in
95
- (hlf.mk' _ + hlg.mk' _).is_linear.with_bound (Mf + Mg) $ assume x,
127
+ (hlf.mk' _ + hlg.mk' _).is_linear.with_bound (Mf + Mg) $ λ x,
96
128
calc ∥f x + g x∥ ≤ Mf * ∥x∥ + Mg * ∥x∥ : norm_add_le_of_le (hMf x) (hMg x)
97
129
... ≤ (Mf + Mg) * ∥x∥ : by rw add_mul
98
130
@@ -109,8 +141,8 @@ protected lemma tendsto (x : E) (hf : is_bounded_linear_map 𝕜 f) :
109
141
tendsto f (𝓝 x) (𝓝 (f x)) :=
110
142
let ⟨hf, M, hMp, hM⟩ := hf in
111
143
tendsto_iff_norm_tendsto_zero.2 $
112
- squeeze_zero (assume e, norm_nonneg _)
113
- (assume e,
144
+ squeeze_zero (λ e, norm_nonneg _)
145
+ (λ e,
114
146
calc ∥f e - f x∥ = ∥hf.mk' f (e - x)∥ : by rw (hf.mk' _).map_sub e x; refl
115
147
... ≤ M * ∥e - x∥ : hM (e - x))
116
148
(suffices tendsto (λ (e : E), M * ∥e - x∥) (𝓝 x) (𝓝 (M * 0 )), by simpa,
@@ -148,7 +180,7 @@ variables {ι : Type*} [decidable_eq ι] [fintype ι]
148
180
/-- Taking the cartesian product of two continuous multilinear maps
149
181
is a bounded linear operation. -/
150
182
lemma is_bounded_linear_map_prod_multilinear
151
- {E : ι → Type *} [∀i, normed_group (E i)] [∀i, normed_space 𝕜 (E i)] :
183
+ {E : ι → Type *} [∀ i, normed_group (E i)] [∀ i, normed_space 𝕜 (E i)] :
152
184
is_bounded_linear_map 𝕜
153
185
(λ p : (continuous_multilinear_map 𝕜 E F) × (continuous_multilinear_map 𝕜 E G), p.1 .prod p.2 ) :=
154
186
{ map_add := λ p₁ p₂, by { ext1 m, refl },
@@ -158,9 +190,9 @@ lemma is_bounded_linear_map_prod_multilinear
158
190
apply continuous_multilinear_map.op_norm_le_bound _ (norm_nonneg _) (λ m, _),
159
191
rw [continuous_multilinear_map.prod_apply, norm_prod_le_iff],
160
192
split,
161
- { exact le_trans (p.1 .le_op_norm m)
193
+ { exact (p.1 .le_op_norm m).trans
162
194
(mul_le_mul_of_nonneg_right (norm_fst_le p) (finset.prod_nonneg (λ i hi, norm_nonneg _))) },
163
- { exact le_trans (p.2 .le_op_norm m)
195
+ { exact (p.2 .le_op_norm m).trans
164
196
(mul_le_mul_of_nonneg_right (norm_snd_le p) (finset.prod_nonneg (λ i hi, norm_nonneg _))) },
165
197
end ⟩ }
166
198
@@ -193,11 +225,11 @@ variable (𝕜)
193
225
/-- A map `f : E × F → G` satisfies `is_bounded_bilinear_map 𝕜 f` if it is bilinear and
194
226
continuous. -/
195
227
structure is_bounded_bilinear_map (f : E × F → G) : Prop :=
196
- (add_left : ∀(x₁ x₂ : E) (y : F), f (x₁ + x₂, y) = f (x₁, y) + f (x₂, y))
197
- (smul_left : ∀(c : 𝕜) (x : E) (y : F), f (c • x, y) = c • f (x,y))
198
- (add_right : ∀(x : E) (y₁ y₂ : F), f (x, y₁ + y₂) = f (x, y₁) + f (x, y₂))
199
- (smul_right : ∀(c : 𝕜) (x : E) (y : F), f (x, c • y) = c • f (x,y))
200
- (bound : ∃C> 0 , ∀(x : E) (y : F), ∥f (x, y)∥ ≤ C * ∥x∥ * ∥y∥)
228
+ (add_left : ∀ (x₁ x₂ : E) (y : F), f (x₁ + x₂, y) = f (x₁, y) + f (x₂, y))
229
+ (smul_left : ∀ (c : 𝕜) (x : E) (y : F), f (c • x, y) = c • f (x, y))
230
+ (add_right : ∀ (x : E) (y₁ y₂ : F), f (x, y₁ + y₂) = f (x, y₁) + f (x, y₂))
231
+ (smul_right : ∀ (c : 𝕜) (x : E) (y : F), f (x, c • y) = c • f (x,y))
232
+ (bound : ∃ C > 0 , ∀ (x : E) (y : F), ∥f (x, y)∥ ≤ C * ∥x∥ * ∥y∥)
201
233
202
234
variable {𝕜}
203
235
variable {f : E × F → G}
@@ -227,7 +259,7 @@ protected lemma is_bounded_bilinear_map.is_O' (h : is_bounded_bilinear_map 𝕜
227
259
h.is_O.trans (asymptotics.is_O_fst_prod'.norm_norm.mul asymptotics.is_O_snd_prod'.norm_norm)
228
260
229
261
lemma is_bounded_bilinear_map.map_sub_left (h : is_bounded_bilinear_map 𝕜 f) {x y : E} {z : F} :
230
- f (x - y, z) = f (x, z) - f(y, z) :=
262
+ f (x - y, z) = f (x, z) - f(y, z) :=
231
263
calc f (x - y, z) = f (x + (-1 : 𝕜) • y, z) : by simp [sub_eq_add_neg]
232
264
... = f (x, z) + (-1 : 𝕜) • f (y, z) : by simp only [h.add_left, h.smul_left]
233
265
... = f (x, z) - f (y, z) : by simp [sub_eq_add_neg]
@@ -282,34 +314,34 @@ lemma is_bounded_bilinear_map_mul :
282
314
by simp_rw ← smul_eq_mul; exact is_bounded_bilinear_map_smul
283
315
284
316
lemma is_bounded_bilinear_map_comp :
285
- is_bounded_bilinear_map 𝕜 (λ(p : (E →L[𝕜] F) × (F →L[𝕜] G)), p.2 .comp p.1 ) :=
286
- { add_left := λx ₁ x₂ y, begin
317
+ is_bounded_bilinear_map 𝕜 (λ (p : (E →L[𝕜] F) × (F →L[𝕜] G)), p.2 .comp p.1 ) :=
318
+ { add_left := λ x ₁ x₂ y, begin
287
319
ext z,
288
320
change y (x₁ z + x₂ z) = y (x₁ z) + y (x₂ z),
289
321
rw y.map_add
290
322
end ,
291
- smul_left := λc x y, begin
323
+ smul_left := λ c x y, begin
292
324
ext z,
293
325
change y (c • (x z)) = c • y (x z),
294
326
rw continuous_linear_map.map_smul
295
327
end ,
296
- add_right := λx y₁ y₂, rfl,
297
- smul_right := λc x y, rfl,
298
- bound := ⟨1 , zero_lt_one, λx y, calc
328
+ add_right := λ x y₁ y₂, rfl,
329
+ smul_right := λ c x y, rfl,
330
+ bound := ⟨1 , zero_lt_one, λ x y, calc
299
331
∥continuous_linear_map.comp ((x, y).snd) ((x, y).fst)∥
300
332
≤ ∥y∥ * ∥x∥ : continuous_linear_map.op_norm_comp_le _ _
301
333
... = 1 * ∥x∥ * ∥ y∥ : by ring ⟩ }
302
334
303
- lemma continuous_linear_map.is_bounded_linear_map_comp_left (g : continuous_linear_map 𝕜 F G) :
304
- is_bounded_linear_map 𝕜 (λ(f : E →L[𝕜] F), continuous_linear_map.comp g f) :=
335
+ lemma continuous_linear_map.is_bounded_linear_map_comp_left (g : F →L[𝕜] G) :
336
+ is_bounded_linear_map 𝕜 (λ (f : E →L[𝕜] F), continuous_linear_map.comp g f) :=
305
337
is_bounded_bilinear_map_comp.is_bounded_linear_map_left _
306
338
307
- lemma continuous_linear_map.is_bounded_linear_map_comp_right (f : continuous_linear_map 𝕜 E F) :
308
- is_bounded_linear_map 𝕜 (λ(g : F →L[𝕜] G), continuous_linear_map.comp g f) :=
339
+ lemma continuous_linear_map.is_bounded_linear_map_comp_right (f : E →L[𝕜] F) :
340
+ is_bounded_linear_map 𝕜 (λ (g : F →L[𝕜] G), continuous_linear_map.comp g f) :=
309
341
is_bounded_bilinear_map_comp.is_bounded_linear_map_right _
310
342
311
343
lemma is_bounded_bilinear_map_apply :
312
- is_bounded_bilinear_map 𝕜 (λp : (E →L[𝕜] F) × E, p.1 p.2 ) :=
344
+ is_bounded_bilinear_map 𝕜 (λ p : (E →L[𝕜] F) × E, p.1 p.2 ) :=
313
345
{ add_left := by simp,
314
346
smul_left := by simp,
315
347
add_right := by simp,
@@ -321,25 +353,25 @@ lemma is_bounded_bilinear_map_apply :
321
353
`F`, is a bounded bilinear map. -/
322
354
lemma is_bounded_bilinear_map_smul_right :
323
355
is_bounded_bilinear_map 𝕜
324
- (λp , (continuous_linear_map.smul_right : (E →L[𝕜] 𝕜) → F → (E →L[𝕜] F)) p.1 p.2 ) :=
325
- { add_left := λm ₁ m₂ f, by { ext z, simp [add_smul] },
326
- smul_left := λc m f, by { ext z, simp [mul_smul] },
327
- add_right := λm f₁ f₂, by { ext z, simp [smul_add] },
328
- smul_right := λc m f, by { ext z, simp [smul_smul, mul_comm] },
329
- bound := ⟨1 , zero_lt_one, λm f, by simp⟩ }
356
+ (λ p , (continuous_linear_map.smul_right : (E →L[𝕜] 𝕜) → F → (E →L[𝕜] F)) p.1 p.2 ) :=
357
+ { add_left := λ m ₁ m₂ f, by { ext z, simp [add_smul] },
358
+ smul_left := λ c m f, by { ext z, simp [mul_smul] },
359
+ add_right := λ m f₁ f₂, by { ext z, simp [smul_add] },
360
+ smul_right := λ c m f, by { ext z, simp [smul_smul, mul_comm] },
361
+ bound := ⟨1 , zero_lt_one, λ m f, by simp⟩ }
330
362
331
363
/-- The composition of a continuous linear map with a continuous multilinear map is a bounded
332
364
bilinear operation. -/
333
365
lemma is_bounded_bilinear_map_comp_multilinear {ι : Type *} {E : ι → Type *}
334
- [decidable_eq ι] [fintype ι] [∀i, normed_group (E i)] [∀i, normed_space 𝕜 (E i)] :
366
+ [decidable_eq ι] [fintype ι] [∀ i, normed_group (E i)] [∀ i, normed_space 𝕜 (E i)] :
335
367
is_bounded_bilinear_map 𝕜 (λ p : (F →L[𝕜] G) × (continuous_multilinear_map 𝕜 E F),
336
368
p.1 .comp_continuous_multilinear_map p.2 ) :=
337
369
{ add_left := λ g₁ g₂ f, by { ext m, refl },
338
370
smul_left := λ c g f, by { ext m, refl },
339
371
add_right := λ g f₁ f₂, by { ext m, simp },
340
372
smul_right := λ c g f, by { ext m, simp },
341
373
bound := ⟨1 , zero_lt_one, λ g f, begin
342
- apply continuous_multilinear_map.op_norm_le_bound _ _ (λm , _),
374
+ apply continuous_multilinear_map.op_norm_le_bound _ _ (λ m , _),
343
375
{ apply_rules [mul_nonneg, zero_le_one, norm_nonneg] },
344
376
calc ∥g (f m)∥ ≤ ∥g∥ * ∥f m∥ : g.le_op_norm _
345
377
... ≤ ∥g∥ * (∥f∥ * ∏ i, ∥m i∥) :
@@ -349,29 +381,29 @@ lemma is_bounded_bilinear_map_comp_multilinear {ι : Type*} {E : ι → Type*}
349
381
350
382
/-- Definition of the derivative of a bilinear map `f`, given at a point `p` by
351
383
`q ↦ f(p.1, q.2) + f(q.1, p.2)` as in the standard formula for the derivative of a product.
352
- We define this function here a bounded linear map from `E × F` to `G`. The fact that this
353
- is indeed the derivative of `f` is proved in `is_bounded_bilinear_map.has_fderiv_at` in
354
- `fderiv.lean`-/
355
-
384
+ We define this function here as a linear map `E × F →ₗ[𝕜] G`, then `is_bounded_bilinear_map.deriv`
385
+ strengthens it to a continuous linear map `E × F →L[𝕜] G`.
386
+ ``. -/
356
387
def is_bounded_bilinear_map.linear_deriv (h : is_bounded_bilinear_map 𝕜 f) (p : E × F) :
357
- ( E × F) →ₗ[𝕜] G :=
358
- { to_fun := λq , f (p.1 , q.2 ) + f (q.1 , p.2 ),
359
- map_add' := λq ₁ q₂, begin
388
+ E × F →ₗ[𝕜] G :=
389
+ { to_fun := λ q , f (p.1 , q.2 ) + f (q.1 , p.2 ),
390
+ map_add' := λ q ₁ q₂, begin
360
391
change f (p.1 , q₁.2 + q₂.2 ) + f (q₁.1 + q₂.1 , p.2 ) =
361
392
f (p.1 , q₁.2 ) + f (q₁.1 , p.2 ) + (f (p.1 , q₂.2 ) + f (q₂.1 , p.2 )),
362
393
simp [h.add_left, h.add_right], abel
363
394
end ,
364
- map_smul' := λc q, begin
395
+ map_smul' := λ c q, begin
365
396
change f (p.1 , c • q.2 ) + f (c • q.1 , p.2 ) = c • (f (p.1 , q.2 ) + f (q.1 , p.2 )),
366
397
simp [h.smul_left, h.smul_right, smul_add]
367
398
end }
368
399
369
400
/-- The derivative of a bounded bilinear map at a point `p : E × F`, as a continuous linear map
370
- from `E × F` to `G`. -/
371
- def is_bounded_bilinear_map.deriv (h : is_bounded_bilinear_map 𝕜 f) (p : E × F) : (E × F) →L[𝕜] G :=
401
+ from `E × F` to `G`. The statement that this is indeed the derivative of `f` is
402
+ `is_bounded_bilinear_map.has_fderiv_at` in `analysis.calculus.fderiv`. -/
403
+ def is_bounded_bilinear_map.deriv (h : is_bounded_bilinear_map 𝕜 f) (p : E × F) : E × F →L[𝕜] G :=
372
404
(h.linear_deriv p).mk_continuous_of_exists_bound $ begin
373
405
rcases h.bound with ⟨C, Cpos, hC⟩,
374
- refine ⟨C * ∥p.1 ∥ + C * ∥p.2 ∥, λq , _⟩,
406
+ refine ⟨C * ∥p.1 ∥ + C * ∥p.2 ∥, λ q , _⟩,
375
407
calc ∥f (p.1 , q.2 ) + f (q.1 , p.2 )∥
376
408
≤ C * ∥p.1 ∥ * ∥q.2 ∥ + C * ∥q.1 ∥ * ∥p.2 ∥ : norm_add_le_of_le (hC _ _) (hC _ _)
377
409
... ≤ C * ∥p.1 ∥ * ∥q∥ + C * ∥q∥ * ∥p.2 ∥ : begin
@@ -400,18 +432,18 @@ variables {𝕜}
400
432
/-- Given a bounded bilinear map `f`, the map associating to a point `p` the derivative of `f` at
401
433
`p` is itself a bounded linear map. -/
402
434
lemma is_bounded_bilinear_map.is_bounded_linear_map_deriv (h : is_bounded_bilinear_map 𝕜 f) :
403
- is_bounded_linear_map 𝕜 (λp : E × F, h.deriv p) :=
435
+ is_bounded_linear_map 𝕜 (λ p : E × F, h.deriv p) :=
404
436
begin
405
437
rcases h.bound with ⟨C, Cpos : 0 < C, hC⟩,
406
- refine is_linear_map.with_bound ⟨λp ₁ p₂, _, λc p, _⟩ (C + C) (λp , _),
438
+ refine is_linear_map.with_bound ⟨λ p ₁ p₂, _, λ c p, _⟩ (C + C) (λ p , _),
407
439
{ ext; simp [h.add_left, h.add_right]; abel },
408
440
{ ext; simp [h.smul_left, h.smul_right, smul_add] },
409
441
{ refine continuous_linear_map.op_norm_le_bound _
410
- (mul_nonneg (add_nonneg Cpos.le Cpos.le) (norm_nonneg _)) (λq , _),
442
+ (mul_nonneg (add_nonneg Cpos.le Cpos.le) (norm_nonneg _)) (λ q , _),
411
443
calc ∥f (p.1 , q.2 ) + f (q.1 , p.2 )∥
412
444
≤ C * ∥p.1 ∥ * ∥q.2 ∥ + C * ∥q.1 ∥ * ∥p.2 ∥ : norm_add_le_of_le (hC _ _) (hC _ _)
413
445
... ≤ C * ∥p∥ * ∥q∥ + C * ∥q∥ * ∥p∥ : by apply_rules [add_le_add, mul_le_mul, norm_nonneg,
414
- le_of_lt Cpos, le_refl, le_max_left, le_max_right, mul_nonneg]
446
+ Cpos.le , le_refl, le_max_left, le_max_right, mul_nonneg]
415
447
... = (C + C) * ∥p∥ * ∥q∥ : by ring },
416
448
end
417
449
0 commit comments