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

(* Specifications: *)
Theorem PMCM_N_co_equalizes :
((mono_morphism N) ∘ (PMCM_PreSheaf_morph_of_function g))%nattrans
= ((mono_morphism N) ∘ (PMCM_PreSheaf_morph_of_function h))%nattrans.
Theorem PreSheaf_Monic_components_is_Monic : g = h.
End PreSheaf_Monic_components_Monic_is_Monic.