@@ -3,30 +3,21 @@ Copyright (c) 2020 Bhavik Mehta. All rights reserved.
3
3
Released under Apache 2.0 license as described in the file LICENSE.
4
4
Authors: Bhavik Mehta, Thomas Read, Andrew Yang, Dagur Asgeirsson, Joël Riou
5
5
-/
6
- import Mathlib.CategoryTheory.Adjunction.Basic
6
+ import Mathlib.CategoryTheory.Adjunction.Mates
7
7
/-!
8
8
9
9
# Uniqueness of adjoints
10
10
11
11
This file shows that adjoints are unique up to natural isomorphism.
12
12
13
13
## Main results
14
- * `Adjunction.natTransEquiv` and `Adjunction.natIsoEquiv` If `F ⊣ G` and `F' ⊣ G'` are adjunctions,
15
- then there are equivalences `(G ⟶ G') ≃ (F' ⟶ F)` and `(G ≅ G') ≃ (F' ≅ F)`.
16
- Everything else is deduced from this:
17
14
18
15
* `Adjunction.leftAdjointUniq` : If `F` and `F'` are both left adjoint to `G`, then they are
19
16
naturally isomorphic.
20
17
21
18
* `Adjunction.rightAdjointUniq` : If `G` and `G'` are both right adjoint to `F`, then they are
22
19
naturally isomorphic.
23
20
24
- ## TODO
25
-
26
- There some overlap with the file `Adjunction.Mates`. In particular, `natTransEquiv` is just a
27
- special case of `mateEquiv`. However, before removing `natTransEquiv`, in favour of `mateEquiv`,
28
- the latter needs some more API lemmas such as `natTransEquiv_apply_app`, `natTransEquiv_id`, etc.
29
- in order to make automation work better in the rest of this file.
30
21
-/
31
22
32
23
open CategoryTheory
@@ -35,89 +26,9 @@ variable {C D : Type*} [Category C] [Category D]
35
26
36
27
namespace CategoryTheory.Adjunction
37
28
38
- /--
39
- If `F ⊣ G` and `F' ⊣ G'` are adjunctions, then giving a natural transformation `G ⟶ G'` is the
40
- same as giving a natural transformation `F' ⟶ F`.
41
- -/
42
- @[simps]
43
- def natTransEquiv {F F' : C ⥤ D} {G G' : D ⥤ C} (adj1 : F ⊣ G) (adj2 : F' ⊣ G') :
44
- (G ⟶ G') ≃ (F' ⟶ F) where
45
- toFun f := {
46
- app := fun X ↦ F'.map ((adj1.unit ≫ whiskerLeft F f).app X) ≫ adj2.counit.app _
47
- naturality := by
48
- intro X Y g
49
- simp only [← Category.assoc, ← Functor.map_comp]
50
- erw [(adj1.unit ≫ (whiskerLeft F f)).naturality]
51
- simp
52
- }
53
- invFun f := {
54
- app := fun X ↦ adj2.unit.app (G.obj X) ≫ G'.map (f.app (G.obj X) ≫ adj1.counit.app X)
55
- naturality := by
56
- intro X Y g
57
- erw [← adj2.unit_naturality_assoc]
58
- simp only [← Functor.map_comp]
59
- simp
60
- }
61
- left_inv f := by
62
- ext X
63
- simp only [Functor.comp_obj, NatTrans.comp_app, Functor.id_obj, whiskerLeft_app,
64
- Functor.map_comp, Category.assoc, unit_naturality_assoc, right_triangle_components_assoc]
65
- erw [← f.naturality (adj1.counit.app X), ← Category.assoc]
66
- simp
67
- right_inv f := by
68
- ext
69
- simp
70
-
71
- @[simp]
72
- lemma natTransEquiv_id {F : C ⥤ D} {G : D ⥤ C} (adj : F ⊣ G) :
73
- natTransEquiv adj adj (𝟙 _) = 𝟙 _ := by ext; simp
74
-
75
- @[simp]
76
- lemma natTransEquiv_id_symm {F : C ⥤ D} {G : D ⥤ C} (adj : F ⊣ G) :
77
- (natTransEquiv adj adj).symm (𝟙 _) = 𝟙 _ := by ext; simp
78
-
79
- @[simp]
80
- lemma natTransEquiv_comp {F F' F'' : C ⥤ D} {G G' G'' : D ⥤ C}
81
- (adj1 : F ⊣ G) (adj2 : F' ⊣ G') (adj3 : F'' ⊣ G'') (f : G ⟶ G') (g : G' ⟶ G'') :
82
- natTransEquiv adj2 adj3 g ≫ natTransEquiv adj1 adj2 f = natTransEquiv adj1 adj3 (f ≫ g) := by
83
- apply (natTransEquiv adj1 adj3).symm.injective
84
- ext X
85
- simp only [natTransEquiv_symm_apply_app, Functor.comp_obj, NatTrans.comp_app,
86
- natTransEquiv_apply_app, Functor.id_obj, whiskerLeft_app, Functor.map_comp, Category.assoc,
87
- unit_naturality_assoc, right_triangle_components_assoc, Equiv.symm_apply_apply,
88
- ← g.naturality_assoc, ← g.naturality]
89
- simp only [← Category.assoc, unit_naturality, Functor.comp_obj, right_triangle_components,
90
- Category.comp_id, ← f.naturality, Category.id_comp]
91
-
92
- @[simp]
93
- lemma natTransEquiv_comp_symm {F F' F'' : C ⥤ D} {G G' G'' : D ⥤ C}
94
- (adj1 : F ⊣ G) (adj2 : F' ⊣ G') (adj3 : F'' ⊣ G'') (f : F' ⟶ F) (g : F'' ⟶ F') :
95
- (natTransEquiv adj1 adj2).symm f ≫ (natTransEquiv adj2 adj3).symm g =
96
- (natTransEquiv adj1 adj3).symm (g ≫ f) := by
97
- apply (natTransEquiv adj1 adj3).injective
98
- ext
99
- simp
100
-
101
- /--
102
- If `F ⊣ G` and `F' ⊣ G'` are adjunctions, then giving a natural isomorphism `G ≅ G'` is the
103
- same as giving a natural transformation `F' ≅ F`.
104
- -/
105
- @[simps]
106
- def natIsoEquiv {F F' : C ⥤ D} {G G' : D ⥤ C} (adj1 : F ⊣ G) (adj2 : F' ⊣ G') :
107
- (G ≅ G') ≃ (F' ≅ F) where
108
- toFun i := {
109
- hom := natTransEquiv adj1 adj2 i.hom
110
- inv := natTransEquiv adj2 adj1 i.inv
111
- }
112
- invFun i := {
113
- hom := (natTransEquiv adj1 adj2).symm i.hom
114
- inv := (natTransEquiv adj2 adj1).symm i.inv }
115
- left_inv i := by simp
116
- right_inv i := by simp
117
-
118
29
/-- If `F` and `F'` are both left adjoint to `G`, then they are naturally isomorphic. -/
119
30
def leftAdjointUniq {F F' : C ⥤ D} {G : D ⥤ C} (adj1 : F ⊣ G) (adj2 : F' ⊣ G) : F ≅ F' :=
120
- (natIsoEquiv adj1 adj2 (Iso.refl _ )).symm
31
+ ((conjugateIsoEquiv adj1 adj2).symm (Iso.refl G )).symm
121
32
122
33
-- Porting note (#10618): removed simp as simp can prove this
123
34
theorem homEquiv_leftAdjointUniq_hom_app {F F' : C ⥤ D} {G : D ⥤ C} (adj1 : F ⊣ G) (adj2 : F' ⊣ G)
@@ -141,9 +52,10 @@ theorem unit_leftAdjointUniq_hom_app
141
52
theorem leftAdjointUniq_hom_counit {F F' : C ⥤ D} {G : D ⥤ C} (adj1 : F ⊣ G) (adj2 : F' ⊣ G) :
142
53
whiskerLeft G (leftAdjointUniq adj1 adj2).hom ≫ adj2.counit = adj1.counit := by
143
54
ext x
144
- simp only [Functor.comp_obj, Functor.id_obj, leftAdjointUniq, Iso.symm_hom, natIsoEquiv_apply_inv,
145
- Iso.refl_inv, NatTrans.comp_app, whiskerLeft_app, natTransEquiv_apply_app, whiskerLeft_id',
146
- Category.comp_id, Category.assoc]
55
+ simp only [Functor.comp_obj, Functor.id_obj, leftAdjointUniq, Iso.symm_hom,
56
+ conjugateIsoEquiv_symm_apply_inv, Iso.refl_inv, NatTrans.comp_app, whiskerLeft_app,
57
+ conjugateEquiv_symm_apply_app, NatTrans.id_app, Functor.map_id, Category.id_comp,
58
+ Category.assoc]
147
59
rw [← adj1.counit_naturality, ← Category.assoc, ← F.map_comp]
148
60
simp
149
61
@@ -180,7 +92,7 @@ theorem leftAdjointUniq_refl {F : C ⥤ D} {G : D ⥤ C} (adj1 : F ⊣ G) :
180
92
181
93
/-- If `G` and `G'` are both right adjoint to `F`, then they are naturally isomorphic. -/
182
94
def rightAdjointUniq {F : C ⥤ D} {G G' : D ⥤ C} (adj1 : F ⊣ G) (adj2 : F ⊣ G') : G ≅ G' :=
183
- (natIsoEquiv adj1 adj2).symm (Iso.refl _)
95
+ conjugateIsoEquiv adj1 adj2 (Iso.refl _)
184
96
185
97
-- Porting note (#10618): simp can prove this
186
98
theorem homEquiv_symm_rightAdjointUniq_hom_app {F : C ⥤ D} {G G' : D ⥤ C} (adj1 : F ⊣ G)
@@ -192,8 +104,8 @@ theorem homEquiv_symm_rightAdjointUniq_hom_app {F : C ⥤ D} {G G' : D ⥤ C} (a
192
104
theorem unit_rightAdjointUniq_hom_app {F : C ⥤ D} {G G' : D ⥤ C} (adj1 : F ⊣ G) (adj2 : F ⊣ G')
193
105
(x : C) : adj1.unit.app x ≫ (rightAdjointUniq adj1 adj2).hom.app (F.obj x) =
194
106
adj2.unit.app x := by
195
- simp only [Functor.id_obj, Functor.comp_obj, rightAdjointUniq, natIsoEquiv_symm_apply_hom ,
196
- Iso.refl_hom, natTransEquiv_symm_apply_app , NatTrans.id_app, Category.id_comp]
107
+ simp only [Functor.id_obj, Functor.comp_obj, rightAdjointUniq, conjugateIsoEquiv_apply_hom ,
108
+ Iso.refl_hom, conjugateEquiv_apply_app , NatTrans.id_app, Functor.map_id , Category.id_comp]
197
109
rw [← adj2.unit_naturality_assoc, ← G'.map_comp]
198
110
simp
199
111
@@ -243,4 +155,7 @@ theorem rightAdjointUniq_refl {F : C ⥤ D} {G : D ⥤ C} (adj1 : F ⊣ G) :
243
155
244
156
end Adjunction
245
157
158
+ @[deprecated (since := "2024-10-07")] alias Adjunction.natTransEquiv := conjugateEquiv
159
+ @[deprecated (since := "2024-10-07")] alias Adjunction.natIsoEquiv := conjugateIsoEquiv
160
+
246
161
end CategoryTheory
0 commit comments