Program Definition PreSheaf_Epic_components_Epic :
Epic (F _o c)%object (G _o c)%object
:=
{|
mono_morphism := Trans (mono_morphism N) c;
mono_morphism_monomorphic :=
PreSheaf_Epic_components_is_Epic
|}.
End PreSheaf_Epic_components_Epic.
Local Hint Extern 1 => match goal with
[|- context [(?F _a id)%morphism]] => rewrite (F_id F)
end.
Local Hint Extern 1 =>
match goal with
[|- context [(?F _a (?f ∘ ?g))%morphism]] =>
cbn_rewrite (F_compose F f g)
end.
Local Hint Extern 1 =>
match goal with
[|- context [Trans ?f _ ((?F _a)%morphism ?h _)]] =>
cbn_rewrite (equal_f (Trans_com f h))
end.
Local Hint Extern 1 => progress cbn in *.
(** In this section we show that a monic presheaf morphism can be split into to presheaf morphisms one iso and one monic.  This result is inherited from that in Type_Cat and is proven similarly. *)
Section Monic_PreSheaf_Iso_Monic_Factorization.
Context
{C : Category}
{F G : PreSheaf C}
(N : @Monic (PShCat C) F G)
.

(* Specifications: *)
Lemma sigT_sig_proof_irrelevance
{T : Type}
{P : T → Type}
{Q : ∀ x, (P x) → Prop}
(A B : sigT (fun y => sig (Q y)))
(H : projT1 A = projT1 B)
(H' :
(
proj1_sig
(
match H in _ = u return
{x : P u | Q u x}
with
eq_refl => projT2 A
end
)
)
=
(proj1_sig (projT2 B)))
:
A = B
.