(** Represents strongly-specified negation. *)
Definition sum_neg_strong
  :  forall x : E, { y | sum_is_inv x y }
  := Ring.sum_neg_strong ring.(** Represents negation. *)
Definition sum_neg 
  :  E -> E
  := Ring.sum_neg ring.Notation "{-}" := (Commutative_Ring.sum_neg _) : commutative_ring_scope.Notation "- x" := (Commutative_Ring.sum_neg _ x) : commutative_ring_scope.(**
  Asserts that the negation returns the inverse
  of its argument.
*)
Definition sum_neg_def 
  :  forall x : E, sum_is_inv x (- x)
  := Ring.sum_neg_def ring.

(* Specifications: *)
Theorem sum_neg_inj : is_injective E E sum_neg.
Theorem sum_cancel_neg : forall x : E, sum_neg (- x) = x.
Theorem sum_neg_onto : is_onto E E sum_neg.
Theorem sum_neg_bijective : is_bijective E E sum_neg.
Theorem sum_neg_rev : forall x y : E, - x = y -> - y = x.
Theorem sum_neg_distrib_inv_l : forall x y : E, sum_is_inv_l (x + y) (- y + - x).
Theorem sum_neg_distrib_inv_r : forall x y : E, sum_is_inv_r (x + y) (- y + - x).
Theorem sum_neg_distrib_inv : forall x y : E, sum_is_inv (x + y) (- y + - x).
Theorem sum_neg_distrib : forall x y : E, - (x + y) = - y + - x.
Theorem sum_0_neg : - 0 = 0.
Theorem sum_neg_0 : forall x : E, - x = 0 -> x = 0.
Theorem sum_neg_0_uniq : unique (fun x => - x = 0) 0.
Theorem prod_id : prod_is_id 1.
Theorem prod_id_l_uniq : forall x : E, (Monoid.is_id_l E {#} x) -> x = 1.
Theorem prod_id_r_uniq : forall x : E, (Monoid.is_id_r E {#} x) -> x = 1.
Theorem prod_id_uniq : forall x : E, (Monoid.is_id E {#} x) -> x = 1.
Theorem prod_intro_l : forall x y z : E, x = y -> z # x = z # y.
Theorem prod_intro_r : forall x y z : E, x = y -> x # z = y # z.