unfold divide in |- *; intros.
split.
(* A d *)
elim H0; trivial.
split.
(* A (a+b) *)
elim H; intros; elim H3; intros; elim H4; intros.
elim H0; intros; elim H9; intros; elim H1; intros; elim H13; intros.
exact (H6 a b H10 H14).
(* a+b = 0 or d <> 0 and a+b = d*q *)
elim H; intros; elim H3; intros; elim H4; intros; elim H5; intros.
elim H7; intros; elim H9; intros; elim H11; intros; elim H14; intros.
clear H H2 H3 H4 H5 H7 H8 H9 H10 H11 H12 H14 H15 H16.
elim H0; intros; elim H2; intros; clear H H0 H2.
elim H1; intros; elim H0; intros; clear H H0 H1.
(* a = 0 *)
elim H4; intros. rewrite H.
elim (H17 b H2); intros. rewrite H1.
exact H5.
(* b = 0 *)
elim H5; intros. rewrite H0.
elim (H17 a H3); intros. rewrite H1.
exact H4. clear H2 H3 H4 H5 H17.
(* a <> 0 & b <> 0 *)
right.
elim H; intros; elim H2; intros; elim H3; intros; clear H H2 H3.
elim H0; intros; elim H2; intros; elim H3; intros; clear H H0 H2 H3.
split.
exact H1. clear H1.
exists (Add x x0).
split.
exact (H6 x x0 H4 H7).
elim (H13 d x x0); intros. clear H4 H6 H7 H13.
rewrite H0. clear H H0.
elim H5; elim H8; reflexivity.
Qed.

(* Specifications: *)
(***************)
Theorem div_mult :
is_ring -> forall a b d : S, divide d a -> A b -> divide d (Mult a b).