Definition CPowR0 (z : Z) (r : Rcst) :=
Z.ltb z Z0 && Qeq_bool (Q_of_Rcst r) (0 # 1).
Fixpoint R_of_Rcst (r : Rcst) : R :=
match r with
| C0 => R0
| C1 => R1
| CZ z => IZR z
| CQ q => Q2R q
| CPlus r1 r2  => (R_of_Rcst r1) + (R_of_Rcst r2)
| CMinus r1 r2 => (R_of_Rcst r1) - (R_of_Rcst r2)
| CMult r1 r2  => (R_of_Rcst r1) * (R_of_Rcst r2)
| CPow r1 z    =>
match z with
| inl z =>
if CPowR0 z r1
then R0
else  powerRZ (R_of_Rcst r1) z
| inr n => pow (R_of_Rcst r1) n
end
| CInv r       =>
if CInvR0 r then R0
else Rinv (R_of_Rcst r)
| COpp r       => - (R_of_Rcst r)
end.
Add Morphism Q2R with signature Qeq ==> @eq R as Q2R_m.
exact Qeq_eqR.
Qed.

(* Specifications: *)
Lemma Q2R_pow_pos : forall q p,
Q2R (pow_pos Qmult q p) = pow_pos Rmult (Q2R q) p.
Lemma Q2R_pow_N : forall q n,
Q2R (pow_N 1%Q Qmult q n) = pow_N 1 Rmult (Q2R q) n.
Lemma Qmult_integral : forall q r, q * r ==  0 -> q == 0 \/ r == 0.
Lemma Qpower_positive_eq_zero : forall q p,
Qpower_positive q p == 0 -> q == 0.
Lemma Qpower_positive_zero : forall p,
Qpower_positive 0 p == 0%Q.
Lemma Q2RpowerRZ :
forall q z
(DEF : not (q == 0)%Q \/ (z >= Z0)%Z),
Q2R (q ^ z) = powerRZ (Q2R q) z.
Lemma Qpower0 : forall z, (z <> 0)%Z -> (0 ^ z == 0)%Q.
Lemma Q_of_RcstR : forall c, Q2R (Q_of_Rcst c) = R_of_Rcst c.
Definition INZ (n:N) : R :=
match n with
| N0 => IZR 0%Z
| Npos p => IZR (Zpos p)
end.