Section Monic_Iso_Monic_Factorization.
Context
{A B : Type}
{f : A → B}
(fm : @is_Monic Type_Cat _ _ f)
.
Definition Monic_Image_of : Type := {x : B & {a : A | f a = x}}.
Definition Monic_From_Image_forward : Monic_Image_of → B := fun x => projT1 x.
Program Definition Monic_Iso_Monic_Factor_Monic :
@Monic Type_Cat Monic_Image_of B :=
{|
mono_morphism := Monic_From_Image_forward;
mono_morphism_monomorphic := fun T g h => _
|}
.
Next Obligation.
Definition Monic_To_Image : A → Monic_Image_of :=
fun a => existT _ (f a) (exist _ a eq_refl).
Definition Monic_From_Image_back : Monic_Image_of → A :=
fun x => proj1_sig (projT2 x).

Theorem Monic_To_Image_form_split_epic :
(
fun (x : Monic_Image_of) =>
Monic_To_Image (Monic_From_Image_back x)
) = (fun x => x).