Skip to content
This repository was archived by the owner on Jul 24, 2024. It is now read-only.

Commit 2634c1b

Browse files
committed
feat(category_theory/cones): map_cone_inv as an equivalence (#4253)
When `G` is an equivalence, we have `G.map_cone_inv : cone (F ⋙ G) → cone F`, and that this is an inverse to `G.map_cone`, but not quite that these constitute an equivalence of categories. This PR fixes that. Co-authored-by: Scott Morrison <scott.morrison@gmail.com>
1 parent 2ce359b commit 2634c1b

File tree

4 files changed

+81
-38
lines changed

4 files changed

+81
-38
lines changed

src/category_theory/equivalence.lean

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -66,11 +66,11 @@ begin
6666
exact e.functor_unit_comp X
6767
end
6868

69-
lemma functor_unit (e : C ≌ D) (X : C) :
70-
e.functor.map (e.unit.app X) = e.counit_inv.app (e.functor.obj X) :=
71-
by { erw [←iso.comp_hom_eq_id (e.counit_iso.app _), functor_unit_comp], refl }
69+
lemma counit_inv_app_functor (e : C ≌ D) (X : C) :
70+
e.counit_inv.app (e.functor.obj X) = e.functor.map (e.unit.app X) :=
71+
by { symmetry, erw [←iso.comp_hom_eq_id (e.counit_iso.app _), functor_unit_comp], refl }
7272

73-
lemma counit_functor (e : C ≌ D) (X : C) :
73+
lemma counit_app_functor (e : C ≌ D) (X : C) :
7474
e.counit.app (e.functor.obj X) = e.functor.map (e.unit_inv.app X) :=
7575
by { erw [←iso.hom_comp_eq_id (e.functor.map_iso (e.unit_iso.app X)), functor_unit_comp], refl }
7676

@@ -105,13 +105,13 @@ begin
105105
exact e.unit_inverse_comp Y
106106
end
107107

108-
lemma unit_inverse (e : C ≌ D) (Y : D) :
108+
lemma unit_app_inverse (e : C ≌ D) (Y : D) :
109109
e.unit.app (e.inverse.obj Y) = e.inverse.map (e.counit_inv.app Y) :=
110110
by { erw [←iso.comp_hom_eq_id (e.inverse.map_iso (e.counit_iso.app Y)), unit_inverse_comp], refl }
111111

112-
lemma inverse_counit (e : C ≌ D) (Y : D) :
113-
e.inverse.map (e.counit.app Y) = e.unit_inv.app (e.inverse.obj Y) :=
114-
by { erw [←iso.hom_comp_eq_id (e.unit_iso.app _), unit_inverse_comp], refl }
112+
lemma unit_inv_app_inverse (e : C ≌ D) (Y : D) :
113+
e.unit_inv.app (e.inverse.obj Y) = e.inverse.map (e.counit.app Y) :=
114+
by { symmetry, erw [←iso.hom_comp_eq_id (e.unit_iso.app _), unit_inverse_comp], refl }
115115

116116
@[simp] lemma fun_inv_map (e : C ≌ D) (X Y : D) (f : X ⟶ Y) :
117117
e.functor.map (e.inverse.map f) = e.counit.app X ≫ f ≫ e.counit_inv.app Y :=
@@ -178,8 +178,8 @@ variables {E : Type u₃} [category.{v₃} E]
178178
functor_unit_iso_comp' := λ X,
179179
begin
180180
dsimp,
181-
rw [← f.functor.map_comp_assoc, e.functor.map_comp, functor_unit, fun_inv_map,
182-
iso.inv_hom_id_app_assoc, assoc, iso.inv_hom_id_app, counit_functor, ← functor.map_comp],
181+
rw [← f.functor.map_comp_assoc, e.functor.map_comp, ←counit_inv_app_functor, fun_inv_map,
182+
iso.inv_hom_id_app_assoc, assoc, iso.inv_hom_id_app, counit_app_functor, ← functor.map_comp],
183183
erw [comp_id, iso.hom_inv_id_app, functor.map_id],
184184
end }
185185

src/category_theory/limits/cones.lean

Lines changed: 65 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -251,7 +251,7 @@ def whiskering_equivalence {K : Type v} [small_category K] (e : K ≌ J) :
251251
intro k,
252252
have t := s.π.naturality (e.unit_inv.app k),
253253
dsimp at t,
254-
simp only [←e.counit_functor k, id_comp] at t,
254+
simp only [←e.counit_app_functor k, id_comp] at t,
255255
dsimp,
256256
simp [t],
257257
end)) (by tidy), }
@@ -281,6 +281,7 @@ def forget : cone F ⥤ C :=
281281

282282
variables {D : Type u'} [category.{v} D] (G : C ⥤ D)
283283

284+
/-- A functor `G : C ⥤ D` sends cones over `F` to cones over `F ⋙ G` functorially. -/
284285
@[simps] def functoriality : cone F ⥤ cone (F ⋙ G) :=
285286
{ obj := λ A,
286287
{ X := G.obj A.X,
@@ -297,6 +298,20 @@ instance functoriality_full [full G] [faithful G] : full (functoriality F G) :=
297298
instance functoriality_faithful [faithful G] : faithful (cones.functoriality F G) :=
298299
{ map_injective' := λ X Y f g e, by { ext1, injection e, apply G.map_injective h_1 } }
299300

301+
/--
302+
If `e : C ≌ D` is an equivalence of categories, then `functoriality F e.functor` induces an
303+
equivalence between cones over `F` and cones over `F ⋙ e.functor`.
304+
-/
305+
@[simps]
306+
def functoriality_equivalence (e : C ≌ D) : cone F ≌ cone (F ⋙ e.functor) :=
307+
let f : (F ⋙ e.functor) ⋙ e.inverse ≅ F :=
308+
functor.associator _ _ _ ≪≫ iso_whisker_left _ (e.unit_iso).symm ≪≫ functor.right_unitor _ in
309+
{ functor := functoriality F e.functor,
310+
inverse := (functoriality (F ⋙ e.functor) e.inverse) ⋙
311+
(postcompose_equivalence f).functor,
312+
unit_iso := nat_iso.of_components (λ c, cones.ext (e.unit_iso.app _) (by tidy)) (by tidy),
313+
counit_iso := nat_iso.of_components (λ c, cones.ext (e.counit_iso.app _) (by tidy)) (by tidy), }
314+
300315
/--
301316
If `F` reflects isomorphisms, then `cones.functoriality F` reflects isomorphisms
302317
as well.
@@ -400,7 +415,7 @@ def whiskering_equivalence {K : Type v} [small_category K] (e : K ≌ J) :
400415
intro k,
401416
have t := s.ι.naturality (e.unit.app k),
402417
dsimp at t,
403-
simp only [e.functor_unit k, comp_id] at t,
418+
simp only [←e.counit_inv_app_functor k, comp_id] at t,
404419
dsimp,
405420
simp [t],
406421
end)) (by tidy), }
@@ -430,6 +445,7 @@ def forget : cocone F ⥤ C :=
430445

431446
variables {D : Type u'} [category.{v} D] (G : C ⥤ D)
432447

448+
/-- A functor `G : C ⥤ D` sends cocones over `F` to cocones over `F ⋙ G` functorially. -/
433449
@[simps] def functoriality : cocone F ⥤ cocone (F ⋙ G) :=
434450
{ obj := λ A,
435451
{ X := G.obj A.X,
@@ -446,6 +462,29 @@ instance functoriality_full [full G] [faithful G] : full (functoriality F G) :=
446462
instance functoriality_faithful [faithful G] : faithful (functoriality F G) :=
447463
{ map_injective' := λ X Y f g e, by { ext1, injection e, apply G.map_injective h_1 } }
448464

465+
/--
466+
If `e : C ≌ D` is an equivalence of categories, then `functoriality F e.functor` induces an
467+
equivalence between cocones over `F` and cocones over `F ⋙ e.functor`.
468+
-/
469+
@[simps]
470+
def functoriality_equivalence (e : C ≌ D) : cocone F ≌ cocone (F ⋙ e.functor) :=
471+
let f : (F ⋙ e.functor) ⋙ e.inverse ≅ F :=
472+
functor.associator _ _ _ ≪≫ iso_whisker_left _ (e.unit_iso).symm ≪≫ functor.right_unitor _ in
473+
{ functor := functoriality F e.functor,
474+
inverse := (functoriality (F ⋙ e.functor) e.inverse) ⋙
475+
(precompose_equivalence f.symm).functor,
476+
unit_iso := nat_iso.of_components (λ c, cocones.ext (e.unit_iso.app _) (by tidy)) (by tidy),
477+
counit_iso := nat_iso.of_components (λ c, cocones.ext (e.counit_iso.app _)
478+
begin
479+
-- Unfortunately this doesn't work by `tidy`.
480+
-- In this configuration `simp` reaches a dead-end and needs help.
481+
intros j,
482+
dsimp,
483+
simp only [←equivalence.counit_inv_app_functor, iso.inv_hom_id_app, map_comp, equivalence.fun_inv_map,
484+
assoc, id_comp, iso.inv_hom_id_app_assoc],
485+
dsimp, simp, -- See note [dsimp, simp].
486+
end) (by tidy), }
487+
449488
/--
450489
If `F` reflects isomorphisms, then `cocones.functoriality F` reflects isomorphisms
451490
as well.
@@ -480,17 +519,6 @@ def map_cocone (c : cocone F) : cocone (F ⋙ H) := (cocones.functoriality F H).
480519
@[simp] lemma map_cone_X (c : cone F) : (H.map_cone c).X = H.obj c.X := rfl
481520
@[simp] lemma map_cocone_X (c : cocone F) : (H.map_cocone c).X = H.obj c.X := rfl
482521

483-
/-- If `H` is an equivalence, we invert `H.map_cone` and get an original cone for `F` from a cone
484-
for `F ⋙ H`.-/
485-
@[simps]
486-
def map_cone_inv [is_equivalence H]
487-
(c : cone (F ⋙ H)) : cone F :=
488-
let t := (inv H).map_cone c in
489-
let α : (F ⋙ H) ⋙ inv H ⟶ F :=
490-
((whisker_left F H.fun_inv_id.hom) : F ⋙ (H ⋙ inv H) ⟶ _) ≫ (functor.right_unitor _).hom in
491-
{ X := t.X,
492-
π := ((category_theory.cones J C).map α).app (op t.X) t.π }
493-
494522
/-- Given a cone morphism `c ⟶ c'`, construct a cone morphism on the mapped cones functorially. -/
495523
def map_cone_morphism {c c' : cone F} (f : c ⟶ c') :
496524
H.map_cone c ⟶ H.map_cone c' := (cones.functoriality F H).map f
@@ -503,22 +531,37 @@ def map_cocone_morphism {c c' : cocone F} (f : c ⟶ c') :
503531
@[simp] lemma map_cocone_ι (c : cocone F) (j : J) :
504532
(map_cocone H c).ι.app j = H.map (c.ι.app j) := rfl
505533

534+
/-- If `H` is an equivalence, we invert `H.map_cone` and get a cone for `F` from a cone
535+
for `F ⋙ H`.-/
536+
def map_cone_inv [is_equivalence H]
537+
(c : cone (F ⋙ H)) : cone F :=
538+
(limits.cones.functoriality_equivalence F (as_equivalence H)).inverse.obj c
539+
506540
/-- `map_cone` is the left inverse to `map_cone_inv`. -/
507541
def map_cone_map_cone_inv {F : J ⥤ D} (H : D ⥤ C) [is_equivalence H] (c : cone (F ⋙ H)) :
508542
map_cone H (map_cone_inv H c) ≅ c :=
509-
cones.ext (H.inv_fun_id.app c.X)
510-
begin
511-
intro j,
512-
dsimp,
513-
rw [comp_id, H.map_comp, is_equivalence.fun_inv_map H, assoc, nat_iso.cancel_nat_iso_hom_left,
514-
assoc, is_equivalence.inv_fun_id_inv_comp],
515-
dsimp, simp,
516-
end
543+
(limits.cones.functoriality_equivalence F (as_equivalence H)).counit_iso.app c
517544

518545
/-- `map_cone` is the right inverse to `map_cone_inv`. -/
519546
def map_cone_inv_map_cone {F : J ⥤ D} (H : D ⥤ C) [is_equivalence H] (c : cone F) :
520547
map_cone_inv H (map_cone H c) ≅ c :=
521-
cones.ext (H.fun_inv_id.app _) (λ j, by simp)
548+
(limits.cones.functoriality_equivalence F (as_equivalence H)).unit_iso.symm.app c
549+
/-- If `H` is an equivalence, we invert `H.map_cone` and get a cone for `F` from a cone
550+
for `F ⋙ H`.-/
551+
552+
def map_cocone_inv [is_equivalence H]
553+
(c : cocone (F ⋙ H)) : cocone F :=
554+
(limits.cocones.functoriality_equivalence F (as_equivalence H)).inverse.obj c
555+
556+
/-- `map_cocone` is the left inverse to `map_cocone_inv`. -/
557+
def map_cocone_map_cocone_inv {F : J ⥤ D} (H : D ⥤ C) [is_equivalence H] (c : cocone (F ⋙ H)) :
558+
map_cocone H (map_cocone_inv H c) ≅ c :=
559+
(limits.cocones.functoriality_equivalence F (as_equivalence H)).counit_iso.app c
560+
561+
/-- `map_cocone` is the right inverse to `map_cocone_inv`. -/
562+
def map_cocone_inv_map_cocone {F : J ⥤ D} (H : D ⥤ C) [is_equivalence H] (c : cocone F) :
563+
map_cocone_inv H (map_cocone H c) ≅ c :=
564+
(limits.cocones.functoriality_equivalence F (as_equivalence H)).unit_iso.symm.app c
522565

523566
end functor
524567

src/category_theory/limits/limits.lean

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -314,7 +314,7 @@ let w' : e.inverse ⋙ F ≅ G := (iso_whisker_left e.inverse w).symm ≪≫ inv
314314
dsimp,
315315
simp only [limits.cone.whisker_π, limits.cones.postcompose_obj_π, fac, whisker_left_app,
316316
assoc, id_comp, inv_fun_id_assoc_hom_app, fac_assoc, nat_trans.comp_app],
317-
rw [counit_functor, ←functor.comp_map, w.hom.naturality],
317+
rw [counit_app_functor, ←functor.comp_map, w.hom.naturality],
318318
simp,
319319
end,
320320
inv_hom_id' := by { apply hom_ext Q, tidy, }, }
@@ -734,7 +734,7 @@ let w' : e.inverse ⋙ F ≅ G := (iso_whisker_left e.inverse w).symm ≪≫ inv
734734
dsimp,
735735
simp only [limits.cocone.whisker_ι, fac, inv_fun_id_assoc_inv_app, whisker_left_app, assoc,
736736
comp_id, limits.cocones.precompose_obj_ι, fac_assoc, nat_trans.comp_app],
737-
rw [←functor_unit, ←functor.comp_map, ←w.inv.naturality_assoc],
737+
rw [counit_inv_app_functor, ←functor.comp_map, ←w.inv.naturality_assoc],
738738
dsimp,
739739
simp,
740740
end,

src/category_theory/monoidal/transport.lean

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -175,7 +175,7 @@ def lax_to_transported (e : C ≌ D) : lax_monoidal_functor C (transported e) :=
175175
begin
176176
dsimp,
177177
simp only [tensor_id, assoc, id_comp, functor.map_comp, e.inverse.map_id],
178-
rw equivalence.counit_functor,
178+
rw equivalence.counit_app_functor,
179179
simp only [←e.functor.map_comp],
180180
congr' 1,
181181
rw [←left_unitor_naturality],
@@ -185,7 +185,7 @@ def lax_to_transported (e : C ≌ D) : lax_monoidal_functor C (transported e) :=
185185
begin
186186
dsimp,
187187
simp only [tensor_id, assoc, id_comp, functor.map_comp, e.inverse.map_id],
188-
rw equivalence.counit_functor,
188+
rw equivalence.counit_app_functor,
189189
simp only [←e.functor.map_comp],
190190
congr' 1,
191191
rw [←right_unitor_naturality],
@@ -271,9 +271,9 @@ monoidal_nat_iso.of_components (λ X, e.counit_iso.app X) (λ X Y f, e.counit.na
271271
(λ X Y,
272272
begin
273273
dsimp, simp only [iso.hom_inv_id_app_assoc, id_comp, equivalence.inv_fun_map],
274-
simp only [equivalence.counit_functor, ←e.functor.map_id, ←e.functor.map_comp],
274+
simp only [equivalence.counit_app_functor, ←e.functor.map_id, ←e.functor.map_comp],
275275
congr' 1,
276-
simp [equivalence.inverse_counit],
276+
simp [equivalence.unit_inv_app_inverse],
277277
dsimp,
278278
simp, -- See note [dsimp, simp].
279279
end)

0 commit comments

Comments
 (0)