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

Commit f818acb

Browse files
feat(analysis/normed_space): generalize corollaries of Hahn-Banach (#3658)
Co-authored-by: sgouezel <sebastien.gouezel@univ-rennes1.fr>
1 parent f8bf001 commit f818acb

File tree

3 files changed

+99
-49
lines changed

3 files changed

+99
-49
lines changed

src/analysis/normed_space/dual.lean

Lines changed: 22 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,13 @@ import analysis.normed_space.hahn_banach
1111
In this file we define the topological dual of a normed space, and the bounded linear map from
1212
a normed space into its double dual.
1313
14-
We also prove that, for base field the real numbers, this map is an isometry. (TODO: the same for
15-
the complex numbers.)
14+
We also prove that, for base field such as the real or the complex numbers, this map is an isometry.
15+
More generically, this is proved for any field in the class `has_exists_extension_norm_eq`, i.e.,
16+
satisfying the Hahn-Banach theorem.
1617
-/
1718

1819
noncomputable theory
20+
universes u v
1921

2022
namespace normed_space
2123

@@ -59,36 +61,38 @@ linear_map.mk_continuous
5961

6062
end general
6163

62-
section real
63-
variables (E : Type*) [normed_group E] [normed_space ℝ E]
64+
section bidual_isometry
65+
66+
variables {𝕜 : Type v} [nondiscrete_normed_field 𝕜] [normed_algebra ℝ 𝕜]
67+
[has_exists_extension_norm_eq.{u} 𝕜]
68+
{E : Type u} [normed_group E] [normed_space 𝕜 E]
6469

6570
/-- If one controls the norm of every `f x`, then one controls the norm of `x`.
6671
Compare `continuous_linear_map.op_norm_le_bound`. -/
67-
lemma norm_le_dual_bound (x : E) {M : ℝ} (hMp: 0 ≤ M) (hM : ∀ (f: dual E), ∥f x∥ ≤ M * ∥f∥) :
72+
lemma norm_le_dual_bound (x : E) {M : ℝ} (hMp: 0 ≤ M) (hM : ∀ (f : dual 𝕜 E), ∥f x∥ ≤ M * ∥f∥) :
6873
∥x∥ ≤ M :=
6974
begin
7075
classical,
7176
by_cases h : x = 0,
7277
{ simp only [h, hMp, norm_zero] },
73-
{ cases exists_dual_vector x h with f hf,
74-
calc ∥x∥ = f x : hf.2.symm
75-
... ∥f x∥ : le_max_left (f x) (-f x)
78+
{ obtain ⟨f, hf⟩ : ∃ g : E →L[𝕜] 𝕜, _ := exists_dual_vector x h,
79+
calc ∥x∥ = ∥norm' 𝕜 x∥ : (norm_norm' _ _ _).symm
80+
... = ∥f x∥ : by rw hf.2
7681
... ≤ M * ∥f∥ : hM f
77-
... = M : by rw [ hf.1, mul_one ] }
82+
... = M : by rw [hf.1, mul_one] }
7883
end
7984

8085
/-- The inclusion of a real normed space in its double dual is an isometry onto its image.-/
81-
lemma inclusion_in_double_dual_isometry (x : E) : ∥inclusion_in_double_dual E x∥ = ∥x∥ :=
86+
lemma inclusion_in_double_dual_isometry (x : E) : ∥inclusion_in_double_dual 𝕜 E x∥ = ∥x∥ :=
8287
begin
83-
refine le_antisymm_iff.mpr ⟨double_dual_bound ℝ E x, _⟩,
84-
rw continuous_linear_map.norm_def,
85-
apply real.lb_le_Inf _ continuous_linear_map.bounds_nonempty,
86-
intros c,
87-
simpa using norm_le_dual_bound E x,
88+
apply le_antisymm,
89+
{ exact double_dual_bound 𝕜 E x },
90+
{ rw continuous_linear_map.norm_def,
91+
apply real.lb_le_Inf _ continuous_linear_map.bounds_nonempty,
92+
rintros c ⟨hc1, hc2⟩,
93+
exact norm_le_dual_bound x hc1 hc2 },
8894
end
8995

90-
-- TODO: This is also true over ℂ.
91-
92-
end real
96+
end bidual_isometry
9397

9498
end normed_space

src/analysis/normed_space/hahn_banach.lean

Lines changed: 73 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -11,20 +11,58 @@ import analysis.convex.cone
1111
# Hahn-Banach theorem
1212
1313
In this file we prove a version of Hahn-Banach theorem for continuous linear
14-
functions on normed spaces over and .
14+
functions on normed spaces over `ℝ` and `ℂ`.
1515
16-
We also prove a standard corollary, needed for the isometric inclusion in the double dual.
16+
In order to state and prove its corollaries uniformly, we introduce a typeclass
17+
`has_exists_extension_norm_eq` for a field, requiring that a strong version of the
18+
Hahn-Banach theorem holds over this field, and provide instances for `ℝ` and `ℂ`.
1719
18-
## TODO
20+
In this setting, `exists_dual_vector` states that, for any nonzero `x`, there exists a continuous
21+
linear form `g` of norm `1` with `g x = ∥x∥` (where the norm has to be interpreted as an element
22+
of `𝕜`).
1923
20-
Prove more corollaries
24+
-/
25+
26+
universes u v
27+
28+
/--
29+
A field where the Hahn-Banach theorem for continuous linear functions holds. This allows stating
30+
theorems that depend on it uniformly over such fields.
2131
32+
In particular, this is satisfied by `ℝ` and `ℂ`.
2233
-/
34+
class has_exists_extension_norm_eq (𝕜 : Type v) [nondiscrete_normed_field 𝕜] : Prop :=
35+
(exists_extension_norm_eq :
36+
∀ (E : Type u)
37+
[normed_group E] [normed_space 𝕜 E]
38+
(p : subspace 𝕜 E)
39+
(f : p →L[𝕜] 𝕜),
40+
∃ g : E →L[𝕜] 𝕜, (∀ x : p, g x = f x) ∧ ∥g∥ = ∥f∥)
41+
42+
/--
43+
The norm of `x` as an element of `𝕜` (a normed algebra over `ℝ`). This is needed in particular to
44+
state equalities of the form `g x = norm' 𝕜 x` when `g` is a linear function.
45+
46+
For the concrete cases of `ℝ` and `ℂ`, this is just `∥x∥` and `↑∥x∥`, respectively.
47+
-/
48+
noncomputable def norm' (𝕜 : Type*) [nondiscrete_normed_field 𝕜] [normed_algebra ℝ 𝕜]
49+
{E : Type*} [normed_group E] (x : E) : 𝕜 :=
50+
algebra_map ℝ 𝕜 ∥x∥
51+
52+
lemma norm'_def (𝕜 : Type*) [nondiscrete_normed_field 𝕜] [normed_algebra ℝ 𝕜]
53+
{E : Type*} [normed_group E] (x : E) :
54+
norm' 𝕜 x = (algebra_map ℝ 𝕜 ∥x∥) := rfl
2355

24-
section basic
56+
lemma norm_norm'
57+
(𝕜 : Type*) [nondiscrete_normed_field 𝕜] [normed_algebra ℝ 𝕜]
58+
(A : Type*) [normed_group A]
59+
(x : A) : ∥norm' 𝕜 x∥ = ∥x∥ :=
60+
by rw [norm'_def, norm_algebra_map_eq, norm_norm]
61+
62+
section real
2563
variables {E : Type*} [normed_group E] [normed_space ℝ E]
2664

27-
/-- Hahn-Banach theorem for continuous linear functions over . -/
65+
/-- Hahn-Banach theorem for continuous linear functions over `ℝ`. -/
2866
theorem exists_extension_norm_eq (p : subspace ℝ E) (f : p →L[ℝ] ℝ) :
2967
∃ g : E →L[ℝ] ℝ, (∀ x : p, g x = f x) ∧ ∥g∥ = ∥f∥ :=
3068
begin
@@ -44,14 +82,17 @@ begin
4482
exact mul_le_mul_of_nonneg_left (norm_add_le x y) (norm_nonneg f) }
4583
end
4684

47-
end basic
85+
instance real_has_exists_extension_norm_eq : has_exists_extension_norm_eq ℝ :=
86+
by { intros, apply exists_extension_norm_eq }⟩
87+
88+
end real
4889

4990
section complex
5091
variables {F : Type*} [normed_group F] [normed_space ℂ F]
5192

5293
-- Inlining the following two definitions causes a type mismatch between
5394
-- subspace ℝ (semimodule.restrict_scalars ℝ ℂ F) and subspace ℂ F.
54-
/-- Restrict a -subspace to an -subspace. -/
95+
/-- Restrict a `ℂ`-subspace to an `ℝ`-subspace. -/
5596
noncomputable def restrict_scalars (p : subspace ℂ F) : subspace ℝ F := p.restrict_scalars ℝ ℂ F
5697

5798
private lemma apply_real (p : subspace ℂ F) (f' : p →L[ℝ] ℝ) :
@@ -60,7 +101,7 @@ private lemma apply_real (p : subspace ℂ F) (f' : p →L[ℝ] ℝ) :
60101

61102
open complex
62103

63-
/-- Hahn-Banach theorem for continuous linear functions over . -/
104+
/-- Hahn-Banach theorem for continuous linear functions over `ℂ`. -/
64105
theorem complex.exists_extension_norm_eq (p : subspace ℂ F) (f : p →L[ℂ] ℂ) :
65106
∃ g : F →L[ℂ] ℂ, (∀ x : p, g x = f x) ∧ ∥g∥ = ∥f∥ :=
66107
begin
@@ -95,48 +136,49 @@ begin
95136
{ exact f.op_norm_le_bound g.extend_to_ℂ.op_norm_nonneg (λ x, h x ▸ g.extend_to_ℂ.le_op_norm x) },
96137
end
97138

139+
instance complex_has_exists_extension_norm_eq : has_exists_extension_norm_eq ℂ :=
140+
by { intros, apply complex.exists_extension_norm_eq }⟩
141+
98142
end complex
99143

100144
section dual_vector
101-
variables {E : Type*} [normed_group E] [normed_space ℝ E]
145+
variables {𝕜 : Type v} [nondiscrete_normed_field 𝕜] [normed_algebra ℝ 𝕜]
146+
variables {E : Type u} [normed_group E] [normed_space 𝕜 E]
102147

103148
open continuous_linear_equiv
104149
open_locale classical
105150

106-
lemma coord_self' (x : E) (h : x ≠ 0) : (∥x∥ • (coord ℝ x h))
107-
⟨x, submodule.mem_span_singleton_self x⟩ = ∥x∥ :=
108-
calc (∥x∥ • (coord ℝ x h)) ⟨x, submodule.mem_span_singleton_self x⟩
109-
= ∥x∥ • (linear_equiv.coord ℝ E x h) ⟨x, submodule.mem_span_singleton_self x⟩ : rfl
110-
... = ∥x∥ • 1 : by rw linear_equiv.coord_self ℝ E x h
111-
... = ∥x∥ : mul_one _
151+
lemma coord_norm' (x : E) (h : x ≠ 0) : ∥norm' 𝕜 x • coord 𝕜 x h∥ = 1 :=
152+
by rw [norm_smul, norm_norm', coord_norm, mul_inv_cancel (mt norm_eq_zero.mp h)]
112153

113-
lemma coord_norm' (x : E) (h : x ≠ 0) : ∥∥x∥ • coord ℝ x h∥ = 1 :=
114-
by rw [norm_smul, norm_norm, coord_norm, mul_inv_cancel (mt norm_eq_zero.mp h)]
154+
variables [has_exists_extension_norm_eq.{u} 𝕜]
155+
open submodule
115156

116157
/-- Corollary of Hahn-Banach. Given a nonzero element `x` of a normed space, there exists an
117-
element of the dual space, of norm 1, whose value on `x` is `∥x∥`. -/
118-
theorem exists_dual_vector (x : E) (h : x ≠ 0) : ∃ g : E →L[ℝ] ℝ, ∥g∥ = 1 ∧ g x = ∥x∥ :=
158+
element of the dual space, of norm `1`, whose value on `x` is `∥x∥`. -/
159+
theorem exists_dual_vector (x : E) (h : x ≠ 0) : ∃ g : E →L[𝕜] 𝕜, ∥g∥ = 1 ∧ g x = norm' 𝕜 x :=
119160
begin
120-
cases exists_extension_norm_eq (submodule.span ℝ {x}) (∥x∥ • coord ℝ x h) with g hg,
161+
let p : submodule 𝕜 E := span 𝕜 {x},
162+
let f := norm' 𝕜 x • coord 𝕜 x h,
163+
obtain ⟨g, hg⟩ := has_exists_extension_norm_eq.exists_extension_norm_eq E p f,
121164
use g, split,
122165
{ rw [hg.2, coord_norm'] },
123-
{ calc g x = g (⟨x, submodule.mem_span_singleton_self x⟩ : submodule.span {x}) : by simp
124-
... = (∥x∥ • coord x h) (⟨x, submodule.mem_span_singleton_self x⟩ : submodule.span {x}) : by rw ← hg.1
125-
... = ∥x∥ : by rw coord_self' }
166+
{ calc g x = g (⟨x, mem_span_singleton_self x⟩ : span 𝕜 {x}) : by rw coe_mk
167+
... = (norm' 𝕜 x • coord 𝕜 x h) (⟨x, mem_span_singleton_self x⟩ : span 𝕜 {x}) : by rw ← hg.1
168+
... = norm' 𝕜 x : by simp [coord_self] }
126169
end
127170

128171
/-- Variant of the above theorem, eliminating the hypothesis that `x` be nonzero, and choosing
129172
the dual element arbitrarily when `x = 0`. -/
130-
theorem exists_dual_vector' [nontrivial E] (x : E) : ∃ g : E →L[ℝ] ℝ,
131-
∥g∥ = 1 ∧ g x = ∥x∥ :=
173+
theorem exists_dual_vector' [nontrivial E] (x : E) :
174+
∃ g : E →L[𝕜] 𝕜, ∥g∥ = 1 ∧ g x = norm' 𝕜 x :=
132175
begin
133176
by_cases hx : x = 0,
134-
{ rcases exists_ne (0 : E) with ⟨y, hy⟩,
135-
cases exists_dual_vector y hy with g hg,
136-
use g, refine ⟨hg.left, _⟩, simp [hx] },
177+
{ obtain ⟨y, hy⟩ := exists_ne (0 : E),
178+
obtain ⟨g, hg⟩ : ∃ g : E →L[𝕜] 𝕜, ∥g∥ = 1 ∧ g y = norm' 𝕜 y := exists_dual_vector y hy,
179+
refine ⟨g, hg.left, _⟩,
180+
rw [norm'_def, hx, norm_zero, ring_hom.map_zero, continuous_linear_map.map_zero] },
137181
{ exact exists_dual_vector x hx }
138182
end
139183

140-
-- TODO: These corollaries are also true over ℂ.
141-
142184
end dual_vector

src/analysis/normed_space/operator_norm.lean

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -826,6 +826,10 @@ begin
826826
rw this, apply homothety_inverse, exact hx, exact to_span_nonzero_singleton_homothety 𝕜 x h, }
827827
end
828828

829+
lemma coord_self (x : E) (h : x ≠ 0) :
830+
(coord 𝕜 x h) (⟨x, submodule.mem_span_singleton_self x⟩ : submodule.span 𝕜 ({x} : set E)) = 1 :=
831+
linear_equiv.coord_self 𝕜 E x h
832+
829833
variable (E)
830834

831835
/-- The continuous linear equivalences from `E` to itself form a group under composition. -/

0 commit comments

Comments
 (0)