|
| 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