Definition CRmorph_compose {R1 R2 R3 : ConstructiveReals}
(f : @ConstructiveRealsMorphism R1 R2)
(g : @ConstructiveRealsMorphism R2 R3)
: @ConstructiveRealsMorphism R1 R3.

(* Specifications: *)
Lemma CRmorph_le_inv : forall {R1 R2 : ConstructiveReals}
(f : @ConstructiveRealsMorphism R1 R2)
(x y : CRcarrier R1),
CRmorph f x <= CRmorph f y -> x <= y.
Lemma CRmorph_zero : forall {R1 R2 : ConstructiveReals}
(f : @ConstructiveRealsMorphism R1 R2),
CRmorph f 0 == 0.
Lemma CRmorph_one : forall {R1 R2 : ConstructiveReals}
(f : @ConstructiveRealsMorphism R1 R2),
CRmorph f 1 == 1.
Lemma CRmorph_opp : forall {R1 R2 : ConstructiveReals}
(f : @ConstructiveRealsMorphism R1 R2)
(x : CRcarrier R1),
CRmorph f (- x) == - CRmorph f x.
Lemma CRplus_pos_rat_lt : forall {R : ConstructiveReals} (x : CRcarrier R) (q : Q),
Qlt 0 q -> CRlt R x (CRplus R x (CR_of_Q R q)).
Lemma CRplus_neg_rat_lt : forall {R : ConstructiveReals} (x : CRcarrier R) (q : Q),
Qlt q 0 -> CRlt R (CRplus R x (CR_of_Q R q)) x.
Lemma CRmorph_plus_rat : forall {R1 R2 : ConstructiveReals}
(f : @ConstructiveRealsMorphism R1 R2)
(x : CRcarrier R1) (q : Q),
CRmorph f (CRplus R1 x (CR_of_Q R1 q))
== CRplus R2 (CRmorph f x) (CR_of_Q R2 q).
Lemma CRmorph_plus : forall {R1 R2 : ConstructiveReals}
(f : @ConstructiveRealsMorphism R1 R2)
(x y : CRcarrier R1),
CRmorph f (CRplus R1 x y)
== CRplus R2 (CRmorph f x) (CRmorph f y).
Lemma CRmorph_mult_pos : forall {R1 R2 : ConstructiveReals}
(f : @ConstructiveRealsMorphism R1 R2)
(x : CRcarrier R1) (n : nat),
CRmorph f (CRmult R1 x (CR_of_Q R1 (Z.of_nat n # 1)))
== CRmult R2 (CRmorph f x) (CR_of_Q R2 (Z.of_nat n # 1)).
Lemma NatOfZ : forall n : Z, { p : nat | n = Z.of_nat p \/ n = Z.opp (Z.of_nat p) }.
Lemma CRmorph_mult_int : forall {R1 R2 : ConstructiveReals}
(f : @ConstructiveRealsMorphism R1 R2)
(x : CRcarrier R1) (n : Z),
CRmorph f (CRmult R1 x (CR_of_Q R1 (n # 1)))
== CRmult R2 (CRmorph f x) (CR_of_Q R2 (n # 1)).
Lemma CRmorph_mult_inv : forall {R1 R2 : ConstructiveReals}
(f : @ConstructiveRealsMorphism R1 R2)
(x : CRcarrier R1) (p : positive),
CRmorph f (CRmult R1 x (CR_of_Q R1 (1 # p)))
== CRmult R2 (CRmorph f x) (CR_of_Q R2 (1 # p)).
Lemma CRmorph_mult_rat : forall {R1 R2 : ConstructiveReals}
(f : @ConstructiveRealsMorphism R1 R2)
(x : CRcarrier R1) (q : Q),
CRmorph f (CRmult R1 x (CR_of_Q R1 q))
== CRmult R2 (CRmorph f x) (CR_of_Q R2 q).
Lemma CRmorph_mult_pos_pos_le : forall {R1 R2 : ConstructiveReals}
(f : @ConstructiveRealsMorphism R1 R2)
(x y : CRcarrier R1),
CRlt R1 0 y
-> CRmult R2 (CRmorph f x) (CRmorph f y)
<= CRmorph f (CRmult R1 x y).
Lemma CRmorph_mult_pos_pos : forall {R1 R2 : ConstructiveReals}
(f : @ConstructiveRealsMorphism R1 R2)
(x y : CRcarrier R1),
CRlt R1 0 y
-> CRmorph f (CRmult R1 x y)
== CRmult R2 (CRmorph f x) (CRmorph f y).
Lemma CRmorph_mult : forall {R1 R2 : ConstructiveReals}
(f : @ConstructiveRealsMorphism R1 R2)
(x y : CRcarrier R1),
CRmorph f (CRmult R1 x y)
== CRmult R2 (CRmorph f x) (CRmorph f y).
Lemma CRmorph_appart : forall {R1 R2 : ConstructiveReals}
(f : @ConstructiveRealsMorphism R1 R2)
(x y : CRcarrier R1)
(app : x ≶ y),
CRmorph f x ≶ CRmorph f y.
Lemma CRmorph_rat_cv
: forall {R1 R2 : ConstructiveReals}
(qn : nat -> Q),
CR_cauchy R1 (fun n => CR_of_Q R1 (qn n))
-> CR_cauchy R2 (fun n => CR_of_Q R2 (qn n)).