Opposite categories #
We provide a category instance on Cᵒᵖ
.
The morphisms X ⟶ Y
are defined to be the morphisms unop Y ⟶ unop X
in C
.
Here Cᵒᵖ
is an irreducible typeclass synonym for C
(it is the same one used in the algebra library).
We also provide various mechanisms for constructing opposite morphisms, functors, and natural transformations.
Unfortunately, because we do not have a definitional equality op (op X) = X
,
there are quite a few variations that are needed in practice.
The opposite category.
See https://stacks.math.columbia.edu/tag/001M.
Equations
- CategoryTheory.Category.opposite = CategoryTheory.Category.mk ⋯ ⋯ ⋯
The functor from the double-opposite of a category to the underlying category.
Equations
- CategoryTheory.unopUnop C = { obj := fun (X : Cᵒᵖᵒᵖ) => Opposite.unop (Opposite.unop X), map := fun {X Y : Cᵒᵖᵒᵖ} (f : X ⟶ Y) => f.unop.unop, map_id := ⋯, map_comp := ⋯ }
Instances For
The functor from a category to its double-opposite.
Equations
- CategoryTheory.opOp C = { obj := fun (X : C) => Opposite.op (Opposite.op X), map := fun {X Y : C} (f : X ⟶ Y) => f.op.op, map_id := ⋯, map_comp := ⋯ }
Instances For
The double opposite category is equivalent to the original.
Equations
- One or more equations did not get rendered due to their size.
Instances For
If f
is an isomorphism, so is f.op
Equations
- ⋯ = ⋯
If f.op
is an isomorphism f
must be too.
(This cannot be an instance as it would immediately loop!)
Equations
- ⋯ = ⋯
The opposite of a functor, i.e. considering a functor F : C ⥤ D
as a functor Cᵒᵖ ⥤ Dᵒᵖ
.
In informal mathematics no distinction is made between these.
Equations
- F.op = { obj := fun (X : Cᵒᵖ) => Opposite.op (F.obj (Opposite.unop X)), map := fun {X Y : Cᵒᵖ} (f : X ⟶ Y) => (F.map f.unop).op, map_id := ⋯, map_comp := ⋯ }
Instances For
Given a functor F : Cᵒᵖ ⥤ Dᵒᵖ
we can take the "unopposite" functor F : C ⥤ D
.
In informal mathematics no distinction is made between these.
Equations
- F.unop = { obj := fun (X : C) => Opposite.unop (F.obj (Opposite.op X)), map := fun {X Y : C} (f : X ⟶ Y) => (F.map f.op).unop, map_id := ⋯, map_comp := ⋯ }
Instances For
The isomorphism between F.op.unop
and F
.
Equations
- F.opUnopIso = CategoryTheory.NatIso.ofComponents (fun (x : C) => CategoryTheory.Iso.refl (F.op.unop.obj x)) ⋯
Instances For
The isomorphism between F.unop.op
and F
.
Equations
- F.unopOpIso = CategoryTheory.NatIso.ofComponents (fun (x : Cᵒᵖ) => CategoryTheory.Iso.refl (F.unop.op.obj x)) ⋯
Instances For
Taking the opposite of a functor is functorial.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Take the "unopposite" of a functor is functorial.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Another variant of the opposite of functor, turning a functor C ⥤ Dᵒᵖ
into a functor Cᵒᵖ ⥤ D
.
In informal mathematics no distinction is made.
Equations
- F.leftOp = { obj := fun (X : Cᵒᵖ) => Opposite.unop (F.obj (Opposite.unop X)), map := fun {X Y : Cᵒᵖ} (f : X ⟶ Y) => (F.map f.unop).unop, map_id := ⋯, map_comp := ⋯ }
Instances For
Another variant of the opposite of functor, turning a functor Cᵒᵖ ⥤ D
into a functor C ⥤ Dᵒᵖ
.
In informal mathematics no distinction is made.
Equations
- F.rightOp = { obj := fun (X : C) => Opposite.op (F.obj (Opposite.op X)), map := fun {X Y : C} (f : X ⟶ Y) => (F.map f.op).op, map_id := ⋯, map_comp := ⋯ }
Instances For
Equations
- ⋯ = ⋯
Equations
- ⋯ = ⋯
If F is faithful then the right_op of F is also faithful.
Equations
- ⋯ = ⋯
If F is faithful then the left_op of F is also faithful.
Equations
- ⋯ = ⋯
Equations
- ⋯ = ⋯
Equations
- ⋯ = ⋯
The isomorphism between F.leftOp.rightOp
and F
.
Equations
- F.leftOpRightOpIso = CategoryTheory.NatIso.ofComponents (fun (x : C) => CategoryTheory.Iso.refl (F.leftOp.rightOp.obj x)) ⋯
Instances For
The isomorphism between F.rightOp.leftOp
and F
.
Equations
- F.rightOpLeftOpIso = CategoryTheory.NatIso.ofComponents (fun (x : Cᵒᵖ) => CategoryTheory.Iso.refl (F.rightOp.leftOp.obj x)) ⋯
Instances For
Whenever possible, it is advisable to use the isomorphism rightOpLeftOpIso
instead of this equality of functors.
The opposite of a natural transformation.
Equations
- CategoryTheory.NatTrans.op α = { app := fun (X : Cᵒᵖ) => (α.app (Opposite.unop X)).op, naturality := ⋯ }
Instances For
The "unopposite" of a natural transformation.
Equations
- CategoryTheory.NatTrans.unop α = { app := fun (X : C) => (α.app (Opposite.op X)).unop, naturality := ⋯ }
Instances For
Given a natural transformation α : F.op ⟶ G.op
,
we can take the "unopposite" of each component obtaining a natural transformation G ⟶ F
.
Equations
- CategoryTheory.NatTrans.removeOp α = { app := fun (X : C) => (α.app (Opposite.op X)).unop, naturality := ⋯ }
Instances For
Given a natural transformation α : F.unop ⟶ G.unop
, we can take the opposite of each
component obtaining a natural transformation G ⟶ F
.
Equations
- CategoryTheory.NatTrans.removeUnop α = { app := fun (X : Cᵒᵖ) => (α.app (Opposite.unop X)).op, naturality := ⋯ }
Instances For
Given a natural transformation α : F ⟶ G
, for F G : C ⥤ Dᵒᵖ
,
taking unop
of each component gives a natural transformation G.leftOp ⟶ F.leftOp
.
Equations
- CategoryTheory.NatTrans.leftOp α = { app := fun (X : Cᵒᵖ) => (α.app (Opposite.unop X)).unop, naturality := ⋯ }
Instances For
Given a natural transformation α : F.leftOp ⟶ G.leftOp
, for F G : C ⥤ Dᵒᵖ
,
taking op
of each component gives a natural transformation G ⟶ F
.
Equations
- CategoryTheory.NatTrans.removeLeftOp α = { app := fun (X : C) => (α.app (Opposite.op X)).op, naturality := ⋯ }
Instances For
Given a natural transformation α : F ⟶ G
, for F G : Cᵒᵖ ⥤ D
,
taking op
of each component gives a natural transformation G.rightOp ⟶ F.rightOp
.
Equations
- CategoryTheory.NatTrans.rightOp α = { app := fun (x : C) => (α.app (Opposite.op x)).op, naturality := ⋯ }
Instances For
Given a natural transformation α : F.rightOp ⟶ G.rightOp
, for F G : Cᵒᵖ ⥤ D
,
taking unop
of each component gives a natural transformation G ⟶ F
.
Equations
- CategoryTheory.NatTrans.removeRightOp α = { app := fun (X : Cᵒᵖ) => (α.app (Opposite.unop X)).unop, naturality := ⋯ }
Instances For
The opposite isomorphism.
Equations
- α.op = { hom := α.hom.op, inv := α.inv.op, hom_inv_id := ⋯, inv_hom_id := ⋯ }
Instances For
The isomorphism obtained from an isomorphism in the opposite category.
Equations
- f.unop = { hom := f.hom.unop, inv := f.inv.unop, hom_inv_id := ⋯, inv_hom_id := ⋯ }
Instances For
The natural isomorphism between opposite functors G.op ≅ F.op
induced by a natural
isomorphism between the original functors F ≅ G
.
Equations
- CategoryTheory.NatIso.op α = { hom := CategoryTheory.NatTrans.op α.hom, inv := CategoryTheory.NatTrans.op α.inv, hom_inv_id := ⋯, inv_hom_id := ⋯ }
Instances For
The natural isomorphism between functors G ≅ F
induced by a natural isomorphism
between the opposite functors F.op ≅ G.op
.
Equations
- CategoryTheory.NatIso.removeOp α = { hom := CategoryTheory.NatTrans.removeOp α.hom, inv := CategoryTheory.NatTrans.removeOp α.inv, hom_inv_id := ⋯, inv_hom_id := ⋯ }
Instances For
The natural isomorphism between functors G.unop ≅ F.unop
induced by a natural isomorphism
between the original functors F ≅ G
.
Equations
- CategoryTheory.NatIso.unop α = { hom := CategoryTheory.NatTrans.unop α.hom, inv := CategoryTheory.NatTrans.unop α.inv, hom_inv_id := ⋯, inv_hom_id := ⋯ }
Instances For
An equivalence between categories gives an equivalence between the opposite categories.
Equations
- One or more equations did not get rendered due to their size.
Instances For
An equivalence between opposite categories gives an equivalence between the original categories.
Equations
- One or more equations did not get rendered due to their size.
Instances For
The equivalence between arrows of the form A ⟶ B
and B.unop ⟶ A.unop
. Useful for building
adjunctions.
Note that this (definitionally) gives variants
def opEquiv' (A : C) (B : Cᵒᵖ) : (Opposite.op A ⟶ B) ≃ (B.unop ⟶ A) :=
opEquiv _ _
def opEquiv'' (A : Cᵒᵖ) (B : C) : (A ⟶ Opposite.op B) ≃ (B ⟶ A.unop) :=
opEquiv _ _
def opEquiv''' (A B : C) : (Opposite.op A ⟶ Opposite.op B) ≃ (B ⟶ A) :=
opEquiv _ _
Equations
- CategoryTheory.opEquiv A B = { toFun := fun (f : A ⟶ B) => f.unop, invFun := fun (g : Opposite.unop B ⟶ Opposite.unop A) => g.op, left_inv := ⋯, right_inv := ⋯ }
Instances For
Equations
- ⋯ = ⋯
Equations
- CategoryTheory.decidableEqOfUnop A B = (CategoryTheory.opEquiv A B).decidableEq
The equivalence between isomorphisms of the form A ≅ B
and B.unop ≅ A.unop
.
Note this is definitionally the same as the other three variants:
(Opposite.op A ≅ B) ≃ (B.unop ≅ A)
(A ≅ Opposite.op B) ≃ (B ≅ A.unop)
(Opposite.op A ≅ Opposite.op B) ≃ (B ≅ A)
Equations
- CategoryTheory.isoOpEquiv A B = { toFun := fun (f : A ≅ B) => f.unop, invFun := fun (g : Opposite.unop B ≅ Opposite.unop A) => g.op, left_inv := ⋯, right_inv := ⋯ }
Instances For
The equivalence of functor categories induced by op
and unop
.
Equations
- One or more equations did not get rendered due to their size.
Instances For
The equivalence of functor categories induced by leftOp
and rightOp
.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Equations
- ⋯ = ⋯
Equations
- ⋯ = ⋯
Equations
- ⋯ = ⋯
Equations
- ⋯ = ⋯
Equations
- ⋯ = ⋯
Equations
- ⋯ = ⋯