Definition PreSheaf_Monic_components_Monic_Monic :
Monic (F _o c)%object (G _o c)%object
:=
{|
mono_morphism := Trans (mono_morphism N) c;
mono_morphism_monomorphic :=
PreSheaf_Monic_components_is_Monic
|}.
End PreSheaf_Monic_components_Monic.
(** In this section we show that all components of an epic morphism of presheaves are epic.  We do this by showing that given an epic morphism of presheaves N : F –≫ G we can convert any function from f : (G c) → A to a morphism of presheaves (PSh(f) : G –≻ Psh(A)) such that this morphism at c gives exactly f. *)
Section PreSheaf_Epic_components_Epic.
Context
{C : Category}
{F G : PreSheaf C}
(N : @Epic (PShCat C) F G)
(c : C)
.
Section PreSheaf_Epic_components_is_Epic.
Context
(d : Type)
(g h : (G _o)%object c → d)
(H : (fun x => g (Trans (mono_morphism N) c x)) =
(fun x => h (Trans (mono_morphism N) c x)))
.
Local Hint Extern 1 => progress cbn.
Local Hint Extern 1 => rewrite assoc.
Program Definition PECE_PreSheaf_representing_d : PreSheaf C
:=
{|
FO := fun c' => (((Hom C c c') → d))%object%morphism%type;
FA := fun o o' u x y => (x (compose C y u))
|}
.
Local Hint Extern 1 =>
match goal with
[|- context [(G _a)%morphism (?A ∘ ?B)%morphism] ] =>
cbn_rewrite (F_compose G A B)
end.
Program Definition PECE_PreSheaf_morph_of_function
(f : (G _o)%object c → d)
: (G –≻ PECE_PreSheaf_representing_d)%nattrans
:=
{|
Trans := fun o x y => f ((G _a y)%morphism x)
|}
.

(* Specifications: *)
Theorem PECE_N_co_equalizes :
((PECE_PreSheaf_morph_of_function g) ∘ (mono_morphism N))%nattrans =
((PECE_PreSheaf_morph_of_function h) ∘ (mono_morphism N))%nattrans.
Theorem PreSheaf_Epic_components_is_Epic : g = h.
End PreSheaf_Epic_components_is_Epic.