intros d; elim d; simpl in |- *; auto.
intros n H' a b; case (le_lt_dec (pmon1 (S n) b) (pmon1 (S n) a));
simpl in |- *; auto.
2: intros H'0 H'1; inversion H'1.
intros l; generalize (H' (pmon2 (S n) a) (pmon2 (S n) b)).
case (div_mon_clean n (pmon2 (S n) a) (pmon2 (S n) b)); simpl in |- *; auto.
intros m b' H1 H2.
case (H1 H2); intros H3 H4; split; auto.
rewrite H3; auto.
rewrite (plus_comm (pmon1 (S n) a - pmon1 (S n) b) (pmon1 (S n) b)).
rewrite <- (le_plus_minus (pmon1 (S n) b) (pmon1 (S n) a)); auto.
rewrite H4; auto.
try exact (proj_ok n a).
Qed.
Definition ppcm_mon : forall d : nat, mon d -> mon d -> mon d.
intros d; elim d.
intros m1 m2; exact n_0.
intros n Rec S1 S2.
exact
(c_n n (max (pmon1 (S n) S1) (pmon1 (S n) S2))
(Rec (pmon2 (S n) S1) (pmon2 (S n) S2))).
Defined.

(* Specifications: *)
Theorem ppcm_com :
forall (d : nat) (a b : mon d), ppcm_mon d a b = ppcm_mon d b a.