Skip to content

Commit a317013

Browse files
committed
feat(Topology/Category): TopCat is cartesian monoidal (leanprover-community#37097)
1 parent fb5af9d commit a317013

3 files changed

Lines changed: 193 additions & 0 deletions

File tree

Mathlib.lean

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7401,6 +7401,7 @@ public import Mathlib.Topology.Category.TopCat.Limits.Cofiltered
74017401
public import Mathlib.Topology.Category.TopCat.Limits.Konig
74027402
public import Mathlib.Topology.Category.TopCat.Limits.Products
74037403
public import Mathlib.Topology.Category.TopCat.Limits.Pullbacks
7404+
public import Mathlib.Topology.Category.TopCat.Monoidal
74047405
public import Mathlib.Topology.Category.TopCat.OpenNhds
74057406
public import Mathlib.Topology.Category.TopCat.Opens
74067407
public import Mathlib.Topology.Category.TopCat.Sphere

Mathlib/Topology/Category/TopCat/Basic.lean

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -253,4 +253,12 @@ theorem isOpenEmbedding_iff_isIso_comp' {X Y Z : TopCat} (f : X ⟶ Y) (g : Y
253253
simp only
254254
exact isOpenEmbedding_iff_isIso_comp f g
255255

256+
/-- The constant morphism `X ⟶ Y` in `TopCat` given by `y : Y`. -/
257+
def const {X Y : TopCat.{u}} (y : Y) : X ⟶ Y :=
258+
ofHom ⟨fun _ ↦ y, by continuity⟩
259+
260+
@[simp]
261+
lemma const_apply {X Y : TopCat.{u}} (y : Y) (x : X) :
262+
const y x = y := rfl
263+
256264
end TopCat
Lines changed: 184 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,184 @@
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.Category.TopCat.Limits.Products
9+
public import Mathlib.Topology.UnitInterval
10+
public import Mathlib.CategoryTheory.Monoidal.Cartesian.Basic
11+
12+
/-!
13+
# The cartesian monoidal structure on `TopCat`
14+
15+
We define the cartesian monoidal category structure on `TopCat`.
16+
We also introduce the unit interval as an object `TopCat.I` of `TopCat`.
17+
18+
-/
19+
20+
@[expose] public section
21+
22+
universe u
23+
24+
open CategoryTheory Limits MonoidalCategory
25+
26+
namespace TopCat
27+
28+
instance : CartesianMonoidalCategory TopCat.{u} :=
29+
.ofChosenFiniteProducts ⟨_, isTerminalPUnit⟩
30+
(fun X Y ↦ ⟨prodBinaryFan X Y, X.prodBinaryFanIsLimit Y⟩)
31+
32+
instance : BraidedCategory TopCat.{u} := .ofCartesianMonoidalCategory
33+
34+
@[simp]
35+
theorem tensor_apply {W X Y Z : TopCat.{u}} (f : W ⟶ X) (g : Y ⟶ Z) (p : ↑(W ⊗ Y)) :
36+
(f ⊗ₘ g).hom p = (f p.1, g p.2) :=
37+
rfl
38+
39+
@[simp]
40+
theorem whiskerLeft_apply (X : TopCat.{u}) {Y Z : TopCat.{u}} (f : Y ⟶ Z) (p : ↑(X ⊗ Y)) :
41+
(X ◁ f) p = (p.1, f p.2) :=
42+
rfl
43+
44+
@[simp]
45+
theorem whiskerRight_apply {Y Z : TopCat.{u}} (f : Y ⟶ Z) (X : TopCat.{u}) (p : ↑(Y ⊗ X)) :
46+
(f ▷ X) p = (f p.1, p.2) :=
47+
rfl
48+
49+
@[simp]
50+
theorem leftUnitor_hom_apply {X : TopCat.{u}} {x : X} {p : PUnit.{u + 1}} :
51+
(λ_ X).hom (p, x) = x :=
52+
rfl
53+
54+
@[simp]
55+
theorem leftUnitor_inv_apply {X : TopCat.{u}} {x : X} :
56+
(λ_ X).inv x = (PUnit.unit, x) :=
57+
rfl
58+
59+
@[simp]
60+
theorem rightUnitor_hom_apply {X : TopCat.{u}} {x : X} {p : PUnit.{u + 1}} :
61+
(ρ_ X).hom (x, p) = x :=
62+
rfl
63+
64+
@[simp]
65+
theorem rightUnitor_inv_apply {X : TopCat.{u}} {x : X} :
66+
(ρ_ X).inv x = (x, .unit) :=
67+
rfl
68+
69+
@[simp]
70+
theorem associator_hom_apply {X Y Z : TopCat.{u}} {x : X} {y : Y} {z : Z} :
71+
(α_ X Y Z).hom ((x, y), z) = (x, (y, z)) :=
72+
rfl
73+
74+
@[simp]
75+
theorem associator_inv_apply {X Y Z : TopCat.{u}} {x : X} {y : Y} {z : Z} :
76+
(α_ X Y Z).inv (x, (y, z)) = ((x, y), z) :=
77+
rfl
78+
79+
@[simp] theorem associator_hom_apply_1 {X Y Z : TopCat.{u}} {x} :
80+
((α_ X Y Z).hom x).1 = x.1.1 :=
81+
rfl
82+
83+
@[simp] theorem associator_hom_apply_2_1 {X Y Z : TopCat.{u}} {x} :
84+
((α_ X Y Z).hom x).2.1 = x.1.2 :=
85+
rfl
86+
87+
@[simp] theorem associator_hom_apply_2_2 {X Y Z : TopCat.{u}} {x} :
88+
((α_ X Y Z).hom x).2.2 = x.2 :=
89+
rfl
90+
91+
@[simp] theorem associator_inv_apply_1_1 {X Y Z : TopCat.{u}} {x} :
92+
((α_ X Y Z).inv x).1.1 = x.1 :=
93+
rfl
94+
95+
@[simp] theorem associator_inv_apply_1_2 {X Y Z : TopCat.{u}} {x} :
96+
((α_ X Y Z).inv x).1.2 = x.2.1 :=
97+
rfl
98+
99+
@[simp] theorem associator_inv_apply_2 {X Y Z : TopCat.{u}} {x} :
100+
((α_ X Y Z).inv x).2 = x.2.2 :=
101+
rfl
102+
103+
@[simp]
104+
theorem braiding_hom_apply {X Y : TopCat.{u}} {x : X} {y : Y} :
105+
(β_ X Y).hom (x, y) = (y, x) :=
106+
rfl
107+
108+
@[simp]
109+
theorem braiding_inv_apply {X Y : TopCat.{u}} {x : X} {y : Y} :
110+
(β_ X Y).inv (y, x) = (x, y) :=
111+
rfl
112+
113+
@[simp]
114+
protected theorem lift_apply {X Y Z : TopCat.{u}} {f : X ⟶ Y} {g : X ⟶ Z} {x : X} :
115+
CartesianMonoidalCategory.lift f g x = (f x, g x) :=
116+
rfl
117+
118+
/-- The unit interval, as an object of `TopCat`. -/
119+
def I : TopCat.{u} := TopCat.of (ULift unitInterval)
120+
121+
instance : LocallyCompactSpace I :=
122+
inferInstanceAs (LocallyCompactSpace (ULift unitInterval))
123+
124+
namespace I
125+
126+
/-- The unit interval `TopCat.I` is homeomorphic to `unitInterval`. -/
127+
def homeomorph : I ≃ₜ unitInterval := Homeomorph.ulift
128+
129+
@[ext]
130+
lemma ext {x y : I.{u}} (h : homeomorph x = homeomorph y) : x = y :=
131+
homeomorph.injective h
132+
133+
/-- The symmetrization map `TopCat.I ⟶ TopCat.I`. -/
134+
def symm : I.{u} ⟶ I :=
135+
ofHom ⟨homeomorph.symm ∘ unitInterval.symm ∘ homeomorph, by continuity⟩
136+
137+
@[simp]
138+
lemma homeomorph_symm (x : I) :
139+
homeomorph (symm x) = unitInterval.symm (homeomorph x) := rfl
140+
141+
instance : OfNat I.{u} 0 := ⟨homeomorph.symm 0
142+
instance : OfNat I.{u} 1 := ⟨homeomorph.symm 1
143+
144+
@[simp] lemma homeomorph_zero : homeomorph (0 : I.{u}) = 0 := by simp [OfNat.ofNat]
145+
@[simp] lemma homeomorph_one : homeomorph (1 : I.{u}) = 1 := by simp [OfNat.ofNat]
146+
@[simp] lemma symm_one : I.symm 1 = 0 := by aesop
147+
@[simp] lemma symm_zero : I.symm 0 = 1 := by aesop
148+
149+
end I
150+
151+
open CartesianMonoidalCategory
152+
153+
/-- The inclusion `X ⟶ X ⊗ I` given by `0 : I` for `X : TopCat`. -/
154+
noncomputable def ι₀ {X : TopCat.{u}} : X ⟶ X ⊗ I :=
155+
lift (𝟙 X) (const 0)
156+
157+
@[reassoc (attr := simp)]
158+
lemma ι₀_comp {X Y : TopCat.{u}} (f : X ⟶ Y) : ι₀ ≫ f ▷ _ = f ≫ ι₀ := rfl
159+
160+
@[reassoc (attr := simp)]
161+
lemma ι₀_fst (X : TopCat.{u}) : ι₀ ≫ fst X _ = 𝟙 X := rfl
162+
163+
@[reassoc (attr := simp)]
164+
lemma ι₀_snd (X : TopCat.{u}) : ι₀ ≫ snd X _ = TopCat.const 0 := rfl
165+
166+
@[simp] lemma ι₀_apply {X : TopCat.{u}} (x : X) : ι₀ x = ⟨x, 0⟩ := rfl
167+
168+
/-- The inclusion `X ⟶ X ⊗ I` given by `1 : I` for `X : TopCat`. -/
169+
noncomputable def ι₁ {X : TopCat.{u}} : X ⟶ X ⊗ I :=
170+
lift (𝟙 X) (const 1)
171+
172+
@[reassoc (attr := simp)]
173+
lemma ι₁_comp {X Y : TopCat.{u}} (f : X ⟶ Y) : ι₁ ≫ f ▷ _ = f ≫ ι₁ := rfl
174+
175+
@[reassoc (attr := simp)]
176+
lemma ι₁_fst (X : TopCat.{u}) : ι₁ ≫ fst X _ = 𝟙 X := rfl
177+
178+
@[reassoc (attr := simp)]
179+
lemma ι₁_snd (X : TopCat.{u}) : ι₁ ≫ snd X _ = const 1 := rfl
180+
181+
@[simp]
182+
lemma ι₁_apply {X : TopCat.{u}} (x : X) : ι₁ x = ⟨x, 1⟩ := rfl
183+
184+
end TopCat

0 commit comments

Comments
 (0)