(* Syntactic ring coefficients. *)
Inductive Rcst :=
| C0
| C1
| CQ (r : Q)
| CZ (r : Z)
| CPlus (r1 r2 : Rcst)
| CMinus (r1  r2 : Rcst)
| CMult (r1 r2 : Rcst)
| CPow  (r1 : Rcst) (z:Z+nat)
| CInv  (r : Rcst)
| COpp  (r : Rcst).
Register Rcst   as micromega.Rcst.type.
Register C0     as micromega.Rcst.C0.
Register C1     as micromega.Rcst.C1.
Register CQ     as micromega.Rcst.CQ.
Register CZ     as micromega.Rcst.CZ.
Register CPlus  as micromega.Rcst.CPlus.
Register CMinus as micromega.Rcst.CMinus.
Register CMult  as micromega.Rcst.CMult.
Register CPow   as micromega.Rcst.CPow.
Register CInv   as micromega.Rcst.CInv.
Register COpp   as micromega.Rcst.COpp.
Definition z_of_exp (z : Z + nat) :=
match z with
| inl z => z
| inr n => Z.of_nat n
end.
Fixpoint Q_of_Rcst (r : Rcst) : Q :=
match r with
| C0 => 0 # 1
| C1 => 1 # 1
| CZ z => z # 1
| CQ q => q
| CPlus r1 r2 => Qplus (Q_of_Rcst r1) (Q_of_Rcst r2)
| CMinus r1 r2 => Qminus (Q_of_Rcst r1) (Q_of_Rcst r2)
| CMult r1 r2  => Qmult (Q_of_Rcst r1) (Q_of_Rcst r2)
| CPow  r1 z   => Qpower (Q_of_Rcst r1) (z_of_exp z)
| CInv r       => Qinv (Q_of_Rcst r)
| COpp r       => Qopp (Q_of_Rcst r)
end.
Definition is_neg (z: Z+nat) :=
match z with
| inl (Zneg _) => true
|  _           => false
end.

(* Specifications: *)
Lemma is_neg_true : forall z, is_neg z = true -> (z_of_exp z < 0)%Z.
Lemma is_neg_false : forall z, is_neg z = false -> (z_of_exp z >= 0)%Z.
Definition CInvR0 (r : Rcst) := Qeq_bool (Q_of_Rcst r) (0 # 1).