Section CocartesianFunctor.
Context
{obj : Type} {C D : obj -> obj -> Type}
{bif : obj -> obj -> obj}
`{Eq2 _ C} `{Case _ C bif} `{Inl _ C bif} `{Inr _ C bif}
`{Eq2 _ D} `{Case _ D bif} `{Inl _ D bif} `{Inr _ D bif}
{fmap : forall a b, C a b -> D a b}.
Arguments fmap {a b}.
Class CocartesianFunctor : Prop :=
{ fmap_case : forall a b c (f : C a c) (g : C b c),
fmap (case_ f g) ⩯ case_ (fmap f) (fmap g)
; fmap_inl : forall a b,
fmap (inl_ (a := a) (b := b)) ⩯ inl_
; fmap_inr : forall a b,
fmap (inr_ (a := a) (b := b)) ⩯ inr_
}.
Context
`{forall a b, Equivalence (eq2 (C := D) (a := a) (b := b))}
`{Id_ _ C} `{Cat _ C}
`{Id_ _ D} `{Cat _ D}
`{forall a b c, Proper (eq2 ==> eq2 ==> eq2) (cat (C := D) (a := a) (b := b) (c := c))}
`{@Coproduct _ D _ _ bif _ _ _}
`{@Functor _ _ C D (fun x => x) (@fmap) _ _ _ _ _ _}
`{CocartesianFunctor}.

Lemma fmap_bimap {n m p q} (f : C n m) (g : C p q)
: fmap (bimap f g) ⩯ bimap (fmap f) (fmap g).