Record Semi_Ring_Constants [A:Set] : Set :=
{ SRplus : A -> A -> A;
SRmult : A -> A -> A;
SRone : A;
SRzero : A;
SReq : A -> A -> bool
}.
Record Semi_Ring_Theory [A:Set; C:(Semi_Ring_Theory A)] : Prop :=
{ SR_plus_sym : (n,m:A)[| n + m = m + n |];
SR_plus_assoc : (n,m,p:A)[| n + (m + p) = (n + m) + p |];
SR_mult_sym : (n,m:A)[| n*m = m*n |];
SR_mult_assoc : (n,m,p:A)[| n*(m*p) = (n*m)*p |];
SR_plus_zero_left :(n:A)[| 0 + n = n|];
SR_mult_one_left : (n:A)[| 1*n = n |];
SR_mult_zero_left : (n:A)[| 0*n = 0 |];
SR_distr_left : (n,m,p:A) [| (n + m)*p = n*p + m*p |];
SR_plus_reg_left : (n,m,p:A)[| n + m = n + p |] -> m=p;
}.
Record Ring_Constants [A:Set] : Set :=
{ Rplus : A -> A -> A;
Rmult : A -> A -> A;
Ropp: A -> A;
Rone : A;
Rzero : A;
Req : A -> A -> bool
}.
Record Ring_Theory [A:Set; C:(Ring_Constants A)] : Prop :=
{ Th_plus_sym : (n,m:A)[| n + m = m + n |];
Th_plus_assoc : (n,m,p:A)[| n + (m + p) = (n + m) + p |];
Th_mult_sym : (n,m:A)[| n*m = m*n |];
Th_mult_assoc : (n,m,p:A)[| n*(m*p) = (n*m)*p |];
Th_plus_zero_left :(n:A)[| 0 + n = n|];
Th_mult_one_left : (n:A)[| 1*n = n |];
Th_opp_def : (n:A) [| n + (-n) = 0 |];
Th_distr_left : (n,m,p:A) [| (n + m)*p = n*p + m*p |];
}.