Proof
fun x
=> ex_ind
(fun (y : E) (H : op_is_inv_l x y)
=> ex_intro
(op_is_inv_r x)
y
(H || a = 0 @a by op_is_comm x y))
(op_inv_l_ex x).
(** Represents the group structure formed by op over E. *)
Definition op_group := Group.group E 0 {+} op_is_assoc op_id_l op_id_r op_inv_l_ex op_inv_r_ex.
(** Represents the monoid formed by op over E. *)
Definition op_monoid := Group.op_monoid op_group.
(** Accepts one argument, x, and asserts that x has a left inverse. *)
Definition has_inv_l := Group.has_inv_l op_group.
(** Accepts one argument, x, and asserts that x has a right inverse. *)
Definition has_inv_r := Group.has_inv_r op_group.
(** Accepts one argument, x, and asserts that x has an inverse. *)
Definition has_inv := Group.has_inv op_group.

(* Specifications: *)
(** Proves that the left identity element is unique. *)
Theorem op_id_l_uniq
:  forall x : E, Monoid.is_id_l E {+} x -> x = 0.