intros x y; left.
rewrite (mon_0 x); rewrite (mon_0 y); auto.
intros n H' x y.
elim (eq_nat_dec (pmon1 (S n) x) (pmon1 (S n) y)); intros H'2.
elim (H' (pmon2 (S n) x) (pmon2 (S n) y)); intros H'3.
left.
rewrite <- (proj_ok n x).
rewrite <- (proj_ok n y).
rewrite H'3; rewrite H'2; auto.
right; rewrite <- (proj_ok n x); rewrite <- (proj_ok n y); red in |- *;
intros H'0.
apply H'3.
change
(pmon2 (S n) (c_n n (pmon1 (S n) x) (pmon2 (S n) x)) =
pmon2 (S n) (c_n n (pmon1 (S n) y) (pmon2 (S n) y)) :>
mon n) in |- *.
rewrite H'0; auto.
right; red in |- *; rewrite <- (proj_ok n x); rewrite <- (proj_ok n y);
intros H'0; apply H'2; injection H'0; auto.
Qed.

(* Specifications: *)
Theorem mult_div_com :
forall (d : nat) (a b : mon d), div_mon d (mult_mon d a b) b = a.