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

Commit ea95523

Browse files
committed
feat(analysis/normed_space/dual): add lemmas, golf (#11132)
* add `polar_univ`, `is_closed_polar`, `polar_gc`, `polar_Union`, `polar_union`, `polar_antitone`, `polar_zero`, `polar_closure`; * extract `polar_ball_subset_closed_ball_div` and `closed_ball_inv_subset_polar_closed_ball` out of the proofs of `polar_closed_ball` and `polar_bounded_of_nhds_zero`; * rename `polar_bounded_of_nhds_zero` to `bounded_polar_of_mem_nhds_zero`, use `metric.bounded`; * use `r⁻¹` instead of `1 / r` in `polar_closed_ball`. This is the simp normal form (though we might want to change this in the future).
1 parent be17b92 commit ea95523

File tree

1 file changed

+89
-34
lines changed

1 file changed

+89
-34
lines changed

src/analysis/normed_space/dual.lean

Lines changed: 89 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ dual
3333
-/
3434

3535
noncomputable theory
36-
open_locale classical
36+
open_locale classical topological_space
3737
universes u v
3838

3939
namespace normed_space
@@ -89,15 +89,15 @@ begin
8989
classical,
9090
by_cases h : x = 0,
9191
{ simp only [h, hMp, norm_zero] },
92-
{ obtain ⟨f, hf⟩ : ∃ g : E →L[𝕜] 𝕜, _ := exists_dual_vector 𝕜 x h,
92+
{ obtain ⟨f, hf₁, hfx⟩ : ∃ f : E →L[𝕜] 𝕜, ∥f∥ = 1 ∧ f x = ∥x∥ := exists_dual_vector 𝕜 x h,
9393
calc ∥x∥ = ∥(∥x∥ : 𝕜)∥ : is_R_or_C.norm_coe_norm.symm
94-
... = ∥f x∥ : by rw hf.2
94+
... = ∥f x∥ : by rw hfx
9595
... ≤ M * ∥f∥ : hM f
96-
... = M : by rw [hf.1, mul_one] }
96+
... = M : by rw [hf, mul_one] }
9797
end
9898

9999
lemma eq_zero_of_forall_dual_eq_zero {x : E} (h : ∀ f : dual 𝕜 E, f x = (0 : 𝕜)) : x = 0 :=
100-
norm_eq_zero.mp (le_antisymm (norm_le_dual_bound 𝕜 x le_rfl (λ f, by simp [h f])) (norm_nonneg _))
100+
norm_le_zero_iff.mp (norm_le_dual_bound 𝕜 x le_rfl (λ f, by simp [h f]))
101101

102102
lemma eq_zero_iff_forall_dual_eq_zero (x : E) : x = 0 ↔ ∀ g : dual 𝕜 E, g x = 0 :=
103103
⟨λ hx, by simp [hx], λ h, eq_zero_of_forall_dual_eq_zero 𝕜 h⟩
@@ -137,9 +137,6 @@ def polar (𝕜 : Type*) [nondiscrete_normed_field 𝕜]
137137
{E : Type*} [normed_group E] [normed_space 𝕜 E] (s : set E) : set (dual 𝕜 E) :=
138138
{x' : dual 𝕜 E | ∀ z ∈ s, ∥ x' z ∥ ≤ 1}
139139

140-
open metric set normed_space
141-
open_locale topological_space
142-
143140
variables (𝕜 : Type*) [nondiscrete_normed_field 𝕜]
144141
variables {E : Type*} [normed_group E] [normed_space 𝕜 E]
145142

@@ -148,11 +145,60 @@ variables {E : Type*} [normed_group E] [normed_space 𝕜 E]
148145
λ _ _, by simp only [zero_le_one, continuous_linear_map.zero_apply, norm_zero]
149146

150147
lemma polar_eq_Inter (s : set E) :
151-
polar 𝕜 s = ⋂ z ∈ s, {x' : dual 𝕜 E | ∥ x' z ∥ ≤ 1} :=
152-
by { ext, simp only [polar, mem_bInter_iff, mem_set_of_eq], }
148+
polar 𝕜 s = ⋂ z ∈ s, {x' : dual 𝕜 E | ∥x' z∥ ≤ 1} :=
149+
by simp only [polar, set_of_forall]
150+
151+
@[simp] lemma polar_univ : polar 𝕜 (univ : set E) = {0} :=
152+
begin
153+
refine eq_singleton_iff_unique_mem.2 ⟨zero_mem_polar _ _, λ x' hx', _⟩,
154+
ext x,
155+
refine norm_le_zero_iff.1 (le_of_forall_le_of_dense $ λ ε hε, _),
156+
rcases normed_field.exists_norm_lt 𝕜 hε with ⟨c, hc, hcε⟩,
157+
calc ∥x' x∥ = ∥c∥ * ∥x' (c⁻¹ • x)∥ :
158+
by rw [x'.map_smul, norm_smul, normed_field.norm_inv,
159+
mul_inv_cancel_left₀ hc.ne']
160+
... ≤ ε * 1 : mul_le_mul hcε.le (hx' _ trivial) (norm_nonneg _) hε.le
161+
... = ε : mul_one _
162+
end
163+
164+
lemma is_closed_polar (s : set E) : is_closed (polar 𝕜 s) :=
165+
begin
166+
simp only [polar_eq_Inter, ← continuous_linear_map.apply_apply _ (_ : dual 𝕜 E)],
167+
refine is_closed_bInter (λ z hz, _),
168+
exact is_closed_Iic.preimage (continuous_linear_map.apply 𝕜 𝕜 z).continuous.norm
169+
end
170+
171+
variable (E)
172+
173+
/-- `polar 𝕜 : set E → set (normed_space.dual 𝕜 E)` forms an order-reversing Galois connection with
174+
a similarly defined map `set (normed_space.dual 𝕜 E) → set E`. We use `order_dual.to_dual` and
175+
`order_dual.of_dual` to express that `polar` is order-reversing. Instead of defining the dual
176+
operation `unpolar s := {x : E | ∀ x' ∈ s, ∥x' x∥ ≤ 1}` we apply `polar 𝕜` again, then pull the set
177+
from the double dual space to the original space using `normed_space.inclusion_in_double_dual`. -/
178+
lemma polar_gc :
179+
galois_connection (order_dual.to_dual ∘ polar 𝕜)
180+
(λ s, inclusion_in_double_dual 𝕜 E ⁻¹' (polar 𝕜 $ order_dual.of_dual s)) :=
181+
λ s t, ⟨λ H x hx x' hx', H hx' x hx, λ H x' hx' x hx, H hx x' hx'⟩
153182

154-
@[simp] lemma polar_empty : polar 𝕜 (∅ : set E) = univ :=
155-
by simp only [polar, forall_false_left, mem_empty_eq, forall_const, set_of_true]
183+
variable {E}
184+
185+
@[simp] lemma polar_Union {ι} (s : ι → set E) : polar 𝕜 (⋃ i, s i) = ⋂ i, polar 𝕜 (s i) :=
186+
(polar_gc 𝕜 E).l_supr
187+
188+
@[simp] lemma polar_union (s t : set E) : polar 𝕜 (s ∪ t) = polar 𝕜 s ∩ polar 𝕜 t :=
189+
(polar_gc 𝕜 E).l_sup
190+
191+
lemma polar_antitone : antitone (polar 𝕜 : set E → set (dual 𝕜 E)) := (polar_gc 𝕜 E).monotone_l
192+
193+
@[simp] lemma polar_empty : polar 𝕜 (∅ : set E) = univ := (polar_gc 𝕜 E).l_bot
194+
195+
@[simp] lemma polar_zero : polar 𝕜 ({0} : set E) = univ :=
196+
eq_univ_of_forall $ λ x', forall_eq.2 $ by { rw [map_zero, norm_zero], exact zero_le_one }
197+
198+
@[simp] lemma polar_closure (s : set E) : polar 𝕜 (closure s) = polar 𝕜 s :=
199+
(polar_antitone 𝕜 subset_closure).antisymm $ (polar_gc 𝕜 E).l_le $
200+
closure_minimal ((polar_gc 𝕜 E).le_u_l s) $
201+
(is_closed_polar _ _).preimage (inclusion_in_double_dual 𝕜 E).continuous
156202

157203
variables {𝕜}
158204

@@ -173,43 +219,52 @@ begin
173219
rwa cancel at le,
174220
end
175221

222+
lemma polar_ball_subset_closed_ball_div {c : 𝕜} (hc : 1 < ∥c∥) {r : ℝ} (hr : 0 < r) :
223+
polar 𝕜 (ball (0 : E) r) ⊆ closed_ball (0 : dual 𝕜 E) (∥c∥ / r) :=
224+
begin
225+
intros x' hx',
226+
simp only [polar, mem_set_of_eq, mem_closed_ball_zero_iff, mem_ball_zero_iff] at *,
227+
have hcr : 0 < ∥c∥ / r, from div_pos (zero_lt_one.trans hc) hr,
228+
refine continuous_linear_map.op_norm_le_of_shell hr hcr.le hc (λ x h₁ h₂, _),
229+
calc ∥x' x∥ ≤ 1 : hx' _ h₂
230+
... ≤ (∥c∥ / r) * ∥x∥ : (inv_pos_le_iff_one_le_mul' hcr).1 (by rwa inv_div)
231+
end
232+
176233
variables (𝕜)
177234

235+
lemma closed_ball_inv_subset_polar_closed_ball {r : ℝ} :
236+
closed_ball (0 : dual 𝕜 E) r⁻¹ ⊆ polar 𝕜 (closed_ball (0 : E) r) :=
237+
λ x' hx' x hx,
238+
calc ∥x' x∥ ≤ ∥x'∥ * ∥x∥ : x'.le_op_norm x
239+
... ≤ r⁻¹ * r :
240+
mul_le_mul (mem_closed_ball_zero_iff.1 hx') (mem_closed_ball_zero_iff.1 hx)
241+
(norm_nonneg _) (dist_nonneg.trans hx')
242+
... = r / r : div_eq_inv_mul.symm
243+
... ≤ 1 : div_self_le_one r
244+
178245
/-- The `polar` of closed ball in a normed space `E` is the closed ball of the dual with
179246
inverse radius. -/
180247
lemma polar_closed_ball
181248
{𝕜 : Type*} [is_R_or_C 𝕜] {E : Type*} [normed_group E] [normed_space 𝕜 E] {r : ℝ} (hr : 0 < r) :
182-
polar 𝕜 (closed_ball (0 : E) r) = closed_ball (0 : dual 𝕜 E) (1/r) :=
249+
polar 𝕜 (closed_ball (0 : E) r) = closed_ball (0 : dual 𝕜 E) r⁻¹ :=
183250
begin
184-
ext x',
185-
simp only [mem_closed_ball, mem_set_of_eq, dist_zero_right],
186-
split,
187-
{ intros h,
188-
apply continuous_linear_map.op_norm_le_of_ball hr (one_div_nonneg.mpr hr.le),
189-
{ exact λ z hz, linear_map.bound_of_ball_bound hr 1 x'.to_linear_map h z, },
190-
{ exact ring_hom_isometric.ids, }, },
191-
{ intros h z hz,
192-
simp only [mem_closed_ball, dist_zero_right] at hz,
193-
have key := (continuous_linear_map.le_op_norm x' z).trans
194-
(mul_le_mul h hz (norm_nonneg _) (one_div_nonneg.mpr hr.le)),
195-
rwa [one_div_mul_cancel hr.ne.symm] at key, },
251+
refine subset.antisymm _ (closed_ball_inv_subset_polar_closed_ball _),
252+
intros x' h,
253+
simp only [mem_closed_ball_zero_iff],
254+
refine continuous_linear_map.op_norm_le_of_ball hr (inv_nonneg.mpr hr.le) (λ z hz, _),
255+
simpa only [one_div] using linear_map.bound_of_ball_bound hr 1 x'.to_linear_map h z
196256
end
197257

198258
/-- Given a neighborhood `s` of the origin in a normed space `E`, the dual norms
199259
of all elements of the polar `polar 𝕜 s` are bounded by a constant. -/
200-
lemma polar_bounded_of_nhds_zero {s : set E} (s_nhd : s ∈ 𝓝 (0 : E)) :
201-
∃ (c : ℝ), ∀ x' ∈ polar 𝕜 s, ∥x'∥ ≤ c :=
260+
lemma bounded_polar_of_mem_nhds_zero {s : set E} (s_nhd : s ∈ 𝓝 (0 : E)) :
261+
bounded (polar 𝕜 s) :=
202262
begin
203263
obtain ⟨a, ha⟩ : ∃ a : 𝕜, 1 < ∥a∥ := normed_field.exists_one_lt_norm 𝕜,
204264
obtain ⟨r, r_pos, r_ball⟩ : ∃ (r : ℝ) (hr : 0 < r), ball 0 r ⊆ s :=
205265
metric.mem_nhds_iff.1 s_nhd,
206-
refine ⟨∥a∥ / r, λ x' hx', _⟩,
207-
have I : 0 ≤ ∥a∥ / r := div_nonneg (norm_nonneg _) r_pos.le,
208-
refine continuous_linear_map.op_norm_le_of_shell r_pos I ha (λ x hx h'x, _),
209-
have x_mem : x ∈ ball (0 : E) r, by simpa only [mem_ball_zero_iff] using h'x,
210-
calc ∥x' x∥ ≤ 1 : hx' x (r_ball x_mem)
211-
... = (∥a∥ / r) * (r / ∥a∥) : by field_simp [r_pos.ne', (zero_lt_one.trans ha).ne']
212-
... ≤ (∥a∥ / r) * ∥x∥ : mul_le_mul_of_nonneg_left hx I
266+
exact bounded_closed_ball.mono ((polar_antitone 𝕜 r_ball).trans $
267+
polar_ball_subset_closed_ball_div ha r_pos)
213268
end
214269

215270
end polar_sets

0 commit comments

Comments
 (0)