Definition is_CAbMonoid (G : CMonoid) := commutes (csg_op (c:=G)).
Record CAbMonoid : Type :=
{cam_crr :> CMonoid;
cam_proof : is_CAbMonoid cam_crr}.
Section AbMonoid_Axioms.
Variable M : CAbMonoid.
Let M be an abelian monoid.
Lemma CAbMonoid_is_CAbMonoid : is_CAbMonoid M.
Lemma cam_commutes : commutes (csg_op (c:=M)).
Lemma cam_commutes_unfolded : forall x y : M, x[+]y [=] y[+]x.
End AbMonoid_Axioms.
Section SubCAbMonoids.
Variable M : CAbMonoid.
Variable P : M -> CProp.
Variable Punit : P 0.
Variable op_pres_P : bin_op_pres_pred _ P csg_op.
Variable P : M -> CProp.
Variable Punit : P 0.
Variable op_pres_P : bin_op_pres_pred _ P csg_op.
Let M be an Abelian Monoid and P be a (CProp-valued) predicate on M
that contains 0 and is closed under + and [--].
Let subcrr : CMonoid := Build_SubCMonoid _ _ Punit op_pres_P.
Lemma isabgrp_scrr : is_CAbMonoid subcrr.
Definition Build_SubCAbMonoid : CAbMonoid := Build_CAbMonoid _ isabgrp_scrr.
End SubCAbMonoids.
End Abelian_Monoids.