unfold divide in |- *; intros.
(* A d *)
elim H0; intros. split. exact H2. clear H0 H2.
(* A (a*b) *)
elim H; intros; elim H2; intros; elim H5; intros; elim H7; intros.
clear H0 H2 H4 H5 H7 H9.
elim H3; intros.
split. exact (H6 a b H0 H1). clear H0 H3.
(* a*b = 0 or d <> 0 and a*b = d*q *)
(* a = 0 *)
elim H2; intros. rewrite H0.
elim (mult_O H b H1); intros. rewrite H4. left; reflexivity. clear H H2.
(* a <> 0 *)
right.
elim H0; intros; elim H2; intros. split. exact H.
exists (Mult x b).
elim H3; intros. split. exact (H6 x b H4 H1).
rewrite (H8 d x b). elim H5; reflexivity.
Qed.

(**************)
Theorem div_opp : is_ring -> forall a d : S, divide d a -> divide d (Opp a).
unfold divide in |- *; intros.