#[global]
Instance CR_of_Q_morph_T
: forall {R : ConstructiveReals}, CMorphisms.Proper
(CMorphisms.respectful Qeq (CReq R)) (CR_of_Q R).

(* Specifications: *)
Lemma CR_of_Q_opp : forall {R : ConstructiveReals} (q : Q),
CR_of_Q R (-q) == - CR_of_Q R q.
Lemma CR_of_Q_pos : forall {R : ConstructiveReals} (q:Q),
Qlt 0 q -> 0 < CR_of_Q R q.
Lemma CR_of_Q_inv : forall {R : ConstructiveReals} (q : Q) (qPos : Qlt 0 q),
CR_of_Q R (/q)
== (/ CR_of_Q R q) (inr (CR_of_Q_pos q qPos)).
Lemma CRmult_le_0_compat : forall {R : ConstructiveReals} (a b : CRcarrier R),
0 <= a -> 0 <= b -> 0 <= a * b.
Lemma CRmult_le_compat_l : forall {R : ConstructiveReals} (r r1 r2:CRcarrier R),
0 <= r -> r1 <= r2 -> r * r1 <= r * r2.
Lemma CRmult_le_compat_r : forall {R : ConstructiveReals} (r r1 r2:CRcarrier R),
0 <= r -> r1 <= r2 -> r1 * r <= r2 * r.
Lemma CRmult_pos_pos
: forall {R : ConstructiveReals} (x y : CRcarrier R),
0 < x * y -> 0 <= x
-> 0 <= y -> 0 < x.
(* In particular x * y == 1 implies that 0 # x, 0 # y and that x and y are inverses of each other. *)
Lemma CRmult_pos_appart_zero
: forall {R : ConstructiveReals} (x y : CRcarrier R),
0 < x * y -> 0 ≶ x.
Lemma CRmult_le_reg_l :
forall {R : ConstructiveReals} (x y z : CRcarrier R),
0 < x -> x * y <= x * z -> y <= z.
Lemma CRmult_le_reg_r :
forall {R : ConstructiveReals} (x y z : CRcarrier R),
0 < x -> y * x <= z * x -> y <= z.