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

(* Specifications: *)
Lemma CRmorph_le : forall {R1 R2 : ConstructiveReals} (f : @ConstructiveRealsMorphism R1 R2) (x y : CRcarrier R1), x <= y -> CRmorph f x <= CRmorph f y.
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_appart_zero : forall {R1 R2 : ConstructiveReals} (f : @ConstructiveRealsMorphism R1 R2) (x : CRcarrier R1) (app : x ≶ 0), CRmorph f x ≶ 0.
Lemma CRmorph_inv : forall {R1 R2 : ConstructiveReals} (f : @ConstructiveRealsMorphism R1 R2) (x : CRcarrier R1) (xnz : x ≶ 0) (fxnz : CRmorph f x ≶ 0), CRmorph f ((/ x) xnz) == (/ CRmorph f x) fxnz.
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)).