Structure law := Law {
  operator : T -> T -> T;
  _ : associative operator;
  _ : left_id idm operator;
  _ : right_id idm operator
}.Structure law := Law {
  operator : T -> T -> T;
  _ : associative operator;
  _ : left_id idm operator;
  _ : right_id idm operator
}.Structure law := Law {
  operator : T -> T -> T;
  _ : associative operator;
  _ : left_id idm operator;
  _ : right_id idm operator
}.Structure com_law := ComLaw {
   com_operator : law;
   _ : commutative com_operator
}.Structure com_law := ComLaw {
   com_operator : law;
   _ : commutative com_operator
}.Structure com_law := ComLaw {
   com_operator : law;
   _ : commutative com_operator
}.Structure mul_law := MulLaw {
  mul_operator : T -> T -> T;
  _ : left_zero idm mul_operator;
  _ : right_zero idm mul_operator
}.Structure mul_law := MulLaw {
  mul_operator : T -> T -> T;
  _ : left_zero idm mul_operator;
  _ : right_zero idm mul_operator
}.Structure mul_law := MulLaw {
  mul_operator : T -> T -> T;
  _ : left_zero idm mul_operator;
  _ : right_zero idm mul_operator
}.Structure add_law (mul : T -> T -> T) := AddLaw {
  add_operator : com_law;
  _ : left_distributive mul add_operator;
  _ : right_distributive mul add_operator
}.Structure add_law (mul : T -> T -> T) := AddLaw {
  add_operator : com_law;
  _ : left_distributive mul add_operator;
  _ : right_distributive mul add_operator
}.Structure add_law (mul : T -> T -> T) := AddLaw {
  add_operator : com_law;
  _ : left_distributive mul add_operator;
  _ : right_distributive mul add_operator
}.Notation "[ 'add_law' m 'of' a ]" := (@clone_add_law _ _ m a _ _ id id _ _ id)
  (at level 0, format "[ 'add_law'  m  'of'  a ]") : form_scope.

(* Specifications: *)
Lemma mulC_id : left_id one mul -> right_id one mul.
Lemma mulC_zero : left_zero zero mul -> right_zero zero mul.
Lemma mulC_dist : left_distributive mul add -> right_distributive mul add.
Lemma mul1m : left_id idm mul.
Lemma mulm1 : right_id idm mul.
Lemma mulmA : associative mul.
Lemma iteropE n x : iterop n mul x idm = iter n (mul x) idm.
Lemma mulmC : commutative mul.
Lemma mulmCA : left_commutative mul.
Lemma mulmAC : right_commutative mul.
Lemma mulmACA : interchange mul mul.
Lemma mul0m : left_zero idm mul.
Lemma mulm0 : right_zero idm mul.
Lemma addmA : associative add.
Lemma addmC : commutative add.
Lemma addmCA : left_commutative add.
Lemma addmAC : right_commutative add.
Lemma add0m : left_id idm add.
Lemma addm0 : right_id idm add.
Lemma mulm_addl : left_distributive mul add.
Lemma mulm_addr : right_distributive mul add.