Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

chore(ContinuousLinearMapWOT): generalize and golf #17492

Open
wants to merge 24 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all 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: 2 additions & 0 deletions Mathlib.lean
Original file line number Diff line number Diff line change
Expand Up @@ -4613,13 +4613,15 @@ import Mathlib.Topology.Connected.PathConnected
import Mathlib.Topology.Connected.Separation
import Mathlib.Topology.Connected.TotallyDisconnected
import Mathlib.Topology.Constructions
import Mathlib.Topology.ContinuousEvalConst
import Mathlib.Topology.ContinuousMap.Algebra
import Mathlib.Topology.ContinuousMap.Basic
import Mathlib.Topology.ContinuousMap.Bounded
import Mathlib.Topology.ContinuousMap.BoundedCompactlySupported
import Mathlib.Topology.ContinuousMap.CocompactMap
import Mathlib.Topology.ContinuousMap.Compact
import Mathlib.Topology.ContinuousMap.CompactlySupported
import Mathlib.Topology.ContinuousMap.ContinuousEval
import Mathlib.Topology.ContinuousMap.ContinuousMapZero
import Mathlib.Topology.ContinuousMap.Defs
import Mathlib.Topology.ContinuousMap.Ideals
Expand Down
11 changes: 3 additions & 8 deletions Mathlib/Analysis/InnerProductSpace/WeakOperatorTopology.lean
Original file line number Diff line number Diff line change
Expand Up @@ -33,14 +33,9 @@ open Filter in
lemma tendsto_iff_forall_inner_apply_tendsto [CompleteSpace F] {α : Type*} {l : Filter α}
{f : α → E →WOT[𝕜] F} {A : E →WOT[𝕜] F} :
Tendsto f l (𝓝 A) ↔ ∀ x y, Tendsto (fun a => ⟪y, (f a) x⟫_𝕜) l (𝓝 ⟪y, A x⟫_𝕜) := by
simp only [← InnerProductSpace.toDual_apply]
refine ⟨fun h x y => ?_, fun h => ?_⟩
· exact (tendsto_iff_forall_dual_apply_tendsto.mp h) _ _
· have h' : ∀ (x : E) (y : NormedSpace.Dual 𝕜 F),
Tendsto (fun a => y (f a x)) l (𝓝 (y (A x))) := by
intro x y
convert h x ((InnerProductSpace.toDual 𝕜 F).symm y) <;> simp
exact tendsto_iff_forall_dual_apply_tendsto.mpr h'
simp_rw [tendsto_iff_forall_dual_apply_tendsto, ← InnerProductSpace.toDual_apply]
exact .symm <| forall_congr' fun _ ↦
Equiv.forall_congr (InnerProductSpace.toDual 𝕜 F) fun _ ↦ Iff.rfl

lemma le_nhds_iff_forall_inner_apply_le_nhds [CompleteSpace F] {l : Filter (E →WOT[𝕜] F)}
{A : E →WOT[𝕜] F} : l ≤ 𝓝 A ↔ ∀ x y, l.map (fun T => ⟪y, T x⟫_𝕜) ≤ 𝓝 (⟪y, A x⟫_𝕜) :=
Expand Down
13 changes: 11 additions & 2 deletions Mathlib/Analysis/LocallyConvex/WithSeminorms.lean
Original file line number Diff line number Diff line change
Expand Up @@ -877,13 +877,22 @@ protected def SeminormFamily.sigma {κ : ι → Type*} (p : (i : ι) → Seminor

theorem withSeminorms_iInf {κ : ι → Type*} [Nonempty ((i : ι) × κ i)] [∀ i, Nonempty (κ i)]
{p : (i : ι) → SeminormFamily 𝕜 E (κ i)} {t : ι → TopologicalSpace E}
[∀ i, @TopologicalAddGroup E (t i) _] (hp : ∀ i, WithSeminorms (topology := t i) (p i)) :
(hp : ∀ i, WithSeminorms (topology := t i) (p i)) :
WithSeminorms (topology := ⨅ i, t i) (SeminormFamily.sigma p) := by
have : @TopologicalAddGroup E (⨅ i, t i) _ := topologicalAddGroup_iInf (fun i ↦ inferInstance)
have : ∀ i, @TopologicalAddGroup E (t i) _ :=
fun i ↦ @WithSeminorms.topologicalAddGroup _ _ _ _ _ _ _ (t i) _ (hp i)
have : @TopologicalAddGroup E (⨅ i, t i) _ := topologicalAddGroup_iInf inferInstance
simp_rw [@SeminormFamily.withSeminorms_iff_topologicalSpace_eq_iInf _ _ _ _ _ _ _ (_)] at hp ⊢
rw [iInf_sigma]
exact iInf_congr hp

theorem withSeminorms_pi {κ : ι → Type*} {E : ι → Type*}
[∀ i, AddCommGroup (E i)] [∀ i, Module 𝕜 (E i)] [∀ i, TopologicalSpace (E i)]
[Nonempty ((i : ι) × κ i)] [∀ i, Nonempty (κ i)] {p : (i : ι) → SeminormFamily 𝕜 (E i) (κ i)}
(hp : ∀ i, WithSeminorms (p i)) :
WithSeminorms (SeminormFamily.sigma (fun i ↦ (p i).comp (LinearMap.proj i))) :=
withSeminorms_iInf fun i ↦ (LinearMap.proj i).withSeminorms_induced (hp i)

end TopologicalConstructions

section TopologicalProperties
Expand Down
108 changes: 50 additions & 58 deletions Mathlib/Analysis/Normed/Operator/WeakOperatorTopology.lean
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ Authors: Frédéric Dupuis
-/

import Mathlib.Analysis.LocallyConvex.WithSeminorms
import Mathlib.Analysis.Normed.Module.Dual
import Mathlib.Analysis.NormedSpace.HahnBanach.SeparatingDual

/-!
# The weak operator topology
Expand Down Expand Up @@ -57,14 +57,15 @@ def ContinuousLinearMapWOT (𝕜 : Type*) (E : Type*) (F : Type*) [Semiring 𝕜
E →L[𝕜] F

@[inherit_doc]
notation:25 E " →WOT[" 𝕜 "]" F => ContinuousLinearMapWOT 𝕜 E F
notation:25 E " →WOT[" 𝕜 "] " F => ContinuousLinearMapWOT 𝕜 E F

namespace ContinuousLinearMapWOT

variable {𝕜 : Type*} {E : Type*} {F : Type*} [RCLike 𝕜] [AddCommGroup E] [TopologicalSpace E]
[Module 𝕜 E] [NormedAddCommGroup F] [NormedSpace 𝕜 F]
variable {𝕜 : Type*} {E : Type*} {F : Type*} [NormedField 𝕜]
[AddCommGroup E] [TopologicalSpace E] [Module 𝕜 E]
[AddCommGroup F] [TopologicalSpace F] [Module 𝕜 F]

local postfix:max "⋆" => NormedSpace.Dual 𝕜
local notation X "⋆" => X →L[𝕜] 𝕜

/-!
### Basic properties common with `E →L[𝕜] F`
Expand All @@ -75,18 +76,21 @@ the module structure, `FunLike`, etc.
section Basic

unseal ContinuousLinearMapWOT in
instance instAddCommGroup : AddCommGroup (E →WOT[𝕜] F) :=
instance instAddCommGroup [TopologicalAddGroup F] : AddCommGroup (E →WOT[𝕜] F) :=
inferInstanceAs <| AddCommGroup (E →L[𝕜] F)

unseal ContinuousLinearMapWOT in
instance instModule : Module 𝕜 (E →WOT[𝕜] F) := inferInstanceAs <| Module 𝕜 (E →L[𝕜] F)
instance instModule [TopologicalAddGroup F] [ContinuousConstSMul 𝕜 F] : Module 𝕜 (E →WOT[𝕜] F) :=
inferInstanceAs <| Module 𝕜 (E →L[𝕜] F)

variable (𝕜) (E) (F)
variable (𝕜) (E) (F) [TopologicalAddGroup F] [ContinuousConstSMul 𝕜 F]

unseal ContinuousLinearMapWOT in
/-- The linear equivalence that sends a continuous linear map to the type copy endowed with the
weak operator topology. -/
def _root_.ContinuousLinearMap.toWOT : (E →L[𝕜] F) ≃ₗ[𝕜] (E →WOT[𝕜] F) := LinearEquiv.refl 𝕜 _
def _root_.ContinuousLinearMap.toWOT :
(E →L[𝕜] F) ≃ₗ[𝕜] (E →WOT[𝕜] F) :=
LinearEquiv.refl 𝕜 _

variable {𝕜} {E} {F}

Expand All @@ -112,11 +116,10 @@ lemma ext_iff {A B : E →WOT[𝕜] F} : A = B ↔ ∀ x, A x = B x := Continuou
-- version with an inner product (`ContinuousLinearMapWOT.ext_inner`) takes precedence
-- in the case of Hilbert spaces.
@[ext 900]
lemma ext_dual {A B : E →WOT[𝕜] F} (h : ∀ x (y : F⋆), y (A x) = y (B x)) : A = B := by
rw [ext_iff]
intro x
specialize h x
rwa [← NormedSpace.eq_iff_forall_dual_eq 𝕜] at h
lemma ext_dual [H : SeparatingDual 𝕜 F] {A B : E →WOT[𝕜] F}
(h : ∀ x (y : F⋆), y (A x) = y (B x)) : A = B := by
simp_rw [ext_iff, ← (separatingDual_iff_injective.mp H).eq_iff, LinearMap.ext_iff]
exact h

@[simp] lemma zero_apply (x : E) : (0 : E →WOT[𝕜] F) x = 0 := by simp only [DFunLike.coe]; rfl

Expand Down Expand Up @@ -146,6 +149,8 @@ of this topology. In particular, we show that it is a topological vector space.
-/
section Topology

variable [TopologicalAddGroup F] [ContinuousConstSMul 𝕜 F]

variable (𝕜) (E) (F) in
/-- The function that induces the topology on `E →WOT[𝕜] F`, namely the function that takes
an `A` and maps it to `fun ⟨x, y⟩ => y (A x)` in `E × F⋆ → 𝕜`, bundled as a linear map to make
Expand All @@ -155,6 +160,11 @@ def inducingFn : (E →WOT[𝕜] F) →ₗ[𝕜] (E × F⋆ → 𝕜) where
map_add' := fun x y => by ext; simp
map_smul' := fun x y => by ext; simp

@[simp]
lemma inducingFn_apply {f : E →WOT[𝕜] F} {x : E} {y : F⋆} :
inducingFn 𝕜 E F f (x, y) = y (f x) :=
rfl

/-- The weak operator topology is the coarsest topology such that `fun A => y (A x)` is
continuous for all `x, y`. -/
instance instTopologicalSpace : TopologicalSpace (E →WOT[𝕜] F) :=
Expand All @@ -172,7 +182,9 @@ lemma continuous_of_dual_apply_continuous {α : Type*} [TopologicalSpace α] {g
(h : ∀ x (y : F⋆), Continuous fun a => y (g a x)) : Continuous g :=
continuous_induced_rng.2 (continuous_pi_iff.mpr fun p => h p.1 p.2)

lemma embedding_inducingFn : Embedding (inducingFn 𝕜 E F) := by
lemma inducing_inducingFn : Inducing (inducingFn 𝕜 E F) := ⟨rfl⟩

lemma embedding_inducingFn [SeparatingDual 𝕜 F] : Embedding (inducingFn 𝕜 E F) := by
refine Function.Injective.embedding_induced fun A B hAB => ?_
rw [ContinuousLinearMapWOT.ext_dual_iff]
simpa [Function.funext_iff] using hAB
Expand All @@ -183,17 +195,13 @@ open Filter in
lemma tendsto_iff_forall_dual_apply_tendsto {α : Type*} {l : Filter α} {f : α → E →WOT[𝕜] F}
{A : E →WOT[𝕜] F} :
Tendsto f l (𝓝 A) ↔ ∀ x (y : F⋆), Tendsto (fun a => y (f a x)) l (𝓝 (y (A x))) := by
have hmain : (∀ x (y : F⋆), Tendsto (fun a => y (f a x)) l (𝓝 (y (A x))))
↔ ∀ (p : E × F⋆), Tendsto (fun a => p.2 (f a p.1)) l (𝓝 (p.2 (A p.1))) :=
⟨fun h p => h p.1 p.2, fun h x y => h ⟨x, y⟩⟩
rw [hmain, ← tendsto_pi_nhds, Embedding.tendsto_nhds_iff embedding_inducingFn]
rfl
simp [inducing_inducingFn.tendsto_nhds_iff, tendsto_pi_nhds]

lemma le_nhds_iff_forall_dual_apply_le_nhds {l : Filter (E →WOT[𝕜] F)} {A : E →WOT[𝕜] F} :
l ≤ 𝓝 A ↔ ∀ x (y : F⋆), l.map (fun T => y (T x)) ≤ 𝓝 (y (A x)) :=
tendsto_iff_forall_dual_apply_tendsto (f := id)

instance instT3Space : T3Space (E →WOT[𝕜] F) := embedding_inducingFn.t3Space
instance instT3Space [SeparatingDual 𝕜 F] : T3Space (E →WOT[𝕜] F) := embedding_inducingFn.t3Space

instance instContinuousAdd : ContinuousAdd (E →WOT[𝕜] F) := .induced (inducingFn 𝕜 E F)
instance instContinuousNeg : ContinuousNeg (E →WOT[𝕜] F) := .induced (inducingFn 𝕜 E F)
Expand All @@ -210,6 +218,8 @@ end Topology
/-! ### The WOT is induced by a family of seminorms -/
section Seminorms

variable [TopologicalAddGroup F] [ContinuousConstSMul 𝕜 F]

/-- The family of seminorms that induce the weak operator topology, namely `‖y (A x)‖` for
all `x` and `y`. -/
def seminorm (x : E) (y : F⋆) : Seminorm 𝕜 (E →WOT[𝕜] F) where
Expand All @@ -225,56 +235,38 @@ all `x` and `y`. -/
def seminormFamily : SeminormFamily 𝕜 (E →WOT[𝕜] F) (E × F⋆) :=
fun ⟨x, y⟩ => seminorm x y

lemma hasBasis_seminorms : (𝓝 (0 : E →WOT[𝕜] F)).HasBasis (seminormFamily 𝕜 E F).basisSets id := by
let p := seminormFamily 𝕜 E F
rw [nhds_induced, nhds_pi]
simp only [map_zero, Pi.zero_apply]
have h := Filter.hasBasis_pi (fun _ : (E × F⋆) ↦ Metric.nhds_basis_ball (x := 0)) |>.comap
(inducingFn 𝕜 E F)
refine h.to_hasBasis' ?_ ?_
· rintro ⟨s, U₂⟩ ⟨hs, hU₂⟩
lift s to Finset (E × F⋆) using hs
by_cases hU₃ : s.Nonempty
· refine ⟨(s.sup p).ball 0 <| s.inf' hU₃ U₂, p.basisSets_mem _ <| (Finset.lt_inf'_iff _).2 hU₂,
fun x hx y hy => ?_⟩
simp only [Set.mem_preimage, Set.mem_pi, mem_ball_zero_iff]
rw [id, Seminorm.mem_ball_zero] at hx
have hp : p y ≤ s.sup p := Finset.le_sup hy
refine lt_of_le_of_lt (hp x) (lt_of_lt_of_le hx ?_)
exact Finset.inf'_le _ hy
· rw [Finset.not_nonempty_iff_eq_empty.mp hU₃]
exact ⟨(p 0).ball 0 1, p.basisSets_singleton_mem 0 one_pos, by simp⟩
· suffices ∀ U ∈ p.basisSets, U ∈ 𝓝 (0 : E →WOT[𝕜] F) by simpa [nhds_induced, nhds_pi]
exact p.basisSets_mem_nhds fun ⟨x, y⟩ ↦ continuous_dual_apply x y |>.norm

lemma withSeminorms : WithSeminorms (seminormFamily 𝕜 E F) :=
SeminormFamily.withSeminorms_of_hasBasis _ hasBasis_seminorms
let e : E × F⋆ ≃ (Σ _ : E × F⋆, Fin 1) := .symm <| .sigmaUnique _ _
have : Nonempty (Σ _ : E × F⋆, Fin 1) := e.symm.nonempty
inducing_inducingFn.withSeminorms <| withSeminorms_pi (fun _ ↦ norm_withSeminorms 𝕜 𝕜)
|>.congr_equiv e

lemma hasBasis_seminorms : (𝓝 (0 : E →WOT[𝕜] F)).HasBasis (seminormFamily 𝕜 E F).basisSets id :=
withSeminorms.hasBasis

instance instLocallyConvexSpace [Module ℝ (E →WOT[𝕜] F)] [IsScalarTower ℝ 𝕜 (E →WOT[𝕜] F)] :
instance instLocallyConvexSpace [NormedSpace ℝ 𝕜] [Module ℝ (E →WOT[𝕜] F)]
[IsScalarTower ℝ 𝕜 (E →WOT[𝕜] F)] :
LocallyConvexSpace ℝ (E →WOT[𝕜] F) :=
withSeminorms.toLocallyConvexSpace

end Seminorms

end ContinuousLinearMapWOT

section NormedSpace
section toWOT_continuous

variable {𝕜 : Type*} {E : Type*} {F : Type*} [RCLike 𝕜] [NormedAddCommGroup E]
[NormedSpace 𝕜 E] [NormedAddCommGroup F] [NormedSpace 𝕜 F]
variable [TopologicalAddGroup F] [ContinuousConstSMul 𝕜 F] [ContinuousSMul 𝕜 E]

/-- The weak operator topology is coarser than the norm topology, i.e. the inclusion map is
continuous. -/
/-- The weak operator topology is coarser than the bounded convergence topology, i.e. the inclusion
map is continuous. -/
@[continuity, fun_prop]
lemma ContinuousLinearMap.continuous_toWOT :
Continuous (ContinuousLinearMap.toWOT 𝕜 E F) := by
refine ContinuousLinearMapWOT.continuous_of_dual_apply_continuous fun x y => ?_
simp_rw [ContinuousLinearMap.toWOT_apply]
change Continuous fun a => y <| (ContinuousLinearMap.id 𝕜 (E →L[𝕜] F)).flip x a
fun_prop
Continuous (ContinuousLinearMap.toWOT 𝕜 E F) :=
ContinuousLinearMapWOT.continuous_of_dual_apply_continuous fun x y ↦
y.cont.comp <| continuous_eval_const x

/-- The inclusion map from `E →[𝕜] F` to `E →WOT[𝕜] F`, bundled as a continuous linear map. -/
def ContinuousLinearMap.toWOTCLM : (E →L[𝕜] F) →L[𝕜] (E →WOT[𝕜] F) :=
⟨LinearEquiv.toLinearMap (ContinuousLinearMap.toWOT 𝕜 E F), ContinuousLinearMap.continuous_toWOT⟩

end NormedSpace
end toWOT_continuous

end ContinuousLinearMapWOT
27 changes: 15 additions & 12 deletions Mathlib/Analysis/NormedSpace/Multilinear/Basic.lean
Original file line number Diff line number Diff line change
Expand Up @@ -80,25 +80,28 @@ variable {𝕜 ι : Type*} {E : ι → Type*} {F : Type*}
[NormedField 𝕜] [Finite ι] [∀ i, SeminormedAddCommGroup (E i)] [∀ i, NormedSpace 𝕜 (E i)]
[TopologicalSpace F] [AddCommGroup F] [TopologicalAddGroup F] [Module 𝕜 F]

/-- Applying a multilinear map to a vector is continuous in both coordinates. -/
theorem ContinuousMultilinearMap.continuous_eval :
Continuous fun p : ContinuousMultilinearMap 𝕜 E F × ∀ i, E i => p.1 p.2 := by
cases nonempty_fintype ι
let _ := TopologicalAddGroup.toUniformSpace F
have := comm_topologicalAddGroup_is_uniform (G := F)
refine (UniformOnFun.continuousOn_eval₂ fun m ↦ ?_).comp_continuous
(embedding_toUniformOnFun.continuous.prodMap continuous_id) fun (f, x) ↦ f.cont.continuousAt
exact ⟨ball m 1, NormedSpace.isVonNBounded_of_isBounded _ isBounded_ball,
ball_mem_nhds _ one_pos⟩
instance ContinuousMultilinearMap.instContinuousEval :
ContinuousEval (ContinuousMultilinearMap 𝕜 E F) (Π i, E i) F where
continuous_eval := by
cases nonempty_fintype ι
let _ := TopologicalAddGroup.toUniformSpace F
have := comm_topologicalAddGroup_is_uniform (G := F)
refine (UniformOnFun.continuousOn_eval₂ fun m ↦ ?_).comp_continuous
(embedding_toUniformOnFun.continuous.prod_map continuous_id) fun (f, x) ↦ f.cont.continuousAt
exact ⟨ball m 1, NormedSpace.isVonNBounded_of_isBounded _ isBounded_ball,
ball_mem_nhds _ one_pos⟩

@[deprecated (since := "2024-10-05")]
protected alias ContinuousMultilinearMap.continuous_eval := continuous_eval

namespace ContinuousLinearMap

variable {G : Type*} [AddCommGroup G] [TopologicalSpace G] [Module 𝕜 G] [ContinuousConstSMul 𝕜 F]
(f : G →L[𝕜] ContinuousMultilinearMap 𝕜 E F)

lemma continuous_uncurry_of_multilinear :
Continuous (fun (p : G × (Π i, E i)) ↦ f p.1 p.2) :=
ContinuousMultilinearMap.continuous_eval.comp <| .prodMap (map_continuous f) continuous_id
Continuous (fun (p : G × (Π i, E i)) ↦ f p.1 p.2) := by
fun_prop

lemma continuousOn_uncurry_of_multilinear {s} :
ContinuousOn (fun (p : G × (Π i, E i)) ↦ f p.1 p.2) s :=
Expand Down
4 changes: 2 additions & 2 deletions Mathlib/Analysis/NormedSpace/OperatorNorm/Completeness.lean
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ def ofMemClosureImageCoeBounded (f : E' → F) {s : Set (E' →SL[σ₁₂] F)}
rcases isBounded_iff_forall_norm_le.1 hs with ⟨C, hC⟩
-- Then `‖g x‖ ≤ C * ‖x‖` for all `g ∈ s`, `x : E`, hence `‖f x‖ ≤ C * ‖x‖` for all `x`.
have : ∀ x, IsClosed { g : E' → F | ‖g x‖ ≤ C * ‖x‖ } := fun x =>
isClosed_Iic.preimage (@continuous_apply E' (fun _ => F) _ x).norm
isClosed_Iic.preimage (@_root_.continuous_apply E' (fun _ => F) _ x).norm
refine ⟨C, fun x => (this x).closure_subset_iff.2 (image_subset_iff.2 fun g hg => ?_) hf⟩
exact g.le_of_opNorm_le (hC _ hg) _

Expand Down Expand Up @@ -153,7 +153,7 @@ theorem is_weak_closed_closedBall (f₀ : E' →SL[σ₁₂] F) (r : ℝ) ⦃f :
have hr : 0 ≤ r := nonempty_closedBall.1 (closure_nonempty_iff.1 ⟨_, hf⟩).of_image
refine mem_closedBall_iff_norm.2 (opNorm_le_bound _ hr fun x => ?_)
have : IsClosed { g : E' → F | ‖g x - f₀ x‖ ≤ r * ‖x‖ } :=
isClosed_Iic.preimage ((@continuous_apply E' (fun _ => F) _ x).sub continuous_const).norm
isClosed_Iic.preimage ((@_root_.continuous_apply E' (fun _ => F) _ x).sub continuous_const).norm
refine this.closure_subset_iff.2 (image_subset_iff.2 fun g hg => ?_) hf
exact (g - f₀).le_of_opNorm_le (mem_closedBall_iff_norm.1 hg) _

Expand Down
4 changes: 2 additions & 2 deletions Mathlib/Analysis/ODE/PicardLindelof.lean
Original file line number Diff line number Diff line change
Expand Up @@ -223,10 +223,10 @@ instance [CompleteSpace E] : CompleteSpace v.FunSpace := by
refine (completeSpace_iff_isComplete_range isUniformInducing_toContinuousMap).2
(IsClosed.isComplete ?_)
rw [range_toContinuousMap, setOf_and]
refine (isClosed_eq (ContinuousMap.continuous_eval_const _) continuous_const).inter ?_
refine (isClosed_eq (continuous_eval_const _) continuous_const).inter ?_
have : IsClosed {f : Icc v.tMin v.tMax → E | LipschitzWith v.C f} :=
isClosed_setOf_lipschitzWith v.C
exact this.preimage ContinuousMap.continuous_coe
exact this.preimage continuous_coeFun

theorem intervalIntegrable_vComp (t₁ t₂ : ℝ) : IntervalIntegrable f.vComp volume t₁ t₂ :=
f.continuous_vComp.intervalIntegrable _ _
Expand Down
15 changes: 12 additions & 3 deletions Mathlib/Topology/Algebra/ContinuousMonoidHom.lean
Original file line number Diff line number Diff line change
Expand Up @@ -244,6 +244,15 @@ theorem embedding_toContinuousMap :
Embedding (toContinuousMap : ContinuousMonoidHom A B → C(A, B)) :=
⟨inducing_toContinuousMap A B, toContinuousMap_injective⟩

@[to_additive]
instance instContinuousEvalConst : ContinuousEvalConst (ContinuousMonoidHom A B) A B :=
.of_continuous_forget (inducing_toContinuousMap A B).continuous

@[to_additive]
instance instContinuousEval [LocallyCompactPair A B] :
ContinuousEval (ContinuousMonoidHom A B) A B :=
.of_continuous_forget (inducing_toContinuousMap A B).continuous

@[to_additive]
lemma range_toContinuousMap :
Set.range (toContinuousMap : ContinuousMonoidHom A B → C(A, B)) =
Expand All @@ -258,10 +267,10 @@ theorem closedEmbedding_toContinuousMap [ContinuousMul B] [T2Space B] :
toEmbedding := embedding_toContinuousMap A B
isClosed_range := by
simp only [range_toContinuousMap, Set.setOf_and, Set.setOf_forall]
refine .inter (isClosed_singleton.preimage (ContinuousMap.continuous_eval_const 1)) <|
refine .inter (isClosed_singleton.preimage (continuous_eval_const 1)) <|
isClosed_iInter fun x ↦ isClosed_iInter fun y ↦ ?_
exact isClosed_eq (ContinuousMap.continuous_eval_const (x * y)) <|
.mul (ContinuousMap.continuous_eval_const x) (ContinuousMap.continuous_eval_const y)
exact isClosed_eq (continuous_eval_const (x * y)) <|
.mul (continuous_eval_const x) (continuous_eval_const y)

variable {A B C D E}

Expand Down
Loading
Loading