Section CoproductFacts.
Context {obj : Type} {C : Hom obj}.
Context {Eq2_C : Eq2 C}.
Context {E_Eq2_C : forall a b, @Equivalence (C a b) eq2}.
Context {Id_C : Id_ C} {Cat_C : Cat C}.
Context {Category_C : Category C}.
Context {bif : binop obj}.
Context {Case_C : Case C bif}
{Inl_C : Inl C bif}
{Inr_C : Inr C bif}.
Context {Coproduct_C : Coproduct C bif}.
Ltac cat_auto :=
unfold_coproduct;
repeat progress (reflexivity || (try cat_auto_simpl); try apply coprod_split).
Ltac cat_auto' :=
repeat intro;
repeat match goal with
| [ |- eq2 _ _ ] => fail 1
| _ => red
end;
cat_auto.
Global Instance BimapId_Coproduct : BimapId C bif.
Global Instance BimapCat_Coproduct : BimapCat C bif.
(** The coproduct is commutative *)
Global Instance SwapInvolutive_Coproduct {a b : obj}
: SemiIso C (swap_ a b) swap.
Global Instance AssocLAssocL_Coproduct : AssocLAssocL C bif.

(* Naturality of (loop_ktree I A B) in A *)
(* Or more diagrammatically: [[ +-----+ | ### | +-###-+I A----B----###----C ###  is equivalent to:  +----------+ |      ### | +------###-+I A----B----###----C ###  ]] *)
Lemma loop_natural_left {a a' b c} (f : C (bif c a) (bif c b)) (g : C a' a)
: g >>> loop f
⩯ loop (bimap (id_ _) g >>> f).