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

Commit 6906b6f

Browse files
committed
feat(analysis/normed_space/pi_Lp): add missing nnnorm lemmas (#14221)
This renames `pi_Lp.dist` to `pi_Lp.dist_eq` and `pi_Lp.edist` to `pi_Lp.edist_eq` to match `pi_Lp.norm_eq`. The `nndist` version of these lemmas is new. The `pi_Lp.norm_eq_of_L2` lemma was not stated at the correct generality, and has been moved to an earlier file where doing so is easier. The `nnnorm` version of this lemma is new. Also replaces some `∀` binders with `Π` to match the pretty-printer, and tidies some whitespace.
1 parent ea3009f commit 6906b6f

File tree

2 files changed

+58
-44
lines changed

2 files changed

+58
-44
lines changed

src/analysis/inner_product_space/pi_L2.lean

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -84,21 +84,20 @@ instance pi_Lp.inner_product_space {ι : Type*} [fintype ι] (f : ι → Type*)
8484
⟪x, y⟫ = ∑ i, ⟪x i, y i⟫ :=
8585
rfl
8686

87-
lemma pi_Lp.norm_eq_of_L2 {ι : Type*} [fintype ι] {f : ι → Type*}
88-
[Π i, inner_product_space 𝕜 (f i)] (x : pi_Lp 2 f) :
89-
∥x∥ = sqrt (∑ (i : ι), ∥x i∥ ^ 2) :=
90-
by { rw [pi_Lp.norm_eq_of_nat 2]; simp [sqrt_eq_rpow] }
91-
9287
/-- The standard real/complex Euclidean space, functions on a finite type. For an `n`-dimensional
9388
space use `euclidean_space 𝕜 (fin n)`. -/
9489
@[reducible, nolint unused_arguments]
9590
def euclidean_space (𝕜 : Type*) [is_R_or_C 𝕜]
9691
(n : Type*) [fintype n] : Type* := pi_Lp 2 (λ (i : n), 𝕜)
9792

9893
lemma euclidean_space.norm_eq {𝕜 : Type*} [is_R_or_C 𝕜] {n : Type*} [fintype n]
99-
(x : euclidean_space 𝕜 n) : ∥x∥ = real.sqrt (∑ (i : n), ∥x i∥ ^ 2) :=
94+
(x : euclidean_space 𝕜 n) : ∥x∥ = real.sqrt (∑ i, ∥x i∥ ^ 2) :=
10095
pi_Lp.norm_eq_of_L2 x
10196

97+
lemma euclidean_space.nnnorm_eq {𝕜 : Type*} [is_R_or_C 𝕜] {n : Type*} [fintype n]
98+
(x : euclidean_space 𝕜 n) : ∥x∥₊ = nnreal.sqrt (∑ i, ∥x i∥₊ ^ 2) :=
99+
pi_Lp.nnnorm_eq_of_L2 x
100+
102101
variables [fintype ι]
103102

104103
section

src/analysis/normed_space/pi_Lp.lean

Lines changed: 53 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ different distances. -/
6868
@[nolint unused_arguments]
6969
def pi_Lp {ι : Type*} (p : ℝ) (α : ι → Type*) : Type* := Π (i : ι), α i
7070

71-
instance {ι : Type*} (p : ℝ) (α : ι → Type*) [ i, inhabited (α i)] : inhabited (pi_Lp p α) :=
71+
instance {ι : Type*} (p : ℝ) (α : ι → Type*) [Π i, inhabited (α i)] : inhabited (pi_Lp p α) :=
7272
⟨λ i, default⟩
7373

7474
instance fact_one_le_one_real : fact ((1:ℝ) ≤ 1) := ⟨rfl.le⟩
@@ -101,7 +101,7 @@ from the edistance (which is equal to it, but not defeq). See Note [forgetful in
101101
explaining why having definitionally the right uniformity is often important.
102102
-/
103103

104-
variables [ i, emetric_space (α i)] [ i, pseudo_emetric_space (β i)] [fintype ι]
104+
variables [Π i, emetric_space (α i)] [Π i, pseudo_emetric_space (β i)] [fintype ι]
105105
include fact_one_le_p
106106

107107
/-- Endowing the space `pi_Lp p β` with the `L^p` pseudoedistance. This definition is not
@@ -112,20 +112,20 @@ the product one, and then register an instance in which we replace the uniform s
112112
product one using this pseudoemetric space and `pseudo_emetric_space.replace_uniformity`. -/
113113
def pseudo_emetric_aux : pseudo_emetric_space (pi_Lp p β) :=
114114
have pos : 0 < p := lt_of_lt_of_le zero_lt_one fact_one_le_p.out,
115-
{ edist := λ f g, (∑ (i : ι), (edist (f i) (g i)) ^ p) ^ (1/p),
115+
{ edist := λ f g, (∑ i, edist (f i) (g i) ^ p) ^ (1/p),
116116
edist_self := λ f, by simp [edist, ennreal.zero_rpow_of_pos pos,
117117
ennreal.zero_rpow_of_pos (inv_pos.2 pos)],
118118
edist_comm := λ f g, by simp [edist, edist_comm],
119119
edist_triangle := λ f g h, calc
120-
(∑ (i : ι), edist (f i) (h i) ^ p) ^ (1 / p) ≤
121-
(∑ (i : ι), (edist (f i) (g i) + edist (g i) (h i)) ^ p) ^ (1 / p) :
120+
(∑ i, edist (f i) (h i) ^ p) ^ (1 / p) ≤
121+
(∑ i, (edist (f i) (g i) + edist (g i) (h i)) ^ p) ^ (1 / p) :
122122
begin
123123
apply ennreal.rpow_le_rpow _ (one_div_nonneg.2 $ le_of_lt pos),
124124
refine finset.sum_le_sum (λ i hi, _),
125125
exact ennreal.rpow_le_rpow (edist_triangle _ _ _) (le_trans zero_le_one fact_one_le_p.out)
126126
end
127127
... ≤
128-
(∑ (i : ι), edist (f i) (g i) ^ p) ^ (1 / p) + (∑ (i : ι), edist (g i) (h i) ^ p) ^ (1 / p) :
128+
(∑ i, edist (f i) (g i) ^ p) ^ (1 / p) + (∑ i, edist (g i) (h i) ^ p) ^ (1 / p) :
129129
ennreal.Lp_add_le _ _ _ fact_one_le_p.out }
130130

131131
/-- Endowing the space `pi_Lp p α` with the `L^p` edistance. This definition is not satisfactory,
@@ -139,7 +139,7 @@ def emetric_aux : emetric_space (pi_Lp p α) :=
139139
begin
140140
have pos : 0 < p := lt_of_lt_of_le zero_lt_one fact_one_le_p.out,
141141
letI h := pseudo_emetric_aux p α,
142-
have h : edist f g = (∑ (i : ι), (edist (f i) (g i)) ^ p) ^ (1/p) := rfl,
142+
have h : edist f g = (∑ i, (edist (f i) (g i)) ^ p) ^ (1/p) := rfl,
143143
simp [h, ennreal.rpow_eq_zero_iff, pos, asymm pos, finset.sum_eq_zero_iff_of_nonneg] at hfg,
144144
exact funext hfg
145145
end,
@@ -158,7 +158,7 @@ begin
158158
calc
159159
edist (x i) (y i) = (edist (x i) (y i) ^ p) ^ (1/p) :
160160
by simp [← ennreal.rpow_mul, cancel, -one_div]
161-
... ≤ (∑ (i : ι), edist (x i) (y i) ^ p) ^ (1 / p) :
161+
... ≤ (∑ i, edist (x i) (y i) ^ p) ^ (1 / p) :
162162
begin
163163
apply ennreal.rpow_le_rpow _ (one_div_nonneg.2 $ le_of_lt pos),
164164
exact finset.single_le_sum (λ i hi, (bot_le : (0 : ℝ≥0∞) ≤ _)) (finset.mem_univ i)
@@ -173,8 +173,8 @@ begin
173173
have cancel : p * (1/p) = 1 := mul_div_cancel' 1 (ne_of_gt pos),
174174
assume x y,
175175
simp [edist, -one_div],
176-
calc (∑ (i : ι), edist (x i) (y i) ^ p) ^ (1 / p) ≤
177-
(∑ (i : ι), edist (pi_Lp.equiv p β x) (pi_Lp.equiv p β y) ^ p) ^ (1 / p) :
176+
calc (∑ i, edist (x i) (y i) ^ p) ^ (1 / p) ≤
177+
(∑ i, edist (pi_Lp.equiv p β x) (pi_Lp.equiv p β y) ^ p) ^ (1 / p) :
178178
begin
179179
apply ennreal.rpow_le_rpow _ nonneg,
180180
apply finset.sum_le_sum (λ i hi, _),
@@ -208,101 +208,116 @@ end
208208

209209
/-! ### Instances on finite `L^p` products -/
210210

211-
instance uniform_space [ i, uniform_space (β i)] : uniform_space (pi_Lp p β) :=
211+
instance uniform_space [Π i, uniform_space (β i)] : uniform_space (pi_Lp p β) :=
212212
Pi.uniform_space _
213213

214214
variable [fintype ι]
215215
include fact_one_le_p
216216

217217
/-- pseudoemetric space instance on the product of finitely many pseudoemetric spaces, using the
218218
`L^p` pseudoedistance, and having as uniformity the product uniformity. -/
219-
instance [ i, pseudo_emetric_space (β i)] : pseudo_emetric_space (pi_Lp p β) :=
219+
instance [Π i, pseudo_emetric_space (β i)] : pseudo_emetric_space (pi_Lp p β) :=
220220
(pseudo_emetric_aux p β).replace_uniformity (aux_uniformity_eq p β).symm
221221

222222
/-- emetric space instance on the product of finitely many emetric spaces, using the `L^p`
223223
edistance, and having as uniformity the product uniformity. -/
224-
instance [ i, emetric_space (α i)] : emetric_space (pi_Lp p α) :=
224+
instance [Π i, emetric_space (α i)] : emetric_space (pi_Lp p α) :=
225225
(emetric_aux p α).replace_uniformity (aux_uniformity_eq p α).symm
226226

227227
omit fact_one_le_p
228-
protected lemma edist {p : ℝ} [fact (1 ≤ p)] {β : ι → Type*}
229-
[ i, pseudo_emetric_space (β i)] (x y : pi_Lp p β) :
230-
edist x y = (∑ (i : ι), (edist (x i) (y i)) ^ p) ^ (1/p) := rfl
228+
lemma edist_eq {p : ℝ} [fact (1 ≤ p)] {β : ι → Type*}
229+
[Π i, pseudo_emetric_space (β i)] (x y : pi_Lp p β) :
230+
edist x y = (∑ i, edist (x i) (y i) ^ p) ^ (1/p) := rfl
231231
include fact_one_le_p
232232

233233
/-- pseudometric space instance on the product of finitely many psuedometric spaces, using the
234234
`L^p` distance, and having as uniformity the product uniformity. -/
235-
instance [ i, pseudo_metric_space (β i)] : pseudo_metric_space (pi_Lp p β) :=
235+
instance [Π i, pseudo_metric_space (β i)] : pseudo_metric_space (pi_Lp p β) :=
236236
begin
237237
/- we construct the instance from the pseudo emetric space instance to avoid checking again that
238238
the uniformity is the same as the product uniformity, but we register nevertheless a nice formula
239239
for the distance -/
240240
have pos : 0 < p := lt_of_lt_of_le zero_lt_one fact_one_le_p.out,
241241
refine pseudo_emetric_space.to_pseudo_metric_space_of_dist
242-
(λf g, (∑ (i : ι), (dist (f i) (g i)) ^ p) ^ (1/p)) (λ f g, _) (λ f g, _),
243-
{ simp [pi_Lp.edist, ennreal.rpow_eq_top_iff, asymm pos, pos,
242+
(λf g, (∑ i, dist (f i) (g i) ^ p) ^ (1/p)) (λ f g, _) (λ f g, _),
243+
{ simp [pi_Lp.edist_eq, ennreal.rpow_eq_top_iff, asymm pos, pos,
244244
ennreal.sum_eq_top_iff, edist_ne_top] },
245245
{ have A : ∀ (i : ι), i ∈ (finset.univ : finset ι) → edist (f i) (g i) ^ p ≠ ⊤ :=
246246
λ i hi, by simp [lt_top_iff_ne_top, edist_ne_top, le_of_lt pos],
247-
simp [dist, -one_div, pi_Lp.edist, ← ennreal.to_real_rpow,
247+
simp [dist, -one_div, pi_Lp.edist_eq, ← ennreal.to_real_rpow,
248248
ennreal.to_real_sum A, dist_edist] }
249249
end
250250

251251
/-- metric space instance on the product of finitely many metric spaces, using the `L^p` distance,
252252
and having as uniformity the product uniformity. -/
253-
instance [ i, metric_space (α i)] : metric_space (pi_Lp p α) :=
253+
instance [Π i, metric_space (α i)] : metric_space (pi_Lp p α) :=
254254
begin
255255
/- we construct the instance from the emetric space instance to avoid checking again that the
256256
uniformity is the same as the product uniformity, but we register nevertheless a nice formula
257257
for the distance -/
258258
have pos : 0 < p := lt_of_lt_of_le zero_lt_one fact_one_le_p.out,
259259
refine emetric_space.to_metric_space_of_dist
260-
(λf g, (∑ (i : ι), (dist (f i) (g i)) ^ p) ^ (1/p)) (λ f g, _) (λ f g, _),
261-
{ simp [pi_Lp.edist, ennreal.rpow_eq_top_iff, asymm pos, pos,
260+
(λf g, (∑ i, dist (f i) (g i) ^ p) ^ (1/p)) (λ f g, _) (λ f g, _),
261+
{ simp [pi_Lp.edist_eq, ennreal.rpow_eq_top_iff, asymm pos, pos,
262262
ennreal.sum_eq_top_iff, edist_ne_top] },
263263
{ have A : ∀ (i : ι), i ∈ (finset.univ : finset ι) → edist (f i) (g i) ^ p ≠ ⊤ :=
264264
λ i hi, by simp [edist_ne_top, pos.le],
265-
simp [dist, -one_div, pi_Lp.edist, ← ennreal.to_real_rpow,
265+
simp [dist, -one_div, pi_Lp.edist_eq, ← ennreal.to_real_rpow,
266266
ennreal.to_real_sum A, dist_edist] }
267267
end
268268

269269
omit fact_one_le_p
270-
protected lemma dist {p : ℝ} [fact (1 ≤ p)] {β : ι → Type*}
271-
[∀ i, pseudo_metric_space (β i)] (x y : pi_Lp p β) :
272-
dist x y = (∑ (i : ι), (dist (x i) (y i)) ^ p) ^ (1/p) := rfl
270+
lemma dist_eq {p : ℝ} [fact (1 ≤ p)] {β : ι → Type*}
271+
[Π i, pseudo_metric_space (β i)] (x y : pi_Lp p β) :
272+
dist x y = (∑ i : ι, dist (x i) (y i) ^ p) ^ (1/p) := rfl
273+
274+
lemma nndist_eq {p : ℝ} [fact (1 ≤ p)] {β : ι → Type*}
275+
[Π i, pseudo_metric_space (β i)] (x y : pi_Lp p β) :
276+
nndist x y = (∑ i : ι, nndist (x i) (y i) ^ p) ^ (1/p) :=
277+
subtype.ext $ by { push_cast, exact dist_eq _ _ }
278+
273279
include fact_one_le_p
274280

275281
/-- seminormed group instance on the product of finitely many normed groups, using the `L^p`
276282
norm. -/
277-
instance semi_normed_group [i, semi_normed_group (β i)] : semi_normed_group (pi_Lp p β) :=
278-
{ norm := λf, (∑ (i : ι), norm (f i) ^ p) ^ (1/p),
279-
dist_eq := λ x y, by { simp [pi_Lp.dist, dist_eq_norm, sub_eq_add_neg] },
283+
instance semi_normed_group [Π i, semi_normed_group (β i)] : semi_normed_group (pi_Lp p β) :=
284+
{ norm := λf, (∑ i, ∥f i ^ p) ^ (1/p),
285+
dist_eq := λ x y, by simp [pi_Lp.dist_eq, dist_eq_norm, sub_eq_add_neg],
280286
.. pi.add_comm_group }
281287

282288
/-- normed group instance on the product of finitely many normed groups, using the `L^p` norm. -/
283-
instance normed_group [i, normed_group (α i)] : normed_group (pi_Lp p α) :=
289+
instance normed_group [Π i, normed_group (α i)] : normed_group (pi_Lp p α) :=
284290
{ ..pi_Lp.semi_normed_group p α }
285291

286292
omit fact_one_le_p
287293
lemma norm_eq {p : ℝ} [fact (1 ≤ p)] {β : ι → Type*}
288-
[i, semi_normed_group (β i)] (f : pi_Lp p β) :
289-
∥f∥ = (∑ (i : ι), ∥f i∥ ^ p) ^ (1/p) := rfl
294+
[Π i, semi_normed_group (β i)] (f : pi_Lp p β) :
295+
∥f∥ = (∑ i, ∥f i∥ ^ p) ^ (1/p) := rfl
290296

291297
lemma nnnorm_eq {p : ℝ} [fact (1 ≤ p)] {β : ι → Type*}
292-
[i, semi_normed_group (β i)] (f : pi_Lp p β) :
293-
∥f∥₊ = (∑ (i : ι), ∥f i∥₊ ^ p) ^ (1/p) :=
298+
[Π i, semi_normed_group (β i)] (f : pi_Lp p β) :
299+
∥f∥₊ = (∑ i, ∥f i∥₊ ^ p) ^ (1/p) :=
294300
by { ext, simp [nnreal.coe_sum, norm_eq] }
295301

296302
lemma norm_eq_of_nat {p : ℝ} [fact (1 ≤ p)] {β : ι → Type*}
297-
[i, semi_normed_group (β i)] (n : ℕ) (h : p = n) (f : pi_Lp p β) :
298-
∥f∥ = (∑ (i : ι), ∥f i∥ ^ n) ^ (1/(n : ℝ)) :=
303+
[Π i, semi_normed_group (β i)] (n : ℕ) (h : p = n) (f : pi_Lp p β) :
304+
∥f∥ = (∑ i, ∥f i∥ ^ n) ^ (1/(n : ℝ)) :=
299305
by simp [norm_eq, h, real.sqrt_eq_rpow, ←real.rpow_nat_cast]
306+
307+
lemma norm_eq_of_L2 {β : ι → Type*} [Π i, semi_normed_group (β i)] (x : pi_Lp 2 β) :
308+
∥x∥ = sqrt (∑ (i : ι), ∥x i∥ ^ 2) :=
309+
by { rw [norm_eq_of_nat 2]; simp [sqrt_eq_rpow] }
310+
311+
lemma nnnorm_eq_of_L2 {β : ι → Type*} [Π i, semi_normed_group (β i)] (x : pi_Lp 2 β) :
312+
∥x∥₊ = nnreal.sqrt (∑ (i : ι), ∥x i∥₊ ^ 2) :=
313+
subtype.ext $ by { push_cast, exact norm_eq_of_L2 x }
314+
300315
include fact_one_le_p
301316

302317
variables (𝕜 : Type*) [normed_field 𝕜]
303318

304319
/-- The product of finitely many normed spaces is a normed space, with the `L^p` norm. -/
305-
instance normed_space [i, semi_normed_group (β i)] [i, normed_space 𝕜 (β i)] :
320+
instance normed_space [Π i, semi_normed_group (β i)] [Π i, normed_space 𝕜 (β i)] :
306321
normed_space 𝕜 (pi_Lp p β) :=
307322
{ norm_smul_le :=
308323
begin

0 commit comments

Comments
 (0)