Section Lemmas.
Variable R : INTEGRAL_DOMAIN.
exact (idomain_prf R).
Qed.
intros x y H'; try assumption.
generalize (INTEGRAL_DOMAIN_prop_rev (x:=x) (y:=y)).
apply NNPP; tauto.
Qed.
unfold not in |- *.
intros x y H' H'0; try assumption.
absurd (Equal (ring_mult x y) (monoid_unit R)); auto with algebra.
apply Trans with (ring_mult (monoid_unit R) y); auto with algebra.
Qed.
unfold not in |- *.
intros x y H' H'0; try assumption.
absurd (Equal (ring_mult x y) (monoid_unit R)); auto with algebra.
apply Trans with (ring_mult x (monoid_unit R)); auto with algebra.
Qed.
intros x y H' H'0; try assumption.
intuition.
elim (INTEGRAL_DOMAIN_prop (x:=x) (y:=y)); auto with algebra.
intros H'1; try assumption.
absurd (Equal y (monoid_unit R)); auto with algebra.
Qed.
intros x y H' H'0; try assumption.
elim (INTEGRAL_DOMAIN_prop (x:=x) (y:=y)); auto with algebra.
intros H'1; try assumption.
absurd (Equal x (monoid_unit R)); auto with algebra.
Qed.
Hint Resolve INTEGRAL_DOMAIN_prop INTEGRAL_DOMAIN_prop_rev
INTEGRAL_DOMAIN_mult_l INTEGRAL_DOMAIN_mult_r INTEGRAL_DOMAIN_mult_n0_l
INTEGRAL_DOMAIN_mult_n0_r: algebra.
intros x y z H' H'0; try assumption.
cut
(Equal (ring_mult (sgroup_law R x (group_inverse R y)) z) (monoid_unit R)).
intros H'1; try assumption.
cut (Equal (sgroup_law R x (group_inverse R y)) (monoid_unit R)).
intros H'2; try assumption.
apply GROUP_reg_right with (group_inverse R y); auto with algebra.
apply Trans with (monoid_unit R); auto with algebra.
apply INTEGRAL_DOMAIN_mult_n0_r with z; auto with algebra.
apply
Trans with (sgroup_law R (ring_mult x z) (ring_mult (group_inverse R y) z));
auto with algebra.
apply
Trans with (sgroup_law R (ring_mult x z) (group_inverse R (ring_mult y z)));
auto with algebra.
apply
Trans with (sgroup_law R (ring_mult x z) (group_inverse R (ring_mult x z)));
auto with algebra.
Qed.
intros x y z H' H'0; try assumption.
cut
(Equal (ring_mult z (sgroup_law R x (group_inverse R y))) (monoid_unit R)).
intros H'1; try assumption.
cut (Equal (sgroup_law R x (group_inverse R y)) (monoid_unit R)).
intros H'2; try assumption.
apply GROUP_reg_right with (group_inverse R y); auto with algebra.
apply Trans with (monoid_unit R); auto with algebra.
apply INTEGRAL_DOMAIN_mult_n0_l with z; auto with algebra.
apply
Trans with (sgroup_law R (ring_mult z x) (ring_mult z (group_inverse R y)));
auto with algebra.
apply
Trans with (sgroup_law R (ring_mult z x) (group_inverse R (ring_mult z y)));
auto with algebra.
apply
Trans with (sgroup_law R (ring_mult z x) (group_inverse R (ring_mult z x)));
auto with algebra.
Qed.
intros x y z H'; try assumption.
cut
(Equal (ring_mult (sgroup_law R x (group_inverse R y)) z) (monoid_unit R)).
intros H'0; try assumption.
elim (INTEGRAL_DOMAIN_prop (x:=sgroup_law R x (group_inverse R y)) (y:=z));
auto with algebra.
intros H'1; try assumption.
left; try assumption.
apply GROUP_reg_right with (group_inverse R y); auto with algebra.
apply Trans with (monoid_unit R); auto with algebra.
apply
Trans with (sgroup_law R (ring_mult x z) (ring_mult (group_inverse R y) z));
auto with algebra.
apply
Trans with (sgroup_law R (ring_mult x z) (group_inverse R (ring_mult y z)));
auto with algebra.
apply
Trans with (sgroup_law R (ring_mult x z) (group_inverse R (ring_mult x z)));
auto with algebra.
Qed.

Lemma INTEGRAL_DOMAIN_mult_eq_l :
forall x y z : R,
Equal (ring_mult z x) (ring_mult z y) ->
Equal x y \/ Equal z (monoid_unit R).