Skip to content
This repository was archived by the owner on Jul 24, 2024. It is now read-only.

Commit ae1c7ee

Browse files
committed
docs(analysis/normed_space/bounded_linear_map): add module docstring (#8263)
1 parent 9fa82b0 commit ae1c7ee

File tree

1 file changed

+95
-63
lines changed

1 file changed

+95
-63
lines changed

src/analysis/normed_space/bounded_linear_maps.lean

Lines changed: 95 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -2,37 +2,69 @@
22
Copyright (c) 2018 Patrick Massot. All rights reserved.
33
Released under Apache 2.0 license as described in the file LICENSE.
44
Authors: Patrick Massot, Johannes Hölzl
5-
6-
Continuous linear functions -- functions between normed vector spaces which are bounded and linear.
75
-/
86
import analysis.normed_space.multilinear
97

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+
1043
noncomputable theory
1144
open_locale classical big_operators topological_space
1245

13-
open filter (tendsto)
14-
open metric
46+
open filter (tendsto) metric
1547

1648
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]
2052

2153

2254
/-- 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`. -/
2456
structure is_bounded_linear_map (𝕜 : Type*) [normed_field 𝕜]
2557
{E : Type*} [normed_group E] [normed_space 𝕜 E]
2658
{F : Type*} [normed_group F] [normed_space 𝕜 F] (f : E → F)
2759
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∥)
2961

3062
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∥) :
3264
is_bounded_linear_map 𝕜 f :=
3365
⟨ 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)⟩)
3668
(assume : ¬ M ≤ 0, ⟨M, lt_of_not_ge this, h⟩)⟩
3769

3870
/-- 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]
5991

6092
lemma fst : is_bounded_linear_map 𝕜 (λ x : E × F, x.1) :=
6193
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, _),
6395
rw one_mul,
6496
exact le_max_left _ _
6597
end
6698

6799
lemma snd : is_bounded_linear_map 𝕜 (λ x : E × F, x.2) :=
68100
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, _),
70102
rw one_mul,
71103
exact le_max_right _ _
72104
end
73105

74-
variables { f g : E → F }
106+
variables {f g : E → F}
75107

76108
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) :=
78110
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,
80112
calc ∥c • f x∥ = ∥c∥ * ∥f x∥ : norm_smul c (f x)
81113
... ≤ ∥c∥ * (M * ∥x∥) : mul_le_mul_of_nonneg_left (hM _) (norm_nonneg _)
82114
... = (∥c∥ * M) * ∥x∥ : (mul_assoc _ _ _).symm
@@ -92,7 +124,7 @@ lemma add (hf : is_bounded_linear_map 𝕜 f) (hg : is_bounded_linear_map 𝕜 g
92124
is_bounded_linear_map 𝕜 (λ e, f e + g e) :=
93125
let ⟨hlf, Mf, hMfp, hMf⟩ := hf in
94126
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,
96128
calc ∥f x + g x∥ ≤ Mf * ∥x∥ + Mg * ∥x∥ : norm_add_le_of_le (hMf x) (hMg x)
97129
... ≤ (Mf + Mg) * ∥x∥ : by rw add_mul
98130

@@ -109,8 +141,8 @@ protected lemma tendsto (x : E) (hf : is_bounded_linear_map 𝕜 f) :
109141
tendsto f (𝓝 x) (𝓝 (f x)) :=
110142
let ⟨hf, M, hMp, hM⟩ := hf in
111143
tendsto_iff_norm_tendsto_zero.2 $
112-
squeeze_zero (assume e, norm_nonneg _)
113-
(assume e,
144+
squeeze_zero (λ e, norm_nonneg _)
145+
(λ e,
114146
calc ∥f e - f x∥ = ∥hf.mk' f (e - x)∥ : by rw (hf.mk' _).map_sub e x; refl
115147
... ≤ M * ∥e - x∥ : hM (e - x))
116148
(suffices tendsto (λ (e : E), M * ∥e - x∥) (𝓝 x) (𝓝 (M * 0)), by simpa,
@@ -148,7 +180,7 @@ variables {ι : Type*} [decidable_eq ι] [fintype ι]
148180
/-- Taking the cartesian product of two continuous multilinear maps
149181
is a bounded linear operation. -/
150182
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)] :
152184
is_bounded_linear_map 𝕜
153185
(λ p : (continuous_multilinear_map 𝕜 E F) × (continuous_multilinear_map 𝕜 E G), p.1.prod p.2) :=
154186
{ map_add := λ p₁ p₂, by { ext1 m, refl },
@@ -158,9 +190,9 @@ lemma is_bounded_linear_map_prod_multilinear
158190
apply continuous_multilinear_map.op_norm_le_bound _ (norm_nonneg _) (λ m, _),
159191
rw [continuous_multilinear_map.prod_apply, norm_prod_le_iff],
160192
split,
161-
{ exact le_trans (p.1.le_op_norm m)
193+
{ exact (p.1.le_op_norm m).trans
162194
(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
164196
(mul_le_mul_of_nonneg_right (norm_snd_le p) (finset.prod_nonneg (λ i hi, norm_nonneg _))) },
165197
end⟩ }
166198

@@ -193,11 +225,11 @@ variable (𝕜)
193225
/-- A map `f : E × F → G` satisfies `is_bounded_bilinear_map 𝕜 f` if it is bilinear and
194226
continuous. -/
195227
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∥)
201233

202234
variable {𝕜}
203235
variable {f : E × F → G}
@@ -227,7 +259,7 @@ protected lemma is_bounded_bilinear_map.is_O' (h : is_bounded_bilinear_map 𝕜
227259
h.is_O.trans (asymptotics.is_O_fst_prod'.norm_norm.mul asymptotics.is_O_snd_prod'.norm_norm)
228260

229261
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) :=
231263
calc f (x - y, z) = f (x + (-1 : 𝕜) • y, z) : by simp [sub_eq_add_neg]
232264
... = f (x, z) + (-1 : 𝕜) • f (y, z) : by simp only [h.add_left, h.smul_left]
233265
... = f (x, z) - f (y, z) : by simp [sub_eq_add_neg]
@@ -282,34 +314,34 @@ lemma is_bounded_bilinear_map_mul :
282314
by simp_rw ← smul_eq_mul; exact is_bounded_bilinear_map_smul
283315

284316
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
287319
ext z,
288320
change y (x₁ z + x₂ z) = y (x₁ z) + y (x₂ z),
289321
rw y.map_add
290322
end,
291-
smul_left := λc x y, begin
323+
smul_left := λ c x y, begin
292324
ext z,
293325
change y (c • (x z)) = c • y (x z),
294326
rw continuous_linear_map.map_smul
295327
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
299331
∥continuous_linear_map.comp ((x, y).snd) ((x, y).fst)∥
300332
≤ ∥y∥ * ∥x∥ : continuous_linear_map.op_norm_comp_le _ _
301333
... = 1 * ∥x∥ * ∥ y∥ : by ring ⟩ }
302334

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) :=
305337
is_bounded_bilinear_map_comp.is_bounded_linear_map_left _
306338

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) :=
309341
is_bounded_bilinear_map_comp.is_bounded_linear_map_right _
310342

311343
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) :=
313345
{ add_left := by simp,
314346
smul_left := by simp,
315347
add_right := by simp,
@@ -321,25 +353,25 @@ lemma is_bounded_bilinear_map_apply :
321353
`F`, is a bounded bilinear map. -/
322354
lemma is_bounded_bilinear_map_smul_right :
323355
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⟩ }
330362

331363
/-- The composition of a continuous linear map with a continuous multilinear map is a bounded
332364
bilinear operation. -/
333365
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)] :
335367
is_bounded_bilinear_map 𝕜 (λ p : (F →L[𝕜] G) × (continuous_multilinear_map 𝕜 E F),
336368
p.1.comp_continuous_multilinear_map p.2) :=
337369
{ add_left := λ g₁ g₂ f, by { ext m, refl },
338370
smul_left := λ c g f, by { ext m, refl },
339371
add_right := λ g f₁ f₂, by { ext m, simp },
340372
smul_right := λ c g f, by { ext m, simp },
341373
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, _),
343375
{ apply_rules [mul_nonneg, zero_le_one, norm_nonneg] },
344376
calc ∥g (f m)∥ ≤ ∥g∥ * ∥f m∥ : g.le_op_norm _
345377
... ≤ ∥g∥ * (∥f∥ * ∏ i, ∥m i∥) :
@@ -349,29 +381,29 @@ lemma is_bounded_bilinear_map_comp_multilinear {ι : Type*} {E : ι → Type*}
349381

350382
/-- Definition of the derivative of a bilinear map `f`, given at a point `p` by
351383
`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+
``. -/
356387
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
360391
change f (p.1, q₁.2 + q₂.2) + f (q₁.1 + q₂.1, p.2) =
361392
f (p.1, q₁.2) + f (q₁.1, p.2) + (f (p.1, q₂.2) + f (q₂.1, p.2)),
362393
simp [h.add_left, h.add_right], abel
363394
end,
364-
map_smul' := λc q, begin
395+
map_smul' := λ c q, begin
365396
change f (p.1, c • q.2) + f (c • q.1, p.2) = c • (f (p.1, q.2) + f (q.1, p.2)),
366397
simp [h.smul_left, h.smul_right, smul_add]
367398
end }
368399

369400
/-- 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 :=
372404
(h.linear_deriv p).mk_continuous_of_exists_bound $ begin
373405
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, _⟩,
375407
calc ∥f (p.1, q.2) + f (q.1, p.2)∥
376408
≤ C * ∥p.1∥ * ∥q.2∥ + C * ∥q.1∥ * ∥p.2∥ : norm_add_le_of_le (hC _ _) (hC _ _)
377409
... ≤ C * ∥p.1∥ * ∥q∥ + C * ∥q∥ * ∥p.2∥ : begin
@@ -400,18 +432,18 @@ variables {𝕜}
400432
/-- Given a bounded bilinear map `f`, the map associating to a point `p` the derivative of `f` at
401433
`p` is itself a bounded linear map. -/
402434
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) :=
404436
begin
405437
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, _),
407439
{ ext; simp [h.add_left, h.add_right]; abel },
408440
{ ext; simp [h.smul_left, h.smul_right, smul_add] },
409441
{ 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, _),
411443
calc ∥f (p.1, q.2) + f (q.1, p.2)∥
412444
≤ C * ∥p.1∥ * ∥q.2∥ + C * ∥q.1∥ * ∥p.2∥ : norm_add_le_of_le (hC _ _) (hC _ _)
413445
... ≤ 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]
415447
... = (C + C) * ∥p∥ * ∥q∥ : by ring },
416448
end
417449

0 commit comments

Comments
 (0)