Built with Alectryon, running Coq+SerAPI v8.19.0+0.19.3. Bubbles () indicate interactive fragments: hover for details, tap to reveal contents. Use Ctrl+↑Ctrl+↓ to navigate, Ctrl+🖱️ to focus. On Mac, use ⌘ instead of Ctrl.
(** * The Yoneda Lemma *)
[Loading ML file number_string_notation_plugin.cmxs (using legacy method) ... done]
Require Import Category.Dual Functor.Dual.Require Import Functor.Composition.Core.Require Import Category.Morphisms FunctorCategory.Morphisms.Require Import SetCategory.Require Import Functor.Attributes.Require Import Functor.Composition.Functorial.Require Import Functor.Identity.Require Import HomFunctor.Require Import FunctorCategory.Core.Require Import NaturalTransformation.Paths.Require Import HoTT.Tactics.Set Universe Polymorphism.Set Implicit Arguments.Generalizable All Variables.Set Asymmetric Patterns.LocalOpen Scope morphism_scope.LocalOpen Scope category_scope.LocalOpen Scope functor_scope.(** Quoting Wikipedia on the Yoneda lemma (changing [A] to [a] and [C] to [A] so that we can use unicode superscripts and subscripts): In mathematics, specifically in category theory, the Yoneda lemma is an abstract result on functors of the type morphisms into a fixed object. It is a vast generalisation of Cayley's theorem from group theory (viewing a group as a particular kind of category with just one object). It allows the embedding of any category into a category of functors (contravariant set-valued functors) defined on that category. It also clarifies how the embedded category, of representable functors and their natural transformations, relates to the other objects in the larger functor category. It is an important tool that underlies several modern developments in algebraic geometry and representation theory. It is named after Nobuo Yoneda. ** Generalities The Yoneda lemma suggests that instead of studying the (locally small) category [A], one should study the category of all functors of [A] into [Set] (the category of sets with functions as morphisms). [Set] is a category we understand well, and a functor of [A] into [Set] can be seen as a "representation" of [A] in terms of known structures. The original category [A] is contained in this functor category, but new objects appear in the functor category which were absent and "hidden" in [A]. Treating these new objects just like the old ones often unifies and simplifies the theory. This approach is akin to (and in fact generalizes) the common method of studying a ring by investigating the modules over that ring. The ring takes the place of the category [A], and the category of modules over the ring is a category of functors defined on [A]. ** Formal statement *** General version Yoneda's lemma concerns functors from a fixed category [A] to the category of sets, [Set]. If [A] is a locally small category (i.e. the hom-sets are actual sets and not proper classes), then each object [a] of [A] gives rise to a natural functor to [Set] called a hom-functor. This functor is denoted: [hᵃ = Hom(a, ─)]. The (covariant) hom-functor [hᵃ] sends [x] to the set of morphisms [Hom(a, x)] and sends a morphism [f] from [x] to [y] to the morphism [f ∘ ─] (composition with [f] on the left) that sends a morphism [g] in [Hom(a, x)] to the morphism [f ∘ g] in [Hom(a, y)]. That is, [f ↦ Hom(a, f) = ⟦ Hom(a, x) ∋ g ↦ f ∘ g ∈ Hom(a,y) ⟧]. *)(** ** The (co-)Yoneda functors [A → (Aᵒᵖ → set)] *)Sectionyoneda.Context `{Funext}.(* TODO(JasonGross): Find a way to unify the [yoneda] and [coyoneda] lemmas into a single lemma which is more functorial. *)DefinitioncoyonedaA : Functor A^op (A -> set_cat)
:= ExponentialLaws.Law4.Functors.inverse _ _ _ (hom_functor A).DefinitionyonedaA : Functor A (A^op -> set_cat)
:= coyoneda A^op.Endyoneda.(** ** The (co-)Yoneda lemma *)Sectioncoyoneda_lemma.Sectionfunctor.Context `{Funext}.VariableA : PreCategory.(** Let [F] be an arbitrary functor from [A] to [Set]. Then Yoneda's lemma says that: *)(*Variable F : Functor A (@set_cat fs).*)(** For each object [a] of [A], *)(*Variable a : A.*)(** the natural transformations from [hᵃ] to [F] are in one-to-one correspondence with the elements of [F(a)]. That is, [Nat(hᵃ, F) ≅ F(a)]. Moreover this isomorphism is natural in [a] and [F] when both sides are regarded as functors from [Setᴬ × A] to [Set]. Given a natural transformation [Φ] from [hᵃ] to [F], the corresponding element of [F(a)] is [u = Φₐ(idₐ)]. *)(* Definition coyoneda_lemma_morphism (a : A) : morphism set_cat (BuildhSet (morphism (A -> set_cat) (coyoneda A a) F) _) (F a) := fun phi => phi a 1%morphism. *)Definitioncoyoneda_functor
: Functor (A -> set_cat)
(A -> set_cat)
:= (compose_functor _ _ set_cat (coyoneda A)^op)
o (yoneda (A -> set_cat)).Endfunctor.Sectionnt.Context `{Funext}.VariableA : PreCategory.
H: Funext A: PreCategory F: A -> set_cat
morphism (A -> set_cat)
((coyoneda_functor A) _0 F)%object F
H: Funext A: PreCategory F: A -> set_cat
morphism (A -> set_cat)
((coyoneda_functor A) _0 F)%object F
H: Funext A: PreCategory F: A -> set_cat
forall (sd : A) (m : morphism A s d),
((funphi : Trunc.trunctype_type
(((coyoneda_functor A) _0 F) _0 d)%object
=> phi d 1)
o ((coyoneda_functor A) _0 F)%object _1 m)%morphism =
(F _1 m
o (funphi : Trunc.trunctype_type
(((coyoneda_functor A) _0 F) _0 s)%object
=> phi s 1))%morphism
H: Funext A: PreCategory F: A -> set_cat
forall (sd : A) (m : morphism A s d),
(funx : NaturalTransformation
(Functors.inverse_object_of_object_of
(hom_functor A) s) F =>
x d (1 o 1 o m)%morphism) =
(funx : NaturalTransformation
(Functors.inverse_object_of_object_of
(hom_functor A) s) F =>
(F _1 m) (x s 1%morphism))
abstract (
repeat (intro || apply path_forall);
simplin *;
match goal with
| [ T : NaturalTransformation _ _ |- _ ]
=> simplrewrite <- (funsdm => apD10 (commutes T s d m))
end;
rewrite?left_identity, ?right_identity;
reflexivity
).Defined.
H: Funext A: PreCategory
morphism ((A -> set_cat) -> A -> set_cat)
(coyoneda_functor A) 1
H: Funext A: PreCategory
morphism ((A -> set_cat) -> A -> set_cat)
(coyoneda_functor A) 1
H: Funext A: PreCategory
NaturalTransformation (coyoneda_functor A) 1
H: Funext A: PreCategory
NaturalTransformation (coyoneda_functor A) 1
H: Funext A: PreCategory
forall (sd : (A -> set_cat)%category)
(m : morphism (A -> set_cat) s d),
(coyoneda_natural_transformation_helper d
o (coyoneda_functor A) _1 m)%morphism =
(1 _1 m o coyoneda_natural_transformation_helper s)%morphism
H: Funext A: PreCategory
forall (sd : Functor A set_cat)
(m : NaturalTransformation s d),
Core.compose
(coyoneda_natural_transformation_helper d)
(Core.whisker_r
(Functors.inverse_object_of_morphism_of
(hom_functor (A -> set_cat)^op) s d m)
(coyoneda A)^op) =
Core.compose m
(coyoneda_natural_transformation_helper s)
H: Funext A: PreCategory F: Functor A set_cat a: A Fa: Trunc.trunctype_type (F _0 a)%object
NaturalTransformation
(Functors.inverse_object_of_object_of
(hom_functor A) a) F
H: Funext A: PreCategory F: Functor A set_cat a: A Fa: Trunc.trunctype_type (F _0 a)%object
forall (sd : A) (m : morphism A s d),
((funf : morphism A a d => (F _1 f) Fa)
o (Functors.inverse_object_of_object_of
(hom_functor A) a) _1 m)%morphism =
(F _1 m o (funf : morphism A a s => (F _1 f) Fa))%morphism
H: Funext A: PreCategory F: Functor A set_cat a: A Fa: Trunc.trunctype_type (F _0 a)%object
forall (sd : A) (m : morphism A s d),
(funx : morphism A a s => (F _1 (m o x o 1)) Fa) =
(funx : morphism A a s => (F _1 m) ((F _1 x) Fa))
forallx : A,
IsIsomorphism
(coyoneda_natural_transformation_helper F x)
H: Funext A: PreCategory F: Functor A set_cat a: A
IsIsomorphism
(coyoneda_natural_transformation_helper F a)
H: Funext A: PreCategory F: Functor A set_cat a: A
IsIsomorphism
(funphi : NaturalTransformation
(Functors.inverse_object_of_object_of
(hom_functor A) a) F =>
phi a 1%morphism)
exists (coyoneda_lemma_morphism_inverseFa);
simplin *;
abstract (
repeat (intro || apply path_forall || path_natural_transformation);
simplin *;
solve [ simplrewrite <- (funcdm => ap10 (commutes x c d m));
rewrite?right_identity, ?left_identity;
reflexivity
| rewrite identity_of;
reflexivity ]
).Defined.Endcoyoneda_lemma.Sectionyoneda_lemma.(** There is a contravariant version of Yoneda's lemma which concerns contravariant functors from [A] to [Set]. This version involves the contravariant hom-functor [hₐ = Hom(─, A)], which sends [x] to the hom-set [Hom(x, a)]. Given an arbitrary contravariant functor [G] from [A] to [Set], Yoneda's lemma asserts that [Nat(hₐ, G) ≅ G(a)]. *)Sectionfunctor.Context `{Funext}.VariableA : PreCategory.(** Let [F] be an arbitrary functor from [A] to [Set]. Then Yoneda's lemma says that: *)(*Variable F : Functor A (@set_cat fs).*)(** For each object [a] of [A], *)(*Variable a : A.*)(** the natural transformations from [hᵃ] to [F] are in one-to-one correspondence with the elements of [F(a)]. That is, [Nat(hᵃ, F) ≅ F(a)]. Moreover this isomorphism is natural in [a] and [F] when both sides are regarded as functors from [Setᴬ × A] to [Set]. Given a natural transformation [Φ] from [hᵃ] to [F], the corresponding element of [F(a)] is [u = Φₐ(idₐ)]. *)(* Definition yoneda_lemma_morphism A (G : object (A^op -> set_cat)) (a : A) : morphism set_cat (BuildhSet (morphism (A^op -> set_cat) (yoneda A a) G) _) (G a) := fun phi => phi a 1%morphism.*)Definitionyoneda_functor
: Functor (A^op -> set_cat)
(A^op -> set_cat)
:= coyoneda_functor A^op.Endfunctor.Context `{Funext}.VariableA : PreCategory.Definitionyoneda_natural_transformation
: morphism (_ -> _)
1
(yoneda_functor A)
:= @morphism_inverse _ _ _ _ (coyoneda_lemma A^op).#[export] Instanceyoneda_lemma
: IsIsomorphism yoneda_natural_transformation
:= @isisomorphism_inverse _ _ _ _ (coyoneda_lemma A^op).Endyoneda_lemma.(** ** The Yoneda embedding An important special case of Yoneda's lemma is when the functor [F] from [A] to [Set] is another hom-functor [hᵇ]. In this case, the covariant version of Yoneda's lemma states that [Nat(hᵃ, hᵇ) ≅ Hom(b, a)]. That is, natural transformations between hom-functors are in one-to-one correspondence with morphisms (in the reverse direction) between the associated objects. Given a morphism [f : b → a] the associated natural transformation is denoted [Hom(f, ─)]. Mapping each object [a] in [A] to its associated hom-functor [hᵃ= Hom(a, ─)] and each morphism [f : B → A] to the corresponding natural transformation [Hom(f, ─)] determines a contravariant functor [h⁻] from [A] to [Setᴬ], the functor category of all (covariant) functors from [A] to [Set]. One can interpret [h⁻] as a covariant functor: [h⁻ : Aᵒᵖ → Setᴬ]. The meaning of Yoneda's lemma in this setting is that the functor [h⁻] is fully faithful, and therefore gives an embedding of [Aᵒᵖ] in the category of functors to [Set]. The collection of all functors {[hᵃ], [a] in [A]} is a subcategory of [Set̂ᴬ]. Therefore, Yoneda embedding implies that the category [Aᵒᵖ] is isomorphic to the category {[hᵃ], [a] in [A]}. The contravariant version of Yoneda's lemma states that [Nat(hₐ, h_b) ≅ Hom(a, b)]. Therefore, [h₋] gives rise to a covariant functor from [A] to the category of contravariant functors to [Set]: [h₋ : A → Set⁽⁽ᴬ⁾ᵒᵖ⁾]. Yoneda's lemma then states that any locally small category [A] can be embedded in the category of contravariant functors from [A] to [Set] via [h₋]. This is called the Yoneda embedding. *)SectionFullyFaithful.Context `{Funext}.
H: Funext A: PreCategory
IsFullyFaithful (coyoneda A)
H: Funext A: PreCategory
IsFullyFaithful (coyoneda A)
H: Funext A: PreCategory a, b: A^op%category
IsIsomorphism
(induced_hom_natural_transformation (coyoneda A)
(a, b))
H: Funext A: PreCategory a, b: A^op%category H': IsIsomorphism
(coyoneda_natural_transformation A
((coyoneda A) _0 b)%object a)^-1
IsIsomorphism
(induced_hom_natural_transformation (coyoneda A)
(a, b))
H: Funext A: PreCategory a, b: A H': IsIsomorphism
(coyoneda_lemma_morphism_inverse
(Functors.inverse_object_of_object_of
(hom_functor A) b) a)
IsIsomorphism
(funm : morphism A b a =>
Functors.inverse_object_of_morphism_of
(hom_functor A) a b m)
H: Funext A: PreCategory a, b: A H': IsIsomorphism
(funFa : morphism A b a =>
Build_NaturalTransformation
(Functors.inverse_object_of_object_of
(hom_functor A) a)
(Functors.inverse_object_of_object_of
(hom_functor A) b)
(fun (a' : A) (f : morphism A a a') =>
(f o Fa o 1)%morphism)
(coyoneda_lemma_morphism_inverse_subproof
(Functors.inverse_object_of_object_of
(hom_functor A) b) a Fa))
IsIsomorphism
(funm : morphism A b a =>
Functors.inverse_object_of_morphism_of
(hom_functor A) a b m)
H: Funext A: PreCategory a, b: A H': IsIsomorphism
(funFa : morphism A b a =>
Build_NaturalTransformation
(Functors.inverse_object_of_object_of
(hom_functor A) a)
(Functors.inverse_object_of_object_of
(hom_functor A) b)
(fun (a' : A) (f : morphism A a a') =>
(f o Fa o 1)%morphism)
(coyoneda_lemma_morphism_inverse_subproof
(Functors.inverse_object_of_object_of
(hom_functor A) b) a Fa))
IsIsomorphism
(funm : morphism A b a =>
Build_NaturalTransformation
(Functors.inverse_object_of_object_of
(hom_functor A) a)
(Functors.inverse_object_of_object_of
(hom_functor A) b)
(fun (c : A) (g : morphism A a c) =>
(1 o g o m)%morphism)
(Functors.inverse_object_of_morphism_of_subproof
(hom_functor A) a b m))
H: Funext A: PreCategory a, b: A H': IsIsomorphism
(funFa : morphism A b a =>
Build_NaturalTransformation
(Functors.inverse_object_of_object_of
(hom_functor A) a)
(Functors.inverse_object_of_object_of
(hom_functor A) b)
(fun (a' : A) (f : morphism A a a') =>
(f o Fa o 1)%morphism)
(coyoneda_lemma_morphism_inverse_subproof
(Functors.inverse_object_of_object_of
(hom_functor A) b) a Fa))
forall
(x : Trunc.trunctype_type
{|
Trunc.trunctype_type := morphism A b a;
Trunc.trunctype_istrunc :=
trunc_morphism A b a
|}) (y : A),
Build_NaturalTransformation
(Functors.inverse_object_of_object_of
(hom_functor A) a)
(Functors.inverse_object_of_object_of
(hom_functor A) b)
(fun (a' : A) (f : morphism A a a') =>
(f o x o 1)%morphism)
(coyoneda_lemma_morphism_inverse_subproof
(Functors.inverse_object_of_object_of
(hom_functor A) b) a x) y =
Build_NaturalTransformation
(Functors.inverse_object_of_object_of
(hom_functor A) a)
(Functors.inverse_object_of_object_of
(hom_functor A) b)
(fun (c : A) (g : morphism A a c) =>
(1 o g o x)%morphism)
(Functors.inverse_object_of_morphism_of_subproof
(hom_functor A) a b x) y
H: Funext A: PreCategory a, b: A H': IsIsomorphism
(funFa : morphism A b a =>
Build_NaturalTransformation
(Functors.inverse_object_of_object_of
(hom_functor A) a)
(Functors.inverse_object_of_object_of
(hom_functor A) b)
(fun (a' : A) (f : morphism A a a') =>
(f o Fa o 1)%morphism)
(coyoneda_lemma_morphism_inverse_subproof
(Functors.inverse_object_of_object_of
(hom_functor A) b) a Fa))
IsIsomorphism
(funFa : morphism A b a =>
Build_NaturalTransformation
(Functors.inverse_object_of_object_of
(hom_functor A) a)
(Functors.inverse_object_of_object_of
(hom_functor A) b)
(fun (a' : A) (f : morphism A a a') =>
(f o Fa o 1)%morphism)
(coyoneda_lemma_morphism_inverse_subproof
(Functors.inverse_object_of_object_of
(hom_functor A) b) a Fa))
H: Funext A: PreCategory a, b: A H': IsIsomorphism
(funFa : morphism A b a =>
Build_NaturalTransformation
(Functors.inverse_object_of_object_of
(hom_functor A) a)
(Functors.inverse_object_of_object_of
(hom_functor A) b)
(fun (a' : A) (f : morphism A a a') =>
(f o Fa o 1)%morphism)
(coyoneda_lemma_morphism_inverse_subproof
(Functors.inverse_object_of_object_of
(hom_functor A) b) a Fa))
forall
(x : Trunc.trunctype_type
{|
Trunc.trunctype_type := morphism A b a;
Trunc.trunctype_istrunc :=
trunc_morphism A b a
|}) (y : A),
Build_NaturalTransformation
(Functors.inverse_object_of_object_of
(hom_functor A) a)
(Functors.inverse_object_of_object_of
(hom_functor A) b)
(fun (a' : A) (f : morphism A a a') =>
(f o x o 1)%morphism)
(coyoneda_lemma_morphism_inverse_subproof
(Functors.inverse_object_of_object_of
(hom_functor A) b) a x) y =
Build_NaturalTransformation
(Functors.inverse_object_of_object_of
(hom_functor A) a)
(Functors.inverse_object_of_object_of
(hom_functor A) b)
(fun (c : A) (g : morphism A a c) =>
(1 o g o x)%morphism)
(Functors.inverse_object_of_morphism_of_subproof
(hom_functor A) a b x) y
H: Funext A: PreCategory a, b: A H': IsIsomorphism
(funFa : morphism A b a =>
Build_NaturalTransformation
(Functors.inverse_object_of_object_of
(hom_functor A) a)
(Functors.inverse_object_of_object_of
(hom_functor A) b)
(fun (a' : A) (f : morphism A a a') =>
(f o Fa o 1)%morphism)
(coyoneda_lemma_morphism_inverse_subproof
(Functors.inverse_object_of_object_of
(hom_functor A) b) a Fa))
forall (x : morphism A b a) (y : A),
(funf : morphism A a y => (f o x o 1)%morphism) =
(fung : morphism A a y => (1 o g o x)%morphism)
H: Funext A: PreCategory a, b: A
forall (x : morphism A b a) (y : A),
(funf : morphism A a y => (f o x o 1)%morphism) =
(fung : morphism A a y => (1 o g o x)%morphism)
H: Funext A: PreCategory a, b: A H': IsIsomorphism
(funFa : morphism A b a =>
Build_NaturalTransformation
(Functors.inverse_object_of_object_of
(hom_functor A) a)
(Functors.inverse_object_of_object_of
(hom_functor A) b)
(fun (a' : A) (f : morphism A a a') =>
(f o Fa o 1)%morphism)
(coyoneda_lemma_morphism_inverse_subproof
(Functors.inverse_object_of_object_of
(hom_functor A) b) a Fa))
IsIsomorphism
(funFa : morphism A b a =>
Build_NaturalTransformation
(Functors.inverse_object_of_object_of
(hom_functor A) a)
(Functors.inverse_object_of_object_of
(hom_functor A) b)
(fun (a' : A) (f : morphism A a a') =>
(f o Fa o 1)%morphism)
(coyoneda_lemma_morphism_inverse_subproof
(Functors.inverse_object_of_object_of
(hom_functor A) b) a Fa))
H: Funext A: PreCategory a, b: A m': morphism set_cat
{|
Trunc.trunctype_type :=
NaturalTransformation
(Functors.inverse_object_of_object_of
(hom_functor A) a)
(Functors.inverse_object_of_object_of
(hom_functor A) b);
Trunc.trunctype_istrunc :=
trunc_natural_transformation
(Functors.inverse_object_of_object_of
(hom_functor A) a)
(Functors.inverse_object_of_object_of
(hom_functor A) b)
|}
{|
Trunc.trunctype_type := morphism A b a;
Trunc.trunctype_istrunc :=
trunc_morphism A b a
|} H0': (m'
o (funFa : morphism A b a =>
Build_NaturalTransformation
(Functors.inverse_object_of_object_of (hom_functor A) a)
(Functors.inverse_object_of_object_of (hom_functor A) b)
(fun (a' : A) (f : morphism A a a') => f o Fa o 1)
(coyoneda_lemma_morphism_inverse_subproof
(Functors.inverse_object_of_object_of (hom_functor A) b) a Fa)))%morphism =
1%morphism H1': ((funFa : morphism A b a =>
Build_NaturalTransformation
(Functors.inverse_object_of_object_of (hom_functor A) a)
(Functors.inverse_object_of_object_of (hom_functor A) b)
(fun (a' : A) (f : morphism A a a') => f o Fa o 1)
(coyoneda_lemma_morphism_inverse_subproof
(Functors.inverse_object_of_object_of (hom_functor A) b) a Fa)) o m')%morphism =
1%morphism
IsIsomorphism
(funFa : morphism A b a =>
Build_NaturalTransformation
(Functors.inverse_object_of_object_of
(hom_functor A) a)
(Functors.inverse_object_of_object_of
(hom_functor A) b)
(fun (a' : A) (f : morphism A a a') =>
(f o Fa o 1)%morphism)
(coyoneda_lemma_morphism_inverse_subproof
(Functors.inverse_object_of_object_of
(hom_functor A) b) a Fa))
H: Funext A: PreCategory a, b: A m': morphism set_cat
{|
Trunc.trunctype_type :=
NaturalTransformation
(Functors.inverse_object_of_object_of
(hom_functor A) a)
(Functors.inverse_object_of_object_of
(hom_functor A) b);
Trunc.trunctype_istrunc :=
trunc_natural_transformation
(Functors.inverse_object_of_object_of
(hom_functor A) a)
(Functors.inverse_object_of_object_of
(hom_functor A) b)
|}
{|
Trunc.trunctype_type := morphism A b a;
Trunc.trunctype_istrunc :=
trunc_morphism A b a
|} H0': (m'
o (funFa : morphism A b a =>
Build_NaturalTransformation
(Functors.inverse_object_of_object_of (hom_functor A) a)
(Functors.inverse_object_of_object_of (hom_functor A) b)
(fun (a' : A) (f : morphism A a a') => f o Fa o 1)
(coyoneda_lemma_morphism_inverse_subproof
(Functors.inverse_object_of_object_of (hom_functor A) b) a Fa)))%morphism =
1%morphism H1': ((funFa : morphism A b a =>
Build_NaturalTransformation
(Functors.inverse_object_of_object_of (hom_functor A) a)
(Functors.inverse_object_of_object_of (hom_functor A) b)
(fun (a' : A) (f : morphism A a a') => f o Fa o 1)
(coyoneda_lemma_morphism_inverse_subproof
(Functors.inverse_object_of_object_of (hom_functor A) b) a Fa)) o m')%morphism =
1%morphism
(m'
o (funFa : morphism A b a =>
Build_NaturalTransformation
(Functors.inverse_object_of_object_of
(hom_functor A) a)
(Functors.inverse_object_of_object_of
(hom_functor A) b)
(fun (a' : A) (f : morphism A a a') =>
f o Fa o 1)
(coyoneda_lemma_morphism_inverse_subproof
(Functors.inverse_object_of_object_of
(hom_functor A) b) a Fa)))%morphism =
1%morphism
H: Funext A: PreCategory a, b: A m': morphism set_cat
{|
Trunc.trunctype_type :=
NaturalTransformation
(Functors.inverse_object_of_object_of
(hom_functor A) a)
(Functors.inverse_object_of_object_of
(hom_functor A) b);
Trunc.trunctype_istrunc :=
trunc_natural_transformation
(Functors.inverse_object_of_object_of
(hom_functor A) a)
(Functors.inverse_object_of_object_of
(hom_functor A) b)
|}
{|
Trunc.trunctype_type := morphism A b a;
Trunc.trunctype_istrunc :=
trunc_morphism A b a
|} H0': (m'
o (funFa : morphism A b a =>
Build_NaturalTransformation
(Functors.inverse_object_of_object_of (hom_functor A) a)
(Functors.inverse_object_of_object_of (hom_functor A) b)
(fun (a' : A) (f : morphism A a a') => f o Fa o 1)
(coyoneda_lemma_morphism_inverse_subproof
(Functors.inverse_object_of_object_of (hom_functor A) b) a Fa)))%morphism =
1%morphism H1': ((funFa : morphism A b a =>
Build_NaturalTransformation
(Functors.inverse_object_of_object_of (hom_functor A) a)
(Functors.inverse_object_of_object_of (hom_functor A) b)
(fun (a' : A) (f : morphism A a a') => f o Fa o 1)
(coyoneda_lemma_morphism_inverse_subproof
(Functors.inverse_object_of_object_of (hom_functor A) b) a Fa)) o m')%morphism =
1%morphism
((funFa : morphism A b a =>
Build_NaturalTransformation
(Functors.inverse_object_of_object_of
(hom_functor A) a)
(Functors.inverse_object_of_object_of
(hom_functor A) b)
(fun (a' : A) (f : morphism A a a') => f o Fa o 1)
(coyoneda_lemma_morphism_inverse_subproof
(Functors.inverse_object_of_object_of
(hom_functor A) b) a Fa)) o m')%morphism =
1%morphism
H: Funext A: PreCategory a, b: A m': morphism set_cat
{|
Trunc.trunctype_type :=
NaturalTransformation
(Functors.inverse_object_of_object_of
(hom_functor A) a)
(Functors.inverse_object_of_object_of
(hom_functor A) b);
Trunc.trunctype_istrunc :=
trunc_natural_transformation
(Functors.inverse_object_of_object_of
(hom_functor A) a)
(Functors.inverse_object_of_object_of
(hom_functor A) b)
|}
{|
Trunc.trunctype_type := morphism A b a;
Trunc.trunctype_istrunc :=
trunc_morphism A b a
|} H0': (m'
o (funFa : morphism A b a =>
Build_NaturalTransformation
(Functors.inverse_object_of_object_of (hom_functor A) a)
(Functors.inverse_object_of_object_of (hom_functor A) b)
(fun (a' : A) (f : morphism A a a') => f o Fa o 1)
(coyoneda_lemma_morphism_inverse_subproof
(Functors.inverse_object_of_object_of (hom_functor A) b) a Fa)))%morphism =
1%morphism H1': ((funFa : morphism A b a =>
Build_NaturalTransformation
(Functors.inverse_object_of_object_of (hom_functor A) a)
(Functors.inverse_object_of_object_of (hom_functor A) b)
(fun (a' : A) (f : morphism A a a') => f o Fa o 1)
(coyoneda_lemma_morphism_inverse_subproof
(Functors.inverse_object_of_object_of (hom_functor A) b) a Fa)) o m')%morphism =
1%morphism
(m'
o (funFa : morphism A b a =>
Build_NaturalTransformation
(Functors.inverse_object_of_object_of
(hom_functor A) a)
(Functors.inverse_object_of_object_of
(hom_functor A) b)
(fun (a' : A) (f : morphism A a a') =>
f o Fa o 1)
(coyoneda_lemma_morphism_inverse_subproof
(Functors.inverse_object_of_object_of
(hom_functor A) b) a Fa)))%morphism =
1%morphism
exact H0'.
H: Funext A: PreCategory a, b: A m': morphism set_cat
{|
Trunc.trunctype_type :=
NaturalTransformation
(Functors.inverse_object_of_object_of
(hom_functor A) a)
(Functors.inverse_object_of_object_of
(hom_functor A) b);
Trunc.trunctype_istrunc :=
trunc_natural_transformation
(Functors.inverse_object_of_object_of
(hom_functor A) a)
(Functors.inverse_object_of_object_of
(hom_functor A) b)
|}
{|
Trunc.trunctype_type := morphism A b a;
Trunc.trunctype_istrunc :=
trunc_morphism A b a
|} H0': (m'
o (funFa : morphism A b a =>
Build_NaturalTransformation
(Functors.inverse_object_of_object_of (hom_functor A) a)
(Functors.inverse_object_of_object_of (hom_functor A) b)
(fun (a' : A) (f : morphism A a a') => f o Fa o 1)
(coyoneda_lemma_morphism_inverse_subproof
(Functors.inverse_object_of_object_of (hom_functor A) b) a Fa)))%morphism =
1%morphism H1': ((funFa : morphism A b a =>
Build_NaturalTransformation
(Functors.inverse_object_of_object_of (hom_functor A) a)
(Functors.inverse_object_of_object_of (hom_functor A) b)
(fun (a' : A) (f : morphism A a a') => f o Fa o 1)
(coyoneda_lemma_morphism_inverse_subproof
(Functors.inverse_object_of_object_of (hom_functor A) b) a Fa)) o m')%morphism =
1%morphism
((funFa : morphism A b a =>
Build_NaturalTransformation
(Functors.inverse_object_of_object_of
(hom_functor A) a)
(Functors.inverse_object_of_object_of
(hom_functor A) b)
(fun (a' : A) (f : morphism A a a') => f o Fa o 1)
(coyoneda_lemma_morphism_inverse_subproof
(Functors.inverse_object_of_object_of
(hom_functor A) b) a Fa)) o m')%morphism =
1%morphism
exact H1'.Qed.
H: Funext A: PreCategory
IsFullyFaithful (yoneda A)
H: Funext A: PreCategory
IsFullyFaithful (yoneda A)
H: Funext A: PreCategory a, b: A
IsIsomorphism
(induced_hom_natural_transformation (yoneda A)
(a, b))
H: Funext A: PreCategory a, b: A CYE: IsIsomorphism (induced_hom_natural_transformation (coyoneda A^op) (a, b))
IsIsomorphism
(induced_hom_natural_transformation (yoneda A)
(a, b))
H: Funext A: PreCategory a, b: A CYE: IsIsomorphism (induced_hom_natural_transformation (coyoneda A^op) (a, b))
H: Funext A: PreCategory a, b: A CYE: IsIsomorphism (induced_hom_natural_transformation (coyoneda A^op) (a, b)) CYE': IsIsomorphism
(funm : morphism A a b =>
Functors.inverse_object_of_morphism_of
(hom_functor A^op) a b m)