Zulip Chat Archive
Stream: Is there code for X?
Topic: continuity of a function between generalized loop space
Wenrong Zou (Feb 12 2026 at 05:54):
I am constructing two type equivalent of Ω^M (Ω^N X) ≃ₜ Ω^(M⊕N) X, where Ω^M is GenLoop. I already define toFun, invFun and proved left_inv and right_inv. But I am stuck at prove toFun and invFun is continuous. I think the continuity should be proved easily (just followed by construction and maybe by fun_prop) or maybe I am wrong. I have tried for a while but failed. Could anyone give me some suggestion. Thanks in advance!
import Mathlib
open Cube
open scoped unitInterval Topology
open scoped Topology.Homotopy
variable {X : Type*} [TopologicalSpace X] (x : X) {M N : Type*}
/-- Homeomorphism `I^(M ⊕ N) ≃ₜ I^M × I^N`. -/
def sumHomeo (M N : Type*) : (I^(Sum M N)) ≃ₜ ((I^M) × (I^N)) where
toFun y := (y ∘ Sum.inl, y ∘ Sum.inr)
invFun y := fun s ↦ Sum.casesOn s y.1 y.2
left_inv y := by
ext s; cases s <;> rfl
right_inv y := by
ext s <;> rfl
continuous_toFun := by
fun_prop
continuous_invFun := by
refine continuous_pi ?_
intro s
cases s with
| inl m =>
simpa using (continuous_apply m).comp continuous_fst
| inr n =>
simpa using (continuous_apply n).comp continuous_snd
theorem boundary_sum_iff (M N : Type*) (y : I^(Sum M N)) :
y ∈ Cube.boundary (Sum M N) ↔ (y ∘ Sum.inl : I^M) ∈ Cube.boundary M ∨
(y ∘ Sum.inr : I^N) ∈ Cube.boundary N := by
constructor
· intro i
obtain ⟨i, hi⟩ := i
cases i with
| inl m =>
left
refine ⟨m, ?_⟩
simpa using hi
| inr n =>
right
refine ⟨n, ?_⟩
simpa using hi
· rintro (hM | hN)
· rcases hM with ⟨m, hm⟩
exact ⟨Sum.inl m, by simpa using hm⟩
· rcases hN with ⟨n, hn⟩
exact ⟨Sum.inr n, by simpa using hn⟩
@[simps]
def currySum (q : ↑(Ω^ (M ⊕ N) X x)) : C(M → ↑I, (↑(Ω^ N X x))) where
toFun a := ⟨(q.1.comp ⟨(sumHomeo M N).invFun, (sumHomeo M N).continuous_invFun⟩).curry.toFun a,
fun _ hm => q.2 _ ((boundary_sum_iff _ _ _).mpr (Or.inr hm))⟩
continuous_toFun := Continuous.subtype_mk (q.1.comp
⟨(sumHomeo M N).invFun, (sumHomeo M N).continuous_invFun⟩).curry.continuous_toFun _
/-- `Ω^M (Ω^N X) ≃ₜ Ω^(M ⊕ N) X`. -/
def iterHomeoSum :
Ω^ M (Ω^ N X x) (GenLoop.const (N := N) (X := X) (x := x)) ≃ₜ Ω^ (Sum M N) X x where
toFun p := by
-- p is a map I^M → (I^N → X). We turn it into I^M × I^N → X, then I^(M ⊕ N) → X.
refine ⟨(ContinuousMap.uncurry ⟨fun a => ⟨(p.1 a).1, ContinuousMap.continuous _⟩,
Continuous.subtype_val (map_continuous p)⟩).comp ⟨(sumHomeo M N).toFun,
(sumHomeo M N).continuous_toFun⟩, ?_⟩
intro y hy
rw [boundary_sum_iff] at hy
rcases hy with hM | hN
· -- Case: y restricted to M is in the boundary of I^M
-- p maps boundary of M to the constant loop (const x)
simp [sumHomeo, GenLoop.const, p.2 (y ∘ Sum.inl) hM]
· -- Case: y restricted to N is in the boundary of I^N
-- p(m) is always a loop, so it maps boundary of N to x
simp [sumHomeo, (p.1 (y ∘ Sum.inl)).2 (y ∘ Sum.inr) hN]
invFun q := by
refine ⟨currySum x q, ?_⟩
intro m hm
ext n
exact q.2 _ ((boundary_sum_iff _ _ _).mpr (Or.inl hm))
left_inv p := by
ext t : 1
simp
rfl
right_inv p := by
ext t
simp [Function.uncurry]
rfl
continuous_toFun := by
apply Continuous.subtype_mk
refine Continuous.compCM ?_ continuous_const
refine Continuous.comp' ContinuousMap.continuous_uncurry ?_
/- I think this is just a coercion? But why fun_prop cannot solve this?
Oh, it is underlying topology problem. -/
sorry
continuous_invFun := by
apply Continuous.subtype_mk
/- same as above-/
sorry
Junyan Xu (Feb 12 2026 at 22:54):
exact (ContinuousMap.continuous_postcomp ⟨_, continuous_subtype_val⟩).comp continuous_subtype_val
works for the first sorry
Wenrong Zou (Feb 12 2026 at 23:22):
Thanks!
Wenrong Zou (Feb 13 2026 at 00:07):
I think the second one should follow the same spirit of this. or simply we just need to prove the function currySum x is continuous.
@[simps]
def currySum (q : ↑(Ω^ (M ⊕ N) X x)) : C(M → ↑I, (↑(Ω^ N X x))) where
toFun a := ⟨(q.1.comp ⟨(sumHomeo M N).invFun, (sumHomeo M N).continuous_invFun⟩).curry.toFun a,
fun _ hm => q.2 _ ((boundary_sum_iff _ _ _).mpr (Or.inr hm))⟩
continuous_toFun := Continuous.subtype_mk (q.1.comp
⟨(sumHomeo M N).invFun, (sumHomeo M N).continuous_invFun⟩).curry.continuous_toFun _
lemma continuous_currySum (q : ↑(Ω^ (M ⊕ N) X x)) : Continuous (currySum x q) :=
ContinuousMap.continuous (currySum x q)
lemma continuous_currySum_apply : Continuous (currySum x (M := M) (N := N)) := by
sorry
Junyan Xu (Feb 13 2026 at 22:00):
This works:
lemma continuous_currySum_apply : Continuous (currySum x (M := M) (N := N)) := by
apply ContinuousMap.continuous_of_continuous_uncurry
apply Continuous.subtype_mk
apply ContinuousMap.continuous_of_continuous_uncurry
dsimp
fun_prop
Wenrong Zou (Feb 14 2026 at 00:59):
Thanks! I used to think ContinuousMap.continuous_of_continuous_uncurry will not significantly reduce the difficulty of proving this. But it seems like this is the right thing to do. Thanks! :-)
Last updated: Feb 28 2026 at 14:05 UTC