|
| 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