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

Commit 49cd1cc

Browse files
committed
refactor(analysis/seminorm): move topology induced by seminorms to its own file (#12826)
Besides the copy and paste I removed the namespace `seminorm` from most parts (it is still there for the boundedness definitions and statements) and updated the module docstrings. No real code has changed.
1 parent 2660d16 commit 49cd1cc

File tree

2 files changed

+388
-356
lines changed

2 files changed

+388
-356
lines changed
Lines changed: 387 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,387 @@
1+
/-
2+
Copyright (c) 2022 Moritz Doll. All rights reserved.
3+
Released under Apache 2.0 license as described in the file LICENSE.
4+
Authors: Moritz Doll, Anatole Dedecker
5+
-/
6+
7+
import analysis.seminorm
8+
9+
/-!
10+
# Topology induced by a family of seminorms
11+
12+
## Main definitions
13+
14+
* `seminorm_basis_zero`: The set of open seminorm balls for a family of seminorms.
15+
* `seminorm_module_filter_basis`: A module filter basis formed by the open balls.
16+
* `seminorm.is_bounded`: A linear map `f : E →ₗ[𝕜] F` is bounded iff every seminorm in `F` can be
17+
bounded by a finite number of seminorms in `E`.
18+
19+
## Main statements
20+
21+
* `continuous_from_bounded`: A bounded linear map `f : E →ₗ[𝕜] F` is continuous.
22+
* `with_seminorms.to_locally_convex_space`: A space equipped with a family of seminorms is locally
23+
convex.
24+
25+
## TODO
26+
27+
Show that for any locally convex space there exist seminorms that induce the topology.
28+
29+
## Tags
30+
31+
seminorm, locally convex
32+
-/
33+
34+
open normed_field set seminorm
35+
open_locale big_operators nnreal pointwise topological_space
36+
37+
variables {𝕜 E F G ι ι' : Type*}
38+
39+
section filter_basis
40+
41+
variables [normed_field 𝕜] [add_comm_group E] [module 𝕜 E]
42+
43+
/-- A filter basis for the neighborhood filter of 0. -/
44+
def seminorm_basis_zero (p : ι → seminorm 𝕜 E) : set (set E) :=
45+
⋃ (s : finset ι) r (hr : 0 < r), singleton $ ball (s.sup p) (0 : E) r
46+
47+
lemma seminorm_basis_zero_iff (p : ι → seminorm 𝕜 E) (U : set E) :
48+
U ∈ seminorm_basis_zero p ↔ ∃ (i : finset ι) r (hr : 0 < r), U = ball (i.sup p) 0 r :=
49+
by simp only [seminorm_basis_zero, mem_Union, mem_singleton_iff]
50+
51+
lemma seminorm_basis_zero_mem (p : ι → seminorm 𝕜 E) (i : finset ι) {r : ℝ} (hr : 0 < r) :
52+
(i.sup p).ball 0 r ∈ seminorm_basis_zero p :=
53+
(seminorm_basis_zero_iff _ _).mpr ⟨i,_,hr,rfl⟩
54+
55+
lemma seminorm_basis_zero_singleton_mem (p : ι → seminorm 𝕜 E) (i : ι) {r : ℝ} (hr : 0 < r) :
56+
(p i).ball 0 r ∈ seminorm_basis_zero p :=
57+
(seminorm_basis_zero_iff _ _).mpr ⟨{i},_,hr, by rw finset.sup_singleton⟩
58+
59+
lemma seminorm_basis_zero_nonempty (p : ι → seminorm 𝕜 E) [nonempty ι] :
60+
(seminorm_basis_zero p).nonempty :=
61+
begin
62+
let i := classical.arbitrary ι,
63+
refine set.nonempty_def.mpr ⟨ball (p i) 0 1, _⟩,
64+
exact seminorm_basis_zero_singleton_mem _ i zero_lt_one,
65+
end
66+
67+
lemma seminorm_basis_zero_intersect (p : ι → seminorm 𝕜 E)
68+
(U V : set E) (hU : U ∈ seminorm_basis_zero p) (hV : V ∈ seminorm_basis_zero p) :
69+
∃ (z : set E) (H : z ∈ (seminorm_basis_zero p)), z ⊆ U ∩ V :=
70+
begin
71+
classical,
72+
rcases (seminorm_basis_zero_iff p U).mp hU with ⟨s, r₁, hr₁, hU⟩,
73+
rcases (seminorm_basis_zero_iff p V).mp hV with ⟨t, r₂, hr₂, hV⟩,
74+
use ((s ∪ t).sup p).ball 0 (min r₁ r₂),
75+
refine ⟨seminorm_basis_zero_mem p (s ∪ t) (lt_min_iff.mpr ⟨hr₁, hr₂⟩), _⟩,
76+
rw [hU, hV, ball_finset_sup_eq_Inter _ _ _ (lt_min_iff.mpr ⟨hr₁, hr₂⟩),
77+
ball_finset_sup_eq_Inter _ _ _ hr₁, ball_finset_sup_eq_Inter _ _ _ hr₂],
78+
exact set.subset_inter
79+
(set.Inter₂_mono' $ λ i hi, ⟨i, finset.subset_union_left _ _ hi, ball_mono $ min_le_left _ _⟩)
80+
(set.Inter₂_mono' $ λ i hi, ⟨i, finset.subset_union_right _ _ hi, ball_mono $
81+
min_le_right _ _⟩),
82+
end
83+
84+
lemma seminorm_basis_zero_zero (p : ι → seminorm 𝕜 E) (U) (hU : U ∈ seminorm_basis_zero p) :
85+
(0 : E) ∈ U :=
86+
begin
87+
rcases (seminorm_basis_zero_iff p U).mp hU with ⟨ι', r, hr, hU⟩,
88+
rw [hU, mem_ball_zero, (ι'.sup p).zero],
89+
exact hr,
90+
end
91+
92+
lemma seminorm_basis_zero_add (p : ι → seminorm 𝕜 E) (U) (hU : U ∈ seminorm_basis_zero p) :
93+
∃ (V : set E) (H : V ∈ (seminorm_basis_zero p)), V + V ⊆ U :=
94+
begin
95+
rcases (seminorm_basis_zero_iff p U).mp hU with ⟨s, r, hr, hU⟩,
96+
use (s.sup p).ball 0 (r/2),
97+
refine ⟨seminorm_basis_zero_mem p s (div_pos hr zero_lt_two), _⟩,
98+
refine set.subset.trans (ball_add_ball_subset (s.sup p) (r/2) (r/2) 0 0) _,
99+
rw [hU, add_zero, add_halves'],
100+
end
101+
102+
lemma seminorm_basis_zero_neg (p : ι → seminorm 𝕜 E) (U) (hU' : U ∈ seminorm_basis_zero p) :
103+
∃ (V : set E) (H : V ∈ (seminorm_basis_zero p)), V ⊆ (λ (x : E), -x) ⁻¹' U :=
104+
begin
105+
rcases (seminorm_basis_zero_iff p U).mp hU' with ⟨s, r, hr, hU⟩,
106+
rw [hU, neg_preimage, neg_ball (s.sup p), neg_zero],
107+
exact ⟨U, hU', eq.subset hU⟩,
108+
end
109+
110+
/-- The `add_group_filter_basis` induced by the filter basis `seminorm_basis_zero`. -/
111+
def seminorm_add_group_filter_basis [nonempty ι]
112+
(p : ι → seminorm 𝕜 E) : add_group_filter_basis E :=
113+
add_group_filter_basis_of_comm (seminorm_basis_zero p)
114+
(seminorm_basis_zero_nonempty p)
115+
(seminorm_basis_zero_intersect p)
116+
(seminorm_basis_zero_zero p)
117+
(seminorm_basis_zero_add p)
118+
(seminorm_basis_zero_neg p)
119+
120+
lemma seminorm_basis_zero_smul_right (p : ι → seminorm 𝕜 E) (v : E) (U : set E)
121+
(hU : U ∈ seminorm_basis_zero p) : ∀ᶠ (x : 𝕜) in 𝓝 0, x • v ∈ U :=
122+
begin
123+
rcases (seminorm_basis_zero_iff p U).mp hU with ⟨s, r, hr, hU⟩,
124+
rw [hU, filter.eventually_iff],
125+
simp_rw [(s.sup p).mem_ball_zero, (s.sup p).smul],
126+
by_cases h : 0 < (s.sup p) v,
127+
{ simp_rw (lt_div_iff h).symm,
128+
rw ←_root_.ball_zero_eq,
129+
exact metric.ball_mem_nhds 0 (div_pos hr h) },
130+
simp_rw [le_antisymm (not_lt.mp h) ((s.sup p).nonneg v), mul_zero, hr],
131+
exact is_open.mem_nhds is_open_univ (mem_univ 0),
132+
end
133+
134+
variables [nonempty ι]
135+
136+
lemma seminorm_basis_zero_smul (p : ι → seminorm 𝕜 E) (U) (hU : U ∈ seminorm_basis_zero p) :
137+
∃ (V : set 𝕜) (H : V ∈ 𝓝 (0 : 𝕜)) (W : set E)
138+
(H : W ∈ (seminorm_add_group_filter_basis p).sets), V • W ⊆ U :=
139+
begin
140+
rcases (seminorm_basis_zero_iff p U).mp hU with ⟨s, r, hr, hU⟩,
141+
refine ⟨metric.ball 0 r.sqrt, metric.ball_mem_nhds 0 (real.sqrt_pos.mpr hr), _⟩,
142+
refine ⟨(s.sup p).ball 0 r.sqrt, seminorm_basis_zero_mem p s (real.sqrt_pos.mpr hr), _⟩,
143+
refine set.subset.trans (ball_smul_ball (s.sup p) r.sqrt r.sqrt) _,
144+
rw [hU, real.mul_self_sqrt (le_of_lt hr)],
145+
end
146+
147+
lemma seminorm_basis_zero_smul_left (p : ι → seminorm 𝕜 E) (x : 𝕜) (U : set E)
148+
(hU : U ∈ seminorm_basis_zero p) : ∃ (V : set E)
149+
(H : V ∈ (seminorm_add_group_filter_basis p).sets), V ⊆ (λ (y : E), x • y) ⁻¹' U :=
150+
begin
151+
rcases (seminorm_basis_zero_iff p U).mp hU with ⟨s, r, hr, hU⟩,
152+
rw hU,
153+
by_cases h : x ≠ 0,
154+
{ rw [(s.sup p).smul_ball_preimage 0 r x h, smul_zero],
155+
use (s.sup p).ball 0 (r / ∥x∥),
156+
exact ⟨seminorm_basis_zero_mem p s (div_pos hr (norm_pos_iff.mpr h)), subset.rfl⟩ },
157+
refine ⟨(s.sup p).ball 0 r, seminorm_basis_zero_mem p s hr, _⟩,
158+
simp only [not_ne_iff.mp h, subset_def, mem_ball_zero, hr, mem_univ, seminorm.zero,
159+
implies_true_iff, preimage_const_of_mem, zero_smul],
160+
end
161+
162+
/-- The `module_filter_basis` induced by the filter basis `seminorm_basis_zero`. -/
163+
def seminorm_module_filter_basis (p : ι → seminorm 𝕜 E) : module_filter_basis 𝕜 E :=
164+
{ to_add_group_filter_basis := seminorm_add_group_filter_basis p,
165+
smul' := seminorm_basis_zero_smul p,
166+
smul_left' := seminorm_basis_zero_smul_left p,
167+
smul_right' := seminorm_basis_zero_smul_right p }
168+
169+
end filter_basis
170+
171+
section bounded
172+
173+
namespace seminorm
174+
175+
variables [normed_field 𝕜] [add_comm_group E] [module 𝕜 E] [add_comm_group F] [module 𝕜 F]
176+
177+
/-- The proposition that a linear map is bounded between spaces with families of seminorms. -/
178+
def is_bounded (p : ι → seminorm 𝕜 E) (q : ι' → seminorm 𝕜 F) (f : E →ₗ[𝕜] F) : Prop :=
179+
∀ i, ∃ s : finset ι, ∃ C : ℝ≥0, C ≠ 0 ∧ (q i).comp f ≤ C • s.sup p
180+
181+
lemma is_bounded_const (ι' : Type*) [nonempty ι']
182+
{p : ι → seminorm 𝕜 E} {q : seminorm 𝕜 F} (f : E →ₗ[𝕜] F) :
183+
is_bounded p (λ _ : ι', q) f ↔ ∃ (s : finset ι) C : ℝ≥0, C ≠ 0 ∧ q.comp f ≤ C • s.sup p :=
184+
by simp only [is_bounded, forall_const]
185+
186+
lemma const_is_bounded (ι : Type*) [nonempty ι]
187+
{p : seminorm 𝕜 E} {q : ι' → seminorm 𝕜 F} (f : E →ₗ[𝕜] F) :
188+
is_bounded (λ _ : ι, p) q f ↔ ∀ i, ∃ C : ℝ≥0, C ≠ 0 ∧ (q i).comp f ≤ C • p :=
189+
begin
190+
dunfold is_bounded,
191+
split,
192+
{ intros h i,
193+
rcases h i with ⟨s, C, hC, h⟩,
194+
exact ⟨C, hC, le_trans h (smul_le_smul (finset.sup_le (λ _ _, le_rfl)) le_rfl)⟩ },
195+
intros h i,
196+
use [{classical.arbitrary ι}],
197+
simp only [h, finset.sup_singleton],
198+
end
199+
200+
lemma is_bounded_sup {p : ι → seminorm 𝕜 E} {q : ι' → seminorm 𝕜 F}
201+
{f : E →ₗ[𝕜] F} (hf : is_bounded p q f) (s' : finset ι') :
202+
∃ (C : ℝ≥0) (s : finset ι), 0 < C ∧ (s'.sup q).comp f ≤ C • (s.sup p) :=
203+
begin
204+
classical,
205+
by_cases hs' : ¬s'.nonempty,
206+
{ refine ⟨1, ∅, zero_lt_one, _⟩,
207+
rw [finset.not_nonempty_iff_eq_empty.mp hs', finset.sup_empty, seminorm.bot_eq_zero, zero_comp],
208+
exact seminorm.nonneg _ },
209+
rw not_not at hs',
210+
choose fₛ fC hf using hf,
211+
use [s'.card • s'.sup fC, finset.bUnion s' fₛ],
212+
split,
213+
{ refine nsmul_pos _ (ne_of_gt (finset.nonempty.card_pos hs')),
214+
cases finset.nonempty.bex hs' with j hj,
215+
exact lt_of_lt_of_le (zero_lt_iff.mpr (and.elim_left (hf j))) (finset.le_sup hj) },
216+
have hs : ∀ i : ι', i ∈ s' → (q i).comp f ≤ s'.sup fC • ((finset.bUnion s' fₛ).sup p) :=
217+
begin
218+
intros i hi,
219+
refine le_trans (and.elim_right (hf i)) (smul_le_smul _ (finset.le_sup hi)),
220+
exact finset.sup_mono (finset.subset_bUnion_of_mem fₛ hi),
221+
end,
222+
refine le_trans (comp_mono f (finset_sup_le_sum q s')) _,
223+
simp_rw [←pullback_apply, add_monoid_hom.map_sum, pullback_apply], --improve this
224+
refine le_trans (finset.sum_le_sum hs) _,
225+
rw [finset.sum_const, smul_assoc],
226+
exact le_rfl,
227+
end
228+
229+
end seminorm
230+
231+
end bounded
232+
233+
section topology
234+
235+
variables [normed_field 𝕜] [add_comm_group E] [module 𝕜 E] [nonempty ι]
236+
237+
/-- The proposition that the topology of `E` is induced by a family of seminorms `p`. -/
238+
class with_seminorms (p : ι → seminorm 𝕜 E) [t : topological_space E] : Prop :=
239+
(topology_eq_with_seminorms : t = (seminorm_module_filter_basis p).topology)
240+
241+
lemma with_seminorms_eq (p : ι → seminorm 𝕜 E) [t : topological_space E] [with_seminorms p] :
242+
t = ((seminorm_module_filter_basis p).topology) := with_seminorms.topology_eq_with_seminorms
243+
244+
end topology
245+
246+
section topological_add_group
247+
248+
variables [normed_field 𝕜] [add_comm_group E] [module 𝕜 E]
249+
variables [topological_space E] [topological_add_group E]
250+
variables [nonempty ι]
251+
252+
lemma with_seminorms_of_nhds (p : ι → seminorm 𝕜 E)
253+
(h : 𝓝 (0 : E) = (seminorm_module_filter_basis p).to_filter_basis.filter) :
254+
with_seminorms p :=
255+
begin
256+
refine ⟨topological_add_group.ext (by apply_instance)
257+
((seminorm_add_group_filter_basis _).is_topological_add_group) _⟩,
258+
rw add_group_filter_basis.nhds_zero_eq,
259+
exact h,
260+
end
261+
262+
lemma with_seminorms_of_has_basis (p : ι → seminorm 𝕜 E) (h : (𝓝 (0 : E)).has_basis
263+
(λ (s : set E), s ∈ (seminorm_basis_zero p)) id) :
264+
with_seminorms p :=
265+
with_seminorms_of_nhds p $ filter.has_basis.eq_of_same_basis h
266+
((seminorm_add_group_filter_basis p).to_filter_basis.has_basis)
267+
268+
end topological_add_group
269+
270+
section normed_space
271+
272+
/-- The topology of a `normed_space 𝕜 E` is induced by the seminorm `norm_seminorm 𝕜 E`. -/
273+
instance norm_with_seminorms (𝕜 E) [normed_field 𝕜] [semi_normed_group E] [normed_space 𝕜 E] :
274+
with_seminorms (λ (_ : fin 1), norm_seminorm 𝕜 E) :=
275+
begin
276+
let p := λ _ : fin 1, norm_seminorm 𝕜 E,
277+
refine ⟨topological_add_group.ext normed_top_group
278+
((seminorm_add_group_filter_basis _).is_topological_add_group) _⟩,
279+
refine filter.has_basis.eq_of_same_basis metric.nhds_basis_ball _,
280+
rw ←ball_norm_seminorm 𝕜 E,
281+
refine filter.has_basis.to_has_basis (seminorm_add_group_filter_basis p).nhds_zero_has_basis _
282+
(λ r hr, ⟨(norm_seminorm 𝕜 E).ball 0 r, seminorm_basis_zero_singleton_mem p 0 hr, rfl.subset⟩),
283+
rintros U (hU : U ∈ seminorm_basis_zero p),
284+
rcases (seminorm_basis_zero_iff p U).mp hU with ⟨s, r, hr, hU⟩,
285+
use [r, hr],
286+
rw [hU, id.def],
287+
by_cases h : s.nonempty,
288+
{ rw finset.sup_const h },
289+
rw [finset.not_nonempty_iff_eq_empty.mp h, finset.sup_empty, ball_bot _ hr],
290+
exact set.subset_univ _,
291+
end
292+
293+
end normed_space
294+
295+
section continuous_bounded
296+
297+
namespace seminorm
298+
299+
variables [normed_field 𝕜] [add_comm_group E] [module 𝕜 E] [add_comm_group F] [module 𝕜 F]
300+
variables [nonempty ι] [nonempty ι']
301+
302+
lemma continuous_from_bounded (p : ι → seminorm 𝕜 E) (q : ι' → seminorm 𝕜 F)
303+
[uniform_space E] [uniform_add_group E] [with_seminorms p]
304+
[uniform_space F] [uniform_add_group F] [with_seminorms q]
305+
(f : E →ₗ[𝕜] F) (hf : seminorm.is_bounded p q f) : continuous f :=
306+
begin
307+
refine uniform_continuous.continuous _,
308+
refine add_monoid_hom.uniform_continuous_of_continuous_at_zero f.to_add_monoid_hom _,
309+
rw [f.to_add_monoid_hom_coe, continuous_at_def, f.map_zero, with_seminorms_eq p],
310+
intros U hU,
311+
rw [with_seminorms_eq q, add_group_filter_basis.nhds_zero_eq, filter_basis.mem_filter_iff] at hU,
312+
rcases hU with ⟨V, hV : V ∈ seminorm_basis_zero q, hU⟩,
313+
rcases (seminorm_basis_zero_iff q V).mp hV with ⟨s₂, r, hr, hV⟩,
314+
rw hV at hU,
315+
rw [(seminorm_add_group_filter_basis p).nhds_zero_eq, filter_basis.mem_filter_iff],
316+
rcases (seminorm.is_bounded_sup hf s₂) with ⟨C, s₁, hC, hf⟩,
317+
refine ⟨(s₁.sup p).ball 0 (r/C),
318+
seminorm_basis_zero_mem p _ (div_pos hr (nnreal.coe_pos.mpr hC)), _⟩,
319+
refine subset.trans _ (preimage_mono hU),
320+
simp_rw [←linear_map.map_zero f, ←ball_comp],
321+
refine subset.trans _ (ball_antitone hf),
322+
rw ball_smul (s₁.sup p) hC,
323+
end
324+
325+
lemma cont_with_seminorms_normed_space (F) [semi_normed_group F] [normed_space 𝕜 F]
326+
[uniform_space E] [uniform_add_group E]
327+
(p : ι → seminorm 𝕜 E) [with_seminorms p] (f : E →ₗ[𝕜] F)
328+
(hf : ∃ (s : finset ι) C : ℝ≥0, C ≠ 0 ∧ (norm_seminorm 𝕜 F).comp f ≤ C • s.sup p) :
329+
continuous f :=
330+
begin
331+
rw ←seminorm.is_bounded_const (fin 1) at hf,
332+
exact continuous_from_bounded p (λ _ : fin 1, norm_seminorm 𝕜 F) f hf,
333+
end
334+
335+
lemma cont_normed_space_to_with_seminorms (E) [semi_normed_group E] [normed_space 𝕜 E]
336+
[uniform_space F] [uniform_add_group F]
337+
(q : ι → seminorm 𝕜 F) [with_seminorms q] (f : E →ₗ[𝕜] F)
338+
(hf : ∀ i : ι, ∃ C : ℝ≥0, C ≠ 0 ∧ (q i).comp f ≤ C • (norm_seminorm 𝕜 E)) : continuous f :=
339+
begin
340+
rw ←seminorm.const_is_bounded (fin 1) at hf,
341+
exact continuous_from_bounded (λ _ : fin 1, norm_seminorm 𝕜 E) q f hf,
342+
end
343+
344+
end seminorm
345+
346+
end continuous_bounded
347+
348+
section locally_convex_space
349+
350+
open locally_convex_space
351+
352+
variables [nonempty ι] [normed_field 𝕜] [normed_space ℝ 𝕜]
353+
[add_comm_group E] [module 𝕜 E] [module ℝ E] [is_scalar_tower ℝ 𝕜 E] [topological_space E]
354+
[topological_add_group E]
355+
356+
lemma with_seminorms.to_locally_convex_space (p : ι → seminorm 𝕜 E) [with_seminorms p] :
357+
locally_convex_space ℝ E :=
358+
begin
359+
apply of_basis_zero ℝ E id (λ s, s ∈ seminorm_basis_zero p),
360+
{ rw [with_seminorms_eq p, add_group_filter_basis.nhds_eq _, add_group_filter_basis.N_zero],
361+
exact filter_basis.has_basis _ },
362+
{ intros s hs,
363+
change s ∈ set.Union _ at hs,
364+
simp_rw [set.mem_Union, set.mem_singleton_iff] at hs,
365+
rcases hs with ⟨I, r, hr, rfl⟩,
366+
exact convex_ball _ _ _ }
367+
end
368+
369+
end locally_convex_space
370+
371+
section normed_space
372+
373+
variables (𝕜) [normed_field 𝕜] [normed_space ℝ 𝕜] [semi_normed_group E]
374+
375+
/-- Not an instance since `𝕜` can't be inferred. See `normed_space.to_locally_convex_space` for a
376+
slightly weaker instance version. -/
377+
lemma normed_space.to_locally_convex_space' [normed_space 𝕜 E] [module ℝ E]
378+
[is_scalar_tower ℝ 𝕜 E] : locally_convex_space ℝ E :=
379+
with_seminorms.to_locally_convex_space (λ _ : fin 1, norm_seminorm 𝕜 E)
380+
381+
/-- See `normed_space.to_locally_convex_space'` for a slightly stronger version which is not an
382+
instance. -/
383+
instance normed_space.to_locally_convex_space [normed_space ℝ E] :
384+
locally_convex_space ℝ E :=
385+
normed_space.to_locally_convex_space' ℝ
386+
387+
end normed_space

0 commit comments

Comments
 (0)