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

Commit 89379bc

Browse files
committed
Make opposite irreducible, take 2
1 parent 9be8905 commit 89379bc

4 files changed

Lines changed: 120 additions & 86 deletions

File tree

src/category_theory/limits/cones.lean

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -32,14 +32,14 @@ An object representing this functor is a limit of `F`.
3232
-/
3333
def cones : Cᵒᵖ ⥤ Type v := (const Jᵒᵖ ⋙ op_inv J C) ⋙ (yoneda.obj F)
3434

35-
lemma cones_obj (X : C) : F.cones.obj X = ((const J).obj X ⟹ F) := rfl
35+
lemma cones_obj (X : C) : F.cones.obj (op X) = ((const J).obj X ⟹ F) := rfl
3636

3737
/--
3838
`F.cocones` is the functor assigning to an object `X` the type of
3939
natural transformations from `F` to the constant functor with value `X`.
4040
An object corepresenting this functor is a colimit of `F`.
4141
-/
42-
def cocones : C ⥤ Type v := (const J)(coyoneda.obj F)
42+
def cocones : C ⥤ Type v := const J ⋙ coyoneda.obj (op F)
4343

4444
lemma cocones_obj (X : C) : F.cocones.obj X = (F ⟹ (const J).obj X) := rfl
4545

@@ -53,7 +53,7 @@ def cones : (J ⥤ C) ⥤ (Cᵒᵖ ⥤ Type v) :=
5353
map := λ F G f, whisker_left _ (yoneda.map f) }
5454

5555
def cocones : (J ⥤ C)ᵒᵖ ⥤ (C ⥤ Type v) :=
56-
{ obj := functor.cocones,
56+
{ obj := λ F, functor.cocones (unop F),
5757
map := λ F G f, whisker_left _ (coyoneda.map f) }
5858

5959
variables {J C}
@@ -62,8 +62,8 @@ variables {J C}
6262
@[simp] lemma cones_map {F G : J ⥤ C} {f : F ⟶ G} :
6363
(cones J C).map f = (whisker_left _ (yoneda.map f)) := rfl
6464

65-
@[simp] lemma cocones_obj (F : J ⥤ C) : (cocones J C).obj F = F.cocones := rfl
66-
@[simp] lemma cocones_map {F G : J ⥤ C} {f : F ⟶ G} :
65+
@[simp] lemma cocones_obj (F : (J ⥤ C)ᵒᵖ) : (cocones J C).obj F = (unop F).cocones := rfl
66+
@[simp] lemma cocones_map {F G : (J ⥤ C)ᵒᵖ} {f : F ⟶ G} :
6767
(cocones J C).map f = (whisker_left _ (coyoneda.map f)) := rfl
6868

6969
end
@@ -111,7 +111,7 @@ namespace cone
111111
/-- A map to the vertex of a cone induces a cone by composition. -/
112112
@[simp] def extend (c : cone F) {X : C} (f : X ⟶ c.X) : cone F :=
113113
{ X := X,
114-
π := c.extensions.app X f }
114+
π := c.extensions.app (op X) f }
115115

116116
def postcompose {G : J ⥤ C} (α : F ⟹ G) (c : cone F) : cone G :=
117117
{ X := c.X,
@@ -126,7 +126,7 @@ def whisker {K : Type v} [small_category K] (E : K ⥤ J) (c : cone F) : cone (E
126126
end cone
127127

128128
namespace cocone
129-
@[simp] def extensions (c : cocone F) : coyoneda.obj c.X ⟶ F.cocones :=
129+
@[simp] def extensions (c : cocone F) : coyoneda.obj (op c.X) ⟶ F.cocones :=
130130
{ app := λ X f, c.ι ≫ ((const J).map f),
131131
naturality' := by intros X Y f; ext g j; dsimp; rw ←assoc; refl }
132132

src/category_theory/limits/limits.lean

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ def hom_iso (h : is_limit t) (W : C) : (W ⟶ t.X) ≅ ((const J).obj W ⟹ F) :
9090
/-- The limit of `F` represents the functor taking `W` to
9191
the set of cones on `F` with vertex `W`. -/
9292
def nat_iso (h : is_limit t) : yoneda.obj t.X ≅ F.cones :=
93-
nat_iso.of_components (is_limit.hom_iso h) (by tidy)
93+
nat_iso.of_components (λ W, is_limit.hom_iso h (unop W)) (by tidy)
9494

9595
def hom_iso' (h : is_limit t) (W : C) :
9696
(W ⟶ t.X) ≅ { p : Π j, W ⟶ F.obj j // ∀ {j j'} (f : j ⟶ j'), p j ≫ F.map f = p j' } :=
@@ -191,7 +191,7 @@ def hom_iso (h : is_colimit t) (W : C) : (t.X ⟶ W) ≅ (F ⟹ (const J).obj W)
191191

192192
/-- The colimit of `F` represents the functor taking `W` to
193193
the set of cocones on `F` with vertex `W`. -/
194-
def nat_iso (h : is_colimit t) : coyoneda.obj t.X ≅ F.cocones :=
194+
def nat_iso (h : is_colimit t) : coyoneda.obj (op t.X) ≅ F.cocones :=
195195
nat_iso.of_components (is_colimit.hom_iso h) (by intros; ext; dsimp; rw ←assoc; refl)
196196

197197
def hom_iso' (h : is_colimit t) (W : C) :
@@ -290,7 +290,7 @@ by erw is_limit.fac
290290
(w : ∀ j, f ≫ limit.π F j = f' ≫ limit.π F j) : f = f' :=
291291
(limit.is_limit F).hom_ext w
292292

293-
def limit.hom_iso (F : J ⥤ C) [has_limit F] (W : C) : (W ⟶ limit F) ≅ (F.cones.obj W) :=
293+
def limit.hom_iso (F : J ⥤ C) [has_limit F] (W : C) : (W ⟶ limit F) ≅ (F.cones.obj (op W)) :=
294294
(limit.is_limit F).hom_iso W
295295

296296
@[simp] lemma limit.hom_iso_hom (F : J ⥤ C) [has_limit F] {W : C} (f : W ⟶ limit F):
@@ -416,7 +416,8 @@ begin
416416
end
417417

418418
def lim_yoneda : lim ⋙ yoneda ≅ category_theory.cones J C :=
419-
nat_iso.of_components (λ F, nat_iso.of_components (limit.hom_iso F) (by tidy)) (by tidy)
419+
nat_iso.of_components (λ F, nat_iso.of_components (λ W, limit.hom_iso F (unop W)) (by tidy))
420+
(by tidy)
420421

421422
end lim_functor
422423

@@ -634,7 +635,7 @@ begin
634635
end
635636

636637
def colim_coyoneda : colim.op ⋙ coyoneda ≅ category_theory.cocones J C :=
637-
nat_iso.of_components (λ F, nat_iso.of_components (colimit.hom_iso F)
638+
nat_iso.of_components (λ F, nat_iso.of_components (colimit.hom_iso (unop F))
638639
(by {tidy, dsimp [functor.cocones], rw category.assoc }))
639640
(by {tidy, rw [← category.assoc,← category.assoc], tidy })
640641

src/category_theory/opposites.lean

Lines changed: 79 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -9,23 +9,66 @@ namespace category_theory
99

1010
universes v₁ v₂ u₁ u₂ -- declare the `v`'s first; see `category_theory.category` for an explanation
1111

12-
def op (C : Type u₁) : Type u₁ := C
12+
def opposite (C : Type u₁) : Type u₁ := C
1313

1414
-- Use a high right binding power (like that of postfix ⁻¹) so that, for example,
1515
-- `presheaf Cᵒᵖ` parses as `presheaf (Cᵒᵖ)` and not `(presheaf C)ᵒᵖ`.
16-
notation C `ᵒᵖ`:std.prec.max_plus := op C
16+
notation C `ᵒᵖ`:std.prec.max_plus := opposite C
1717

18-
variables {C : Type u₁} [𝒞 : category.{v₁} C]
18+
variables {C : Type u₁}
19+
20+
def op (X : C) : Cᵒᵖ := X
21+
def unop (X : Cᵒᵖ) : C := X
22+
23+
attribute [irreducible] opposite
24+
25+
@[simp] lemma unop_op (X : C) : unop (op X) = X := rfl
26+
@[simp] lemma op_unop (X : Cᵒᵖ) : op (unop X) = X := rfl
27+
28+
section has_hom
29+
30+
variables [𝒞 : has_hom.{v₁} C]
31+
include 𝒞
32+
33+
instance has_hom.opposite : has_hom Cᵒᵖ :=
34+
{ hom := λ X Y, unop Y ⟶ unop X }
35+
36+
def has_hom.hom.op {X Y : C} (f : X ⟶ Y) : op Y ⟶ op X := f
37+
def has_hom.hom.unop {X Y : Cᵒᵖ} (f : X ⟶ Y) : unop Y ⟶ unop X := f
38+
39+
attribute [irreducible] has_hom.opposite
40+
41+
lemma has_hom.hom.op_inj {X Y : C} :
42+
function.injective (has_hom.hom.op : (X ⟶ Y) → (op Y ⟶ op X)) :=
43+
λ _ _ H, congr_arg has_hom.hom.unop H
44+
45+
lemma has_hom.hom.unop_inj {X Y : Cᵒᵖ} :
46+
function.injective (has_hom.hom.unop : (X ⟶ Y) → (unop Y ⟶ unop X)) :=
47+
λ _ _ H, congr_arg has_hom.hom.op H
48+
49+
@[simp] lemma has_hom.hom.unop_op {X Y : C} {f : X ⟶ Y} : f.op.unop = f := rfl
50+
@[simp] lemma has_hom.hom.op_unop {X Y : Cᵒᵖ} {f : X ⟶ Y} : f.unop.op = f := rfl
51+
52+
end has_hom
53+
54+
variables [𝒞 : category.{v₁} C]
1955
include 𝒞
2056

21-
instance opposite : category.{v₁} Cᵒᵖ :=
22-
{ hom := λ X Y : C, Y ⟶ X,
23-
comp := λ _ _ _ f g, g ≫ f,
24-
id := λ X, 𝟙 X }
57+
instance category.opposite : category.{v₁} Cᵒᵖ :=
58+
{ comp := λ _ _ _ f g, (g.unop ≫ f.unop).op,
59+
id := λ X, (𝟙 (unop X)).op }
60+
61+
@[simp] lemma op_comp {X Y Z : C} {f : X ⟶ Y} {g : Y ⟶ Z} :
62+
(f ≫ g).op = g.op ≫ f.op := rfl
63+
@[simp] lemma op_id {X : C} : (𝟙 X).op = 𝟙 (op X) := rfl
64+
65+
@[simp] lemma unop_comp {X Y Z : Cᵒᵖ} {f : X ⟶ Y} {g : Y ⟶ Z} :
66+
(f ≫ g).unop = g.unop ≫ f.unop := rfl
67+
@[simp] lemma unop_id {X : Cᵒᵖ} : (𝟙 X).unop = 𝟙 (unop X) := rfl
2568

2669
def op_op : (Cᵒᵖ)ᵒᵖ ⥤ C :=
27-
{ obj := λ X, X,
28-
map := λ X Y f, f }
70+
{ obj := λ X, unop (unop X),
71+
map := λ X Y f, f.unop.unop }
2972

3073
-- TODO this is an equivalence
3174

@@ -39,78 +82,64 @@ include 𝒟
3982
variables {C D}
4083

4184
protected definition op (F : C ⥤ D) : Cᵒᵖ ⥤ Dᵒᵖ :=
42-
{ obj := λ X, F.obj X,
43-
map := λ X Y f, F.map f,
44-
map_id' := begin /- `obviously'` says: -/ intros, erw [map_id], refl, end,
45-
map_comp' := begin /- `obviously'` says: -/ intros, erw [map_comp], refl end }
85+
{ obj := λ X, op (F.obj (unop X)),
86+
map := λ X Y f, (F.map f.unop).op }
4687

47-
@[simp] lemma op_obj (F : C ⥤ D) (X : C) : (F.op).obj X = F.obj X := rfl
48-
@[simp] lemma op_map (F : C ⥤ D) {X Y : C} (f : X ⟶ Y) : (F.op).map f = F.map f := rfl
88+
@[simp] lemma op_obj (F : C ⥤ D) (X : Cᵒᵖ) : (F.op).obj X = op (F.obj (unop X)) := rfl
89+
@[simp] lemma op_map (F : C ⥤ D) {X Y : Cᵒᵖ} (f : X ⟶ Y) : (F.op).map f = (F.map f.unop).op := rfl
4990

5091
protected definition unop (F : Cᵒᵖ ⥤ Dᵒᵖ) : C ⥤ D :=
51-
{ obj := λ X, F.obj X,
52-
map := λ X Y f, F.map f,
53-
map_id' := F.map_id,
54-
map_comp' := by intros; apply F.map_comp }
92+
{ obj := λ X, unop (F.obj (op X)),
93+
map := λ X Y f, (F.map f.op).unop }
5594

56-
@[simp] lemma unop_obj (F : Cᵒᵖ ⥤ Dᵒᵖ) (X : C) : (F.unop).obj X = F.obj X := rfl
57-
@[simp] lemma unop_map (F : Cᵒᵖ ⥤ Dᵒᵖ) {X Y : C} (f : X ⟶ Y) : (F.unop).map f = F.map f := rfl
95+
@[simp] lemma unop_obj (F : Cᵒᵖ ⥤ Dᵒᵖ) (X : C) : (F.unop).obj X = unop (F.obj (op X)) := rfl
96+
@[simp] lemma unop_map (F : Cᵒᵖ ⥤ Dᵒᵖ) {X Y : C} (f : X ⟶ Y) : (F.unop).map f = (F.map f.op).unop := rfl
5897

5998
variables (C D)
6099

61100
definition op_hom : (C ⥤ D)ᵒᵖ ⥤ (Cᵒᵖ ⥤ Dᵒᵖ) :=
62-
{ obj := λ F, F.op,
101+
{ obj := λ F, (unop F).op,
63102
map := λ F G α,
64-
{ app := λ X, α.app X,
65-
naturality' := λ X Y f, eq.symm (α.naturality f) } }
103+
{ app := λ X, (α.unop.app (unop X)).op,
104+
naturality' := λ X Y f, has_hom.hom.unop_inj $ eq.symm (α.unop.naturality f.unop) } }
66105

67-
@[simp] lemma op_hom.obj (F : (C ⥤ D)ᵒᵖ) : (op_hom C D).obj F = F.op := rfl
68-
@[simp] lemma op_hom.map_app {F G : (C ⥤ D)ᵒᵖ} (α : F ⟶ G) (X : C) :
69-
((op_hom C D).map α).app X = α.app X := rfl
106+
@[simp] lemma op_hom.obj (F : (C ⥤ D)ᵒᵖ) : (op_hom C D).obj F = (unop F).op := rfl
107+
@[simp] lemma op_hom.map_app {F G : (C ⥤ D)ᵒᵖ} (α : F ⟶ G) (X : Cᵒᵖ) :
108+
((op_hom C D).map α).app X = (α.unop.app (unop X)).op := rfl
70109

71110
definition op_inv : (Cᵒᵖ ⥤ Dᵒᵖ) ⥤ (C ⥤ D)ᵒᵖ :=
72-
{ obj := λ F : Cᵒᵖ ⥤ Dᵒᵖ, F.unop,
73-
map := λ F G α,
74-
{ app := λ X : C, α.app X,
75-
naturality' := λ X Y f, eq.symm (α.naturality f) } }
111+
{ obj := λ F, op F.unop,
112+
map := λ F G α, has_hom.hom.op
113+
{ app := λ X, (α.app (op X)).unop,
114+
naturality' := λ X Y f, has_hom.hom.op_inj $ eq.symm (α.naturality f.op) } }
76115

77-
@[simp] lemma op_inv.obj (F : Cᵒᵖ ⥤ Dᵒᵖ) : (op_inv C D).obj F = F.unop := rfl
116+
@[simp] lemma op_inv.obj (F : Cᵒᵖ ⥤ Dᵒᵖ) : (op_inv C D).obj F = op F.unop := rfl
78117
@[simp] lemma op_inv.map_app {F G : Cᵒᵖ ⥤ Dᵒᵖ} (α : F ⟶ G) (X : C) :
79-
((op_inv C D).map α).app X = α.app X := rfl
118+
(((op_inv C D).map α).unop).app X = (α.app (op X)).unop := rfl
80119

81120
-- TODO show these form an equivalence
82121

83122
instance {F : C ⥤ D} [full F] : full F.op :=
84-
{ preimage := λ X Y f, F.preimage f }
123+
{ preimage := λ X Y f, (F.preimage f.unop).op }
85124

86125
instance {F : C ⥤ D} [faithful F] : faithful F.op :=
87-
{ injectivity' := λ X Y f g h, by simpa using injectivity F h }
126+
{ injectivity' := λ X Y f g h,
127+
has_hom.hom.unop_inj $ by simpa using injectivity F (has_hom.hom.op_inj h) }
88128

89129
end
90130

91-
namespace category
92-
variables {C} {D : Type u₂} [𝒟 : category.{v₂} D]
93-
include 𝒟
94-
95-
@[simp] lemma op_id_app (F : (C ⥤ D)ᵒᵖ) (X : C) : (𝟙 F : F ⟹ F).app X = 𝟙 (F.obj X) := rfl
96-
@[simp] lemma op_comp_app {F G H : (C ⥤ D)ᵒᵖ} (α : F ⟶ G) (β : G ⟶ H) (X : C) :
97-
((α ≫ β) : H ⟹ F).app X = (β : H ⟹ G).app X ≫ (α : G ⟹ F).app X := rfl
98-
end category
99-
100131
section
101132

102133
variable (C)
103134

104135
/-- `functor.hom` is the hom-pairing, sending (X,Y) to X → Y, contravariant in X and covariant in Y. -/
105136
definition hom : Cᵒᵖ × C ⥤ Type v₁ :=
106-
{ obj := λ p, @has_hom.hom C _ p.1 p.2,
107-
map := λ X Y f, λ h, f.1 ≫ h ≫ f.2,
108-
map_id' := by intros; ext; dsimp [category_theory.opposite]; simp,
109-
map_comp' := by intros; ext; dsimp [category_theory.opposite]; simp }
137+
{ obj := λ p, unop p.1 ⟶ p.2,
138+
map := λ X Y f, λ h, f.1.unop ≫ h ≫ f.2 }
110139

111-
@[simp] lemma hom_obj (X : Cᵒᵖ × C) : (functor.hom C).obj X = @has_hom.hom C _ X.1 X.2 := rfl
140+
@[simp] lemma hom_obj (X : Cᵒᵖ × C) : (functor.hom C).obj X = (unop X.1 X.2) := rfl
112141
@[simp] lemma hom_pairing_map {X Y : Cᵒᵖ × C} (f : X ⟶ Y) :
113-
(functor.hom C).map f = λ h, f.1 ≫ h ≫ f.2 := rfl
142+
(functor.hom C).map f = λ h, f.1.unop ≫ h ≫ f.2 := rfl
114143

115144
end
116145

0 commit comments

Comments
 (0)