(**
  Accepts two elements, x and y, and
  asserts that y is x's left inverse.
*)
Definition sum_is_inv_l
  := Abelian_Group.op_is_inv_l sum_abelian_group.(**
  Accepts two elements, x and y, and
  asserts that y is x's right inverse.
*)
Definition sum_is_inv_r
  := Abelian_Group.op_is_inv_r sum_abelian_group.(**
  Accepts two elements, x and y, and
  asserts that y is x's inverse.
*)
Definition sum_is_inv
  := Abelian_Group.op_is_inv sum_abelian_group.(**
  Accepts one argument, x, and asserts that
  x has a left inverse.
*)
Definition sum_has_inv_l := Abelian_Group.has_inv_l sum_abelian_group.(**
  Accepts one argument, x, and asserts that
  x has a right inverse.
*)
Definition sum_has_inv_r := Abelian_Group.has_inv_r sum_abelian_group.(**
  Accepts one argument, x, and asserts that
  x has an inverse.
*)
Definition sum_has_inv := Abelian_Group.has_inv sum_abelian_group.

(* Specifications: *)
Theorem sum_inv_r_ex : forall x : E, exists y : E, sum_is_inv_r x y.
Theorem sum_id_l_uniq : forall x : E, Monoid.is_id_l E {+} x -> x = 0.
Theorem sum_id_r_uniq : forall x : E, Monoid.is_id_r E {+} x -> x = 0.
Theorem sum_id_uniq : forall x : E, Monoid.is_id E {+} x -> x = 0.
Theorem sum_inv_l_r_eq : forall x y : E, sum_is_inv_l x y -> forall z : E, sum_is_inv_r x z -> y = z.
Theorem sum_inv_sym : forall x y : E, sum_is_inv x y <-> sum_is_inv y x.
Theorem sum_inv_uniq : forall x y z : E, sum_is_inv x y -> sum_is_inv x z -> z = y.
Theorem sum_inv_ex : forall x : E, exists y : E, sum_is_inv x y.
Theorem sum_inv_uniq_ex : forall x : E, exists! y : E, sum_is_inv x y.
Theorem sum_intro_l : forall x y z : E, x = y -> z + x = z + y.
Theorem sum_intro_r : forall x y z : E, x = y -> x + z = y + z.
Theorem sum_cancel_l : forall x y z : E, z + x = z + y -> x = y.
Theorem sum_cancel_r : forall x y z : E, x + z = y + z -> x = y.
Theorem sum_inv_l_uniq : forall x y z : E, sum_is_inv_l x y -> sum_is_inv_l x z -> z = y.
Theorem sum_inv_r_uniq : forall x y z : E, sum_is_inv_r x y -> sum_is_inv_r x z -> z = y.
Theorem sum_0_inv_l : sum_is_inv_l 0 0.
Theorem sum_0_inv_r : sum_is_inv_r 0 0.
Theorem sum_0_inv : sum_is_inv 0 0.
Theorem sum_has_inv_l_0 : sum_has_inv_l 0.
Theorem sum_has_inv_r_0 : sum_has_inv_r 0.
Theorem sum_has_inv_0 : sum_has_inv 0.
Theorem sum_inv_0_eq_0 : forall x : E, sum_is_inv x 0 -> x = 0.
Theorem sum_inv_0_uniq : unique (fun x => sum_is_inv x 0) 0.