@@ -11,20 +11,58 @@ import analysis.convex.cone
11
11
# Hahn-Banach theorem
12
12
13
13
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 `ℂ` .
15
15
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 `ℂ`.
17
19
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 `𝕜`).
19
23
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.
21
31
32
+ In particular, this is satisfied by `ℝ` and `ℂ`.
22
33
-/
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
23
55
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
25
63
variables {E : Type *} [normed_group E] [normed_space ℝ E]
26
64
27
- /-- Hahn-Banach theorem for continuous linear functions over ℝ . -/
65
+ /-- Hahn-Banach theorem for continuous linear functions over `ℝ` . -/
28
66
theorem exists_extension_norm_eq (p : subspace ℝ E) (f : p →L[ℝ] ℝ) :
29
67
∃ g : E →L[ℝ] ℝ, (∀ x : p, g x = f x) ∧ ∥g∥ = ∥f∥ :=
30
68
begin
@@ -44,14 +82,17 @@ begin
44
82
exact mul_le_mul_of_nonneg_left (norm_add_le x y) (norm_nonneg f) }
45
83
end
46
84
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
48
89
49
90
section complex
50
91
variables {F : Type *} [normed_group F] [normed_space ℂ F]
51
92
52
93
-- Inlining the following two definitions causes a type mismatch between
53
94
-- subspace ℝ (semimodule.restrict_scalars ℝ ℂ F) and subspace ℂ F.
54
- /-- Restrict a ℂ -subspace to an ℝ -subspace. -/
95
+ /-- Restrict a `ℂ` -subspace to an `ℝ` -subspace. -/
55
96
noncomputable def restrict_scalars (p : subspace ℂ F) : subspace ℝ F := p.restrict_scalars ℝ ℂ F
56
97
57
98
private lemma apply_real (p : subspace ℂ F) (f' : p →L[ℝ] ℝ) :
@@ -60,7 +101,7 @@ private lemma apply_real (p : subspace ℂ F) (f' : p →L[ℝ] ℝ) :
60
101
61
102
open complex
62
103
63
- /-- Hahn-Banach theorem for continuous linear functions over ℂ . -/
104
+ /-- Hahn-Banach theorem for continuous linear functions over `ℂ` . -/
64
105
theorem complex.exists_extension_norm_eq (p : subspace ℂ F) (f : p →L[ℂ] ℂ) :
65
106
∃ g : F →L[ℂ] ℂ, (∀ x : p, g x = f x) ∧ ∥g∥ = ∥f∥ :=
66
107
begin
@@ -95,48 +136,49 @@ begin
95
136
{ exact f.op_norm_le_bound g.extend_to_ℂ.op_norm_nonneg (λ x, h x ▸ g.extend_to_ℂ.le_op_norm x) },
96
137
end
97
138
139
+ instance complex_has_exists_extension_norm_eq : has_exists_extension_norm_eq ℂ :=
140
+ ⟨by { intros, apply complex.exists_extension_norm_eq }⟩
141
+
98
142
end complex
99
143
100
144
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]
102
147
103
148
open continuous_linear_equiv
104
149
open_locale classical
105
150
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)]
112
153
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
115
156
116
157
/-- 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 :=
119
160
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,
121
164
use g, split,
122
165
{ 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] }
126
169
end
127
170
128
171
/-- Variant of the above theorem, eliminating the hypothesis that `x` be nonzero, and choosing
129
172
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 :=
132
175
begin
133
176
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] },
137
181
{ exact exists_dual_vector x hx }
138
182
end
139
183
140
- -- TODO: These corollaries are also true over ℂ.
141
-
142
184
end dual_vector
0 commit comments