Section Comma.
Context {B C D : Category} (F : (B –≻ C)%functor) (G : (D –≻ C)%functor).
Record Comma_Obj : Type :=
{
CMO_src : B;
CMO_trg : D;
CMO_hom : ((F _o CMO_src) –≻ (G _o CMO_trg))%object
}.
Record Comma_Hom (a b : Comma_Obj) : Type :=
{
CMH_left : (CMO_src a) –≻ (CMO_src b);
CMH_right : (CMO_trg a) –≻ (CMO_trg b);
CMH_com :  ((G _a CMH_right) ∘ (@CMO_hom a) =
(@CMO_hom b) ∘ (F _a CMH_left))%morphism
}.
Arguments CMH_left {_ _} _.
Arguments CMH_right {_ _} _.
Arguments CMH_com {_ _} _.
Program Definition Comma_Hom_compose
{a b c : Comma_Obj} (h : Comma_Hom a b) (h' : Comma_Hom b c) :
Comma_Hom a c :=
{|
CMH_left := (CMH_left h') ∘ (CMH_left h);
CMH_right := (CMH_right h') ∘ (CMH_right h)
|}.
Next Obligation.

Theorem Comma_Hom_compose_assoc {a b c d : Comma_Obj} (h : Comma_Hom a b)
(h' : Comma_Hom b c) (h'' : Comma_Hom c d) :
Comma_Hom_compose h (Comma_Hom_compose h' h'') =
Comma_Hom_compose (Comma_Hom_compose h h') h''.