Skip to content

Commit 8c46287

Browse files
committed
feat(Topology/Convenient): curryfication of X-continuous maps (leanprover-community#37856)
Let `X i` be a family of topological spaces. Let `Z` and `T` be topological spaces. In this PR, we endow the type `ContinuousMapGeneratedBy X Z T` of `X`-continuous maps `Z → T` with a topology, and under suitable assumptions, we show that there is a bijection expressing the curryfication/decurryfication of `X`-continuous maps.
1 parent 99adb0a commit 8c46287

2 files changed

Lines changed: 140 additions & 0 deletions

File tree

Mathlib.lean

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7584,6 +7584,7 @@ public import Mathlib.Topology.ContinuousMap.ZeroAtInfty
75847584
public import Mathlib.Topology.ContinuousOn
75857585
public import Mathlib.Topology.Convenient.ContinuousMapGeneratedBy
75867586
public import Mathlib.Topology.Convenient.GeneratedBy
7587+
public import Mathlib.Topology.Convenient.HomSpace
75877588
public import Mathlib.Topology.Covering
75887589
public import Mathlib.Topology.Covering.AddCircle
75897590
public import Mathlib.Topology.Covering.Basic
Lines changed: 139 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,139 @@
1+
/-
2+
Copyright (c) 2026 Joël Riou. All rights reserved.
3+
Released under Apache 2.0 license as described in the file LICENSE.
4+
Authors: Joël Riou
5+
-/
6+
module
7+
8+
public import Mathlib.Topology.CompactOpen
9+
public import Mathlib.Topology.Convenient.ContinuousMapGeneratedBy
10+
11+
/-!
12+
# The topological space of `X`-continuous maps
13+
14+
Let `X i` be a family of topological spaces. Let `Z` and `T` be topological spaces.
15+
In this file, we endow the type `ContinuousMapGeneratedBy X Z T` of
16+
`X`-continuous maps `Z → T` with the coarsest topology which makes
17+
the precomposition maps `ContinuousMapGeneratedBy X Z T → C(X i, T)`
18+
continuous for any continuous map `X i → Z`, where `C(X i, T)`
19+
is endowed with the compact-open topology.
20+
21+
If we assume that the spaces `X i` are locally compact and that the products
22+
`X i × X j` are `X`-generated, we obtain that the curryfication of maps induces
23+
a bijection between the type of `X`-continuous maps `Y × Z → T` and the type of
24+
`X`-continuous maps `Z → ContinuousMapGeneratedBy X Y T` for all
25+
topological spaces `Y`, `Z` and `T`.
26+
27+
## References
28+
* [Martín Escardó, Jimmie Lawson and Alex Simpson, *Comparing Cartesian closed
29+
categories of (core) compactly generated spaces*][escardo-lawson-simpson-2004]
30+
31+
-/
32+
universe v v' v'' t u
33+
34+
@[expose] public section
35+
36+
variable {ι : Type t} {X : ι → Type u} [∀ i, TopologicalSpace (X i)]
37+
{Y : Type v} [TopologicalSpace Y] {Z : Type v'} [TopologicalSpace Z]
38+
{T : Type v''} [TopologicalSpace T]
39+
40+
namespace Topology.ContinuousMapGeneratedBy
41+
42+
/-- Given a continuous map `f : X i → Z`, this is the map
43+
`ContinuousMapGeneratedBy X Z T → C(X i, T)` given by the precomposition with `f`.
44+
This is used in order to define a topology on `ContinuousMapGeneratedBy X Z T`. -/
45+
def precomp {i : ι} (f : C(X i, Z)) : ContinuousMapGeneratedBy X Z T → C(X i, T) :=
46+
fun g ↦ ⟨_, g.prop f⟩
47+
48+
@[simp]
49+
lemma precomp_apply {i : ι} (f : C(X i, Z)) (g : ContinuousMapGeneratedBy X Z T) :
50+
⇑(precomp f g) = g ∘ f := rfl
51+
52+
instance : TopologicalSpace (ContinuousMapGeneratedBy X Z T) :=
53+
⨅ (i : ι) (f : C(X i, Z)), .induced (precomp f) inferInstance
54+
55+
lemma continuous_iff {A : Type*} [TopologicalSpace A] {φ : A → ContinuousMapGeneratedBy X Z T} :
56+
Continuous φ ↔ ∀ (i : ι) (f : C(X i, Z)), Continuous (precomp f ∘ φ) := by
57+
simp only [continuous_iInf_rng, continuous_induced_rng]
58+
59+
@[continuity, fun_prop]
60+
lemma continuous_precomp {i : ι} (f : C(X i, Z)) : Continuous (precomp (T := T) f) := by
61+
rw [continuous_iff_le_induced]
62+
exact (iInf_le _ i).trans (iInf_le _ _)
63+
64+
lemma continuousGeneratedBy_iff_uncurry [∀ i, LocallyCompactSpace (X i)]
65+
(g : Z → ContinuousMapGeneratedBy X Y T) :
66+
ContinuousGeneratedBy X g ↔
67+
∀ ⦃i₁ : ι⦄ (f₁ : C(X i₁, Z)) ⦃i₂ : ι⦄ (f₂ : C(X i₂, Y)) ,
68+
Continuous (fun (x₁, x₂) ↦ g (f₁ x₁) (f₂ x₂)) := by
69+
simp only [continuousGeneratedBy_def, continuous_iff]
70+
exact forall_congr' (fun i₁ ↦ forall_congr' (fun f₁ ↦
71+
forall_congr' (fun i₂ ↦ forall_congr' (fun f₂ ↦
72+
fun h ↦ ContinuousMap.continuous_uncurry_of_continuous ⟨_, h⟩,
73+
fun h ↦ (ContinuousMap.curry ⟨_, h⟩).continuous⟩))))
74+
75+
lemma continuousGeneratedBy_dom_prod_iff [∀ i j, IsGeneratedBy X (X i × X j)]
76+
(g : Y × Z → T) :
77+
ContinuousGeneratedBy X g ↔
78+
∀ (i₁ : ι) (f₁ : C(X i₁, Z)) (i₂ : ι) (f₂ : C(X i₂, Y)),
79+
Continuous (fun (x₁, x₂) ↦ g ⟨f₂ x₂, f₁ x₁⟩) := by
80+
refine ⟨fun h i₁ f₁ i₂ f₂ ↦ ?_, fun h ↦ ?_⟩
81+
· rw [IsGeneratedBy.continuous_iff X]
82+
intro j p
83+
let φ : X i₁ × X i₂ → Y × Z := fun (x₁, x₂) ↦ (f₂ x₂, f₁ x₁)
84+
replace h := h.comp (show Continuous φ by continuity).continuousGeneratedBy
85+
rw [continuousGeneratedBy_def] at h
86+
exact h p
87+
· rw [continuousGeneratedBy_def]
88+
intro i f
89+
exact (h i (ContinuousMap.snd.comp f) i (ContinuousMap.fst.comp f)).comp
90+
(Continuous.prodMk continuous_id continuous_id)
91+
92+
variable [∀ i, LocallyCompactSpace (X i)] [∀ i j, IsGeneratedBy X (X i × X j)]
93+
94+
/-- The bijection between the type of `X`-continuous maps `Y × Z → T` and the type of
95+
`X`-continuous maps `Z → ContinuousMapGeneratedBy X Y T`. -/
96+
def curryEquiv :
97+
ContinuousMapGeneratedBy X (Y × Z) T ≃
98+
ContinuousMapGeneratedBy X Z (ContinuousMapGeneratedBy X Y T) where
99+
toFun g :=
100+
{ toFun z := g.comp ⟨fun y ↦ (y, z), (Continuous.prodMk_left z).continuousGeneratedBy⟩
101+
prop := by
102+
simpa only [continuousGeneratedBy_iff_uncurry,
103+
continuousGeneratedBy_dom_prod_iff] using g.prop }
104+
invFun g :=
105+
{ toFun x := g x.2 x.1
106+
prop := by
107+
simpa only [continuousGeneratedBy_iff_uncurry,
108+
continuousGeneratedBy_dom_prod_iff] using g.prop }
109+
110+
@[simp]
111+
lemma curryEquiv_apply_apply (g : ContinuousMapGeneratedBy X (Y × Z) T) (y : Y) (z : Z) :
112+
curryEquiv g z y = g (y, z) := rfl
113+
114+
@[simp]
115+
lemma curryEquiv_symm_apply (g : ContinuousMapGeneratedBy X Z (ContinuousMapGeneratedBy X Y T))
116+
(y : Y) (z : Z) :
117+
curryEquiv.symm g (y, z) = g z y := rfl
118+
119+
/-- The evaluation `Y × ContinuousMapGeneratedBy X Y Z → Z` as a `X`-continuous map. -/
120+
def ev : ContinuousMapGeneratedBy X (Y × ContinuousMapGeneratedBy X Y Z) Z :=
121+
curryEquiv.symm .id
122+
123+
@[simp]
124+
lemma ev_apply (y : Y) (f : ContinuousMapGeneratedBy X Y Z) :
125+
ev (y, f) = f y := rfl
126+
127+
/-- Given a `X`-continuous map `p : Z → T`, this is the postcomposition with `p`
128+
`ContinuousMapGeneratedBy X Y Z → ContinuousMapGeneratedBy X Y T`
129+
as a `X`-continuous map. -/
130+
def postcomp (p : ContinuousMapGeneratedBy X Z T) :
131+
ContinuousMapGeneratedBy X (ContinuousMapGeneratedBy X Y Z)
132+
(ContinuousMapGeneratedBy X Y T) :=
133+
curryEquiv (p.comp ev)
134+
135+
@[simp]
136+
lemma postcomp_apply (p : ContinuousMapGeneratedBy X Z T) (g : ContinuousMapGeneratedBy X Y Z) :
137+
p.postcomp g = p.comp g := rfl
138+
139+
end Topology.ContinuousMapGeneratedBy

0 commit comments

Comments
 (0)