Definition onto (f : E -> E) := forall y : E, {x : E | f x = y}.Definition associative := forall x y z : E, o x (o y z) = o (o x y) z.Definition left_neutral := forall x : E, o e x = x.Definition right_neutral := forall x : E, o x e = x.Definition left_symmetric := forall x : E, o (s x) x = e.Definition right_symmetric := forall x : E, o x (s x) = e.(* what is a group on E ? *)

Record group (E : Set) : Set := mkgroup
  {group_law : E -> E -> E;
    (* composition law *)
    group_assoc : associative group_law;
   group_neutral : E;
    (* neutral element *)
    group_sym : E -> E;
    (* symmetric *)
    group_l_neutral : left_neutral group_law group_neutral;
   group_r_neutral : right_neutral group_law group_neutral;
   group_l_sym : left_symmetric group_law group_neutral group_sym;
   group_r_sym : right_symmetric group_law group_neutral group_sym}.(* what is a group on E ? *)

Record group (E : Set) : Set := mkgroup
  {group_law : E -> E -> E;
    (* composition law *)
    group_assoc : associative group_law;
   group_neutral : E;
    (* neutral element *)
    group_sym : E -> E;
    (* symmetric *)
    group_l_neutral : left_neutral group_law group_neutral;
   group_r_neutral : right_neutral group_law group_neutral;
   group_l_sym : left_symmetric group_law group_neutral group_sym;
   group_r_sym : right_symmetric group_law group_neutral group_sym}.(* what is a group on E ? *)

Record group (E : Set) : Set := mkgroup
  {group_law : E -> E -> E;
    (* composition law *)
    group_assoc : associative group_law;
   group_neutral : E;
    (* neutral element *)
    group_sym : E -> E;
    (* symmetric *)
    group_l_neutral : left_neutral group_law group_neutral;
   group_r_neutral : right_neutral group_law group_neutral;
   group_l_sym : left_symmetric group_law group_neutral group_sym;
   group_r_sym : right_symmetric group_law group_neutral group_sym}.(* what is a group on E ? *)

Record group (E : Set) : Set := mkgroup
  {group_law : E -> E -> E;
    (* composition law *)
    group_assoc : associative group_law;
   group_neutral : E;
    (* neutral element *)
    group_sym : E -> E;
    (* symmetric *)
    group_l_neutral : left_neutral group_law group_neutral;
   group_r_neutral : right_neutral group_law group_neutral;
   group_l_sym : left_symmetric group_law group_neutral group_sym;
   group_r_sym : right_symmetric group_law group_neutral group_sym}.(* what is a group on E ? *)

Record group (E : Set) : Set := mkgroup
  {group_law : E -> E -> E;
    (* composition law *)
    group_assoc : associative group_law;
   group_neutral : E;
    (* neutral element *)
    group_sym : E -> E;
    (* symmetric *)
    group_l_neutral : left_neutral group_law group_neutral;
   group_r_neutral : right_neutral group_law group_neutral;
   group_l_sym : left_symmetric group_law group_neutral group_sym;
   group_r_sym : right_symmetric group_law group_neutral group_sym}.(* what is a group on E ? *)

Record group (E : Set) : Set := mkgroup
  {group_law : E -> E -> E;
    (* composition law *)
    group_assoc : associative group_law;
   group_neutral : E;
    (* neutral element *)
    group_sym : E -> E;
    (* symmetric *)
    group_l_neutral : left_neutral group_law group_neutral;
   group_r_neutral : right_neutral group_law group_neutral;
   group_l_sym : left_symmetric group_law group_neutral group_sym;
   group_r_sym : right_symmetric group_law group_neutral group_sym}.(* what is a group on E ? *)

Record group (E : Set) : Set := mkgroup
  {group_law : E -> E -> E;
    (* composition law *)
    group_assoc : associative group_law;
   group_neutral : E;
    (* neutral element *)
    group_sym : E -> E;
    (* symmetric *)
    group_l_neutral : left_neutral group_law group_neutral;
   group_r_neutral : right_neutral group_law group_neutral;
   group_l_sym : left_symmetric group_law group_neutral group_sym;
   group_r_sym : right_symmetric group_law group_neutral group_sym}.(* what is a group on E ? *)

Record group (E : Set) : Set := mkgroup
  {group_law : E -> E -> E;
    (* composition law *)
    group_assoc : associative group_law;
   group_neutral : E;
    (* neutral element *)
    group_sym : E -> E;
    (* symmetric *)
    group_l_neutral : left_neutral group_law group_neutral;
   group_r_neutral : right_neutral group_law group_neutral;
   group_l_sym : left_symmetric group_law group_neutral group_sym;
   group_r_sym : right_symmetric group_law group_neutral group_sym}.(* what is a group on E ? *)

Record group (E : Set) : Set := mkgroup
  {group_law : E -> E -> E;
    (* composition law *)
    group_assoc : associative group_law;
   group_neutral : E;
    (* neutral element *)
    group_sym : E -> E;
    (* symmetric *)
    group_l_neutral : left_neutral group_law group_neutral;
   group_r_neutral : right_neutral group_law group_neutral;
   group_l_sym : left_symmetric group_law group_neutral group_sym;
   group_r_sym : right_symmetric group_law group_neutral group_sym}.(* what is a group on E ? *)

Record group (E : Set) : Set := mkgroup
  {group_law : E -> E -> E;
    (* composition law *)
    group_assoc : associative group_law;
   group_neutral : E;
    (* neutral element *)
    group_sym : E -> E;
    (* symmetric *)
    group_l_neutral : left_neutral group_law group_neutral;
   group_r_neutral : right_neutral group_law group_neutral;
   group_l_sym : left_symmetric group_law group_neutral group_sym;
   group_r_sym : right_symmetric group_law group_neutral group_sym}.

(* Specifications: *)
Lemma solve_equation : forall x y : E, o x y = e -> y = s x.
Lemma ssx : forall x : E, x = s (s x).
Lemma Ea : {ea : E | o a ea = a}.