Skip to content

Commit db04522

Browse files
committed
more structure!
1 parent 19dc707 commit db04522

1 file changed

Lines changed: 176 additions & 60 deletions

File tree

Mathlib/Analysis/LocallyConvex/WeakOperatorTopology.lean

Lines changed: 176 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ Authors: Frédéric Dupuis
55
-/
66
module
77

8-
public import Mathlib.Algebra.Ring.TransferInstance
8+
public import Mathlib.Algebra.Algebra.TransferInstance
99
public import Mathlib.Analysis.LocallyConvex.WithSeminorms
1010
public import Mathlib.Analysis.LocallyConvex.SeparatingDual
1111
public import Mathlib.Topology.Algebra.Module.Spaces.ContinuousLinearMap
@@ -162,6 +162,11 @@ instance instIsCentralScalar {S : Type*} [Semiring S] [Module S F] [SMulCommClas
162162
instance instRing [IsTopologicalAddGroup E] : Ring (E →WOT[𝕜₁] E) :=
163163
equiv.ring
164164

165+
instance instAlgebra {S : Type*} [CommSemiring S] [Module S E] [SMulCommClass 𝕜₁ S E] [SMul S 𝕜₁]
166+
[IsScalarTower S 𝕜₁ E] [ContinuousConstSMul S E] [IsTopologicalAddGroup E] :
167+
Algebra S (E →WOT[𝕜₁] E) :=
168+
equiv.algebra S
169+
165170
/-- The additive group equivalence between `ContinuousLinearMapWOT` and `ContinuousLinearMap`. -/
166171
@[simps!]
167172
def addEquiv [IsTopologicalAddGroup F] : (E →SWOT[σ] F) ≃+ (E →SL[σ] F) :=
@@ -179,6 +184,13 @@ def linearEquiv (S : Type*) [Semiring S] [Module S F] [SMulCommClass 𝕜₂ S F
179184
def ringEquiv [IsTopologicalAddGroup E] : (E →WOT[𝕜₁] E) ≃+* (E →L[𝕜₁] E) :=
180185
equiv.ringEquiv
181186

187+
/-- The algebra equivalence between `ContinuousLinearMapWOT` and `ContinuousLinearMap`. -/
188+
@[simps!]
189+
def algEquiv (S : Type*) [CommSemiring S] [Module S E] [SMulCommClass 𝕜₁ S E] [SMul S 𝕜₁]
190+
[IsScalarTower S 𝕜₁ E] [ContinuousConstSMul S E] [IsTopologicalAddGroup E] :
191+
(E →WOT[𝕜₁] E) ≃ₐ[S] (E →L[𝕜₁] E) :=
192+
equiv.algEquiv S
193+
182194
instance instFunLike : FunLike (E →SWOT[σ] F) E F where
183195
coe f := toCLM f
184196
coe_injective' := DFunLike.coe_injective.comp toCLM_injective
@@ -197,7 +209,7 @@ instance instContinuousLinearMapClass : ContinuousSemilinearMapClass (E →SWOT[
197209
@[simp]
198210
lemma ofCLM_toCLM (A : E →SWOT[σ] F) : ofCLM (toCLM A) = A := rfl
199211

200-
@[simp]
212+
-- not marked `simp` because Lean just sees `A` on the left-hand side
201213
lemma toCLM_ofCLM (A : E →SL[σ] F) : toCLM (ofCLM A) = A := rfl
202214

203215
@[simp]
@@ -223,74 +235,65 @@ lemma ext_dual [H : SeparatingDual 𝕜₂ F] {A B : E →SWOT[σ] F}
223235
simp_rw [ext_iff, ← (separatingDual_iff_injective.mp H).eq_iff, LinearMap.ext_iff]
224236
exact h
225237

226-
@[simp] lemma ofCLM_smul {S : Type*} [DistribSMul S F] [SMulCommClass 𝕜₂ S F]
227-
[ContinuousConstSMul S F] {c : S} {f : E →SL[σ] F} : ofCLM (c • f) = c • ofCLM f :=
228-
toCLM_injective rfl
229-
230-
@[simp] lemma toCLM_smul {S : Type*} [DistribSMul S F] [SMulCommClass 𝕜₂ S F]
231-
[ContinuousConstSMul S F] {c : S} {f : E →SWOT[σ] F} : toCLM (c • f) = c • toCLM f :=
232-
ofCLM_injective rfl
233-
234-
@[simp] lemma smul_apply {S : Type*} [DistribSMul S F] [SMulCommClass 𝕜₂ S F]
235-
[ContinuousConstSMul S F] {f : E →SWOT[σ] F} (c : S) (x : E) : (c • f) x = c • (f x) := by
236-
simp only [DFunLike.coe]; rfl
237-
238-
variable [IsTopologicalAddGroup F]
239-
240-
@[simp] lemma ofCLM_zero : ofCLM (0 : E →SL[σ] F) = 0 :=
241-
toCLM_injective rfl
242-
243-
@[simp] lemma ofCLM_add {f g : E →SL[σ] F} : ofCLM (f + g) = ofCLM f + ofCLM g :=
244-
toCLM_injective rfl
245-
246-
@[simp] lemma ofCLM_sub {f g : E →SL[σ] F} : ofCLM (f - g) = ofCLM f - ofCLM g :=
247-
toCLM_injective rfl
248-
249-
@[simp] lemma ofCLM_neg {f : E →SL[σ] F} : ofCLM (-f) = -ofCLM f :=
250-
toCLM_injective rfl
251-
252-
@[simp] lemma ofCLM_mul (f g : F →L[𝕜₂] F) : ofCLM (f * g) = ofCLM f * ofCLM g :=
253-
toCLM_injective rfl
238+
section SMul
254239

255-
@[simp] lemma ofCLM_one : ofCLM (1 : F →L[𝕜₂] F) = 1 :=
256-
toCLM_injective rfl
240+
variable {S : Type*} [DistribSMul S F] [SMulCommClass 𝕜₂ S F] [ContinuousConstSMul S F]
257241

258-
@[simp] lemma toCLM_zero : toCLM (0 : E →SWOT[σ] F) = 0 :=
259-
ofCLM_injective rfl
242+
@[simp] lemma ofCLM_smul {c : S} {f : E →SL[σ] F} : ofCLM (c • f) = c • ofCLM f := rfl
243+
@[simp] lemma toCLM_smul {c : S} {f : E →SWOT[σ] F} : toCLM (c • f) = c • toCLM f := rfl
244+
@[simp] lemma smul_apply {f : E →SWOT[σ] F} (c : S) (x : E) : (c • f) x = c • (f x) := rfl
260245

261-
@[simp] lemma toCLM_add {f g : E →SWOT[σ] F} : toCLM (f + g) = toCLM f + toCLM g :=
262-
ofCLM_injective rfl
246+
end SMul
263247

264-
@[simp] lemma toCLM_sub {f g : E →SWOT[σ] F} : toCLM (f - g) = toCLM f - toCLM g :=
265-
ofCLM_injective rfl
248+
section Algebra
266249

267-
@[simp] lemma toCLM_neg {f : E →SWOT[σ] F} : toCLM (-f) = -toCLM f :=
268-
ofCLM_injective rfl
250+
variable {S : Type*} [CommSemiring S] [Module S E] [SMulCommClass 𝕜₁ S E] [SMul S 𝕜₁]
251+
[IsScalarTower S 𝕜₁ E] [ContinuousConstSMul S E] [IsTopologicalAddGroup E]
269252

270-
@[simp] lemma toCLM_mul (f g : F →WOT[𝕜₂] F) : toCLM (f * g) = toCLM f * toCLM g :=
271-
ofCLM_injective rfl
272-
273-
@[simp] lemma toCLM_one : toCLM (1 : F →WOT[𝕜₂] F) = 1 :=
274-
ofCLM_injective rfl
275-
276-
@[simp] lemma zero_apply (x : E) : (0 : E →SWOT[σ] F) x = 0 := by
277-
simp [← coe_toCLM, ← addEquiv_apply]
253+
@[simp] lemma toCLM_algebraMap (c : S) :
254+
toCLM (algebraMap S (E →WOT[𝕜₁] E) c) = algebraMap S (E →L[𝕜₁] E) c :=
255+
rfl
278256

279-
@[simp] lemma add_apply {f g : E →SWOT[σ] F} (x : E) : (f + g) x = f x + g x := by
280-
simp [← coe_toCLM, ← addEquiv_apply]
257+
@[simp] lemma ofCLM_algebraMap (c : S) :
258+
ofCLM (algebraMap S (E →L[𝕜₁] E) c) = algebraMap S (E →WOT[𝕜₁] E) c :=
259+
rfl
281260

282-
@[simp] lemma sub_apply {f g : E →SWOT[σ] F} (x : E) : (f - g) x = f x - g x := by
283-
simp [← coe_toCLM, ← addEquiv_apply]
261+
@[simp] lemma algebraMapCLM_apply (c : S) (x : E) :
262+
(algebraMap S (E →WOT[𝕜₁] E) c) x = c • x :=
263+
rfl
284264

285-
@[simp] lemma neg_apply {f : E →SWOT[σ] F} (x : E) : (-f) x = -(f x) := by
286-
simp [← coe_toCLM, ← addEquiv_apply]
265+
end Algebra
287266

288-
@[simp] lemma mul_apply (f g : F →WOT[𝕜₂] F) (x : F) :
289-
(f * g) x = f (g x) := by
290-
rfl
267+
variable [IsTopologicalAddGroup F]
291268

292-
@[simp] lemma one_apply (x : F) : (1 : F →WOT[𝕜₂] F) x = x := by
293-
rfl
269+
@[simp] lemma ofCLM_zero : ofCLM (0 : E →SL[σ] F) = 0 := rfl
270+
@[simp] lemma ofCLM_add {f g : E →SL[σ] F} : ofCLM (f + g) = ofCLM f + ofCLM g := rfl
271+
@[simp] lemma ofCLM_sub {f g : E →SL[σ] F} : ofCLM (f - g) = ofCLM f - ofCLM g := rfl
272+
@[simp] lemma ofCLM_neg {f : E →SL[σ] F} : ofCLM (-f) = -ofCLM f := rfl
273+
@[simp] lemma ofCLM_mul (f g : F →L[𝕜₂] F) : ofCLM (f * g) = ofCLM f * ofCLM g := rfl
274+
@[simp] lemma ofCLM_one : ofCLM (1 : F →L[𝕜₂] F) = 1 := rfl
275+
@[simp] lemma ofCLM_pow (f : F →L[𝕜₂] F) (n : ℕ) : ofCLM (f ^ n) = ofCLM f ^ n := rfl
276+
@[simp] lemma ofCLM_natCast (n : ℕ) : ofCLM (n : F →L[𝕜₂] F) = n := rfl
277+
@[simp] lemma ofCLM_intCast (n : ℤ) : ofCLM (n : F →L[𝕜₂] F) = n := rfl
278+
279+
@[simp] lemma toCLM_zero : toCLM (0 : E →SWOT[σ] F) = 0 := rfl
280+
@[simp] lemma toCLM_add {f g : E →SWOT[σ] F} : toCLM (f + g) = toCLM f + toCLM g := rfl
281+
@[simp] lemma toCLM_sub {f g : E →SWOT[σ] F} : toCLM (f - g) = toCLM f - toCLM g := rfl
282+
@[simp] lemma toCLM_neg {f : E →SWOT[σ] F} : toCLM (-f) = -toCLM f := rfl
283+
@[simp] lemma toCLM_mul (f g : F →WOT[𝕜₂] F) : toCLM (f * g) = toCLM f * toCLM g := rfl
284+
@[simp] lemma toCLM_one : toCLM (1 : F →WOT[𝕜₂] F) = 1 := rfl
285+
@[simp] lemma toCLM_pow (f : F →WOT[𝕜₂] F) (n : ℕ) : (f ^ n).toCLM = f.toCLM ^ n := rfl
286+
@[simp] lemma toCLM_natCast (n : ℕ) : (n : F →WOT[𝕜₂] F).toCLM = n := rfl
287+
@[simp] lemma toCLM_intCast (n : ℤ) : (n : F →WOT[𝕜₂] F).toCLM = n := rfl
288+
289+
@[simp] lemma zero_apply (x : E) : (0 : E →SWOT[σ] F) x = 0 := rfl
290+
@[simp] lemma add_apply {f g : E →SWOT[σ] F} (x : E) : (f + g) x = f x + g x := rfl
291+
@[simp] lemma sub_apply {f g : E →SWOT[σ] F} (x : E) : (f - g) x = f x - g x := rfl
292+
@[simp] lemma neg_apply {f : E →SWOT[σ] F} (x : E) : (-f) x = -(f x) := rfl
293+
@[simp] lemma mul_apply (f g : F →WOT[𝕜₂] F) (x : F) : (f * g) x = f (g x) := rfl
294+
@[simp] lemma one_apply (x : F) : (1 : F →WOT[𝕜₂] F) x = x := rfl
295+
@[simp] lemma natCast_apply (n : ℕ) (x : F) : (n : F →WOT[𝕜₂] F) x = n • x := rfl
296+
@[simp] lemma intCast_apply (n : ℤ) (x : F) : (n : F →WOT[𝕜₂] F) x = n • x := rfl
294297

295298
end Basic
296299

@@ -359,7 +362,18 @@ lemma le_nhds_iff_forall_dual_apply_le_nhds {l : Filter (E →SWOT[σ] F)} {A :
359362
instance instT3Space [SeparatingDual 𝕜₂ F] : T3Space (E →SWOT[σ] F) :=
360363
isEmbedding_inducingFn.t3Space
361364

362-
instance instContinuousSMul : ContinuousSMul 𝕜₂ (E →SWOT[σ] F) := .induced (inducingFn σ E F)
365+
instance {S : Type*} [DistribSMul S F] [SMulCommClass 𝕜₂ S F] [ContinuousConstSMul S F]
366+
[SMul S 𝕜₂] [IsScalarTower S 𝕜₂ 𝕜₂] [IsScalarTower S 𝕜₂ F] :
367+
ContinuousConstSMul S (F →WOT[𝕜₂] F) where
368+
continuous_const_smul c := by
369+
apply continuous_of_dual_apply_continuous fun _ _ ↦ ?_
370+
simp only [smul_apply, ContinuousLinearMap.map_smul_of_tower]
371+
exact continuous_const_smul c |>.comp <| continuous_dual_apply ..
372+
373+
instance instContinuousSMul {S : Type*} [Semiring S] [Module S F] [SMulCommClass 𝕜₂ S F]
374+
[Module S 𝕜₂] [IsScalarTower S 𝕜₂ F] [IsScalarTower S 𝕜₂ 𝕜₂] [ContinuousConstSMul S F]
375+
[TopologicalSpace S] [ContinuousSMul S 𝕜₂] :
376+
ContinuousSMul S (E →SWOT[σ] F) := .induced <| (inducingFn σ E F).restrictScalars S
363377

364378
instance instIsTopologicalAddGroup : IsTopologicalAddGroup (E →SWOT[σ] F) where
365379
toContinuousAdd := .induced (inducingFn σ E F)
@@ -419,11 +433,113 @@ lemma continuous_ofCLM :
419433
ContinuousLinearMapWOT.continuous_of_dual_apply_continuous fun x y ↦
420434
y.cont.comp <| continuous_eval_const x
421435

436+
@[deprecated (since := "2026-04-10")] alias ContinuousLinearMap.continuous_toWOT := continuous_ofCLM
437+
422438
/-- The inclusion map from `E →[𝕜] F` to `E →WOT[𝕜] F`, bundled as a continuous linear map. -/
423439
def _root_.ContinuousLinearMap.WOTofCLM : (E →SL[σ] F) →L[𝕜₂] (E →SWOT[σ] F) where
424440
toLinearMap := linearEquiv 𝕜₂ |>.symm.toLinearMap
425441
cont := continuous_ofCLM
426442

443+
@[deprecated (since := "2026-04-10")]
444+
alias ContinuousLinearMap.toWOTCLM := ContinuousLinearMap.WOTofCLM
445+
427446
end toWOT_continuous
428447

448+
449+
section Comp
450+
451+
variable {𝕜₁ 𝕜₂ 𝕜₃ 𝕜₄ : Type*} {E F G H : Type*}
452+
[NormedField 𝕜₁] [NormedField 𝕜₂] [NormedField 𝕜₃] [NormedField 𝕜₄]
453+
{σ₁₂ : 𝕜₁ →+* 𝕜₂} {σ₁₃ : 𝕜₁ →+* 𝕜₃} {σ₁₄ : 𝕜₁ →+* 𝕜₄}
454+
{σ₂₃ : 𝕜₂ →+* 𝕜₃} {σ₂₄ : 𝕜₂ →+* 𝕜₄} {σ₃₄ : 𝕜₃ →+* 𝕜₄}
455+
[RingHomCompTriple σ₁₂ σ₂₃ σ₁₃] [RingHomCompTriple σ₁₃ σ₃₄ σ₁₄]
456+
[RingHomCompTriple σ₁₂ σ₂₄ σ₁₄] [RingHomCompTriple σ₂₃ σ₃₄ σ₂₄]
457+
[AddCommGroup E] [TopologicalSpace E] [Module 𝕜₁ E]
458+
[AddCommGroup F] [TopologicalSpace F] [Module 𝕜₂ F]
459+
[AddCommGroup G] [TopologicalSpace G] [Module 𝕜₃ G]
460+
[AddCommGroup H] [TopologicalSpace H] [Module 𝕜₄ H]
461+
462+
variable (𝕜₂ F) in
463+
/-- The identity as a continuous linear map on the type synonym equipped with the weak operator
464+
topology -/
465+
protected def id : F →WOT[𝕜₂] F := ofCLM <| .id 𝕜₂ F
466+
467+
@[simp]
468+
lemma toCLM_id : (.id 𝕜₂ F : F →WOT[𝕜₂] F).toCLM = .id 𝕜₂ F := rfl
469+
470+
/-- Composition of continuous linear maps on the type synonym equipped with the weak operator
471+
topology. -/
472+
def comp (g : F →SWOT[σ₂₃] G) (f : E →SWOT[σ₁₂] F) : E →SWOT[σ₁₃] G :=
473+
ofCLM <| g.toCLM.comp f.toCLM
474+
475+
@[simp]
476+
lemma comp_apply (g : F →SWOT[σ₂₃] G) (f : E →SWOT[σ₁₂] F) (x : E) :
477+
g.comp f x = g (f x) := by
478+
simp [comp]
479+
480+
@[simp] lemma toCLM_comp (g : F →SWOT[σ₂₃] G) (f : E →SWOT[σ₁₂] F) :
481+
(g.comp f).toCLM = g.toCLM.comp f.toCLM :=
482+
rfl
483+
484+
@[simp] lemma comp_id (f : E →SWOT[σ₁₂] F) : comp (.id 𝕜₂ F) f = f := by simp [comp]
485+
@[simp] lemma id_comp (g : F →SWOT[σ₂₃] G) : comp g (.id 𝕜₂ F) = g := by simp [comp]
486+
487+
lemma comp_assoc (g₃₄ : G →SWOT[σ₃₄] H) (g₂₃ : F →SWOT[σ₂₃] G) (g₁₂ : E →SWOT[σ₁₂] F) :
488+
(g₃₄.comp g₂₃).comp g₁₂ = g₃₄.comp (g₂₃.comp g₁₂) := by
489+
simp only [comp, ContinuousLinearMap.comp_assoc]
490+
491+
lemma mul_eq_comp [IsTopologicalAddGroup F] (f g : F →WOT[𝕜₂] F) : f * g = f.comp g := rfl
492+
493+
@[fun_prop]
494+
lemma continuous_precomp [IsTopologicalAddGroup G] [ContinuousConstSMul 𝕜₃ G] (f : E →SWOT[σ₁₂] F) :
495+
Continuous (fun g : F →SWOT[σ₂₃] G ↦ g.comp f) :=
496+
continuous_of_dual_apply_continuous fun _ _ ↦ continuous_dual_apply ..
497+
498+
variable [IsTopologicalAddGroup F] [ContinuousConstSMul 𝕜₂ F]
499+
variable [IsTopologicalAddGroup G] [ContinuousConstSMul 𝕜₃ G]
500+
501+
/-- While `RingHomSurjective σ₂₃` is not a strict requirement, there are obstructions to
502+
this without any assumption on `σ₂₃` (in particular, on the dimension of the extension of `𝕜₃` over
503+
`σ₂₃(𝕜₂)`), and in the only common case, which is when `σ₂₃` is conjugation, this type class is
504+
guaranteed. Likewise, it would suffice if `RingHomIsometric` were replaced with the weaker
505+
`Continuous σ₂₃`, but we opt for this because we have these type classes available. -/
506+
@[fun_prop]
507+
lemma continuous_postcomp [RingHomSurjective σ₂₃] [RingHomIsometric σ₂₃] (g : F →SWOT[σ₂₃] G) :
508+
Continuous (fun f : E →SWOT[σ₁₂] F ↦ g.comp f) := by
509+
refine continuous_of_dual_apply_continuous fun x z ↦ ?_
510+
have σ_bij : Function.Bijective σ₂₃ := ⟨σ₂₃.injective, RingHomSurjective.is_surjective⟩
511+
let σ_equiv : 𝕜₂ ≃+* 𝕜₃ := RingEquiv.ofBijective σ₂₃ σ_bij
512+
let invPair : RingHomInvPair σ₂₃ σ_equiv.symm := RingHomInvPair.of_ringEquiv σ_equiv
513+
let invPair_symm := invPair.symm
514+
let σ_li : 𝕜₂ ≃ₛₗᵢ[σ₂₃] 𝕜₃ :=
515+
{ toLinearEquiv := .ofBijective σ₂₃.toSemilinearMap σ_bij
516+
norm_map' _ := RingHomIsometric.norm_map }
517+
conv => enter [1, a]; rw [← σ_li.apply_symm_apply (z _), comp_apply, ← toCLM_apply]
518+
apply σ_li.continuous.comp
519+
exact continuous_dual_apply x <| σ_li.symm.toLinearIsometry.toContinuousLinearMap.comp <|
520+
z.comp g.toCLM
521+
522+
/-- Precomposition by a fixed continuous linear map, as a continuous linear map when all spaces
523+
of continuous linear maps are equipped with the weak operator topology. -/
524+
@[simps]
525+
def precompCLM (f : E →SWOT[σ₁₂] F) : (F →SWOT[σ₂₃] G) →L[𝕜₃] (E →SWOT[σ₁₃] G) where
526+
toFun g := g.comp f
527+
map_add' := by simp [comp]
528+
map_smul' := by simp [comp]
529+
530+
/-- Precomposition by a fixed continuous linear map, as a continuous linear map when all spaces
531+
of continuous linear maps are equipped with the weak operator topology. -/
532+
@[simps]
533+
def postcompCLM [RingHomSurjective σ₂₃] [RingHomIsometric σ₂₃] (g : F →SWOT[σ₂₃] G) :
534+
(E →SWOT[σ₁₂] F) →SL[σ₂₃] (E →SWOT[σ₁₃] G) where
535+
toFun f := g.comp f
536+
map_add' := by simp [comp]
537+
map_smul' := by simp [comp]
538+
539+
instance : IsSemitopologicalRing (F →WOT[𝕜₂] F) where
540+
continuous_const_mul {_} := by simp_rw [mul_eq_comp]; fun_prop
541+
continuous_mul_const {_} := by simp_rw [mul_eq_comp]; fun_prop
542+
543+
end Comp
544+
429545
end ContinuousLinearMapWOT

0 commit comments

Comments
 (0)