Section Lemmas.
Variable R : RING.
exact (sgroup_assoc_prf (E:=R) (ring_monoid R)).
Qed.
unfold ring_mult in |- *; auto with algebra.
Qed.
exact (monoid_unit_r_prf (ring_monoid R)).
Qed.
exact (monoid_unit_l_prf (ring_monoid R)).
Qed.
exact (ring_dist_r_prf R).
Qed.
exact (ring_dist_l_prf R).
Qed.
Hint Resolve RING_assoc RING_comp RING_unit_r RING_unit_l RING_dist_r
RING_dist_l: algebra.
intros x; try assumption.
apply GROUP_reg_right with (ring_mult x (monoid_unit R)).
apply Trans with (ring_mult x (sgroup_law R (monoid_unit R) (monoid_unit R)));
auto with algebra.
apply Trans with (ring_mult x (monoid_unit R)); auto with algebra.
Qed.
Hint Resolve RING_absorbant_r: algebra.
intros x; try assumption.
apply GROUP_reg_right with (ring_mult (monoid_unit R) x).
apply Trans with (ring_mult (sgroup_law R (monoid_unit R) (monoid_unit R)) x);
auto with algebra.
apply Trans with (ring_mult (monoid_unit R) x); auto with algebra.
Qed.
Hint Resolve RING_absorbant_l: algebra.
intros x y; try assumption.
apply Sym.
apply GROUP_law_inverse.
apply Trans with (ring_mult (sgroup_law R x (group_inverse R x)) y);
auto with algebra.
apply Trans with (ring_mult (monoid_unit R) y); auto with algebra.
Qed.
Hint Resolve RING_op_mult_l: algebra.

Lemma RING_op_mult_r :
forall x y : R,
Equal (ring_mult x (group_inverse R y)) (group_inverse R (ring_mult x y)).