(* Quicker than autorewrite with Esimpl :-) *)
 Ltac Esimpl := try rewrite_db Esimpl; rsimpl; simpl.

(* Specifications: *)
Lemma PaddC_ok c P l : (PaddC P c)@l == P@l + [c].
Lemma PsubC_ok c P l : (PsubC P c)@l == P@l - [c].
Lemma PmulC_aux_ok c P l : (PmulC_aux P c)@l == P@l * [c].
Lemma PmulC_ok c P l : (PmulC P c)@l == P@l * [c].
Lemma Popp_ok P l : (--P)@l == - P@l.
Lemma PaddX_ok P' P k l : (forall P l, (P++P')@l == P@l + P'@l) -> (PaddX Padd P' k P) @ l == P@l + P'@l * (hd l)^k.
Lemma Padd_ok P' P l : (P ++ P')@l == P@l + P'@l.
Lemma PsubX_ok P' P k l : (forall P l, (P--P')@l == P@l - P'@l) -> (PsubX Psub P' k P) @ l == P@l - P'@l * (hd l)^k.
Lemma Psub_ok P' P l : (P -- P')@l == P@l - P'@l.
Lemma PmulI_ok P' : (forall P l, (Pmul P P') @ l == P @ l * P' @ l) -> forall P p l, (PmulI Pmul P' p P) @ l == P @ l * P' @ (jump p l).
Lemma Pmul_ok P P' l : (P**P')@l == P@l * P'@l.
Lemma Psquare_ok P l : (Psquare P)@l == P@l * P@l.
Lemma Mphi_morph M e1 e2 : (forall x, e1 x = e2 x) -> M @@ e1 = M @@ e2.
Lemma Mjump_xO_tail M p l : M @@ (jump (xO p) (tail l)) = M @@ (jump (xI p) l).
Lemma Mjump_pred_double M p l : M @@ (jump (Pos.pred_double p) (tail l)) = M @@ (jump (xO p) l).
Lemma Mjump_add M i j l : M @@ (jump (i + j) l) = M @@ (jump j (jump i l)).
Lemma mkZmon_ok M j l : (mkZmon j M) @@ l == (zmon j M) @@ l.
Lemma zmon_pred_ok M j l : (zmon_pred j M) @@ (tail l) == (zmon j M) @@ l.
Lemma mkVmon_ok M i l : (mkVmon i M)@@l == M@@l * (hd l)^i.