Module docstring
{"# The Yoneda embedding
The Yoneda embedding as a functor yoneda : C ⥤ (Cᵒᵖ ⥤ Type v₁),
along with an instance that it is FullyFaithful.
Also the Yoneda lemma, yonedaLemma : (yoneda_pairing C) ≅ (yoneda_evaluation C).
{"# The Yoneda embedding
The Yoneda embedding as a functor yoneda : C ⥤ (Cᵒᵖ ⥤ Type v₁),
along with an instance that it is FullyFaithful.
Also the Yoneda lemma, yonedaLemma : (yoneda_pairing C) ≅ (yoneda_evaluation C).
CategoryTheory.yoneda
definition
: C ⥤ Cᵒᵖ ⥤ Type v₁
/-- The Yoneda embedding, as a functor from `C` into presheaves on `C`. -/
@[simps, stacks 001O]
def yoneda : C ⥤ Cᵒᵖ ⥤ Type v₁ where
obj X :=
{ obj := fun Y => unop Y ⟶ X
map := fun f g => f.unop ≫ g }
map f :=
{ app := fun _ g => g ≫ f }
CategoryTheory.coyoneda
definition
: Cᵒᵖ ⥤ C ⥤ Type v₁
/-- The co-Yoneda embedding, as a functor from `Cᵒᵖ` into co-presheaves on `C`.
-/
@[simps]
def coyoneda : CᵒᵖCᵒᵖ ⥤ C ⥤ Type v₁ where
obj X :=
{ obj := fun Y => unop X ⟶ Y
map := fun f g => g ≫ f }
map f :=
{ app := fun _ g => f.unop ≫ g }
CategoryTheory.Yoneda.obj_map_id
theorem
{X Y : C} (f : op X ⟶ op Y) : (yoneda.obj X).map f (𝟙 X) = (yoneda.map f.unop).app (op Y) (𝟙 Y)
CategoryTheory.Yoneda.naturality
theorem
{X Y : C} (α : yoneda.obj X ⟶ yoneda.obj Y) {Z Z' : C} (f : Z ⟶ Z') (h : Z' ⟶ X) :
f ≫ α.app (op Z') h = α.app (op Z) (f ≫ h)
@[simp]
theorem naturality {X Y : C} (α : yonedayoneda.obj X ⟶ yoneda.obj Y) {Z Z' : C} (f : Z ⟶ Z')
(h : Z' ⟶ X) : f ≫ α.app (op Z') h = α.app (op Z) (f ≫ h) :=
(FunctorToTypes.naturality _ _ α f.op h).symm
CategoryTheory.Yoneda.fullyFaithful
definition
: (yoneda (C := C)).FullyFaithful
/-- The Yoneda embedding is fully faithful. -/
def fullyFaithful : (yoneda (C := C)).FullyFaithful where
preimage f := f.app _ (𝟙 _)
CategoryTheory.Yoneda.fullyFaithful_preimage
theorem
{X Y : C} (f : yoneda.obj X ⟶ yoneda.obj Y) : fullyFaithful.preimage f = f.app (op X) (𝟙 X)
lemma fullyFaithful_preimage {X Y : C} (f : yonedayoneda.obj X ⟶ yoneda.obj Y) :
fullyFaithful.preimage f = f.app (op X) (𝟙 X) := rfl
CategoryTheory.Yoneda.yoneda_full
instance
: (yoneda : C ⥤ Cᵒᵖ ⥤ Type v₁).Full
/-- The Yoneda embedding is full. -/
@[stacks 001P]
instance yoneda_full : (yoneda : C ⥤ Cᵒᵖ ⥤ Type v₁).Full :=
fullyFaithful.full
CategoryTheory.Yoneda.yoneda_faithful
instance
: (yoneda : C ⥤ Cᵒᵖ ⥤ Type v₁).Faithful
/-- The Yoneda embedding is faithful. -/
@[stacks 001P]
instance yoneda_faithful : (yoneda : C ⥤ Cᵒᵖ ⥤ Type v₁).Faithful :=
fullyFaithful.faithful
CategoryTheory.Yoneda.ext
definition
(X Y : C) (p : ∀ {Z : C}, (Z ⟶ X) → (Z ⟶ Y)) (q : ∀ {Z : C}, (Z ⟶ Y) → (Z ⟶ X))
(h₁ : ∀ {Z : C} (f : Z ⟶ X), q (p f) = f) (h₂ : ∀ {Z : C} (f : Z ⟶ Y), p (q f) = f)
(n : ∀ {Z Z' : C} (f : Z' ⟶ Z) (g : Z ⟶ X), p (f ≫ g) = f ≫ p g) : X ≅ Y
/-- Extensionality via Yoneda. The typical usage would be
```
-- Goal is `X ≅ Y`
apply Yoneda.ext
-- Goals are now functions `(Z ⟶ X) → (Z ⟶ Y)`, `(Z ⟶ Y) → (Z ⟶ X)`, and the fact that these
-- functions are inverses and natural in `Z`.
```
-/
def ext (X Y : C) (p : ∀ {Z : C}, (Z ⟶ X) → (Z ⟶ Y))
(q : ∀ {Z : C}, (Z ⟶ Y) → (Z ⟶ X))
(h₁ : ∀ {Z : C} (f : Z ⟶ X), q (p f) = f) (h₂ : ∀ {Z : C} (f : Z ⟶ Y), p (q f) = f)
(n : ∀ {Z Z' : C} (f : Z' ⟶ Z) (g : Z ⟶ X), p (f ≫ g) = f ≫ p g) : X ≅ Y :=
fullyFaithful.preimageIso
(NatIso.ofComponents fun Z =>
{ hom := p
inv := q })
CategoryTheory.Yoneda.isIso
theorem
{X Y : C} (f : X ⟶ Y) [IsIso (yoneda.map f)] : IsIso f
CategoryTheory.Coyoneda.naturality
theorem
{X Y : Cᵒᵖ} (α : coyoneda.obj X ⟶ coyoneda.obj Y) {Z Z' : C} (f : Z' ⟶ Z) (h : unop X ⟶ Z') :
α.app Z' h ≫ f = α.app Z (h ≫ f)
@[simp]
theorem naturality {X Y : Cᵒᵖ} (α : coyonedacoyoneda.obj X ⟶ coyoneda.obj Y) {Z Z' : C} (f : Z' ⟶ Z)
(h : unopunop X ⟶ Z') : α.app Z' h ≫ f = α.app Z (h ≫ f) :=
(FunctorToTypes.naturality _ _ α f h).symm
CategoryTheory.Coyoneda.fullyFaithful
definition
: (coyoneda (C := C)).FullyFaithful
/-- The co-Yoneda embedding is fully faithful. -/
def fullyFaithful : (coyoneda (C := C)).FullyFaithful where
preimage f := (f.app _ (𝟙 _)).op
CategoryTheory.Coyoneda.fullyFaithful_preimage
theorem
{X Y : Cᵒᵖ} (f : coyoneda.obj X ⟶ coyoneda.obj Y) : fullyFaithful.preimage f = (f.app X.unop (𝟙 X.unop)).op
lemma fullyFaithful_preimage {X Y : Cᵒᵖ} (f : coyonedacoyoneda.obj X ⟶ coyoneda.obj Y) :
fullyFaithful.preimage f = (f.app X.unop (𝟙 X.unop)).op := rfl
CategoryTheory.Coyoneda.preimage
definition
{X Y : Cᵒᵖ} (f : coyoneda.obj X ⟶ coyoneda.obj Y) : X ⟶ Y
CategoryTheory.Coyoneda.coyoneda_full
instance
: (coyoneda : Cᵒᵖ ⥤ C ⥤ Type v₁).Full
instance coyoneda_full : (coyoneda : CᵒᵖCᵒᵖ ⥤ C ⥤ Type v₁).Full :=
fullyFaithful.full
CategoryTheory.Coyoneda.coyoneda_faithful
instance
: (coyoneda : Cᵒᵖ ⥤ C ⥤ Type v₁).Faithful
instance coyoneda_faithful : (coyoneda : CᵒᵖCᵒᵖ ⥤ C ⥤ Type v₁).Faithful :=
fullyFaithful.faithful
CategoryTheory.Coyoneda.ext
definition
(X Y : C) (p : ∀ {Z : C}, (X ⟶ Z) → (Y ⟶ Z)) (q : ∀ {Z : C}, (Y ⟶ Z) → (X ⟶ Z))
(h₁ : ∀ {Z : C} (f : X ⟶ Z), q (p f) = f) (h₂ : ∀ {Z : C} (f : Y ⟶ Z), p (q f) = f)
(n : ∀ {Z Z' : C} (f : Y ⟶ Z) (g : Z ⟶ Z'), q (f ≫ g) = q f ≫ g) : X ≅ Y
/-- Extensionality via Coyoneda. The typical usage would be
```
-- Goal is `X ≅ Y`
apply Coyoneda.ext
-- Goals are now functions `(X ⟶ Z) → (Y ⟶ Z)`, `(Y ⟶ Z) → (X ⟶ Z)`, and the fact that these
-- functions are inverses and natural in `Z`.
```
-/
def ext (X Y : C) (p : ∀ {Z : C}, (X ⟶ Z) → (Y ⟶ Z))
(q : ∀ {Z : C}, (Y ⟶ Z) → (X ⟶ Z))
(h₁ : ∀ {Z : C} (f : X ⟶ Z), q (p f) = f) (h₂ : ∀ {Z : C} (f : Y ⟶ Z), p (q f) = f)
(n : ∀ {Z Z' : C} (f : Y ⟶ Z) (g : Z ⟶ Z'), q (f ≫ g) = q f ≫ g) : X ≅ Y :=
fullyFaithful.preimageIso
(NatIso.ofComponents (fun Z =>
{ hom := q
inv := p })
) |>.unop
CategoryTheory.Coyoneda.isIso
theorem
{X Y : Cᵒᵖ} (f : X ⟶ Y) [IsIso (coyoneda.map f)] : IsIso f
CategoryTheory.Coyoneda.punitIso
definition
: coyoneda.obj (Opposite.op PUnit) ≅ 𝟭 (Type v₁)
/-- The identity functor on `Type` is isomorphic to the coyoneda functor coming from `PUnit`. -/
def punitIso : coyonedacoyoneda.obj (Opposite.op PUnit) ≅ 𝟭 (Type v₁) :=
NatIso.ofComponents fun X =>
{ hom := fun f => f ⟨⟩
inv := fun x _ => x }
CategoryTheory.Coyoneda.objOpOp
definition
(X : C) : coyoneda.obj (op (op X)) ≅ yoneda.obj X
/-- Taking the `unop` of morphisms is a natural isomorphism. -/
@[simps!]
def objOpOp (X : C) : coyonedacoyoneda.obj (op (op X)) ≅ yoneda.obj X :=
NatIso.ofComponents fun _ => (opEquiv _ _).toIso
CategoryTheory.Coyoneda.opIso
definition
: yoneda ⋙ (whiskeringLeft _ _ _).obj (opOp C) ≅ coyoneda
/-- Taking the `unop` of morphisms is a natural isomorphism. -/
def opIso : yonedayoneda ⋙ (whiskeringLeft _ _ _).obj (opOp C)yoneda ⋙ (whiskeringLeft _ _ _).obj (opOp C) ≅ coyoneda :=
NatIso.ofComponents (fun X ↦ NatIso.ofComponents (fun Y ↦ (opEquiv (op Y) X).toIso)
(fun _ ↦ rfl)) (fun _ ↦ rfl)
CategoryTheory.Functor.RepresentableBy
structure
(F : Cᵒᵖ ⥤ Type v) (Y : C)
/-- The data which expresses that a functor `F : Cᵒᵖ ⥤ Type v` is representable by `Y : C`. -/
structure RepresentableBy (F : CᵒᵖCᵒᵖ ⥤ Type v) (Y : C) where
/-- the natural bijection `(X ⟶ Y) ≃ F.obj (op X)`. -/
homEquiv {X : C} : (X ⟶ Y) ≃ F.obj (op X)
homEquiv_comp {X X' : C} (f : X ⟶ X') (g : X' ⟶ Y) :
homEquiv (f ≫ g) = F.map f.op (homEquiv g)
CategoryTheory.Functor.RepresentableBy.comp_homEquiv_symm
theorem
{F : Cᵒᵖ ⥤ Type v} {Y : C} (e : F.RepresentableBy Y) {X X' : C} (x : F.obj (op X')) (f : X ⟶ X') :
f ≫ e.homEquiv.symm x = e.homEquiv.symm (F.map f.op x)
lemma RepresentableBy.comp_homEquiv_symm {F : CᵒᵖCᵒᵖ ⥤ Type v} {Y : C}
(e : F.RepresentableBy Y) {X X' : C} (x : F.obj (op X')) (f : X ⟶ X') :
f ≫ e.homEquiv.symm x = e.homEquiv.symm (F.map f.op x) :=
e.homEquiv.injective (by simp [homEquiv_comp])
CategoryTheory.Functor.RepresentableBy.ofIso
definition
{F F' : Cᵒᵖ ⥤ Type v} {Y : C} (e : F.RepresentableBy Y) (e' : F ≅ F') : F'.RepresentableBy Y
/-- If `F ≅ F'`, and `F` is representable, then `F'` is representable. -/
def RepresentableBy.ofIso {F F' : CᵒᵖCᵒᵖ ⥤ Type v} {Y : C} (e : F.RepresentableBy Y) (e' : F ≅ F') :
F'.RepresentableBy Y where
homEquiv {X} := e.homEquiv.trans (e'.app _).toEquiv
homEquiv_comp {X X'} f g := by
dsimp
rw [e.homEquiv_comp]
apply congr_fun (e'.hom.naturality f.op)
CategoryTheory.Functor.CorepresentableBy
structure
(F : C ⥤ Type v) (X : C)
/-- The data which expresses that a functor `F : C ⥤ Type v` is corepresentable by `X : C`. -/
structure CorepresentableBy (F : C ⥤ Type v) (X : C) where
/-- the natural bijection `(X ⟶ Y) ≃ F.obj Y`. -/
homEquiv {Y : C} : (X ⟶ Y) ≃ F.obj Y
homEquiv_comp {Y Y' : C} (g : Y ⟶ Y') (f : X ⟶ Y) :
homEquiv (f ≫ g) = F.map g (homEquiv f)
CategoryTheory.Functor.CorepresentableBy.homEquiv_symm_comp
theorem
{F : C ⥤ Type v} {X : C} (e : F.CorepresentableBy X) {Y Y' : C} (y : F.obj Y) (g : Y ⟶ Y') :
e.homEquiv.symm y ≫ g = e.homEquiv.symm (F.map g y)
lemma CorepresentableBy.homEquiv_symm_comp {F : C ⥤ Type v} {X : C}
(e : F.CorepresentableBy X) {Y Y' : C} (y : F.obj Y) (g : Y ⟶ Y') :
e.homEquiv.symm y ≫ g = e.homEquiv.symm (F.map g y) :=
e.homEquiv.injective (by simp [homEquiv_comp])
CategoryTheory.Functor.CorepresentableBy.ofIso
definition
{F F' : C ⥤ Type v} {X : C} (e : F.CorepresentableBy X) (e' : F ≅ F') : F'.CorepresentableBy X
/-- If `F ≅ F'`, and `F` is corepresentable, then `F'` is corepresentable. -/
def CorepresentableBy.ofIso {F F' : C ⥤ Type v} {X : C} (e : F.CorepresentableBy X)
(e' : F ≅ F') :
F'.CorepresentableBy X where
homEquiv {X} := e.homEquiv.trans (e'.app _).toEquiv
homEquiv_comp {Y Y'} g f := by
dsimp
rw [e.homEquiv_comp]
apply congr_fun (e'.hom.naturality g)
CategoryTheory.Functor.RepresentableBy.homEquiv_eq
theorem
{F : Cᵒᵖ ⥤ Type v} {Y : C} (e : F.RepresentableBy Y) {X : C} (f : X ⟶ Y) : e.homEquiv f = F.map f.op (e.homEquiv (𝟙 Y))
lemma RepresentableBy.homEquiv_eq {F : CᵒᵖCᵒᵖ ⥤ Type v} {Y : C} (e : F.RepresentableBy Y)
{X : C} (f : X ⟶ Y) :
e.homEquiv f = F.map f.op (e.homEquiv (𝟙 Y)) := by
conv_lhs => rw [← Category.comp_id f, e.homEquiv_comp]
CategoryTheory.Functor.CorepresentableBy.homEquiv_eq
theorem
{F : C ⥤ Type v} {X : C} (e : F.CorepresentableBy X) {Y : C} (f : X ⟶ Y) : e.homEquiv f = F.map f (e.homEquiv (𝟙 X))
lemma CorepresentableBy.homEquiv_eq {F : C ⥤ Type v} {X : C} (e : F.CorepresentableBy X)
{Y : C} (f : X ⟶ Y) :
e.homEquiv f = F.map f (e.homEquiv (𝟙 X)) := by
conv_lhs => rw [← Category.id_comp f, e.homEquiv_comp]
CategoryTheory.Functor.RepresentableBy.uniqueUpToIso
definition
{F : Cᵒᵖ ⥤ Type v} {Y Y' : C} (e : F.RepresentableBy Y) (e' : F.RepresentableBy Y') : Y ≅ Y'
/-- Representing objects are unique up to isomorphism. -/
@[simps!]
def RepresentableBy.uniqueUpToIso {F : CᵒᵖCᵒᵖ ⥤ Type v} {Y Y' : C} (e : F.RepresentableBy Y)
(e' : F.RepresentableBy Y') : Y ≅ Y' :=
let ε {X} := (@e.homEquiv X).trans e'.homEquiv.symm
Yoneda.ext _ _ ε ε.symm (by simp) (by simp)
(by simp [ε, comp_homEquiv_symm, homEquiv_comp])
CategoryTheory.Functor.CorepresentableBy.uniqueUpToIso
definition
{F : C ⥤ Type v} {X X' : C} (e : F.CorepresentableBy X) (e' : F.CorepresentableBy X') : X ≅ X'
/-- Corepresenting objects are unique up to isomorphism. -/
@[simps!]
def CorepresentableBy.uniqueUpToIso {F : C ⥤ Type v} {X X' : C} (e : F.CorepresentableBy X)
(e' : F.CorepresentableBy X') : X ≅ X' :=
let ε {Y} := (@e.homEquiv Y).trans e'.homEquiv.symm
Coyoneda.ext _ _ ε ε.symm (by simp) (by simp)
(by simp [ε, homEquiv_symm_comp, homEquiv_comp])
CategoryTheory.Functor.RepresentableBy.ext
theorem
{F : Cᵒᵖ ⥤ Type v} {Y : C} {e e' : F.RepresentableBy Y} (h : e.homEquiv (𝟙 Y) = e'.homEquiv (𝟙 Y)) : e = e'
@[ext]
lemma RepresentableBy.ext {F : CᵒᵖCᵒᵖ ⥤ Type v} {Y : C} {e e' : F.RepresentableBy Y}
(h : e.homEquiv (𝟙 Y) = e'.homEquiv (𝟙 Y)) : e = e' := by
have : ∀ {X : C} (f : X ⟶ Y), e.homEquiv f = e'.homEquiv f := fun {X} f ↦ by
rw [e.homEquiv_eq, e'.homEquiv_eq, h]
obtain ⟨e, he⟩ := e
obtain ⟨e', he'⟩ := e'
obtain rfl : @e = @e' := by ext; apply this
rfl
CategoryTheory.Functor.CorepresentableBy.ext
theorem
{F : C ⥤ Type v} {X : C} {e e' : F.CorepresentableBy X} (h : e.homEquiv (𝟙 X) = e'.homEquiv (𝟙 X)) : e = e'
@[ext]
lemma CorepresentableBy.ext {F : C ⥤ Type v} {X : C} {e e' : F.CorepresentableBy X}
(h : e.homEquiv (𝟙 X) = e'.homEquiv (𝟙 X)) : e = e' := by
have : ∀ {Y : C} (f : X ⟶ Y), e.homEquiv f = e'.homEquiv f := fun {X} f ↦ by
rw [e.homEquiv_eq, e'.homEquiv_eq, h]
obtain ⟨e, he⟩ := e
obtain ⟨e', he'⟩ := e'
obtain rfl : @e = @e' := by ext; apply this
rfl
CategoryTheory.Functor.representableByEquiv
definition
{F : Cᵒᵖ ⥤ Type v₁} {Y : C} : F.RepresentableBy Y ≃ (yoneda.obj Y ≅ F)
/-- The obvious bijection `F.RepresentableBy Y ≃ (yoneda.obj Y ≅ F)`
when `F : Cᵒᵖ ⥤ Type v₁` and `[Category.{v₁} C]`. -/
def representableByEquiv {F : CᵒᵖCᵒᵖ ⥤ Type v₁} {Y : C} :
F.RepresentableBy Y ≃ (yoneda.obj Y ≅ F) where
toFun r := NatIso.ofComponents (fun _ ↦ r.homEquiv.toIso) (fun {X X'} f ↦ by
ext g
simp [r.homEquiv_comp])
invFun e :=
{ homEquiv := (e.app _).toEquiv
homEquiv_comp := fun {X X'} f g ↦ congr_fun (e.hom.naturality f.op) g }
left_inv _ := rfl
right_inv _ := rfl
CategoryTheory.Functor.RepresentableBy.toIso
definition
{F : Cᵒᵖ ⥤ Type v₁} {Y : C} (e : F.RepresentableBy Y) : yoneda.obj Y ≅ F
/-- The isomorphism `yoneda.obj Y ≅ F` induced by `e : F.RepresentableBy Y`. -/
def RepresentableBy.toIso {F : CᵒᵖCᵒᵖ ⥤ Type v₁} {Y : C} (e : F.RepresentableBy Y) :
yonedayoneda.obj Y ≅ F :=
representableByEquiv e
CategoryTheory.Functor.corepresentableByEquiv
definition
{F : C ⥤ Type v₁} {X : C} : F.CorepresentableBy X ≃ (coyoneda.obj (op X) ≅ F)
/-- The obvious bijection `F.CorepresentableBy X ≃ (yoneda.obj Y ≅ F)`
when `F : C ⥤ Type v₁` and `[Category.{v₁} C]`. -/
def corepresentableByEquiv {F : C ⥤ Type v₁} {X : C} :
F.CorepresentableBy X ≃ (coyoneda.obj (op X) ≅ F) where
toFun r := NatIso.ofComponents (fun _ ↦ r.homEquiv.toIso) (fun {X X'} f ↦ by
ext g
simp [r.homEquiv_comp])
invFun e :=
{ homEquiv := (e.app _).toEquiv
homEquiv_comp := fun {X X'} f g ↦ congr_fun (e.hom.naturality f) g }
left_inv _ := rfl
right_inv _ := rfl
CategoryTheory.Functor.CorepresentableBy.toIso
definition
{F : C ⥤ Type v₁} {X : C} (e : F.CorepresentableBy X) : coyoneda.obj (op X) ≅ F
/-- The isomorphism `coyoneda.obj (op X) ≅ F` induced by `e : F.CorepresentableBy X`. -/
def CorepresentableBy.toIso {F : C ⥤ Type v₁} {X : C} (e : F.CorepresentableBy X) :
coyonedacoyoneda.obj (op X) ≅ F :=
corepresentableByEquiv e
CategoryTheory.Functor.IsRepresentable
structure
(F : Cᵒᵖ ⥤ Type v)
/-- A functor `F : Cᵒᵖ ⥤ Type v` is representable if there is an object `Y` with a structure
`F.RepresentableBy Y`, i.e. there is a natural bijection `(X ⟶ Y) ≃ F.obj (op X)`,
which may also be rephrased as a natural isomorphism `yoneda.obj X ≅ F` when `Category.{v} C`. -/
@[stacks 001Q]
class IsRepresentable (F : CᵒᵖCᵒᵖ ⥤ Type v) : Prop where
has_representation : ∃ (Y : C), Nonempty (F.RepresentableBy Y)
CategoryTheory.Functor.RepresentableBy.isRepresentable
theorem
{F : Cᵒᵖ ⥤ Type v} {Y : C} (e : F.RepresentableBy Y) : F.IsRepresentable
lemma RepresentableBy.isRepresentable {F : CᵒᵖCᵒᵖ ⥤ Type v} {Y : C} (e : F.RepresentableBy Y) :
F.IsRepresentable where
has_representation := ⟨Y, ⟨e⟩⟩
CategoryTheory.Functor.IsRepresentable.mk'
theorem
{F : Cᵒᵖ ⥤ Type v₁} {X : C} (e : yoneda.obj X ≅ F) : F.IsRepresentable
/-- Alternative constructor for `F.IsRepresentable`, which takes as an input an
isomorphism `yoneda.obj X ≅ F`. -/
lemma IsRepresentable.mk' {F : CᵒᵖCᵒᵖ ⥤ Type v₁} {X : C} (e : yonedayoneda.obj X ≅ F) :
F.IsRepresentable :=
(representableByEquiv.symm e).isRepresentable
CategoryTheory.Functor.instIsRepresentableObjOppositeTypeYoneda
instance
{X : C} : IsRepresentable (yoneda.obj X)
instance {X : C} : IsRepresentable (yoneda.obj X) :=
IsRepresentable.mk' (Iso.refl _)
CategoryTheory.Functor.IsCorepresentable
structure
(F : C ⥤ Type v)
/-- A functor `F : C ⥤ Type v₁` is corepresentable if there is object `X` so `F ≅ coyoneda.obj X`.
-/
@[stacks 001Q]
class IsCorepresentable (F : C ⥤ Type v) : Prop where
has_corepresentation : ∃ (X : C), Nonempty (F.CorepresentableBy X)
CategoryTheory.Functor.CorepresentableBy.isCorepresentable
theorem
{F : C ⥤ Type v} {X : C} (e : F.CorepresentableBy X) : F.IsCorepresentable
lemma CorepresentableBy.isCorepresentable {F : C ⥤ Type v} {X : C} (e : F.CorepresentableBy X) :
F.IsCorepresentable where
has_corepresentation := ⟨X, ⟨e⟩⟩
CategoryTheory.Functor.IsCorepresentable.mk'
theorem
{F : C ⥤ Type v₁} {X : C} (e : coyoneda.obj (op X) ≅ F) : F.IsCorepresentable
/-- Alternative constructor for `F.IsCorepresentable`, which takes as an input an
isomorphism `coyoneda.obj (op X) ≅ F`. -/
lemma IsCorepresentable.mk' {F : C ⥤ Type v₁} {X : C} (e : coyonedacoyoneda.obj (op X) ≅ F) :
F.IsCorepresentable :=
(corepresentableByEquiv.symm e).isCorepresentable
CategoryTheory.Functor.instIsCorepresentableObjOppositeTypeCoyoneda
instance
{X : Cᵒᵖ} : IsCorepresentable (coyoneda.obj X)
instance {X : Cᵒᵖ} : IsCorepresentable (coyoneda.obj X) :=
IsCorepresentable.mk' (Iso.refl _)
CategoryTheory.Functor.reprX
definition
: C
/-- The representing object for the representable functor `F`. -/
noncomputable def reprX : C :=
hF.has_representation.choose
CategoryTheory.Functor.representableBy
definition
: F.RepresentableBy F.reprX
/-- A chosen term in `F.RepresentableBy (reprX F)` when `F.IsRepresentable` holds. -/
noncomputable def representableBy : F.RepresentableBy F.reprX :=
hF.has_representation.choose_spec.some
CategoryTheory.Functor.RepresentableBy.isoReprX
definition
{Y : C} (e : F.RepresentableBy Y) : Y ≅ F.reprX
/-- Any representing object for a representable functor `F` is isomorphic to `reprX F`. -/
noncomputable def RepresentableBy.isoReprX {Y : C} (e : F.RepresentableBy Y) :
Y ≅ F.reprX :=
RepresentableBy.uniqueUpToIso e (representableBy F)
CategoryTheory.Functor.reprx
definition
: F.obj (op F.reprX)
CategoryTheory.Functor.reprW
definition
(F : Cᵒᵖ ⥤ Type v₁) [F.IsRepresentable] : yoneda.obj F.reprX ≅ F
/-- An isomorphism between a representable `F` and a functor of the
form `C(-, F.reprX)`. Note the components `F.reprW.app X`
definitionally have type `(X.unop ⟶ F.reprX) ≅ F.obj X`.
-/
noncomputable def reprW (F : CᵒᵖCᵒᵖ ⥤ Type v₁) [F.IsRepresentable] :
yonedayoneda.obj F.reprX ≅ F := F.representableBy.toIso
CategoryTheory.Functor.reprW_hom_app
theorem
(F : Cᵒᵖ ⥤ Type v₁) [F.IsRepresentable] (X : Cᵒᵖ) (f : unop X ⟶ F.reprX) : F.reprW.hom.app X f = F.map f.op F.reprx
theorem reprW_hom_app (F : CᵒᵖCᵒᵖ ⥤ Type v₁) [F.IsRepresentable]
(X : Cᵒᵖ) (f : unopunop X ⟶ F.reprX) :
F.reprW.hom.app X f = F.map f.op F.reprx := by
apply RepresentableBy.homEquiv_eq
CategoryTheory.Functor.coreprX
definition
: C
/-- The representing object for the corepresentable functor `F`. -/
noncomputable def coreprX : C :=
hF.has_corepresentation.choose
CategoryTheory.Functor.corepresentableBy
definition
: F.CorepresentableBy F.coreprX
/-- A chosen term in `F.CorepresentableBy (coreprX F)` when `F.IsCorepresentable` holds. -/
noncomputable def corepresentableBy : F.CorepresentableBy F.coreprX :=
hF.has_corepresentation.choose_spec.some
CategoryTheory.Functor.CorepresentableBy.isoCoreprX
definition
{Y : C} (e : F.CorepresentableBy Y) : Y ≅ F.coreprX
/-- Any corepresenting object for a corepresentable functor `F` is isomorphic to `coreprX F`. -/
noncomputable def CorepresentableBy.isoCoreprX {Y : C} (e : F.CorepresentableBy Y) :
Y ≅ F.coreprX :=
CorepresentableBy.uniqueUpToIso e (corepresentableBy F)
CategoryTheory.Functor.coreprx
definition
: F.obj F.coreprX
CategoryTheory.Functor.coreprW
definition
(F : C ⥤ Type v₁) [F.IsCorepresentable] : coyoneda.obj (op F.coreprX) ≅ F
/-- An isomorphism between a corepresentable `F` and a functor of the form
`C(F.corepr X, -)`. Note the components `F.coreprW.app X`
definitionally have type `F.corepr_X ⟶ X ≅ F.obj X`.
-/
noncomputable def coreprW (F : C ⥤ Type v₁) [F.IsCorepresentable] :
coyonedacoyoneda.obj (op F.coreprX) ≅ F :=
F.corepresentableBy.toIso
CategoryTheory.Functor.coreprW_hom_app
theorem
(F : C ⥤ Type v₁) [F.IsCorepresentable] (X : C) (f : F.coreprX ⟶ X) : F.coreprW.hom.app X f = F.map f F.coreprx
theorem coreprW_hom_app (F : C ⥤ Type v₁) [F.IsCorepresentable] (X : C) (f : F.coreprX ⟶ X) :
F.coreprW.hom.app X f = F.map f F.coreprx := by
apply CorepresentableBy.homEquiv_eq
CategoryTheory.isRepresentable_of_natIso
theorem
(F : Cᵒᵖ ⥤ Type v₁) {G} (i : F ≅ G) [F.IsRepresentable] : G.IsRepresentable
theorem isRepresentable_of_natIso (F : CᵒᵖCᵒᵖ ⥤ Type v₁) {G} (i : F ≅ G) [F.IsRepresentable] :
G.IsRepresentable :=
(F.representableBy.ofIso i).isRepresentable
CategoryTheory.corepresentable_of_natIso
theorem
(F : C ⥤ Type v₁) {G} (i : F ≅ G) [F.IsCorepresentable] : G.IsCorepresentable
theorem corepresentable_of_natIso (F : C ⥤ Type v₁) {G} (i : F ≅ G) [F.IsCorepresentable] :
G.IsCorepresentable :=
(F.corepresentableBy.ofIso i).isCorepresentable
CategoryTheory.instIsCorepresentableIdType
instance
: Functor.IsCorepresentable (𝟭 (Type v₁))
instance : Functor.IsCorepresentable (𝟭 (Type v₁)) :=
corepresentable_of_natIso (coyoneda.obj (op PUnit)) Coyoneda.punitIso
CategoryTheory.prodCategoryInstance1
instance
: Category ((Cᵒᵖ ⥤ Type v₁) × Cᵒᵖ)
instance prodCategoryInstance1 : Category ((Cᵒᵖ ⥤ Type v₁) × Cᵒᵖ) :=
CategoryTheory.prod.{max u₁ v₁, v₁} (CᵒᵖCᵒᵖ ⥤ Type v₁) Cᵒᵖ
CategoryTheory.prodCategoryInstance2
instance
: Category (Cᵒᵖ × (Cᵒᵖ ⥤ Type v₁))
instance prodCategoryInstance2 : Category (CᵒᵖCᵒᵖ × (Cᵒᵖ ⥤ Type v₁)) :=
CategoryTheory.prod.{v₁, max u₁ v₁} Cᵒᵖ (CᵒᵖCᵒᵖ ⥤ Type v₁)
CategoryTheory.yonedaEquiv
definition
{X : C} {F : Cᵒᵖ ⥤ Type v₁} : (yoneda.obj X ⟶ F) ≃ F.obj (op X)
/-- We have a type-level equivalence between natural transformations from the yoneda embedding
and elements of `F.obj X`, without any universe switching.
-/
def yonedaEquiv {X : C} {F : CᵒᵖCᵒᵖ ⥤ Type v₁} : (yoneda.obj X ⟶ F) ≃ F.obj (op X) where
toFun η := η.app (op X) (𝟙 X)
invFun ξ := { app := fun _ f ↦ F.map f.op ξ }
left_inv := by
intro η
ext Y f
dsimp
rw [← FunctorToTypes.naturality]
simp
right_inv := by intro ξ; simp
CategoryTheory.yonedaEquiv_apply
theorem
{X : C} {F : Cᵒᵖ ⥤ Type v₁} (f : yoneda.obj X ⟶ F) : yonedaEquiv f = f.app (op X) (𝟙 X)
theorem yonedaEquiv_apply {X : C} {F : CᵒᵖCᵒᵖ ⥤ Type v₁} (f : yonedayoneda.obj X ⟶ F) :
yonedaEquiv f = f.app (op X) (𝟙 X) :=
rfl
CategoryTheory.yonedaEquiv_symm_app_apply
theorem
{X : C} {F : Cᵒᵖ ⥤ Type v₁} (x : F.obj (op X)) (Y : Cᵒᵖ) (f : Y.unop ⟶ X) : (yonedaEquiv.symm x).app Y f = F.map f.op x
@[simp]
theorem yonedaEquiv_symm_app_apply {X : C} {F : CᵒᵖCᵒᵖ ⥤ Type v₁} (x : F.obj (op X)) (Y : Cᵒᵖ)
(f : Y.unop ⟶ X) : (yonedaEquiv.symm x).app Y f = F.map f.op x :=
rfl
CategoryTheory.yonedaEquiv_naturality
theorem
{X Y : C} {F : Cᵒᵖ ⥤ Type v₁} (f : yoneda.obj X ⟶ F) (g : Y ⟶ X) :
F.map g.op (yonedaEquiv f) = yonedaEquiv (yoneda.map g ≫ f)
/-- See also `yonedaEquiv_naturality'` for a more general version. -/
lemma yonedaEquiv_naturality {X Y : C} {F : CᵒᵖCᵒᵖ ⥤ Type v₁} (f : yonedayoneda.obj X ⟶ F)
(g : Y ⟶ X) : F.map g.op (yonedaEquiv f) = yonedaEquiv (yonedayoneda.map g ≫ f) := by
change (f.app (op X) ≫ F.map g.op) (𝟙 X) = f.app (op Y) (𝟙𝟙 Y ≫ g)
rw [← f.naturality]
dsimp
simp
CategoryTheory.yonedaEquiv_naturality'
theorem
{X Y : Cᵒᵖ} {F : Cᵒᵖ ⥤ Type v₁} (f : yoneda.obj (unop X) ⟶ F) (g : X ⟶ Y) :
F.map g (yonedaEquiv f) = yonedaEquiv (yoneda.map g.unop ≫ f)
/-- Variant of `yonedaEquiv_naturality` with general `g`. This is technically strictly more general
than `yonedaEquiv_naturality`, but `yonedaEquiv_naturality` is sometimes preferable because it
can avoid the "motive is not type correct" error. -/
lemma yonedaEquiv_naturality' {X Y : Cᵒᵖ} {F : CᵒᵖCᵒᵖ ⥤ Type v₁} (f : yonedayoneda.obj (unop X) ⟶ F)
(g : X ⟶ Y) : F.map g (yonedaEquiv f) = yonedaEquiv (yonedayoneda.map g.unop ≫ f) :=
yonedaEquiv_naturality _ _
CategoryTheory.yonedaEquiv_comp
theorem
{X : C} {F G : Cᵒᵖ ⥤ Type v₁} (α : yoneda.obj X ⟶ F) (β : F ⟶ G) : yonedaEquiv (α ≫ β) = β.app _ (yonedaEquiv α)
lemma yonedaEquiv_comp {X : C} {F G : CᵒᵖCᵒᵖ ⥤ Type v₁} (α : yonedayoneda.obj X ⟶ F) (β : F ⟶ G) :
yonedaEquiv (α ≫ β) = β.app _ (yonedaEquiv α) :=
rfl
CategoryTheory.yonedaEquiv_yoneda_map
theorem
{X Y : C} (f : X ⟶ Y) : yonedaEquiv (yoneda.map f) = f
lemma yonedaEquiv_yoneda_map {X Y : C} (f : X ⟶ Y) : yonedaEquiv (yoneda.map f) = f := by
rw [yonedaEquiv_apply]
simp
CategoryTheory.yonedaEquiv_symm_naturality_left
theorem
{X X' : C} (f : X' ⟶ X) (F : Cᵒᵖ ⥤ Type v₁) (x : F.obj ⟨X⟩) :
yoneda.map f ≫ yonedaEquiv.symm x = yonedaEquiv.symm ((F.map f.op) x)
lemma yonedaEquiv_symm_naturality_left {X X' : C} (f : X' ⟶ X) (F : CᵒᵖCᵒᵖ ⥤ Type v₁)
(x : F.obj ⟨X⟩) : yonedayoneda.map f ≫ yonedaEquiv.symm x = yonedaEquiv.symm ((F.map f.op) x) := by
apply yonedaEquiv.injective
simp only [yonedaEquiv_comp, yoneda_obj_obj, yonedaEquiv_symm_app_apply, Equiv.apply_symm_apply]
erw [yonedaEquiv_yoneda_map]
CategoryTheory.yonedaEquiv_symm_naturality_right
theorem
(X : C) {F F' : Cᵒᵖ ⥤ Type v₁} (f : F ⟶ F') (x : F.obj ⟨X⟩) : yonedaEquiv.symm x ≫ f = yonedaEquiv.symm (f.app ⟨X⟩ x)
lemma yonedaEquiv_symm_naturality_right (X : C) {F F' : CᵒᵖCᵒᵖ ⥤ Type v₁} (f : F ⟶ F')
(x : F.obj ⟨X⟩) : yonedaEquivyonedaEquiv.symm x ≫ f = yonedaEquiv.symm (f.app ⟨X⟩ x) := by
apply yonedaEquiv.injective
simp [yonedaEquiv_comp]
CategoryTheory.map_yonedaEquiv
theorem
{X Y : C} {F : Cᵒᵖ ⥤ Type v₁} (f : yoneda.obj X ⟶ F) (g : Y ⟶ X) : F.map g.op (yonedaEquiv f) = f.app (op Y) g
/-- See also `map_yonedaEquiv'` for a more general version. -/
lemma map_yonedaEquiv {X Y : C} {F : CᵒᵖCᵒᵖ ⥤ Type v₁} (f : yonedayoneda.obj X ⟶ F)
(g : Y ⟶ X) : F.map g.op (yonedaEquiv f) = f.app (op Y) g := by
rw [yonedaEquiv_naturality, yonedaEquiv_comp, yonedaEquiv_yoneda_map]
CategoryTheory.map_yonedaEquiv'
theorem
{X Y : Cᵒᵖ} {F : Cᵒᵖ ⥤ Type v₁} (f : yoneda.obj (unop X) ⟶ F) (g : X ⟶ Y) : F.map g (yonedaEquiv f) = f.app Y g.unop
/-- Variant of `map_yonedaEquiv` with general `g`. This is technically strictly more general
than `map_yonedaEquiv`, but `map_yonedaEquiv` is sometimes preferable because it
can avoid the "motive is not type correct" error. -/
lemma map_yonedaEquiv' {X Y : Cᵒᵖ} {F : CᵒᵖCᵒᵖ ⥤ Type v₁} (f : yonedayoneda.obj (unop X) ⟶ F)
(g : X ⟶ Y) : F.map g (yonedaEquiv f) = f.app Y g.unop := by
rw [yonedaEquiv_naturality', yonedaEquiv_comp, yonedaEquiv_yoneda_map]
CategoryTheory.yonedaEquiv_symm_map
theorem
{X Y : Cᵒᵖ} (f : X ⟶ Y) {F : Cᵒᵖ ⥤ Type v₁} (t : F.obj X) :
yonedaEquiv.symm (F.map f t) = yoneda.map f.unop ≫ yonedaEquiv.symm t
lemma yonedaEquiv_symm_map {X Y : Cᵒᵖ} (f : X ⟶ Y) {F : CᵒᵖCᵒᵖ ⥤ Type v₁} (t : F.obj X) :
yonedaEquiv.symm (F.map f t) = yonedayoneda.map f.unop ≫ yonedaEquiv.symm t := by
obtain ⟨u, rfl⟩ := yonedaEquiv.surjective t
rw [yonedaEquiv_naturality', Equiv.symm_apply_apply, Equiv.symm_apply_apply]
CategoryTheory.hom_ext_yoneda
theorem
{P Q : Cᵒᵖ ⥤ Type v₁} {f g : P ⟶ Q} (h : ∀ (X : C) (p : yoneda.obj X ⟶ P), p ≫ f = p ≫ g) : f = g
/-- Two morphisms of presheaves of types `P ⟶ Q` coincide if the precompositions
with morphisms `yoneda.obj X ⟶ P` agree. -/
lemma hom_ext_yoneda {P Q : CᵒᵖCᵒᵖ ⥤ Type v₁} {f g : P ⟶ Q}
(h : ∀ (X : C) (p : yonedayoneda.obj X ⟶ P), p ≫ f = p ≫ g) :
f = g := by
ext X x
simpa only [yonedaEquiv_comp, Equiv.apply_symm_apply]
using congr_arg (yonedaEquiv) (h _ (yonedaEquiv.symm x))
CategoryTheory.yonedaEvaluation
definition
: Cᵒᵖ × (Cᵒᵖ ⥤ Type v₁) ⥤ Type max u₁ v₁
/-- The "Yoneda evaluation" functor, which sends `X : Cᵒᵖ` and `F : Cᵒᵖ ⥤ Type`
to `F.obj X`, functorially in both `X` and `F`.
-/
def yonedaEvaluation : CᵒᵖCᵒᵖ × (Cᵒᵖ ⥤ Type v₁)Cᵒᵖ × (Cᵒᵖ ⥤ Type v₁) ⥤ Type max u₁ v₁ :=
evaluationUncurriedevaluationUncurried Cᵒᵖ (Type v₁) ⋙ uliftFunctor
CategoryTheory.yonedaEvaluation_map_down
theorem
(P Q : Cᵒᵖ × (Cᵒᵖ ⥤ Type v₁)) (α : P ⟶ Q) (x : (yonedaEvaluation C).obj P) :
((yonedaEvaluation C).map α x).down = α.2.app Q.1 (P.2.map α.1 x.down)
@[simp]
theorem yonedaEvaluation_map_down (P Q : CᵒᵖCᵒᵖ × (Cᵒᵖ ⥤ Type v₁)) (α : P ⟶ Q)
(x : (yonedaEvaluation C).obj P) :
((yonedaEvaluation C).map α x).down = α.2.app Q.1 (P.2.map α.1 x.down) :=
rfl
CategoryTheory.yonedaPairing
definition
: Cᵒᵖ × (Cᵒᵖ ⥤ Type v₁) ⥤ Type max u₁ v₁
/-- The "Yoneda pairing" functor, which sends `X : Cᵒᵖ` and `F : Cᵒᵖ ⥤ Type`
to `yoneda.op.obj X ⟶ F`, functorially in both `X` and `F`.
-/
def yonedaPairing : CᵒᵖCᵒᵖ × (Cᵒᵖ ⥤ Type v₁)Cᵒᵖ × (Cᵒᵖ ⥤ Type v₁) ⥤ Type max u₁ v₁ :=
Functor.prodFunctor.prod yoneda.op (𝟭 (Cᵒᵖ ⥤ Type v₁)) ⋙ Functor.hom (Cᵒᵖ ⥤ Type v₁)
CategoryTheory.yonedaPairingExt
theorem
{X : Cᵒᵖ × (Cᵒᵖ ⥤ Type v₁)} {x y : (yonedaPairing C).obj X} (w : ∀ Y, x.app Y = y.app Y) : x = y
@[ext]
lemma yonedaPairingExt {X : CᵒᵖCᵒᵖ × (Cᵒᵖ ⥤ Type v₁)} {x y : (yonedaPairing C).obj X}
(w : ∀ Y, x.app Y = y.app Y) : x = y :=
NatTrans.ext (funext w)
CategoryTheory.yonedaPairing_map
theorem
(P Q : Cᵒᵖ × (Cᵒᵖ ⥤ Type v₁)) (α : P ⟶ Q) (β : (yonedaPairing C).obj P) :
(yonedaPairing C).map α β = yoneda.map α.1.unop ≫ β ≫ α.2
@[simp]
theorem yonedaPairing_map (P Q : CᵒᵖCᵒᵖ × (Cᵒᵖ ⥤ Type v₁)) (α : P ⟶ Q) (β : (yonedaPairing C).obj P) :
(yonedaPairing C).map α β = yonedayoneda.map α.1.unop ≫ β ≫ α.2 :=
rfl
CategoryTheory.yonedaCompUliftFunctorEquiv
definition
(F : Cᵒᵖ ⥤ Type max v₁ w) (X : C) : (yoneda.obj X ⋙ uliftFunctor ⟶ F) ≃ F.obj (op X)
/-- A bijection `(yoneda.obj X ⋙ uliftFunctor ⟶ F) ≃ F.obj (op X)` which is a variant
of `yonedaEquiv` with heterogeneous universes. -/
def yonedaCompUliftFunctorEquiv (F : CᵒᵖCᵒᵖ ⥤ Type max v₁ w) (X : C) :
(yoneda.obj X ⋙ uliftFunctor ⟶ F) ≃ F.obj (op X) where
toFun φ := φ.app (op X) (ULift.up (𝟙 _))
invFun f :=
{ app := fun _ x => F.map (ULift.down x).op f }
left_inv φ := by
ext Y f
dsimp
rw [← FunctorToTypes.naturality]
dsimp
rw [Category.comp_id]
rfl
right_inv f := by simp
CategoryTheory.yonedaLemma
definition
: yonedaPairing C ≅ yonedaEvaluation C
/-- The Yoneda lemma asserts that the Yoneda pairing
`(X : Cᵒᵖ, F : Cᵒᵖ ⥤ Type) ↦ (yoneda.obj (unop X) ⟶ F)`
is naturally isomorphic to the evaluation `(X, F) ↦ F.obj X`. -/
@[stacks 001P]
def yonedaLemma : yonedaPairingyonedaPairing C ≅ yonedaEvaluation C :=
NatIso.ofComponents
(fun _ ↦ Equiv.toIso (yonedaEquiv.trans Equiv.ulift.symm))
(by intro (X, F) (Y, G) f
ext (a : yonedayoneda.obj X.unop ⟶ F)
apply ULift.ext
dsimp [yonedaEvaluation, yonedaEquiv]
simp [← FunctorToTypes.naturality])
CategoryTheory.curriedYonedaLemma
definition
{C : Type u₁} [SmallCategory C] : (yoneda.op ⋙ coyoneda : Cᵒᵖ ⥤ (Cᵒᵖ ⥤ Type u₁) ⥤ Type u₁) ≅ evaluation Cᵒᵖ (Type u₁)
/-- The curried version of yoneda lemma when `C` is small. -/
def curriedYonedaLemma {C : Type u₁} [SmallCategory C] :
(yoneda.op ⋙ coyoneda : Cᵒᵖ ⥤ (Cᵒᵖ ⥤ Type u₁) ⥤ Type u₁) ≅ evaluation Cᵒᵖ (Type u₁) :=
NatIso.ofComponents (fun X ↦ NatIso.ofComponents (fun _ ↦ Equiv.toIso yonedaEquiv)) (by
intro X Y f
ext a b
dsimp [yonedaEquiv]
simp [← FunctorToTypes.naturality])
CategoryTheory.largeCurriedYonedaLemma
definition
{C : Type u₁} [Category.{v₁} C] :
yoneda.op ⋙ coyoneda ≅ evaluation Cᵒᵖ (Type v₁) ⋙ (whiskeringRight _ _ _).obj uliftFunctor.{u₁}
/-- The curried version of the Yoneda lemma. -/
def largeCurriedYonedaLemma {C : Type u₁} [Category.{v₁} C] :
yonedayoneda.op ⋙ coyonedayoneda.op ⋙ coyoneda ≅
evaluation Cᵒᵖ (Type v₁) ⋙ (whiskeringRight _ _ _).obj uliftFunctor.{u₁} :=
NatIso.ofComponents
(fun X => NatIso.ofComponents
(fun _ => Equiv.toIso <| yonedaEquiv.trans Equiv.ulift.symm)
(by
intros Y Z f
ext g
rw [← ULift.down_inj]
simpa using yonedaEquiv_comp _ _))
(by
intros Y Z f
ext F g
rw [← ULift.down_inj]
simpa using (yonedaEquiv_naturality _ _).symm)
CategoryTheory.yonedaOpCompYonedaObj
definition
{C : Type u₁} [Category.{v₁} C] (P : Cᵒᵖ ⥤ Type v₁) : yoneda.op ⋙ yoneda.obj P ≅ P ⋙ uliftFunctor.{u₁}
/-- Version of the Yoneda lemma where the presheaf is fixed but the argument varies. -/
def yonedaOpCompYonedaObj {C : Type u₁} [Category.{v₁} C] (P : CᵒᵖCᵒᵖ ⥤ Type v₁) :
yonedayoneda.op ⋙ yoneda.obj Pyoneda.op ⋙ yoneda.obj P ≅ P ⋙ uliftFunctor.{u₁} :=
isoWhiskerRight largeCurriedYonedaLemma ((evaluation _ _).obj P)
CategoryTheory.curriedYonedaLemma'
definition
{C : Type u₁} [SmallCategory C] :
yoneda ⋙ (whiskeringLeft Cᵒᵖ (Cᵒᵖ ⥤ Type u₁)ᵒᵖ (Type u₁)).obj yoneda.op ≅ 𝟭 (Cᵒᵖ ⥤ Type u₁)
/-- The curried version of yoneda lemma when `C` is small. -/
def curriedYonedaLemma' {C : Type u₁} [SmallCategory C] :
yonedayoneda ⋙ (whiskeringLeft Cᵒᵖ (Cᵒᵖ ⥤ Type u₁)ᵒᵖ (Type u₁)).obj yoneda.opyoneda ⋙ (whiskeringLeft Cᵒᵖ (Cᵒᵖ ⥤ Type u₁)ᵒᵖ (Type u₁)).obj yoneda.op
≅ 𝟭 (Cᵒᵖ ⥤ Type u₁) :=
NatIso.ofComponents (fun F ↦ NatIso.ofComponents (fun _ ↦ Equiv.toIso yonedaEquiv) (by
intro X Y f
ext a
dsimp [yonedaEquiv]
simp [← FunctorToTypes.naturality]))
CategoryTheory.isIso_of_yoneda_map_bijective
theorem
{X Y : C} (f : X ⟶ Y) (hf : ∀ (T : C), Function.Bijective (fun (x : T ⟶ X) => x ≫ f)) : IsIso f
lemma isIso_of_yoneda_map_bijective {X Y : C} (f : X ⟶ Y)
(hf : ∀ (T : C), Function.Bijective (fun (x : T ⟶ X) => x ≫ f)) :
IsIso f := by
obtain ⟨g, hg : g ≫ f = 𝟙 Y⟩ := (hf Y).2 (𝟙 Y)
exact ⟨g, (hf _).1 (by aesop_cat), hg⟩
CategoryTheory.isIso_iff_yoneda_map_bijective
theorem
{X Y : C} (f : X ⟶ Y) : IsIso f ↔ (∀ (T : C), Function.Bijective (fun (x : T ⟶ X) => x ≫ f))
lemma isIso_iff_yoneda_map_bijective {X Y : C} (f : X ⟶ Y) :
IsIsoIsIso f ↔ (∀ (T : C), Function.Bijective (fun (x : T ⟶ X) => x ≫ f)) := by
refine ⟨fun _ ↦ ?_, fun hf ↦ isIso_of_yoneda_map_bijective f hf⟩
have : IsIso (yoneda.map f) := inferInstance
intro T
rw [← isIso_iff_bijective]
exact inferInstanceAs (IsIso ((yoneda.map f).app _))
CategoryTheory.isIso_iff_isIso_yoneda_map
theorem
{X Y : C} (f : X ⟶ Y) : IsIso f ↔ ∀ c : C, IsIso ((yoneda.map f).app ⟨c⟩)
lemma isIso_iff_isIso_yoneda_map {X Y : C} (f : X ⟶ Y) :
IsIsoIsIso f ↔ ∀ c : C, IsIso ((yoneda.map f).app ⟨c⟩) := by
rw [isIso_iff_yoneda_map_bijective]
exact forall_congr' fun _ ↦ (isIso_iff_bijective _).symm
CategoryTheory.coyonedaEquiv
definition
{X : C} {F : C ⥤ Type v₁} : (coyoneda.obj (op X) ⟶ F) ≃ F.obj X
/-- We have a type-level equivalence between natural transformations from the coyoneda embedding
and elements of `F.obj X.unop`, without any universe switching.
-/
def coyonedaEquiv {X : C} {F : C ⥤ Type v₁} : (coyoneda.obj (op X) ⟶ F) ≃ F.obj X where
toFun η := η.app X (𝟙 X)
invFun ξ := { app := fun _ x ↦ F.map x ξ }
left_inv := fun η ↦ by
ext Y (x : X ⟶ Y)
dsimp
rw [← FunctorToTypes.naturality]
simp
right_inv := by intro ξ; simp
CategoryTheory.coyonedaEquiv_apply
theorem
{X : C} {F : C ⥤ Type v₁} (f : coyoneda.obj (op X) ⟶ F) : coyonedaEquiv f = f.app X (𝟙 X)
theorem coyonedaEquiv_apply {X : C} {F : C ⥤ Type v₁} (f : coyonedacoyoneda.obj (op X) ⟶ F) :
coyonedaEquiv f = f.app X (𝟙 X) :=
rfl
CategoryTheory.coyonedaEquiv_symm_app_apply
theorem
{X : C} {F : C ⥤ Type v₁} (x : F.obj X) (Y : C) (f : X ⟶ Y) : (coyonedaEquiv.symm x).app Y f = F.map f x
@[simp]
theorem coyonedaEquiv_symm_app_apply {X : C} {F : C ⥤ Type v₁} (x : F.obj X) (Y : C)
(f : X ⟶ Y) : (coyonedaEquiv.symm x).app Y f = F.map f x :=
rfl
CategoryTheory.coyonedaEquiv_naturality
theorem
{X Y : C} {F : C ⥤ Type v₁} (f : coyoneda.obj (op X) ⟶ F) (g : X ⟶ Y) :
F.map g (coyonedaEquiv f) = coyonedaEquiv (coyoneda.map g.op ≫ f)
lemma coyonedaEquiv_naturality {X Y : C} {F : C ⥤ Type v₁} (f : coyonedacoyoneda.obj (op X) ⟶ F)
(g : X ⟶ Y) : F.map g (coyonedaEquiv f) = coyonedaEquiv (coyonedacoyoneda.map g.op ≫ f) := by
change (f.app X ≫ F.map g) (𝟙 X) = f.app Y (g ≫ 𝟙 Y)
rw [← f.naturality]
dsimp
simp
CategoryTheory.coyonedaEquiv_comp
theorem
{X : C} {F G : C ⥤ Type v₁} (α : coyoneda.obj (op X) ⟶ F) (β : F ⟶ G) :
coyonedaEquiv (α ≫ β) = β.app _ (coyonedaEquiv α)
lemma coyonedaEquiv_comp {X : C} {F G : C ⥤ Type v₁} (α : coyonedacoyoneda.obj (op X) ⟶ F) (β : F ⟶ G) :
coyonedaEquiv (α ≫ β) = β.app _ (coyonedaEquiv α) := by
rfl
CategoryTheory.coyonedaEquiv_coyoneda_map
theorem
{X Y : C} (f : X ⟶ Y) : coyonedaEquiv (coyoneda.map f.op) = f
lemma coyonedaEquiv_coyoneda_map {X Y : C} (f : X ⟶ Y) :
coyonedaEquiv (coyoneda.map f.op) = f := by
rw [coyonedaEquiv_apply]
simp
CategoryTheory.map_coyonedaEquiv
theorem
{X Y : C} {F : C ⥤ Type v₁} (f : coyoneda.obj (op X) ⟶ F) (g : X ⟶ Y) : F.map g (coyonedaEquiv f) = f.app Y g
lemma map_coyonedaEquiv {X Y : C} {F : C ⥤ Type v₁} (f : coyonedacoyoneda.obj (op X) ⟶ F)
(g : X ⟶ Y) : F.map g (coyonedaEquiv f) = f.app Y g := by
rw [coyonedaEquiv_naturality, coyonedaEquiv_comp, coyonedaEquiv_coyoneda_map]
CategoryTheory.coyonedaEquiv_symm_map
theorem
{X Y : C} (f : X ⟶ Y) {F : C ⥤ Type v₁} (t : F.obj X) :
coyonedaEquiv.symm (F.map f t) = coyoneda.map f.op ≫ coyonedaEquiv.symm t
lemma coyonedaEquiv_symm_map {X Y : C} (f : X ⟶ Y) {F : C ⥤ Type v₁} (t : F.obj X) :
coyonedaEquiv.symm (F.map f t) = coyonedacoyoneda.map f.op ≫ coyonedaEquiv.symm t := by
obtain ⟨u, rfl⟩ := coyonedaEquiv.surjective t
simp [coyonedaEquiv_naturality u f]
CategoryTheory.coyonedaEvaluation
definition
: C × (C ⥤ Type v₁) ⥤ Type max u₁ v₁
/-- The "Coyoneda evaluation" functor, which sends `X : C` and `F : C ⥤ Type`
to `F.obj X`, functorially in both `X` and `F`.
-/
def coyonedaEvaluation : C × (C ⥤ Type v₁)C × (C ⥤ Type v₁) ⥤ Type max u₁ v₁ :=
evaluationUncurriedevaluationUncurried C (Type v₁) ⋙ uliftFunctor
CategoryTheory.coyonedaEvaluation_map_down
theorem
(P Q : C × (C ⥤ Type v₁)) (α : P ⟶ Q) (x : (coyonedaEvaluation C).obj P) :
((coyonedaEvaluation C).map α x).down = α.2.app Q.1 (P.2.map α.1 x.down)
@[simp]
theorem coyonedaEvaluation_map_down (P Q : C × (C ⥤ Type v₁)) (α : P ⟶ Q)
(x : (coyonedaEvaluation C).obj P) :
((coyonedaEvaluation C).map α x).down = α.2.app Q.1 (P.2.map α.1 x.down) :=
rfl
CategoryTheory.coyonedaPairing
definition
: C × (C ⥤ Type v₁) ⥤ Type max u₁ v₁
/-- The "Coyoneda pairing" functor, which sends `X : C` and `F : C ⥤ Type`
to `coyoneda.rightOp.obj X ⟶ F`, functorially in both `X` and `F`.
-/
def coyonedaPairing : C × (C ⥤ Type v₁)C × (C ⥤ Type v₁) ⥤ Type max u₁ v₁ :=
Functor.prodFunctor.prod coyoneda.rightOp (𝟭 (C ⥤ Type v₁)) ⋙ Functor.hom (C ⥤ Type v₁)
CategoryTheory.coyonedaPairingExt
theorem
{X : C × (C ⥤ Type v₁)} {x y : (coyonedaPairing C).obj X} (w : ∀ Y, x.app Y = y.app Y) : x = y
@[ext]
lemma coyonedaPairingExt {X : C × (C ⥤ Type v₁)} {x y : (coyonedaPairing C).obj X}
(w : ∀ Y, x.app Y = y.app Y) : x = y :=
NatTrans.ext (funext w)
CategoryTheory.coyonedaPairing_map
theorem
(P Q : C × (C ⥤ Type v₁)) (α : P ⟶ Q) (β : (coyonedaPairing C).obj P) :
(coyonedaPairing C).map α β = coyoneda.map α.1.op ≫ β ≫ α.2
@[simp]
theorem coyonedaPairing_map (P Q : C × (C ⥤ Type v₁)) (α : P ⟶ Q) (β : (coyonedaPairing C).obj P) :
(coyonedaPairing C).map α β = coyonedacoyoneda.map α.1.op ≫ β ≫ α.2 :=
rfl
CategoryTheory.coyonedaCompUliftFunctorEquiv
definition
(F : C ⥤ Type max v₁ w) (X : Cᵒᵖ) : (coyoneda.obj X ⋙ uliftFunctor ⟶ F) ≃ F.obj X.unop
/-- A bijection `(coyoneda.obj X ⋙ uliftFunctor ⟶ F) ≃ F.obj (unop X)` which is a variant
of `coyonedaEquiv` with heterogeneous universes. -/
def coyonedaCompUliftFunctorEquiv (F : C ⥤ Type max v₁ w) (X : Cᵒᵖ) :
(coyoneda.obj X ⋙ uliftFunctor ⟶ F) ≃ F.obj X.unop where
toFun φ := φ.app X.unop (ULift.up (𝟙 _))
invFun f :=
{ app := fun _ x => F.map (ULift.down x) f }
left_inv φ := by
ext Y f
dsimp
rw [← FunctorToTypes.naturality]
dsimp
rw [Category.id_comp]
rfl
right_inv f := by simp
CategoryTheory.coyonedaLemma
definition
: coyonedaPairing C ≅ coyonedaEvaluation C
/-- The Coyoneda lemma asserts that the Coyoneda pairing
`(X : C, F : C ⥤ Type) ↦ (coyoneda.obj X ⟶ F)`
is naturally isomorphic to the evaluation `(X, F) ↦ F.obj X`. -/
@[stacks 001P]
def coyonedaLemma : coyonedaPairingcoyonedaPairing C ≅ coyonedaEvaluation C :=
NatIso.ofComponents
(fun _ ↦ Equiv.toIso (coyonedaEquiv.trans Equiv.ulift.symm))
(by intro (X, F) (Y, G) f
ext (a : coyonedacoyoneda.obj (op X) ⟶ F)
apply ULift.ext
dsimp [coyonedaEquiv, coyonedaEvaluation]
simp [← FunctorToTypes.naturality])
CategoryTheory.curriedCoyonedaLemma
definition
{C : Type u₁} [SmallCategory C] : coyoneda.rightOp ⋙ coyoneda ≅ evaluation C (Type u₁)
/-- The curried version of coyoneda lemma when `C` is small. -/
def curriedCoyonedaLemma {C : Type u₁} [SmallCategory C] :
coyonedacoyoneda.rightOp ⋙ coyonedacoyoneda.rightOp ⋙ coyoneda ≅ evaluation C (Type u₁) :=
NatIso.ofComponents (fun X ↦ NatIso.ofComponents (fun _ ↦ Equiv.toIso coyonedaEquiv)) (by
intro X Y f
ext a b
simp [coyonedaEquiv, ← FunctorToTypes.naturality])
CategoryTheory.largeCurriedCoyonedaLemma
definition
{C : Type u₁} [Category.{v₁} C] :
(coyoneda.rightOp ⋙ coyoneda) ≅ evaluation C (Type v₁) ⋙ (whiskeringRight _ _ _).obj uliftFunctor.{u₁}
/-- The curried version of the Coyoneda lemma. -/
def largeCurriedCoyonedaLemma {C : Type u₁} [Category.{v₁} C] :
(coyoneda.rightOp ⋙ coyoneda) ≅
evaluation C (Type v₁) ⋙ (whiskeringRight _ _ _).obj uliftFunctor.{u₁} :=
NatIso.ofComponents
(fun X => NatIso.ofComponents
(fun _ => Equiv.toIso <| coyonedaEquiv.trans Equiv.ulift.symm)
(by
intros Y Z f
ext g
rw [← ULift.down_inj]
simpa using coyonedaEquiv_comp _ _))
(by
intro Y Z f
ext F g
rw [← ULift.down_inj]
simpa using (coyonedaEquiv_naturality _ _).symm)
CategoryTheory.coyonedaCompYonedaObj
definition
{C : Type u₁} [Category.{v₁} C] (P : C ⥤ Type v₁) : coyoneda.rightOp ⋙ yoneda.obj P ≅ P ⋙ uliftFunctor.{u₁}
/-- Version of the Coyoneda lemma where the presheaf is fixed but the argument varies. -/
def coyonedaCompYonedaObj {C : Type u₁} [Category.{v₁} C] (P : C ⥤ Type v₁) :
coyonedacoyoneda.rightOp ⋙ yoneda.obj Pcoyoneda.rightOp ⋙ yoneda.obj P ≅ P ⋙ uliftFunctor.{u₁} :=
isoWhiskerRight largeCurriedCoyonedaLemma ((evaluation _ _).obj P)
CategoryTheory.curriedCoyonedaLemma'
definition
{C : Type u₁} [SmallCategory C] :
yoneda ⋙ (whiskeringLeft C (C ⥤ Type u₁)ᵒᵖ (Type u₁)).obj coyoneda.rightOp ≅ 𝟭 (C ⥤ Type u₁)
/-- The curried version of coyoneda lemma when `C` is small. -/
def curriedCoyonedaLemma' {C : Type u₁} [SmallCategory C] :
yonedayoneda ⋙ (whiskeringLeft C (C ⥤ Type u₁)ᵒᵖ (Type u₁)).obj coyoneda.rightOpyoneda ⋙ (whiskeringLeft C (C ⥤ Type u₁)ᵒᵖ (Type u₁)).obj coyoneda.rightOp
≅ 𝟭 (C ⥤ Type u₁) :=
NatIso.ofComponents (fun F ↦ NatIso.ofComponents (fun _ ↦ Equiv.toIso coyonedaEquiv) (by
intro X Y f
ext a
simp [coyonedaEquiv, ← FunctorToTypes.naturality]))
CategoryTheory.isIso_of_coyoneda_map_bijective
theorem
{X Y : C} (f : X ⟶ Y) (hf : ∀ (T : C), Function.Bijective (fun (x : Y ⟶ T) => f ≫ x)) : IsIso f
lemma isIso_of_coyoneda_map_bijective {X Y : C} (f : X ⟶ Y)
(hf : ∀ (T : C), Function.Bijective (fun (x : Y ⟶ T) => f ≫ x)) :
IsIso f := by
obtain ⟨g, hg : f ≫ g = 𝟙 X⟩ := (hf X).2 (𝟙 X)
refine ⟨g, hg, (hf _).1 ?_⟩
simp only [Category.comp_id, ← Category.assoc, hg, Category.id_comp]
CategoryTheory.isIso_iff_coyoneda_map_bijective
theorem
{X Y : C} (f : X ⟶ Y) : IsIso f ↔ (∀ (T : C), Function.Bijective (fun (x : Y ⟶ T) => f ≫ x))
lemma isIso_iff_coyoneda_map_bijective {X Y : C} (f : X ⟶ Y) :
IsIsoIsIso f ↔ (∀ (T : C), Function.Bijective (fun (x : Y ⟶ T) => f ≫ x)) := by
refine ⟨fun _ ↦ ?_, fun hf ↦ isIso_of_coyoneda_map_bijective f hf⟩
have : IsIso (coyoneda.map f.op) := inferInstance
intro T
rw [← isIso_iff_bijective]
exact inferInstanceAs (IsIso ((coyoneda.map f.op).app _))
CategoryTheory.isIso_iff_isIso_coyoneda_map
theorem
{X Y : C} (f : X ⟶ Y) : IsIso f ↔ ∀ c : C, IsIso ((coyoneda.map f.op).app c)
lemma isIso_iff_isIso_coyoneda_map {X Y : C} (f : X ⟶ Y) :
IsIsoIsIso f ↔ ∀ c : C, IsIso ((coyoneda.map f.op).app c) := by
rw [isIso_iff_coyoneda_map_bijective]
exact forall_congr' fun _ ↦ (isIso_iff_bijective _).symm
CategoryTheory.yonedaMap
definition
(X : C) : yoneda.obj X ⟶ F.op ⋙ yoneda.obj (F.obj X)
/-- The natural transformation `yoneda.obj X ⟶ F.op ⋙ yoneda.obj (F.obj X)`
when `F : C ⥤ D` and `X : C`. -/
def yonedaMap (X : C) : yonedayoneda.obj X ⟶ F.op ⋙ yoneda.obj (F.obj X) where
app _ f := F.map f
CategoryTheory.yonedaMap_app_apply
theorem
{Y : C} {X : Cᵒᵖ} (f : X.unop ⟶ Y) : (yonedaMap F Y).app X f = F.map f
@[simp]
lemma yonedaMap_app_apply {Y : C} {X : Cᵒᵖ} (f : X.unop ⟶ Y) :
(yonedaMap F Y).app X f = F.map f := rfl
CategoryTheory.Functor.sectionsEquivHom
definition
(F : C ⥤ Type u₂) (X : Type u₂) [Unique X] : F.sections ≃ ((const _).obj X ⟶ F)
/-- A type-level equivalence between sections of a functor and morphisms from a terminal functor
to it. We use the constant functor on a given singleton type here as a specific choice of terminal
functor. -/
@[simps apply_app]
def Functor.sectionsEquivHom (F : C ⥤ Type u₂) (X : Type u₂) [Unique X] :
F.sections ≃ ((const _).obj X ⟶ F) where
toFun s :=
{ app j x := s.1 j
naturality _ _ _ := by ext x; simp }
invFun τ := ⟨fun j ↦ τ.app _ (default : X), fun φ ↦ (congr_fun (τ.naturality φ) _).symm⟩
left_inv s := rfl
right_inv τ := by
ext _ (x : X)
rw [Unique.eq_default x]
CategoryTheory.Functor.sectionsEquivHom_naturality
theorem
{F G : C ⥤ Type u₂} (f : F ⟶ G) (X : Type u₂) [Unique X] (x : F.sections) :
(G.sectionsEquivHom X) ((sectionsFunctor C).map f x) = (F.sectionsEquivHom X) x ≫ f
lemma Functor.sectionsEquivHom_naturality {F G : C ⥤ Type u₂} (f : F ⟶ G) (X : Type u₂) [Unique X]
(x : F.sections) :
(G.sectionsEquivHom X) ((sectionsFunctor C).map f x) = (F.sectionsEquivHom X) x ≫ f := by
rfl
CategoryTheory.Functor.sectionsEquivHom_naturality_symm
theorem
{F G : C ⥤ Type u₂} (f : F ⟶ G) (X : Type u₂) [Unique X] (τ : (const C).obj X ⟶ F) :
(G.sectionsEquivHom X).symm (τ ≫ f) = (sectionsFunctor C).map f ((F.sectionsEquivHom X).symm τ)
lemma Functor.sectionsEquivHom_naturality_symm {F G : C ⥤ Type u₂} (f : F ⟶ G) (X : Type u₂)
[Unique X] (τ : (const C).obj X ⟶ F) :
(G.sectionsEquivHom X).symm (τ ≫ f) =
(sectionsFunctor C).map f ((F.sectionsEquivHom X).symm τ) := by
rfl
CategoryTheory.sectionsFunctorNatIsoCoyoneda
definition
(X : Type max u₁ u₂) [Unique X] :
Functor.sectionsFunctor.{v₁, max u₁ u₂} C ≅ coyoneda.obj (op ((Functor.const C).obj X))
/-- A natural isomorphism between the sections functor `(C ⥤ Type _) ⥤ Type _` and the co-Yoneda
embedding of a terminal functor, specifically a constant functor on a given singleton type `X`. -/
@[simps!]
noncomputable def sectionsFunctorNatIsoCoyoneda (X : Type max u₁ u₂) [Unique X] :
Functor.sectionsFunctorFunctor.sectionsFunctor.{v₁, max u₁ u₂} C ≅ coyoneda.obj (op ((Functor.const C).obj X)) :=
NatIso.ofComponents fun F ↦ (F.sectionsEquivHom X).toIso
CategoryTheory.Functor.FullyFaithful.homNatIso
definition
{D : Type u₂} [Category.{v₂} D] {F : C ⥤ D} (hF : F.FullyFaithful) (X : C) :
F.op ⋙ yoneda.obj (F.obj X) ⋙ uliftFunctor.{v₁} ≅ yoneda.obj X ⋙ uliftFunctor.{v₂}
/-- `FullyFaithful.homEquiv` as a natural isomorphism. -/
@[simps!]
def homNatIso {D : Type u₂} [Category.{v₂} D] {F : C ⥤ D} (hF : F.FullyFaithful) (X : C) :
F.op ⋙ yoneda.obj (F.obj X) ⋙ uliftFunctor.{v₁}F.op ⋙ yoneda.obj (F.obj X) ⋙ uliftFunctor.{v₁} ≅ yoneda.obj X ⋙ uliftFunctor.{v₂} :=
NatIso.ofComponents
(fun Y => Equiv.toIso (Equiv.ulift.trans <| hF.homEquiv.symm.trans Equiv.ulift.symm))
(fun f => by ext; exact Equiv.ulift.injective (hF.map_injective (by simp)))
CategoryTheory.Functor.FullyFaithful.homNatIsoMaxRight
definition
{D : Type u₂} [Category.{max v₁ v₂} D] {F : C ⥤ D} (hF : F.FullyFaithful) (X : C) :
F.op ⋙ yoneda.obj (F.obj X) ≅ yoneda.obj X ⋙ uliftFunctor.{v₂}
/-- `FullyFaithful.homEquiv` as a natural isomorphism. -/
@[simps!]
def homNatIsoMaxRight {D : Type u₂} [Category.{max v₁ v₂} D] {F : C ⥤ D} (hF : F.FullyFaithful)
(X : C) : F.op ⋙ yoneda.obj (F.obj X)F.op ⋙ yoneda.obj (F.obj X) ≅ yoneda.obj X ⋙ uliftFunctor.{v₂} :=
NatIso.ofComponents
(fun Y => Equiv.toIso (hF.homEquiv.symm.trans Equiv.ulift.symm))
(fun f => by ext; exact Equiv.ulift.injective (hF.map_injective (by simp)))
CategoryTheory.Functor.FullyFaithful.compYonedaCompWhiskeringLeft
definition
{D : Type u₂} [Category.{v₂} D] {F : C ⥤ D} (hF : F.FullyFaithful) :
F ⋙ yoneda ⋙ (whiskeringLeft _ _ _).obj F.op ⋙ (CategoryTheory.whiskeringRight _ _ _).obj uliftFunctor.{v₁} ≅
yoneda ⋙ (CategoryTheory.whiskeringRight _ _ _).obj uliftFunctor.{v₂}
/-- `FullyFaithful.homEquiv` as a natural isomorphism. -/
@[simps!]
def compYonedaCompWhiskeringLeft {D : Type u₂} [Category.{v₂} D] {F : C ⥤ D}
(hF : F.FullyFaithful) : F ⋙ yoneda ⋙ (whiskeringLeft _ _ _).obj F.op ⋙
(CategoryTheory.whiskeringRight _ _ _).obj uliftFunctor.{v₁}F ⋙ yoneda ⋙ (whiskeringLeft _ _ _).obj F.op ⋙
(CategoryTheory.whiskeringRight _ _ _).obj uliftFunctor.{v₁} ≅
yoneda ⋙ (CategoryTheory.whiskeringRight _ _ _).obj uliftFunctor.{v₂} :=
NatIso.ofComponents (fun X => hF.homNatIso _)
(fun f => by ext; exact Equiv.ulift.injective (hF.map_injective (by simp)))
CategoryTheory.Functor.FullyFaithful.compYonedaCompWhiskeringLeftMaxRight
definition
{D : Type u₂} [Category.{max v₁ v₂} D] {F : C ⥤ D} (hF : F.FullyFaithful) :
F ⋙ yoneda ⋙ (whiskeringLeft _ _ _).obj F.op ≅ yoneda ⋙ (CategoryTheory.whiskeringRight _ _ _).obj uliftFunctor.{v₂}
/-- `FullyFaithful.homEquiv` as a natural isomorphism. -/
@[simps!]
def compYonedaCompWhiskeringLeftMaxRight {D : Type u₂} [Category.{max v₁ v₂} D] {F : C ⥤ D}
(hF : F.FullyFaithful) : F ⋙ yoneda ⋙ (whiskeringLeft _ _ _).obj F.opF ⋙ yoneda ⋙ (whiskeringLeft _ _ _).obj F.op ≅
yoneda ⋙ (CategoryTheory.whiskeringRight _ _ _).obj uliftFunctor.{v₂} :=
NatIso.ofComponents (fun X => hF.homNatIsoMaxRight _)
(fun f => by ext; exact Equiv.ulift.injective (hF.map_injective (by simp)))