(**
  Accepts one element, x, and asserts
  that x is the left identity element.
*)
Definition prod_is_id_l := Monoid.is_id_l E prod.(**
  Accepts one element, x, and asserts
  that x is the right identity element.
*)
Definition prod_is_id_r := Monoid.is_id_r E prod.(**
  Accepts one element, x, and asserts
  that x is the identity element.
*)
Definition prod_is_id := Monoid.is_id E prod.(** Represents the monoid formed by op over E. *)
Definition prod_monoid := Monoid.monoid E 1 {#} prod_is_assoc prod_id_l prod_id_r.

(* Specifications: *)
Theorem prod_id : prod_is_id 1.
Theorem prod_id_l_uniq : forall x : E, (Monoid.is_id_l E prod x) -> x = 1.
Theorem prod_id_r_uniq : forall x : E, (Monoid.is_id_r E prod x) -> x = 1.
Theorem prod_id_uniq : forall x : E, (Monoid.is_id E prod 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.