(**
  Accepts two elements, x and y, and
  asserts that y is x's left inverse.
*)
Definition prod_is_inv_l := Ring.prod_is_inv_l ring.(**
  Accepts two elements, x and y, and
  asserts that y is x's right inverse.
*)
Definition prod_is_inv_r := Ring.prod_is_inv_r ring.(**
  Accepts two elements, x and y, and
  asserts that y is x's inverse.
*)
Definition prod_is_inv := Ring.prod_is_inv ring.(**
  Accepts one argument, x, and asserts that
  x has a left inverse.
*)
Definition prod_has_inv_l := Ring.prod_has_inv_l ring.(**
  Accepts one argument, x, and asserts that
  x has a right inverse.
*)
Definition prod_has_inv_r := Ring.prod_has_inv_r ring.(**
  Accepts one argument, x, and asserts that
  x has an inverse.
*)
Definition prod_has_inv := Ring.prod_has_inv ring.

(* Specifications: *)
Theorem prod_is_inv_lr : forall x y : E, prod_is_inv_l x y -> prod_is_inv_r x y.
Theorem prod_inv_l_r_eq : forall x y : E, prod_is_inv_l x y -> forall z : E, prod_is_inv_r x z -> y = z.
Theorem prod_inv_sym : forall x y : E, prod_is_inv x y <-> prod_is_inv y x.
Theorem prod_cancel_l : forall x y z : E, prod_has_inv_l z -> z # x = z # y -> x = y.
Theorem prod_cancel_r : forall x y z : E, prod_has_inv_r z -> x # z = y # z -> x = y.
Theorem prod_inv_l_uniq : forall x : E, prod_has_inv_r x -> forall y z : E, prod_is_inv_l x y -> prod_is_inv_l x z -> z = y.
Theorem prod_inv_r_uniq : forall x : E, prod_has_inv_l x -> forall y z : E, prod_is_inv_r x y -> prod_is_inv_r x z -> z = y.