(**
  Proves that an element's inverse is unique.

  Note: this theorem is defined as transparent to
  allow a theorem in the field module to compile.
*)
Definition prod_inv_uniq
  :  forall x y z : E, prod_is_inv x y -> prod_is_inv x z -> z = y
  := Monoid.op_inv_uniq prod_monoid.

(* Specifications: *)
Theorem prod_inv_1_l : prod_is_inv_l 1 1.
Theorem prod_inv_1_r : prod_is_inv_r 1 1.
Theorem prod_inv_1 : prod_is_inv 1 1.
Theorem prod_has_inv_l_1 : prod_has_inv_l 1.
Theorem prod_has_inv_r_1 : prod_has_inv_r 1.
Theorem prod_has_inv_1 : prod_has_inv 1.
Theorem prod_inv_1_eq_1 : forall x : E, prod_is_inv x 1 -> x = 1.
Theorem prod_inv_1_uniq : unique (fun x => prod_is_inv x 1) 1.
Theorem recipr_1_l : prod_is_inv_l 1 1.
Theorem recipr_1_r : prod_is_inv_r 1 1.
Theorem recipr_1 : prod_is_inv 1 1.
Theorem prod_sum_distrib : is_distrib E prod sum.
Theorem prod_0_l : forall x : E, 0 # x = 0.
Theorem prod_0_r : forall x : E, x # 0 = 0.
Theorem prod_0_inv_l : ~ prod_has_inv_l 0.
Theorem prod_0_inv_r : ~ prod_has_inv_r 0.
Theorem prod_0_inv : ~ prod_has_inv 0.
Theorem prod_inv_0 : forall x y : E, prod_is_inv x y -> nonzero y.