@@ -9,23 +9,66 @@ namespace category_theory
99
1010universes 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]
1955include 𝒞
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
2669def 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 𝒟
3982variables {C D}
4083
4184protected 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
5091protected 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
5998variables (C D)
6099
61100definition 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
71110definition 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
83122instance {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
86125instance {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
89129end
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-
100131section
101132
102133variable (C)
103134
104135/-- `functor.hom` is the hom-pairing, sending (X,Y) to X → Y, contravariant in X and covariant in Y. -/
105136definition 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
115144end
116145
0 commit comments