Zulip Chat Archive
Stream: Is there code for X?
Topic: continuous on image of embedding
Junyan Xu (May 15 2025 at 14:07):
Is there a simpler proof than
import Mathlib.Topology.Homeomorph.Lemmas
namespace Topology.IsEmbedding
variable {X Y Z : Type*} [TopologicalSpace X] [TopologicalSpace Y] [TopologicalSpace Z]
(s : Set X) {i : X → Y} (emb : IsEmbedding i) (f : Y → Z)
include emb
noncomputable def homeomorphImage : s ≃ₜ i '' s :=
(emb.comp .subtypeVal).toHomeomorph.trans <| .setCongr <| by simp [Set.range_comp]
theorem continuousOn_image_iff :
ContinuousOn f (i '' s) ↔ ContinuousOn (f ∘ i) s := by
refine ⟨(·.image_comp_continuous emb.continuous), fun h ↦ ?_⟩
rw [continuousOn_iff_continuous_restrict] at h ⊢
rwa [← (emb.homeomorphImage s).comp_continuous_iff']
end Topology.IsEmbedding
?
Aaron Liu (May 15 2025 at 14:22):
This already looks pretty short, I think you can probably weaken IsEmbedding i to IsInducing i in continuousOn_image_iff
Junyan Xu (May 15 2025 at 15:20):
You are right!
import Mathlib.Topology.Homeomorph.Lemmas
namespace Topology.IsInducing
variable {X Y Z : Type*} [TopologicalSpace X] [TopologicalSpace Y] [TopologicalSpace Z]
{i : X → Y} {f : Y → Z}
theorem continuous_iff_of_surjective (ind : IsInducing i) (surj : Function.Surjective i) :
Continuous (f ∘ i) ↔ Continuous f := by
refine ⟨fun h ↦ ⟨fun U hU ↦ ?_⟩, (·.comp ind.continuous)⟩
have ⟨V, hV, (eq : _ = i ⁻¹' (f ⁻¹' U))⟩ := ind.isOpen_iff.mp (hU.preimage h)
rwa [← surj.preimage_injective eq]
theorem continuousOn_image_iff {s : Set X} (ind : IsInducing i) :
ContinuousOn f (i '' s) ↔ ContinuousOn (f ∘ i) s := by
simp_rw [continuousOn_iff_continuous_restrict]
exact (((ind.comp .subtypeVal).codRestrict (s := i '' s)
fun x ↦ ⟨x, x.2, rfl⟩).continuous_iff_of_surjective <| by
rintro ⟨_, x, hx, rfl⟩; exact ⟨⟨x, hx⟩, rfl⟩).symm
end Topology.IsInducing
Aaron Liu (May 15 2025 at 16:07):
Here's what I came up with
import Mathlib.Topology.Homeomorph.Lemmas
theorem TopologicalSpace.induced_le_induced_iff_of_surjective {X Y : Type*}
{t₁ t₂ : TopologicalSpace Y} {f : X → Y}
(hf : f.Surjective) : t₁.induced f ≤ t₂.induced f ↔ t₁ ≤ t₂ := by
refine ⟨fun h => ?_, induced_mono⟩ -- should `induced_mono` be namespaced?
rw [TopologicalSpace.le_def] at h ⊢
intro s
simpa [isOpen_induced_iff, hf.preimage_injective.eq_iff] using h (f ⁻¹' s)
theorem Topology.IsInducing.continuousOn_image_iff {X Y Z : Type*}
[TopologicalSpace X] [TopologicalSpace Y] [TopologicalSpace Z]
(s : Set X) {i : X → Y} (hi : IsInducing i) (f : Y → Z) :
ContinuousOn f (i '' s) ↔ ContinuousOn (f ∘ i) s := by
refine ⟨(·.image_comp_continuous hi.continuous), fun h ↦ ?_⟩
simp_rw [continuousOn_iff_continuous_restrict, continuous_iff_le_induced,
Set.restrict_eq, instTopologicalSpaceSubtype] at h ⊢
rw [hi.eq_induced, induced_compose, Function.comp_assoc, ← Set.imageFactorization_eq] at h
simp_rw [← induced_compose] at h ⊢
rwa [TopologicalSpace.induced_le_induced_iff_of_surjective (Set.surjective_onto_image)] at h
Andrew Yang (May 15 2025 at 16:14):
The right lean proof (for IsEmbedding) is probably
theorem continuousOn_image_iff :
ContinuousOn f (i '' s) ↔ ContinuousOn (f ∘ i) s := by
simp [ContinuousOn, ContinuousWithinAt, ← emb.map_nhdsWithin_eq]
And it is probably possible to extend this to inducing.
Aaron Liu (May 15 2025 at 17:24):
import Mathlib.Topology.Homeomorph.Lemmas
namespace Topology.IsInducing
theorem map_nhdsWithin_eq {α β : Type*}
[TopologicalSpace α] [TopologicalSpace β] {f : α → β} (hf : IsInducing f)
(s : Set α) (x : α) : Filter.map f (𝓝[s] x) = 𝓝[f '' s] f x := by
apply le_antisymm
· rw [nhdsWithin, nhdsWithin]
apply Filter.map_inf_le.trans
apply inf_le_inf
· exact hf.continuous.tendsto x
· rw [Filter.map_principal]
· intro U hU
rw [Filter.mem_map] at hU
rw [mem_nhdsWithin_iff_eventually] at hU ⊢
rw [hf.nhds_eq_comap, Filter.eventually_comap] at hU
filter_upwards [hU] with b hb ⟨a, ha, hab⟩
subst hab
exact hb a rfl ha
Aaron Liu (May 15 2025 at 17:25):
You don't need an embedding
Junyan Xu (May 15 2025 at 17:42):
Very nice! The proof of Topology.IsEmbedding.map_nhdsWithin_eq doesn't generalize (requires injectivity) so I was wondering whether this is true ...
Michael Rothgang (May 20 2025 at 09:05):
Would you like to PR this?
Junyan Xu (May 20 2025 at 10:05):
(deleted)
Junyan Xu (May 20 2025 at 10:10):
If the task falls on me I'd PR it with the file Trivialization.lean here which uses it ((Topology.IsInducing.subtypeVal.prodMap .id).continuousOn_image_iff.2).
Junyan Xu (May 20 2025 at 10:57):
Okay, I decided to make a separate PR #25041
Junyan Xu (May 20 2025 at 11:02):
and make the trivialization PR #25042 depend on it. It includes restriction/extension of Trivialization and composition with Homeomorph, which was required to restrict/extend/compose covering maps, but may no longer be needed after the definition changes in #24983. It should be useful in other situations nonetheless.
Last updated: Dec 20 2025 at 21:32 UTC