Skip to content
Open
Show file tree
Hide file tree
Changes from 20 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Mathlib/Analysis/Distribution/ContDiffMapSupportedIn.lean
Original file line number Diff line number Diff line change
Expand Up @@ -648,7 +648,7 @@ protected noncomputable def supSeminorm (i : ℕ) : Seminorm 𝕜 𝓓^{n}_{K}(E

protected theorem withSeminorms :
WithSeminorms (ContDiffMapSupportedIn.seminorm 𝕜 E F n K) := by
let p : SeminormFamily 𝕜 𝓓^{n}_{K}(E, F) ((_ : ℕ) × Fin 1) :=
let p : SeminormFamily 𝕜 𝓓^{n}_{K}(E, F) ((_ : ℕ) × Unit) :=
SeminormFamily.sigma fun i _ ↦
(normSeminorm 𝕜 (E →ᵇ (E [×i]→L[ℝ] F))).comp (structureMapLM 𝕜 n i)
have : WithSeminorms p :=
Expand Down
2 changes: 1 addition & 1 deletion Mathlib/Analysis/Fourier/AddCircleMulti.lean
Original file line number Diff line number Diff line change
Expand Up @@ -220,7 +220,7 @@ theorem span_mFourierLp_closure_eq_top {p : ℝ≥0∞} [Fact (1 ≤ p)] (hp : p
(span ℂ (range (@mFourierLp d _ p _))).topologicalClosure = ⊤ := by
simpa only [map_span, ContinuousLinearMap.coe_coe, ← range_comp, Function.comp_def] using
(ContinuousMap.toLp_denseRange ℂ volume ℂ hp).topologicalClosure_map_submodule
span_mFourier_closure_eq_top
(span_mFourier_closure_eq_top (d := d))

/-- The monomials `mFourierLp 2 n` are an orthonormal set in `L²`. -/
theorem orthonormal_mFourier : Orthonormal ℂ (mFourierLp (d := d) 2) := by
Expand Down
2 changes: 1 addition & 1 deletion Mathlib/Analysis/InnerProductSpace/Defs.lean
Original file line number Diff line number Diff line change
Expand Up @@ -510,7 +510,7 @@ lemma topology_eq
tF = cd.toNormedAddCommGroup.toMetricSpace.toUniformSpace.toTopologicalSpace := by
let p : Seminorm 𝕜 F := @normSeminorm 𝕜 F _ cd.toNormedAddCommGroup.toSeminormedAddCommGroup
InnerProductSpace.Core.toNormedSpace
suffices WithSeminorms (fun (i : Fin 1) ↦ p) by
suffices WithSeminorms (fun (i : Unit) ↦ p) by
rw [(SeminormFamily.withSeminorms_iff_topologicalSpace_eq_iInf _).1 this]
simp
have : p.ball 0 1 = {v | re (cd.inner v v) < 1} := by
Expand Down
2 changes: 1 addition & 1 deletion Mathlib/Analysis/LocallyConvex/PointwiseConvergence.lean
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ theorem isInducing_inducingFn : Topology.IsInducing (inducingFn σ E F) :=
(PointwiseConvergenceCLM.isEmbedding_coeFn σ E F).isInducing

lemma withSeminorms : WithSeminorms (PointwiseConvergenceCLM.seminormFamily σ E F) :=
let e : E ≃ (Σ _ : E, Fin 1) := .symm <| .sigmaUnique _ _
let e : E ≃ (Σ _ : E, Unit) := .symm <| .sigmaUnique _ _
(isInducing_inducingFn σ E F).withSeminorms <| withSeminorms_pi (fun _ ↦ norm_withSeminorms 𝕜₂ F)
|>.congr_equiv e

Expand Down
2 changes: 1 addition & 1 deletion Mathlib/Analysis/LocallyConvex/WeakDual.lean
Original file line number Diff line number Diff line change
Expand Up @@ -213,7 +213,7 @@ variable [NormedField 𝕜] [AddCommGroup E] [Module 𝕜 E] [AddCommGroup F] [M

theorem LinearMap.weakBilin_withSeminorms (B : E →ₗ[𝕜] F →ₗ[𝕜] 𝕜) :
WithSeminorms (LinearMap.toSeminormFamily B : F → Seminorm 𝕜 (WeakBilin B)) :=
let e : F ≃ (Σ _ : F, Fin 1) := .symm <| .sigmaUnique _ _
let e : F ≃ (Σ _ : F, Unit) := .symm <| .sigmaUnique _ _
withSeminorms_induced (withSeminorms_pi (fun _ ↦ norm_withSeminorms 𝕜 𝕜))
(LinearMap.ltoFun 𝕜 F 𝕜 𝕜 ∘ₗ B : (WeakBilin B) →ₗ[𝕜] (F → 𝕜)) |>.congr_equiv e

Expand Down
2 changes: 1 addition & 1 deletion Mathlib/Analysis/LocallyConvex/WeakOperatorTopology.lean
Original file line number Diff line number Diff line change
Expand Up @@ -406,7 +406,7 @@ def seminormFamily : SeminormFamily 𝕜₂ (E →SWOT[σ] F) (E × F⋆) :=
fun ⟨x, y⟩ => seminorm x y

lemma withSeminorms : WithSeminorms (seminormFamily σ E F) :=
let e : E × F⋆ ≃ (Σ _ : E × F⋆, Fin 1) := .symm <| .sigmaUnique _ _
let e : E × F⋆ ≃ (Σ _ : E × F⋆, Unit) := .symm <| .sigmaUnique _ _
isInducing_inducingFn.withSeminorms <| withSeminorms_pi (fun _ ↦ norm_withSeminorms 𝕜₂ 𝕜₂)
|>.congr_equiv e

Expand Down
108 changes: 98 additions & 10 deletions Mathlib/Analysis/LocallyConvex/WithSeminorms.lean
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,10 @@ public import Mathlib.Analysis.LocallyConvex.Bounded
public import Mathlib.Analysis.Normed.Module.Seminorm.Basic
public import Mathlib.Analysis.Real.Sqrt
public import Mathlib.Topology.Algebra.Equicontinuity
public import Mathlib.Topology.MetricSpace.Equicontinuity
public import Mathlib.Topology.Algebra.FilterBasis
public import Mathlib.Topology.Algebra.Module.Equiv
public import Mathlib.Topology.Algebra.Module.LocallyConvex
public import Mathlib.Topology.MetricSpace.Equicontinuity

/-!
# Topology induced by a family of seminorms
Expand All @@ -24,6 +25,8 @@ public import Mathlib.Topology.Algebra.Module.LocallyConvex
bounded by a finite number of seminorms in `E`.
* `WithSeminorms p`, when `p` is a family of seminorms on `E`, is a proposition expressing that the
(existing) topology on `E` is induced by the seminorms `p`.
* `IsNormableSpace 𝕜 E` is a class asserting that the (existing) topology on `E` is induced
by *some* `𝕜`-seminorm
* `PolynormableSpace 𝕜 E` is a class asserting that the (existing) topology on `E` is induced
by *some* family of `𝕜`-seminorms. If `𝕜` is `RCLike`, this is equivalent to
`LocallyConvexSpace 𝕜 E`.
Expand Down Expand Up @@ -284,6 +287,18 @@ variable [NormedField 𝕜] [AddCommGroup E] [Module 𝕜 E]
structure WithSeminorms (p : SeminormFamily 𝕜 E ι) [topology : TopologicalSpace E] : Prop where
topology_eq_withSeminorms : topology = p.moduleFilterBasis.topology

variable (𝕜 E) in
/-- A topological vector space `E` is **normable** over `𝕜` if its topology is induced by
*some* `𝕜`-seminorm.
To endow such a space with a normed space structure with the same topology, use:
```
let : SeminormedAddCommGroup E := IsNormableSpace.toSeminormedAddCommGroup 𝕜 E
let : NormedSpace 𝕜 E := IsNormableSpace.toNormedSpace 𝕜 E
```
-/
class IsNormableSpace [topology : TopologicalSpace E] where
withSeminorms' : ∃ (p : Seminorm 𝕜 E), WithSeminorms (fun (_ : Unit) ↦ p)

variable (𝕜 E) in
/-- A topological vector space `E` is **polynormable** over `𝕜` if its topology is induced by
*some* family of `𝕜`-seminorms. Equivalently, its topology is induced by *all* its continuous
Expand Down Expand Up @@ -313,6 +328,9 @@ theorem WithSeminorms.continuousSMul (hp : WithSeminorms p) : ContinuousSMul
rw [hp.withSeminorms_eq]
exact ModuleFilterBasis.continuousSMul _

instance [h : PolynormableSpace 𝕜 E] : ContinuousSMul 𝕜 E :=
h.withSeminorms'.continuousSMul

theorem WithSeminorms.hasBasis (hp : WithSeminorms p) :
(𝓝 (0 : E)).HasBasis (fun s : Set E => s ∈ p.basisSets) id := by
rw [congr_fun (congr_arg (@nhds E) hp.1) 0]
Expand Down Expand Up @@ -474,6 +492,10 @@ theorem WithSeminorms.toPolynormableSpace {p : SeminormFamily 𝕜 E ι} (hp : W
intro i
exact iInf_le (ι := {p : Seminorm 𝕜 E // Continuous p}) _ ⟨p i, hp' i⟩

instance [h : IsNormableSpace 𝕜 E] : PolynormableSpace 𝕜 E := by
rcases h.withSeminorms' with ⟨q, hq⟩
exact hq.toPolynormableSpace

end TopologicalSpace

/-- The uniform structure induced by a family of seminorms is exactly the infimum of the ones
Expand All @@ -494,14 +516,58 @@ section NormedSpace

/-- The topology of a `NormedSpace 𝕜 E` is induced by the seminorm `normSeminorm 𝕜 E`. -/
theorem norm_withSeminorms (𝕜 E) [NormedField 𝕜] [SeminormedAddCommGroup E] [NormedSpace 𝕜 E] :
WithSeminorms fun _ : Fin 1 => normSeminorm 𝕜 E := by
WithSeminorms fun _ : Unit => normSeminorm 𝕜 E := by
rw [SeminormFamily.withSeminorms_iff_nhds_eq_iInf, iInf_const, coe_normSeminorm,
comap_norm_nhds_zero]

/-- A (semi-)normed space is polynormable. -/
instance [NormedField 𝕜] [SeminormedAddCommGroup E] [NormedSpace 𝕜 E] :
PolynormableSpace 𝕜 E :=
norm_withSeminorms 𝕜 E |>.toPolynormableSpace
/-- A (semi-)normed space is normable. -/
instance [NormedField 𝕜] [SeminormedAddCommGroup E] [NormedSpace 𝕜 E] : IsNormableSpace 𝕜 E :=
⟨⟨normSeminorm 𝕜 E, norm_withSeminorms 𝕜 E⟩⟩

variable [NormedField 𝕜] [ha : AddCommGroup E] [hm : Module 𝕜 E]
[t : TopologicalSpace E] [hn : IsNormableSpace 𝕜 E]

variable (𝕜 E)

/-- A seminorm defining the topology in a normable space. -/
noncomputable def IsNormableSpace.seminorm : Seminorm 𝕜 E := hn.withSeminorms'.choose

/-- A normable space can be endowed with a seminorm defining the same topology. -/
noncomputable abbrev IsNormableSpace.toSeminormedAddCommGroup : SeminormedAddCommGroup E := by
let q := IsNormableSpace.seminorm 𝕜 E
have hq := hn.withSeminorms'.choose_spec
have : IsTopologicalAddGroup E := hq.topologicalAddGroup
let : Norm E := ⟨IsNormableSpace.seminorm 𝕜 E⟩
let c : SeminormedSpace.Core 𝕜 E :=
{ norm_nonneg x := apply_nonneg q x
norm_smul c x := map_smul_eq_mul q c x
norm_triangle x y := map_add_le_add q x y }
refine SeminormedAddCommGroup.ofCoreReplaceTopology c ?_
rw [(SeminormFamily.withSeminorms_iff_topologicalSpace_eq_iInf _).1 hq, ciInf_unique]
rfl

/-- A normable space can be endowed with a normed space structure. -/
noncomputable abbrev IsNormableSpace.toNormedSpace :
letI : SeminormedAddCommGroup E := IsNormableSpace.toSeminormedAddCommGroup 𝕜 E
NormedSpace 𝕜 E :=
letI : SeminormedAddCommGroup E := IsNormableSpace.toSeminormedAddCommGroup 𝕜 E
{ norm_smul_le c x := (map_smul_eq_mul (IsNormableSpace.seminorm 𝕜 E) c x).le }

instance [AddCommGroup F] [Module 𝕜 F] [TopologicalSpace F] [IsNormableSpace 𝕜 F] :
IsNormableSpace 𝕜 (E × F) := by
let : SeminormedAddCommGroup E := IsNormableSpace.toSeminormedAddCommGroup 𝕜 E
let : NormedSpace 𝕜 E := IsNormableSpace.toNormedSpace 𝕜 E
let : SeminormedAddCommGroup F := IsNormableSpace.toSeminormedAddCommGroup 𝕜 F
let : NormedSpace 𝕜 F := IsNormableSpace.toNormedSpace 𝕜 F
infer_instance

instance {E : ι → Type*} [Finite ι] [∀ i, AddCommGroup (E i)] [∀ i, Module 𝕜 (E i)]
[∀ i, TopologicalSpace (E i)] [∀ i, IsNormableSpace 𝕜 (E i)] :
IsNormableSpace 𝕜 (Π i, E i) := by
let A i : SeminormedAddCommGroup (E i) := IsNormableSpace.toSeminormedAddCommGroup 𝕜 (E i)
let B i : NormedSpace 𝕜 (E i) := IsNormableSpace.toNormedSpace 𝕜 (E i)
let : Fintype ι := Fintype.ofFinite ι
infer_instance

end NormedSpace

Expand Down Expand Up @@ -581,7 +647,7 @@ theorem WithSeminorms.isVonNBounded_iff_seminorm_bddAbove {s : Set E} (hp : With
the unit ball for this seminorm is a bounded neighborhood of `0`. -/
theorem withSeminorms_iff_mem_nhds_isVonNBounded [IsTopologicalAddGroup E]
[ContinuousConstSMul 𝕜 E] {p : Seminorm 𝕜 E} :
WithSeminorms (fun (_ : Fin 1) ↦ p) ↔ p.ball 0 1 ∈ 𝓝 0 ∧ IsVonNBounded 𝕜 (p.ball 0 1) := by
WithSeminorms (fun (_ : Unit) ↦ p) ↔ p.ball 0 1 ∈ 𝓝 0 ∧ IsVonNBounded 𝕜 (p.ball 0 1) := by
/- The nontrivial direction is from right to left. With `SeminormFamily.withSeminorms_of_nhds`,
we need to see that the neighborhoods of zero for the initial topology and for `p` coincide. -/
refine ⟨fun h ↦ ⟨?_, ?_⟩, ?_⟩
Expand All @@ -604,7 +670,7 @@ theorem withSeminorms_iff_mem_nhds_isVonNBounded [IsTopologicalAddGroup E]
rwa [smul_set_subset_smul_set_iff₀ c_ne] at this
grw [← this]
apply FilterBasis.mem_filter_of_mem
change p.ball 0 (‖c⁻¹‖) ∈ SeminormFamily.basisSets (fun (i : Fin 1) ↦ p)
change p.ball 0 (‖c⁻¹‖) ∈ SeminormFamily.basisSets (fun (i : Unit) ↦ p)
apply SeminormFamily.basisSets_singleton_mem _ 0
simpa using c_ne
· /- Show that a neighborhood `s` for `p` is a neighborhood for the topology, by using the
Expand Down Expand Up @@ -685,7 +751,7 @@ theorem continuous_normedSpace_rng (F) [SeminormedAddCommGroup F] [NormedSpace
[TopologicalSpace E] {p : ι → Seminorm 𝕝 E} (hp : WithSeminorms p)
(f : E →ₛₗ[τ₁₂] F) (hf : ∃ (s : Finset ι) (C : ℝ≥0), (normSeminorm 𝕝₂ F).comp f ≤ C • s.sup p) :
Continuous f := by
rw [← Seminorm.isBounded_const (Fin 1)] at hf
rw [← Seminorm.isBounded_const Unit] at hf
exact continuous_of_isBounded hp (norm_withSeminorms 𝕝₂ F) f hf

lemma _root_.Seminorm.abs_le_of_le [Module ℝ E] {p : Seminorm ℝ E}
Expand All @@ -707,7 +773,7 @@ theorem continuous_normedSpace_dom (E) [SeminormedAddCommGroup E] [NormedSpace
[TopologicalSpace F] {q : ι → Seminorm 𝕝₂ F} (hq : WithSeminorms q)
(f : E →ₛₗ[τ₁₂] F) (hf : ∀ i : ι, ∃ C : ℝ≥0, (q i).comp f ≤ C • normSeminorm 𝕝 E) :
Continuous f := by
rw [← Seminorm.const_isBounded (Fin 1)] at hf
rw [← Seminorm.const_isBounded Unit] at hf
exact continuous_of_isBounded (norm_withSeminorms 𝕝 E) hq f hf

@[deprecated (since := "2026-03-09")]
Expand Down Expand Up @@ -1008,15 +1074,37 @@ lemma Topology.IsInducing.withSeminorms {q : SeminormFamily 𝕜₂ F ι}
rw [hf.eq_induced]
exact f.withSeminorms_induced hq

theorem Topology.IsInducing.isNormableSpace [h : IsNormableSpace 𝕜₂ F]
[TopologicalSpace E] {f : E →ₛₗ[σ₁₂] F} (hf : IsInducing f) :
IsNormableSpace 𝕜 E := by
rcases h.withSeminorms' with ⟨p, hp⟩
exact ⟨p.comp f, hf.withSeminorms hp⟩

theorem Topology.IsInducing.polynormableSpace [PolynormableSpace 𝕜₂ F]
[TopologicalSpace E] {f : E →ₛₗ[σ₁₂] F} (hf : IsInducing f) :
PolynormableSpace 𝕜 E :=
hf.withSeminorms (PolynormableSpace.withSeminorms 𝕜₂ F) |>.toPolynormableSpace

instance [IsNormableSpace 𝕜₂ F] {S : Submodule 𝕜₂ F} :
IsNormableSpace 𝕜₂ S :=
IsInducing.isNormableSpace (f := S.subtype) .subtypeVal

instance [PolynormableSpace 𝕜₂ F] {S : Submodule 𝕜₂ F} :
PolynormableSpace 𝕜₂ S :=
IsInducing.polynormableSpace (f := S.subtype) .subtypeVal

theorem ContinuousLinearEquiv.isNormableSpace {σ₂₁ : 𝕜₂ →+* 𝕜}
[RingHomInvPair σ₁₂ σ₂₁] [RingHomInvPair σ₂₁ σ₁₂] [IsNormableSpace 𝕜₂ F]
[TopologicalSpace E] (f : E ≃SL[σ₁₂] F) :
IsNormableSpace 𝕜 E :=
f.toHomeomorph.isInducing.isNormableSpace

theorem ContinuousLinearEquiv.PolynormableSpace {σ₂₁ : 𝕜₂ →+* 𝕜}
[RingHomInvPair σ₁₂ σ₂₁] [RingHomInvPair σ₂₁ σ₁₂] [PolynormableSpace 𝕜₂ F]
[TopologicalSpace E] (f : E ≃SL[σ₁₂] F) :
PolynormableSpace 𝕜 E :=
f.toHomeomorph.isInducing.polynormableSpace

section NontriviallyNormedField

variable {𝕜 : Type*} [NontriviallyNormedField 𝕜] [Module 𝕜 E] [TopologicalSpace E]
Expand Down
2 changes: 1 addition & 1 deletion Mathlib/Analysis/Normed/Module/Dual.lean
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ theorem polar_closure (s : Set E) : StrongDual.polar 𝕜 (closure s) = StrongDu
(topDualPairing 𝕜 E).flip.polar_gc.l_le <|
closure_minimal ((topDualPairing 𝕜 E).flip.polar_gc.le_u_l s) <| by
simpa [LinearMap.flip_flip] using!
(isClosed_polar _ _).preimage (ContinuousLinearMap.apply 𝕜 𝕜 (E := E)).continuous
(isClosed_polar _ _).preimage (ContinuousLinearMap.apply 𝕜 𝕜 (E' := E)).continuous

variable {𝕜}

Expand Down
10 changes: 10 additions & 0 deletions Mathlib/Analysis/Normed/Operator/Basic.lean
Original file line number Diff line number Diff line change
Expand Up @@ -389,6 +389,16 @@ instance toNormedSpace {𝕜' : Type*} [NormedField 𝕜'] [NormedSpace 𝕜' F]
NormedSpace 𝕜' (E →SL[σ₁₂] F) :=
⟨opNorm_smul_le⟩

instance {E F : Type*} [AddCommGroup E] [Module 𝕜 E] [TopologicalSpace E] [IsNormableSpace 𝕜 E]
[AddCommGroup F] [Module 𝕜₂ F] [TopologicalSpace F] [IsTopologicalAddGroup F]
[IsNormableSpace 𝕜₂ F] :
IsNormableSpace 𝕜₂ (E →SL[σ₁₂] F) := by
let : SeminormedAddCommGroup E := IsNormableSpace.toSeminormedAddCommGroup 𝕜 E
let : NormedSpace 𝕜 E := IsNormableSpace.toNormedSpace 𝕜 E
let : SeminormedAddCommGroup F := IsNormableSpace.toSeminormedAddCommGroup 𝕜₂ F
let : NormedSpace 𝕜₂ F := IsNormableSpace.toNormedSpace 𝕜₂ F
infer_instance

/-- The operator norm is submultiplicative. -/
theorem opNorm_comp_le (f : E →SL[σ₁₂] F) : ‖h.comp f‖ ≤ ‖h‖ * ‖f‖ :=
csInf_le bounds_bddBelow ⟨by positivity, fun x => by
Expand Down
Loading
Loading