(* === is a morphism *)

Instance PEadd_ext : Proper (NPEequiv ==> NPEequiv ==> NPEequiv) (@PEadd C).Instance PEsub_ext : Proper (NPEequiv ==> NPEequiv ==> NPEequiv) (@PEsub C).Instance PEmul_ext : Proper (NPEequiv ==> NPEequiv ==> NPEequiv) (@PEmul C).Instance PEopp_ext : Proper (NPEequiv ==> NPEequiv) (@PEopp C).Instance PEpow_ext : Proper (NPEequiv ==> eq ==> NPEequiv) (@PEpow C).

(* Specifications: *)
Lemma PE_1_l (e : PExpr C) : (1 * e === e)%poly.
Lemma PE_1_r (e : PExpr C) : (e * 1 === e)%poly.
Lemma PEpow_0_r (e : PExpr C) : (e ^ 0 === 1)%poly.
Lemma PEpow_1_r (e : PExpr C) : (e ^ 1 === e)%poly.
Lemma PEpow_1_l n : (1 ^ n === 1)%poly.
Lemma PEpow_add_r (e : PExpr C) n n' : (e ^ (n+n') === e ^ n * e ^ n')%poly.
Lemma PEpow_mul_l (e e' : PExpr C) n : ((e * e') ^ n === e ^ n * e' ^ n)%poly.
Lemma PEpow_mul_r (e : PExpr C) n n' : (e ^ (n * n') === (e ^ n) ^ n')%poly.
Lemma PEpow_nz l e n : ~ e @ l == 0 -> ~ (e^n) @ l == 0.