From ad91d136b8d51e859ce3b959674757818e753bcb Mon Sep 17 00:00:00 2001
From: Vincent Semeria
Date: Sun, 1 Mar 2020 17:30:57 +0100
Subject: Cleanup stdlib reals. Use implicit arguments for ConstructiveReals.
Move ConstructiveReals into new directory Abstract. Remove imports of
implementations inside those Abstract files.
Add changelog for constructive reals cleanup
Move Cauchy reals into new directory Cauchy
Update stdlib index
Rename sum_f_R0
Use coqdoc comments
Update doc/changelog/10-standard-library/11725-cleanup-reals.rst
Co-Authored-By: Hugo Herbelin
Update doc/changelog/10-standard-library/11725-cleanup-reals.rst
Co-Authored-By: Hugo Herbelin
Update doc/changelog/10-standard-library/11725-cleanup-reals.rst
Co-Authored-By: Hugo Herbelin
Improve notations
---
.../10-standard-library/11725-cleanup-reals.rst | 6 +
doc/stdlib/index-list.html.template | 16 +-
theories/Reals/Abstract/ConstructiveAbs.v | 950 +++++++++++++
theories/Reals/Abstract/ConstructiveLUB.v | 413 ++++++
theories/Reals/Abstract/ConstructiveLimits.v | 933 ++++++++++++
theories/Reals/Abstract/ConstructiveReals.v | 1149 +++++++++++++++
.../Reals/Abstract/ConstructiveRealsMorphisms.v | 1177 +++++++++++++++
theories/Reals/Abstract/ConstructiveSum.v | 348 +++++
theories/Reals/Cauchy/ConstructiveCauchyAbs.v | 887 ++++++++++++
theories/Reals/Cauchy/ConstructiveCauchyReals.v | 1351 ++++++++++++++++++
.../Reals/Cauchy/ConstructiveCauchyRealsMult.v | 1503 ++++++++++++++++++++
theories/Reals/Cauchy/ConstructiveRcomplete.v | 446 ++++++
theories/Reals/ConstructiveCauchyReals.v | 1348 ------------------
theories/Reals/ConstructiveCauchyRealsMult.v | 1415 ------------------
theories/Reals/ConstructiveRcomplete.v | 382 -----
theories/Reals/ConstructiveReals.v | 835 -----------
theories/Reals/ConstructiveRealsLUB.v | 318 -----
theories/Reals/ConstructiveRealsMorphisms.v | 1158 ---------------
theories/Reals/Raxioms.v | 4 +-
19 files changed, 9175 insertions(+), 5464 deletions(-)
create mode 100644 doc/changelog/10-standard-library/11725-cleanup-reals.rst
create mode 100644 theories/Reals/Abstract/ConstructiveAbs.v
create mode 100644 theories/Reals/Abstract/ConstructiveLUB.v
create mode 100644 theories/Reals/Abstract/ConstructiveLimits.v
create mode 100644 theories/Reals/Abstract/ConstructiveReals.v
create mode 100644 theories/Reals/Abstract/ConstructiveRealsMorphisms.v
create mode 100644 theories/Reals/Abstract/ConstructiveSum.v
create mode 100644 theories/Reals/Cauchy/ConstructiveCauchyAbs.v
create mode 100644 theories/Reals/Cauchy/ConstructiveCauchyReals.v
create mode 100644 theories/Reals/Cauchy/ConstructiveCauchyRealsMult.v
create mode 100644 theories/Reals/Cauchy/ConstructiveRcomplete.v
delete mode 100644 theories/Reals/ConstructiveCauchyReals.v
delete mode 100644 theories/Reals/ConstructiveCauchyRealsMult.v
delete mode 100644 theories/Reals/ConstructiveRcomplete.v
delete mode 100644 theories/Reals/ConstructiveReals.v
delete mode 100644 theories/Reals/ConstructiveRealsLUB.v
delete mode 100644 theories/Reals/ConstructiveRealsMorphisms.v
diff --git a/doc/changelog/10-standard-library/11725-cleanup-reals.rst b/doc/changelog/10-standard-library/11725-cleanup-reals.rst
new file mode 100644
index 0000000000..84a8ceb514
--- /dev/null
+++ b/doc/changelog/10-standard-library/11725-cleanup-reals.rst
@@ -0,0 +1,6 @@
+- **Changed:**
+Use implicit arguments for ``ConstructiveReals``. Move ``ConstructiveReals``
+ into new directory ``Abstract``. Remove imports of implementations inside
+ those ``Abstract`` files. Move implementation by means of Cauchy sequences in new directory ``Cauchy``.
+ (`#11725 `_,
+ by Vincent Semeria).
diff --git a/doc/stdlib/index-list.html.template b/doc/stdlib/index-list.html.template
index 0f05237036..e64b4be454 100644
--- a/doc/stdlib/index-list.html.template
+++ b/doc/stdlib/index-list.html.template
@@ -528,13 +528,17 @@ through the Require Import command.
theories/Reals/Rdefinitions.v
- theories/Reals/ConstructiveReals.v
- theories/Reals/ConstructiveRealsMorphisms.v
- theories/Reals/ConstructiveCauchyReals.v
- theories/Reals/ConstructiveCauchyRealsMult.v
+ theories/Reals/Cauchy/ConstructiveCauchyReals.v
+ theories/Reals/Cauchy/ConstructiveCauchyRealsMult.v
+ theories/Reals/Cauchy/ConstructiveCauchyAbs.v
theories/Reals/ClassicalDedekindReals.v
theories/Reals/Raxioms.v
- theories/Reals/ConstructiveRealsLUB.v
+ theories/Reals/Abstract/ConstructiveReals.v
+ theories/Reals/Abstract/ConstructiveRealsMorphisms.v
+ theories/Reals/Abstract/ConstructiveLUB.v
+ theories/Reals/Abstract/ConstructiveAbs.v
+ theories/Reals/Abstract/ConstructiveLimits.v
+ theories/Reals/Abstract/ConstructiveSum.v
theories/Reals/RIneq.v
theories/Reals/DiscrR.v
theories/Reals/ROrderedType.v
@@ -579,7 +583,7 @@ through the Require Import command.
theories/Reals/Ranalysis5.v
theories/Reals/Ranalysis_reg.v
theories/Reals/Rcomplete.v
- theories/Reals/ConstructiveRcomplete.v
+ theories/Reals/Cauchy/ConstructiveRcomplete.v
theories/Reals/RiemannInt.v
theories/Reals/RiemannInt_SF.v
theories/Reals/Rpow_def.v
diff --git a/theories/Reals/Abstract/ConstructiveAbs.v b/theories/Reals/Abstract/ConstructiveAbs.v
new file mode 100644
index 0000000000..a98cd7d44a
--- /dev/null
+++ b/theories/Reals/Abstract/ConstructiveAbs.v
@@ -0,0 +1,950 @@
+(************************************************************************)
+(* * The Coq Proof Assistant / The Coq Development Team *)
+(* v * INRIA, CNRS and contributors - Copyright 1999-2019 *)
+(* CReq R
+ as CRabs_morph_prop.
+Proof.
+ intros. apply CRabs_morph, H.
+Qed.
+
+Lemma CRabs_right : forall {R : ConstructiveReals} (x : CRcarrier R),
+ 0 <= x -> CRabs R x == x.
+Proof.
+ intros. split.
+ - pose proof (CRabs_def R x (CRabs R x)) as [_ H1].
+ apply H1, CRle_refl.
+ - rewrite <- CRabs_def. split. apply CRle_refl.
+ apply (CRle_trans _ (CRzero R)). 2: exact H.
+ apply (CRle_trans _ (CRopp R (CRzero R))).
+ intro abs. apply CRopp_lt_cancel in abs. contradiction.
+ apply (CRplus_le_reg_l (CRzero R)).
+ apply (CRle_trans _ (CRzero R)). apply CRplus_opp_r.
+ apply CRplus_0_r.
+Qed.
+
+Lemma CRabs_opp : forall {R : ConstructiveReals} (x : CRcarrier R),
+ CRabs R (- x) == CRabs R x.
+Proof.
+ intros. split.
+ - rewrite <- CRabs_def. split.
+ + pose proof (CRabs_def R (CRopp R x) (CRabs R (CRopp R x))) as [_ H1].
+ specialize (H1 (CRle_refl (CRabs R (CRopp R x)))) as [_ H1].
+ apply (CRle_trans _ (CRopp R (CRopp R x))).
+ 2: exact H1. apply (CRopp_involutive x).
+ + pose proof (CRabs_def R (CRopp R x) (CRabs R (CRopp R x))) as [_ H1].
+ apply H1, CRle_refl.
+ - rewrite <- CRabs_def. split.
+ + pose proof (CRabs_def R x (CRabs R x)) as [_ H1].
+ apply H1, CRle_refl.
+ + apply (CRle_trans _ x). apply CRopp_involutive.
+ pose proof (CRabs_def R x (CRabs R x)) as [_ H1].
+ apply H1, CRle_refl.
+Qed.
+
+Lemma CRabs_minus_sym : forall {R : ConstructiveReals} (x y : CRcarrier R),
+ CRabs R (x - y) == CRabs R (y - x).
+Proof.
+ intros R x y. setoid_replace (x - y) with (-(y-x)).
+ rewrite CRabs_opp. reflexivity. unfold CRminus.
+ rewrite CRopp_plus_distr, CRplus_comm, CRopp_involutive.
+ reflexivity.
+Qed.
+
+Lemma CRabs_left : forall {R : ConstructiveReals} (x : CRcarrier R),
+ x <= 0 -> CRabs R x == - x.
+Proof.
+ intros. rewrite <- CRabs_opp. apply CRabs_right.
+ rewrite <- CRopp_0. apply CRopp_ge_le_contravar, H.
+Qed.
+
+Lemma CRabs_triang : forall {R : ConstructiveReals} (x y : CRcarrier R),
+ CRabs R (x + y) <= CRabs R x + CRabs R y.
+Proof.
+ intros. rewrite <- CRabs_def. split.
+ - apply (CRle_trans _ (CRplus R (CRabs R x) y)).
+ apply CRplus_le_compat_r.
+ pose proof (CRabs_def R x (CRabs R x)) as [_ H1].
+ apply H1, CRle_refl.
+ apply CRplus_le_compat_l.
+ pose proof (CRabs_def R y (CRabs R y)) as [_ H1].
+ apply H1, CRle_refl.
+ - apply (CRle_trans _ (CRplus R (CRopp R x) (CRopp R y))).
+ apply CRopp_plus_distr.
+ apply (CRle_trans _ (CRplus R (CRabs R x) (CRopp R y))).
+ apply CRplus_le_compat_r.
+ pose proof (CRabs_def R x (CRabs R x)) as [_ H1].
+ apply H1, CRle_refl.
+ apply CRplus_le_compat_l.
+ pose proof (CRabs_def R y (CRabs R y)) as [_ H1].
+ apply H1, CRle_refl.
+Qed.
+
+Lemma CRabs_le : forall {R : ConstructiveReals} (a b:CRcarrier R),
+ (-b <= a /\ a <= b) -> CRabs R a <= b.
+Proof.
+ intros. pose proof (CRabs_def R a b) as [H0 _].
+ apply H0. split. apply H. destruct H.
+ rewrite <- (CRopp_involutive b).
+ apply CRopp_ge_le_contravar. exact H.
+Qed.
+
+Lemma CRabs_triang_inv : forall {R : ConstructiveReals} (x y : CRcarrier R),
+ CRabs R x - CRabs R y <= CRabs R (x - y).
+Proof.
+ intros. apply (CRplus_le_reg_r (CRabs R y)).
+ unfold CRminus. rewrite CRplus_assoc, CRplus_opp_l.
+ rewrite CRplus_0_r.
+ apply (CRle_trans _ (CRabs R (x - y + y))).
+ setoid_replace (x - y + y) with x. apply CRle_refl.
+ unfold CRminus. rewrite CRplus_assoc, CRplus_opp_l.
+ rewrite CRplus_0_r. reflexivity.
+ apply CRabs_triang.
+Qed.
+
+Lemma CRabs_triang_inv2 : forall {R : ConstructiveReals} (x y : CRcarrier R),
+ CRabs R (CRabs R x - CRabs R y) <= CRabs R (x - y).
+Proof.
+ intros. apply CRabs_le. split.
+ 2: apply CRabs_triang_inv.
+ apply (CRplus_le_reg_r (CRabs R y)).
+ unfold CRminus. rewrite CRplus_assoc, CRplus_opp_l.
+ rewrite CRplus_0_r. fold (x - y).
+ rewrite CRplus_comm, CRabs_minus_sym.
+ apply (CRle_trans _ _ _ (CRabs_triang_inv y (y-x))).
+ setoid_replace (y - (y - x)) with x. apply CRle_refl.
+ unfold CRminus. rewrite CRopp_plus_distr, <- CRplus_assoc.
+ rewrite CRplus_opp_r, CRplus_0_l. apply CRopp_involutive.
+Qed.
+
+Lemma CR_of_Q_abs : forall {R : ConstructiveReals} (q : Q),
+ CRabs R (CR_of_Q R q) == CR_of_Q R (Qabs q).
+Proof.
+ intros. destruct (Qlt_le_dec 0 q).
+ - apply (CReq_trans _ (CR_of_Q R q)).
+ apply CRabs_right. apply (CRle_trans _ (CR_of_Q R 0)).
+ apply CR_of_Q_zero. apply CR_of_Q_le. apply Qlt_le_weak, q0.
+ apply CR_of_Q_morph. symmetry. apply Qabs_pos, Qlt_le_weak, q0.
+ - apply (CReq_trans _ (CR_of_Q R (-q))).
+ apply (CReq_trans _ (CRabs R (CRopp R (CR_of_Q R q)))).
+ apply CReq_sym, CRabs_opp.
+ 2: apply CR_of_Q_morph; symmetry; apply Qabs_neg, q0.
+ apply (CReq_trans _ (CRopp R (CR_of_Q R q))).
+ 2: apply CReq_sym, CR_of_Q_opp.
+ apply CRabs_right. apply (CRle_trans _ (CR_of_Q R 0)).
+ apply CR_of_Q_zero.
+ apply (CRle_trans _ (CR_of_Q R (-q))). apply CR_of_Q_le.
+ apply (Qplus_le_l _ _ q). ring_simplify. exact q0.
+ apply CR_of_Q_opp.
+Qed.
+
+Lemma CRle_abs : forall {R : ConstructiveReals} (x : CRcarrier R),
+ x <= CRabs R x.
+Proof.
+ intros. pose proof (CRabs_def R x (CRabs R x)) as [_ H].
+ apply H, CRle_refl.
+Qed.
+
+Lemma CRabs_pos : forall {R : ConstructiveReals} (x : CRcarrier R),
+ 0 <= CRabs R x.
+Proof.
+ intros. intro abs. destruct (CRltLinear R). clear p.
+ specialize (s _ x _ abs). destruct s.
+ exact (CRle_abs x c). rewrite CRabs_left in abs.
+ rewrite <- CRopp_0 in abs. apply CRopp_lt_cancel in abs.
+ exact (CRlt_asym _ _ abs c). apply CRlt_asym, c.
+Qed.
+
+Lemma CRabs_appart_0 : forall {R : ConstructiveReals} (x : CRcarrier R),
+ 0 < CRabs R x -> CRapart R x 0.
+Proof.
+ intros. destruct (CRltLinear R). clear p.
+ pose proof (s _ x _ H) as [pos|neg].
+ right. exact pos. left.
+ destruct (CR_Q_dense R _ _ neg) as [q [H0 H1]].
+ destruct (Qlt_le_dec 0 q).
+ - destruct (s (CR_of_Q R (-q)) x 0).
+ rewrite <- CR_of_Q_zero. apply CR_of_Q_lt.
+ apply (Qplus_lt_l _ _ q). ring_simplify. exact q0.
+ exfalso. pose proof (CRabs_def R x (CR_of_Q R q)) as [H2 _].
+ apply H2. clear H2. split. apply CRlt_asym, H0.
+ 2: exact H1. rewrite <- Qopp_involutive, CR_of_Q_opp.
+ apply CRopp_ge_le_contravar, CRlt_asym, c. exact c.
+ - apply (CRlt_le_trans _ _ _ H0).
+ rewrite <- CR_of_Q_zero. apply CR_of_Q_le. exact q0.
+Qed.
+
+
+(* The proof by cases on the signs of x and y applies constructively,
+ because of the positivity hypotheses. *)
+Lemma CRabs_mult : forall {R : ConstructiveReals} (x y : CRcarrier R),
+ CRabs R (x * y) == CRabs R x * CRabs R y.
+Proof.
+ intro R.
+ assert (forall (x y : CRcarrier R),
+ CRapart R x 0
+ -> CRapart R y 0
+ -> CRabs R (x * y) == CRabs R x * CRabs R y) as prep.
+ { intros. destruct H, H0.
+ + rewrite CRabs_right, CRabs_left, CRabs_left.
+ rewrite <- CRopp_mult_distr_l, CRopp_mult_distr_r, CRopp_involutive.
+ reflexivity.
+ apply CRlt_asym, c0. apply CRlt_asym, c.
+ setoid_replace (x*y) with (- x * - y).
+ apply CRlt_asym, CRmult_lt_0_compat.
+ rewrite <- CRopp_0. apply CRopp_gt_lt_contravar, c.
+ rewrite <- CRopp_0. apply CRopp_gt_lt_contravar, c0.
+ rewrite <- CRopp_mult_distr_l, CRopp_mult_distr_r, CRopp_involutive.
+ reflexivity.
+ + rewrite CRabs_left, CRabs_left, CRabs_right.
+ rewrite <- CRopp_mult_distr_l. reflexivity.
+ apply CRlt_asym, c0. apply CRlt_asym, c.
+ rewrite <- (CRmult_0_l y).
+ apply CRmult_le_compat_r_half. exact c0.
+ apply CRlt_asym, c.
+ + rewrite CRabs_left, CRabs_right, CRabs_left.
+ rewrite <- CRopp_mult_distr_r. reflexivity.
+ apply CRlt_asym, c0. apply CRlt_asym, c.
+ rewrite <- (CRmult_0_r x).
+ apply CRmult_le_compat_l_half.
+ exact c. apply CRlt_asym, c0.
+ + rewrite CRabs_right, CRabs_right, CRabs_right. reflexivity.
+ apply CRlt_asym, c0. apply CRlt_asym, c.
+ apply CRlt_asym, CRmult_lt_0_compat; assumption. }
+ split.
+ - intro abs.
+ assert (0 < CRabs R x * CRabs R y).
+ { apply (CRle_lt_trans _ (CRabs R (x*y))).
+ apply CRabs_pos. exact abs. }
+ pose proof (CRmult_pos_appart_zero _ _ H).
+ rewrite CRmult_comm in H.
+ apply CRmult_pos_appart_zero in H.
+ destruct H. 2: apply (CRabs_pos y c).
+ destruct H0. 2: apply (CRabs_pos x c0).
+ apply CRabs_appart_0 in c.
+ apply CRabs_appart_0 in c0.
+ rewrite (prep x y) in abs.
+ exact (CRlt_asym _ _ abs abs). exact c0. exact c.
+ - intro abs.
+ assert (0 < CRabs R (x * y)).
+ { apply (CRle_lt_trans _ (CRabs R x * CRabs R y)).
+ rewrite <- (CRmult_0_l (CRabs R y)).
+ apply CRmult_le_compat_r.
+ apply CRabs_pos. apply CRabs_pos. exact abs. }
+ apply CRabs_appart_0 in H. destruct H.
+ + apply CRopp_gt_lt_contravar in c.
+ rewrite CRopp_0, CRopp_mult_distr_l in c.
+ pose proof (CRmult_pos_appart_zero _ _ c).
+ rewrite CRmult_comm in c.
+ apply CRmult_pos_appart_zero in c.
+ rewrite (prep x y) in abs.
+ exact (CRlt_asym _ _ abs abs).
+ destruct H. left. apply CRopp_gt_lt_contravar in c0.
+ rewrite CRopp_involutive, CRopp_0 in c0. exact c0.
+ right. apply CRopp_gt_lt_contravar in c0.
+ rewrite CRopp_involutive, CRopp_0 in c0. exact c0.
+ destruct c. right. exact c. left. exact c.
+ + pose proof (CRmult_pos_appart_zero _ _ c).
+ rewrite CRmult_comm in c.
+ apply CRmult_pos_appart_zero in c.
+ rewrite (prep x y) in abs.
+ exact (CRlt_asym _ _ abs abs).
+ destruct H. right. exact c0. left. exact c0.
+ destruct c. right. exact c. left. exact c.
+Qed.
+
+Lemma CRabs_lt : forall {R : ConstructiveReals} (x y : CRcarrier R),
+ CRabs _ x < y -> prod (x < y) (-x < y).
+Proof.
+ split.
+ - apply (CRle_lt_trans _ _ _ (CRle_abs x)), H.
+ - apply (CRle_lt_trans _ _ _ (CRle_abs (-x))).
+ rewrite CRabs_opp. exact H.
+Qed.
+
+Lemma CRabs_def1 : forall {R : ConstructiveReals} (x y : CRcarrier R),
+ x < y -> -x < y -> CRabs _ x < y.
+Proof.
+ intros. destruct (CRltLinear R), p.
+ destruct (s x (CRabs R x) y H). 2: exact c0.
+ rewrite CRabs_left. exact H0. intro abs.
+ rewrite CRabs_right in c0. exact (CRlt_asym x x c0 c0).
+ apply CRlt_asym, abs.
+Qed.
+
+Lemma CRabs_def2 : forall {R : ConstructiveReals} (x a:CRcarrier R),
+ CRabs _ x <= a -> (x <= a) /\ (- a <= x).
+Proof.
+ split.
+ - exact (CRle_trans _ _ _ (CRle_abs _) H).
+ - rewrite <- (CRopp_involutive x).
+ apply CRopp_ge_le_contravar.
+ rewrite <- CRabs_opp in H.
+ exact (CRle_trans _ _ _ (CRle_abs _) H).
+Qed.
+
+
+(* Minimum *)
+
+Definition CRmin {R : ConstructiveReals} (x y : CRcarrier R) : CRcarrier R
+ := (x + y - CRabs _ (y - x)) * CR_of_Q _ (1#2).
+
+Lemma CRmin_lt_r : forall {R : ConstructiveReals} (x y : CRcarrier R),
+ CRmin x y < y -> CRmin x y == x.
+Proof.
+ intros. unfold CRmin. unfold CRmin in H.
+ apply (CRmult_eq_reg_r (CR_of_Q R 2)).
+ left; apply CR_of_Q_pos; reflexivity.
+ rewrite CRmult_assoc, <- CR_of_Q_mult.
+ setoid_replace ((1 # 2) * 2)%Q with 1%Q. 2: reflexivity.
+ rewrite CR_of_Q_one, CRmult_1_r.
+ rewrite (CR_of_Q_plus R 1 1), CR_of_Q_one, CRmult_plus_distr_l, CRmult_1_r.
+ rewrite CRabs_right. unfold CRminus.
+ rewrite CRopp_plus_distr, CRplus_assoc, <- (CRplus_assoc y).
+ rewrite CRplus_opp_r, CRplus_0_l, CRopp_involutive. reflexivity.
+ apply (CRmult_lt_compat_r (CR_of_Q R 2)) in H.
+ 2: apply CR_of_Q_pos; reflexivity.
+ rewrite CRmult_assoc, <- CR_of_Q_mult in H.
+ setoid_replace ((1 # 2) * 2)%Q with 1%Q in H. 2: reflexivity.
+ rewrite CR_of_Q_one, CRmult_1_r in H.
+ rewrite CRmult_comm, (CR_of_Q_plus R 1 1), CR_of_Q_one, CRmult_plus_distr_r,
+ CRmult_1_l in H.
+ intro abs. rewrite CRabs_left in H.
+ unfold CRminus in H.
+ rewrite CRopp_involutive, CRplus_comm in H.
+ rewrite CRplus_assoc, <- (CRplus_assoc (-x)), CRplus_opp_l in H.
+ rewrite CRplus_0_l in H. exact (CRlt_asym _ _ H H).
+ apply CRlt_asym, abs.
+Qed.
+
+Add Parametric Morphism {R : ConstructiveReals} : CRmin
+ with signature (CReq R) ==> (CReq R) ==> (CReq R)
+ as CRmin_morph.
+Proof.
+ intros. unfold CRmin.
+ apply CRmult_morph. 2: reflexivity.
+ unfold CRminus.
+ rewrite H, H0. reflexivity.
+Qed.
+
+Instance CRmin_morphT
+ : forall {R : ConstructiveReals},
+ CMorphisms.Proper
+ (CMorphisms.respectful (CReq R) (CMorphisms.respectful (CReq R) (CReq R))) (@CRmin R).
+Proof.
+ intros R x y H z t H0.
+ rewrite H, H0. reflexivity.
+Qed.
+
+Lemma CRmin_l : forall {R : ConstructiveReals} (x y : CRcarrier R),
+ CRmin x y <= x.
+Proof.
+ intros. unfold CRmin.
+ apply (CRmult_le_reg_r (CR_of_Q R 2)).
+ rewrite <- CR_of_Q_zero. apply CR_of_Q_lt; reflexivity.
+ rewrite CRmult_assoc, <- CR_of_Q_mult.
+ setoid_replace ((1 # 2) * 2)%Q with 1%Q. 2: reflexivity.
+ rewrite CR_of_Q_one, CRmult_1_r.
+ rewrite (CR_of_Q_plus _ 1 1), CRmult_plus_distr_l, CR_of_Q_one, CRmult_1_r.
+ unfold CRminus. rewrite CRplus_assoc. apply CRplus_le_compat_l.
+ apply (CRplus_le_reg_r (CRabs _ (y + - x)+ -x)).
+ rewrite CRplus_assoc, <- (CRplus_assoc (-CRabs _ (y + - x))).
+ rewrite CRplus_opp_l, CRplus_0_l.
+ rewrite (CRplus_comm x), CRplus_assoc, CRplus_opp_l, CRplus_0_r.
+ apply CRle_abs.
+Qed.
+
+Lemma CRmin_r : forall {R : ConstructiveReals} (x y : CRcarrier R),
+ CRmin x y <= y.
+Proof.
+ intros. unfold CRmin.
+ apply (CRmult_le_reg_r (CR_of_Q R 2)).
+ rewrite <- CR_of_Q_zero. apply CR_of_Q_lt; reflexivity.
+ rewrite CRmult_assoc, <- CR_of_Q_mult.
+ setoid_replace ((1 # 2) * 2)%Q with 1%Q. 2: reflexivity.
+ rewrite CR_of_Q_one, CRmult_1_r.
+ rewrite (CR_of_Q_plus _ 1 1), CRmult_plus_distr_l, CR_of_Q_one, CRmult_1_r.
+ rewrite (CRplus_comm x).
+ unfold CRminus. rewrite CRplus_assoc. apply CRplus_le_compat_l.
+ apply (CRplus_le_reg_l (-x)).
+ rewrite <- CRplus_assoc, CRplus_opp_l, CRplus_0_l.
+ rewrite <- (CRopp_involutive y), <- CRopp_plus_distr, <- CRopp_plus_distr.
+ apply CRopp_ge_le_contravar. rewrite CRabs_opp, CRplus_comm.
+ apply CRle_abs.
+Qed.
+
+Lemma CRnegPartAbsMin : forall {R : ConstructiveReals} (x : CRcarrier R),
+ CRmin 0 x == (x - CRabs _ x) * (CR_of_Q _ (1#2)).
+Proof.
+ intros. unfold CRmin. unfold CRminus. rewrite CRplus_0_l.
+ apply CRmult_morph. 2: reflexivity. rewrite CRopp_0, CRplus_0_r. reflexivity.
+Qed.
+
+Lemma CRmin_sym : forall {R : ConstructiveReals} (x y : CRcarrier R),
+ CRmin x y == CRmin y x.
+Proof.
+ intros. unfold CRmin. apply CRmult_morph. 2: reflexivity.
+ rewrite CRabs_minus_sym. unfold CRminus.
+ rewrite (CRplus_comm x y). reflexivity.
+Qed.
+
+Lemma CRmin_mult :
+ forall {R : ConstructiveReals} (p q r : CRcarrier R),
+ 0 <= r -> CRmin (r * p) (r * q) == r * CRmin p q.
+Proof.
+ intros R p q r H. unfold CRmin.
+ setoid_replace (r * q - r * p) with (r * (q - p)).
+ rewrite CRabs_mult.
+ rewrite (CRabs_right r). 2: exact H.
+ rewrite <- CRmult_assoc. apply CRmult_morph. 2: reflexivity.
+ unfold CRminus. rewrite CRopp_mult_distr_r.
+ do 2 rewrite <- CRmult_plus_distr_l. reflexivity.
+ unfold CRminus. rewrite CRopp_mult_distr_r.
+ rewrite <- CRmult_plus_distr_l. reflexivity.
+Qed.
+
+Lemma CRmin_plus : forall {R : ConstructiveReals} (x y z : CRcarrier R),
+ x + CRmin y z == CRmin (x + y) (x + z).
+Proof.
+ intros. unfold CRmin.
+ unfold CRminus. setoid_replace (x + z + - (x + y)) with (z-y).
+ apply (CRmult_eq_reg_r (CR_of_Q _ 2)).
+ left. rewrite <- CR_of_Q_zero. apply CR_of_Q_lt; reflexivity.
+ rewrite CRmult_plus_distr_r.
+ rewrite CRmult_assoc, <- CR_of_Q_mult.
+ setoid_replace ((1 # 2) * 2)%Q with 1%Q. 2: reflexivity.
+ rewrite CR_of_Q_one, CRmult_1_r.
+ rewrite CRmult_assoc, <- CR_of_Q_mult.
+ setoid_replace ((1 # 2) * 2)%Q with 1%Q. 2: reflexivity.
+ rewrite CR_of_Q_one, CRmult_1_r.
+ rewrite (CR_of_Q_plus _ 1 1), CRmult_plus_distr_l, CR_of_Q_one, CRmult_1_r.
+ do 3 rewrite (CRplus_assoc x). apply CRplus_morph. reflexivity.
+ do 2 rewrite <- CRplus_assoc. apply CRplus_morph. 2: reflexivity.
+ rewrite (CRplus_comm x). apply CRplus_assoc.
+ rewrite CRopp_plus_distr. rewrite <- CRplus_assoc.
+ apply CRplus_morph. 2: reflexivity.
+ rewrite CRplus_comm, <- CRplus_assoc, CRplus_opp_l.
+ apply CRplus_0_l.
+Qed.
+
+Lemma CRmin_left : forall {R : ConstructiveReals} (x y : CRcarrier R),
+ x <= y -> CRmin x y == x.
+Proof.
+ intros. unfold CRmin.
+ apply (CRmult_eq_reg_r (CR_of_Q R 2)).
+ left. rewrite <- CR_of_Q_zero. apply CR_of_Q_lt; reflexivity.
+ rewrite CRmult_assoc, <- CR_of_Q_mult.
+ setoid_replace ((1 # 2) * 2)%Q with 1%Q. 2: reflexivity.
+ rewrite CR_of_Q_one, CRmult_1_r.
+ rewrite (CR_of_Q_plus _ 1 1), CRmult_plus_distr_l, CR_of_Q_one, CRmult_1_r.
+ rewrite CRabs_right. unfold CRminus. rewrite CRopp_plus_distr.
+ rewrite CRplus_assoc. apply CRplus_morph. reflexivity.
+ rewrite <- CRplus_assoc, CRplus_opp_r, CRplus_0_l. apply CRopp_involutive.
+ rewrite <- (CRplus_opp_r x). apply CRplus_le_compat.
+ exact H. apply CRle_refl.
+Qed.
+
+Lemma CRmin_right : forall {R : ConstructiveReals} (x y : CRcarrier R),
+ y <= x -> CRmin x y == y.
+Proof.
+ intros. unfold CRmin.
+ apply (CRmult_eq_reg_r (CR_of_Q R 2)).
+ left. rewrite <- CR_of_Q_zero. apply CR_of_Q_lt; reflexivity.
+ rewrite CRmult_assoc, <- CR_of_Q_mult.
+ setoid_replace ((1 # 2) * 2)%Q with 1%Q. 2: reflexivity.
+ rewrite CR_of_Q_one, CRmult_1_r.
+ rewrite (CR_of_Q_plus _ 1 1), CRmult_plus_distr_l, CR_of_Q_one, CRmult_1_r.
+ rewrite CRabs_left. unfold CRminus. do 2 rewrite CRopp_plus_distr.
+ rewrite (CRplus_comm x y).
+ rewrite CRplus_assoc. apply CRplus_morph. reflexivity.
+ do 2 rewrite CRopp_involutive.
+ rewrite CRplus_comm, CRplus_assoc, CRplus_opp_l, CRplus_0_r. reflexivity.
+ rewrite <- (CRplus_opp_r x). apply CRplus_le_compat.
+ exact H. apply CRle_refl.
+Qed.
+
+Lemma CRmin_lt : forall {R : ConstructiveReals} (x y z : CRcarrier R),
+ z < x -> z < y -> z < CRmin x y.
+Proof.
+ intros. unfold CRmin.
+ apply (CRmult_lt_reg_r (CR_of_Q R 2)).
+ rewrite <- CR_of_Q_zero. apply CR_of_Q_lt; reflexivity.
+ rewrite CRmult_assoc, <- CR_of_Q_mult.
+ setoid_replace ((1 # 2) * 2)%Q with 1%Q. 2: reflexivity.
+ rewrite CR_of_Q_one, CRmult_1_r.
+ apply (CRplus_lt_reg_l _ (CRabs _ (y - x) - (z*CR_of_Q R 2))).
+ unfold CRminus. rewrite CRplus_assoc. rewrite CRplus_opp_l, CRplus_0_r.
+ rewrite (CRplus_comm (CRabs R (y + - x))).
+ rewrite (CRplus_comm (x+y)), CRplus_assoc.
+ rewrite <- (CRplus_assoc (CRabs R (y + - x))), CRplus_opp_r, CRplus_0_l.
+ rewrite <- (CRplus_comm (x+y)).
+ apply CRabs_def1.
+ - unfold CRminus. rewrite <- (CRplus_comm y), CRplus_assoc.
+ apply CRplus_lt_compat_l.
+ apply (CRplus_lt_reg_l R (-x)).
+ rewrite CRopp_mult_distr_l.
+ rewrite <- CRplus_assoc, CRplus_opp_l, CRplus_0_l.
+ rewrite (CR_of_Q_plus R 1 1), CR_of_Q_one, CRmult_plus_distr_l.
+ rewrite CRmult_1_r. apply CRplus_le_lt_compat.
+ apply CRlt_asym.
+ apply CRopp_gt_lt_contravar, H.
+ apply CRopp_gt_lt_contravar, H.
+ - rewrite CRopp_plus_distr, CRopp_involutive.
+ rewrite CRplus_comm, CRplus_assoc.
+ apply CRplus_lt_compat_l.
+ apply (CRplus_lt_reg_l R (-y)).
+ rewrite CRopp_mult_distr_l.
+ rewrite <- CRplus_assoc, CRplus_opp_l, CRplus_0_l.
+ rewrite (CR_of_Q_plus R 1 1), CR_of_Q_one, CRmult_plus_distr_l.
+ rewrite CRmult_1_r. apply CRplus_le_lt_compat.
+ apply CRlt_asym.
+ apply CRopp_gt_lt_contravar, H0.
+ apply CRopp_gt_lt_contravar, H0.
+Qed.
+
+Lemma CRmin_contract : forall {R : ConstructiveReals} (x y a : CRcarrier R),
+ CRabs _ (CRmin x a - CRmin y a) <= CRabs _ (x - y).
+Proof.
+ intros. unfold CRmin.
+ unfold CRminus. rewrite CRopp_mult_distr_l, <- CRmult_plus_distr_r.
+ rewrite (CRabs_morph
+ _ ((x - y + (CRabs _ (a - y) - CRabs _ (a - x))) * CR_of_Q R (1 # 2))).
+ rewrite CRabs_mult, (CRabs_right (CR_of_Q R (1 # 2))).
+ 2: rewrite <- CR_of_Q_zero; apply CR_of_Q_le; discriminate.
+ apply (CRle_trans _
+ ((CRabs _ (x - y) * 1 + CRabs _ (x-y) * 1)
+ * CR_of_Q R (1 # 2))).
+ apply CRmult_le_compat_r.
+ rewrite <- CR_of_Q_zero. apply CR_of_Q_le. discriminate.
+ apply (CRle_trans
+ _ (CRabs _ (x - y) + CRabs _ (CRabs _ (a - y) - CRabs _ (a - x)))).
+ apply CRabs_triang. rewrite CRmult_1_r. apply CRplus_le_compat_l.
+ rewrite (CRabs_morph (x-y) ((a-y)-(a-x))).
+ apply CRabs_triang_inv2.
+ unfold CRminus. rewrite (CRplus_comm (a + - y)).
+ rewrite <- CRplus_assoc. apply CRplus_morph. 2: reflexivity.
+ rewrite CRplus_comm, CRopp_plus_distr, <- CRplus_assoc.
+ rewrite CRplus_opp_r, CRopp_involutive, CRplus_0_l.
+ reflexivity.
+ rewrite <- CRmult_plus_distr_l, <- CR_of_Q_one.
+ rewrite <- (CR_of_Q_plus R 1 1).
+ rewrite CRmult_assoc, <- CR_of_Q_mult.
+ setoid_replace ((1 + 1) * (1 # 2))%Q with 1%Q. 2: reflexivity.
+ rewrite CR_of_Q_one, CRmult_1_r. apply CRle_refl.
+ unfold CRminus. apply CRmult_morph. 2: reflexivity.
+ do 4 rewrite CRplus_assoc. apply CRplus_morph. reflexivity.
+ rewrite <- CRplus_assoc. rewrite CRplus_comm, CRopp_plus_distr.
+ rewrite CRplus_assoc. apply CRplus_morph. reflexivity.
+ rewrite CRopp_plus_distr. rewrite (CRplus_comm (-a)).
+ rewrite CRplus_assoc, <- (CRplus_assoc (-a)), CRplus_opp_l.
+ rewrite CRplus_0_l, CRopp_involutive. reflexivity.
+Qed.
+
+Lemma CRmin_glb : forall {R : ConstructiveReals} (x y z:CRcarrier R),
+ z <= x -> z <= y -> z <= CRmin x y.
+Proof.
+ intros. unfold CRmin.
+ apply (CRmult_le_reg_r (CR_of_Q R 2)).
+ rewrite <- CR_of_Q_zero. apply CR_of_Q_lt; reflexivity.
+ rewrite CRmult_assoc, <- CR_of_Q_mult.
+ setoid_replace ((1 # 2) * 2)%Q with 1%Q. 2: reflexivity.
+ rewrite CR_of_Q_one, CRmult_1_r.
+ apply (CRplus_le_reg_l (CRabs _ (y-x) - (z*CR_of_Q R 2))).
+ unfold CRminus. rewrite CRplus_assoc, CRplus_opp_l, CRplus_0_r.
+ rewrite (CRplus_comm (CRabs R (y + - x) + - (z * CR_of_Q R 2))).
+ rewrite CRplus_assoc, <- (CRplus_assoc (- CRabs R (y + - x))).
+ rewrite CRplus_opp_l, CRplus_0_l.
+ apply CRabs_le. split.
+ - do 2 rewrite CRopp_plus_distr.
+ rewrite CRopp_involutive, (CRplus_comm y), CRplus_assoc.
+ apply CRplus_le_compat_l, (CRplus_le_reg_l y).
+ rewrite <- CRplus_assoc, CRplus_opp_r, CRplus_0_l.
+ rewrite (CR_of_Q_plus R 1 1), CR_of_Q_one, CRmult_plus_distr_l.
+ rewrite CRmult_1_r. apply CRplus_le_compat; exact H0.
+ - rewrite (CRplus_comm x), CRplus_assoc. apply CRplus_le_compat_l.
+ apply (CRplus_le_reg_l (-x)).
+ rewrite <- CRplus_assoc, CRplus_opp_l, CRplus_0_l.
+ rewrite CRopp_mult_distr_l.
+ rewrite (CR_of_Q_plus R 1 1), CR_of_Q_one, CRmult_plus_distr_l.
+ rewrite CRmult_1_r.
+ apply CRplus_le_compat; apply CRopp_ge_le_contravar; exact H.
+Qed.
+
+Lemma CRmin_assoc : forall {R : ConstructiveReals} (a b c : CRcarrier R),
+ CRmin a (CRmin b c) == CRmin (CRmin a b) c.
+Proof.
+ split.
+ - apply CRmin_glb.
+ + apply (CRle_trans _ (CRmin a b)).
+ apply CRmin_l. apply CRmin_l.
+ + apply CRmin_glb.
+ apply (CRle_trans _ (CRmin a b)).
+ apply CRmin_l. apply CRmin_r. apply CRmin_r.
+ - apply CRmin_glb.
+ + apply CRmin_glb. apply CRmin_l.
+ apply (CRle_trans _ (CRmin b c)).
+ apply CRmin_r. apply CRmin_l.
+ + apply (CRle_trans _ (CRmin b c)).
+ apply CRmin_r. apply CRmin_r.
+Qed.
+
+Lemma CRlt_min : forall {R : ConstructiveReals} (x y z : CRcarrier R),
+ z < CRmin x y -> prod (z < x) (z < y).
+Proof.
+ intros. destruct (CR_Q_dense R _ _ H) as [q qmaj].
+ destruct qmaj.
+ split.
+ - apply (CRlt_le_trans _ (CR_of_Q R q) _ c).
+ intro abs. apply (CRlt_asym _ _ c0).
+ apply (CRle_lt_trans _ x). apply CRmin_l. exact abs.
+ - apply (CRlt_le_trans _ (CR_of_Q R q) _ c).
+ intro abs. apply (CRlt_asym _ _ c0).
+ apply (CRle_lt_trans _ y). apply CRmin_r. exact abs.
+Qed.
+
+
+
+(* Maximum *)
+
+Definition CRmax {R : ConstructiveReals} (x y : CRcarrier R) : CRcarrier R
+ := (x + y + CRabs _ (y - x)) * CR_of_Q _ (1#2).
+
+Add Parametric Morphism {R : ConstructiveReals} : CRmax
+ with signature (CReq R) ==> (CReq R) ==> (CReq R)
+ as CRmax_morph.
+Proof.
+ intros. unfold CRmax.
+ apply CRmult_morph. 2: reflexivity. unfold CRminus.
+ rewrite H, H0. reflexivity.
+Qed.
+
+Instance CRmax_morphT
+ : forall {R : ConstructiveReals},
+ CMorphisms.Proper
+ (CMorphisms.respectful (CReq R) (CMorphisms.respectful (CReq R) (CReq R))) (@CRmax R).
+Proof.
+ intros R x y H z t H0.
+ rewrite H, H0. reflexivity.
+Qed.
+
+Lemma CRmax_lub : forall {R : ConstructiveReals} (x y z:CRcarrier R),
+ x <= z -> y <= z -> CRmax x y <= z.
+Proof.
+ intros. unfold CRmax.
+ apply (CRmult_le_reg_r (CR_of_Q _ 2)). rewrite <- CR_of_Q_zero.
+ apply CR_of_Q_lt; reflexivity.
+ rewrite CRmult_assoc, <- CR_of_Q_mult.
+ setoid_replace ((1 # 2) * 2)%Q with 1%Q. 2: reflexivity.
+ rewrite CR_of_Q_one, CRmult_1_r.
+ apply (CRplus_le_reg_l (-x-y)).
+ rewrite <- CRplus_assoc. unfold CRminus.
+ rewrite <- CRopp_plus_distr, CRplus_opp_l, CRplus_0_l.
+ apply CRabs_le. split.
+ - repeat rewrite CRopp_plus_distr.
+ do 2 rewrite CRopp_involutive.
+ rewrite (CRplus_comm x), CRplus_assoc. apply CRplus_le_compat_l.
+ apply (CRplus_le_reg_l (-x)).
+ rewrite <- CRplus_assoc, CRplus_opp_l, CRplus_0_l.
+ rewrite (CR_of_Q_plus _ 1 1), CRmult_plus_distr_l, CR_of_Q_one, CRmult_1_r.
+ rewrite CRopp_plus_distr.
+ apply CRplus_le_compat; apply CRopp_ge_le_contravar; assumption.
+ - rewrite (CRplus_comm y), CRopp_plus_distr, CRplus_assoc.
+ apply CRplus_le_compat_l.
+ apply (CRplus_le_reg_l y).
+ rewrite <- CRplus_assoc, CRplus_opp_r, CRplus_0_l.
+ rewrite (CR_of_Q_plus _ 1 1), CRmult_plus_distr_l, CR_of_Q_one, CRmult_1_r.
+ apply CRplus_le_compat; assumption.
+Qed.
+
+Lemma CRmax_l : forall {R : ConstructiveReals} (x y : CRcarrier R),
+ x <= CRmax x y.
+Proof.
+ intros. unfold CRmax.
+ apply (CRmult_le_reg_r (CR_of_Q R 2)). rewrite <- CR_of_Q_zero.
+ apply CR_of_Q_lt; reflexivity.
+ rewrite CRmult_assoc, <- CR_of_Q_mult.
+ setoid_replace ((1 # 2) * 2)%Q with 1%Q. 2: reflexivity.
+ rewrite CR_of_Q_one, CRmult_1_r.
+ setoid_replace 2%Q with (1+1)%Q. rewrite CR_of_Q_plus, CR_of_Q_one.
+ rewrite CRmult_plus_distr_l, CRmult_1_r, CRplus_assoc.
+ apply CRplus_le_compat_l.
+ apply (CRplus_le_reg_l (-y)).
+ rewrite <- CRplus_assoc, CRplus_opp_l, CRplus_0_l.
+ rewrite CRabs_minus_sym, CRplus_comm.
+ apply CRle_abs. reflexivity.
+Qed.
+
+Lemma CRmax_r : forall {R : ConstructiveReals} (x y : CRcarrier R),
+ y <= CRmax x y.
+Proof.
+ intros. unfold CRmax.
+ apply (CRmult_le_reg_r (CR_of_Q _ 2)). rewrite <- CR_of_Q_zero.
+ apply CR_of_Q_lt; reflexivity.
+ rewrite CRmult_assoc, <- CR_of_Q_mult.
+ setoid_replace ((1 # 2) * 2)%Q with 1%Q. 2: reflexivity.
+ rewrite CR_of_Q_one, CRmult_1_r.
+ rewrite (CR_of_Q_plus _ 1 1), CRmult_plus_distr_l, CR_of_Q_one, CRmult_1_r.
+ rewrite (CRplus_comm x).
+ rewrite CRplus_assoc. apply CRplus_le_compat_l.
+ apply (CRplus_le_reg_l (-x)).
+ rewrite <- CRplus_assoc, CRplus_opp_l, CRplus_0_l.
+ rewrite CRplus_comm. apply CRle_abs.
+Qed.
+
+Lemma CRposPartAbsMax : forall {R : ConstructiveReals} (x : CRcarrier R),
+ CRmax 0 x == (x + CRabs _ x) * (CR_of_Q R (1#2)).
+Proof.
+ intros. unfold CRmax. unfold CRminus. rewrite CRplus_0_l.
+ apply CRmult_morph. 2: reflexivity. rewrite CRopp_0, CRplus_0_r. reflexivity.
+Qed.
+
+Lemma CRmax_sym : forall {R : ConstructiveReals} (x y : CRcarrier R),
+ CRmax x y == CRmax y x.
+Proof.
+ intros. unfold CRmax.
+ rewrite CRabs_minus_sym. apply CRmult_morph.
+ 2: reflexivity. rewrite (CRplus_comm x y). reflexivity.
+Qed.
+
+Lemma CRmax_plus : forall {R : ConstructiveReals} (x y z : CRcarrier R),
+ x + CRmax y z == CRmax (x + y) (x + z).
+Proof.
+ intros. unfold CRmax.
+ setoid_replace (x + z - (x + y)) with (z-y).
+ apply (CRmult_eq_reg_r (CR_of_Q _ 2)).
+ left. rewrite <- CR_of_Q_zero. apply CR_of_Q_lt; reflexivity.
+ rewrite CRmult_plus_distr_r.
+ rewrite CRmult_assoc, <- CR_of_Q_mult.
+ setoid_replace ((1 # 2) * 2)%Q with 1%Q. 2: reflexivity.
+ rewrite CR_of_Q_one, CRmult_1_r.
+ rewrite CRmult_assoc, <- CR_of_Q_mult.
+ setoid_replace ((1 # 2) * 2)%Q with 1%Q. 2: reflexivity.
+ rewrite (CR_of_Q_plus _ 1 1), CRmult_plus_distr_l, CR_of_Q_one, CRmult_1_r.
+ rewrite CRmult_1_r.
+ do 3 rewrite (CRplus_assoc x). apply CRplus_morph. reflexivity.
+ do 2 rewrite <- CRplus_assoc. apply CRplus_morph. 2: reflexivity.
+ rewrite (CRplus_comm x). apply CRplus_assoc.
+ unfold CRminus. rewrite CRopp_plus_distr. rewrite <- CRplus_assoc.
+ apply CRplus_morph. 2: reflexivity.
+ rewrite CRplus_comm, <- CRplus_assoc, CRplus_opp_l.
+ apply CRplus_0_l.
+Qed.
+
+Lemma CRmax_left : forall {R : ConstructiveReals} (x y : CRcarrier R),
+ y <= x -> CRmax x y == x.
+Proof.
+ intros. unfold CRmax.
+ apply (CRmult_eq_reg_r (CR_of_Q R 2)).
+ left. rewrite <- CR_of_Q_zero. apply CR_of_Q_lt; reflexivity.
+ rewrite CRmult_assoc, <- CR_of_Q_mult.
+ setoid_replace ((1 # 2) * 2)%Q with 1%Q. 2: reflexivity.
+ rewrite CR_of_Q_one, CRmult_1_r.
+ rewrite (CR_of_Q_plus _ 1 1), CRmult_plus_distr_l, CR_of_Q_one, CRmult_1_r.
+ rewrite CRplus_assoc. apply CRplus_morph. reflexivity.
+ rewrite CRabs_left. unfold CRminus. rewrite CRopp_plus_distr, CRopp_involutive.
+ rewrite <- CRplus_assoc, CRplus_opp_r, CRplus_0_l. reflexivity.
+ rewrite <- (CRplus_opp_r x). apply CRplus_le_compat_r. exact H.
+Qed.
+
+Lemma CRmax_right : forall {R : ConstructiveReals} (x y : CRcarrier R),
+ x <= y -> CRmax x y == y.
+Proof.
+ intros. unfold CRmax.
+ apply (CRmult_eq_reg_r (CR_of_Q R 2)).
+ left. rewrite <- CR_of_Q_zero. apply CR_of_Q_lt; reflexivity.
+ rewrite CRmult_assoc, <- CR_of_Q_mult.
+ setoid_replace ((1 # 2) * 2)%Q with 1%Q. 2: reflexivity.
+ rewrite CR_of_Q_one, CRmult_1_r.
+ rewrite (CR_of_Q_plus _ 1 1), CRmult_plus_distr_l, CR_of_Q_one, CRmult_1_r.
+ rewrite (CRplus_comm x y).
+ rewrite CRplus_assoc. apply CRplus_morph. reflexivity.
+ rewrite CRabs_right. unfold CRminus. rewrite CRplus_comm.
+ rewrite CRplus_assoc, CRplus_opp_l, CRplus_0_r. reflexivity.
+ rewrite <- (CRplus_opp_r x). apply CRplus_le_compat_r. exact H.
+Qed.
+
+Lemma CRmax_contract : forall {R : ConstructiveReals} (x y a : CRcarrier R),
+ CRabs _ (CRmax x a - CRmax y a) <= CRabs _ (x - y).
+Proof.
+ intros. unfold CRmax.
+ rewrite (CRabs_morph
+ _ ((x - y + (CRabs _ (a - x) - CRabs _ (a - y))) * CR_of_Q R (1 # 2))).
+ rewrite CRabs_mult, (CRabs_right (CR_of_Q R (1 # 2))).
+ 2: rewrite <- CR_of_Q_zero; apply CR_of_Q_le; discriminate.
+ apply (CRle_trans
+ _ ((CRabs _ (x - y) * 1 + CRabs _ (x-y) * 1)
+ * CR_of_Q R (1 # 2))).
+ apply CRmult_le_compat_r.
+ rewrite <- CR_of_Q_zero. apply CR_of_Q_le. discriminate.
+ apply (CRle_trans
+ _ (CRabs _ (x - y) + CRabs _ (CRabs _ (a - x) - CRabs _ (a - y)))).
+ apply CRabs_triang. rewrite CRmult_1_r. apply CRplus_le_compat_l.
+ rewrite (CRabs_minus_sym x y).
+ rewrite (CRabs_morph (y-x) ((a-x)-(a-y))).
+ apply CRabs_triang_inv2.
+ unfold CRminus. rewrite (CRplus_comm (a + - x)).
+ rewrite <- CRplus_assoc. apply CRplus_morph. 2: reflexivity.
+ rewrite CRplus_comm, CRopp_plus_distr, <- CRplus_assoc.
+ rewrite CRplus_opp_r, CRopp_involutive, CRplus_0_l.
+ reflexivity.
+ rewrite <- CRmult_plus_distr_l, <- CR_of_Q_one.
+ rewrite <- (CR_of_Q_plus R 1 1).
+ rewrite CRmult_assoc, <- CR_of_Q_mult.
+ setoid_replace ((1 + 1) * (1 # 2))%Q with 1%Q. 2: reflexivity.
+ rewrite CR_of_Q_one, CRmult_1_r. apply CRle_refl.
+ unfold CRminus. rewrite CRopp_mult_distr_l.
+ rewrite <- CRmult_plus_distr_r. apply CRmult_morph. 2: reflexivity.
+ do 4 rewrite CRplus_assoc. apply CRplus_morph. reflexivity.
+ rewrite <- CRplus_assoc. rewrite CRplus_comm, CRopp_plus_distr.
+ rewrite CRplus_assoc. apply CRplus_morph. reflexivity.
+ rewrite CRopp_plus_distr. rewrite (CRplus_comm (-a)).
+ rewrite CRplus_assoc, <- (CRplus_assoc (-a)), CRplus_opp_l.
+ rewrite CRplus_0_l. apply CRplus_comm.
+Qed.
+
+Lemma CRmax_lub_lt : forall {R : ConstructiveReals} (x y z : CRcarrier R),
+ x < z -> y < z -> CRmax x y < z.
+Proof.
+ intros. unfold CRmax.
+ apply (CRmult_lt_reg_r (CR_of_Q R 2)).
+ rewrite <- CR_of_Q_zero. apply CR_of_Q_lt; reflexivity.
+ rewrite CRmult_assoc, <- CR_of_Q_mult.
+ setoid_replace ((1 # 2) * 2)%Q with 1%Q. 2: reflexivity.
+ rewrite CR_of_Q_one, CRmult_1_r.
+ apply (CRplus_lt_reg_l _ (-y -x)). unfold CRminus.
+ rewrite CRplus_assoc, <- (CRplus_assoc (-x)), <- (CRplus_assoc (-x)).
+ rewrite CRplus_opp_l, CRplus_0_l, <- CRplus_assoc, CRplus_opp_l, CRplus_0_l.
+ apply CRabs_def1.
+ - rewrite (CRplus_comm y), (CRplus_comm (-y)), CRplus_assoc.
+ apply CRplus_lt_compat_l.
+ apply (CRplus_lt_reg_l _ y).
+ rewrite <- CRplus_assoc, CRplus_opp_r, CRplus_0_l.
+ rewrite (CR_of_Q_plus R 1 1), CR_of_Q_one, CRmult_plus_distr_l.
+ rewrite CRmult_1_r. apply CRplus_le_lt_compat.
+ apply CRlt_asym, H0. exact H0.
+ - rewrite CRopp_plus_distr, CRopp_involutive.
+ rewrite CRplus_assoc. apply CRplus_lt_compat_l.
+ apply (CRplus_lt_reg_l _ x).
+ rewrite <- CRplus_assoc, CRplus_opp_r, CRplus_0_l.
+ rewrite (CR_of_Q_plus R 1 1), CR_of_Q_one, CRmult_plus_distr_l.
+ rewrite CRmult_1_r. apply CRplus_le_lt_compat.
+ apply CRlt_asym, H. exact H.
+Qed.
+
+Lemma CRmax_assoc : forall {R : ConstructiveReals} (a b c : CRcarrier R),
+ CRmax a (CRmax b c) == CRmax (CRmax a b) c.
+Proof.
+ split.
+ - apply CRmax_lub.
+ + apply CRmax_lub. apply CRmax_l.
+ apply (CRle_trans _ (CRmax b c)).
+ apply CRmax_l. apply CRmax_r.
+ + apply (CRle_trans _ (CRmax b c)).
+ apply CRmax_r. apply CRmax_r.
+ - apply CRmax_lub.
+ + apply (CRle_trans _ (CRmax a b)).
+ apply CRmax_l. apply CRmax_l.
+ + apply CRmax_lub.
+ apply (CRle_trans _ (CRmax a b)).
+ apply CRmax_r. apply CRmax_l. apply CRmax_r.
+Qed.
+
+Lemma CRmax_min_mult_neg :
+ forall {R : ConstructiveReals} (p q r:CRcarrier R),
+ r <= 0 -> CRmax (r * p) (r * q) == r * CRmin p q.
+Proof.
+ intros R p q r H. unfold CRmin, CRmax.
+ setoid_replace (r * q - r * p) with (r * (q - p)).
+ rewrite CRabs_mult.
+ rewrite (CRabs_left r), <- CRmult_assoc.
+ apply CRmult_morph. 2: reflexivity. unfold CRminus.
+ rewrite <- CRopp_mult_distr_l, CRopp_mult_distr_r,
+ CRmult_plus_distr_l, CRmult_plus_distr_l.
+ reflexivity. exact H.
+ unfold CRminus. rewrite CRmult_plus_distr_l, CRopp_mult_distr_r. reflexivity.
+Qed.
+
+Lemma CRlt_max : forall {R : ConstructiveReals} (x y z : CRcarrier R),
+ CRmax x y < z -> prod (x < z) (y < z).
+Proof.
+ intros. destruct (CR_Q_dense R _ _ H) as [q qmaj].
+ destruct qmaj.
+ split.
+ - apply (CRlt_le_trans _ (CR_of_Q R q)).
+ apply (CRle_lt_trans _ (CRmax x y)). apply CRmax_l. exact c.
+ apply CRlt_asym, c0.
+ - apply (CRlt_le_trans _ (CR_of_Q R q)).
+ apply (CRle_lt_trans _ (CRmax x y)). apply CRmax_r. exact c.
+ apply CRlt_asym, c0.
+Qed.
+
+Lemma CRmax_mult :
+ forall {R : ConstructiveReals} (p q r:CRcarrier R),
+ 0 <= r -> CRmax (r * p) (r * q) == r * CRmax p q.
+Proof.
+ intros R p q r H. unfold CRmin, CRmax.
+ setoid_replace (r * q - r * p) with (r * (q - p)).
+ rewrite CRabs_mult.
+ rewrite (CRabs_right r), <- CRmult_assoc.
+ apply CRmult_morph. 2: reflexivity.
+ rewrite CRmult_plus_distr_l, CRmult_plus_distr_l.
+ reflexivity. exact H.
+ unfold CRminus. rewrite CRmult_plus_distr_l, CRopp_mult_distr_r. reflexivity.
+Qed.
+
+Lemma CRmin_max_mult_neg :
+ forall {R : ConstructiveReals} (p q r:CRcarrier R),
+ r <= 0 -> CRmin (r * p) (r * q) == r * CRmax p q.
+Proof.
+ intros R p q r H. unfold CRmin, CRmax.
+ setoid_replace (r * q - r * p) with (r * (q - p)).
+ rewrite CRabs_mult.
+ rewrite (CRabs_left r), <- CRmult_assoc.
+ apply CRmult_morph. 2: reflexivity. unfold CRminus.
+ rewrite CRopp_mult_distr_l, CRopp_involutive,
+ CRmult_plus_distr_l, CRmult_plus_distr_l.
+ reflexivity. exact H.
+ unfold CRminus. rewrite CRmult_plus_distr_l, CRopp_mult_distr_r. reflexivity.
+Qed.
diff --git a/theories/Reals/Abstract/ConstructiveLUB.v b/theories/Reals/Abstract/ConstructiveLUB.v
new file mode 100644
index 0000000000..4ae24de154
--- /dev/null
+++ b/theories/Reals/Abstract/ConstructiveLUB.v
@@ -0,0 +1,413 @@
+(************************************************************************)
+(* * The Coq Proof Assistant / The Coq Development Team *)
+(* v * INRIA, CNRS and contributors - Copyright 1999-2019 *)
+(* Prop), (forall n, {P n} + {~P n})
+ -> {n | ~P n} + {forall n, P n}.
+
+Definition sig_not_dec_T : Type := forall P : Prop, { ~~P } + { ~P }.
+
+Definition is_upper_bound {R : ConstructiveReals}
+ (E:CRcarrier R -> Prop) (m:CRcarrier R)
+ := forall x:CRcarrier R, E x -> x <= m.
+
+Definition is_lub {R : ConstructiveReals}
+ (E:CRcarrier R -> Prop) (m:CRcarrier R) :=
+ is_upper_bound E m /\ (forall b:CRcarrier R, is_upper_bound E b -> m <= b).
+
+Lemma CRlt_lpo_dec : forall {R : ConstructiveReals} (x y : CRcarrier R),
+ (forall (P : nat -> Prop), (forall n, {P n} + {~P n})
+ -> {n | ~P n} + {forall n, P n})
+ -> sum (x < y) (y <= x).
+Proof.
+ intros R x y lpo.
+ assert (forall (z:CRcarrier R) (n : nat), z < z + CR_of_Q R (1 # Pos.of_nat (S n))).
+ { intros. apply (CRle_lt_trans _ (z+0)).
+ rewrite CRplus_0_r. apply CRle_refl. apply CRplus_lt_compat_l.
+ apply CR_of_Q_pos. reflexivity. }
+ pose (fun n:nat => let (q,_) := CR_Q_dense
+ R x (x + CR_of_Q R (1 # Pos.of_nat (S n))) (H x n)
+ in q)
+ as xn.
+ pose (fun n:nat => let (q,_) := CR_Q_dense
+ R y (y + CR_of_Q R (1 # Pos.of_nat (S n))) (H y n)
+ in q)
+ as yn.
+ destruct (lpo (fun n => Qle (yn n) (xn n + (1 # Pos.of_nat (S n))))).
+ - intro n. destruct (Q_dec (yn n) (xn n + (1 # Pos.of_nat (S n)))).
+ destruct s. left. apply Qlt_le_weak, q.
+ right. apply (Qlt_not_le _ _ q). left.
+ rewrite q. apply Qle_refl.
+ - left. destruct s as [n nmaj]. apply Qnot_le_lt in nmaj.
+ apply (CRlt_le_trans _ (CR_of_Q R (xn n))).
+ unfold xn.
+ destruct (CR_Q_dense R x (x + CR_of_Q R (1 # Pos.of_nat (S n))) (H x n)).
+ exact (fst p). apply (CRle_trans _ (CR_of_Q R (yn n - (1 # Pos.of_nat (S n))))).
+ apply CR_of_Q_le. rewrite <- (Qplus_le_l _ _ (1# Pos.of_nat (S n))).
+ ring_simplify. apply Qlt_le_weak, nmaj.
+ unfold yn.
+ destruct (CR_Q_dense R y (y + CR_of_Q R (1 # Pos.of_nat (S n))) (H y n)).
+ unfold Qminus. rewrite CR_of_Q_plus, CR_of_Q_opp.
+ apply (CRplus_le_reg_r (CR_of_Q R (1 # Pos.of_nat (S n)))).
+ rewrite CRplus_assoc, CRplus_opp_l, CRplus_0_r.
+ apply CRlt_asym, (snd p).
+ - right. apply (CR_cv_le (fun n => CR_of_Q R (yn n))
+ (fun n => CR_of_Q R (xn n) + CR_of_Q R (1 # Pos.of_nat (S n)))).
+ + intro n. rewrite <- CR_of_Q_plus. apply CR_of_Q_le. exact (q n).
+ + intro p. exists (Pos.to_nat p). intros.
+ unfold yn.
+ destruct (CR_Q_dense R y (y + CR_of_Q R (1 # Pos.of_nat (S i))) (H y i)).
+ rewrite CRabs_right. apply (CRplus_le_reg_r y).
+ unfold CRminus. rewrite CRplus_assoc, CRplus_opp_l, CRplus_0_r.
+ rewrite CRplus_comm.
+ apply (CRle_trans _ (y + CR_of_Q R (1 # Pos.of_nat (S i)))).
+ apply CRlt_asym, (snd p0). apply CRplus_le_compat_l.
+ apply CR_of_Q_le. unfold Qle, Qnum, Qden.
+ rewrite Z.mul_1_l, Z.mul_1_l. apply Pos2Z.pos_le_pos.
+ apply Pos2Nat.inj_le. rewrite Nat2Pos.id.
+ apply le_S, H0. discriminate. rewrite <- (CRplus_opp_r y).
+ apply CRplus_le_compat_r, CRlt_asym, p0.
+ + apply (CR_cv_proper _ (x+0)). 2: rewrite CRplus_0_r; reflexivity.
+ apply CR_cv_plus.
+ intro p. exists (Pos.to_nat p). intros.
+ unfold xn.
+ destruct (CR_Q_dense R x (x + CR_of_Q R (1 # Pos.of_nat (S i))) (H x i)).
+ rewrite CRabs_right. apply (CRplus_le_reg_r x).
+ unfold CRminus. rewrite CRplus_assoc, CRplus_opp_l, CRplus_0_r.
+ rewrite CRplus_comm.
+ apply (CRle_trans _ (x + CR_of_Q R (1 # Pos.of_nat (S i)))).
+ apply CRlt_asym, (snd p0). apply CRplus_le_compat_l.
+ apply CR_of_Q_le. unfold Qle, Qnum, Qden.
+ rewrite Z.mul_1_l, Z.mul_1_l. apply Pos2Z.pos_le_pos.
+ apply Pos2Nat.inj_le. rewrite Nat2Pos.id.
+ apply le_S, H0. discriminate. rewrite <- (CRplus_opp_r x).
+ apply CRplus_le_compat_r, CRlt_asym, p0.
+ intro p. exists (Pos.to_nat p). intros.
+ unfold CRminus. rewrite CRopp_0, CRplus_0_r, CRabs_right.
+ apply CR_of_Q_le. unfold Qle, Qnum, Qden.
+ rewrite Z.mul_1_l, Z.mul_1_l. apply Pos2Z.pos_le_pos.
+ apply Pos2Nat.inj_le. rewrite Nat2Pos.id.
+ apply le_S, H0. discriminate.
+ rewrite <- CR_of_Q_zero. apply CR_of_Q_le. discriminate.
+Qed.
+
+Lemma is_upper_bound_dec :
+ forall {R : ConstructiveReals} (E:CRcarrier R -> Prop) (x:CRcarrier R),
+ sig_forall_dec_T
+ -> sig_not_dec_T
+ -> { is_upper_bound E x } + { ~is_upper_bound E x }.
+Proof.
+ intros R E x lpo sig_not_dec.
+ destruct (sig_not_dec (~exists y:CRcarrier R, E y /\ CRltProp R x y)).
+ - left. intros y H.
+ destruct (CRlt_lpo_dec x y lpo). 2: exact c.
+ exfalso. apply n. intro abs. apply abs. clear abs.
+ exists y. split. exact H. apply CRltForget. exact c.
+ - right. intro abs. apply n. intros [y [H H0]].
+ specialize (abs y H). apply CRltEpsilon in H0. contradiction.
+Qed.
+
+Lemma is_upper_bound_epsilon :
+ forall {R : ConstructiveReals} (E:CRcarrier R -> Prop),
+ sig_forall_dec_T
+ -> sig_not_dec_T
+ -> (exists x:CRcarrier R, is_upper_bound E x)
+ -> { n:nat | is_upper_bound E (CR_of_Q R (Z.of_nat n # 1)) }.
+Proof.
+ intros R E lpo sig_not_dec Ebound.
+ apply constructive_indefinite_ground_description_nat.
+ - intro n. apply is_upper_bound_dec. exact lpo. exact sig_not_dec.
+ - destruct Ebound as [x H]. destruct (CRup_nat x) as [n nmaj]. exists n.
+ intros y ey. specialize (H y ey).
+ apply (CRle_trans _ x _ H). apply CRlt_asym, nmaj.
+Qed.
+
+Lemma is_upper_bound_not_epsilon :
+ forall {R : ConstructiveReals} (E:CRcarrier R -> Prop),
+ sig_forall_dec_T
+ -> sig_not_dec_T
+ -> (exists x : CRcarrier R, E x)
+ -> { m:nat | ~is_upper_bound E (-CR_of_Q R (Z.of_nat m # 1)) }.
+Proof.
+ intros R E lpo sig_not_dec H.
+ apply constructive_indefinite_ground_description_nat.
+ - intro n.
+ destruct (is_upper_bound_dec E (-CR_of_Q R (Z.of_nat n # 1)) lpo sig_not_dec).
+ right. intro abs. contradiction. left. exact n0.
+ - destruct H as [x H]. destruct (CRup_nat (-x)) as [n H0].
+ exists n. intro abs. specialize (abs x H).
+ apply abs. rewrite <- (CRopp_involutive x).
+ apply CRopp_gt_lt_contravar. exact H0.
+Qed.
+
+(* Decidable Dedekind cuts are Cauchy reals. *)
+Record DedekindDecCut : Type :=
+ {
+ DDupcut : Q -> Prop;
+ DDproper : forall q r : Q, (q == r -> DDupcut q -> DDupcut r)%Q;
+ DDlow : Q;
+ DDhigh : Q;
+ DDdec : forall q:Q, { DDupcut q } + { ~DDupcut q };
+ DDinterval : forall q r : Q, Qle q r -> DDupcut q -> DDupcut r;
+ DDhighProp : DDupcut DDhigh;
+ DDlowProp : ~DDupcut DDlow;
+ }.
+
+Lemma DDlow_below_up : forall (upcut : DedekindDecCut) (a b : Q),
+ DDupcut upcut a -> ~DDupcut upcut b -> Qlt b a.
+Proof.
+ intros. destruct (Qlt_le_dec b a). exact q.
+ exfalso. apply H0. apply (DDinterval upcut a).
+ exact q. exact H.
+Qed.
+
+Fixpoint DDcut_limit_fix (upcut : DedekindDecCut) (r : Q) (n : nat) :
+ Qlt 0 r
+ -> (DDupcut upcut (DDlow upcut + (Z.of_nat n#1) * r))
+ -> { q : Q | DDupcut upcut q /\ ~DDupcut upcut (q - r) }.
+Proof.
+ destruct n.
+ - intros. exfalso. simpl in H0.
+ apply (DDproper upcut _ (DDlow upcut)) in H0. 2: ring.
+ exact (DDlowProp upcut H0).
+ - intros. destruct (DDdec upcut (DDlow upcut + (Z.of_nat n # 1) * r)).
+ + exact (DDcut_limit_fix upcut r n H d).
+ + exists (DDlow upcut + (Z.of_nat (S n) # 1) * r)%Q. split.
+ exact H0. intro abs.
+ apply (DDproper upcut _ (DDlow upcut + (Z.of_nat n # 1) * r)) in abs.
+ contradiction.
+ rewrite Nat2Z.inj_succ. unfold Z.succ. rewrite <- Qinv_plus_distr.
+ ring.
+Qed.
+
+Lemma DDcut_limit : forall (upcut : DedekindDecCut) (r : Q),
+ Qlt 0 r
+ -> { q : Q | DDupcut upcut q /\ ~DDupcut upcut (q - r) }.
+Proof.
+ intros.
+ destruct (Qarchimedean ((DDhigh upcut - DDlow upcut)/r)) as [n nmaj].
+ apply (DDcut_limit_fix upcut r (Pos.to_nat n) H).
+ apply (Qmult_lt_r _ _ r) in nmaj. 2: exact H.
+ unfold Qdiv in nmaj.
+ rewrite <- Qmult_assoc, (Qmult_comm (/r)), Qmult_inv_r, Qmult_1_r in nmaj.
+ apply (DDinterval upcut (DDhigh upcut)). 2: exact (DDhighProp upcut).
+ apply Qlt_le_weak. apply (Qplus_lt_r _ _ (-DDlow upcut)).
+ rewrite Qplus_assoc, <- (Qplus_comm (DDlow upcut)), Qplus_opp_r,
+ Qplus_0_l, Qplus_comm.
+ rewrite positive_nat_Z. exact nmaj.
+ intros abs. rewrite abs in H. exact (Qlt_irrefl 0 H).
+Qed.
+
+Lemma glb_dec_Q : forall {R : ConstructiveReals} (upcut : DedekindDecCut),
+ { x : CRcarrier R
+ | forall r:Q, (x < CR_of_Q R r -> DDupcut upcut r)
+ /\ (CR_of_Q R r < x -> ~DDupcut upcut r) }.
+Proof.
+ intros.
+ assert (forall a b : Q, Qle a b -> Qle (-b) (-a)).
+ { intros. apply (Qplus_le_l _ _ (a+b)). ring_simplify. exact H. }
+ assert (CR_cauchy R (fun n:nat => CR_of_Q R (proj1_sig (DDcut_limit
+ upcut (1#Pos.of_nat n) (eq_refl _))))).
+ { intros p. exists (Pos.to_nat p). intros i j pi pj.
+ destruct (DDcut_limit upcut (1 # Pos.of_nat i) eq_refl),
+ (DDcut_limit upcut (1 # Pos.of_nat j) eq_refl); unfold proj1_sig.
+ apply (CRabs_le). split.
+ - intros. unfold CRminus.
+ rewrite <- CR_of_Q_opp, <- CR_of_Q_opp, <- CR_of_Q_plus.
+ apply CR_of_Q_le.
+ apply (Qplus_le_l _ _ x0). ring_simplify.
+ setoid_replace (-1 * (1 # p) + x0)%Q with (x0 - (1 # p))%Q.
+ 2: ring. apply (Qle_trans _ (x0- (1#Pos.of_nat j))).
+ apply Qplus_le_r. apply H.
+ apply Z2Nat.inj_le. discriminate. discriminate. simpl.
+ rewrite Nat2Pos.id. exact pj. intro abs.
+ subst j. inversion pj. pose proof (Pos2Nat.is_pos p).
+ rewrite H1 in H0. inversion H0.
+ apply Qlt_le_weak, (DDlow_below_up upcut). apply a. apply a0.
+ - unfold CRminus. rewrite <- CR_of_Q_opp, <- CR_of_Q_plus.
+ apply CR_of_Q_le.
+ apply (Qplus_le_l _ _ (x0-(1#p))). ring_simplify.
+ setoid_replace (x -1 * (1 # p))%Q with (x - (1 # p))%Q.
+ 2: ring. apply (Qle_trans _ (x- (1#Pos.of_nat i))).
+ apply Qplus_le_r. apply H.
+ apply Z2Nat.inj_le. discriminate. discriminate. simpl.
+ rewrite Nat2Pos.id. exact pi. intro abs.
+ subst i. inversion pi. pose proof (Pos2Nat.is_pos p).
+ rewrite H1 in H0. inversion H0.
+ apply Qlt_le_weak, (DDlow_below_up upcut). apply a0. apply a. }
+ apply CR_complete in H0. destruct H0 as [l lcv].
+ exists l. split.
+ - intros. (* find an upper point between the limit and r *)
+ destruct (CR_cv_open_above _ (CR_of_Q R r) l lcv H0) as [p pmaj].
+ specialize (pmaj p (le_refl p)).
+ unfold proj1_sig in pmaj.
+ destruct (DDcut_limit upcut (1 # Pos.of_nat p) eq_refl) as [q qmaj].
+ apply (DDinterval upcut q). 2: apply qmaj.
+ destruct (Q_dec q r). destruct s. apply Qlt_le_weak, q0.
+ exfalso. apply (CR_of_Q_lt R) in q0. exact (CRlt_asym _ _ pmaj q0).
+ rewrite q0. apply Qle_refl.
+ - intros H0 abs.
+ assert ((CR_of_Q R r+l) * CR_of_Q R (1#2) < l).
+ { apply (CRmult_lt_reg_r (CR_of_Q R 2)).
+ apply CR_of_Q_pos. reflexivity.
+ rewrite CRmult_assoc, <- CR_of_Q_mult, (CR_of_Q_plus R 1 1).
+ setoid_replace ((1 # 2) * 2)%Q with 1%Q. 2: reflexivity.
+ rewrite CR_of_Q_one, CRmult_plus_distr_l, CRmult_1_r, CRmult_1_r.
+ apply CRplus_lt_compat_r. exact H0. }
+ destruct (CR_cv_open_below _ _ l lcv H1) as [p pmaj].
+ assert (0 < (l-CR_of_Q R r) * CR_of_Q R (1#2)).
+ { apply CRmult_lt_0_compat. rewrite <- (CRplus_opp_r (CR_of_Q R r)).
+ apply CRplus_lt_compat_r. exact H0. apply CR_of_Q_pos. reflexivity. }
+ destruct (CRup_nat (CRinv R _ (inr H2))) as [i imaj].
+ destruct i. exfalso. simpl in imaj.
+ rewrite CR_of_Q_zero in imaj.
+ exact (CRlt_asym _ _ imaj (CRinv_0_lt_compat R _ (inr H2) H2)).
+ specialize (pmaj (max (S i) (S p)) (le_trans p (S p) _ (le_S p p (le_refl p)) (Nat.le_max_r (S i) (S p)))).
+ unfold proj1_sig in pmaj.
+ destruct (DDcut_limit upcut (1 # Pos.of_nat (max (S i) (S p))) eq_refl)
+ as [q qmaj].
+ destruct qmaj. apply H4. clear H4.
+ apply (DDinterval upcut r). 2: exact abs.
+ apply (Qplus_le_l _ _ (1 # Pos.of_nat (Init.Nat.max (S i) (S p)))).
+ ring_simplify. apply (Qle_trans _ (r + (1 # Pos.of_nat (S i)))).
+ rewrite Qplus_le_r. unfold Qle,Qnum,Qden.
+ rewrite Z.mul_1_l, Z.mul_1_l. apply Pos2Z.pos_le_pos.
+ apply Pos2Nat.inj_le. rewrite Nat2Pos.id, Nat2Pos.id.
+ apply Nat.le_max_l. discriminate. discriminate.
+ apply (CRmult_lt_compat_l ((l - CR_of_Q R r) * CR_of_Q R (1 # 2))) in imaj.
+ rewrite CRinv_r in imaj. 2: exact H2.
+ destruct (Q_dec (r+(1#Pos.of_nat (S i))) q). destruct s.
+ apply Qlt_le_weak, q0. 2: rewrite q0; apply Qle_refl.
+ exfalso. apply (CR_of_Q_lt R) in q0.
+ apply (CRlt_asym _ _ pmaj). apply (CRlt_le_trans _ _ _ q0).
+ apply (CRplus_le_reg_l (-CR_of_Q R r)).
+ rewrite CR_of_Q_plus, <- CRplus_assoc, CRplus_opp_l, CRplus_0_l.
+ apply (CRmult_lt_compat_r (CR_of_Q R (1 # Pos.of_nat (S i)))) in imaj.
+ rewrite CRmult_1_l in imaj.
+ apply (CRle_trans _ (
+ (l - CR_of_Q R r) * CR_of_Q R (1 # 2) * CR_of_Q R (Z.of_nat (S i) # 1) *
+ CR_of_Q R (1 # Pos.of_nat (S i)))).
+ apply CRlt_asym, imaj. rewrite CRmult_assoc, <- CR_of_Q_mult.
+ setoid_replace ((Z.of_nat (S i) # 1) * (1 # Pos.of_nat (S i)))%Q with 1%Q.
+ rewrite CR_of_Q_one, CRmult_1_r.
+ unfold CRminus. rewrite CRmult_plus_distr_r, (CRplus_comm (-CR_of_Q R r)).
+ rewrite (CRplus_comm (CR_of_Q R r)), CRmult_plus_distr_r.
+ rewrite CRplus_assoc. apply CRplus_le_compat_l.
+ rewrite <- CR_of_Q_mult, <- CR_of_Q_opp, <- CR_of_Q_mult, <- CR_of_Q_plus.
+ apply CR_of_Q_le. ring_simplify. apply Qle_refl.
+ unfold Qeq, Qmult, Qnum, Qden. rewrite Z.mul_1_r, Z.mul_1_r.
+ rewrite Z.mul_1_l, Pos.mul_1_l. unfold Z.of_nat.
+ apply f_equal. apply Pos.of_nat_succ. apply CR_of_Q_pos. reflexivity.
+Qed.
+
+Lemma is_upper_bound_glb :
+ forall {R : ConstructiveReals} (E:CRcarrier R -> Prop),
+ sig_not_dec_T
+ -> sig_forall_dec_T
+ -> (exists x : CRcarrier R, E x)
+ -> (exists x : CRcarrier R, is_upper_bound E x)
+ -> { x : CRcarrier R
+ | forall r:Q, (x < CR_of_Q R r -> is_upper_bound E (CR_of_Q R r))
+ /\ (CR_of_Q R r < x -> ~is_upper_bound E (CR_of_Q R r)) }.
+Proof.
+ intros R E sig_not_dec lpo Einhab Ebound.
+ destruct (is_upper_bound_epsilon E lpo sig_not_dec Ebound) as [a luba].
+ destruct (is_upper_bound_not_epsilon E lpo sig_not_dec Einhab) as [b glbb].
+ pose (fun q => is_upper_bound E (CR_of_Q R q)) as upcut.
+ assert (forall q:Q, { upcut q } + { ~upcut q } ).
+ { intro q. apply is_upper_bound_dec. exact lpo. exact sig_not_dec. }
+ assert (forall q r : Q, (q <= r)%Q -> upcut q -> upcut r).
+ { intros. intros x Ex. specialize (H1 x Ex). intro abs.
+ apply H1. apply (CRle_lt_trans _ (CR_of_Q R r)). 2: exact abs.
+ apply CR_of_Q_le. exact H0. }
+ assert (upcut (Z.of_nat a # 1)%Q).
+ { intros x Ex. exact (luba x Ex). }
+ assert (~upcut (- Z.of_nat b # 1)%Q).
+ { intros abs. apply glbb. intros x Ex.
+ specialize (abs x Ex). rewrite <- CR_of_Q_opp.
+ exact abs. }
+ assert (forall q r : Q, (q == r)%Q -> upcut q -> upcut r).
+ { intros. intros x Ex. specialize (H4 x Ex). rewrite <- H3. exact H4. }
+ destruct (@glb_dec_Q R (Build_DedekindDecCut
+ upcut H3 (-Z.of_nat b # 1)%Q (Z.of_nat a # 1)
+ H H0 H1 H2)).
+ simpl in a0. exists x. intro r. split.
+ - intros. apply a0. exact H4.
+ - intros H6 abs. specialize (a0 r) as [_ a0]. apply a0.
+ exact H6. exact abs.
+Qed.
+
+Lemma is_upper_bound_closed :
+ forall {R : ConstructiveReals}
+ (E:CRcarrier R -> Prop) (sig_forall_dec : sig_forall_dec_T)
+ (sig_not_dec : sig_not_dec_T)
+ (Einhab : exists x : CRcarrier R, E x)
+ (Ebound : exists x : CRcarrier R, is_upper_bound E x),
+ is_lub
+ E (proj1_sig (is_upper_bound_glb
+ E sig_not_dec sig_forall_dec Einhab Ebound)).
+Proof.
+ intros. split.
+ - intros x Ex.
+ destruct (is_upper_bound_glb E sig_not_dec sig_forall_dec Einhab Ebound); simpl.
+ intro abs. destruct (CR_Q_dense R x0 x abs) as [q [qmaj H]].
+ specialize (a q) as [a _]. specialize (a qmaj x Ex).
+ contradiction.
+ - intros.
+ destruct (is_upper_bound_glb E sig_not_dec sig_forall_dec Einhab Ebound); simpl.
+ intro abs. destruct (CR_Q_dense R b x abs) as [q [qmaj H0]].
+ specialize (a q) as [_ a]. apply a. exact H0.
+ intros y Ey. specialize (H y Ey). intro abs2.
+ apply H. exact (CRlt_trans _ (CR_of_Q R q) _ qmaj abs2).
+Qed.
+
+Lemma sig_lub :
+ forall {R : ConstructiveReals} (E:CRcarrier R -> Prop),
+ sig_forall_dec_T
+ -> sig_not_dec_T
+ -> (exists x : CRcarrier R, E x)
+ -> (exists x : CRcarrier R, is_upper_bound E x)
+ -> { u : CRcarrier R | is_lub E u }.
+Proof.
+ intros R E sig_forall_dec sig_not_dec Einhab Ebound.
+ pose proof (is_upper_bound_closed E sig_forall_dec sig_not_dec Einhab Ebound).
+ destruct (is_upper_bound_glb
+ E sig_not_dec sig_forall_dec Einhab Ebound); simpl in H.
+ exists x. exact H.
+Qed.
+
+Definition CRis_upper_bound {R : ConstructiveReals} (E:CRcarrier R -> Prop) (m:CRcarrier R)
+ := forall x:CRcarrier R, E x -> CRlt R m x -> False.
+
+Lemma CR_sig_lub :
+ forall {R : ConstructiveReals} (E:CRcarrier R -> Prop),
+ (forall x y : CRcarrier R, CReq R x y -> (E x <-> E y))
+ -> sig_forall_dec_T
+ -> sig_not_dec_T
+ -> (exists x : CRcarrier R, E x)
+ -> (exists x : CRcarrier R, CRis_upper_bound E x)
+ -> { u : CRcarrier R | CRis_upper_bound E u /\
+ forall y:CRcarrier R, CRis_upper_bound E y -> CRlt R y u -> False }.
+Proof.
+ intros. exact (sig_lub E X X0 H0 H1).
+Qed.
diff --git a/theories/Reals/Abstract/ConstructiveLimits.v b/theories/Reals/Abstract/ConstructiveLimits.v
new file mode 100644
index 0000000000..4a40cc8cb3
--- /dev/null
+++ b/theories/Reals/Abstract/ConstructiveLimits.v
@@ -0,0 +1,933 @@
+(************************************************************************)
+(* * The Coq Proof Assistant / The Coq Development Team *)
+(* v * INRIA, CNRS and contributors - Copyright 1999-2019 *)
+(* CRcarrier R) (l : CRcarrier R),
+ (forall n:nat, xn n == yn n)
+ -> CR_cv R xn l
+ -> CR_cv R yn l.
+Proof.
+ intros. intro p. specialize (H0 p) as [n nmaj]. exists n.
+ intros. specialize (nmaj i H0).
+ apply (CRle_trans _ (CRabs R (CRminus R (xn i) l))).
+ 2: exact nmaj. rewrite <- CRabs_def. split.
+ - apply (CRle_trans _ (CRminus R (xn i) l)).
+ apply CRplus_le_compat_r. specialize (H i) as [H _]. exact H.
+ pose proof (CRabs_def R (CRminus R (xn i) l) (CRabs R (CRminus R (xn i) l)))
+ as [_ H1].
+ apply H1. apply CRle_refl.
+ - apply (CRle_trans _ (CRopp R (CRminus R (xn i) l))).
+ intro abs. apply CRopp_lt_cancel, CRplus_lt_reg_r in abs.
+ specialize (H i) as [_ H]. contradiction.
+ pose proof (CRabs_def R (CRminus R (xn i) l) (CRabs R (CRminus R (xn i) l)))
+ as [_ H1].
+ apply H1. apply CRle_refl.
+Qed.
+
+Lemma CR_cv_opp : forall {R : ConstructiveReals} (xn : nat -> CRcarrier R) (l : CRcarrier R),
+ CR_cv R xn l
+ -> CR_cv R (fun n => - xn n) (- l).
+Proof.
+ intros. intro p. specialize (H p) as [n nmaj].
+ exists n. intros. specialize (nmaj i H).
+ apply (CRle_trans _ (CRabs R (CRminus R (xn i) l))).
+ 2: exact nmaj. clear nmaj H.
+ unfold CRminus. rewrite <- CRopp_plus_distr, CRabs_opp.
+ apply CRle_refl.
+Qed.
+
+Lemma CR_cv_plus : forall {R : ConstructiveReals} (xn yn : nat -> CRcarrier R) (a b : CRcarrier R),
+ CR_cv R xn a
+ -> CR_cv R yn b
+ -> CR_cv R (fun n => xn n + yn n) (a + b).
+Proof.
+ intros. intro p.
+ specialize (H (2*p)%positive) as [i imaj].
+ specialize (H0 (2*p)%positive) as [j jmaj].
+ exists (max i j). intros.
+ apply (CRle_trans
+ _ (CRabs R (CRplus R (CRminus R (xn i0) a) (CRminus R (yn i0) b)))).
+ apply CRabs_morph.
+ - unfold CRminus.
+ do 2 rewrite <- (Radd_assoc (CRisRing R)).
+ apply CRplus_morph. reflexivity. rewrite CRopp_plus_distr.
+ destruct (CRisRing R). rewrite Radd_comm, <- Radd_assoc.
+ apply CRplus_morph. reflexivity.
+ rewrite Radd_comm. reflexivity.
+ - apply (CRle_trans _ _ _ (CRabs_triang _ _)).
+ apply (CRle_trans _ (CRplus R (CR_of_Q R (1 # 2*p)) (CR_of_Q R (1 # 2*p)))).
+ apply CRplus_le_compat. apply imaj, (le_trans _ _ _ (Nat.le_max_l _ _) H).
+ apply jmaj, (le_trans _ _ _ (Nat.le_max_r _ _) H).
+ apply (CRle_trans _ (CR_of_Q R ((1 # 2 * p) + (1 # 2 * p)))).
+ apply CR_of_Q_plus. apply CR_of_Q_le.
+ rewrite Qinv_plus_distr. setoid_replace (1 + 1 # 2 * p) with (1 # p).
+ apply Qle_refl. reflexivity.
+Qed.
+
+Lemma CR_cv_unique : forall {R : ConstructiveReals} (xn : nat -> CRcarrier R)
+ (a b : CRcarrier R),
+ CR_cv R xn a
+ -> CR_cv R xn b
+ -> a == b.
+Proof.
+ intros. assert (CR_cv R (fun _ => CRzero R) (CRminus R b a)).
+ { apply (CR_cv_extens (fun n => CRminus R (xn n) (xn n))).
+ intro n. unfold CRminus. apply CRplus_opp_r.
+ apply CR_cv_plus. exact H0. apply CR_cv_opp, H. }
+ assert (forall q r : Q, 0 < q -> / q < r -> 1 < q * r)%Q.
+ { intros. apply (Qmult_lt_l _ _ q) in H3.
+ rewrite Qmult_inv_r in H3. exact H3. intro abs.
+ rewrite abs in H2. exact (Qlt_irrefl 0 H2). exact H2. }
+ clear H H0 xn. remember (CRminus R b a) as z.
+ assert (z == 0). split.
+ - intro abs. destruct (CR_Q_dense R _ _ abs) as [q [H0 H]].
+ destruct (Qarchimedean (/(-q))) as [p pmaj].
+ specialize (H1 p) as [n nmaj].
+ specialize (nmaj n (le_refl n)). apply nmaj.
+ apply (CRlt_trans _ (CR_of_Q R (-q))). apply CR_of_Q_lt.
+ apply H2 in pmaj.
+ apply (Qmult_lt_r _ _ (1#p)) in pmaj. 2: reflexivity.
+ rewrite Qmult_1_l, <- Qmult_assoc in pmaj.
+ setoid_replace ((Z.pos p # 1) * (1 # p))%Q with 1%Q in pmaj.
+ rewrite Qmult_1_r in pmaj. exact pmaj. unfold Qeq, Qnum, Qden; simpl.
+ do 2 rewrite Pos.mul_1_r. reflexivity.
+ apply (Qplus_lt_l _ _ q). ring_simplify.
+ apply (lt_CR_of_Q R q 0). apply (CRlt_le_trans _ (CRzero R) _ H).
+ apply CR_of_Q_zero.
+ apply (CRlt_le_trans _ (CRopp R z)).
+ apply (CRle_lt_trans _ (CRopp R (CR_of_Q R q))). apply CR_of_Q_opp.
+ apply CRopp_gt_lt_contravar, H0.
+ apply (CRle_trans _ (CRabs R (CRopp R z))).
+ pose proof (CRabs_def R (CRopp R z) (CRabs R (CRopp R z))) as [_ H1].
+ apply H1, CRle_refl.
+ apply CRabs_morph. unfold CRminus. symmetry. apply CRplus_0_l.
+ - intro abs. destruct (CR_Q_dense R _ _ abs) as [q [H0 H]].
+ destruct (Qarchimedean (/q)) as [p pmaj].
+ specialize (H1 p) as [n nmaj].
+ specialize (nmaj n (le_refl n)). apply nmaj.
+ apply (CRlt_trans _ (CR_of_Q R q)). apply CR_of_Q_lt.
+ apply H2 in pmaj.
+ apply (Qmult_lt_r _ _ (1#p)) in pmaj. 2: reflexivity.
+ rewrite Qmult_1_l, <- Qmult_assoc in pmaj.
+ setoid_replace ((Z.pos p # 1) * (1 # p))%Q with 1%Q in pmaj.
+ rewrite Qmult_1_r in pmaj. exact pmaj. unfold Qeq, Qnum, Qden; simpl.
+ do 2 rewrite Pos.mul_1_r. reflexivity.
+ apply (lt_CR_of_Q R 0 q). apply (CRle_lt_trans _ (CRzero R)).
+ 2: exact H0. apply CR_of_Q_zero.
+ apply (CRlt_le_trans _ _ _ H).
+ apply (CRle_trans _ (CRabs R (CRopp R z))).
+ apply (CRle_trans _ (CRabs R z)).
+ pose proof (CRabs_def R z (CRabs R z)) as [_ H1].
+ apply H1. apply CRle_refl. apply CRabs_opp.
+ apply CRabs_morph. unfold CRminus. symmetry. apply CRplus_0_l.
+ - subst z. apply (CRplus_eq_reg_l (CRopp R a)).
+ apply (CReq_trans _ (CRzero R)). apply CRplus_opp_l.
+ destruct (CRisRing R).
+ apply (CReq_trans _ (CRplus R b (CRopp R a))). apply CReq_sym, H.
+ apply Radd_comm.
+Qed.
+
+Lemma CR_cv_eq : forall {R : ConstructiveReals}
+ (v u : nat -> CRcarrier R) (s : CRcarrier R),
+ (forall n:nat, u n == v n)
+ -> CR_cv R u s
+ -> CR_cv R v s.
+Proof.
+ intros R v u s seq H1 p. specialize (H1 p) as [N H0].
+ exists N. intros. unfold CRminus. rewrite <- seq. apply H0, H.
+Qed.
+
+Lemma CR_cauchy_eq : forall {R : ConstructiveReals}
+ (un vn : nat -> CRcarrier R),
+ (forall n:nat, un n == vn n)
+ -> CR_cauchy R un
+ -> CR_cauchy R vn.
+Proof.
+ intros. intro p. specialize (H0 p) as [n H0].
+ exists n. intros. specialize (H0 i j H1 H2).
+ unfold CRminus in H0. rewrite <- CRabs_def.
+ rewrite <- CRabs_def in H0.
+ do 2 rewrite H in H0. exact H0.
+Qed.
+
+Lemma CR_cv_proper : forall {R : ConstructiveReals}
+ (un : nat -> CRcarrier R) (a b : CRcarrier R),
+ CR_cv R un a
+ -> a == b
+ -> CR_cv R un b.
+Proof.
+ intros. intro p. specialize (H p) as [n H].
+ exists n. intros. unfold CRminus. rewrite <- H0. apply H, H1.
+Qed.
+
+Instance CR_cv_morph
+ : forall {R : ConstructiveReals} (un : nat -> CRcarrier R), CMorphisms.Proper
+ (CMorphisms.respectful (CReq R) CRelationClasses.iffT) (CR_cv R un).
+Proof.
+ split. intros. apply (CR_cv_proper un x). exact H0. exact H.
+ intros. apply (CR_cv_proper un y). exact H0. symmetry. exact H.
+Qed.
+
+Lemma Un_cv_nat_real : forall {R : ConstructiveReals}
+ (un : nat -> CRcarrier R) (l : CRcarrier R),
+ CR_cv R un l
+ -> forall eps : CRcarrier R,
+ 0 < eps
+ -> { p : nat & forall i:nat, le p i -> CRabs R (un i - l) < eps }.
+Proof.
+ intros. destruct (CR_archimedean R (CRinv R eps (inr H0))) as [k kmaj].
+ assert (0 < CR_of_Q R (Z.pos k # 1)).
+ { rewrite <- CR_of_Q_zero. apply CR_of_Q_lt. reflexivity. }
+ specialize (H k) as [p pmaj].
+ exists p. intros.
+ apply (CRle_lt_trans _ (CR_of_Q R (1 # k))).
+ apply pmaj, H.
+ apply (CRmult_lt_reg_l (CR_of_Q R (Z.pos k # 1))). exact H1.
+ rewrite <- CR_of_Q_mult.
+ apply (CRle_lt_trans _ 1).
+ rewrite <- CR_of_Q_one. apply CR_of_Q_le.
+ unfold Qle; simpl. do 2 rewrite Pos.mul_1_r. apply Z.le_refl.
+ apply (CRmult_lt_reg_r (CRinv R eps (inr H0))).
+ apply CRinv_0_lt_compat, H0. rewrite CRmult_1_l, CRmult_assoc.
+ rewrite CRinv_r, CRmult_1_r. exact kmaj.
+Qed.
+
+Lemma Un_cv_real_nat : forall {R : ConstructiveReals}
+ (un : nat -> CRcarrier R) (l : CRcarrier R),
+ (forall eps : CRcarrier R,
+ 0 < eps
+ -> { p : nat & forall i:nat, le p i -> CRabs R (un i - l) < eps })
+ -> CR_cv R un l.
+Proof.
+ intros. intros n.
+ specialize (H (CR_of_Q R (1#n))) as [p pmaj].
+ rewrite <- CR_of_Q_zero. apply CR_of_Q_lt. reflexivity.
+ exists p. intros. apply CRlt_asym. apply pmaj. apply H.
+Qed.
+
+Definition series_cv {R : ConstructiveReals}
+ (un : nat -> CRcarrier R) (s : CRcarrier R) : Set
+ := CR_cv R (CRsum un) s.
+
+Definition series_cv_lim_lt {R : ConstructiveReals}
+ (un : nat -> CRcarrier R) (x : CRcarrier R) : Set
+ := { l : CRcarrier R & prod (series_cv un l) (l < x) }.
+
+Definition series_cv_le_lim {R : ConstructiveReals}
+ (x : CRcarrier R) (un : nat -> CRcarrier R) : Set
+ := { l : CRcarrier R & prod (series_cv un l) (x <= l) }.
+
+Lemma CR_cv_minus :
+ forall {R : ConstructiveReals}
+ (An Bn:nat -> CRcarrier R) (l1 l2:CRcarrier R),
+ CR_cv R An l1 -> CR_cv R Bn l2
+ -> CR_cv R (fun i:nat => An i - Bn i) (l1 - l2).
+Proof.
+ intros. apply CR_cv_plus. apply H.
+ intros p. specialize (H0 p) as [n H0]. exists n.
+ intros. setoid_replace (- Bn i - - l2) with (- (Bn i - l2)).
+ rewrite CRabs_opp. apply H0, H1. unfold CRminus.
+ rewrite CRopp_plus_distr, CRopp_involutive. reflexivity.
+Qed.
+
+Lemma CR_cv_nonneg :
+ forall {R : ConstructiveReals} (An:nat -> CRcarrier R) (l:CRcarrier R),
+ CR_cv R An l
+ -> (forall n:nat, 0 <= An n)
+ -> 0 <= l.
+Proof.
+ intros. intro abs.
+ destruct (Un_cv_nat_real _ l H (-l)) as [N H1].
+ rewrite <- CRopp_0. apply CRopp_gt_lt_contravar. apply abs.
+ specialize (H1 N (le_refl N)).
+ pose proof (CRabs_def R (An N - l) (CRabs R (An N - l))) as [_ H2].
+ apply (CRle_lt_trans _ _ _ (CRle_abs _)) in H1.
+ apply (H0 N). apply (CRplus_lt_reg_r (-l)).
+ rewrite CRplus_0_l. exact H1.
+Qed.
+
+Lemma series_cv_unique :
+ forall {R : ConstructiveReals} (Un:nat -> CRcarrier R) (l1 l2:CRcarrier R),
+ series_cv Un l1 -> series_cv Un l2 -> l1 == l2.
+Proof.
+ intros. apply (CR_cv_unique (CRsum Un)); assumption.
+Qed.
+
+Lemma CR_cv_scale : forall {R : ConstructiveReals} (u : nat -> CRcarrier R)
+ (a : CRcarrier R) (s : CRcarrier R),
+ CR_cv R u s -> CR_cv R (fun n => u n * a) (s * a).
+Proof.
+ intros. intros n.
+ destruct (CR_archimedean R (1 + CRabs R a)).
+ destruct (H (n * x)%positive).
+ exists x0. intros.
+ unfold CRminus. rewrite CRopp_mult_distr_l.
+ rewrite <- CRmult_plus_distr_r.
+ apply (CRle_trans _ ((CR_of_Q R (1 # n * x)) * CRabs R a)).
+ rewrite CRabs_mult. apply CRmult_le_compat_r. apply CRabs_pos.
+ apply c0, H0.
+ setoid_replace (1 # n * x)%Q with ((1 # n) *(1# x))%Q. 2: reflexivity.
+ rewrite <- (CRmult_1_r (CR_of_Q R (1#n))).
+ rewrite CR_of_Q_mult, CRmult_assoc.
+ apply CRmult_le_compat_l. rewrite <- CR_of_Q_zero.
+ apply CR_of_Q_le. discriminate. intro abs.
+ apply (CRmult_lt_compat_l (CR_of_Q R (Z.pos x #1))) in abs.
+ rewrite CRmult_1_r, <- CRmult_assoc, <- CR_of_Q_mult in abs.
+ rewrite (CR_of_Q_morph R ((Z.pos x # 1) * (1 # x))%Q 1%Q) in abs.
+ rewrite CR_of_Q_one, CRmult_1_l in abs.
+ apply (CRlt_asym _ _ abs), (CRlt_trans _ (1 + CRabs R a)).
+ 2: exact c. rewrite <- CRplus_0_l, <- CRplus_assoc.
+ apply CRplus_lt_compat_r. rewrite CRplus_0_r. apply CRzero_lt_one.
+ unfold Qmult, Qeq, Qnum, Qden. ring_simplify. rewrite Pos.mul_1_l.
+ reflexivity.
+ apply (CRlt_trans _ (1+CRabs R a)). 2: exact c.
+ rewrite CRplus_comm.
+ rewrite <- (CRplus_0_r 0). apply CRplus_le_lt_compat.
+ apply CRabs_pos. apply CRzero_lt_one.
+Qed.
+
+Lemma CR_cv_const : forall {R : ConstructiveReals} (a : CRcarrier R),
+ CR_cv R (fun n => a) a.
+Proof.
+ intros a p. exists O. intros.
+ unfold CRminus. rewrite CRplus_opp_r.
+ rewrite CRabs_right. rewrite <- CR_of_Q_zero.
+ apply CR_of_Q_le. discriminate. apply CRle_refl.
+Qed.
+
+Lemma Rcv_cauchy_mod : forall {R : ConstructiveReals}
+ (un : nat -> CRcarrier R) (l : CRcarrier R),
+ CR_cv R un l -> CR_cauchy R un.
+Proof.
+ intros. intros p. specialize (H (2*p)%positive) as [k H].
+ exists k. intros n q H0 H1.
+ setoid_replace (1#p)%Q with ((1#2*p) + (1#2*p))%Q.
+ rewrite CR_of_Q_plus.
+ setoid_replace (un n - un q) with ((un n - l) - (un q - l)).
+ apply (CRle_trans _ _ _ (CRabs_triang _ _)).
+ apply CRplus_le_compat.
+ - apply H, H0.
+ - rewrite CRabs_opp. apply H. apply H1.
+ - unfold CRminus. rewrite CRplus_assoc. apply CRplus_morph.
+ reflexivity. rewrite CRplus_comm, CRopp_plus_distr, CRopp_involutive.
+ rewrite CRplus_assoc, CRplus_opp_r, CRplus_0_r. reflexivity.
+ - rewrite Qinv_plus_distr. reflexivity.
+Qed.
+
+Lemma series_cv_eq : forall {R : ConstructiveReals}
+ (u v : nat -> CRcarrier R) (s : CRcarrier R),
+ (forall n:nat, u n == v n)
+ -> series_cv u s
+ -> series_cv v s.
+Proof.
+ intros. intros p. specialize (H0 p). destruct H0 as [N H0].
+ exists N. intros. unfold CRminus.
+ rewrite <- (CRsum_eq u). apply H0, H1. intros. apply H.
+Qed.
+
+Lemma CR_growing_transit : forall {R : ConstructiveReals} (un : nat -> CRcarrier R),
+ (forall n:nat, un n <= un (S n))
+ -> forall n p : nat, le n p -> un n <= un p.
+Proof.
+ induction p.
+ - intros. inversion H0. apply CRle_refl.
+ - intros. apply Nat.le_succ_r in H0. destruct H0.
+ apply (CRle_trans _ (un p)). apply IHp, H0. apply H.
+ subst n. apply CRle_refl.
+Qed.
+
+Lemma growing_ineq :
+ forall {R : ConstructiveReals} (Un:nat -> CRcarrier R) (l:CRcarrier R),
+ (forall n:nat, Un n <= Un (S n))
+ -> CR_cv R Un l -> forall n:nat, Un n <= l.
+Proof.
+ intros. intro abs.
+ destruct (Un_cv_nat_real _ l H0 (Un n - l)) as [N H1].
+ rewrite <- (CRplus_opp_r l). apply CRplus_lt_compat_r. exact abs.
+ specialize (H1 (max n N) (Nat.le_max_r _ _)).
+ apply (CRle_lt_trans _ _ _ (CRle_abs _)) in H1.
+ apply CRplus_lt_reg_r in H1.
+ apply (CR_growing_transit Un H n (max n N)). apply Nat.le_max_l.
+ exact H1.
+Qed.
+
+Lemma CR_cv_open_below
+ : forall {R : ConstructiveReals}
+ (un : nat -> CRcarrier R) (m l : CRcarrier R),
+ CR_cv R un l
+ -> m < l
+ -> { n : nat & forall i:nat, le n i -> m < un i }.
+Proof.
+ intros. apply CRlt_minus in H0.
+ pose proof (Un_cv_nat_real _ l H (l-m) H0) as [n nmaj].
+ exists n. intros. specialize (nmaj i H1).
+ apply CRabs_lt in nmaj.
+ destruct nmaj as [_ nmaj]. unfold CRminus in nmaj.
+ rewrite CRopp_plus_distr, CRopp_involutive, CRplus_comm in nmaj.
+ apply CRplus_lt_reg_l in nmaj.
+ apply (CRplus_lt_reg_l R (-m)). rewrite CRplus_opp_l.
+ apply (CRplus_lt_reg_r (-un i)). rewrite CRplus_0_l.
+ rewrite CRplus_assoc, CRplus_opp_r, CRplus_0_r. exact nmaj.
+Qed.
+
+Lemma CR_cv_open_above
+ : forall {R : ConstructiveReals}
+ (un : nat -> CRcarrier R) (m l : CRcarrier R),
+ CR_cv R un l
+ -> l < m
+ -> { n : nat & forall i:nat, le n i -> un i < m }.
+Proof.
+ intros. apply CRlt_minus in H0.
+ pose proof (Un_cv_nat_real _ l H (m-l) H0) as [n nmaj].
+ exists n. intros. specialize (nmaj i H1).
+ apply CRabs_lt in nmaj.
+ destruct nmaj as [nmaj _]. apply CRplus_lt_reg_r in nmaj.
+ exact nmaj.
+Qed.
+
+Lemma CR_cv_bound_down : forall {R : ConstructiveReals}
+ (u : nat -> CRcarrier R) (A l : CRcarrier R) (N : nat),
+ (forall n:nat, le N n -> A <= u n)
+ -> CR_cv R u l
+ -> A <= l.
+Proof.
+ intros. intro r.
+ apply (CRplus_lt_compat_r (-l)) in r. rewrite CRplus_opp_r in r.
+ destruct (Un_cv_nat_real _ l H0 (A - l) r) as [n H1].
+ apply (H (n+N)%nat).
+ rewrite <- (plus_0_l N). rewrite Nat.add_assoc.
+ apply Nat.add_le_mono_r. apply le_0_n.
+ specialize (H1 (n+N)%nat). apply (CRplus_lt_reg_r (-l)).
+ assert (n + N >= n)%nat. rewrite <- (plus_0_r n). rewrite <- plus_assoc.
+ apply Nat.add_le_mono_l. apply le_0_n. specialize (H1 H2).
+ apply (CRle_lt_trans _ (CRabs R (u (n + N)%nat - l))).
+ apply CRle_abs. assumption.
+Qed.
+
+Lemma CR_cv_bound_up : forall {R : ConstructiveReals}
+ (u : nat -> CRcarrier R) (A l : CRcarrier R) (N : nat),
+ (forall n:nat, le N n -> u n <= A)
+ -> CR_cv R u l
+ -> l <= A.
+Proof.
+ intros. intro r.
+ apply (CRplus_lt_compat_r (-A)) in r. rewrite CRplus_opp_r in r.
+ destruct (Un_cv_nat_real _ l H0 (l-A) r) as [n H1].
+ apply (H (n+N)%nat).
+ - rewrite <- (plus_0_l N). apply Nat.add_le_mono_r. apply le_0_n.
+ - specialize (H1 (n+N)%nat). apply (CRplus_lt_reg_l R (l - A - u (n+N)%nat)).
+ unfold CRminus. repeat rewrite CRplus_assoc.
+ rewrite CRplus_opp_l, CRplus_0_r, (CRplus_comm (-A)).
+ rewrite CRplus_assoc, CRplus_opp_r, CRplus_0_r.
+ apply (CRle_lt_trans _ _ _ (CRle_abs _)).
+ fold (l - u (n+N)%nat). rewrite CRabs_minus_sym. apply H1.
+ rewrite <- (plus_0_r n). rewrite <- plus_assoc.
+ apply Nat.add_le_mono_l. apply le_0_n.
+Qed.
+
+Lemma series_cv_maj : forall {R : ConstructiveReals}
+ (un vn : nat -> CRcarrier R) (s : CRcarrier R),
+ (forall n:nat, CRabs R (un n) <= vn n)
+ -> series_cv vn s
+ -> { l : CRcarrier R & prod (series_cv un l) (l <= s) }.
+Proof.
+ intros. destruct (CR_complete R (CRsum un)).
+ - intros n.
+ specialize (H0 (2*n)%positive) as [N maj].
+ exists N. intros i j H0 H1.
+ apply (CRle_trans _ (CRsum vn (max i j) - CRsum vn (min i j))).
+ apply Abs_sum_maj. apply H.
+ setoid_replace (CRsum vn (max i j) - CRsum vn (min i j))
+ with (CRabs R (CRsum vn (max i j) - (CRsum vn (min i j)))).
+ setoid_replace (CRsum vn (Init.Nat.max i j) - CRsum vn (Init.Nat.min i j))
+ with (CRsum vn (Init.Nat.max i j) - s - (CRsum vn (Init.Nat.min i j) - s)).
+ apply (CRle_trans _ _ _ (CRabs_triang _ _)).
+ setoid_replace (1#n)%Q with ((1#2*n) + (1#2*n))%Q.
+ rewrite CR_of_Q_plus.
+ apply CRplus_le_compat.
+ apply maj. apply (le_trans _ i). assumption. apply Nat.le_max_l.
+ rewrite CRabs_opp. apply maj.
+ apply Nat.min_case. apply (le_trans _ i). assumption. apply le_refl.
+ assumption. rewrite Qinv_plus_distr. reflexivity.
+ unfold CRminus. rewrite CRplus_assoc. apply CRplus_morph.
+ reflexivity. rewrite CRopp_plus_distr, CRopp_involutive.
+ rewrite CRplus_comm, CRplus_assoc, CRplus_opp_r, CRplus_0_r.
+ reflexivity.
+ rewrite CRabs_right. reflexivity.
+ rewrite <- (CRplus_opp_r (CRsum vn (Init.Nat.min i j))).
+ apply CRplus_le_compat. apply pos_sum_more.
+ intros. apply (CRle_trans _ (CRabs R (un k))). apply CRabs_pos.
+ apply H. apply (le_trans _ i). apply Nat.le_min_l. apply Nat.le_max_l.
+ apply CRle_refl.
+ - exists x. split. assumption.
+ (* x <= s *)
+ apply (CRplus_le_reg_r (-x)). rewrite CRplus_opp_r.
+ apply (CR_cv_bound_down (fun n => CRsum vn n - CRsum un n) _ _ 0).
+ intros. rewrite <- (CRplus_opp_r (CRsum un n)).
+ apply CRplus_le_compat. apply sum_Rle.
+ intros. apply (CRle_trans _ (CRabs R (un k))).
+ apply CRle_abs. apply H. apply CRle_refl.
+ apply CR_cv_plus. assumption.
+ apply CR_cv_opp. assumption.
+Qed.
+
+Lemma series_cv_abs_lt
+ : forall {R : ConstructiveReals} (un vn : nat -> CRcarrier R) (l : CRcarrier R),
+ (forall n:nat, CRabs R (un n) <= vn n)
+ -> series_cv_lim_lt vn l
+ -> series_cv_lim_lt un l.
+Proof.
+ intros. destruct H0 as [x [H0 H1]].
+ destruct (series_cv_maj un vn x H H0) as [x0 H2].
+ exists x0. split. apply H2. apply (CRle_lt_trans _ x).
+ apply H2. apply H1.
+Qed.
+
+Definition series_cv_abs {R : ConstructiveReals} (u : nat -> CRcarrier R)
+ : CR_cauchy R (CRsum (fun n => CRabs R (u n)))
+ -> { l : CRcarrier R & series_cv u l }.
+Proof.
+ intros. apply CR_complete in H. destruct H.
+ destruct (series_cv_maj u (fun k => CRabs R (u k)) x).
+ intro n. apply CRle_refl. assumption. exists x0. apply p.
+Qed.
+
+Lemma series_cv_abs_eq
+ : forall {R : ConstructiveReals} (u : nat -> CRcarrier R) (a : CRcarrier R)
+ (cau : CR_cauchy R (CRsum (fun n => CRabs R (u n)))),
+ series_cv u a
+ -> (a == (let (l,_):= series_cv_abs u cau in l))%ConstructiveReals.
+Proof.
+ intros. destruct (series_cv_abs u cau).
+ apply (series_cv_unique u). exact H. exact s.
+Qed.
+
+Lemma series_cv_abs_cv
+ : forall {R : ConstructiveReals} (u : nat -> CRcarrier R)
+ (cau : CR_cauchy R (CRsum (fun n => CRabs R (u n)))),
+ series_cv u (let (l,_):= series_cv_abs u cau in l).
+Proof.
+ intros. destruct (series_cv_abs u cau). exact s.
+Qed.
+
+Lemma series_cv_opp : forall {R : ConstructiveReals}
+ (s : CRcarrier R) (u : nat -> CRcarrier R),
+ series_cv u s
+ -> series_cv (fun n => - u n) (- s).
+Proof.
+ intros. intros p. specialize (H p) as [N H].
+ exists N. intros n H0.
+ setoid_replace (CRsum (fun n0 : nat => - u n0) n - - s)
+ with (-(CRsum (fun n0 : nat => u n0) n - s)).
+ rewrite CRabs_opp.
+ apply H, H0. unfold CRminus.
+ rewrite sum_opp. rewrite CRopp_plus_distr. reflexivity.
+Qed.
+
+Lemma series_cv_scale : forall {R : ConstructiveReals}
+ (a : CRcarrier R) (s : CRcarrier R) (u : nat -> CRcarrier R),
+ series_cv u s
+ -> series_cv (fun n => (u n) * a) (s * a).
+Proof.
+ intros.
+ apply (CR_cv_eq _ (fun n => CRsum u n * a)).
+ intro n. rewrite sum_scale. reflexivity. apply CR_cv_scale, H.
+Qed.
+
+Lemma series_cv_plus : forall {R : ConstructiveReals}
+ (u v : nat -> CRcarrier R) (s t : CRcarrier R),
+ series_cv u s
+ -> series_cv v t
+ -> series_cv (fun n => u n + v n) (s + t).
+Proof.
+ intros. apply (CR_cv_eq _ (fun n => CRsum u n + CRsum v n)).
+ intro n. symmetry. apply sum_plus. apply CR_cv_plus. exact H. exact H0.
+Qed.
+
+Lemma series_cv_nonneg : forall {R : ConstructiveReals}
+ (u : nat -> CRcarrier R) (s : CRcarrier R),
+ (forall n:nat, 0 <= u n) -> series_cv u s -> 0 <= s.
+Proof.
+ intros. apply (CRle_trans 0 (CRsum u 0)). apply H.
+ apply (growing_ineq (CRsum u)). intro n. simpl.
+ rewrite <- CRplus_0_r. apply CRplus_le_compat.
+ rewrite CRplus_0_r. apply CRle_refl. apply H. apply H0.
+Qed.
+
+Lemma CR_cv_le : forall {R : ConstructiveReals}
+ (u v : nat -> CRcarrier R) (a b : CRcarrier R),
+ (forall n:nat, u n <= v n)
+ -> CR_cv R u a
+ -> CR_cv R v b
+ -> a <= b.
+Proof.
+ intros. apply (CRplus_le_reg_r (-a)). rewrite CRplus_opp_r.
+ apply (CR_cv_bound_down (fun i:nat => v i - u i) _ _ 0).
+ intros. rewrite <- (CRplus_opp_l (u n)).
+ unfold CRminus.
+ rewrite (CRplus_comm (v n)). apply CRplus_le_compat_l.
+ apply H. apply CR_cv_plus. exact H1. apply CR_cv_opp, H0.
+Qed.
+
+Lemma CR_cv_abs_cont : forall {R : ConstructiveReals}
+ (u : nat -> CRcarrier R) (s : CRcarrier R),
+ CR_cv R u s
+ -> CR_cv R (fun n => CRabs R (u n)) (CRabs R s).
+Proof.
+ intros. intros eps. specialize (H eps) as [N lim].
+ exists N. intros n H.
+ apply (CRle_trans _ (CRabs R (u n - s))). apply CRabs_triang_inv2.
+ apply lim. assumption.
+Qed.
+
+Lemma CR_cv_dist_cont : forall {R : ConstructiveReals}
+ (u : nat -> CRcarrier R) (a s : CRcarrier R),
+ CR_cv R u s
+ -> CR_cv R (fun n => CRabs R (a - u n)) (CRabs R (a - s)).
+Proof.
+ intros. apply CR_cv_abs_cont.
+ intros eps. specialize (H eps) as [N lim].
+ exists N. intros n H.
+ setoid_replace (a - u n - (a - s)) with (s - (u n)).
+ specialize (lim n).
+ rewrite CRabs_minus_sym.
+ apply lim. assumption.
+ unfold CRminus. rewrite CRopp_plus_distr, CRopp_involutive.
+ rewrite (CRplus_comm a), (CRplus_comm s).
+ rewrite CRplus_assoc. apply CRplus_morph. reflexivity.
+ rewrite <- CRplus_assoc, CRplus_opp_r, CRplus_0_l. reflexivity.
+Qed.
+
+Lemma series_cv_triangle : forall {R : ConstructiveReals}
+ (u : nat -> CRcarrier R) (s sAbs : CRcarrier R),
+ series_cv u s
+ -> series_cv (fun n => CRabs R (u n)) sAbs
+ -> CRabs R s <= sAbs.
+Proof.
+ intros.
+ apply (CR_cv_le (fun n => CRabs R (CRsum u n))
+ (CRsum (fun n => CRabs R (u n)))).
+ intros. apply multiTriangleIneg. apply CR_cv_abs_cont. assumption. assumption.
+Qed.
+
+Lemma CR_double : forall {R : ConstructiveReals} (x:CRcarrier R),
+ CR_of_Q R 2 * x == x + x.
+Proof.
+ intros R x. rewrite (CR_of_Q_morph R 2 (1+1)).
+ 2: reflexivity. rewrite CR_of_Q_plus, CR_of_Q_one.
+ rewrite CRmult_plus_distr_r, CRmult_1_l. reflexivity.
+Qed.
+
+Lemma GeoCvZero : forall {R : ConstructiveReals},
+ CR_cv R (fun n:nat => CRpow (CR_of_Q R (1#2)) n) 0.
+Proof.
+ intro R. assert (forall n:nat, INR n < CRpow (CR_of_Q R 2) n).
+ { induction n. unfold INR; simpl. rewrite CR_of_Q_zero.
+ apply CRzero_lt_one. unfold INR. fold (1+n)%nat.
+ rewrite Nat2Z.inj_add.
+ rewrite (CR_of_Q_morph R _ ((Z.of_nat 1 # 1) + (Z.of_nat n #1))).
+ 2: symmetry; apply Qinv_plus_distr.
+ rewrite CR_of_Q_plus.
+ replace (CRpow (CR_of_Q R 2) (1 + n))
+ with (CR_of_Q R 2 * CRpow (CR_of_Q R 2) n).
+ 2: reflexivity. rewrite CR_double.
+ apply CRplus_le_lt_compat.
+ 2: exact IHn. simpl. rewrite CR_of_Q_one.
+ apply pow_R1_Rle. rewrite <- CR_of_Q_one. apply CR_of_Q_le. discriminate. }
+ intros p. exists (Pos.to_nat p). intros.
+ unfold CRminus. rewrite CRopp_0. rewrite CRplus_0_r.
+ rewrite CRabs_right.
+ 2: apply pow_le; rewrite <- CR_of_Q_zero; apply CR_of_Q_le; discriminate.
+ apply CRlt_asym.
+ apply (CRmult_lt_reg_l (CR_of_Q R (Z.pos p # 1))).
+ rewrite <- CR_of_Q_zero. apply CR_of_Q_lt. reflexivity. rewrite <- CR_of_Q_mult.
+ rewrite (CR_of_Q_morph R ((Z.pos p # 1) * (1 # p)) 1).
+ 2: unfold Qmult, Qeq, Qnum, Qden; ring_simplify; reflexivity.
+ apply (CRmult_lt_reg_r (CRpow (CR_of_Q R 2) i)).
+ apply pow_lt. simpl. rewrite <- CR_of_Q_zero.
+ apply CR_of_Q_lt. reflexivity.
+ rewrite CRmult_assoc. rewrite pow_mult.
+ rewrite (pow_proper (CR_of_Q R (1 # 2) * CR_of_Q R 2) 1), pow_one.
+ rewrite CRmult_1_r, CR_of_Q_one, CRmult_1_l.
+ apply (CRle_lt_trans _ (INR i)). 2: exact (H i). clear H.
+ apply CR_of_Q_le. unfold Qle,Qnum,Qden.
+ do 2 rewrite Z.mul_1_r.
+ rewrite <- positive_nat_Z. apply Nat2Z.inj_le, H0.
+ rewrite <- CR_of_Q_mult. setoid_replace ((1#2)*2)%Q with 1%Q.
+ apply CR_of_Q_one. reflexivity.
+Qed.
+
+Lemma GeoFiniteSum : forall {R : ConstructiveReals} (n:nat),
+ CRsum (CRpow (CR_of_Q R (1#2))) n == CR_of_Q R 2 - CRpow (CR_of_Q R (1#2)) n.
+Proof.
+ induction n.
+ - unfold CRsum, CRpow. simpl (1%ConstructiveReals).
+ unfold CRminus. rewrite (CR_of_Q_morph R _ (1+1)).
+ rewrite CR_of_Q_plus, CR_of_Q_one, CRplus_assoc.
+ rewrite CRplus_opp_r, CRplus_0_r. reflexivity. reflexivity.
+ - setoid_replace (CRsum (CRpow (CR_of_Q R (1 # 2))) (S n))
+ with (CRsum (CRpow (CR_of_Q R (1 # 2))) n + CRpow (CR_of_Q R (1 # 2)) (S n)).
+ 2: reflexivity.
+ rewrite IHn. clear IHn. unfold CRminus.
+ rewrite CRplus_assoc. apply CRplus_morph. reflexivity.
+ apply (CRplus_eq_reg_l
+ (CRpow (CR_of_Q R (1 # 2)) n + CRpow (CR_of_Q R (1 # 2)) (S n))).
+ rewrite (CRplus_assoc _ _ (-CRpow (CR_of_Q R (1 # 2)) (S n))),
+ CRplus_opp_r, CRplus_0_r.
+ rewrite (CRplus_comm (CRpow (CR_of_Q R (1 # 2)) n)), CRplus_assoc.
+ rewrite <- (CRplus_assoc (CRpow (CR_of_Q R (1 # 2)) n)), CRplus_opp_r,
+ CRplus_0_l, <- CR_double.
+ setoid_replace (CRpow (CR_of_Q R (1 # 2)) (S n))
+ with (CR_of_Q R (1 # 2) * CRpow (CR_of_Q R (1 # 2)) n).
+ 2: reflexivity.
+ rewrite <- CRmult_assoc, <- CR_of_Q_mult.
+ setoid_replace (2 * (1 # 2))%Q with 1%Q.
+ rewrite CR_of_Q_one. apply CRmult_1_l. reflexivity.
+Qed.
+
+Lemma GeoHalfBelowTwo : forall {R : ConstructiveReals} (n:nat),
+ CRsum (CRpow (CR_of_Q R (1#2))) n < CR_of_Q R 2.
+Proof.
+ intros. rewrite <- (CRplus_0_r (CR_of_Q R 2)), GeoFiniteSum.
+ apply CRplus_lt_compat_l. rewrite <- CRopp_0.
+ apply CRopp_gt_lt_contravar.
+ apply pow_lt. rewrite <- CR_of_Q_zero. apply CR_of_Q_lt. reflexivity.
+Qed.
+
+Lemma GeoHalfTwo : forall {R : ConstructiveReals},
+ series_cv (fun n => CRpow (CR_of_Q R (1#2)) n) (CR_of_Q R 2).
+Proof.
+ intro R.
+ apply (CR_cv_eq _ (fun n => CR_of_Q R 2 - CRpow (CR_of_Q R (1 # 2)) n)).
+ - intro n. rewrite GeoFiniteSum. reflexivity.
+ - assert (forall n:nat, INR n < CRpow (CR_of_Q R 2) n).
+ { induction n. unfold INR; simpl. rewrite CR_of_Q_zero.
+ apply CRzero_lt_one. apply (CRlt_le_trans _ (CRpow (CR_of_Q R 2) n + 1)).
+ unfold INR.
+ rewrite Nat2Z.inj_succ, <- Z.add_1_l.
+ rewrite (CR_of_Q_morph R _ (1 + (Z.of_nat n #1))).
+ 2: symmetry; apply Qinv_plus_distr. rewrite CR_of_Q_plus.
+ rewrite CRplus_comm. rewrite CR_of_Q_one.
+ apply CRplus_lt_compat_r, IHn.
+ setoid_replace (CRpow (CR_of_Q R 2) (S n))
+ with (CRpow (CR_of_Q R 2) n + CRpow (CR_of_Q R 2) n).
+ apply CRplus_le_compat. apply CRle_refl.
+ apply pow_R1_Rle. rewrite <- CR_of_Q_one. apply CR_of_Q_le. discriminate.
+ rewrite <- CR_double. reflexivity. }
+ intros n. exists (Pos.to_nat n). intros.
+ setoid_replace (CR_of_Q R 2 - CRpow (CR_of_Q R (1 # 2)) i - CR_of_Q R 2)
+ with (- CRpow (CR_of_Q R (1 # 2)) i).
+ rewrite CRabs_opp. rewrite CRabs_right.
+ assert (0 < CR_of_Q R 2).
+ { rewrite <- CR_of_Q_zero. apply CR_of_Q_lt. reflexivity. }
+ rewrite (pow_proper _ (CRinv R (CR_of_Q R 2) (inr H1))).
+ rewrite pow_inv. apply CRlt_asym.
+ apply (CRmult_lt_reg_l (CRpow (CR_of_Q R 2) i)). apply pow_lt, H1.
+ rewrite CRinv_r.
+ apply (CRmult_lt_reg_r (CR_of_Q R (Z.pos n#1))).
+ rewrite <- CR_of_Q_zero. apply CR_of_Q_lt. reflexivity.
+ rewrite CRmult_1_l, CRmult_assoc.
+ rewrite <- CR_of_Q_mult.
+ rewrite (CR_of_Q_morph R ((1 # n) * (Z.pos n # 1)) 1). 2: reflexivity.
+ rewrite CR_of_Q_one, CRmult_1_r. apply (CRle_lt_trans _ (INR i)).
+ 2: apply H. apply CR_of_Q_le.
+ unfold Qle, Qnum, Qden. do 2 rewrite Z.mul_1_r. destruct i.
+ exfalso. inversion H0. pose proof (Pos2Nat.is_pos n).
+ rewrite H3 in H2. inversion H2.
+ apply Pos2Z.pos_le_pos. apply Pos2Nat.inj_le.
+ apply (le_trans _ _ _ H0). rewrite SuccNat2Pos.id_succ. apply le_refl.
+ apply (CRmult_eq_reg_l (CR_of_Q R 2)). right. exact H1.
+ rewrite CRinv_r. rewrite <- CR_of_Q_mult.
+ setoid_replace (2 * (1 # 2))%Q with 1%Q.
+ apply CR_of_Q_one. reflexivity.
+ apply CRlt_asym, pow_lt. rewrite <- CR_of_Q_zero.
+ apply CR_of_Q_lt. reflexivity.
+ unfold CRminus. rewrite CRplus_comm, <- CRplus_assoc.
+ rewrite CRplus_opp_l, CRplus_0_l. reflexivity.
+Qed.
+
+Lemma series_cv_remainder_maj : forall {R : ConstructiveReals} (u : nat -> CRcarrier R)
+ (s eps : CRcarrier R)
+ (N : nat),
+ series_cv u s
+ -> 0 < eps
+ -> (forall n:nat, 0 <= u n)
+ -> CRabs R (CRsum u N - s) <= eps
+ -> forall n:nat, CRsum (fun k=> u (N + S k)%nat) n <= eps.
+Proof.
+ intros. pose proof (sum_assoc u N n).
+ rewrite <- (CRsum_eq (fun k : nat => u (S N + k)%nat)).
+ apply (CRplus_le_reg_l (CRsum u N)). rewrite <- H3.
+ apply (CRle_trans _ s). apply growing_ineq.
+ 2: apply H.
+ intro k. simpl. rewrite <- CRplus_0_r, CRplus_assoc.
+ apply CRplus_le_compat_l. rewrite CRplus_0_l. apply H1.
+ rewrite CRabs_minus_sym in H2.
+ rewrite CRplus_comm. apply (CRplus_le_reg_r (-CRsum u N)).
+ rewrite CRplus_assoc. rewrite CRplus_opp_r. rewrite CRplus_0_r.
+ apply (CRle_trans _ (CRabs R (s - CRsum u N))). apply CRle_abs.
+ assumption. intros. rewrite Nat.add_succ_r. reflexivity.
+Qed.
+
+Lemma series_cv_abs_remainder : forall {R : ConstructiveReals} (u : nat -> CRcarrier R)
+ (s sAbs : CRcarrier R)
+ (n : nat),
+ series_cv u s
+ -> series_cv (fun n => CRabs R (u n)) sAbs
+ -> CRabs R (CRsum u n - s)
+ <= sAbs - CRsum (fun n => CRabs R (u n)) n.
+Proof.
+ intros.
+ apply (CR_cv_le (fun N => CRabs R (CRsum u n - (CRsum u (n + N))))
+ (fun N => CRsum (fun n : nat => CRabs R (u n)) (n + N)
+ - CRsum (fun n : nat => CRabs R (u n)) n)).
+ - intro N. destruct N. rewrite plus_0_r. unfold CRminus.
+ rewrite CRplus_opp_r. rewrite CRplus_opp_r.
+ rewrite CRabs_right. apply CRle_refl. apply CRle_refl.
+ rewrite Nat.add_succ_r.
+ replace (S (n + N)) with (S n + N)%nat. 2: reflexivity.
+ unfold CRminus. rewrite sum_assoc. rewrite sum_assoc.
+ rewrite CRopp_plus_distr.
+ rewrite <- CRplus_assoc, CRplus_opp_r, CRplus_0_l, CRabs_opp.
+ rewrite CRplus_comm, <- CRplus_assoc, CRplus_opp_l.
+ rewrite CRplus_0_l. apply multiTriangleIneg.
+ - apply CR_cv_dist_cont. intros eps.
+ specialize (H eps) as [N lim].
+ exists N. intros. rewrite plus_comm. apply lim. apply (le_trans N i).
+ assumption. rewrite <- (plus_0_r i). rewrite <- plus_assoc.
+ apply Nat.add_le_mono_l. apply le_0_n.
+ - apply CR_cv_plus. 2: apply CR_cv_const. intros eps.
+ specialize (H0 eps) as [N lim].
+ exists N. intros. rewrite plus_comm. apply lim. apply (le_trans N i).
+ assumption. rewrite <- (plus_0_r i). rewrite <- plus_assoc.
+ apply Nat.add_le_mono_l. apply le_0_n.
+Qed.
+
+Lemma series_cv_minus : forall {R : ConstructiveReals}
+ (u v : nat -> CRcarrier R) (s t : CRcarrier R),
+ series_cv u s
+ -> series_cv v t
+ -> series_cv (fun n => u n - v n) (s - t).
+Proof.
+ intros. apply (CR_cv_eq _ (fun n => CRsum u n - CRsum v n)).
+ intro n. symmetry. unfold CRminus. rewrite sum_plus.
+ rewrite sum_opp. reflexivity.
+ apply CR_cv_plus. exact H. apply CR_cv_opp. exact H0.
+Qed.
+
+Lemma series_cv_le : forall {R : ConstructiveReals}
+ (un vn : nat -> CRcarrier R) (a b : CRcarrier R),
+ (forall n:nat, un n <= vn n)
+ -> series_cv un a
+ -> series_cv vn b
+ -> a <= b.
+Proof.
+ intros. apply (CRplus_le_reg_r (-a)). rewrite CRplus_opp_r.
+ apply (series_cv_nonneg (fun n => vn n - un n)).
+ intro n. apply (CRplus_le_reg_r (un n)).
+ rewrite CRplus_0_l. unfold CRminus.
+ rewrite CRplus_assoc, CRplus_opp_l, CRplus_0_r.
+ apply H. apply series_cv_minus; assumption.
+Qed.
+
+Lemma series_cv_series : forall {R : ConstructiveReals}
+ (u : nat -> nat -> CRcarrier R) (s : nat -> CRcarrier R) (n : nat),
+ (forall i:nat, le i n -> series_cv (u i) (s i))
+ -> series_cv (fun i => CRsum (fun j => u j i) n) (CRsum s n).
+Proof.
+ induction n.
+ - intros. simpl. specialize (H O).
+ apply (series_cv_eq (u O)). reflexivity. apply H. apply le_refl.
+ - intros. simpl. apply (series_cv_plus). 2: apply (H (S n)).
+ apply IHn. 2: apply le_refl. intros. apply H.
+ apply (le_trans _ n _ H0). apply le_S. apply le_refl.
+Qed.
+
+Lemma CR_cv_shift :
+ forall {R : ConstructiveReals} f k l,
+ CR_cv R (fun n => f (n + k)%nat) l -> CR_cv R f l.
+Proof.
+ intros. intros eps.
+ specialize (H eps) as [N Nmaj].
+ exists (N+k)%nat. intros n H.
+ destruct (Nat.le_exists_sub k n).
+ apply (le_trans _ (N + k)). 2: exact H.
+ apply (le_trans _ (0 + k)). apply le_refl.
+ rewrite <- Nat.add_le_mono_r. apply le_0_n.
+ destruct H0.
+ subst n. apply Nmaj. unfold ge in H.
+ rewrite <- Nat.add_le_mono_r in H. exact H.
+Qed.
+
+Lemma CR_cv_shift' :
+ forall {R : ConstructiveReals} f k l,
+ CR_cv R f l -> CR_cv R (fun n => f (n + k)%nat) l.
+Proof.
+ intros R f' k l cvf eps; destruct (cvf eps) as [N Pn].
+ exists N; intros n nN; apply Pn; auto with arith.
+Qed.
+
+Lemma series_cv_shift :
+ forall {R : ConstructiveReals} (f : nat -> CRcarrier R) k l,
+ series_cv (fun n => f (S k + n)%nat) l
+ -> series_cv f (l + CRsum f k).
+Proof.
+ intros. intro p. specialize (H p) as [n nmaj].
+ exists (S k+n)%nat. intros. destruct (Nat.le_exists_sub (S k) i).
+ apply (le_trans _ (S k + 0)). rewrite Nat.add_0_r. apply le_refl.
+ apply (le_trans _ (S k + n)). apply Nat.add_le_mono_l, le_0_n.
+ exact H. destruct H0. subst i.
+ rewrite Nat.add_comm in H. rewrite <- Nat.add_le_mono_r in H.
+ specialize (nmaj x H). unfold CRminus.
+ rewrite Nat.add_comm, (sum_assoc f k x).
+ setoid_replace (CRsum f k + CRsum (fun k0 : nat => f (S k + k0)%nat) x - (l + CRsum f k))
+ with (CRsum (fun k0 : nat => f (S k + k0)%nat) x - l).
+ exact nmaj. unfold CRminus. rewrite (CRplus_comm (CRsum f k)).
+ rewrite CRplus_assoc. apply CRplus_morph. reflexivity.
+ rewrite CRplus_comm, CRopp_plus_distr, CRplus_assoc.
+ rewrite CRplus_opp_l, CRplus_0_r. reflexivity.
+Qed.
+
+Lemma series_cv_shift' : forall {R : ConstructiveReals}
+ (un : nat -> CRcarrier R) (s : CRcarrier R) (shift : nat),
+ series_cv un s
+ -> series_cv (fun n => un (n+shift)%nat)
+ (s - match shift with
+ | O => 0
+ | S p => CRsum un p
+ end).
+Proof.
+ intros. destruct shift as [|p].
+ - unfold CRminus. rewrite CRopp_0. rewrite CRplus_0_r.
+ apply (series_cv_eq un). intros.
+ rewrite plus_0_r. reflexivity. apply H.
+ - apply (CR_cv_eq _ (fun n => CRsum un (n + S p) - CRsum un p)).
+ intros. rewrite plus_comm. unfold CRminus.
+ rewrite sum_assoc. simpl. rewrite CRplus_comm, <- CRplus_assoc.
+ rewrite CRplus_opp_l, CRplus_0_l.
+ apply CRsum_eq. intros. rewrite (plus_comm i). reflexivity.
+ apply CR_cv_plus. apply (CR_cv_shift' _ (S p) _ H).
+ intros n. exists (Pos.to_nat n). intros.
+ unfold CRminus. simpl.
+ rewrite CRopp_involutive, CRplus_opp_l. rewrite CRabs_right.
+ rewrite <- CR_of_Q_zero. apply CR_of_Q_le. discriminate. apply CRle_refl.
+Qed.
diff --git a/theories/Reals/Abstract/ConstructiveReals.v b/theories/Reals/Abstract/ConstructiveReals.v
new file mode 100644
index 0000000000..d91fd1183a
--- /dev/null
+++ b/theories/Reals/Abstract/ConstructiveReals.v
@@ -0,0 +1,1149 @@
+(************************************************************************)
+(* * The Coq Proof Assistant / The Coq Development Team *)
+(* v * INRIA, CNRS and contributors - Copyright 1999-2019 *)
+(* Prop;
+ upper : Q -> Prop;
+ (* The cuts respect equality on Q. *)
+ lower_proper : Proper (Qeq ==> iff) lower;
+ upper_proper : Proper (Qeq ==> iff) upper;
+ (* The cuts are inhabited. *)
+ lower_bound : { q : Q | lower q };
+ upper_bound : { r : Q | upper r };
+ (* The lower cut is a lower set. *)
+ lower_lower : forall q r, q < r -> lower r -> lower q;
+ (* The lower cut is open. *)
+ lower_open : forall q, lower q -> exists r, q < r /\ lower r;
+ (* The upper cut is an upper set. *)
+ upper_upper : forall q r, q < r -> upper q -> upper r;
+ (* The upper cut is open. *)
+ upper_open : forall r, upper r -> exists q, q < r /\ upper q;
+ (* The cuts are disjoint. *)
+ disjoint : forall q, ~ (lower q /\ upper q);
+ (* There is no gap between the cuts. *)
+ located : forall q r, q < r -> { lower q } + { upper r }
+}.
+
+ see github.com/andrejbauer/dedekind-reals for the Prop-based
+ version of those Dedekind reals (although Prop fails to make
+ them an instance of ConstructiveReals).
+
+ Any computation about constructive reals can be worked
+ in the fastest instance for it; we then transport the results
+ to all other instances by the isomorphisms. This way of working
+ is different from the usual interfaces, where we would rather
+ prove things abstractly, by quantifying universally on the instance.
+
+ The functions of ConstructiveReals do not have a direct impact
+ on performance, because algorithms will be extracted from instances,
+ and because fast ConstructiveReals morphisms should be coded
+ manually. However, since instances are forced to implement
+ those functions, it is probable that they will also use them
+ in their algorithms. So those functions hint at what we think
+ will yield fast and small extracted programs.
+
+ Constructive reals are setoids, which custom equality is defined as
+ x == y iff (x <= y /\ y <= x).
+ It is hard to quotient constructively to get the Leibniz equality
+ on the real numbers. In "Sheaves in Geometry and Logic",
+ MacLane and Moerdijk show a topos in which all functions R -> Z
+ are constant. Consequently all functions R -> Q are constant and
+ it is not possible to approximate real numbers by rational numbers. *)
+
+
+Require Import QArith Qabs Qround.
+
+Definition isLinearOrder {X : Set} (Xlt : X -> X -> Set) : Set
+ := (forall x y:X, Xlt x y -> Xlt y x -> False)
+ * (forall x y z : X, Xlt x y -> Xlt y z -> Xlt x z)
+ * (forall x y z : X, Xlt x z -> Xlt x y + Xlt y z).
+
+Structure ConstructiveReals : Type :=
+ {
+ CRcarrier : Set;
+
+ (* Put this order relation in sort Set rather than Prop,
+ to allow the definition of fast ConstructiveReals morphisms.
+ For example, the Cauchy reals do store information in
+ the proofs of CRlt, which is used in algorithms in sort Set. *)
+ CRlt : CRcarrier -> CRcarrier -> Set;
+ CRltLinear : isLinearOrder CRlt;
+
+ CRle (x y : CRcarrier) := CRlt y x -> False;
+ CReq (x y : CRcarrier) := CRle y x /\ CRle x y;
+ CRapart (x y : CRcarrier) := sum (CRlt x y) (CRlt y x);
+
+ (* The propositional truncation of CRlt. It facilitates proofs
+ when computations are not considered important, for example in
+ classical reals with extra logical axioms. *)
+ CRltProp : CRcarrier -> CRcarrier -> Prop;
+ (* This choice algorithm can be slow, keep it for the classical
+ quotient of the reals, where computations are blocked by
+ axioms like LPO. *)
+ CRltEpsilon : forall x y : CRcarrier, CRltProp x y -> CRlt x y;
+ CRltForget : forall x y : CRcarrier, CRlt x y -> CRltProp x y;
+ CRltDisjunctEpsilon : forall a b c d : CRcarrier,
+ (CRltProp a b \/ CRltProp c d) -> CRlt a b + CRlt c d;
+
+ (* Constants *)
+ CRzero : CRcarrier;
+ CRone : CRcarrier;
+
+ (* Addition and multiplication *)
+ CRplus : CRcarrier -> CRcarrier -> CRcarrier;
+ CRopp : CRcarrier -> CRcarrier; (* Computable opposite,
+ stronger than Prop-existence of opposite *)
+ CRmult : CRcarrier -> CRcarrier -> CRcarrier;
+
+ CRisRing : ring_theory CRzero CRone CRplus CRmult
+ (fun x y => CRplus x (CRopp y)) CRopp CReq;
+ CRisRingExt : ring_eq_ext CRplus CRmult CRopp CReq;
+
+ (* Compatibility with order *)
+ CRzero_lt_one : CRlt CRzero CRone; (* 0 # 1 would only allow 0 < 1 because
+ of Fmult_lt_0_compat so request 0 < 1 directly. *)
+ CRplus_lt_compat_l : forall r r1 r2 : CRcarrier,
+ CRlt r1 r2 -> CRlt (CRplus r r1) (CRplus r r2);
+ CRplus_lt_reg_l : forall r r1 r2 : CRcarrier,
+ CRlt (CRplus r r1) (CRplus r r2) -> CRlt r1 r2;
+ CRmult_lt_0_compat : forall x y : CRcarrier,
+ CRlt CRzero x -> CRlt CRzero y -> CRlt CRzero (CRmult x y);
+
+ (* A constructive total inverse function on F would need to be continuous,
+ which is impossible because we cannot connect plus and minus infinities.
+ Therefore it has to be a partial function, defined on non zero elements.
+ For this reason we cannot use Coq's field_theory and field tactic.
+
+ To implement Finv by Cauchy sequences we need orderAppart,
+ ~orderEq is not enough. *)
+ CRinv : forall x : CRcarrier, CRapart x CRzero -> CRcarrier;
+ CRinv_l : forall (r:CRcarrier) (rnz : CRapart r CRzero),
+ CReq (CRmult (CRinv r rnz) r) CRone;
+ CRinv_0_lt_compat : forall (r : CRcarrier) (rnz : CRapart r CRzero),
+ CRlt CRzero r -> CRlt CRzero (CRinv r rnz);
+
+ (* The initial field morphism (in characteristic zero).
+ The abstract definition by iteration of addition is
+ probably the slowest. Let each instance implement
+ a faster (and often simpler) version. *)
+ CR_of_Q : Q -> CRcarrier;
+ CR_of_Q_plus : forall q r : Q, CReq (CR_of_Q (q+r))
+ (CRplus (CR_of_Q q) (CR_of_Q r));
+ CR_of_Q_mult : forall q r : Q, CReq (CR_of_Q (q*r))
+ (CRmult (CR_of_Q q) (CR_of_Q r));
+ CR_of_Q_one : CReq (CR_of_Q 1) CRone;
+ CR_of_Q_lt : forall q r : Q,
+ Qlt q r -> CRlt (CR_of_Q q) (CR_of_Q r);
+ lt_CR_of_Q : forall q r : Q,
+ CRlt (CR_of_Q q) (CR_of_Q r) -> Qlt q r;
+
+ (* This function is very fast in both the Cauchy and Dedekind
+ instances, because this rational number q is almost what
+ the proof of CRlt x y contains.
+ This function is also the heart of the computation of
+ constructive real numbers : it approximates x to any
+ requested precision y. *)
+ CR_Q_dense : forall x y : CRcarrier, CRlt x y ->
+ { q : Q & prod (CRlt x (CR_of_Q q))
+ (CRlt (CR_of_Q q) y) };
+ CR_archimedean : forall x : CRcarrier,
+ { n : positive & CRlt x (CR_of_Q (Z.pos n # 1)) };
+
+ CRminus (x y : CRcarrier) : CRcarrier
+ := CRplus x (CRopp y);
+
+ (* Absolute value, CRabs x is the least upper bound
+ of the pair x, -x. *)
+ CRabs : CRcarrier -> CRcarrier;
+ CRabs_def : forall x y : CRcarrier,
+ (CRle x y /\ CRle (CRopp x) y)
+ <-> CRle (CRabs x) y;
+
+ (* Definitions of convergence and Cauchy-ness. The formulas
+ with orderLe or CRlt are logically equivalent, the choice of
+ orderLe in sort Prop is a question of performance.
+ It is very rare to turn back to the strict order to
+ define functions in sort Set, so we prefer to discard
+ those proofs during extraction. And even in those rare cases,
+ it is easy to divide epsilon by 2 for example. *)
+ CR_cv (un : nat -> CRcarrier) (l : CRcarrier) : Set
+ := forall p:positive,
+ { n : nat | forall i:nat, le n i
+ -> CRle (CRabs (CRminus (un i) l))
+ (CR_of_Q (1#p)) };
+ CR_cauchy (un : nat -> CRcarrier) : Set
+ := forall p : positive,
+ { n : nat | forall i j:nat, le n i -> le n j
+ -> CRle (CRabs (CRminus (un i) (un j)))
+ (CR_of_Q (1#p)) };
+
+ (* For the Cauchy reals, this algorithm consists in building
+ a Cauchy sequence of rationals un : nat -> Q that has
+ the same limit as xn. For each n:nat, un n is a 1/n
+ rational approximation of a point of xn that has converged
+ within 1/n. *)
+ CR_complete :
+ forall xn : (nat -> CRcarrier),
+ CR_cauchy xn -> { l : CRcarrier & CR_cv xn l };
+ }.
+
+Declare Scope ConstructiveReals.
+
+Delimit Scope ConstructiveReals with ConstructiveReals.
+
+Notation "x < y" := (CRlt _ x y) : ConstructiveReals.
+Notation "x <= y" := (CRle _ x y) : ConstructiveReals.
+Notation "x <= y <= z" := (CRle _ x y /\ CRle _ y z) : ConstructiveReals.
+Notation "x < y < z" := (prod (CRlt _ x y) (CRlt _ y z)) : ConstructiveReals.
+Notation "x == y" := (CReq _ x y) : ConstructiveReals.
+Notation "x ≶ y" := (CRapart _ x y) (at level 70, no associativity) : ConstructiveReals.
+Notation "0" := (CRzero _) : ConstructiveReals.
+Notation "1" := (CRone _) : ConstructiveReals.
+Notation "x + y" := (CRplus _ x y) : ConstructiveReals.
+Notation "- x" := (CRopp _ x) : ConstructiveReals.
+Notation "x - y" := (CRminus _ x y) : ConstructiveReals.
+Notation "x * y" := (CRmult _ x y) : ConstructiveReals.
+Notation "/ x" := (CRinv _ x) : ConstructiveReals.
+
+Local Open Scope ConstructiveReals.
+
+Lemma CRlt_asym : forall {R : ConstructiveReals} (x y : CRcarrier R),
+ x < y -> x <= y.
+Proof.
+ intros. intro H0. destruct (CRltLinear R), p.
+ apply (f x y); assumption.
+Qed.
+
+Lemma CRlt_proper
+ : forall R : ConstructiveReals,
+ CMorphisms.Proper
+ (CMorphisms.respectful (CReq R)
+ (CMorphisms.respectful (CReq R) CRelationClasses.iffT)) (CRlt R).
+Proof.
+ intros R x y H x0 y0 H0. destruct H, H0.
+ destruct (CRltLinear R). split.
+ - intro. destruct (s x y x0). assumption.
+ contradiction. destruct (s y y0 x0).
+ assumption. assumption. contradiction.
+ - intro. destruct (s y x y0). assumption.
+ contradiction. destruct (s x x0 y0).
+ assumption. assumption. contradiction.
+Qed.
+
+Lemma CRle_refl : forall {R : ConstructiveReals} (x : CRcarrier R),
+ x <= x.
+Proof.
+ intros. intro H. destruct (CRltLinear R), p.
+ exact (f x x H H).
+Qed.
+
+Lemma CRle_lt_trans : forall {R : ConstructiveReals} (r1 r2 r3 : CRcarrier R),
+ r1 <= r2 -> r2 < r3 -> r1 < r3.
+Proof.
+ intros. destruct (CRltLinear R).
+ destruct (s r2 r1 r3 H0). contradiction. apply c.
+Qed.
+
+Lemma CRlt_le_trans : forall {R : ConstructiveReals} (r1 r2 r3 : CRcarrier R),
+ r1 < r2 -> r2 <= r3 -> r1 < r3.
+Proof.
+ intros. destruct (CRltLinear R).
+ destruct (s r1 r3 r2 H). apply c. contradiction.
+Qed.
+
+Lemma CRle_trans : forall {R : ConstructiveReals} (x y z : CRcarrier R),
+ x <= y -> y <= z -> x <= z.
+Proof.
+ intros. intro abs. apply H0.
+ apply (CRlt_le_trans _ x); assumption.
+Qed.
+
+Lemma CRlt_trans : forall {R : ConstructiveReals} (x y z : CRcarrier R),
+ x < y -> y < z -> x < z.
+Proof.
+ intros. apply (CRlt_le_trans _ y _ H).
+ apply CRlt_asym. exact H0.
+Defined.
+
+Lemma CRlt_trans_flip : forall {R : ConstructiveReals} (x y z : CRcarrier R),
+ y < z -> x < y -> x < z.
+Proof.
+ intros. apply (CRlt_le_trans _ y). exact H0.
+ apply CRlt_asym. exact H.
+Defined.
+
+Lemma CReq_refl : forall {R : ConstructiveReals} (x : CRcarrier R),
+ x == x.
+Proof.
+ split; apply CRle_refl.
+Qed.
+
+Lemma CReq_sym : forall {R : ConstructiveReals} (x y : CRcarrier R),
+ x == y -> y == x.
+Proof.
+ intros. destruct H. split; intro abs; contradiction.
+Qed.
+
+Lemma CReq_trans : forall {R : ConstructiveReals} (x y z : CRcarrier R),
+ x == y -> y == z -> x == z.
+Proof.
+ intros. destruct H,H0. destruct (CRltLinear R), p. split.
+ - intro abs. destruct (s _ y _ abs); contradiction.
+ - intro abs. destruct (s _ y _ abs); contradiction.
+Qed.
+
+Add Parametric Relation {R : ConstructiveReals} : (CRcarrier R) (CReq R)
+ reflexivity proved by (CReq_refl)
+ symmetry proved by (CReq_sym)
+ transitivity proved by (CReq_trans)
+ as CReq_rel.
+
+Instance CReq_relT : forall {R : ConstructiveReals},
+ CRelationClasses.Equivalence (CReq R).
+Proof.
+ split. exact CReq_refl. exact CReq_sym. exact CReq_trans.
+Qed.
+
+Instance CRlt_morph
+ : forall {R : ConstructiveReals}, CMorphisms.Proper
+ (CMorphisms.respectful (CReq R) (CMorphisms.respectful (CReq R) CRelationClasses.iffT)) (CRlt R).
+Proof.
+ intros R x y H x0 y0 H0. destruct H, H0. split.
+ - intro. destruct (CRltLinear R). destruct (s x y x0). assumption.
+ contradiction. destruct (s y y0 x0).
+ assumption. assumption. contradiction.
+ - intro. destruct (CRltLinear R). destruct (s y x y0). assumption.
+ contradiction. destruct (s x x0 y0).
+ assumption. assumption. contradiction.
+Qed.
+
+Add Parametric Morphism {R : ConstructiveReals} : (CRle R)
+ with signature CReq R ==> CReq R ==> iff
+ as CRle_morph.
+Proof.
+ intros. split.
+ - intros H1 H2. unfold CRle in H1.
+ rewrite <- H0 in H2. rewrite <- H in H2. contradiction.
+ - intros H1 H2. unfold CRle in H1.
+ rewrite H0 in H2. rewrite H in H2. contradiction.
+Qed.
+
+Lemma CRplus_0_l : forall {R : ConstructiveReals} (x : CRcarrier R),
+ 0 + x == x.
+Proof.
+ intros. destruct (CRisRing R). apply Radd_0_l.
+Qed.
+
+Lemma CRplus_0_r : forall {R : ConstructiveReals} (x : CRcarrier R),
+ x + 0 == x.
+Proof.
+ intros. destruct (CRisRing R).
+ transitivity (0 + x).
+ apply Radd_comm. apply Radd_0_l.
+Qed.
+
+Lemma CRplus_opp_l : forall {R : ConstructiveReals} (x : CRcarrier R),
+ - x + x == 0.
+Proof.
+ intros. destruct (CRisRing R).
+ transitivity (x + - x).
+ apply Radd_comm. apply Ropp_def.
+Qed.
+
+Lemma CRplus_opp_r : forall {R : ConstructiveReals} (x : CRcarrier R),
+ x + - x == 0.
+Proof.
+ intros. destruct (CRisRing R). apply Ropp_def.
+Qed.
+
+Lemma CRopp_0 : forall {R : ConstructiveReals},
+ CRopp R 0 == 0.
+Proof.
+ intros. rewrite <- CRplus_0_r, CRplus_opp_l.
+ reflexivity.
+Qed.
+
+Lemma CRplus_lt_compat_r : forall {R : ConstructiveReals} (r r1 r2 : CRcarrier R),
+ r1 < r2 -> r1 + r < r2 + r.
+Proof.
+ intros. destruct (CRisRing R).
+ apply (CRlt_proper R (CRplus R r r1) (CRplus R r1 r) (Radd_comm _ _)
+ (CRplus R r2 r) (CRplus R r2 r)).
+ apply CReq_refl.
+ apply (CRlt_proper R _ _ (CReq_refl _) _ (CRplus R r r2)).
+ apply Radd_comm. apply CRplus_lt_compat_l. exact H.
+Qed.
+
+Lemma CRplus_lt_reg_r : forall {R : ConstructiveReals} (r r1 r2 : CRcarrier R),
+ r1 + r < r2 + r -> r1 < r2.
+Proof.
+ intros. destruct (CRisRing R).
+ apply (CRlt_proper R (CRplus R r r1) (CRplus R r1 r) (Radd_comm _ _)
+ (CRplus R r2 r) (CRplus R r2 r)) in H.
+ 2: apply CReq_refl.
+ apply (CRlt_proper R _ _ (CReq_refl _) _ (CRplus R r r2)) in H.
+ apply CRplus_lt_reg_l in H. exact H.
+ apply Radd_comm.
+Qed.
+
+Lemma CRplus_le_compat_l : forall {R : ConstructiveReals} (r r1 r2 : CRcarrier R),
+ r1 <= r2 -> r + r1 <= r + r2.
+Proof.
+ intros. intros abs. apply CRplus_lt_reg_l in abs. apply H. exact abs.
+Qed.
+
+Lemma CRplus_le_compat_r : forall {R : ConstructiveReals} (r r1 r2 : CRcarrier R),
+ r1 <= r2 -> r1 + r <= r2 + r.
+Proof.
+ intros. intros abs. apply CRplus_lt_reg_r in abs. apply H. exact abs.
+Qed.
+
+Lemma CRplus_le_compat : forall {R : ConstructiveReals} (r1 r2 r3 r4 : CRcarrier R),
+ r1 <= r2 -> r3 <= r4 -> r1 + r3 <= r2 + r4.
+Proof.
+ intros. apply (CRle_trans _ (CRplus R r2 r3)).
+ apply CRplus_le_compat_r, H. apply CRplus_le_compat_l, H0.
+Qed.
+
+Lemma CRle_minus : forall {R : ConstructiveReals} (x y : CRcarrier R),
+ x <= y -> 0 <= y - x.
+Proof.
+ intros. rewrite <- (CRplus_opp_r x).
+ apply CRplus_le_compat_r. exact H.
+Qed.
+
+Lemma CRplus_le_reg_l : forall {R : ConstructiveReals} (r r1 r2 : CRcarrier R),
+ r + r1 <= r + r2 -> r1 <= r2.
+Proof.
+ intros. intro abs. apply H. clear H.
+ apply CRplus_lt_compat_l. exact abs.
+Qed.
+
+Lemma CRplus_le_reg_r : forall {R : ConstructiveReals} (r r1 r2 : CRcarrier R),
+ r1 + r <= r2 + r -> r1 <= r2.
+Proof.
+ intros. intro abs. apply H. clear H.
+ apply CRplus_lt_compat_r. exact abs.
+Qed.
+
+Lemma CRplus_lt_le_compat :
+ forall {R : ConstructiveReals} (r1 r2 r3 r4 : CRcarrier R),
+ r1 < r2
+ -> r3 <= r4
+ -> r1 + r3 < r2 + r4.
+Proof.
+ intros. apply (CRlt_le_trans _ (CRplus R r2 r3)).
+ apply CRplus_lt_compat_r. exact H. intro abs.
+ apply CRplus_lt_reg_l in abs. contradiction.
+Qed.
+
+Lemma CRplus_le_lt_compat :
+ forall {R : ConstructiveReals} (r1 r2 r3 r4 : CRcarrier R),
+ r1 <= r2
+ -> r3 < r4
+ -> r1 + r3 < r2 + r4.
+Proof.
+ intros. apply (CRle_lt_trans _ (CRplus R r2 r3)).
+ apply CRplus_le_compat_r. exact H.
+ apply CRplus_lt_compat_l. exact H0.
+Qed.
+
+Lemma CRplus_eq_reg_l : forall {R : ConstructiveReals} (r r1 r2 : CRcarrier R),
+ r + r1 == r + r2 -> r1 == r2.
+Proof.
+ intros.
+ destruct (CRisRingExt R). clear Rmul_ext Ropp_ext.
+ pose proof (Radd_ext
+ (CRopp R r) (CRopp R r) (CReq_refl _)
+ _ _ H).
+ destruct (CRisRing R).
+ apply (CReq_trans r1) in H0.
+ apply (CReq_trans _ _ _ H0).
+ transitivity ((- r + r) + r2).
+ apply Radd_assoc. transitivity (0 + r2).
+ apply Radd_ext. apply CRplus_opp_l. apply CReq_refl.
+ apply Radd_0_l. apply CReq_sym.
+ transitivity (- r + r + r1).
+ apply Radd_assoc.
+ transitivity (0 + r1).
+ apply Radd_ext. apply CRplus_opp_l. apply CReq_refl.
+ apply Radd_0_l.
+Qed.
+
+Lemma CRplus_eq_reg_r : forall {R : ConstructiveReals} (r r1 r2 : CRcarrier R),
+ r1 + r == r2 + r -> r1 == r2.
+Proof.
+ intros. apply (CRplus_eq_reg_l r).
+ transitivity (r1 + r). apply (Radd_comm (CRisRing R)).
+ transitivity (r2 + r).
+ exact H. apply (Radd_comm (CRisRing R)).
+Qed.
+
+Lemma CRplus_assoc : forall {R : ConstructiveReals} (r r1 r2 : CRcarrier R),
+ r + r1 + r2 == r + (r1 + r2).
+Proof.
+ intros. symmetry. apply (Radd_assoc (CRisRing R)).
+Qed.
+
+Lemma CRplus_comm : forall {R : ConstructiveReals} (r1 r2 : CRcarrier R),
+ r1 + r2 == r2 + r1.
+Proof.
+ intros. apply (Radd_comm (CRisRing R)).
+Qed.
+
+Add Parametric Morphism {R : ConstructiveReals} : (CRplus R)
+ with signature CReq R ==> CReq R ==> CReq R
+ as CRplus_morph.
+Proof.
+ apply (CRisRingExt R).
+Qed.
+
+Add Parametric Morphism {R : ConstructiveReals} : (CRopp R)
+ with signature CReq R ==> CReq R
+ as CRopp_morph.
+Proof.
+ apply (CRisRingExt R).
+Qed.
+
+Add Parametric Morphism {R : ConstructiveReals} : (CRmult R)
+ with signature CReq R ==> CReq R ==> CReq R
+ as CRmult_morph.
+Proof.
+ apply (CRisRingExt R).
+Qed.
+
+Instance CRplus_morph_T
+ : forall {R : ConstructiveReals}, CMorphisms.Proper
+ (CMorphisms.respectful (CReq R) (CMorphisms.respectful (CReq R) (CReq R))) (CRplus R).
+Proof.
+ intros R x y H z t H1. apply CRplus_morph; assumption.
+Qed.
+
+Instance CRmult_morph_T
+ : forall {R : ConstructiveReals}, CMorphisms.Proper
+ (CMorphisms.respectful (CReq R) (CMorphisms.respectful (CReq R) (CReq R))) (CRmult R).
+Proof.
+ intros R x y H z t H1. apply CRmult_morph; assumption.
+Qed.
+
+Instance CRopp_morph_T
+ : forall {R : ConstructiveReals}, CMorphisms.Proper
+ (CMorphisms.respectful (CReq R) (CReq R)) (CRopp R).
+Proof.
+ apply CRisRingExt.
+Qed.
+
+Add Parametric Morphism {R : ConstructiveReals} : (CRminus R)
+ with signature (CReq R) ==> (CReq R) ==> (CReq R)
+ as CRminus_morph.
+Proof.
+ intros. unfold CRminus. rewrite H,H0. reflexivity.
+Qed.
+
+Instance CRminus_morph_T
+ : forall {R : ConstructiveReals}, CMorphisms.Proper
+ (CMorphisms.respectful (CReq R) (CMorphisms.respectful (CReq R) (CReq R))) (CRminus R).
+Proof.
+ intros R x y exy z t ezt. unfold CRminus. rewrite exy,ezt. reflexivity.
+Qed.
+
+Lemma CRopp_involutive : forall {R : ConstructiveReals} (r : CRcarrier R),
+ - - r == r.
+Proof.
+ intros. apply (CRplus_eq_reg_l (CRopp R r)).
+ transitivity (CRzero R). apply CRisRing.
+ apply CReq_sym. transitivity (r + - r).
+ apply CRisRing. apply CRisRing.
+Qed.
+
+Lemma CRopp_gt_lt_contravar
+ : forall {R : ConstructiveReals} (r1 r2 : CRcarrier R),
+ r2 < r1 -> - r1 < - r2.
+Proof.
+ intros. apply (CRplus_lt_reg_l R r1).
+ destruct (CRisRing R).
+ apply (CRle_lt_trans _ (CRzero R)). apply Ropp_def.
+ apply (CRplus_lt_compat_l R (CRopp R r2)) in H.
+ apply (CRle_lt_trans _ (CRplus R (CRopp R r2) r2)).
+ apply (CRle_trans _ (CRplus R r2 (CRopp R r2))).
+ destruct (Ropp_def r2). exact H0.
+ destruct (Radd_comm r2 (CRopp R r2)). exact H1.
+ apply (CRlt_le_trans _ _ _ H).
+ destruct (Radd_comm r1 (CRopp R r2)). exact H0.
+Qed.
+
+Lemma CRopp_lt_cancel : forall {R : ConstructiveReals} (r1 r2 : CRcarrier R),
+ - r2 < - r1 -> r1 < r2.
+Proof.
+ intros. apply (CRplus_lt_compat_r r1) in H.
+ rewrite (CRplus_opp_l r1) in H.
+ apply (CRplus_lt_compat_l R r2) in H.
+ rewrite CRplus_0_r, (Radd_assoc (CRisRing R)) in H.
+ rewrite CRplus_opp_r, (Radd_0_l (CRisRing R)) in H.
+ exact H.
+Qed.
+
+Lemma CRopp_ge_le_contravar
+ : forall {R : ConstructiveReals} (r1 r2 : CRcarrier R),
+ r2 <= r1 -> - r1 <= - r2.
+Proof.
+ intros. intros abs. apply CRopp_lt_cancel in abs. contradiction.
+Qed.
+
+Lemma CRopp_plus_distr : forall {R : ConstructiveReals} (r1 r2 : CRcarrier R),
+ - (r1 + r2) == - r1 + - r2.
+Proof.
+ intros. destruct (CRisRing R), (CRisRingExt R).
+ apply (CRplus_eq_reg_l (CRplus R r1 r2)).
+ transitivity (CRzero R). apply Ropp_def.
+ transitivity (r2 + r1 + (-r1 + -r2)).
+ transitivity (r2 + (r1 + (-r1 + -r2))).
+ transitivity (r2 + - r2).
+ apply CReq_sym. apply Ropp_def. apply Radd_ext.
+ apply CReq_refl.
+ transitivity (CRzero R + - r2).
+ apply CReq_sym, Radd_0_l.
+ transitivity (r1 + - r1 + - r2).
+ apply Radd_ext. 2: apply CReq_refl. apply CReq_sym, Ropp_def.
+ apply CReq_sym, Radd_assoc. apply Radd_assoc.
+ apply Radd_ext. 2: apply CReq_refl. apply Radd_comm.
+Qed.
+
+Lemma CRmult_1_l : forall {R : ConstructiveReals} (r : CRcarrier R),
+ 1 * r == r.
+Proof.
+ intros. destruct (CRisRing R). apply Rmul_1_l.
+Qed.
+
+Lemma CRmult_1_r : forall {R : ConstructiveReals} (x : CRcarrier R),
+ x * 1 == x.
+Proof.
+ intros. destruct (CRisRing R). transitivity (CRmult R 1 x).
+ apply Rmul_comm. apply Rmul_1_l.
+Qed.
+
+Lemma CRmult_assoc : forall {R : ConstructiveReals} (r r1 r2 : CRcarrier R),
+ r * r1 * r2 == r * (r1 * r2).
+Proof.
+ intros. symmetry. apply (Rmul_assoc (CRisRing R)).
+Qed.
+
+Lemma CRmult_comm : forall {R : ConstructiveReals} (r s : CRcarrier R),
+ r * s == s * r.
+Proof.
+ intros. rewrite (Rmul_comm (CRisRing R) r). reflexivity.
+Qed.
+
+Lemma CRmult_plus_distr_l : forall {R : ConstructiveReals} (r1 r2 r3 : CRcarrier R),
+ r1 * (r2 + r3) == (r1 * r2) + (r1 * r3).
+Proof.
+ intros. destruct (CRisRing R).
+ transitivity ((r2 + r3) * r1).
+ apply Rmul_comm.
+ transitivity ((r2 * r1) + (r3 * r1)).
+ apply Rdistr_l.
+ transitivity ((r1 * r2) + (r3 * r1)).
+ destruct (CRisRingExt R). apply Radd_ext.
+ apply Rmul_comm. apply CReq_refl.
+ destruct (CRisRingExt R). apply Radd_ext.
+ apply CReq_refl. apply Rmul_comm.
+Qed.
+
+Lemma CRmult_plus_distr_r : forall {R : ConstructiveReals} (r1 r2 r3 : CRcarrier R),
+ (r2 + r3) * r1 == (r2 * r1) + (r3 * r1).
+Proof.
+ intros. do 3 rewrite <- (CRmult_comm r1).
+ apply CRmult_plus_distr_l.
+Qed.
+
+(* x == x+x -> x == 0 *)
+Lemma CRzero_double : forall {R : ConstructiveReals} (x : CRcarrier R),
+ x == x + x -> x == 0.
+Proof.
+ intros.
+ apply (CRplus_eq_reg_l x), CReq_sym. transitivity x.
+ apply CRplus_0_r. exact H.
+Qed.
+
+Lemma CRmult_0_r : forall {R : ConstructiveReals} (x : CRcarrier R),
+ x * 0 == 0.
+Proof.
+ intros. apply CRzero_double.
+ transitivity (x * (0 + 0)).
+ destruct (CRisRingExt R). apply Rmul_ext. apply CReq_refl.
+ apply CReq_sym, CRplus_0_r.
+ destruct (CRisRing R). apply CRmult_plus_distr_l.
+Qed.
+
+Lemma CRmult_0_l : forall {R : ConstructiveReals} (r : CRcarrier R),
+ 0 * r == 0.
+Proof.
+ intros. rewrite CRmult_comm. apply CRmult_0_r.
+Qed.
+
+Lemma CRopp_mult_distr_r : forall {R : ConstructiveReals} (r1 r2 : CRcarrier R),
+ - (r1 * r2) == r1 * (- r2).
+Proof.
+ intros. apply (CRplus_eq_reg_l (CRmult R r1 r2)).
+ destruct (CRisRing R). transitivity (CRzero R). apply Ropp_def.
+ transitivity (r1 * (r2 + - r2)).
+ 2: apply CRmult_plus_distr_l.
+ transitivity (r1 * 0).
+ apply CReq_sym, CRmult_0_r.
+ destruct (CRisRingExt R). apply Rmul_ext. apply CReq_refl.
+ apply CReq_sym, Ropp_def.
+Qed.
+
+Lemma CRopp_mult_distr_l : forall {R : ConstructiveReals} (r1 r2 : CRcarrier R),
+ - (r1 * r2) == (- r1) * r2.
+Proof.
+ intros. transitivity (r2 * - r1).
+ transitivity (- (r2 * r1)).
+ apply (Ropp_ext (CRisRingExt R)).
+ apply CReq_sym, (Rmul_comm (CRisRing R)).
+ apply CRopp_mult_distr_r.
+ apply CReq_sym, (Rmul_comm (CRisRing R)).
+Qed.
+
+Lemma CRmult_lt_compat_r : forall {R : ConstructiveReals} (r r1 r2 : CRcarrier R),
+ 0 < r -> r1 < r2 -> r1 * r < r2 * r.
+Proof.
+ intros. apply (CRplus_lt_reg_r (CRopp R (CRmult R r1 r))).
+ apply (CRle_lt_trans _ (CRzero R)).
+ apply (Ropp_def (CRisRing R)).
+ apply (CRlt_le_trans _ (CRplus R (CRmult R r2 r) (CRmult R (CRopp R r1) r))).
+ apply (CRlt_le_trans _ (CRmult R (CRplus R r2 (CRopp R r1)) r)).
+ apply CRmult_lt_0_compat. 2: exact H.
+ apply (CRplus_lt_reg_r r1).
+ apply (CRle_lt_trans _ r1). apply (Radd_0_l (CRisRing R)).
+ apply (CRlt_le_trans _ r2 _ H0).
+ apply (CRle_trans _ (CRplus R r2 (CRplus R (CRopp R r1) r1))).
+ apply (CRle_trans _ (CRplus R r2 (CRzero R))).
+ destruct (CRplus_0_r r2). exact H1.
+ apply CRplus_le_compat_l. destruct (CRplus_opp_l r1). exact H1.
+ destruct (Radd_assoc (CRisRing R) r2 (CRopp R r1) r1). exact H2.
+ destruct (CRisRing R).
+ destruct (Rdistr_l r2 (CRopp R r1) r). exact H2.
+ apply CRplus_le_compat_l. destruct (CRopp_mult_distr_l r1 r).
+ exact H1.
+Qed.
+
+Lemma CRmult_lt_compat_l : forall {R : ConstructiveReals} (r r1 r2 : CRcarrier R),
+ 0 < r -> r1 < r2 -> r * r1 < r * r2.
+Proof.
+ intros. do 2 rewrite (CRmult_comm r).
+ apply CRmult_lt_compat_r; assumption.
+Qed.
+
+Lemma CRinv_r : forall {R : ConstructiveReals} (r:CRcarrier R)
+ (rnz : r ≶ (CRzero R)),
+ r * (/ r) rnz == 1.
+Proof.
+ intros. transitivity ((/ r) rnz * r).
+ apply (CRisRing R). apply CRinv_l.
+Qed.
+
+Lemma CRmult_lt_reg_r : forall {R : ConstructiveReals} (r r1 r2 : CRcarrier R),
+ 0 < r -> r1 * r < r2 * r -> r1 < r2.
+Proof.
+ intros. apply (CRmult_lt_compat_r ((/ r) (inr H))) in H0.
+ 2: apply CRinv_0_lt_compat, H.
+ apply (CRle_lt_trans _ ((r1 * r) * ((/ r) (inr H)))).
+ - clear H0. apply (CRle_trans _ (CRmult R r1 (CRone R))).
+ destruct (CRmult_1_r r1). exact H0.
+ apply (CRle_trans _ (CRmult R r1 (CRmult R r ((/ r) (inr H))))).
+ destruct (Rmul_ext (CRisRingExt R) r1 r1 (CReq_refl r1)
+ (r * ((/ r) (inr H))) 1).
+ apply CRinv_r. exact H0.
+ destruct (Rmul_assoc (CRisRing R) r1 r ((/ r) (inr H))). exact H1.
+ - apply (CRlt_le_trans _ ((r2 * r) * ((/ r) (inr H)))).
+ exact H0. clear H0.
+ apply (CRle_trans _ (r2 * 1)).
+ 2: destruct (CRmult_1_r r2); exact H1.
+ apply (CRle_trans _ (r2 * (r * ((/ r) (inr H))))).
+ destruct (Rmul_assoc (CRisRing R) r2 r ((/ r) (inr H))). exact H0.
+ destruct (Rmul_ext (CRisRingExt R) r2 r2 (CReq_refl r2)
+ (r * ((/ r) (inr H))) (CRone R)).
+ apply CRinv_r. exact H1.
+Qed.
+
+Lemma CRmult_lt_reg_l : forall {R : ConstructiveReals} (r r1 r2 : CRcarrier R),
+ 0 < r -> r * r1 < r * r2 -> r1 < r2.
+Proof.
+ intros.
+ rewrite (Rmul_comm (CRisRing R) r r1) in H0.
+ rewrite (Rmul_comm (CRisRing R) r r2) in H0.
+ apply CRmult_lt_reg_r in H0.
+ exact H0. exact H.
+Qed.
+
+Lemma CRmult_le_compat_l_half : forall {R : ConstructiveReals} (r r1 r2 : CRcarrier R),
+ 0 < r -> r1 <= r2 -> r * r1 <= r * r2.
+Proof.
+ intros. intro abs. apply CRmult_lt_reg_l in abs.
+ contradiction. exact H.
+Qed.
+
+Lemma CRmult_le_compat_r_half : forall {R : ConstructiveReals} (r r1 r2 : CRcarrier R),
+ 0 < r
+ -> r1 <= r2
+ -> r1 * r <= r2 * r.
+Proof.
+ intros. intro abs. apply CRmult_lt_reg_r in abs.
+ contradiction. exact H.
+Qed.
+
+Lemma CRmult_eq_reg_r : forall {R : ConstructiveReals} (r r1 r2 : CRcarrier R),
+ 0 ≶ r
+ -> r1 * r == r2 * r
+ -> r1 == r2.
+Proof.
+ intros. destruct H0,H.
+ - split.
+ + intro abs. apply H0. apply CRmult_lt_compat_r.
+ exact c. exact abs.
+ + intro abs. apply H1. apply CRmult_lt_compat_r.
+ exact c. exact abs.
+ - split.
+ + intro abs. apply H1. apply CRopp_lt_cancel.
+ apply (CRle_lt_trans _ (CRmult R r1 (CRopp R r))).
+ apply CRopp_mult_distr_r.
+ apply (CRlt_le_trans _ (CRmult R r2 (CRopp R r))).
+ 2: apply CRopp_mult_distr_r.
+ apply CRmult_lt_compat_r. 2: exact abs.
+ apply (CRplus_lt_reg_r r). apply (CRle_lt_trans _ r).
+ apply (Radd_0_l (CRisRing R)).
+ apply (CRlt_le_trans _ (CRzero R) _ c).
+ apply CRplus_opp_l.
+ + intro abs. apply H0. apply CRopp_lt_cancel.
+ apply (CRle_lt_trans _ (CRmult R r2 (CRopp R r))).
+ apply CRopp_mult_distr_r.
+ apply (CRlt_le_trans _ (CRmult R r1 (CRopp R r))).
+ 2: apply CRopp_mult_distr_r.
+ apply CRmult_lt_compat_r. 2: exact abs.
+ apply (CRplus_lt_reg_r r). apply (CRle_lt_trans _ r).
+ apply (Radd_0_l (CRisRing R)).
+ apply (CRlt_le_trans _ (CRzero R) _ c).
+ apply CRplus_opp_l.
+Qed.
+
+Lemma CRinv_1 : forall {R : ConstructiveReals} (onz : CRapart R 1 0),
+ (/ 1) onz == 1.
+Proof.
+ intros. rewrite <- (CRmult_1_r ((/ 1) onz)).
+ rewrite CRinv_l. reflexivity.
+Qed.
+
+Lemma CRmult_eq_reg_l : forall {R : ConstructiveReals} (r r1 r2 : CRcarrier R),
+ r ≶ 0
+ -> r * r1 == r * r2
+ -> r1 == r2.
+Proof.
+ intros. rewrite (Rmul_comm (CRisRing R)) in H0.
+ rewrite (Rmul_comm (CRisRing R) r) in H0.
+ apply CRmult_eq_reg_r in H0. exact H0. destruct H.
+ right. exact c. left. exact c.
+Qed.
+
+Lemma CRinv_mult_distr :
+ forall {R : ConstructiveReals} (r1 r2 : CRcarrier R)
+ (r1nz : r1 ≶ 0) (r2nz : r2 ≶ 0)
+ (rmnz : (r1*r2) ≶ 0),
+ (/ (r1 * r2)) rmnz == (/ r1) r1nz * (/ r2) r2nz.
+Proof.
+ intros. apply (CRmult_eq_reg_l r1). exact r1nz.
+ rewrite (Rmul_assoc (CRisRing R)). rewrite CRinv_r. rewrite CRmult_1_l.
+ apply (CRmult_eq_reg_l r2). exact r2nz.
+ rewrite CRinv_r. rewrite (Rmul_assoc (CRisRing R)).
+ rewrite (CRmult_comm r2 r1). rewrite CRinv_r. reflexivity.
+Qed.
+
+Lemma CRinv_morph : forall {R : ConstructiveReals} (x y : CRcarrier R)
+ (rxnz : x ≶ 0) (rynz : y ≶ 0),
+ x == y
+ -> (/ x) rxnz == (/ y) rynz.
+Proof.
+ intros. apply (CRmult_eq_reg_l x). exact rxnz.
+ rewrite CRinv_r, H, CRinv_r. reflexivity.
+Qed.
+
+Lemma CRlt_minus : forall {R : ConstructiveReals} (x y : CRcarrier R),
+ x < y -> 0 < y - x.
+Proof.
+ intros. rewrite <- (CRplus_opp_r x).
+ apply CRplus_lt_compat_r. exact H.
+Qed.
+
+Lemma CR_of_Q_le : forall {R : ConstructiveReals} (r q : Q),
+ Qle r q
+ -> CR_of_Q R r <= CR_of_Q R q.
+Proof.
+ intros. intro abs. apply lt_CR_of_Q in abs.
+ exact (Qlt_not_le _ _ abs H).
+Qed.
+
+Add Parametric Morphism {R : ConstructiveReals} : (CR_of_Q R)
+ with signature Qeq ==> CReq R
+ as CR_of_Q_morph.
+Proof.
+ split; apply CR_of_Q_le; rewrite H; apply Qle_refl.
+Qed.
+
+Lemma eq_inject_Q : forall {R : ConstructiveReals} (q r : Q),
+ CR_of_Q R q == CR_of_Q R r -> Qeq q r.
+Proof.
+ intros. destruct H. destruct (Q_dec q r). destruct s.
+ exfalso. apply (CR_of_Q_lt R q r) in q0. contradiction.
+ exfalso. apply (CR_of_Q_lt R r q) in q0. contradiction. exact q0.
+Qed.
+
+Instance CR_of_Q_morph_T
+ : forall {R : ConstructiveReals}, CMorphisms.Proper
+ (CMorphisms.respectful Qeq (CReq R)) (CR_of_Q R).
+Proof.
+ intros R x y H. apply CR_of_Q_morph; assumption.
+Qed.
+
+Lemma CR_of_Q_zero : forall {R : ConstructiveReals},
+ CR_of_Q R 0 == 0.
+Proof.
+ intros. apply CRzero_double.
+ transitivity (CR_of_Q R (0+0)). apply CR_of_Q_morph.
+ reflexivity. apply CR_of_Q_plus.
+Qed.
+
+Lemma CR_of_Q_opp : forall {R : ConstructiveReals} (q : Q),
+ CR_of_Q R (-q) == - CR_of_Q R q.
+Proof.
+ intros. apply (CRplus_eq_reg_l (CR_of_Q R q)).
+ transitivity (CRzero R).
+ transitivity (CR_of_Q R (q-q)).
+ apply CReq_sym, CR_of_Q_plus.
+ transitivity (CR_of_Q R 0).
+ apply CR_of_Q_morph. ring. apply CR_of_Q_zero.
+ apply CReq_sym. apply (CRisRing R).
+Qed.
+
+Lemma CR_of_Q_pos : forall {R : ConstructiveReals} (q:Q),
+ Qlt 0 q -> 0 < CR_of_Q R q.
+Proof.
+ intros. apply (CRle_lt_trans _ (CR_of_Q R 0)).
+ apply CR_of_Q_zero. apply CR_of_Q_lt. exact H.
+Qed.
+
+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)).
+Proof.
+ intros.
+ apply (CRmult_eq_reg_l (CR_of_Q R q)).
+ right. apply CR_of_Q_pos, qPos.
+ rewrite CRinv_r, <- CR_of_Q_mult, <- CR_of_Q_one.
+ apply CR_of_Q_morph. field. intro abs.
+ rewrite abs in qPos. exact (Qlt_irrefl 0 qPos).
+Qed.
+
+Lemma CRmult_le_0_compat : forall {R : ConstructiveReals} (a b : CRcarrier R),
+ 0 <= a -> 0 <= b -> 0 <= a * b.
+Proof.
+ (* Limit of (a + 1/n)*b when n -> infty. *)
+ intros. intro abs.
+ assert (0 < -(a*b)) as epsPos.
+ { rewrite <- CRopp_0. apply CRopp_gt_lt_contravar. exact abs. }
+ destruct (CR_archimedean R (b * ((/ -(a*b)) (inr epsPos))))
+ as [n maj].
+ assert (0 < CR_of_Q R (Z.pos n #1)) as nPos.
+ { rewrite <- CR_of_Q_zero. apply CR_of_Q_lt. reflexivity. }
+ assert (b * (/ CR_of_Q R (Z.pos n #1)) (inr nPos) < -(a*b)).
+ { apply (CRmult_lt_reg_r (CR_of_Q R (Z.pos n #1))). apply nPos.
+ rewrite <- (Rmul_assoc (CRisRing R)), CRinv_l, CRmult_1_r.
+ apply (CRmult_lt_compat_r (-(a*b))) in maj.
+ rewrite CRmult_assoc, CRinv_l, CRmult_1_r in maj.
+ rewrite CRmult_comm. apply maj. apply epsPos. }
+ pose proof (CRmult_le_compat_l_half
+ (a + (/ CR_of_Q R (Z.pos n #1)) (inr nPos)) 0 b).
+ assert (0 + 0 < a + (/ CR_of_Q R (Z.pos n #1)) (inr nPos)).
+ { apply CRplus_le_lt_compat. apply H. apply CRinv_0_lt_compat. apply nPos. }
+ rewrite CRplus_0_l in H3. specialize (H2 H3 H0).
+ clear H3. rewrite CRmult_0_r in H2.
+ apply H2. clear H2. rewrite (Rdistr_l (CRisRing R)).
+ apply (CRplus_lt_compat_l R (a*b)) in H1.
+ rewrite CRplus_opp_r in H1.
+ rewrite (CRmult_comm ((/ CR_of_Q R (Z.pos n # 1)) (inr nPos))).
+ apply H1.
+Qed.
+
+Lemma CRmult_le_compat_l : forall {R : ConstructiveReals} (r r1 r2:CRcarrier R),
+ 0 <= r -> r1 <= r2 -> r * r1 <= r * r2.
+Proof.
+ intros. apply (CRplus_le_reg_r (-(r*r1))).
+ rewrite CRplus_opp_r, CRopp_mult_distr_r.
+ rewrite <- CRmult_plus_distr_l.
+ apply CRmult_le_0_compat. exact H.
+ apply (CRplus_le_reg_r r1).
+ rewrite CRplus_0_l, CRplus_assoc, CRplus_opp_l, CRplus_0_r.
+ exact H0.
+Qed.
+
+Lemma CRmult_le_compat_r : forall {R : ConstructiveReals} (r r1 r2:CRcarrier R),
+ 0 <= r -> r1 <= r2 -> r1 * r <= r2 * r.
+Proof.
+ intros. do 2 rewrite <- (CRmult_comm r).
+ apply CRmult_le_compat_l; assumption.
+Qed.
+
+Lemma CRmult_pos_pos
+ : forall {R : ConstructiveReals} (x y : CRcarrier R),
+ 0 < x * y -> 0 <= x
+ -> 0 <= y -> 0 < x.
+Proof.
+ intros. destruct (CRltLinear R). clear p.
+ specialize (s 0 x 1 (CRzero_lt_one R)) as [H2|H2].
+ exact H2. apply CRlt_asym in H2.
+ apply (CRmult_le_compat_r y) in H2.
+ 2: exact H1. rewrite CRmult_1_l in H2.
+ apply (CRlt_le_trans _ _ _ H) in H2.
+ rewrite <- (CRmult_0_l y) in H.
+ apply CRmult_lt_reg_r in H. exact H. exact H2.
+Qed.
+
+(* 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.
+Proof.
+ intros.
+ (* Narrow cases to x < 1. *)
+ destruct (CRltLinear R). clear p.
+ pose proof (s 0 x 1 (CRzero_lt_one R)) as [H0|H0].
+ left. exact H0.
+ (* In this case, linear order 0 y (x*y) decides. *)
+ destruct (s 0 y (x*y) H).
+ - left. rewrite <- (CRmult_0_l y) in H. apply CRmult_lt_reg_r in H.
+ exact H. exact c.
+ - right. apply CRopp_lt_cancel. rewrite CRopp_0.
+ apply (CRmult_pos_pos (-x) (-y)).
+ + rewrite <- CRopp_mult_distr_l, CRopp_mult_distr_r, CRopp_involutive. exact H.
+ + rewrite <- CRopp_0. apply CRopp_ge_le_contravar.
+ intro abs. rewrite <- (CRmult_0_r x) in H.
+ apply CRmult_lt_reg_l in H. rewrite <- (CRmult_1_l y) in c.
+ rewrite <- CRmult_assoc in c. apply CRmult_lt_reg_r in c.
+ rewrite CRmult_1_r in c. exact (CRlt_asym _ _ H0 c).
+ exact H. exact abs.
+ + intro abs. apply (CRmult_lt_compat_r y) in H0.
+ rewrite CRmult_1_l in H0. exact (CRlt_asym _ _ H0 c).
+ apply CRopp_lt_cancel. rewrite CRopp_0. exact abs.
+Qed.
+
+Lemma CRmult_le_reg_l :
+ forall {R : ConstructiveReals} (x y z : CRcarrier R),
+ 0 < x -> x * y <= x * z -> y <= z.
+Proof.
+ intros. intro abs.
+ apply (CRmult_lt_compat_l x) in abs. contradiction.
+ exact H.
+Qed.
+
+Lemma CRmult_le_reg_r :
+ forall {R : ConstructiveReals} (x y z : CRcarrier R),
+ 0 < x -> y * x <= z * x -> y <= z.
+Proof.
+ intros. intro abs.
+ apply (CRmult_lt_compat_r x) in abs. contradiction. exact H.
+Qed.
+
+Definition CRup_nat {R : ConstructiveReals} (x : CRcarrier R)
+ : { n : nat & x < CR_of_Q R (Z.of_nat n #1) }.
+Proof.
+ destruct (CR_archimedean R x). exists (Pos.to_nat x0).
+ rewrite positive_nat_Z. exact c.
+Qed.
+
+Definition CRfloor {R : ConstructiveReals} (a : CRcarrier R)
+ : { p : Z & prod (CR_of_Q R (p#1) < a)
+ (a < CR_of_Q R (p#1) + CR_of_Q R 2) }.
+Proof.
+ destruct (CR_Q_dense R (a - CR_of_Q R (1#2)) a) as [q qmaj].
+ - apply (CRlt_le_trans _ (a-0)). apply CRplus_lt_compat_l.
+ apply CRopp_gt_lt_contravar. rewrite <- CR_of_Q_zero.
+ apply CR_of_Q_lt. reflexivity.
+ unfold CRminus. rewrite CRopp_0, CRplus_0_r. apply CRle_refl.
+ - exists (Qfloor q). destruct qmaj. split.
+ apply (CRle_lt_trans _ (CR_of_Q R q)). 2: exact c0.
+ apply CR_of_Q_le. apply Qfloor_le.
+ apply (CRlt_le_trans _ (CR_of_Q R q + CR_of_Q R (1#2))).
+ apply (CRplus_lt_compat_r (CR_of_Q R (1 # 2))) in c.
+ unfold CRminus in c. rewrite CRplus_assoc, CRplus_opp_l, CRplus_0_r in c. exact c.
+ rewrite (CR_of_Q_plus R 1 1), <- CRplus_assoc, <- (CR_of_Q_plus R _ 1).
+ apply CRplus_le_compat. apply CR_of_Q_le.
+ rewrite Qinv_plus_distr. apply Qlt_le_weak, Qlt_floor.
+ apply CR_of_Q_le. discriminate.
+Qed.
+
+Lemma CRplus_appart_reg_l : forall {R : ConstructiveReals} (r r1 r2 : CRcarrier R),
+ (r + r1) ≶ (r + r2) -> r1 ≶ r2.
+Proof.
+ intros. destruct H.
+ left. apply (CRplus_lt_reg_l R r), c.
+ right. apply (CRplus_lt_reg_l R r), c.
+Qed.
+
+Lemma CRplus_appart_reg_r : forall {R : ConstructiveReals} (r r1 r2 : CRcarrier R),
+ (r1 + r) ≶ (r2 + r) -> r1 ≶ r2.
+Proof.
+ intros. destruct H.
+ left. apply (CRplus_lt_reg_r r), c.
+ right. apply (CRplus_lt_reg_r r), c.
+Qed.
+
+Lemma CRmult_appart_reg_l
+ : forall {R : ConstructiveReals} (r r1 r2 : CRcarrier R),
+ 0 < r -> (r * r1) ≶ (r * r2) -> r1 ≶ r2.
+Proof.
+ intros. destruct H0.
+ left. exact (CRmult_lt_reg_l r _ _ H c).
+ right. exact (CRmult_lt_reg_l r _ _ H c).
+Qed.
+
+Lemma CRmult_appart_reg_r
+ : forall {R : ConstructiveReals} (r r1 r2 : CRcarrier R),
+ 0 < r -> (r1 * r) ≶ (r2 * r) -> r1 ≶ r2.
+Proof.
+ intros. destruct H0.
+ left. exact (CRmult_lt_reg_r r _ _ H c).
+ right. exact (CRmult_lt_reg_r r _ _ H c).
+Qed.
+
+Instance CRapart_morph
+ : forall {R : ConstructiveReals}, CMorphisms.Proper
+ (CMorphisms.respectful (CReq R) (CMorphisms.respectful (CReq R) CRelationClasses.iffT)) (CRapart R).
+Proof.
+ intros R x y H x0 y0 H0. destruct H, H0. split.
+ - intro. destruct H3.
+ left. apply (CRle_lt_trans _ x _ H).
+ apply (CRlt_le_trans _ x0 _ c), H2.
+ right. apply (CRle_lt_trans _ x0 _ H0).
+ apply (CRlt_le_trans _ x _ c), H1.
+ - intro. destruct H3.
+ left. apply (CRle_lt_trans _ y _ H1).
+ apply (CRlt_le_trans _ y0 _ c), H0.
+ right. apply (CRle_lt_trans _ y0 _ H2).
+ apply (CRlt_le_trans _ y _ c), H.
+Qed.
diff --git a/theories/Reals/Abstract/ConstructiveRealsMorphisms.v b/theories/Reals/Abstract/ConstructiveRealsMorphisms.v
new file mode 100644
index 0000000000..bc44668e2f
--- /dev/null
+++ b/theories/Reals/Abstract/ConstructiveRealsMorphisms.v
@@ -0,0 +1,1177 @@
+(************************************************************************)
+(* * The Coq Proof Assistant / The Coq Development Team *)
+(* v * INRIA, CNRS and contributors - Copyright 1999-2019 *)
+(* R2 are extensionally equal. We will
+ further show that they exist, and so are isomorphisms.
+ The difference between two morphisms R1 -> R2 is therefore
+ the speed of computation.
+
+ The canonical isomorphisms we provide here are often very slow,
+ when a new implementation of constructive reals is added,
+ it should define its own ad hoc isomorphisms for better speed.
+
+ Apart from the speed, those unique isomorphisms also serve as
+ sanity checks of the interface ConstructiveReals :
+ it captures a concept with a strong notion of uniqueness. *)
+
+Require Import QArith.
+Require Import Qabs.
+Require Import ConstructiveReals.
+Require Import ConstructiveLimits.
+Require Import ConstructiveAbs.
+Require Import ConstructiveSum.
+
+Local Open Scope ConstructiveReals.
+
+Record ConstructiveRealsMorphism {R1 R2 : ConstructiveReals} : Set :=
+ {
+ CRmorph : CRcarrier R1 -> CRcarrier R2;
+ CRmorph_rat : forall q : Q,
+ CRmorph (CR_of_Q R1 q) == CR_of_Q R2 q;
+ CRmorph_increasing : forall x y : CRcarrier R1,
+ CRlt R1 x y -> CRlt R2 (CRmorph x) (CRmorph y);
+ }.
+
+
+Lemma CRmorph_increasing_inv
+ : forall {R1 R2 : ConstructiveReals}
+ (f : ConstructiveRealsMorphism)
+ (x y : CRcarrier R1),
+ CRlt R2 (CRmorph f x) (CRmorph f y)
+ -> CRlt R1 x y.
+Proof.
+ intros. destruct (CR_Q_dense R2 _ _ H) as [q [H0 H1]].
+ destruct (CR_Q_dense R2 _ _ H0) as [r [H2 H3]].
+ apply lt_CR_of_Q, (CR_of_Q_lt R1) in H3.
+ destruct (CRltLinear R1).
+ destruct (s _ x _ H3).
+ - exfalso. apply (CRmorph_increasing f) in c.
+ destruct (CRmorph_rat f r) as [H4 _].
+ apply (CRle_lt_trans _ _ _ H4) in c. clear H4.
+ exact (CRlt_asym _ _ c H2).
+ - clear H2 H3 r. apply (CRlt_trans _ _ _ c). clear c.
+ destruct (CR_Q_dense R2 _ _ H1) as [t [H2 H3]].
+ apply lt_CR_of_Q, (CR_of_Q_lt R1) in H2.
+ destruct (s _ y _ H2). exact c.
+ exfalso. apply (CRmorph_increasing f) in c.
+ destruct (CRmorph_rat f t) as [_ H4].
+ apply (CRlt_le_trans _ _ _ c) in H4. clear c.
+ exact (CRlt_asym _ _ H4 H3).
+Qed.
+
+Lemma CRmorph_unique : forall {R1 R2 : ConstructiveReals}
+ (f g : @ConstructiveRealsMorphism R1 R2)
+ (x : CRcarrier R1),
+ CRmorph f x == CRmorph g x.
+Proof.
+ split.
+ - intro abs. destruct (CR_Q_dense R2 _ _ abs) as [q [H H0]].
+ destruct (CRmorph_rat f q) as [H1 _].
+ apply (CRlt_le_trans _ _ _ H) in H1. clear H.
+ apply CRmorph_increasing_inv in H1.
+ destruct (CRmorph_rat g q) as [_ H2].
+ apply (CRle_lt_trans _ _ _ H2) in H0. clear H2.
+ apply CRmorph_increasing_inv in H0.
+ exact (CRlt_asym _ _ H0 H1).
+ - intro abs. destruct (CR_Q_dense R2 _ _ abs) as [q [H H0]].
+ destruct (CRmorph_rat f q) as [_ H1].
+ apply (CRle_lt_trans _ _ _ H1) in H0. clear H1.
+ apply CRmorph_increasing_inv in H0.
+ destruct (CRmorph_rat g q) as [H2 _].
+ apply (CRlt_le_trans _ _ _ H) in H2. clear H.
+ apply CRmorph_increasing_inv in H2.
+ exact (CRlt_asym _ _ H0 H2).
+Qed.
+
+
+(* The identity is the only endomorphism of constructive reals.
+ For any ConstructiveReals R1, R2 and any morphisms
+ f : R1 -> R2 and g : R2 -> R1,
+ f and g are isomorphisms and are inverses of each other. *)
+Lemma Endomorph_id
+ : forall {R : ConstructiveReals} (f : @ConstructiveRealsMorphism R R)
+ (x : CRcarrier R),
+ CRmorph f x == x.
+Proof.
+ split.
+ - intro abs. destruct (CR_Q_dense R _ _ abs) as [q [H0 H1]].
+ destruct (CRmorph_rat f q) as [H _].
+ apply (CRlt_le_trans _ _ _ H0) in H. clear H0.
+ apply CRmorph_increasing_inv in H.
+ exact (CRlt_asym _ _ H1 H).
+ - intro abs. destruct (CR_Q_dense R _ _ abs) as [q [H0 H1]].
+ destruct (CRmorph_rat f q) as [_ H].
+ apply (CRle_lt_trans _ _ _ H) in H1. clear H.
+ apply CRmorph_increasing_inv in H1.
+ exact (CRlt_asym _ _ H1 H0).
+Qed.
+
+Lemma CRmorph_proper
+ : forall {R1 R2 : ConstructiveReals}
+ (f : @ConstructiveRealsMorphism R1 R2)
+ (x y : CRcarrier R1),
+ x == y -> CRmorph f x == CRmorph f y.
+Proof.
+ split.
+ - intro abs. apply CRmorph_increasing_inv in abs.
+ destruct H. contradiction.
+ - intro abs. apply CRmorph_increasing_inv in abs.
+ destruct H. contradiction.
+Qed.
+
+Definition CRmorph_compose {R1 R2 R3 : ConstructiveReals}
+ (f : @ConstructiveRealsMorphism R1 R2)
+ (g : @ConstructiveRealsMorphism R2 R3)
+ : @ConstructiveRealsMorphism R1 R3.
+Proof.
+ apply (Build_ConstructiveRealsMorphism
+ R1 R3 (fun x:CRcarrier R1 => CRmorph g (CRmorph f x))).
+ - intro q. apply (CReq_trans _ (CRmorph g (CR_of_Q R2 q))).
+ apply CRmorph_proper. apply CRmorph_rat. apply CRmorph_rat.
+ - intros. apply CRmorph_increasing. apply CRmorph_increasing. exact H.
+Defined.
+
+Lemma CRmorph_le : forall {R1 R2 : ConstructiveReals}
+ (f : @ConstructiveRealsMorphism R1 R2)
+ (x y : CRcarrier R1),
+ x <= y -> CRmorph f x <= CRmorph f y.
+Proof.
+ intros. intro abs. apply CRmorph_increasing_inv in abs. contradiction.
+Qed.
+
+Lemma CRmorph_le_inv : forall {R1 R2 : ConstructiveReals}
+ (f : @ConstructiveRealsMorphism R1 R2)
+ (x y : CRcarrier R1),
+ CRmorph f x <= CRmorph f y -> x <= y.
+Proof.
+ intros. intro abs. apply (CRmorph_increasing f) in abs. contradiction.
+Qed.
+
+Lemma CRmorph_zero : forall {R1 R2 : ConstructiveReals}
+ (f : @ConstructiveRealsMorphism R1 R2),
+ CRmorph f 0 == 0.
+Proof.
+ intros. apply (CReq_trans _ (CRmorph f (CR_of_Q R1 0))).
+ apply CRmorph_proper. apply CReq_sym, CR_of_Q_zero.
+ apply (CReq_trans _ (CR_of_Q R2 0)).
+ apply CRmorph_rat. apply CR_of_Q_zero.
+Qed.
+
+Lemma CRmorph_one : forall {R1 R2 : ConstructiveReals}
+ (f : @ConstructiveRealsMorphism R1 R2),
+ CRmorph f 1 == 1.
+Proof.
+ intros. apply (CReq_trans _ (CRmorph f (CR_of_Q R1 1))).
+ apply CRmorph_proper. apply CReq_sym, CR_of_Q_one.
+ apply (CReq_trans _ (CR_of_Q R2 1)).
+ apply CRmorph_rat. apply CR_of_Q_one.
+Qed.
+
+Lemma CRmorph_opp : forall {R1 R2 : ConstructiveReals}
+ (f : @ConstructiveRealsMorphism R1 R2)
+ (x : CRcarrier R1),
+ CRmorph f (- x) == - CRmorph f x.
+Proof.
+ split.
+ - intro abs.
+ destruct (CR_Q_dense R2 _ _ abs) as [q [H H0]]. clear abs.
+ destruct (CRmorph_rat f q) as [H1 _].
+ apply (CRlt_le_trans _ _ _ H) in H1. clear H.
+ apply CRmorph_increasing_inv in H1.
+ apply CRopp_gt_lt_contravar in H0.
+ destruct (@CR_of_Q_opp R2 q) as [H2 _].
+ apply (CRlt_le_trans _ _ _ H0) in H2. clear H0.
+ pose proof (CRopp_involutive (CRmorph f x)) as [H _].
+ apply (CRle_lt_trans _ _ _ H) in H2. clear H.
+ destruct (CRmorph_rat f (-q)) as [H _].
+ apply (CRlt_le_trans _ _ _ H2) in H. clear H2.
+ apply CRmorph_increasing_inv in H.
+ destruct (@CR_of_Q_opp R1 q) as [_ H2].
+ apply (CRlt_le_trans _ _ _ H) in H2. clear H.
+ apply CRopp_gt_lt_contravar in H2.
+ pose proof (CRopp_involutive (CR_of_Q R1 q)) as [H _].
+ apply (CRle_lt_trans _ _ _ H) in H2. clear H.
+ exact (CRlt_asym _ _ H1 H2).
+ - intro abs.
+ destruct (CR_Q_dense R2 _ _ abs) as [q [H H0]]. clear abs.
+ destruct (CRmorph_rat f q) as [_ H1].
+ apply (CRle_lt_trans _ _ _ H1) in H0. clear H1.
+ apply CRmorph_increasing_inv in H0.
+ apply CRopp_gt_lt_contravar in H.
+ pose proof (CRopp_involutive (CRmorph f x)) as [_ H1].
+ apply (CRlt_le_trans _ _ _ H) in H1. clear H.
+ destruct (@CR_of_Q_opp R2 q) as [_ H2].
+ apply (CRle_lt_trans _ _ _ H2) in H1. clear H2.
+ destruct (CRmorph_rat f (-q)) as [_ H].
+ apply (CRle_lt_trans _ _ _ H) in H1. clear H.
+ apply CRmorph_increasing_inv in H1.
+ destruct (@CR_of_Q_opp R1 q) as [H2 _].
+ apply (CRle_lt_trans _ _ _ H2) in H1. clear H2.
+ apply CRopp_gt_lt_contravar in H1.
+ pose proof (CRopp_involutive (CR_of_Q R1 q)) as [_ H].
+ apply (CRlt_le_trans _ _ _ H1) in H. clear H1.
+ exact (CRlt_asym _ _ H0 H).
+Qed.
+
+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)).
+Proof.
+ intros.
+ apply (CRle_lt_trans _ (CRplus R x (CRzero R))). apply CRplus_0_r.
+ apply CRplus_lt_compat_l.
+ apply (CRle_lt_trans _ (CR_of_Q R 0)). apply CR_of_Q_zero.
+ apply CR_of_Q_lt. exact H.
+Defined.
+
+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.
+Proof.
+ intros.
+ apply (CRlt_le_trans _ (CRplus R x (CRzero R))). 2: apply CRplus_0_r.
+ apply CRplus_lt_compat_l.
+ apply (CRlt_le_trans _ (CR_of_Q R 0)).
+ apply CR_of_Q_lt. exact H. apply CR_of_Q_zero.
+Qed.
+
+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).
+Proof.
+ split.
+ - intro abs.
+ destruct (CR_Q_dense R2 _ _ abs) as [r [H H0]]. clear abs.
+ destruct (CRmorph_rat f r) as [H1 _].
+ apply (CRlt_le_trans _ _ _ H) in H1. clear H.
+ apply CRmorph_increasing_inv in H1.
+ apply (CRlt_asym _ _ H1). clear H1.
+ apply (CRplus_lt_reg_r (CRopp R1 (CR_of_Q R1 q))).
+ apply (CRlt_le_trans _ x).
+ apply (CRle_lt_trans _ (CR_of_Q R1 (r-q))).
+ apply (CRle_trans _ (CRplus R1 (CR_of_Q R1 r) (CR_of_Q R1 (-q)))).
+ apply CRplus_le_compat_l. destruct (@CR_of_Q_opp R1 q). exact H.
+ destruct (CR_of_Q_plus R1 r (-q)). exact H.
+ apply (CRmorph_increasing_inv f).
+ apply (CRle_lt_trans _ (CR_of_Q R2 (r - q))).
+ apply CRmorph_rat.
+ apply (CRplus_lt_reg_r (CR_of_Q R2 q)).
+ apply (CRle_lt_trans _ (CR_of_Q R2 r)). 2: exact H0.
+ intro H.
+ destruct (CR_of_Q_plus R2 (r-q) q) as [H1 _].
+ apply (CRlt_le_trans _ _ _ H) in H1. clear H.
+ apply lt_CR_of_Q in H1. ring_simplify in H1.
+ exact (Qlt_not_le _ _ H1 (Qle_refl _)).
+ destruct (CRisRing R1).
+ apply (CRle_trans
+ _ (CRplus R1 x (CRplus R1 (CR_of_Q R1 q) (CRopp R1 (CR_of_Q R1 q))))).
+ apply (CRle_trans _ (CRplus R1 x (CRzero R1))).
+ destruct (CRplus_0_r x). exact H.
+ apply CRplus_le_compat_l. destruct (Ropp_def (CR_of_Q R1 q)). exact H.
+ destruct (Radd_assoc x (CR_of_Q R1 q) (CRopp R1 (CR_of_Q R1 q))).
+ exact H1.
+ - intro abs.
+ destruct (CR_Q_dense R2 _ _ abs) as [r [H H0]]. clear abs.
+ destruct (CRmorph_rat f r) as [_ H1].
+ apply (CRle_lt_trans _ _ _ H1) in H0. clear H1.
+ apply CRmorph_increasing_inv in H0.
+ apply (CRlt_asym _ _ H0). clear H0.
+ apply (CRplus_lt_reg_r (CRopp R1 (CR_of_Q R1 q))).
+ apply (CRle_lt_trans _ x).
+ destruct (CRisRing R1).
+ apply (CRle_trans
+ _ (CRplus R1 x (CRplus R1 (CR_of_Q R1 q) (CRopp R1 (CR_of_Q R1 q))))).
+ destruct (Radd_assoc x (CR_of_Q R1 q) (CRopp R1 (CR_of_Q R1 q))).
+ exact H0.
+ apply (CRle_trans _ (CRplus R1 x (CRzero R1))).
+ apply CRplus_le_compat_l. destruct (Ropp_def (CR_of_Q R1 q)). exact H1.
+ destruct (CRplus_0_r x). exact H1.
+ apply (CRlt_le_trans _ (CR_of_Q R1 (r-q))).
+ apply (CRmorph_increasing_inv f).
+ apply (CRlt_le_trans _ (CR_of_Q R2 (r - q))).
+ apply (CRplus_lt_reg_r (CR_of_Q R2 q)).
+ apply (CRlt_le_trans _ _ _ H).
+ 2: apply CRmorph_rat.
+ apply (CRle_trans _ (CR_of_Q R2 (r-q+q))).
+ intro abs. apply lt_CR_of_Q in abs. ring_simplify in abs.
+ exact (Qlt_not_le _ _ abs (Qle_refl _)).
+ destruct (CR_of_Q_plus R2 (r-q) q). exact H1.
+ apply (CRle_trans _ (CRplus R1 (CR_of_Q R1 r) (CR_of_Q R1 (-q)))).
+ destruct (CR_of_Q_plus R1 r (-q)). exact H1.
+ apply CRplus_le_compat_l. destruct (@CR_of_Q_opp R1 q). exact H1.
+Qed.
+
+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).
+Proof.
+ intros R1 R2 f.
+ assert (forall (x y : CRcarrier R1),
+ CRplus R2 (CRmorph f x) (CRmorph f y)
+ <= CRmorph f (CRplus R1 x y)).
+ { intros x y abs. destruct (CR_Q_dense R2 _ _ abs) as [r [H H0]]. clear abs.
+ destruct (CRmorph_rat f r) as [H1 _].
+ apply (CRlt_le_trans _ _ _ H) in H1. clear H.
+ apply CRmorph_increasing_inv in H1.
+ apply (CRlt_asym _ _ H1). clear H1.
+ destruct (CR_Q_dense R2 _ _ H0) as [q [H2 H3]].
+ apply lt_CR_of_Q in H2.
+ assert (Qlt (r-q) 0) as epsNeg.
+ { apply (Qplus_lt_r _ _ q). ring_simplify. exact H2. }
+ destruct (CR_Q_dense R1 _ _ (CRplus_neg_rat_lt x (r-q) epsNeg))
+ as [s [H4 H5]].
+ apply (CRlt_trans _ (CRplus R1 (CR_of_Q R1 s) y)).
+ 2: apply CRplus_lt_compat_r, H5.
+ apply (CRmorph_increasing_inv f).
+ apply (CRlt_le_trans _ (CRplus R2 (CR_of_Q R2 s) (CRmorph f y))).
+ apply (CRmorph_increasing f) in H4.
+ destruct (CRmorph_plus_rat f x (r-q)) as [H _].
+ apply (CRle_lt_trans _ _ _ H) in H4. clear H.
+ destruct (CRmorph_rat f s) as [_ H1].
+ apply (CRlt_le_trans _ _ _ H4) in H1. clear H4.
+ apply (CRlt_trans
+ _ (CRplus R2 (CRplus R2 (CRmorph f x) (CR_of_Q R2 (r - q)))
+ (CRmorph f y))).
+ 2: apply CRplus_lt_compat_r, H1.
+ apply (CRlt_le_trans
+ _ (CRplus R2 (CRplus R2 (CR_of_Q R2 (r - q)) (CRmorph f x))
+ (CRmorph f y))).
+ apply (CRlt_le_trans
+ _ (CRplus R2 (CR_of_Q R2 (r - q))
+ (CRplus R2 (CRmorph f x) (CRmorph f y)))).
+ apply (CRle_lt_trans _ (CRplus R2 (CR_of_Q R2 (r - q)) (CR_of_Q R2 q))).
+ 2: apply CRplus_lt_compat_l, H3.
+ intro abs.
+ destruct (CR_of_Q_plus R2 (r-q) q) as [_ H4].
+ apply (CRle_lt_trans _ _ _ H4) in abs. clear H4.
+ destruct (CRmorph_rat f r) as [_ H4].
+ apply (CRlt_le_trans _ _ _ abs) in H4. clear abs.
+ apply lt_CR_of_Q in H4. ring_simplify in H4.
+ exact (Qlt_not_le _ _ H4 (Qle_refl _)).
+ destruct (CRisRing R2); apply Radd_assoc.
+ apply CRplus_le_compat_r. destruct (CRisRing R2).
+ destruct (Radd_comm (CRmorph f x) (CR_of_Q R2 (r - q))).
+ exact H.
+ intro abs.
+ destruct (CRmorph_plus_rat f y s) as [H _]. apply H. clear H.
+ apply (CRlt_le_trans _ (CRplus R2 (CR_of_Q R2 s) (CRmorph f y))).
+ apply (CRle_lt_trans _ (CRmorph f (CRplus R1 (CR_of_Q R1 s) y))).
+ apply CRmorph_proper. destruct (CRisRing R1); apply Radd_comm.
+ exact abs. destruct (CRisRing R2); apply Radd_comm. }
+ split.
+ - apply H.
+ - specialize (H (CRplus R1 x y) (CRopp R1 y)).
+ intro abs. apply H. clear H.
+ apply (CRle_lt_trans _ (CRmorph f x)).
+ apply CRmorph_proper. destruct (CRisRing R1).
+ apply (CReq_trans _ (CRplus R1 x (CRplus R1 y (CRopp R1 y)))).
+ apply CReq_sym, Radd_assoc.
+ apply (CReq_trans _ (CRplus R1 x (CRzero R1))). 2: apply CRplus_0_r.
+ destruct (CRisRingExt R1). apply Radd_ext.
+ apply CReq_refl. apply Ropp_def.
+ apply (CRplus_lt_reg_r (CRmorph f y)).
+ apply (CRlt_le_trans _ _ _ abs). clear abs.
+ apply (CRle_trans _ (CRplus R2 (CRmorph f (CRplus R1 x y)) (CRzero R2))).
+ destruct (CRplus_0_r (CRmorph f (CRplus R1 x y))). exact H.
+ apply (CRle_trans _ (CRplus R2 (CRmorph f (CRplus R1 x y))
+ (CRplus R2 (CRmorph f (CRopp R1 y)) (CRmorph f y)))).
+ apply CRplus_le_compat_l.
+ apply (CRle_trans
+ _ (CRplus R2 (CRopp R2 (CRmorph f y)) (CRmorph f y))).
+ destruct (CRplus_opp_l (CRmorph f y)). exact H.
+ apply CRplus_le_compat_r. destruct (CRmorph_opp f y). exact H.
+ destruct (CRisRing R2).
+ destruct (Radd_assoc (CRmorph f (CRplus R1 x y))
+ (CRmorph f (CRopp R1 y)) (CRmorph f y)).
+ exact H0.
+Qed.
+
+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)).
+Proof.
+ induction n.
+ - simpl. destruct (CRisRingExt R1).
+ apply (CReq_trans _ (CRzero R2)).
+ + apply (CReq_trans _ (CRmorph f (CRzero R1))).
+ 2: apply CRmorph_zero. apply CRmorph_proper.
+ apply (CReq_trans _ (CRmult R1 x (CRzero R1))).
+ 2: apply CRmult_0_r. apply Rmul_ext. apply CReq_refl. apply CR_of_Q_zero.
+ + apply (CReq_trans _ (CRmult R2 (CRmorph f x) (CRzero R2))).
+ apply CReq_sym, CRmult_0_r. destruct (CRisRingExt R2).
+ apply Rmul_ext0. apply CReq_refl. apply CReq_sym, CR_of_Q_zero.
+ - destruct (CRisRingExt R1), (CRisRingExt R2).
+ apply (CReq_trans
+ _ (CRmorph f (CRplus R1 x (CRmult R1 x (CR_of_Q R1 (Z.of_nat n # 1)))))).
+ apply CRmorph_proper.
+ apply (CReq_trans
+ _ (CRmult R1 x (CRplus R1 (CRone R1) (CR_of_Q R1 (Z.of_nat n # 1))))).
+ apply Rmul_ext. apply CReq_refl.
+ apply (CReq_trans _ (CR_of_Q R1 (1 + (Z.of_nat n # 1)))).
+ apply CR_of_Q_morph. rewrite Nat2Z.inj_succ. unfold Z.succ.
+ rewrite Z.add_comm. rewrite Qinv_plus_distr. reflexivity.
+ apply (CReq_trans _ (CRplus R1 (CR_of_Q R1 1) (CR_of_Q R1 (Z.of_nat n # 1)))).
+ apply CR_of_Q_plus. apply Radd_ext. apply CR_of_Q_one. apply CReq_refl.
+ apply (CReq_trans _ (CRplus R1 (CRmult R1 x (CRone R1))
+ (CRmult R1 x (CR_of_Q R1 (Z.of_nat n # 1))))).
+ apply CRmult_plus_distr_l. apply Radd_ext. apply CRmult_1_r. apply CReq_refl.
+ apply (CReq_trans
+ _ (CRplus R2 (CRmorph f x)
+ (CRmorph f (CRmult R1 x (CR_of_Q R1 (Z.of_nat n # 1)))))).
+ apply CRmorph_plus.
+ apply (CReq_trans
+ _ (CRplus R2 (CRmorph f x)
+ (CRmult R2 (CRmorph f x) (CR_of_Q R2 (Z.of_nat n # 1))))).
+ apply Radd_ext0. apply CReq_refl. exact IHn.
+ apply (CReq_trans
+ _ (CRmult R2 (CRmorph f x) (CRplus R2 (CRone R2) (CR_of_Q R2 (Z.of_nat n # 1))))).
+ apply (CReq_trans
+ _ (CRplus R2 (CRmult R2 (CRmorph f x) (CRone R2))
+ (CRmult R2 (CRmorph f x) (CR_of_Q R2 (Z.of_nat n # 1))))).
+ apply Radd_ext0. 2: apply CReq_refl. apply CReq_sym, CRmult_1_r.
+ apply CReq_sym, CRmult_plus_distr_l.
+ apply Rmul_ext0. apply CReq_refl.
+ apply (CReq_trans _ (CR_of_Q R2 (1 + (Z.of_nat n # 1)))).
+ apply (CReq_trans _ (CRplus R2 (CR_of_Q R2 1) (CR_of_Q R2 (Z.of_nat n # 1)))).
+ apply Radd_ext0. apply CReq_sym, CR_of_Q_one. apply CReq_refl.
+ apply CReq_sym, CR_of_Q_plus.
+ apply CR_of_Q_morph. rewrite Nat2Z.inj_succ. unfold Z.succ.
+ rewrite Z.add_comm. rewrite Qinv_plus_distr. reflexivity.
+Qed.
+
+Lemma NatOfZ : forall n : Z, { p : nat | n = Z.of_nat p \/ n = Z.opp (Z.of_nat p) }.
+Proof.
+ intros [|p|n].
+ - exists O. left. reflexivity.
+ - exists (Pos.to_nat p). left. rewrite positive_nat_Z. reflexivity.
+ - exists (Pos.to_nat n). right. rewrite positive_nat_Z. reflexivity.
+Qed.
+
+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)).
+Proof.
+ intros. destruct (NatOfZ n) as [p [pos|neg]].
+ - subst n. apply CRmorph_mult_pos.
+ - subst n.
+ apply (CReq_trans
+ _ (CRopp R2 (CRmorph f (CRmult R1 x (CR_of_Q R1 (Z.of_nat p # 1)))))).
+ + apply (CReq_trans
+ _ (CRmorph f (CRopp R1 (CRmult R1 x (CR_of_Q R1 (Z.of_nat p # 1)))))).
+ 2: apply CRmorph_opp. apply CRmorph_proper.
+ apply (CReq_trans _ (CRmult R1 x (CR_of_Q R1 (- (Z.of_nat p # 1))))).
+ destruct (CRisRingExt R1). apply Rmul_ext. apply CReq_refl.
+ apply CR_of_Q_morph. reflexivity.
+ apply (CReq_trans _ (CRmult R1 x (CRopp R1 (CR_of_Q R1 (Z.of_nat p # 1))))).
+ destruct (CRisRingExt R1). apply Rmul_ext. apply CReq_refl.
+ apply CR_of_Q_opp. apply CReq_sym, CRopp_mult_distr_r.
+ + apply (CReq_trans
+ _ (CRopp R2 (CRmult R2 (CRmorph f x) (CR_of_Q R2 (Z.of_nat p # 1))))).
+ destruct (CRisRingExt R2). apply Ropp_ext. apply CRmorph_mult_pos.
+ apply (CReq_trans
+ _ (CRmult R2 (CRmorph f x) (CRopp R2 (CR_of_Q R2 (Z.of_nat p # 1))))).
+ apply CRopp_mult_distr_r. destruct (CRisRingExt R2).
+ apply Rmul_ext. apply CReq_refl.
+ apply (CReq_trans _ (CR_of_Q R2 (- (Z.of_nat p # 1)))).
+ apply CReq_sym, CR_of_Q_opp. apply CR_of_Q_morph. reflexivity.
+Qed.
+
+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)).
+Proof.
+ intros. apply (CRmult_eq_reg_r (CR_of_Q R2 (Z.pos p # 1))).
+ left. apply (CRle_lt_trans _ (CR_of_Q R2 0)).
+ apply CR_of_Q_zero. apply CR_of_Q_lt. reflexivity.
+ apply (CReq_trans _ (CRmorph f x)).
+ - apply (CReq_trans
+ _ (CRmorph f (CRmult R1 (CRmult R1 x (CR_of_Q R1 (1 # p)))
+ (CR_of_Q R1 (Z.pos p # 1))))).
+ apply CReq_sym, CRmorph_mult_int. apply CRmorph_proper.
+ apply (CReq_trans
+ _ (CRmult R1 x (CRmult R1 (CR_of_Q R1 (1 # p))
+ (CR_of_Q R1 (Z.pos p # 1))))).
+ destruct (CRisRing R1). apply CReq_sym, Rmul_assoc.
+ apply (CReq_trans _ (CRmult R1 x (CRone R1))).
+ apply (Rmul_ext (CRisRingExt R1)). apply CReq_refl.
+ apply (CReq_trans _ (CR_of_Q R1 ((1#p) * (Z.pos p # 1)))).
+ apply CReq_sym, CR_of_Q_mult.
+ apply (CReq_trans _ (CR_of_Q R1 1)).
+ apply CR_of_Q_morph. reflexivity. apply CR_of_Q_one.
+ apply CRmult_1_r.
+ - apply (CReq_trans
+ _ (CRmult R2 (CRmorph f x)
+ (CRmult R2 (CR_of_Q R2 (1 # p)) (CR_of_Q R2 (Z.pos p # 1))))).
+ 2: apply (Rmul_assoc (CRisRing R2)).
+ apply (CReq_trans _ (CRmult R2 (CRmorph f x) (CRone R2))).
+ apply CReq_sym, CRmult_1_r.
+ apply (Rmul_ext (CRisRingExt R2)). apply CReq_refl.
+ apply (CReq_trans _ (CR_of_Q R2 1)).
+ apply CReq_sym, CR_of_Q_one.
+ apply (CReq_trans _ (CR_of_Q R2 ((1#p)*(Z.pos p # 1)))).
+ apply CR_of_Q_morph. reflexivity. apply CR_of_Q_mult.
+Qed.
+
+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).
+Proof.
+ intros. destruct q as [a b].
+ apply (CReq_trans
+ _ (CRmult R2 (CRmorph f (CRmult R1 x (CR_of_Q R1 (a # 1))))
+ (CR_of_Q R2 (1 # b)))).
+ - apply (CReq_trans
+ _ (CRmorph f (CRmult R1 (CRmult R1 x (CR_of_Q R1 (a # 1)))
+ (CR_of_Q R1 (1 # b))))).
+ 2: apply CRmorph_mult_inv. apply CRmorph_proper.
+ apply (CReq_trans
+ _ (CRmult R1 x (CRmult R1 (CR_of_Q R1 (a # 1))
+ (CR_of_Q R1 (1 # b))))).
+ apply (Rmul_ext (CRisRingExt R1)). apply CReq_refl.
+ apply (CReq_trans _ (CR_of_Q R1 ((a#1)*(1#b)))).
+ apply CR_of_Q_morph. unfold Qeq; simpl. rewrite Z.mul_1_r. reflexivity.
+ apply CR_of_Q_mult.
+ apply (Rmul_assoc (CRisRing R1)).
+ - apply (CReq_trans
+ _ (CRmult R2 (CRmult R2 (CRmorph f x) (CR_of_Q R2 (a # 1)))
+ (CR_of_Q R2 (1 # b)))).
+ apply (Rmul_ext (CRisRingExt R2)). apply CRmorph_mult_int.
+ apply CReq_refl.
+ apply (CReq_trans
+ _ (CRmult R2 (CRmorph f x)
+ (CRmult R2 (CR_of_Q R2 (a # 1)) (CR_of_Q R2 (1 # b))))).
+ apply CReq_sym, (Rmul_assoc (CRisRing R2)).
+ apply (Rmul_ext (CRisRingExt R2)). apply CReq_refl.
+ apply (CReq_trans _ (CR_of_Q R2 ((a#1)*(1#b)))).
+ apply CReq_sym, CR_of_Q_mult.
+ apply CR_of_Q_morph. unfold Qeq; simpl. rewrite Z.mul_1_r. reflexivity.
+Qed.
+
+Lemma CRmorph_mult_pos_pos_le : forall {R1 R2 : ConstructiveReals}
+ (f : @ConstructiveRealsMorphism R1 R2)
+ (x y : CRcarrier R1),
+ CRlt R1 (CRzero R1) y
+ -> CRmult R2 (CRmorph f x) (CRmorph f y)
+ <= CRmorph f (CRmult R1 x y).
+Proof.
+ intros. intro abs. destruct (CR_Q_dense R2 _ _ abs) as [q [H1 H2]].
+ destruct (CRmorph_rat f q) as [H3 _].
+ apply (CRlt_le_trans _ _ _ H1) in H3. clear H1.
+ apply CRmorph_increasing_inv in H3.
+ apply (CRlt_asym _ _ H3). clear H3.
+ destruct (CR_Q_dense R2 _ _ H2) as [r [H1 H3]].
+ apply lt_CR_of_Q in H1.
+ destruct (CR_archimedean R1 y) as [A Amaj].
+ assert (/ ((r - q) * (1 # A)) * (q - r) == - (Z.pos A # 1))%Q as diveq.
+ { rewrite Qinv_mult_distr. setoid_replace (q-r)%Q with (-1*(r-q))%Q.
+ field_simplify. reflexivity. 2: field.
+ split. intro H4. inversion H4. intro H4.
+ apply Qlt_minus_iff in H1. rewrite H4 in H1. inversion H1. }
+ destruct (CR_Q_dense R1 (CRplus R1 x (CR_of_Q R1 ((q-r) * (1#A)))) x)
+ as [s [H4 H5]].
+ - apply (CRlt_le_trans _ (CRplus R1 x (CRzero R1))).
+ 2: apply CRplus_0_r. apply CRplus_lt_compat_l.
+ apply (CRplus_lt_reg_l R1 (CR_of_Q R1 ((r-q) * (1#A)))).
+ apply (CRle_lt_trans _ (CRzero R1)).
+ apply (CRle_trans _ (CR_of_Q R1 ((r-q)*(1#A) + (q-r)*(1#A)))).
+ destruct (CR_of_Q_plus R1 ((r-q)*(1#A)) ((q-r)*(1#A))).
+ exact H0. apply (CRle_trans _ (CR_of_Q R1 0)).
+ 2: destruct (@CR_of_Q_zero R1); exact H4.
+ intro H4. apply lt_CR_of_Q in H4. ring_simplify in H4.
+ inversion H4.
+ apply (CRlt_le_trans _ (CR_of_Q R1 ((r - q) * (1 # A)))).
+ 2: apply CRplus_0_r.
+ apply (CRle_lt_trans _ (CR_of_Q R1 0)).
+ apply CR_of_Q_zero. apply CR_of_Q_lt.
+ rewrite <- (Qmult_0_r (r-q)). apply Qmult_lt_l.
+ apply Qlt_minus_iff in H1. exact H1. reflexivity.
+ - apply (CRmorph_increasing f) in H4.
+ destruct (CRmorph_plus f x (CR_of_Q R1 ((q-r) * (1#A)))) as [H6 _].
+ apply (CRle_lt_trans _ _ _ H6) in H4. clear H6.
+ destruct (CRmorph_rat f s) as [_ H6].
+ apply (CRlt_le_trans _ _ _ H4) in H6. clear H4.
+ apply (CRmult_lt_compat_r (CRmorph f y)) in H6.
+ destruct (Rdistr_l (CRisRing R2) (CRmorph f x)
+ (CRmorph f (CR_of_Q R1 ((q-r) * (1#A))))
+ (CRmorph f y)) as [H4 _].
+ apply (CRle_lt_trans _ _ _ H4) in H6. clear H4.
+ apply (CRle_lt_trans _ (CRmult R1 (CR_of_Q R1 s) y)).
+ 2: apply CRmult_lt_compat_r. 2: exact H. 2: exact H5.
+ apply (CRmorph_le_inv f).
+ apply (CRle_trans _ (CR_of_Q R2 q)).
+ destruct (CRmorph_rat f q). exact H4.
+ apply (CRle_trans _ (CRmult R2 (CR_of_Q R2 s) (CRmorph f y))).
+ apply (CRle_trans _ (CRplus R2 (CRmult R2 (CRmorph f x) (CRmorph f y))
+ (CR_of_Q R2 (q-r)))).
+ apply (CRle_trans _ (CRplus R2 (CR_of_Q R2 r) (CR_of_Q R2 (q - r)))).
+ + apply (CRle_trans _ (CR_of_Q R2 (r + (q-r)))).
+ intro H4. apply lt_CR_of_Q in H4. ring_simplify in H4.
+ exact (Qlt_not_le q q H4 (Qle_refl q)).
+ destruct (CR_of_Q_plus R2 r (q-r)). exact H4.
+ + apply CRplus_le_compat_r. intro H4.
+ apply (CRlt_asym _ _ H3). exact H4.
+ + intro H4. apply (CRlt_asym _ _ H4). clear H4.
+ apply (CRlt_trans_flip _ _ _ H6). clear H6.
+ apply CRplus_lt_compat_l.
+ apply (CRlt_le_trans
+ _ (CRmult R2 (CR_of_Q R2 ((q - r) * (1 # A))) (CRmorph f y))).
+ apply (CRmult_lt_reg_l (CR_of_Q R2 (/((r-q)*(1#A))))).
+ apply (CRle_lt_trans _ (CR_of_Q R2 0)). apply CR_of_Q_zero.
+ apply CR_of_Q_lt, Qinv_lt_0_compat.
+ rewrite <- (Qmult_0_r (r-q)). apply Qmult_lt_l.
+ apply Qlt_minus_iff in H1. exact H1. reflexivity.
+ apply (CRle_lt_trans _ (CRopp R2 (CR_of_Q R2 (Z.pos A # 1)))).
+ apply (CRle_trans _ (CR_of_Q R2 (-(Z.pos A # 1)))).
+ apply (CRle_trans _ (CR_of_Q R2 ((/ ((r - q) * (1 # A))) * (q - r)))).
+ destruct (CR_of_Q_mult R2 (/ ((r - q) * (1 # A))) (q - r)).
+ exact H0. destruct (CR_of_Q_morph R2 (/ ((r - q) * (1 # A)) * (q - r))
+ (-(Z.pos A # 1))).
+ exact diveq. intro H7. apply lt_CR_of_Q in H7.
+ rewrite diveq in H7. exact (Qlt_not_le _ _ H7 (Qle_refl _)).
+ destruct (@CR_of_Q_opp R2 (Z.pos A # 1)). exact H4.
+ apply (CRlt_le_trans _ (CRopp R2 (CRmorph f y))).
+ apply CRopp_gt_lt_contravar.
+ apply (CRlt_le_trans _ (CRmorph f (CR_of_Q R1 (Z.pos A # 1)))).
+ apply CRmorph_increasing. exact Amaj.
+ destruct (CRmorph_rat f (Z.pos A # 1)). exact H4.
+ apply (CRle_trans _ (CRmult R2 (CRopp R2 (CRone R2)) (CRmorph f y))).
+ apply (CRle_trans _ (CRopp R2 (CRmult R2 (CRone R2) (CRmorph f y)))).
+ destruct (Ropp_ext (CRisRingExt R2) (CRmorph f y)
+ (CRmult R2 (CRone R2) (CRmorph f y))).
+ apply CReq_sym, (Rmul_1_l (CRisRing R2)). exact H4.
+ destruct (CRopp_mult_distr_l (CRone R2) (CRmorph f y)). exact H4.
+ apply (CRle_trans _ (CRmult R2 (CRmult R2 (CR_of_Q R2 (/ ((r - q) * (1 # A))))
+ (CR_of_Q R2 ((q - r) * (1 # A))))
+ (CRmorph f y))).
+ apply CRmult_le_compat_r_half.
+ apply (CRle_lt_trans _ (CRmorph f (CRzero R1))).
+ apply CRmorph_zero. apply CRmorph_increasing. exact H.
+ apply (CRle_trans _ (CR_of_Q R2 ((/ ((r - q) * (1 # A)))
+ * ((q - r) * (1 # A))))).
+ apply (CRle_trans _ (CR_of_Q R2 (-1))).
+ apply (CRle_trans _ (CRopp R2 (CR_of_Q R2 1))).
+ destruct (Ropp_ext (CRisRingExt R2) (CRone R2) (CR_of_Q R2 1)).
+ apply CReq_sym, CR_of_Q_one. exact H4.
+ destruct (@CR_of_Q_opp R2 1). exact H0.
+ destruct (CR_of_Q_morph R2 (-1) (/ ((r - q) * (1 # A)) * ((q - r) * (1 # A)))).
+ field. split.
+ intro H4. inversion H4. intro H4. apply Qlt_minus_iff in H1.
+ rewrite H4 in H1. inversion H1. exact H4.
+ destruct (CR_of_Q_mult R2 (/ ((r - q) * (1 # A))) ((q - r) * (1 # A))).
+ exact H4.
+ destruct (Rmul_assoc (CRisRing R2) (CR_of_Q R2 (/ ((r - q) * (1 # A))))
+ (CR_of_Q R2 ((q - r) * (1 # A)))
+ (CRmorph f y)).
+ exact H0.
+ apply CRmult_le_compat_r_half.
+ apply (CRle_lt_trans _ (CRmorph f (CRzero R1))).
+ apply CRmorph_zero. apply CRmorph_increasing. exact H.
+ destruct (CRmorph_rat f ((q - r) * (1 # A))). exact H0.
+ + apply (CRle_trans _ (CRmorph f (CRmult R1 y (CR_of_Q R1 s)))).
+ apply (CRle_trans _ (CRmult R2 (CRmorph f y) (CR_of_Q R2 s))).
+ destruct (Rmul_comm (CRisRing R2) (CRmorph f y) (CR_of_Q R2 s)).
+ exact H0.
+ destruct (CRmorph_mult_rat f y s). exact H0.
+ destruct (CRmorph_proper f (CRmult R1 y (CR_of_Q R1 s))
+ (CRmult R1 (CR_of_Q R1 s) y)).
+ apply (Rmul_comm (CRisRing R1)). exact H4.
+ + apply (CRle_lt_trans _ (CRmorph f (CRzero R1))).
+ apply CRmorph_zero. apply CRmorph_increasing. exact H.
+Qed.
+
+Lemma CRmorph_mult_pos_pos : forall {R1 R2 : ConstructiveReals}
+ (f : @ConstructiveRealsMorphism R1 R2)
+ (x y : CRcarrier R1),
+ CRlt R1 (CRzero R1) y
+ -> CRmorph f (CRmult R1 x y)
+ == CRmult R2 (CRmorph f x) (CRmorph f y).
+Proof.
+ split. apply CRmorph_mult_pos_pos_le. exact H.
+ intro abs. destruct (CR_Q_dense R2 _ _ abs) as [q [H1 H2]].
+ destruct (CRmorph_rat f q) as [_ H3].
+ apply (CRle_lt_trans _ _ _ H3) in H2. clear H3.
+ apply CRmorph_increasing_inv in H2.
+ apply (CRlt_asym _ _ H2). clear H2.
+ destruct (CR_Q_dense R2 _ _ H1) as [r [H2 H3]].
+ apply lt_CR_of_Q in H3.
+ destruct (CR_archimedean R1 y) as [A Amaj].
+ destruct (CR_Q_dense R1 x (CRplus R1 x (CR_of_Q R1 ((q-r) * (1#A)))))
+ as [s [H4 H5]].
+ - apply (CRle_lt_trans _ (CRplus R1 x (CRzero R1))).
+ apply CRplus_0_r. apply CRplus_lt_compat_l.
+ apply (CRle_lt_trans _ (CR_of_Q R1 0)).
+ apply CR_of_Q_zero. apply CR_of_Q_lt.
+ rewrite <- (Qmult_0_r (q-r)). apply Qmult_lt_l.
+ apply Qlt_minus_iff in H3. exact H3. reflexivity.
+ - apply (CRmorph_increasing f) in H5.
+ destruct (CRmorph_plus f x (CR_of_Q R1 ((q-r) * (1#A)))) as [_ H6].
+ apply (CRlt_le_trans _ _ _ H5) in H6. clear H5.
+ destruct (CRmorph_rat f s) as [H5 _ ].
+ apply (CRle_lt_trans _ _ _ H5) in H6. clear H5.
+ apply (CRmult_lt_compat_r (CRmorph f y)) in H6.
+ apply (CRlt_le_trans _ (CRmult R1 (CR_of_Q R1 s) y)).
+ apply CRmult_lt_compat_r. exact H. exact H4. clear H4.
+ apply (CRmorph_le_inv f).
+ apply (CRle_trans _ (CR_of_Q R2 q)).
+ 2: destruct (CRmorph_rat f q); exact H0.
+ apply (CRle_trans _ (CRmult R2 (CR_of_Q R2 s) (CRmorph f y))).
+ + apply (CRle_trans _ (CRmorph f (CRmult R1 y (CR_of_Q R1 s)))).
+ destruct (CRmorph_proper f (CRmult R1 (CR_of_Q R1 s) y)
+ (CRmult R1 y (CR_of_Q R1 s))).
+ apply (Rmul_comm (CRisRing R1)). exact H4.
+ apply (CRle_trans _ (CRmult R2 (CRmorph f y) (CR_of_Q R2 s))).
+ exact (proj2 (CRmorph_mult_rat f y s)).
+ destruct (Rmul_comm (CRisRing R2) (CR_of_Q R2 s) (CRmorph f y)).
+ exact H0.
+ + intro H5. apply (CRlt_asym _ _ H5). clear H5.
+ apply (CRlt_trans _ _ _ H6). clear H6.
+ apply (CRle_lt_trans
+ _ (CRplus R2
+ (CRmult R2 (CRmorph f x) (CRmorph f y))
+ (CRmult R2 (CRmorph f (CR_of_Q R1 ((q - r) * (1 # A))))
+ (CRmorph f y)))).
+ apply (Rdistr_l (CRisRing R2)).
+ apply (CRle_lt_trans
+ _ (CRplus R2 (CR_of_Q R2 r)
+ (CRmult R2 (CRmorph f (CR_of_Q R1 ((q - r) * (1 # A))))
+ (CRmorph f y)))).
+ apply CRplus_le_compat_r. intro H5. apply (CRlt_asym _ _ H5 H2).
+ clear H2.
+ apply (CRle_lt_trans
+ _ (CRplus R2 (CR_of_Q R2 r)
+ (CRmult R2 (CR_of_Q R2 ((q - r) * (1 # A)))
+ (CRmorph f y)))).
+ apply CRplus_le_compat_l, CRmult_le_compat_r_half.
+ apply (CRle_lt_trans _ (CRmorph f (CRzero R1))).
+ apply CRmorph_zero. apply CRmorph_increasing. exact H.
+ destruct (CRmorph_rat f ((q - r) * (1 # A))). exact H2.
+ apply (CRlt_le_trans _ (CRplus R2 (CR_of_Q R2 r)
+ (CR_of_Q R2 ((q - r))))).
+ apply CRplus_lt_compat_l.
+ * apply (CRmult_lt_reg_l (CR_of_Q R2 (/((q - r) * (1 # A))))).
+ apply (CRle_lt_trans _ (CR_of_Q R2 0)). apply CR_of_Q_zero.
+ apply CR_of_Q_lt, Qinv_lt_0_compat.
+ rewrite <- (Qmult_0_r (q-r)). apply Qmult_lt_l.
+ apply Qlt_minus_iff in H3. exact H3. reflexivity.
+ apply (CRle_lt_trans _ (CRmorph f y)).
+ apply (CRle_trans _ (CRmult R2 (CRmult R2 (CR_of_Q R2 (/ ((q - r) * (1 # A))))
+ (CR_of_Q R2 ((q - r) * (1 # A))))
+ (CRmorph f y))).
+ exact (proj2 (Rmul_assoc (CRisRing R2) (CR_of_Q R2 (/ ((q - r) * (1 # A))))
+ (CR_of_Q R2 ((q - r) * (1 # A)))
+ (CRmorph f y))).
+ apply (CRle_trans _ (CRmult R2 (CRone R2) (CRmorph f y))).
+ apply CRmult_le_compat_r_half.
+ apply (CRle_lt_trans _ (CRmorph f (CRzero R1))).
+ apply CRmorph_zero. apply CRmorph_increasing. exact H.
+ apply (CRle_trans
+ _ (CR_of_Q R2 ((/ ((q - r) * (1 # A))) * ((q - r) * (1 # A))))).
+ exact (proj1 (CR_of_Q_mult R2 (/ ((q - r) * (1 # A))) ((q - r) * (1 # A)))).
+ apply (CRle_trans _ (CR_of_Q R2 1)).
+ destruct (CR_of_Q_morph R2 (/ ((q - r) * (1 # A)) * ((q - r) * (1 # A))) 1).
+ field_simplify. reflexivity. split.
+ intro H5. inversion H5. intro H5. apply Qlt_minus_iff in H3.
+ rewrite H5 in H3. inversion H3. exact H2.
+ destruct (CR_of_Q_one R2). exact H2.
+ destruct (Rmul_1_l (CRisRing R2) (CRmorph f y)).
+ intro H5. contradiction.
+ apply (CRlt_le_trans _ (CR_of_Q R2 (Z.pos A # 1))).
+ apply (CRlt_le_trans _ (CRmorph f (CR_of_Q R1 (Z.pos A # 1)))).
+ apply CRmorph_increasing. exact Amaj.
+ exact (proj2 (CRmorph_rat f (Z.pos A # 1))).
+ apply (CRle_trans _ (CR_of_Q R2 ((/ ((q - r) * (1 # A))) * (q - r)))).
+ 2: exact (proj2 (CR_of_Q_mult R2 (/ ((q - r) * (1 # A))) (q - r))).
+ destruct (CR_of_Q_morph R2 (Z.pos A # 1) (/ ((q - r) * (1 # A)) * (q - r))).
+ field_simplify. reflexivity. split.
+ intro H5. inversion H5. intro H5. apply Qlt_minus_iff in H3.
+ rewrite H5 in H3. inversion H3. exact H2.
+ * apply (CRle_trans _ (CR_of_Q R2 (r + (q-r)))).
+ exact (proj1 (CR_of_Q_plus R2 r (q-r))).
+ destruct (CR_of_Q_morph R2 (r + (q-r)) q). ring. exact H2.
+ + apply (CRle_lt_trans _ (CRmorph f (CRzero R1))).
+ apply CRmorph_zero. apply CRmorph_increasing. exact H.
+Qed.
+
+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).
+Proof.
+ intros.
+ destruct (CR_archimedean R1 (CRopp R1 y)) as [p pmaj].
+ apply (CRplus_eq_reg_r (CRmult R2 (CRmorph f x)
+ (CR_of_Q R2 (Z.pos p # 1)))).
+ apply (CReq_trans _ (CRmorph f (CRmult R1 x (CRplus R1 y (CR_of_Q R1 (Z.pos p # 1)))))).
+ - apply (CReq_trans _ (CRplus R2 (CRmorph f (CRmult R1 x y))
+ (CRmorph f (CRmult R1 x (CR_of_Q R1 (Z.pos p # 1)))))).
+ apply (Radd_ext (CRisRingExt R2)). apply CReq_refl.
+ apply CReq_sym, CRmorph_mult_int.
+ apply (CReq_trans _ (CRmorph f (CRplus R1 (CRmult R1 x y)
+ (CRmult R1 x (CR_of_Q R1 (Z.pos p # 1)))))).
+ apply CReq_sym, CRmorph_plus. apply CRmorph_proper.
+ apply CReq_sym, CRmult_plus_distr_l.
+ - apply (CReq_trans _ (CRmult R2 (CRmorph f x)
+ (CRmorph f (CRplus R1 y (CR_of_Q R1 (Z.pos p # 1)))))).
+ apply CRmorph_mult_pos_pos.
+ apply (CRplus_lt_compat_l R1 y) in pmaj.
+ apply (CRle_lt_trans _ (CRplus R1 y (CRopp R1 y))).
+ 2: exact pmaj. apply (CRisRing R1).
+ apply (CReq_trans _ (CRmult R2 (CRmorph f x)
+ (CRplus R2 (CRmorph f y) (CR_of_Q R2 (Z.pos p # 1))))).
+ apply (Rmul_ext (CRisRingExt R2)). apply CReq_refl.
+ apply (CReq_trans _ (CRplus R2 (CRmorph f y)
+ (CRmorph f (CR_of_Q R1 (Z.pos p # 1))))).
+ apply CRmorph_plus.
+ apply (Radd_ext (CRisRingExt R2)). apply CReq_refl.
+ apply CRmorph_rat.
+ apply CRmult_plus_distr_l.
+Qed.
+
+Lemma CRmorph_appart : forall {R1 R2 : ConstructiveReals}
+ (f : @ConstructiveRealsMorphism R1 R2)
+ (x y : CRcarrier R1)
+ (app : x ≶ y),
+ CRmorph f x ≶ CRmorph f y.
+Proof.
+ intros. destruct app.
+ - left. apply CRmorph_increasing. exact c.
+ - right. apply CRmorph_increasing. exact c.
+Defined.
+
+Lemma CRmorph_appart_zero : forall {R1 R2 : ConstructiveReals}
+ (f : @ConstructiveRealsMorphism R1 R2)
+ (x : CRcarrier R1)
+ (app : x ≶ 0),
+ CRmorph f x ≶ 0.
+Proof.
+ intros. destruct app.
+ - left. apply (CRlt_le_trans _ (CRmorph f (CRzero R1))).
+ apply CRmorph_increasing. exact c.
+ exact (proj2 (CRmorph_zero f)).
+ - right. apply (CRle_lt_trans _ (CRmorph f (CRzero R1))).
+ exact (proj1 (CRmorph_zero f)).
+ apply CRmorph_increasing. exact c.
+Defined.
+
+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.
+Proof.
+ intros. apply (CRmult_eq_reg_r (CRmorph f x)).
+ destruct fxnz. right. exact c. left. exact c.
+ apply (CReq_trans _ (CRone R2)).
+ 2: apply CReq_sym, CRinv_l.
+ apply (CReq_trans _ (CRmorph f (CRmult R1 ((/ x) xnz) x))).
+ apply CReq_sym, CRmorph_mult.
+ apply (CReq_trans _ (CRmorph f 1)).
+ apply CRmorph_proper. apply CRinv_l.
+ apply CRmorph_one.
+Qed.
+
+Lemma CRmorph_sum : forall {R1 R2 : ConstructiveReals}
+ (f : @ConstructiveRealsMorphism R1 R2)
+ (un : nat -> CRcarrier R1) (n : nat),
+ CRmorph f (CRsum un n) ==
+ CRsum (fun n0 : nat => CRmorph f (un n0)) n.
+Proof.
+ induction n.
+ - reflexivity.
+ - simpl. rewrite CRmorph_plus, IHn. reflexivity.
+Qed.
+
+Lemma CRmorph_INR : forall {R1 R2 : ConstructiveReals}
+ (f : @ConstructiveRealsMorphism R1 R2)
+ (n : nat),
+ CRmorph f (INR n) == INR n.
+Proof.
+ induction n.
+ - apply CRmorph_rat.
+ - simpl. unfold INR.
+ rewrite (CRmorph_proper f _ (1 + CR_of_Q R1 (Z.of_nat n # 1))).
+ rewrite CRmorph_plus. unfold INR in IHn.
+ rewrite IHn. rewrite CRmorph_one, <- CR_of_Q_one, <- CR_of_Q_plus.
+ apply CR_of_Q_morph. rewrite Qinv_plus_distr.
+ unfold Qeq, Qnum, Qden. do 2 rewrite Z.mul_1_r.
+ rewrite Nat2Z.inj_succ. rewrite <- Z.add_1_l. reflexivity.
+ rewrite <- CR_of_Q_one, <- CR_of_Q_plus.
+ apply CR_of_Q_morph. rewrite Qinv_plus_distr.
+ unfold Qeq, Qnum, Qden. do 2 rewrite Z.mul_1_r.
+ rewrite Nat2Z.inj_succ. rewrite <- Z.add_1_l. reflexivity.
+Qed.
+
+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)).
+Proof.
+ intros. intro p. destruct (H p) as [n nmaj].
+ exists n. intros. specialize (nmaj i j H0 H1).
+ unfold CRminus. rewrite <- CR_of_Q_opp, <- CR_of_Q_plus, CR_of_Q_abs.
+ unfold CRminus in nmaj. rewrite <- CR_of_Q_opp, <- CR_of_Q_plus, CR_of_Q_abs in nmaj.
+ apply CR_of_Q_le. destruct (Q_dec (Qabs (qn i + - qn j)) (1#p)).
+ destruct s. apply Qlt_le_weak, q. exfalso.
+ apply (Qlt_not_le _ _ q). apply (CR_of_Q_lt R1) in q. contradiction.
+ rewrite q. apply Qle_refl.
+Qed.
+
+Definition CR_Q_limit {R : ConstructiveReals} (x : CRcarrier R) (n:nat)
+ : { q:Q & x < CR_of_Q R q < x + CR_of_Q R (1 # Pos.of_nat n) }.
+Proof.
+ apply (CR_Q_dense R x (x + CR_of_Q R (1 # Pos.of_nat n))).
+ rewrite <- (CRplus_0_r x). rewrite CRplus_assoc.
+ apply CRplus_lt_compat_l. rewrite CRplus_0_l. apply CR_of_Q_pos.
+ reflexivity.
+Qed.
+
+Lemma CR_Q_limit_cv : forall {R : ConstructiveReals} (x : CRcarrier R),
+ CR_cv R (fun n => CR_of_Q R (let (q,_) := CR_Q_limit x n in q)) x.
+Proof.
+ intros R x p. exists (Pos.to_nat p).
+ intros. destruct (CR_Q_limit x i). rewrite CRabs_right.
+ apply (CRplus_le_reg_r x). unfold CRminus.
+ rewrite CRplus_assoc, CRplus_opp_l, CRplus_0_r, CRplus_comm.
+ apply (CRle_trans _ (x + CR_of_Q R (1 # Pos.of_nat i))).
+ apply CRlt_asym, p0. apply CRplus_le_compat_l, CR_of_Q_le.
+ unfold Qle, Qnum, Qden. rewrite Z.mul_1_l, Z.mul_1_l.
+ apply Pos2Z.pos_le_pos, Pos2Nat.inj_le. rewrite Nat2Pos.id. exact H.
+ destruct i. exfalso. inversion H. pose proof (Pos2Nat.is_pos p).
+ rewrite H1 in H0. inversion H0. discriminate.
+ rewrite <- (CRplus_opp_r x). apply CRplus_le_compat_r, CRlt_asym, p0.
+Qed.
+
+(* We call this morphism slow to remind that it should only be used
+ for proofs, not for computations. *)
+Definition SlowMorph {R1 R2 : ConstructiveReals}
+ : CRcarrier R1 -> CRcarrier R2
+ := fun x => let (y,_) := CR_complete R2 _ (CRmorph_rat_cv _ (Rcv_cauchy_mod _ x (CR_Q_limit_cv x)))
+ in y.
+
+Lemma CauchyMorph_rat : forall {R1 R2 : ConstructiveReals} (q : Q),
+ SlowMorph (CR_of_Q R1 q) == CR_of_Q R2 q.
+Proof.
+ intros. unfold SlowMorph.
+ destruct (CR_complete R2 _
+ (CRmorph_rat_cv _
+ (Rcv_cauchy_mod
+ (fun n : nat => CR_of_Q R1 (let (q0, _) := CR_Q_limit (CR_of_Q R1 q) n in q0))
+ (CR_of_Q R1 q) (CR_Q_limit_cv (CR_of_Q R1 q))))).
+ apply (CR_cv_unique _ _ _ c).
+ intro p. exists (Pos.to_nat p). intros.
+ destruct (CR_Q_limit (CR_of_Q R1 q) i). rewrite CRabs_right.
+ apply (CRplus_le_reg_r (CR_of_Q R2 q)). unfold CRminus.
+ rewrite CRplus_assoc, CRplus_opp_l, CRplus_0_r, CRplus_comm.
+ rewrite <- CR_of_Q_plus. apply CR_of_Q_le.
+ destruct (Q_dec x0 (q + (1 # p))%Q). destruct s.
+ apply Qlt_le_weak, q0. exfalso. pose proof (CR_of_Q_lt R1 _ _ q0).
+ apply (CRlt_asym _ _ H0). apply (CRlt_le_trans _ _ _ (snd p0)). clear H0.
+ rewrite <- CR_of_Q_plus. apply CR_of_Q_le. apply Qplus_le_r.
+ unfold Qle, Qnum, Qden. rewrite Z.mul_1_l, Z.mul_1_l.
+ apply Pos2Z.pos_le_pos, Pos2Nat.inj_le. rewrite Nat2Pos.id. exact H.
+ destruct i. exfalso. inversion H. pose proof (Pos2Nat.is_pos p).
+ rewrite H1 in H0. inversion H0. discriminate.
+ rewrite q0. apply Qle_refl.
+ rewrite <- (CRplus_opp_r (CR_of_Q R2 q)). apply CRplus_le_compat_r, CR_of_Q_le.
+ destruct (Q_dec q x0). destruct s. apply Qlt_le_weak, q0.
+ exfalso. apply (CRlt_asym _ _ (fst p0)). apply CR_of_Q_lt. exact q0.
+ rewrite q0. apply Qle_refl.
+Qed.
+
+(* The increasing property of morphisms, when the left bound is rational. *)
+Lemma SlowMorph_increasing_Qr
+ : forall {R1 R2 : ConstructiveReals} (x : CRcarrier R1) (q : Q),
+ CR_of_Q R1 q < x -> CR_of_Q R2 q < SlowMorph x.
+Proof.
+ intros.
+ unfold SlowMorph;
+ destruct (CR_complete R2 _
+ (CRmorph_rat_cv _
+ (Rcv_cauchy_mod (fun n : nat => CR_of_Q R1 (let (q0, _) := CR_Q_limit x n in q0)) x
+ (CR_Q_limit_cv x)))).
+ destruct (CR_Q_dense R1 _ _ H) as [r [H0 H1]].
+ apply lt_CR_of_Q in H0.
+ apply (CRlt_le_trans _ (CR_of_Q R2 r)).
+ apply CR_of_Q_lt, H0.
+ assert (forall n:nat, le O n -> CR_of_Q R2 r <= CR_of_Q R2 (let (q0, _) := CR_Q_limit x n in q0)).
+ { intros. apply CR_of_Q_le. destruct (CR_Q_limit x n).
+ destruct (Q_dec r x1). destruct s. apply Qlt_le_weak, q0.
+ exfalso. apply (CR_of_Q_lt R1) in q0.
+ apply (CRlt_asym _ _ q0). exact (CRlt_trans _ _ _ H1 (fst p)).
+ rewrite q0. apply Qle_refl. }
+ exact (CR_cv_bound_down _ _ _ O H2 c).
+Qed.
+
+(* The increasing property of morphisms, when the right bound is rational. *)
+Lemma SlowMorph_increasing_Ql
+ : forall {R1 R2 : ConstructiveReals} (x : CRcarrier R1) (q : Q),
+ x < CR_of_Q R1 q -> SlowMorph x < CR_of_Q R2 q.
+Proof.
+ intros.
+ unfold SlowMorph;
+ destruct (CR_complete R2 _
+ (CRmorph_rat_cv _
+ (Rcv_cauchy_mod (fun n : nat => CR_of_Q R1 (let (q0, _) := CR_Q_limit x n in q0)) x
+ (CR_Q_limit_cv x)))).
+ assert (CR_cv R1 (fun n => CR_of_Q R1 (let (q0, _) := CR_Q_limit x n in q0)
+ + CR_of_Q R1 (1 # Pos.of_nat n)) x).
+ { apply (CR_cv_proper _ (x+0)). apply CR_cv_plus. apply CR_Q_limit_cv.
+ intro p. exists (Pos.to_nat p). intros.
+ unfold CRminus. rewrite CRopp_0, CRplus_0_r. rewrite CRabs_right.
+ apply CR_of_Q_le. unfold Qle, Qnum, Qden. do 2 rewrite Z.mul_1_l.
+ apply Pos2Z.pos_le_pos, Pos2Nat.inj_le. rewrite Nat2Pos.id. exact H0.
+ destruct i. inversion H0. pose proof (Pos2Nat.is_pos p).
+ rewrite H2 in H1. inversion H1. discriminate.
+ rewrite <- CR_of_Q_zero. apply CR_of_Q_le. discriminate.
+ rewrite CRplus_0_r. reflexivity. }
+ pose proof (CR_cv_open_above _ _ _ H0 H) as [n nmaj].
+ apply (CRle_lt_trans _ (CR_of_Q R2 (let (q0, _) := CR_Q_limit x n in
+ q0 + (1 # Pos.of_nat n)))).
+ - apply (CR_cv_bound_up (fun n : nat => CR_of_Q R2 (let (q0, _) := CR_Q_limit x n in q0)) _ _ n).
+ 2: exact c. intros. destruct (CR_Q_limit x n0), (CR_Q_limit x n).
+ apply CR_of_Q_le, Qlt_le_weak. apply (lt_CR_of_Q R1).
+ apply (CRlt_le_trans _ _ _ (snd p)).
+ apply (CRle_trans _ (CR_of_Q R1 x2 + CR_of_Q R1 (1 # Pos.of_nat n0))).
+ apply CRplus_le_compat_r. apply CRlt_asym, p0.
+ rewrite <- CR_of_Q_plus. apply CR_of_Q_le. apply Qplus_le_r.
+ unfold Qle, Qnum, Qden. do 2 rewrite Z.mul_1_l.
+ apply Pos2Z.pos_le_pos, Pos2Nat.inj_le.
+ destruct n. destruct n0. apply le_refl.
+ rewrite (Nat2Pos.id (S n0)). apply le_n_S, le_0_n. discriminate.
+ destruct n0. exfalso; inversion H1.
+ rewrite Nat2Pos.id, Nat2Pos.id. exact H1. discriminate. discriminate.
+ - specialize (nmaj n (le_refl n)).
+ destruct (CR_Q_limit x n). apply CR_of_Q_lt.
+ rewrite <- CR_of_Q_plus in nmaj. apply lt_CR_of_Q in nmaj. exact nmaj.
+Qed.
+
+Lemma SlowMorph_increasing : forall {R1 R2 : ConstructiveReals} (x y : CRcarrier R1),
+ x < y -> @SlowMorph R1 R2 x < SlowMorph y.
+Proof.
+ intros.
+ destruct (CR_Q_dense R1 _ _ H) as [q [H0 H1]].
+ apply (CRlt_trans _ (CR_of_Q R2 q)).
+ apply SlowMorph_increasing_Ql. exact H0.
+ apply SlowMorph_increasing_Qr. exact H1.
+Qed.
+
+
+(* We call this morphism slow to remind that it should only be used
+ for proofs, not for computations. *)
+Definition SlowConstructiveRealsMorphism {R1 R2 : ConstructiveReals}
+ : @ConstructiveRealsMorphism R1 R2
+ := Build_ConstructiveRealsMorphism
+ R1 R2 SlowMorph CauchyMorph_rat
+ SlowMorph_increasing.
+
+Lemma CRmorph_abs : forall {R1 R2 : ConstructiveReals}
+ (f : @ConstructiveRealsMorphism R1 R2)
+ (x : CRcarrier R1),
+ CRabs R2 (CRmorph f x) == CRmorph f (CRabs R1 x).
+Proof.
+ assert (forall {R1 R2 : ConstructiveReals}
+ (f : @ConstructiveRealsMorphism R1 R2)
+ (x : CRcarrier R1),
+ CRabs R2 (CRmorph f x) <= CRmorph f (CRabs R1 x)).
+ { intros. rewrite <- CRabs_def. split.
+ - apply CRmorph_le.
+ pose proof (CRabs_def _ x (CRabs R1 x)) as [_ H].
+ apply H, CRle_refl.
+ - apply (CRle_trans _ (CRmorph f (CRopp R1 x))).
+ apply CRmorph_opp. apply CRmorph_le.
+ pose proof (CRabs_def _ x (CRabs R1 x)) as [_ H].
+ apply H, CRle_refl. }
+ intros. split. 2: apply H.
+ apply (CRmorph_le_inv (@SlowConstructiveRealsMorphism R2 R1)).
+ apply (CRle_trans _ (CRabs R1 x)).
+ apply (Endomorph_id
+ (CRmorph_compose f (@SlowConstructiveRealsMorphism R2 R1))).
+ apply (CRle_trans
+ _ (CRabs R1 (CRmorph (@SlowConstructiveRealsMorphism R2 R1) (CRmorph f x)))).
+ apply CRabs_morph.
+ apply CReq_sym, (Endomorph_id
+ (CRmorph_compose f (@SlowConstructiveRealsMorphism R2 R1))).
+ apply H.
+Qed.
+
+Lemma CRmorph_cv : forall {R1 R2 : ConstructiveReals}
+ (f : @ConstructiveRealsMorphism R1 R2)
+ (un : nat -> CRcarrier R1)
+ (l : CRcarrier R1),
+ CR_cv R1 un l
+ -> CR_cv R2 (fun n => CRmorph f (un n)) (CRmorph f l).
+Proof.
+ intros. intro p. specialize (H p) as [n H].
+ exists n. intros. specialize (H i H0).
+ unfold CRminus. rewrite <- CRmorph_opp, <- CRmorph_plus, CRmorph_abs.
+ rewrite <- (CRmorph_rat f (1#p)). apply CRmorph_le. exact H.
+Qed.
+
+Lemma CRmorph_cauchy_reverse : forall {R1 R2 : ConstructiveReals}
+ (f : @ConstructiveRealsMorphism R1 R2)
+ (un : nat -> CRcarrier R1),
+ CR_cauchy R2 (fun n => CRmorph f (un n))
+ -> CR_cauchy R1 un.
+Proof.
+ intros. intro p. specialize (H p) as [n H].
+ exists n. intros. specialize (H i j H0 H1).
+ unfold CRminus in H. rewrite <- CRmorph_opp, <- CRmorph_plus, CRmorph_abs in H.
+ rewrite <- (CRmorph_rat f (1#p)) in H.
+ apply (CRmorph_le_inv f) in H. exact H.
+Qed.
+
+Lemma CRmorph_min : forall {R1 R2 : ConstructiveReals}
+ (f : @ConstructiveRealsMorphism R1 R2)
+ (a b : CRcarrier R1),
+ CRmorph f (CRmin a b)
+ == CRmin (CRmorph f a) (CRmorph f b).
+Proof.
+ intros. unfold CRmin.
+ rewrite CRmorph_mult. apply CRmult_morph.
+ 2: apply CRmorph_rat.
+ unfold CRminus. do 2 rewrite CRmorph_plus. apply CRplus_morph.
+ apply CRplus_morph. reflexivity. reflexivity.
+ rewrite CRmorph_opp. apply CRopp_morph.
+ rewrite <- CRmorph_abs. apply CRabs_morph.
+ rewrite CRmorph_plus. apply CRplus_morph.
+ reflexivity.
+ rewrite CRmorph_opp. apply CRopp_morph, CRmorph_proper. reflexivity.
+Qed.
+
+Lemma CRmorph_series_cv : forall {R1 R2 : ConstructiveReals}
+ (f : @ConstructiveRealsMorphism R1 R2)
+ (un : nat -> CRcarrier R1)
+ (l : CRcarrier R1),
+ series_cv un l
+ -> series_cv (fun n => CRmorph f (un n)) (CRmorph f l).
+Proof.
+ intros.
+ apply (CR_cv_eq _ (fun n => CRmorph f (CRsum un n))).
+ intro n. apply CRmorph_sum.
+ apply CRmorph_cv, H.
+Qed.
diff --git a/theories/Reals/Abstract/ConstructiveSum.v b/theories/Reals/Abstract/ConstructiveSum.v
new file mode 100644
index 0000000000..11c8e5d8a2
--- /dev/null
+++ b/theories/Reals/Abstract/ConstructiveSum.v
@@ -0,0 +1,348 @@
+(************************************************************************)
+(* * The Coq Proof Assistant / The Coq Development Team *)
+(* v * INRIA, CNRS and contributors - Copyright 1999-2019 *)
+(* CRcarrier R) (N:nat) : CRcarrier R :=
+ match N with
+ | O => f 0%nat
+ | S i => CRsum f i + f (S i)
+ end.
+
+Fixpoint CRpow {R : ConstructiveReals} (r:CRcarrier R) (n:nat) : CRcarrier R :=
+ match n with
+ | O => 1
+ | S n => r * (CRpow r n)
+ end.
+
+Lemma CRsum_eq :
+ forall {R : ConstructiveReals} (An Bn:nat -> CRcarrier R) (N:nat),
+ (forall i:nat, (i <= N)%nat -> An i == Bn i) ->
+ CRsum An N == CRsum Bn N.
+Proof.
+ induction N.
+ - intros. exact (H O (le_refl _)).
+ - intros. simpl. apply CRplus_morph. apply IHN.
+ intros. apply H. apply (le_trans _ N _ H0), le_S, le_refl.
+ apply H, le_refl.
+Qed.
+
+Lemma sum_eq_R0 : forall {R : ConstructiveReals} (un : nat -> CRcarrier R) (n : nat),
+ (forall k:nat, un k == 0)
+ -> CRsum un n == 0.
+Proof.
+ induction n.
+ - intros. apply H.
+ - intros. simpl. rewrite IHn. rewrite H. apply CRplus_0_l. exact H.
+Qed.
+
+Definition INR {R : ConstructiveReals} (n : nat) : CRcarrier R
+ := CR_of_Q R (Z.of_nat n # 1).
+
+Lemma sum_const : forall {R : ConstructiveReals} (a : CRcarrier R) (n : nat),
+ CRsum (fun _ => a) n == a * INR (S n).
+Proof.
+ induction n.
+ - unfold INR. simpl. rewrite CR_of_Q_one, CRmult_1_r. reflexivity.
+ - simpl. rewrite IHn. unfold INR.
+ replace (Z.of_nat (S (S n))) with (Z.of_nat (S n) + 1)%Z.
+ rewrite <- Qinv_plus_distr, CR_of_Q_plus, CRmult_plus_distr_l.
+ apply CRplus_morph. reflexivity. rewrite CR_of_Q_one, CRmult_1_r. reflexivity.
+ replace 1%Z with (Z.of_nat 1). rewrite <- Nat2Z.inj_add.
+ apply f_equal. rewrite Nat.add_comm. reflexivity. reflexivity.
+Qed.
+
+Lemma multiTriangleIneg : forall {R : ConstructiveReals} (u : nat -> CRcarrier R) (n : nat),
+ CRabs R (CRsum u n) <= CRsum (fun k => CRabs R (u k)) n.
+Proof.
+ induction n.
+ - apply CRle_refl.
+ - simpl. apply (CRle_trans _ (CRabs R (CRsum u n) + CRabs R (u (S n)))).
+ apply CRabs_triang. apply CRplus_le_compat. apply IHn.
+ apply CRle_refl.
+Qed.
+
+Lemma sum_assoc : forall {R : ConstructiveReals} (u : nat -> CRcarrier R) (n p : nat),
+ CRsum u (S n + p)
+ == CRsum u n + CRsum (fun k => u (S n + k)%nat) p.
+Proof.
+ induction p.
+ - simpl. rewrite Nat.add_0_r. reflexivity.
+ - simpl. rewrite (Radd_assoc (CRisRing R)). apply CRplus_morph.
+ rewrite Nat.add_succ_r.
+ rewrite (CRsum_eq (fun k : nat => u (S (n + k))) (fun k : nat => u (S n + k)%nat)).
+ rewrite <- IHp. reflexivity. intros. reflexivity. reflexivity.
+Qed.
+
+Lemma sum_Rle : forall {R : ConstructiveReals} (un vn : nat -> CRcarrier R) (n : nat),
+ (forall k, le k n -> un k <= vn k)
+ -> CRsum un n <= CRsum vn n.
+Proof.
+ induction n.
+ - intros. apply H. apply le_refl.
+ - intros. simpl. apply CRplus_le_compat. apply IHn.
+ intros. apply H. apply (le_trans _ n _ H0). apply le_S, le_refl.
+ apply H. apply le_refl.
+Qed.
+
+Lemma Abs_sum_maj : forall {R : ConstructiveReals} (un vn : nat -> CRcarrier R),
+ (forall n:nat, CRabs R (un n) <= (vn n))
+ -> forall n p:nat, (CRabs R (CRsum un n - CRsum un p) <=
+ CRsum vn (Init.Nat.max n p) - CRsum vn (Init.Nat.min n p)).
+Proof.
+ intros. destruct (le_lt_dec n p).
+ - destruct (Nat.le_exists_sub n p) as [k [maj _]]. assumption.
+ subst p. rewrite max_r. rewrite min_l.
+ setoid_replace (CRsum un n - CRsum un (k + n))
+ with (-(CRsum un (k + n) - CRsum un n)).
+ rewrite CRabs_opp.
+ destruct k. simpl. unfold CRminus. rewrite CRplus_opp_r.
+ rewrite CRplus_opp_r. rewrite CRabs_right.
+ apply CRle_refl. apply CRle_refl.
+ replace (S k + n)%nat with (S n + k)%nat.
+ unfold CRminus. rewrite sum_assoc. rewrite sum_assoc.
+ rewrite CRplus_comm.
+ rewrite <- CRplus_assoc. rewrite CRplus_opp_l.
+ rewrite CRplus_0_l. rewrite CRplus_comm.
+ rewrite <- CRplus_assoc. rewrite CRplus_opp_l.
+ rewrite CRplus_0_l.
+ apply (CRle_trans _ (CRsum (fun k0 : nat => CRabs R (un (S n + k0)%nat)) k)).
+ apply multiTriangleIneg. apply sum_Rle. intros.
+ apply H. rewrite Nat.add_comm, Nat.add_succ_r. reflexivity.
+ unfold CRminus. rewrite CRopp_plus_distr, CRopp_involutive, CRplus_comm.
+ reflexivity. assumption. assumption.
+ - destruct (Nat.le_exists_sub p n) as [k [maj _]]. unfold lt in l.
+ apply (le_trans p (S p)). apply le_S. apply le_refl. assumption.
+ subst n. rewrite max_l. rewrite min_r.
+ destruct k. simpl. unfold CRminus. rewrite CRplus_opp_r.
+ rewrite CRplus_opp_r. rewrite CRabs_right. apply CRle_refl.
+ apply CRle_refl.
+ replace (S k + p)%nat with (S p + k)%nat. unfold CRminus.
+ rewrite sum_assoc. rewrite sum_assoc.
+ rewrite CRplus_comm.
+ rewrite <- CRplus_assoc. rewrite CRplus_opp_l.
+ rewrite CRplus_0_l. rewrite CRplus_comm.
+ rewrite <- CRplus_assoc. rewrite CRplus_opp_l.
+ rewrite CRplus_0_l.
+ apply (CRle_trans _ (CRsum (fun k0 : nat => CRabs R (un (S p + k0)%nat)) k)).
+ apply multiTriangleIneg. apply sum_Rle. intros.
+ apply H. rewrite Nat.add_comm, Nat.add_succ_r. reflexivity.
+ apply (le_trans p (S p)). apply le_S. apply le_refl. assumption.
+ apply (le_trans p (S p)). apply le_S. apply le_refl. assumption.
+Qed.
+
+Lemma cond_pos_sum : forall {R : ConstructiveReals} (un : nat -> CRcarrier R) (n : nat),
+ (forall k, 0 <= un k)
+ -> 0 <= CRsum un n.
+Proof.
+ induction n.
+ - intros. apply H.
+ - intros. simpl. rewrite <- CRplus_0_r.
+ apply CRplus_le_compat. apply IHn, H. apply H.
+Qed.
+
+Lemma pos_sum_more : forall {R : ConstructiveReals} (u : nat -> CRcarrier R)
+ (n p : nat),
+ (forall k:nat, 0 <= u k)
+ -> le n p -> CRsum u n <= CRsum u p.
+Proof.
+ intros. destruct (Nat.le_exists_sub n p H0). destruct H1. subst p.
+ rewrite plus_comm.
+ destruct x. rewrite plus_0_r. apply CRle_refl. rewrite Nat.add_succ_r.
+ replace (S (n + x)) with (S n + x)%nat. rewrite sum_assoc.
+ rewrite <- CRplus_0_r, CRplus_assoc.
+ apply CRplus_le_compat_l. rewrite CRplus_0_l.
+ apply cond_pos_sum.
+ intros. apply H. auto.
+Qed.
+
+Lemma sum_opp : forall {R : ConstructiveReals} (un : nat -> CRcarrier R) (n : nat),
+ CRsum (fun k => - un k) n == - CRsum un n.
+Proof.
+ induction n.
+ - reflexivity.
+ - simpl. rewrite IHn. rewrite CRopp_plus_distr. reflexivity.
+Qed.
+
+Lemma sum_scale : forall {R : ConstructiveReals} (u : nat -> CRcarrier R) (a : CRcarrier R) (n : nat),
+ CRsum (fun k : nat => u k * a) n == CRsum u n * a.
+Proof.
+ induction n.
+ - simpl. rewrite (Rmul_comm (CRisRing R)). reflexivity.
+ - simpl. rewrite IHn. rewrite CRmult_plus_distr_r.
+ apply CRplus_morph. reflexivity.
+ rewrite (Rmul_comm (CRisRing R)). reflexivity.
+Qed.
+
+Lemma sum_plus : forall {R : ConstructiveReals} (u v : nat -> CRcarrier R) (n : nat),
+ CRsum (fun n0 : nat => u n0 + v n0) n == CRsum u n + CRsum v n.
+Proof.
+ induction n.
+ - reflexivity.
+ - simpl. rewrite IHn. do 2 rewrite CRplus_assoc.
+ apply CRplus_morph. reflexivity. rewrite CRplus_comm, CRplus_assoc.
+ apply CRplus_morph. reflexivity. apply CRplus_comm.
+Qed.
+
+Lemma decomp_sum :
+ forall {R : ConstructiveReals} (An:nat -> CRcarrier R) (N:nat),
+ (0 < N)%nat ->
+ CRsum An N == An 0%nat + CRsum (fun i:nat => An (S i)) (pred N).
+Proof.
+ induction N.
+ - intros. exfalso. inversion H.
+ - intros _. destruct N. simpl. reflexivity. simpl.
+ rewrite IHN. rewrite CRplus_assoc.
+ apply CRplus_morph. reflexivity. reflexivity.
+ apply le_n_S, le_0_n.
+Qed.
+
+Lemma reverse_sum : forall {R : ConstructiveReals} (u : nat -> CRcarrier R) (n : nat),
+ CRsum u n == CRsum (fun k => u (n-k)%nat) n.
+Proof.
+ induction n.
+ - intros. reflexivity.
+ - rewrite (decomp_sum (fun k : nat => u (S n - k)%nat)). simpl.
+ rewrite CRplus_comm. apply CRplus_morph. reflexivity. assumption.
+ unfold lt. apply le_n_S. apply le_0_n.
+Qed.
+
+Lemma Rplus_le_pos : forall {R : ConstructiveReals} (a b : CRcarrier R),
+ 0 <= b -> a <= a + b.
+Proof.
+ intros. rewrite <- (CRplus_0_r a). rewrite CRplus_assoc.
+ apply CRplus_le_compat_l. rewrite CRplus_0_l. assumption.
+Qed.
+
+Lemma selectOneInSum : forall {R : ConstructiveReals} (u : nat -> CRcarrier R) (n i : nat),
+ le i n
+ -> (forall k:nat, 0 <= u k)
+ -> u i <= CRsum u n.
+Proof.
+ induction n.
+ - intros. inversion H. subst i. apply CRle_refl.
+ - intros. apply Nat.le_succ_r in H. destruct H.
+ apply (CRle_trans _ (CRsum u n)). apply IHn. assumption. assumption.
+ simpl. apply Rplus_le_pos. apply H0.
+ subst i. simpl. rewrite CRplus_comm. apply Rplus_le_pos.
+ apply cond_pos_sum. intros. apply H0.
+Qed.
+
+Lemma splitSum : forall {R : ConstructiveReals} (un : nat -> CRcarrier R)
+ (filter : nat -> bool) (n : nat),
+ CRsum un n
+ == CRsum (fun i => if filter i then un i else 0) n
+ + CRsum (fun i => if filter i then 0 else un i) n.
+Proof.
+ induction n.
+ - simpl. destruct (filter O). symmetry; apply CRplus_0_r.
+ symmetry. apply CRplus_0_l.
+ - simpl. rewrite IHn. clear IHn. destruct (filter (S n)).
+ do 2 rewrite CRplus_assoc. apply CRplus_morph. reflexivity.
+ rewrite CRplus_comm. apply CRplus_morph. reflexivity. rewrite CRplus_0_r.
+ reflexivity. rewrite CRplus_0_r. rewrite CRplus_assoc. reflexivity.
+Qed.
+
+
+(* Power *)
+
+Lemma pow_R1_Rle : forall {R : ConstructiveReals} (x : CRcarrier R) (n : nat),
+ 1 <= x
+ -> 1 <= CRpow x n.
+Proof.
+ induction n.
+ - intros. apply CRle_refl.
+ - intros. simpl. apply (CRle_trans _ (x * 1)).
+ rewrite CRmult_1_r. exact H.
+ apply CRmult_le_compat_l_half. apply (CRlt_le_trans _ 1).
+ apply CRzero_lt_one. exact H.
+ apply IHn. exact H.
+Qed.
+
+Lemma pow_le : forall {R : ConstructiveReals} (x : CRcarrier R) (n : nat),
+ 0 <= x
+ -> 0 <= CRpow x n.
+Proof.
+ induction n.
+ - intros. apply CRlt_asym, CRzero_lt_one.
+ - intros. simpl. apply CRmult_le_0_compat.
+ exact H. apply IHn. exact H.
+Qed.
+
+Lemma pow_lt : forall {R : ConstructiveReals} (x : CRcarrier R) (n : nat),
+ 0 < x
+ -> 0 < CRpow x n.
+Proof.
+ induction n.
+ - intros. apply CRzero_lt_one.
+ - intros. simpl. apply CRmult_lt_0_compat. exact H.
+ apply IHn. exact H.
+Qed.
+
+Lemma pow_mult : forall {R : ConstructiveReals} (x y : CRcarrier R) (n:nat),
+ CRpow x n * CRpow y n == CRpow (x*y) n.
+Proof.
+ induction n.
+ - simpl. rewrite CRmult_1_r. reflexivity.
+ - simpl. rewrite <- IHn. do 2 rewrite <- (Rmul_assoc (CRisRing R)).
+ apply CRmult_morph. reflexivity.
+ rewrite <- (Rmul_comm (CRisRing R)). rewrite <- (Rmul_assoc (CRisRing R)).
+ apply CRmult_morph. reflexivity.
+ rewrite <- (Rmul_comm (CRisRing R)). reflexivity.
+Qed.
+
+Lemma pow_one : forall {R : ConstructiveReals} (n:nat),
+ @CRpow R 1 n == 1.
+Proof.
+ induction n. reflexivity.
+ transitivity (CRmult R 1 (CRpow 1 n)). reflexivity.
+ rewrite IHn. rewrite CRmult_1_r. reflexivity.
+Qed.
+
+Lemma pow_proper : forall {R : ConstructiveReals} (x y : CRcarrier R) (n : nat),
+ x == y -> CRpow x n == CRpow y n.
+Proof.
+ induction n.
+ - intros. reflexivity.
+ - intros. simpl. rewrite IHn, H. reflexivity. exact H.
+Qed.
+
+Lemma pow_inv : forall {R : ConstructiveReals} (x : CRcarrier R) (xPos : 0 < x) (n : nat),
+ CRpow (CRinv R x (inr xPos)) n
+ == CRinv R (CRpow x n) (inr (pow_lt x n xPos)).
+Proof.
+ induction n.
+ - rewrite CRinv_1. reflexivity.
+ - transitivity (CRinv R x (inr xPos) * CRpow (CRinv R x (inr xPos)) n).
+ reflexivity. rewrite IHn.
+ assert (0 < x * CRpow x n).
+ { apply CRmult_lt_0_compat. exact xPos. apply pow_lt, xPos. }
+ rewrite <- (CRinv_mult_distr _ _ _ _ (inr H)).
+ apply CRinv_morph. reflexivity.
+Qed.
+
+Lemma pow_plus_distr : forall {R : ConstructiveReals} (x : CRcarrier R) (n p:nat),
+ CRpow x n * CRpow x p == CRpow x (n+p).
+Proof.
+ induction n.
+ - intros. simpl. rewrite CRmult_1_l. reflexivity.
+ - intros. simpl. rewrite CRmult_assoc. apply CRmult_morph.
+ reflexivity. apply IHn.
+Qed.
diff --git a/theories/Reals/Cauchy/ConstructiveCauchyAbs.v b/theories/Reals/Cauchy/ConstructiveCauchyAbs.v
new file mode 100644
index 0000000000..7e51b575ba
--- /dev/null
+++ b/theories/Reals/Cauchy/ConstructiveCauchyAbs.v
@@ -0,0 +1,887 @@
+(************************************************************************)
+(* * The Coq Proof Assistant / The Coq Development Team *)
+(* v * INRIA, CNRS and contributors - Copyright 1999-2019 *)
+(* Q
+ uniquely extends to a uniformly continuous function
+ CReal_abs : CReal -> CReal
+*)
+Lemma CauchyAbsStable : forall xn : nat -> Q,
+ QCauchySeq xn Pos.to_nat
+ -> QCauchySeq (fun n => Qabs (xn n)) Pos.to_nat.
+Proof.
+ intros xn cau n p q H H0.
+ specialize (cau n p q H H0).
+ apply (Qle_lt_trans _ (Qabs (xn p - xn q))).
+ 2: exact cau. apply Qabs_Qle_condition. split.
+ 2: apply Qabs_triangle_reverse.
+ apply (Qplus_le_r _ _ (Qabs (xn q))).
+ rewrite <- Qabs_opp.
+ apply (Qle_trans _ _ _ (Qabs_triangle_reverse _ _)).
+ ring_simplify.
+ setoid_replace (-xn q - (xn p - xn q))%Q with (-(xn p))%Q.
+ 2: ring. rewrite Qabs_opp. apply Qle_refl.
+Qed.
+
+Definition CReal_abs (x : CReal) : CReal
+ := let (xn, cau) := x in
+ exist _ (fun n => Qabs (xn n)) (CauchyAbsStable xn cau).
+
+Lemma CReal_neg_nth : forall (x : CReal) (n : positive),
+ (proj1_sig x (Pos.to_nat n) < -1#n)%Q
+ -> x < 0.
+Proof.
+ intros. destruct x as [xn cau]; unfold proj1_sig in H.
+ apply Qlt_minus_iff in H.
+ setoid_replace ((-1 # n) + - xn (Pos.to_nat n))%Q
+ with (- ((1 # n) + xn (Pos.to_nat n)))%Q in H.
+ destruct (Qarchimedean (2 / (-((1#n) + xn (Pos.to_nat n))))) as [k kmaj].
+ exists (Pos.max k n). simpl. unfold Qminus; rewrite Qplus_0_l.
+ specialize (cau n (Pos.to_nat n) (max (Pos.to_nat k) (Pos.to_nat n))
+ (le_refl _) (Nat.le_max_r _ _)).
+ apply (Qle_lt_trans _ (2#k)).
+ unfold Qle, Qnum, Qden.
+ apply Z.mul_le_mono_nonneg_l. discriminate.
+ apply Pos2Z.pos_le_pos, Pos.le_max_l.
+ rewrite <- Pos2Nat.inj_max in cau.
+ apply (Qmult_lt_l _ _ (-((1 # n) + xn (Pos.to_nat n)))) in kmaj.
+ rewrite Qmult_div_r in kmaj.
+ apply (Qmult_lt_r _ _ (1 # k)) in kmaj.
+ rewrite <- Qmult_assoc in kmaj.
+ setoid_replace ((Z.pos k # 1) * (1 # k))%Q with 1%Q in kmaj.
+ rewrite Qmult_1_r in kmaj.
+ setoid_replace (2#k)%Q with (2 * (1 # k))%Q. 2: reflexivity.
+ apply (Qlt_trans _ _ _ kmaj). clear kmaj.
+ apply (Qplus_lt_l _ _ ((1#n) + xn (Pos.to_nat (Pos.max k n)))).
+ ring_simplify. rewrite Qplus_comm.
+ apply (Qle_lt_trans _ (Qabs (xn (Pos.to_nat n) - xn (Pos.to_nat (Pos.max k n))))).
+ 2: exact cau.
+ rewrite <- Qabs_opp.
+ setoid_replace (- (xn (Pos.to_nat n) - xn (Pos.to_nat (Pos.max k n))))%Q
+ with (xn (Pos.to_nat (Pos.max k n)) + -1 * xn (Pos.to_nat n))%Q.
+ apply Qle_Qabs. ring. 2: reflexivity.
+ unfold Qmult, Qeq, Qnum, Qden.
+ rewrite Z.mul_1_r, Z.mul_1_r, Z.mul_1_l. reflexivity.
+ 2: exact H. intro abs. rewrite abs in H. exact (Qlt_irrefl 0 H).
+ setoid_replace (-1 # n)%Q with (-(1#n))%Q. ring. reflexivity.
+Qed.
+
+Lemma CReal_nonneg : forall (x : CReal) (n : positive),
+ 0 <= x -> (-1#n <= proj1_sig x (Pos.to_nat n))%Q.
+Proof.
+ intros. destruct x as [xn cau]; unfold proj1_sig.
+ destruct (Qlt_le_dec (xn (Pos.to_nat n)) (-1#n)).
+ 2: exact q. exfalso. apply H. clear H.
+ apply (CReal_neg_nth _ n). exact q.
+Qed.
+
+Lemma CReal_abs_right : forall x : CReal, 0 <= x -> CReal_abs x == x.
+Proof.
+ intros. apply CRealEq_diff. intro n.
+ destruct x as [xn cau]; unfold CReal_abs, proj1_sig.
+ apply (CReal_nonneg _ n) in H. simpl in H.
+ rewrite Qabs_pos.
+ 2: unfold Qminus; rewrite <- Qle_minus_iff; apply Qle_Qabs.
+ destruct (Qlt_le_dec (xn (Pos.to_nat n)) 0).
+ - rewrite Qabs_neg. 2: apply Qlt_le_weak, q.
+ apply Qopp_le_compat in H.
+ apply (Qmult_le_l _ _ (1#2)). reflexivity. ring_simplify.
+ setoid_replace ((1 # 2) * (2 # n))%Q with (-(-1#n))%Q.
+ 2: reflexivity.
+ setoid_replace ((-2 # 2) * xn (Pos.to_nat n))%Q with (- xn (Pos.to_nat n))%Q.
+ exact H. ring.
+ - rewrite Qabs_pos. unfold Qminus. rewrite Qplus_opp_r. discriminate. exact q.
+Qed.
+
+Lemma CReal_le_abs : forall x : CReal, x <= CReal_abs x.
+Proof.
+ intros. intros [n nmaj]. destruct x as [xn cau]; simpl in nmaj.
+ apply (Qle_not_lt _ _ (Qle_Qabs (xn (Pos.to_nat n)))).
+ apply Qlt_minus_iff. apply (Qlt_trans _ (2#n)).
+ reflexivity. exact nmaj.
+Qed.
+
+Lemma CReal_abs_pos : forall x : CReal, 0 <= CReal_abs x.
+Proof.
+ intros. intros [n nmaj]. destruct x as [xn cau]; simpl in nmaj.
+ apply (Qle_not_lt _ _ (Qabs_nonneg (xn (Pos.to_nat n)))).
+ apply Qlt_minus_iff. apply (Qlt_trans _ (2#n)).
+ reflexivity. exact nmaj.
+Qed.
+
+Lemma CReal_abs_opp : forall x : CReal, CReal_abs (-x) == CReal_abs x.
+Proof.
+ intros. apply CRealEq_diff. intro n.
+ destruct x as [xn cau]; unfold CReal_abs, CReal_opp, proj1_sig.
+ rewrite Qabs_opp. unfold Qminus. rewrite Qplus_opp_r.
+ discriminate.
+Qed.
+
+Lemma CReal_abs_left : forall x : CReal, x <= 0 -> CReal_abs x == -x.
+Proof.
+ intros.
+ apply CReal_opp_ge_le_contravar in H. rewrite CReal_opp_0 in H.
+ rewrite <- CReal_abs_opp. apply CReal_abs_right, H.
+Qed.
+
+Lemma CReal_abs_appart_0 : forall x : CReal,
+ 0 < CReal_abs x -> x # 0.
+Proof.
+ intros x [n nmaj]. destruct x as [xn cau]; simpl in nmaj.
+ destruct (Qlt_le_dec (xn (Pos.to_nat n)) 0).
+ - left. exists n. simpl. rewrite Qabs_neg in nmaj.
+ apply (Qlt_le_trans _ _ _ nmaj). ring_simplify. apply Qle_refl.
+ apply Qlt_le_weak, q.
+ - right. exists n. simpl. rewrite Qabs_pos in nmaj.
+ exact nmaj. exact q.
+Qed.
+
+Add Parametric Morphism : CReal_abs
+ with signature CRealEq ==> CRealEq
+ as CReal_abs_morph.
+Proof.
+ intros. split.
+ - intro abs. destruct (CReal_abs_appart_0 y).
+ apply (CReal_le_lt_trans _ (CReal_abs x)).
+ apply CReal_abs_pos. apply abs.
+ rewrite CReal_abs_left, CReal_abs_left, H in abs.
+ exact (CRealLt_asym _ _ abs abs). apply CRealLt_asym, c.
+ rewrite H. apply CRealLt_asym, c.
+ rewrite CReal_abs_right, CReal_abs_right, H in abs.
+ exact (CRealLt_asym _ _ abs abs). apply CRealLt_asym, c.
+ rewrite H. apply CRealLt_asym, c.
+ - intro abs. destruct (CReal_abs_appart_0 x).
+ apply (CReal_le_lt_trans _ (CReal_abs y)).
+ apply CReal_abs_pos. apply abs.
+ rewrite CReal_abs_left, CReal_abs_left, H in abs.
+ exact (CRealLt_asym _ _ abs abs). apply CRealLt_asym, c.
+ rewrite <- H. apply CRealLt_asym, c.
+ rewrite CReal_abs_right, CReal_abs_right, H in abs.
+ exact (CRealLt_asym _ _ abs abs). apply CRealLt_asym, c.
+ rewrite <- H. apply CRealLt_asym, c.
+Qed.
+
+Lemma CReal_abs_le : forall a b:CReal, -b <= a <= b -> CReal_abs a <= b.
+Proof.
+ intros a b H [n nmaj]. destruct a as [an cau]; simpl in nmaj.
+ destruct (Qlt_le_dec (an (Pos.to_nat n)) 0).
+ - rewrite Qabs_neg in nmaj. destruct H. apply H. clear H H0.
+ exists n. simpl.
+ destruct b as [bn caub]; simpl; simpl in nmaj.
+ unfold Qminus. rewrite Qplus_comm. exact nmaj.
+ apply Qlt_le_weak, q.
+ - rewrite Qabs_pos in nmaj. destruct H. apply H0. clear H H0.
+ exists n. simpl. exact nmaj. exact q.
+Qed.
+
+Lemma CReal_abs_minus_sym : forall x y : CReal,
+ CReal_abs (x - y) == CReal_abs (y - x).
+Proof.
+ intros x y. setoid_replace (x - y) with (-(y-x)).
+ rewrite CReal_abs_opp. reflexivity. ring.
+Qed.
+
+Lemma CReal_abs_lt : forall x y : CReal,
+ CReal_abs x < y -> prod (x < y) (-x < y).
+Proof.
+ split.
+ - apply (CReal_le_lt_trans _ _ _ (CReal_le_abs x)), H.
+ - apply (CReal_le_lt_trans _ _ _ (CReal_le_abs (-x))).
+ rewrite CReal_abs_opp. exact H.
+Qed.
+
+Lemma CReal_abs_triang : forall x y : CReal,
+ CReal_abs (x + y) <= CReal_abs x + CReal_abs y.
+Proof.
+ intros. apply CReal_abs_le. split.
+ - setoid_replace (x + y) with (-(-x - y)). 2: ring.
+ apply CReal_opp_ge_le_contravar.
+ apply CReal_plus_le_compat; rewrite <- CReal_abs_opp; apply CReal_le_abs.
+ - apply CReal_plus_le_compat; apply CReal_le_abs.
+Qed.
+
+Lemma CReal_abs_triang_inv : forall x y : CReal,
+ CReal_abs x - CReal_abs y <= CReal_abs (x - y).
+Proof.
+ intros. apply (CReal_plus_le_reg_l (CReal_abs y)).
+ ring_simplify. rewrite CReal_plus_comm.
+ apply (CReal_le_trans _ (CReal_abs (x - y + y))).
+ setoid_replace (x - y + y) with x. apply CRealLe_refl. ring.
+ apply CReal_abs_triang.
+Qed.
+
+Lemma CReal_abs_triang_inv2 : forall x y : CReal,
+ CReal_abs (CReal_abs x - CReal_abs y) <= CReal_abs (x - y).
+Proof.
+ intros. apply CReal_abs_le. split.
+ 2: apply CReal_abs_triang_inv.
+ apply (CReal_plus_le_reg_r (CReal_abs y)). ring_simplify.
+ rewrite CReal_plus_comm, CReal_abs_minus_sym.
+ apply (CReal_le_trans _ _ _ (CReal_abs_triang_inv y (y-x))).
+ setoid_replace (y - (y - x)) with x. 2: ring. apply CRealLe_refl.
+Qed.
+
+Lemma CReal_abs_gt : forall x : CReal,
+ x < CReal_abs x -> x < 0.
+Proof.
+ intros x [n nmaj]. destruct x as [xn cau]; simpl in nmaj.
+ assert (xn (Pos.to_nat n) < 0)%Q.
+ { destruct (Qlt_le_dec (xn (Pos.to_nat n)) 0). exact q.
+ exfalso. rewrite Qabs_pos in nmaj. unfold Qminus in nmaj.
+ rewrite Qplus_opp_r in nmaj. inversion nmaj. exact q. }
+ rewrite Qabs_neg in nmaj. 2: apply Qlt_le_weak, H.
+ apply (CReal_neg_nth _ n). simpl.
+ ring_simplify in nmaj.
+ apply (Qplus_lt_l _ _ ((1#n) - xn (Pos.to_nat n))).
+ apply (Qmult_lt_l _ _ 2). reflexivity. ring_simplify.
+ setoid_replace (2 * (1 # n))%Q with (2 # n)%Q. 2: reflexivity.
+ rewrite <- Qplus_assoc.
+ setoid_replace ((2 # n) + 2 * (-1 # n))%Q with 0%Q.
+ rewrite Qplus_0_r. exact nmaj.
+ setoid_replace (2*(-1 # n))%Q with (-(2 # n))%Q.
+ rewrite Qplus_opp_r. reflexivity. reflexivity.
+Qed.
+
+Lemma Rabs_def1 : forall x y : CReal,
+ x < y -> -x < y -> CReal_abs x < y.
+Proof.
+ intros. apply CRealLt_above in H. apply CRealLt_above in H0.
+ destruct H as [i imaj]. destruct H0 as [j jmaj].
+ exists (Pos.max i j). destruct x as [xn caux], y as [yn cauy]; simpl.
+ simpl in imaj, jmaj.
+ destruct (Qlt_le_dec (xn (Pos.to_nat (Pos.max i j))) 0).
+ - rewrite Qabs_neg.
+ specialize (jmaj (Pos.max i j) (Pos.le_max_r _ _)).
+ apply (Qle_lt_trans _ (2#j)). 2: exact jmaj.
+ unfold Qle, Qnum, Qden.
+ apply Z.mul_le_mono_nonneg_l. discriminate.
+ apply Pos2Z.pos_le_pos, Pos.le_max_r.
+ apply Qlt_le_weak, q.
+ - rewrite Qabs_pos.
+ specialize (imaj (Pos.max i j) (Pos.le_max_l _ _)).
+ apply (Qle_lt_trans _ (2#i)). 2: exact imaj.
+ unfold Qle, Qnum, Qden.
+ apply Z.mul_le_mono_nonneg_l. discriminate.
+ apply Pos2Z.pos_le_pos, Pos.le_max_l.
+ apply q.
+Qed.
+
+(* The proof by cases on the signs of x and y applies constructively,
+ because of the positivity hypotheses. *)
+Lemma CReal_abs_mult : forall x y : CReal,
+ CReal_abs (x * y) == CReal_abs x * CReal_abs y.
+Proof.
+ assert (forall x y : CReal,
+ x # 0
+ -> y # 0
+ -> CReal_abs (x * y) == CReal_abs x * CReal_abs y) as prep.
+ { intros. destruct H, H0.
+ + rewrite CReal_abs_right, CReal_abs_left, CReal_abs_left. ring.
+ apply CRealLt_asym, c0. apply CRealLt_asym, c.
+ setoid_replace (x*y) with (- x * - y).
+ apply CRealLt_asym, CReal_mult_lt_0_compat.
+ rewrite <- CReal_opp_0. apply CReal_opp_gt_lt_contravar, c.
+ rewrite <- CReal_opp_0. apply CReal_opp_gt_lt_contravar, c0. ring.
+ + rewrite CReal_abs_left, CReal_abs_left, CReal_abs_right. ring.
+ apply CRealLt_asym, c0. apply CRealLt_asym, c.
+ rewrite <- (CReal_mult_0_l y).
+ apply CReal_mult_le_compat_r.
+ apply CRealLt_asym, c0. apply CRealLt_asym, c.
+ + rewrite CReal_abs_left, CReal_abs_right, CReal_abs_left. ring.
+ apply CRealLt_asym, c0. apply CRealLt_asym, c.
+ rewrite <- (CReal_mult_0_r x).
+ apply CReal_mult_le_compat_l.
+ apply CRealLt_asym, c. apply CRealLt_asym, c0.
+ + rewrite CReal_abs_right, CReal_abs_right, CReal_abs_right. ring.
+ apply CRealLt_asym, c0. apply CRealLt_asym, c.
+ apply CRealLt_asym, CReal_mult_lt_0_compat; assumption. }
+ split.
+ - intro abs.
+ assert (0 < CReal_abs x * CReal_abs y).
+ { apply (CReal_le_lt_trans _ (CReal_abs (x*y))).
+ apply CReal_abs_pos. exact abs. }
+ pose proof (CReal_mult_pos_appart_zero _ _ H).
+ rewrite CReal_mult_comm in H.
+ apply CReal_mult_pos_appart_zero in H.
+ destruct H. 2: apply (CReal_abs_pos y c).
+ destruct H0. 2: apply (CReal_abs_pos x c0).
+ apply CReal_abs_appart_0 in c.
+ apply CReal_abs_appart_0 in c0.
+ rewrite (prep x y) in abs.
+ exact (CRealLt_asym _ _ abs abs). exact c0. exact c.
+ - intro abs.
+ assert (0 < CReal_abs (x * y)).
+ { apply (CReal_le_lt_trans _ (CReal_abs x * CReal_abs y)).
+ rewrite <- (CReal_mult_0_l (CReal_abs y)).
+ apply CReal_mult_le_compat_r.
+ apply CReal_abs_pos. apply CReal_abs_pos. exact abs. }
+ apply CReal_abs_appart_0 in H. destruct H.
+ + apply CReal_opp_gt_lt_contravar in c.
+ rewrite CReal_opp_0, CReal_opp_mult_distr_l in c.
+ pose proof (CReal_mult_pos_appart_zero _ _ c).
+ rewrite CReal_mult_comm in c.
+ apply CReal_mult_pos_appart_zero in c.
+ rewrite (prep x y) in abs.
+ exact (CRealLt_asym _ _ abs abs).
+ destruct H. left. apply CReal_opp_gt_lt_contravar in c0.
+ rewrite CReal_opp_involutive, CReal_opp_0 in c0. exact c0.
+ right. apply CReal_opp_gt_lt_contravar in c0.
+ rewrite CReal_opp_involutive, CReal_opp_0 in c0. exact c0.
+ destruct c. right. exact c. left. exact c.
+ + pose proof (CReal_mult_pos_appart_zero _ _ c).
+ rewrite CReal_mult_comm in c.
+ apply CReal_mult_pos_appart_zero in c.
+ rewrite (prep x y) in abs.
+ exact (CRealLt_asym _ _ abs abs).
+ destruct H. right. exact c0. left. exact c0.
+ destruct c. right. exact c. left. exact c.
+Qed.
+
+Lemma CReal_abs_def2 : forall x a:CReal,
+ CReal_abs x <= a -> (x <= a) /\ (- a <= x).
+Proof.
+ split.
+ - exact (CReal_le_trans _ _ _ (CReal_le_abs _) H).
+ - rewrite <- (CReal_opp_involutive x).
+ apply CReal_opp_ge_le_contravar.
+ rewrite <- CReal_abs_opp in H.
+ exact (CReal_le_trans _ _ _ (CReal_le_abs _) H).
+Qed.
+
+
+(* Min and max *)
+
+Definition CReal_min (x y : CReal) : CReal
+ := (x + y - CReal_abs (y - x)) * inject_Q (1#2).
+
+Definition CReal_max (x y : CReal) : CReal
+ := (x + y + CReal_abs (y - x)) * inject_Q (1#2).
+
+Add Parametric Morphism : CReal_min
+ with signature CRealEq ==> CRealEq ==> CRealEq
+ as CReal_min_morph.
+Proof.
+ intros. unfold CReal_min.
+ rewrite H, H0. reflexivity.
+Qed.
+
+Add Parametric Morphism : CReal_max
+ with signature CRealEq ==> CRealEq ==> CRealEq
+ as CReal_max_morph.
+Proof.
+ intros. unfold CReal_max.
+ rewrite H, H0. reflexivity.
+Qed.
+
+Lemma CReal_double : forall x:CReal, 2 * x == x + x.
+Proof.
+ intro x. rewrite (inject_Q_plus 1 1). ring.
+Qed.
+
+Lemma CReal_max_lub : forall x y z:CReal,
+ x <= z -> y <= z -> CReal_max x y <= z.
+Proof.
+ intros. unfold CReal_max.
+ apply (CReal_mult_le_reg_r 2). apply inject_Q_lt; reflexivity.
+ rewrite CReal_mult_assoc, <- inject_Q_mult.
+ setoid_replace ((1 # 2) * 2)%Q with 1%Q. 2: reflexivity.
+ rewrite CReal_mult_1_r.
+ apply (CReal_plus_le_reg_l (-x-y)). ring_simplify.
+ apply CReal_abs_le. split.
+ - unfold CReal_minus. repeat rewrite CReal_opp_plus_distr.
+ do 2 rewrite CReal_opp_involutive.
+ rewrite (CReal_plus_comm x), CReal_plus_assoc. apply CReal_plus_le_compat_l.
+ apply (CReal_plus_le_reg_l (-x)).
+ rewrite <- CReal_plus_assoc, CReal_plus_opp_l, CReal_plus_0_l.
+ rewrite CReal_mult_comm, CReal_double. rewrite CReal_opp_plus_distr.
+ apply CReal_plus_le_compat; apply CReal_opp_ge_le_contravar; assumption.
+ - unfold CReal_minus.
+ rewrite (CReal_plus_comm y), CReal_plus_assoc. apply CReal_plus_le_compat_l.
+ apply (CReal_plus_le_reg_l y).
+ rewrite <- CReal_plus_assoc, CReal_plus_opp_r, CReal_plus_0_l.
+ rewrite CReal_mult_comm, CReal_double.
+ apply CReal_plus_le_compat; assumption.
+Qed.
+
+Lemma CReal_min_glb : forall x y z:CReal,
+ z <= x -> z <= y -> z <= CReal_min x y.
+Proof.
+ intros. unfold CReal_min.
+ apply (CReal_mult_le_reg_r 2). apply inject_Q_lt; reflexivity.
+ rewrite CReal_mult_assoc, <- inject_Q_mult.
+ setoid_replace ((1 # 2) * 2)%Q with 1%Q. 2: reflexivity.
+ rewrite CReal_mult_1_r.
+ apply (CReal_plus_le_reg_l (CReal_abs(y-x) - (z*2))). ring_simplify.
+ apply CReal_abs_le. split.
+ - unfold CReal_minus. repeat rewrite CReal_opp_plus_distr.
+ rewrite CReal_opp_mult_distr_l, CReal_opp_involutive.
+ rewrite (CReal_plus_comm (z*2)), (CReal_plus_comm y), CReal_plus_assoc.
+ apply CReal_plus_le_compat_l, (CReal_plus_le_reg_r y).
+ rewrite CReal_plus_assoc, CReal_plus_opp_l, CReal_plus_0_r.
+ rewrite CReal_mult_comm, CReal_double.
+ apply CReal_plus_le_compat; assumption.
+ - unfold CReal_minus.
+ rewrite (CReal_plus_comm y). apply CReal_plus_le_compat.
+ 2: apply CRealLe_refl.
+ apply (CReal_plus_le_reg_r (-x)).
+ rewrite CReal_plus_assoc, CReal_plus_opp_r, CReal_plus_0_r.
+ rewrite CReal_mult_comm, CReal_double.
+ apply CReal_plus_le_compat; apply CReal_opp_ge_le_contravar; assumption.
+Qed.
+
+Lemma CReal_max_l : forall x y : CReal, x <= CReal_max x y.
+Proof.
+ intros. unfold CReal_max.
+ apply (CReal_mult_le_reg_r 2). apply inject_Q_lt; reflexivity.
+ rewrite CReal_mult_assoc, <- inject_Q_mult.
+ setoid_replace ((1 # 2) * 2)%Q with 1%Q. 2: reflexivity.
+ rewrite CReal_mult_1_r.
+ rewrite CReal_mult_comm, CReal_double.
+ rewrite CReal_plus_assoc. apply CReal_plus_le_compat_l.
+ apply (CReal_plus_le_reg_l (-y)).
+ rewrite <- CReal_plus_assoc, CReal_plus_opp_l, CReal_plus_0_l.
+ rewrite CReal_abs_minus_sym, CReal_plus_comm.
+ apply CReal_le_abs.
+Qed.
+
+Lemma CReal_max_r : forall x y : CReal, y <= CReal_max x y.
+Proof.
+ intros. unfold CReal_max.
+ apply (CReal_mult_le_reg_r 2). apply inject_Q_lt; reflexivity.
+ rewrite CReal_mult_assoc, <- inject_Q_mult.
+ setoid_replace ((1 # 2) * 2)%Q with 1%Q. 2: reflexivity.
+ rewrite CReal_mult_1_r.
+ rewrite CReal_mult_comm, CReal_double.
+ rewrite (CReal_plus_comm x).
+ rewrite CReal_plus_assoc. apply CReal_plus_le_compat_l.
+ apply (CReal_plus_le_reg_l (-x)).
+ rewrite <- CReal_plus_assoc, CReal_plus_opp_l, CReal_plus_0_l.
+ rewrite CReal_plus_comm. apply CReal_le_abs.
+Qed.
+
+Lemma CReal_min_l : forall x y : CReal, CReal_min x y <= x.
+Proof.
+ intros. unfold CReal_min.
+ apply (CReal_mult_le_reg_r 2). apply inject_Q_lt; reflexivity.
+ rewrite CReal_mult_assoc, <- inject_Q_mult.
+ setoid_replace ((1 # 2) * 2)%Q with 1%Q. 2: reflexivity.
+ rewrite CReal_mult_1_r.
+ rewrite CReal_mult_comm, CReal_double.
+ unfold CReal_minus.
+ rewrite CReal_plus_assoc. apply CReal_plus_le_compat_l.
+ apply (CReal_plus_le_reg_l (CReal_abs (y + - x)+ -x)). ring_simplify.
+ rewrite CReal_plus_comm. apply CReal_le_abs.
+Qed.
+
+Lemma CReal_min_r : forall x y : CReal, CReal_min x y <= y.
+Proof.
+ intros. unfold CReal_min.
+ apply (CReal_mult_le_reg_r 2). apply inject_Q_lt; reflexivity.
+ rewrite CReal_mult_assoc, <- inject_Q_mult.
+ setoid_replace ((1 # 2) * 2)%Q with 1%Q. 2: reflexivity.
+ rewrite CReal_mult_1_r.
+ rewrite CReal_mult_comm, CReal_double.
+ unfold CReal_minus. rewrite (CReal_plus_comm x).
+ rewrite CReal_plus_assoc. apply CReal_plus_le_compat_l.
+ apply (CReal_plus_le_reg_l (CReal_abs (y + - x)+ -y)). ring_simplify.
+ fold (y-x). rewrite CReal_abs_minus_sym.
+ rewrite CReal_plus_comm. apply CReal_le_abs.
+Qed.
+
+Lemma CReal_min_left : forall x y : CReal,
+ x <= y -> CReal_min x y == x.
+Proof.
+ intros. unfold CReal_min.
+ apply (CReal_mult_eq_reg_r 2). 2: right; apply inject_Q_lt; reflexivity.
+ rewrite CReal_mult_assoc, <- inject_Q_mult.
+ setoid_replace ((1 # 2) * 2)%Q with 1%Q. 2: reflexivity.
+ rewrite CReal_mult_1_r.
+ rewrite CReal_mult_comm, CReal_double.
+ rewrite CReal_abs_right. ring.
+ rewrite <- (CReal_plus_opp_r x). apply CReal_plus_le_compat.
+ exact H. apply CRealLe_refl.
+Qed.
+
+Lemma CReal_min_right : forall x y : CReal,
+ y <= x -> CReal_min x y == y.
+Proof.
+ intros. unfold CReal_min.
+ apply (CReal_mult_eq_reg_r 2). 2: right; apply inject_Q_lt; reflexivity.
+ rewrite CReal_mult_assoc, <- inject_Q_mult.
+ setoid_replace ((1 # 2) * 2)%Q with 1%Q. 2: reflexivity.
+ rewrite CReal_mult_1_r.
+ rewrite CReal_mult_comm, CReal_double.
+ rewrite CReal_abs_left. ring.
+ rewrite <- (CReal_plus_opp_r x). apply CReal_plus_le_compat.
+ exact H. apply CRealLe_refl.
+Qed.
+
+Lemma CReal_max_left : forall x y : CReal,
+ y <= x -> CReal_max x y == x.
+Proof.
+ intros. unfold CReal_max.
+ apply (CReal_mult_eq_reg_r 2). 2: right; apply inject_Q_lt; reflexivity.
+ rewrite CReal_mult_assoc, <- inject_Q_mult.
+ setoid_replace ((1 # 2) * 2)%Q with 1%Q. 2: reflexivity.
+ rewrite CReal_mult_1_r.
+ rewrite CReal_mult_comm, CReal_double.
+ rewrite CReal_abs_left. ring.
+ rewrite <- (CReal_plus_opp_r x). apply CReal_plus_le_compat.
+ exact H. apply CRealLe_refl.
+Qed.
+
+Lemma CReal_max_right : forall x y : CReal,
+ x <= y -> CReal_max x y == y.
+Proof.
+ intros. unfold CReal_max.
+ apply (CReal_mult_eq_reg_r 2). 2: right; apply inject_Q_lt; reflexivity.
+ rewrite CReal_mult_assoc, <- inject_Q_mult.
+ setoid_replace ((1 # 2) * 2)%Q with 1%Q. 2: reflexivity.
+ rewrite CReal_mult_1_r.
+ rewrite CReal_mult_comm, CReal_double.
+ rewrite CReal_abs_right. ring.
+ rewrite <- (CReal_plus_opp_r x). apply CReal_plus_le_compat.
+ exact H. apply CRealLe_refl.
+Qed.
+
+Lemma CReal_min_lt_r : forall x y : CReal,
+ CReal_min x y < y -> CReal_min x y == x.
+Proof.
+ intros. unfold CReal_min. unfold CReal_min in H.
+ apply (CReal_mult_eq_reg_r 2). 2: right; apply inject_Q_lt; reflexivity.
+ rewrite CReal_mult_assoc, <- inject_Q_mult.
+ setoid_replace ((1 # 2) * 2)%Q with 1%Q. 2: reflexivity.
+ rewrite CReal_mult_1_r.
+ rewrite CReal_mult_comm, CReal_double.
+ rewrite CReal_abs_right. ring.
+ apply (CReal_mult_lt_compat_r 2) in H. 2: apply inject_Q_lt; reflexivity.
+ rewrite CReal_mult_assoc, <- inject_Q_mult in H.
+ setoid_replace ((1 # 2) * 2)%Q with 1%Q in H. 2: reflexivity.
+ rewrite CReal_mult_1_r in H.
+ rewrite CReal_mult_comm, CReal_double in H.
+ intro abs. rewrite CReal_abs_left in H.
+ unfold CReal_minus in H.
+ rewrite CReal_opp_involutive, CReal_plus_comm in H.
+ rewrite CReal_plus_assoc, <- (CReal_plus_assoc (-x)), CReal_plus_opp_l in H.
+ rewrite CReal_plus_0_l in H. exact (CRealLt_asym _ _ H H).
+ apply CRealLt_asym, abs.
+Qed.
+
+Lemma posPartAbsMax : forall x : CReal,
+ CReal_max 0 x == (x + CReal_abs x) * (inject_Q (1#2)).
+Proof.
+ split.
+ - intro abs. apply (CReal_mult_lt_compat_r 2) in abs.
+ 2: apply (inject_Q_lt 0 2); reflexivity.
+ rewrite CReal_mult_assoc, <- (inject_Q_mult) in abs.
+ setoid_replace ((1 # 2) * 2)%Q with 1%Q in abs. 2: reflexivity.
+ rewrite CReal_mult_1_r in abs.
+ apply (CReal_plus_lt_compat_l (-x)) in abs.
+ rewrite <- CReal_plus_assoc, CReal_plus_opp_l, CReal_plus_0_l in abs.
+ apply CReal_abs_le in abs. exact abs. split.
+ + rewrite CReal_opp_plus_distr, CReal_opp_involutive.
+ apply (CReal_le_trans _ (x + 0)). 2: rewrite CReal_plus_0_r; apply CRealLe_refl.
+ apply CReal_plus_le_compat_l. apply (CReal_le_trans _ (2 * 0)).
+ rewrite CReal_opp_mult_distr_l, <- (CReal_mult_comm 2). apply CReal_mult_le_compat_l_half.
+ apply inject_Q_lt. reflexivity.
+ apply (CReal_plus_le_reg_l (CReal_max 0 x)). rewrite CReal_plus_opp_r, CReal_plus_0_r.
+ apply CReal_max_l. rewrite CReal_mult_0_r. apply CRealLe_refl.
+ + apply (CReal_plus_le_reg_l x).
+ rewrite <- CReal_plus_assoc, CReal_plus_opp_r, CReal_plus_0_l.
+ rewrite (inject_Q_plus 1 1), CReal_mult_plus_distr_l, CReal_mult_1_r.
+ apply CReal_plus_le_compat; apply CReal_max_r.
+ - apply CReal_max_lub. rewrite <- (CReal_mult_0_l (inject_Q (1#2))).
+ do 2 rewrite <- (CReal_mult_comm (inject_Q (1#2))).
+ apply CReal_mult_le_compat_l_half.
+ apply inject_Q_lt; reflexivity.
+ rewrite <- (CReal_plus_opp_r x). apply CReal_plus_le_compat_l.
+ rewrite <- CReal_abs_opp. apply CReal_le_abs.
+ intros abs.
+ apply (CReal_mult_lt_compat_r 2) in abs. 2: apply inject_Q_lt; reflexivity.
+ rewrite CReal_mult_assoc, <- inject_Q_mult in abs.
+ setoid_replace ((1 # 2) * 2)%Q with 1%Q in abs. 2: reflexivity.
+ rewrite CReal_mult_1_r, (inject_Q_plus 1 1), CReal_mult_plus_distr_l, CReal_mult_1_r in abs.
+ apply CReal_plus_lt_reg_l in abs.
+ exact (CReal_le_abs x abs).
+Qed.
+
+Lemma negPartAbsMin : forall x : CReal,
+ CReal_min 0 x == (x - CReal_abs x) * (inject_Q (1#2)).
+Proof.
+ split.
+ - intro abs. apply (CReal_mult_lt_compat_r 2) in abs.
+ 2: apply (inject_Q_lt 0 2); reflexivity.
+ rewrite CReal_mult_assoc, <- (inject_Q_mult) in abs.
+ setoid_replace ((1 # 2) * 2)%Q with 1%Q in abs. 2: reflexivity.
+ rewrite CReal_mult_1_r in abs.
+ apply (CReal_plus_lt_compat_r (CReal_abs x)) in abs.
+ unfold CReal_minus in abs.
+ rewrite CReal_plus_assoc, CReal_plus_opp_l, CReal_plus_0_r in abs.
+ apply (CReal_plus_lt_compat_l (-(CReal_min 0 x * 2))) in abs.
+ rewrite <- CReal_plus_assoc, CReal_plus_opp_l, CReal_plus_0_l in abs.
+ apply CReal_abs_lt in abs. destruct abs.
+ apply (CReal_plus_lt_compat_l (CReal_min 0 x * 2)) in c0.
+ rewrite <- CReal_plus_assoc, CReal_plus_opp_r, CReal_plus_0_l in c0.
+ apply (CReal_plus_lt_compat_r x) in c0.
+ rewrite CReal_plus_assoc, CReal_plus_opp_l, CReal_plus_0_r in c0.
+ rewrite <- CReal_double, CReal_mult_comm in c0. apply CReal_mult_lt_reg_l in c0.
+ apply CReal_min_lt_r in c0.
+ rewrite c0, CReal_mult_0_l, CReal_opp_0, CReal_plus_0_l in c.
+ exact (CRealLt_asym _ _ c c). apply inject_Q_lt; reflexivity.
+ - intro abs.
+ assert ((x - CReal_abs x) * inject_Q (1 # 2) < 0 * inject_Q (1 # 2)).
+ { rewrite CReal_mult_0_l.
+ apply (CReal_lt_le_trans _ _ _ abs). apply CReal_min_l. }
+ apply CReal_mult_lt_reg_r in H.
+ 2: apply inject_Q_lt; reflexivity.
+ rewrite <- (CReal_plus_opp_r (CReal_abs x)) in H.
+ apply CReal_plus_lt_reg_r, CReal_abs_gt in H.
+ rewrite CReal_min_right, <- CReal_abs_opp, CReal_abs_right in abs.
+ unfold CReal_minus in abs.
+ rewrite CReal_opp_involutive, <- CReal_double, CReal_mult_comm in abs.
+ rewrite <- CReal_mult_assoc, <- inject_Q_mult in abs.
+ setoid_replace ((1 # 2) * 2)%Q with 1%Q in abs.
+ rewrite CReal_mult_1_l in abs. exact (CRealLt_asym _ _ abs abs).
+ reflexivity. rewrite <- CReal_opp_0.
+ apply CReal_opp_ge_le_contravar, CRealLt_asym, H.
+ apply CRealLt_asym, H.
+Qed.
+
+Lemma CReal_min_sym : forall (x y : CReal),
+ CReal_min x y == CReal_min y x.
+Proof.
+ intros. unfold CReal_min.
+ rewrite CReal_abs_minus_sym. ring.
+Qed.
+
+Lemma CReal_max_sym : forall (x y : CReal),
+ CReal_max x y == CReal_max y x.
+Proof.
+ intros. unfold CReal_max.
+ rewrite CReal_abs_minus_sym. ring.
+Qed.
+
+Lemma CReal_min_mult :
+ forall (p q r:CReal), 0 <= r -> CReal_min (r * p) (r * q) == r * CReal_min p q.
+Proof.
+ intros p q r H. unfold CReal_min.
+ setoid_replace (r * q - r * p) with (r * (q - p)).
+ 2: ring. rewrite CReal_abs_mult.
+ rewrite (CReal_abs_right r). ring. exact H.
+Qed.
+
+Lemma CReal_min_plus : forall (x y z : CReal),
+ x + CReal_min y z == CReal_min (x + y) (x + z).
+Proof.
+ intros. unfold CReal_min.
+ setoid_replace (x + z - (x + y)) with (z-y).
+ 2: ring.
+ apply (CReal_mult_eq_reg_r 2). 2: right; apply inject_Q_lt; reflexivity.
+ rewrite CReal_mult_plus_distr_r.
+ rewrite CReal_mult_assoc, <- inject_Q_mult.
+ setoid_replace ((1 # 2) * 2)%Q with 1%Q. 2: reflexivity.
+ rewrite CReal_mult_1_r.
+ rewrite CReal_mult_assoc, <- inject_Q_mult.
+ setoid_replace ((1 # 2) * 2)%Q with 1%Q. 2: reflexivity.
+ rewrite CReal_mult_1_r.
+ rewrite CReal_mult_comm, CReal_double. ring.
+Qed.
+
+Lemma CReal_max_plus : forall (x y z : CReal),
+ x + CReal_max y z == CReal_max (x + y) (x + z).
+Proof.
+ intros. unfold CReal_max.
+ setoid_replace (x + z - (x + y)) with (z-y).
+ 2: ring.
+ apply (CReal_mult_eq_reg_r 2). 2: right; apply inject_Q_lt; reflexivity.
+ rewrite CReal_mult_plus_distr_r.
+ rewrite CReal_mult_assoc, <- inject_Q_mult.
+ setoid_replace ((1 # 2) * 2)%Q with 1%Q. 2: reflexivity.
+ rewrite CReal_mult_1_r.
+ rewrite CReal_mult_assoc, <- inject_Q_mult.
+ setoid_replace ((1 # 2) * 2)%Q with 1%Q. 2: reflexivity.
+ rewrite CReal_mult_1_r.
+ rewrite CReal_mult_comm, CReal_double. ring.
+Qed.
+
+Lemma CReal_min_lt : forall x y z : CReal,
+ z < x -> z < y -> z < CReal_min x y.
+Proof.
+ intros. unfold CReal_min.
+ apply (CReal_mult_lt_reg_r 2). apply inject_Q_lt; reflexivity.
+ rewrite CReal_mult_assoc, <- inject_Q_mult.
+ setoid_replace ((1 # 2) * 2)%Q with 1%Q. 2: reflexivity.
+ rewrite CReal_mult_1_r.
+ apply (CReal_plus_lt_reg_l (CReal_abs (y - x) - (z*2))).
+ ring_simplify. apply Rabs_def1.
+ - unfold CReal_minus. rewrite <- (CReal_plus_comm y).
+ apply CReal_plus_lt_compat_l.
+ apply (CReal_plus_lt_reg_r (-x)).
+ rewrite CReal_plus_assoc, CReal_plus_opp_r, CReal_plus_0_r.
+ rewrite <- CReal_double, CReal_mult_comm. apply CReal_mult_lt_compat_r.
+ apply inject_Q_lt; reflexivity.
+ apply CReal_opp_gt_lt_contravar, H.
+ - unfold CReal_minus. rewrite CReal_opp_plus_distr, CReal_opp_involutive.
+ rewrite CReal_plus_comm, (CReal_plus_comm (-z*2)), CReal_plus_assoc.
+ apply CReal_plus_lt_compat_l.
+ apply (CReal_plus_lt_reg_r (-y)).
+ rewrite CReal_plus_assoc, CReal_plus_opp_r, CReal_plus_0_r.
+ rewrite <- CReal_double, CReal_mult_comm. apply CReal_mult_lt_compat_r.
+ apply inject_Q_lt; reflexivity.
+ apply CReal_opp_gt_lt_contravar, H0.
+Qed.
+
+Lemma CReal_max_assoc : forall a b c : CReal,
+ CReal_max a (CReal_max b c) == CReal_max (CReal_max a b) c.
+Proof.
+ split.
+ - apply CReal_max_lub.
+ + apply CReal_max_lub. apply CReal_max_l.
+ apply (CReal_le_trans _ (CReal_max b c)).
+ apply CReal_max_l. apply CReal_max_r.
+ + apply (CReal_le_trans _ (CReal_max b c)).
+ apply CReal_max_r. apply CReal_max_r.
+ - apply CReal_max_lub.
+ + apply (CReal_le_trans _ (CReal_max a b)).
+ apply CReal_max_l. apply CReal_max_l.
+ + apply CReal_max_lub.
+ apply (CReal_le_trans _ (CReal_max a b)).
+ apply CReal_max_r. apply CReal_max_l. apply CReal_max_r.
+Qed.
+
+Lemma CReal_min_max_mult_neg :
+ forall (p q r:CReal), r <= 0 -> CReal_min (r * p) (r * q) == r * CReal_max p q.
+Proof.
+ intros p q r H. unfold CReal_min, CReal_max.
+ setoid_replace (r * q - r * p) with (r * (q - p)).
+ 2: ring. rewrite CReal_abs_mult.
+ rewrite (CReal_abs_left r). ring. exact H.
+Qed.
+
+Lemma CReal_min_assoc : forall a b c : CReal,
+ CReal_min a (CReal_min b c) == CReal_min (CReal_min a b) c.
+Proof.
+ split.
+ - apply CReal_min_glb.
+ + apply (CReal_le_trans _ (CReal_min a b)).
+ apply CReal_min_l. apply CReal_min_l.
+ + apply CReal_min_glb.
+ apply (CReal_le_trans _ (CReal_min a b)).
+ apply CReal_min_l. apply CReal_min_r. apply CReal_min_r.
+ - apply CReal_min_glb.
+ + apply CReal_min_glb. apply CReal_min_l.
+ apply (CReal_le_trans _ (CReal_min b c)).
+ apply CReal_min_r. apply CReal_min_l.
+ + apply (CReal_le_trans _ (CReal_min b c)).
+ apply CReal_min_r. apply CReal_min_r.
+Qed.
+
+Lemma CReal_max_lub_lt : forall x y z : CReal,
+ x < z -> y < z -> CReal_max x y < z.
+Proof.
+ intros. unfold CReal_max.
+ apply (CReal_mult_lt_reg_r 2). apply inject_Q_lt; reflexivity.
+ rewrite CReal_mult_assoc, <- inject_Q_mult.
+ setoid_replace ((1 # 2) * 2)%Q with 1%Q. 2: reflexivity.
+ rewrite CReal_mult_1_r.
+ apply (CReal_plus_lt_reg_l (-x -y)). ring_simplify.
+ apply Rabs_def1.
+ - unfold CReal_minus. rewrite (CReal_plus_comm y), CReal_plus_assoc.
+ apply CReal_plus_lt_compat_l.
+ apply (CReal_plus_lt_reg_l y).
+ rewrite <- CReal_plus_assoc, CReal_plus_opp_r, CReal_plus_0_l.
+ rewrite <- CReal_double, CReal_mult_comm. apply CReal_mult_lt_compat_r.
+ apply inject_Q_lt; reflexivity. exact H0.
+ - unfold CReal_minus. rewrite CReal_opp_plus_distr, CReal_opp_involutive.
+ rewrite (CReal_plus_comm (-x)), CReal_plus_assoc.
+ apply CReal_plus_lt_compat_l.
+ apply (CReal_plus_lt_reg_l x).
+ rewrite <- CReal_plus_assoc, CReal_plus_opp_r, CReal_plus_0_l.
+ rewrite <- CReal_double, CReal_mult_comm. apply CReal_mult_lt_compat_r.
+ apply inject_Q_lt; reflexivity.
+ apply H.
+Qed.
+
+Lemma CReal_max_contract : forall x y a : CReal,
+ CReal_abs (CReal_max x a - CReal_max y a)
+ <= CReal_abs (x - y).
+Proof.
+ intros. unfold CReal_max.
+ rewrite (CReal_abs_morph
+ _ ((x - y + (CReal_abs (a - x) - CReal_abs (a - y))) * inject_Q (1 # 2))).
+ 2: ring.
+ rewrite CReal_abs_mult, (CReal_abs_right (inject_Q (1 # 2))).
+ 2: apply inject_Q_le; discriminate.
+ apply (CReal_le_trans
+ _ ((CReal_abs (x - y) * 1 + CReal_abs (x-y) * 1)
+ * inject_Q (1 # 2))).
+ apply CReal_mult_le_compat_r. apply inject_Q_le. discriminate.
+ apply (CReal_le_trans _ (CReal_abs (x - y) + CReal_abs (CReal_abs (a - x) - CReal_abs (a - y)))).
+ apply CReal_abs_triang. rewrite CReal_mult_1_r. apply CReal_plus_le_compat_l.
+ rewrite (CReal_abs_minus_sym x y).
+ rewrite (CReal_abs_morph (y-x) ((a-x)-(a-y))).
+ apply CReal_abs_triang_inv2.
+ unfold CReal_minus. rewrite (CReal_plus_comm (a + - x)).
+ rewrite <- CReal_plus_assoc. apply CReal_plus_morph. 2: reflexivity.
+ rewrite CReal_plus_comm, CReal_opp_plus_distr, <- CReal_plus_assoc.
+ rewrite CReal_plus_opp_r, CReal_opp_involutive, CReal_plus_0_l.
+ reflexivity.
+ rewrite <- CReal_mult_plus_distr_l, <- inject_Q_plus.
+ rewrite CReal_mult_assoc, <- inject_Q_mult.
+ setoid_replace ((1 + 1) * (1 # 2))%Q with 1%Q. 2: reflexivity.
+ rewrite CReal_mult_1_r. apply CRealLe_refl.
+Qed.
+
+Lemma CReal_min_contract : forall x y a : CReal,
+ CReal_abs (CReal_min x a - CReal_min y a)
+ <= CReal_abs (x - y).
+Proof.
+ intros. unfold CReal_min.
+ rewrite (CReal_abs_morph
+ _ ((x - y + (CReal_abs (a - y) - CReal_abs (a - x))) * inject_Q (1 # 2))).
+ 2: ring.
+ rewrite CReal_abs_mult, (CReal_abs_right (inject_Q (1 # 2))).
+ 2: apply inject_Q_le; discriminate.
+ apply (CReal_le_trans
+ _ ((CReal_abs (x - y) * 1 + CReal_abs (x-y) * 1)
+ * inject_Q (1 # 2))).
+ apply CReal_mult_le_compat_r. apply inject_Q_le. discriminate.
+ apply (CReal_le_trans _ (CReal_abs (x - y) + CReal_abs (CReal_abs (a - y) - CReal_abs (a - x)))).
+ apply CReal_abs_triang. rewrite CReal_mult_1_r. apply CReal_plus_le_compat_l.
+ rewrite (CReal_abs_morph (x-y) ((a-y)-(a-x))).
+ apply CReal_abs_triang_inv2.
+ unfold CReal_minus. rewrite (CReal_plus_comm (a + - y)).
+ rewrite <- CReal_plus_assoc. apply CReal_plus_morph. 2: reflexivity.
+ rewrite CReal_plus_comm, CReal_opp_plus_distr, <- CReal_plus_assoc.
+ rewrite CReal_plus_opp_r, CReal_opp_involutive, CReal_plus_0_l.
+ reflexivity.
+ rewrite <- CReal_mult_plus_distr_l, <- inject_Q_plus.
+ rewrite CReal_mult_assoc, <- inject_Q_mult.
+ setoid_replace ((1 + 1) * (1 # 2))%Q with 1%Q. 2: reflexivity.
+ rewrite CReal_mult_1_r. apply CRealLe_refl.
+Qed.
diff --git a/theories/Reals/Cauchy/ConstructiveCauchyReals.v b/theories/Reals/Cauchy/ConstructiveCauchyReals.v
new file mode 100644
index 0000000000..167f8d41c9
--- /dev/null
+++ b/theories/Reals/Cauchy/ConstructiveCauchyReals.v
@@ -0,0 +1,1351 @@
+(************************************************************************)
+(* * The Coq Proof Assistant / The Coq Development Team *)
+(* v * Copyright INRIA, CNRS and contributors *)
+(* un O) (fun q => O)
+ which says nothing about the limit of un.
+ *)
+Definition QSeqEquiv (un vn : nat -> Q) (cvmod : positive -> nat)
+ : Prop
+ := forall (k : positive) (p q : nat),
+ le (cvmod k) p
+ -> le (cvmod k) q
+ -> Qlt (Qabs (un p - vn q)) (1 # k).
+
+(* A Cauchy sequence is a sequence equivalent to itself.
+ If sequences are equivalent, they are both Cauchy and have the same limit. *)
+Definition QCauchySeq (un : nat -> Q) (cvmod : positive -> nat) : Prop
+ := QSeqEquiv un un cvmod.
+
+Lemma QSeqEquiv_sym : forall (un vn : nat -> Q) (cvmod : positive -> nat),
+ QSeqEquiv un vn cvmod
+ -> QSeqEquiv vn un cvmod.
+Proof.
+ intros. intros k p q H0 H1.
+ rewrite Qabs_Qminus. apply H; assumption.
+Qed.
+
+Lemma factorDenom : forall (a:Z) (b d:positive), (a # (d * b)) == (1#d) * (a#b).
+Proof.
+ intros. unfold Qeq. simpl. destruct a; reflexivity.
+Qed.
+
+Lemma QSeqEquiv_trans : forall (un vn wn : nat -> Q)
+ (cvmod cvmodw : positive -> nat),
+ QSeqEquiv un vn cvmod
+ -> QSeqEquiv vn wn cvmodw
+ -> QSeqEquiv un wn (fun q => max (cvmod (2 * q)%positive) (cvmodw (2 * q)%positive)).
+Proof.
+ intros. intros k p q H1 H2.
+ setoid_replace (un p - wn q) with (un p - vn p + (vn p - wn q)).
+ apply (Qle_lt_trans
+ _ (Qabs (un p - vn p) + Qabs (vn p - wn q))).
+ apply Qabs_triangle. apply (Qlt_le_trans _ ((1 # (2*k)) + (1 # (2*k)))).
+ apply Qplus_lt_le_compat.
+ - assert ((cvmod (2 * k)%positive <= p)%nat).
+ { apply (le_trans _ (max (cvmod (2 * k)%positive) (cvmodw (2 * k)%positive))).
+ apply Nat.le_max_l. assumption. }
+ apply H. assumption. assumption.
+ - apply Qle_lteq. left. apply H0.
+ apply (le_trans _ (max (cvmod (2 * k)%positive) (cvmodw (2 * k)%positive))).
+ apply Nat.le_max_r. assumption.
+ apply (le_trans _ (max (cvmod (2 * k)%positive) (cvmodw (2 * k)%positive))).
+ apply Nat.le_max_r. assumption.
+ - rewrite (factorDenom _ _ 2). ring_simplify. apply Qle_refl.
+ - ring.
+Qed.
+
+Definition QSeqEquivEx (un vn : nat -> Q) : Prop
+ := exists (cvmod : positive -> nat), QSeqEquiv un vn cvmod.
+
+Lemma QSeqEquivEx_sym : forall (un vn : nat -> Q), QSeqEquivEx un vn -> QSeqEquivEx vn un.
+Proof.
+ intros. destruct H. exists x. apply QSeqEquiv_sym. apply H.
+Qed.
+
+Lemma QSeqEquivEx_trans : forall un vn wn : nat -> Q,
+ QSeqEquivEx un vn
+ -> QSeqEquivEx vn wn
+ -> QSeqEquivEx un wn.
+Proof.
+ intros. destruct H,H0.
+ exists (fun q => max (x (2 * q)%positive) (x0 (2 * q)%positive)).
+ apply (QSeqEquiv_trans un vn wn); assumption.
+Qed.
+
+Lemma QSeqEquiv_cau_r : forall (un vn : nat -> Q) (cvmod : positive -> nat),
+ QSeqEquiv un vn cvmod
+ -> QCauchySeq vn (fun k => cvmod (2 * k)%positive).
+Proof.
+ intros. intros k p q H0 H1.
+ setoid_replace (vn p - vn q)
+ with (vn p
+ - un (cvmod (2 * k)%positive)
+ + (un (cvmod (2 * k)%positive) - vn q)).
+ - apply (Qle_lt_trans
+ _ (Qabs (vn p
+ - un (cvmod (2 * k)%positive))
+ + Qabs (un (cvmod (2 * k)%positive) - vn q))).
+ apply Qabs_triangle.
+ apply (Qlt_le_trans _ ((1 # (2 * k)) + (1 # (2 * k)))).
+ apply Qplus_lt_le_compat.
+ + rewrite Qabs_Qminus. apply H. apply le_refl. assumption.
+ + apply Qle_lteq. left. apply H. apply le_refl. assumption.
+ + rewrite (factorDenom _ _ 2). ring_simplify. apply Qle_refl.
+ - ring.
+Qed.
+
+Fixpoint increasing_modulus (modulus : positive -> nat) (n : nat)
+ := match n with
+ | O => modulus xH
+ | S p => max (modulus (Pos.of_nat n)) (increasing_modulus modulus p)
+ end.
+
+Lemma increasing_modulus_inc : forall (modulus : positive -> nat) (n p : nat),
+ le (increasing_modulus modulus n)
+ (increasing_modulus modulus (p + n)).
+Proof.
+ induction p.
+ - apply le_refl.
+ - apply (le_trans _ (increasing_modulus modulus (p + n))).
+ apply IHp. simpl. destruct (plus p n). apply Nat.le_max_r. apply Nat.le_max_r.
+Qed.
+
+Lemma increasing_modulus_max : forall (modulus : positive -> nat) (p n : nat),
+ le n p -> le (modulus (Pos.of_nat n))
+ (increasing_modulus modulus p).
+Proof.
+ induction p.
+ - intros. inversion H. subst n. apply le_refl.
+ - intros. simpl. destruct p. simpl.
+ + destruct n. apply Nat.le_max_l. apply le_S_n in H.
+ inversion H. apply Nat.le_max_l.
+ + apply Nat.le_succ_r in H. destruct H.
+ apply (le_trans _ (increasing_modulus modulus (S p))).
+ 2: apply Nat.le_max_r. apply IHp. apply H.
+ subst n. apply (le_trans _ (modulus (Pos.succ (Pos.of_nat (S p))))).
+ apply le_refl. apply Nat.le_max_l.
+Qed.
+
+(* Choice of a standard element in each QSeqEquiv class. *)
+Lemma standard_modulus : forall (un : nat -> Q) (cvmod : positive -> nat),
+ QCauchySeq un cvmod
+ -> (QCauchySeq (fun n => un (increasing_modulus cvmod n)) Pos.to_nat
+ /\ QSeqEquiv un (fun n => un (increasing_modulus cvmod n))
+ (fun p => max (cvmod p) (Pos.to_nat p))).
+Proof.
+ intros. split.
+ - intros k p q H0 H1. apply H.
+ + apply (le_trans _ (increasing_modulus cvmod (Pos.to_nat k))).
+ apply (le_trans _ (cvmod (Pos.of_nat (Pos.to_nat k)))).
+ rewrite Pos2Nat.id. apply le_refl.
+ destruct (Pos.to_nat k). apply le_refl. apply Nat.le_max_l.
+ destruct (Nat.le_exists_sub (Pos.to_nat k) p H0) as [i [H2 H3]]. subst p.
+ apply increasing_modulus_inc.
+ + apply (le_trans _ (increasing_modulus cvmod (Pos.to_nat k))).
+ apply (le_trans _ (cvmod (Pos.of_nat (Pos.to_nat k)))).
+ rewrite Pos2Nat.id. apply le_refl.
+ destruct (Pos.to_nat k). apply le_refl. apply Nat.le_max_l.
+ destruct (Nat.le_exists_sub (Pos.to_nat k) q H1) as [i [H2 H3]]. subst q.
+ apply increasing_modulus_inc.
+ - intros k p q H0 H1. apply H.
+ + apply (le_trans _ (Init.Nat.max (cvmod k) (Pos.to_nat k))).
+ apply Nat.le_max_l. assumption.
+ + apply (le_trans _ (increasing_modulus cvmod (Pos.to_nat k))).
+ apply (le_trans _ (cvmod (Pos.of_nat (Pos.to_nat k)))).
+ rewrite Pos2Nat.id. apply le_refl.
+ destruct (Pos.to_nat k). apply le_refl. apply Nat.le_max_l.
+ assert (le (Pos.to_nat k) q).
+ { apply (le_trans _ (Init.Nat.max (cvmod k) (Pos.to_nat k))).
+ apply Nat.le_max_r. assumption. }
+ destruct (Nat.le_exists_sub (Pos.to_nat k) q H2) as [i [H3 H4]]. subst q.
+ apply increasing_modulus_inc.
+Qed.
+
+(* A Cauchy real is a Cauchy sequence with the standard modulus *)
+Definition CReal : Set
+ := { x : (nat -> Q) | QCauchySeq x Pos.to_nat }.
+
+Declare Scope CReal_scope.
+
+(* Declare Scope R_scope with Key R *)
+Delimit Scope CReal_scope with CReal.
+
+(* Automatically open scope R_scope for arguments of type R *)
+Bind Scope CReal_scope with CReal.
+
+Local Open Scope CReal_scope.
+
+
+(* So QSeqEquiv is the equivalence relation of this constructive pre-order *)
+Definition CRealLt (x y : CReal) : Set
+ := { n : positive | Qlt (2 # n)
+ (proj1_sig y (Pos.to_nat n) - proj1_sig x (Pos.to_nat n)) }.
+
+Definition CRealLtProp (x y : CReal) : Prop
+ := exists n : positive, Qlt (2 # n)
+ (proj1_sig y (Pos.to_nat n) - proj1_sig x (Pos.to_nat n)).
+
+Definition CRealGt (x y : CReal) := CRealLt y x.
+Definition CReal_appart (x y : CReal) := sum (CRealLt x y) (CRealLt y x).
+
+Infix "<" := CRealLt : CReal_scope.
+Infix ">" := CRealGt : CReal_scope.
+Infix "#" := CReal_appart : CReal_scope.
+
+(* This Prop can be extracted as a sigma type *)
+Lemma CRealLtEpsilon : forall x y : CReal,
+ CRealLtProp x y -> x < y.
+Proof.
+ intros.
+ assert (exists n : nat, n <> O
+ /\ Qlt (2 # Pos.of_nat n) (proj1_sig y n - proj1_sig x n)).
+ { destruct H as [n maj]. exists (Pos.to_nat n). split.
+ intro abs. destruct (Pos2Nat.is_succ n). rewrite H in abs.
+ inversion abs. rewrite Pos2Nat.id. apply maj. }
+ apply constructive_indefinite_ground_description_nat in H0.
+ destruct H0 as [n maj]. exists (Pos.of_nat n).
+ rewrite Nat2Pos.id. apply maj. apply maj.
+ intro n. destruct n. right.
+ intros [abs _]. exact (abs (eq_refl O)).
+ destruct (Qlt_le_dec (2 # Pos.of_nat (S n))
+ (proj1_sig y (S n) - proj1_sig x (S n))).
+ left. split. discriminate. apply q.
+ right. intros [_ abs].
+ apply (Qlt_not_le (2 # Pos.of_nat (S n))
+ (proj1_sig y (S n) - proj1_sig x (S n))); assumption.
+Qed.
+
+Lemma CRealLtForget : forall x y : CReal,
+ x < y -> CRealLtProp x y.
+Proof.
+ intros. destruct H. exists x0. exact q.
+Qed.
+
+(* CRealLt is decided by the LPO in Type,
+ which is a non-constructive oracle. *)
+Lemma CRealLt_lpo_dec : forall x y : CReal,
+ (forall (P : nat -> Prop), (forall n, {P n} + {~P n})
+ -> {n | ~P n} + {forall n, P n})
+ -> CRealLt x y + (CRealLt x y -> False).
+Proof.
+ intros x y lpo.
+ destruct (lpo (fun n:nat => Qle (proj1_sig y (S n) - proj1_sig x (S n))
+ (2 # Pos.of_nat (S n)))).
+ - intro n. destruct (Qlt_le_dec (2 # Pos.of_nat (S n))
+ (proj1_sig y (S n) - proj1_sig x (S n))).
+ right. apply Qlt_not_le. exact q. left. exact q.
+ - left. destruct s as [n nmaj]. exists (Pos.of_nat (S n)).
+ rewrite Nat2Pos.id. apply Qnot_le_lt. exact nmaj. discriminate.
+ - right. intro abs. destruct abs as [n majn].
+ specialize (q (pred (Pos.to_nat n))).
+ replace (S (pred (Pos.to_nat n))) with (Pos.to_nat n) in q.
+ rewrite Pos2Nat.id in q.
+ pose proof (Qle_not_lt _ _ q). contradiction.
+ symmetry. apply Nat.succ_pred. intro abs.
+ pose proof (Pos2Nat.is_pos n). rewrite abs in H. inversion H.
+Qed.
+
+(* Alias the large order *)
+Definition CRealLe (x y : CReal) : Prop
+ := CRealLt y x -> False.
+
+Definition CRealGe (x y : CReal) := CRealLe y x.
+
+Infix "<=" := CRealLe : CReal_scope.
+Infix ">=" := CRealGe : CReal_scope.
+
+Notation "x <= y <= z" := (x <= y /\ y <= z) : CReal_scope.
+Notation "x <= y < z" := (prod (x <= y) (y < z)) : CReal_scope.
+Notation "x < y < z" := (prod (x < y) (y < z)) : CReal_scope.
+Notation "x < y <= z" := (prod (x < y) (y <= z)) : CReal_scope.
+
+(* Alias the quotient order equality *)
+Definition CRealEq (x y : CReal) : Prop
+ := (CRealLe y x) /\ (CRealLe x y).
+
+Infix "==" := CRealEq : CReal_scope.
+
+Lemma CRealLe_not_lt : forall x y : CReal,
+ (forall n:positive, Qle (proj1_sig x (Pos.to_nat n) - proj1_sig y (Pos.to_nat n))
+ (2 # n))
+ <-> x <= y.
+Proof.
+ intros. split.
+ - intros. intro H0. destruct H0 as [n H0]. specialize (H n).
+ apply (Qle_not_lt (2 # n) (2 # n)). apply Qle_refl.
+ apply (Qlt_le_trans _ (proj1_sig x (Pos.to_nat n) - proj1_sig y (Pos.to_nat n))).
+ assumption. assumption.
+ - intros.
+ destruct (Qlt_le_dec (2 # n) (proj1_sig x (Pos.to_nat n) - proj1_sig y (Pos.to_nat n))).
+ exfalso. apply H. exists n. assumption. assumption.
+Qed.
+
+Lemma CRealEq_diff : forall (x y : CReal),
+ CRealEq x y
+ <-> forall n:positive, Qle (Qabs (proj1_sig x (Pos.to_nat n) - proj1_sig y (Pos.to_nat n)))
+ (2 # n).
+Proof.
+ intros. split.
+ - intros. destruct H. apply Qabs_case. intro.
+ pose proof (CRealLe_not_lt x y) as [_ H2]. apply H2. assumption.
+ intro. pose proof (CRealLe_not_lt y x) as [_ H2].
+ setoid_replace (- (proj1_sig x (Pos.to_nat n) - proj1_sig y (Pos.to_nat n)))
+ with (proj1_sig y (Pos.to_nat n) - proj1_sig x (Pos.to_nat n)).
+ apply H2. assumption. ring.
+ - intros. split.
+ + apply CRealLe_not_lt. intro n. specialize (H n).
+ rewrite Qabs_Qminus in H.
+ apply (Qle_trans _ (Qabs (proj1_sig y (Pos.to_nat n)
+ - proj1_sig x (Pos.to_nat n)))).
+ apply Qle_Qabs. apply H.
+ + apply CRealLe_not_lt. intro n. specialize (H n).
+ apply (Qle_trans _ (Qabs (proj1_sig x (Pos.to_nat n)
+ - proj1_sig y (Pos.to_nat n)))).
+ apply Qle_Qabs. apply H.
+Qed.
+
+(* The equality on Cauchy reals is just QSeqEquiv,
+ which is independant of the convergence modulus. *)
+Lemma CRealEq_modindep : forall (x y : CReal),
+ QSeqEquivEx (proj1_sig x) (proj1_sig y)
+ <-> forall n:positive,
+ Qle (Qabs (proj1_sig x (Pos.to_nat n) - proj1_sig y (Pos.to_nat n))) (2 # n).
+Proof.
+ assert (forall x y: CReal, QSeqEquivEx (proj1_sig x) (proj1_sig y) -> x <= y ).
+ { intros [xn limx] [yn limy] [cvmod H] [n abs]. simpl in abs, H.
+ pose (xn (Pos.to_nat n) - yn (Pos.to_nat n) - (2#n)) as eps.
+ destruct (Qarchimedean (/eps)) as [k maj].
+ remember (max (cvmod k) (Pos.to_nat n)) as p.
+ assert (le (cvmod k) p).
+ { rewrite Heqp. apply Nat.le_max_l. }
+ assert (Pos.to_nat n <= p)%nat.
+ { rewrite Heqp. apply Nat.le_max_r. }
+ specialize (H k p p H0 H0).
+ setoid_replace (Z.pos k #1)%Q with (/ (1#k)) in maj. 2: reflexivity.
+ apply Qinv_lt_contravar in maj. 2: reflexivity. unfold eps in maj.
+ clear abs. (* less precise majoration *)
+ apply (Qplus_lt_r _ _ (2#n)) in maj. ring_simplify in maj.
+ apply (Qlt_not_le _ _ maj). clear maj.
+ setoid_replace (xn (Pos.to_nat n) + -1 * yn (Pos.to_nat n))
+ with (xn (Pos.to_nat n) - xn p + (xn p - yn p + (yn p - yn (Pos.to_nat n)))).
+ 2: ring.
+ setoid_replace (2 # n)%Q with ((1 # n) + (1#n)).
+ rewrite <- Qplus_assoc.
+ apply Qplus_le_compat. apply (Qle_trans _ _ _ (Qle_Qabs _)).
+ apply Qlt_le_weak. apply limx. apply le_refl. assumption.
+ rewrite (Qplus_comm (1#n)).
+ apply Qplus_le_compat. apply (Qle_trans _ _ _ (Qle_Qabs _)).
+ apply Qlt_le_weak. exact H.
+ apply (Qle_trans _ _ _ (Qle_Qabs _)). apply Qlt_le_weak. apply limy.
+ assumption. apply le_refl. ring_simplify. reflexivity.
+ unfold eps. unfold Qminus. rewrite <- Qlt_minus_iff. exact abs. }
+ split.
+ - rewrite <- CRealEq_diff. intros. split.
+ apply H, QSeqEquivEx_sym. exact H0. apply H. exact H0.
+ - clear H. intros. destruct x as [xn limx], y as [yn limy].
+ exists (fun q => Pos.to_nat (2 * (3 * q))). intros k p q H0 H1.
+ unfold proj1_sig. specialize (H (2 * (3 * k))%positive).
+ assert ((Pos.to_nat (3 * k) <= Pos.to_nat (2 * (3 * k)))%nat).
+ { generalize (3 * k)%positive. intros. rewrite Pos2Nat.inj_mul.
+ rewrite <- (mult_1_l (Pos.to_nat p0)). apply Nat.mul_le_mono_nonneg.
+ auto. unfold Pos.to_nat. simpl. auto.
+ apply (le_trans 0 1). auto. apply Pos2Nat.is_pos. rewrite mult_1_l.
+ apply le_refl. }
+ setoid_replace (xn p - yn q)
+ with (xn p - xn (Pos.to_nat (2 * (3 * k)))
+ + (xn (Pos.to_nat (2 * (3 * k))) - yn (Pos.to_nat (2 * (3 * k)))
+ + (yn (Pos.to_nat (2 * (3 * k))) - yn q))).
+ setoid_replace (1 # k)%Q with ((1 # 3 * k) + ((1 # 3 * k) + (1 # 3 * k))).
+ apply (Qle_lt_trans
+ _ (Qabs (xn p - xn (Pos.to_nat (2 * (3 * k))))
+ + (Qabs (xn (Pos.to_nat (2 * (3 * k))) - yn (Pos.to_nat (2 * (3 * k)))
+ + (yn (Pos.to_nat (2 * (3 * k))) - yn q))))).
+ apply Qabs_triangle. apply Qplus_lt_le_compat.
+ apply limx. apply (le_trans _ (Pos.to_nat (2 * (3 * k)))). assumption. assumption.
+ assumption.
+ apply (Qle_trans
+ _ (Qabs (xn (Pos.to_nat (2 * (3 * k))) - yn (Pos.to_nat (2 * (3 * k))))
+ + Qabs (yn (Pos.to_nat (2 * (3 * k))) - yn q))).
+ apply Qabs_triangle. apply Qplus_le_compat.
+ setoid_replace (1 # 3 * k)%Q with (2 # 2 * (3 * k))%Q. apply H.
+ rewrite (factorDenom _ _ 3). rewrite (factorDenom _ _ 2). rewrite (factorDenom _ _ 3).
+ rewrite Qmult_assoc. rewrite (Qmult_comm (1#2)).
+ rewrite <- Qmult_assoc. apply Qmult_comp. reflexivity.
+ unfold Qeq. reflexivity.
+ apply Qle_lteq. left. apply limy. assumption.
+ apply (le_trans _ (Pos.to_nat (2 * (3 * k)))). assumption. assumption.
+ rewrite (factorDenom _ _ 3). ring_simplify. reflexivity. field.
+Qed.
+
+(* Extend separation to all indices above *)
+Lemma CRealLt_aboveSig : forall (x y : CReal) (n : positive),
+ (Qlt (2 # n)
+ (proj1_sig y (Pos.to_nat n) - proj1_sig x (Pos.to_nat n)))
+ -> let (k, _) := Qarchimedean (/(proj1_sig y (Pos.to_nat n) - proj1_sig x (Pos.to_nat n) - (2#n)))
+ in forall p:positive,
+ Pos.le (Pos.max n (2*k)) p
+ -> Qlt (2 # (Pos.max n (2*k)))
+ (proj1_sig y (Pos.to_nat p) - proj1_sig x (Pos.to_nat p)).
+Proof.
+ intros [xn limx] [yn limy] n maj.
+ unfold proj1_sig; unfold proj1_sig in maj.
+ pose (yn (Pos.to_nat n) - xn (Pos.to_nat n)) as dn.
+ destruct (Qarchimedean (/(yn (Pos.to_nat n) - xn (Pos.to_nat n) - (2#n)))) as [k kmaj].
+ assert (0 < yn (Pos.to_nat n) - xn (Pos.to_nat n) - (2 # n))%Q as H0.
+ { rewrite <- (Qplus_opp_r (2#n)). apply Qplus_lt_l. assumption. }
+ intros.
+ remember (yn (Pos.to_nat p) - xn (Pos.to_nat p)) as dp.
+
+ rewrite <- (Qplus_0_r dp). rewrite <- (Qplus_opp_r dn).
+ rewrite (Qplus_comm dn). rewrite Qplus_assoc.
+ assert (Qlt (Qabs (dp - dn)) (2#n)).
+ { rewrite Heqdp. unfold dn.
+ setoid_replace (yn (Pos.to_nat p) - xn (Pos.to_nat p) - (yn (Pos.to_nat n) - xn (Pos.to_nat n)))
+ with (yn (Pos.to_nat p) - yn (Pos.to_nat n)
+ + (xn (Pos.to_nat n) - xn (Pos.to_nat p))).
+ apply (Qle_lt_trans _ (Qabs (yn (Pos.to_nat p) - yn (Pos.to_nat n))
+ + Qabs (xn (Pos.to_nat n) - xn (Pos.to_nat p)))).
+ apply Qabs_triangle.
+ setoid_replace (2#n)%Q with ((1#n) + (1#n))%Q.
+ apply Qplus_lt_le_compat. apply limy.
+ apply Pos2Nat.inj_le. apply (Pos.le_trans _ (Pos.max n (2 * k))).
+ apply Pos.le_max_l. assumption.
+ apply le_refl. apply Qlt_le_weak. apply limx. apply le_refl.
+ apply Pos2Nat.inj_le. apply (Pos.le_trans _ (Pos.max n (2 * k))).
+ apply Pos.le_max_l. assumption.
+ rewrite Qinv_plus_distr. reflexivity. field. }
+ apply (Qle_lt_trans _ (-(2#n) + dn)).
+ rewrite Qplus_comm. unfold dn. apply Qlt_le_weak.
+ apply (Qle_lt_trans _ (2 # (2 * k))). apply Pos.le_max_r.
+ setoid_replace (2 # 2 * k)%Q with (1 # k)%Q. 2: reflexivity.
+ setoid_replace (Z.pos k # 1)%Q with (/(1#k))%Q in kmaj. 2: reflexivity.
+ apply Qinv_lt_contravar. reflexivity. apply H0. apply kmaj.
+ apply Qplus_lt_l. rewrite <- Qplus_0_r. rewrite <- (Qplus_opp_r dn).
+ rewrite Qplus_assoc. apply Qplus_lt_l. rewrite Qplus_comm.
+ rewrite <- (Qplus_0_r dp). rewrite <- (Qplus_opp_r (2#n)).
+ rewrite Qplus_assoc. apply Qplus_lt_l.
+ rewrite <- (Qplus_0_l dn). rewrite <- (Qplus_opp_r dp).
+ rewrite <- Qplus_assoc. apply Qplus_lt_r. rewrite Qplus_comm.
+ apply (Qle_lt_trans _ (Qabs (dp - dn))). rewrite Qabs_Qminus.
+ unfold Qminus. apply Qle_Qabs. assumption.
+Qed.
+
+Lemma CRealLt_above : forall (x y : CReal),
+ CRealLt x y
+ -> { k : positive | forall p:positive,
+ Pos.le k p -> Qlt (2 # k) (proj1_sig y (Pos.to_nat p)
+ - proj1_sig x (Pos.to_nat p)) }.
+Proof.
+ intros x y [n maj].
+ pose proof (CRealLt_aboveSig x y n maj).
+ destruct (Qarchimedean (/ (proj1_sig y (Pos.to_nat n) - proj1_sig x (Pos.to_nat n) - (2 # n))))
+ as [k kmaj].
+ exists (Pos.max n (2*k)). apply H.
+Qed.
+
+(* The CRealLt index separates the Cauchy sequences *)
+Lemma CRealLt_above_same : forall (x y : CReal) (n : positive),
+ Qlt (2 # n)
+ (proj1_sig y (Pos.to_nat n) - proj1_sig x (Pos.to_nat n))
+ -> forall p:positive, Pos.le n p
+ -> Qlt (proj1_sig x (Pos.to_nat p)) (proj1_sig y (Pos.to_nat p)).
+Proof.
+ intros [xn limx] [yn limy] n inf p H.
+ simpl. simpl in inf.
+ apply (Qplus_lt_l _ _ (- xn (Pos.to_nat n))).
+ apply (Qle_lt_trans _ (Qabs (xn (Pos.to_nat p) + - xn (Pos.to_nat n)))).
+ apply Qle_Qabs. apply (Qlt_trans _ (1#n)).
+ apply limx. apply Pos2Nat.inj_le. assumption. apply le_refl.
+ rewrite <- (Qplus_0_r (yn (Pos.to_nat p))).
+ rewrite <- (Qplus_opp_r (yn (Pos.to_nat n))).
+ rewrite (Qplus_comm (yn (Pos.to_nat n))). rewrite Qplus_assoc.
+ rewrite <- Qplus_assoc.
+ setoid_replace (1#n)%Q with (-(1#n) + (2#n))%Q. apply Qplus_lt_le_compat.
+ apply (Qplus_lt_l _ _ (1#n)). rewrite Qplus_opp_r.
+ apply (Qplus_lt_r _ _ (yn (Pos.to_nat n) + - yn (Pos.to_nat p))).
+ ring_simplify.
+ setoid_replace (yn (Pos.to_nat n) + (-1 # 1) * yn (Pos.to_nat p))
+ with (yn (Pos.to_nat n) - yn (Pos.to_nat p)).
+ apply (Qle_lt_trans _ (Qabs (yn (Pos.to_nat n) - yn (Pos.to_nat p)))).
+ apply Qle_Qabs. apply limy. apply le_refl. apply Pos2Nat.inj_le. assumption.
+ field. apply Qle_lteq. left. assumption.
+ rewrite Qplus_comm. rewrite Qinv_minus_distr.
+ reflexivity.
+Qed.
+
+Lemma CRealLt_asym : forall x y : CReal, x < y -> x <= y.
+Proof.
+ intros x y H [n q].
+ apply CRealLt_above in H. destruct H as [p H].
+ pose proof (CRealLt_above_same y x n q).
+ apply (Qlt_not_le (proj1_sig y (Pos.to_nat (Pos.max n p)))
+ (proj1_sig x (Pos.to_nat (Pos.max n p)))).
+ apply H0. apply Pos.le_max_l.
+ apply Qlt_le_weak. apply (Qplus_lt_l _ _ (-proj1_sig x (Pos.to_nat (Pos.max n p)))).
+ rewrite Qplus_opp_r. apply (Qlt_trans _ (2#p)).
+ unfold Qlt. simpl. unfold Z.lt. auto. apply H. apply Pos.le_max_r.
+Qed.
+
+Lemma CRealLt_irrefl : forall x:CReal, x < x -> False.
+Proof.
+ intros x abs. exact (CRealLt_asym x x abs abs).
+Qed.
+
+Lemma CRealLe_refl : forall x : CReal, x <= x.
+Proof.
+ intros. intro abs.
+ pose proof (CRealLt_asym x x abs). contradiction.
+Qed.
+
+Lemma CRealEq_refl : forall x : CReal, x == x.
+Proof.
+ intros. split; apply CRealLe_refl.
+Qed.
+
+Lemma CRealEq_sym : forall x y : CReal, CRealEq x y -> CRealEq y x.
+Proof.
+ intros. destruct H. split; intro abs; contradiction.
+Qed.
+
+Lemma CRealLt_dec : forall x y z : CReal,
+ x < y -> sum (x < z) (z < y).
+Proof.
+ intros [xn limx] [yn limy] [zn limz] [n inf].
+ unfold proj1_sig in inf.
+ remember (yn (Pos.to_nat n) - xn (Pos.to_nat n) - (2 # n)) as eps.
+ assert (Qlt 0 eps) as epsPos.
+ { subst eps. unfold Qminus. apply (Qlt_minus_iff (2#n)). assumption. }
+ assert (forall n p, Pos.to_nat n <= Pos.to_nat (Pos.max n p))%nat.
+ { intros. apply Pos2Nat.inj_le. unfold Pos.max. unfold Pos.le.
+ destruct (n0 ?= p)%positive eqn:des.
+ rewrite des. discriminate. rewrite des. discriminate.
+ unfold Pos.compare. rewrite Pos.compare_cont_refl. discriminate. }
+ destruct (Qarchimedean (/eps)) as [k kmaj].
+ destruct (Qlt_le_dec ((yn (Pos.to_nat n) + xn (Pos.to_nat n)) / (2#1))
+ (zn (Pos.to_nat (Pos.max n (4 * k)))))
+ as [decMiddle|decMiddle].
+ - left. exists (Pos.max n (4 * k)). unfold proj1_sig. unfold Qminus.
+ rewrite <- (Qplus_0_r (zn (Pos.to_nat (Pos.max n (4 * k))))).
+ rewrite <- (Qplus_opp_r (xn (Pos.to_nat n))).
+ rewrite (Qplus_comm (xn (Pos.to_nat n))). rewrite Qplus_assoc.
+ rewrite <- Qplus_assoc. rewrite <- Qplus_0_r.
+ rewrite <- (Qplus_opp_r (1#n)). rewrite Qplus_assoc.
+ apply Qplus_lt_le_compat.
+ + apply (Qplus_lt_l _ _ (- xn (Pos.to_nat n))) in decMiddle.
+ apply (Qlt_trans _ ((yn (Pos.to_nat n) + xn (Pos.to_nat n)) / (2 # 1)
+ + - xn (Pos.to_nat n))).
+ setoid_replace ((yn (Pos.to_nat n) + xn (Pos.to_nat n)) / (2 # 1)
+ - xn (Pos.to_nat n))
+ with ((yn (Pos.to_nat n) - xn (Pos.to_nat n)) / (2 # 1)).
+ apply Qlt_shift_div_l. unfold Qlt. simpl. unfold Z.lt. auto.
+ rewrite Qmult_plus_distr_l.
+ setoid_replace ((1 # n) * (2 # 1))%Q with (2#n)%Q.
+ apply (Qplus_lt_l _ _ (-(2#n))). rewrite <- Qplus_assoc.
+ rewrite Qplus_opp_r. unfold Qminus. unfold Qminus in Heqeps.
+ rewrite <- Heqeps. rewrite Qplus_0_r.
+ apply (Qle_lt_trans _ (1 # k)). unfold Qle.
+ simpl. rewrite Pos.mul_1_r. rewrite Pos2Z.inj_max.
+ apply Z.le_max_r.
+ setoid_replace (Z.pos k # 1)%Q with (/(1#k))%Q in kmaj. 2: reflexivity.
+ apply Qinv_lt_contravar. reflexivity. apply epsPos. apply kmaj.
+ unfold Qeq. simpl. rewrite Pos.mul_1_r. reflexivity.
+ field. assumption.
+ + setoid_replace (xn (Pos.to_nat n) + - xn (Pos.to_nat (Pos.max n (4 * k))))
+ with (-(xn (Pos.to_nat (Pos.max n (4 * k))) - xn (Pos.to_nat n))).
+ apply Qopp_le_compat.
+ apply (Qle_trans _ (Qabs (xn (Pos.to_nat (Pos.max n (4 * k))) - xn (Pos.to_nat n)))).
+ apply Qle_Qabs. apply Qle_lteq. left. apply limx. apply H.
+ apply le_refl. field.
+ - right. exists (Pos.max n (4 * k)). unfold proj1_sig. unfold Qminus.
+ rewrite <- (Qplus_0_r (yn (Pos.to_nat (Pos.max n (4 * k))))).
+ rewrite <- (Qplus_opp_r (yn (Pos.to_nat n))).
+ rewrite (Qplus_comm (yn (Pos.to_nat n))). rewrite Qplus_assoc.
+ rewrite <- Qplus_assoc. rewrite <- Qplus_0_l.
+ rewrite <- (Qplus_opp_r (1#n)). rewrite (Qplus_comm (1#n)).
+ rewrite <- Qplus_assoc. apply Qplus_lt_le_compat.
+ + apply (Qplus_lt_r _ _ (yn (Pos.to_nat n) - yn (Pos.to_nat (Pos.max n (4 * k))) + (1#n)))
+ ; ring_simplify.
+ setoid_replace (-1 * yn (Pos.to_nat (Pos.max n (4 * k))))
+ with (- yn (Pos.to_nat (Pos.max n (4 * k)))). 2: ring.
+ apply (Qle_lt_trans _ (Qabs (yn (Pos.to_nat n)
+ - yn (Pos.to_nat (Pos.max n (4 * k)))))).
+ apply Qle_Qabs. apply limy. apply le_refl. apply H.
+ + apply Qopp_le_compat in decMiddle.
+ apply (Qplus_le_r _ _ (yn (Pos.to_nat n))) in decMiddle.
+ apply (Qle_trans _ (yn (Pos.to_nat n) + - ((yn (Pos.to_nat n) + xn (Pos.to_nat n)) / (2 # 1)))).
+ setoid_replace (yn (Pos.to_nat n) + - ((yn (Pos.to_nat n) + xn (Pos.to_nat n)) / (2 # 1)))
+ with ((yn (Pos.to_nat n) - xn (Pos.to_nat n)) / (2 # 1)).
+ apply Qle_shift_div_l. unfold Qlt. simpl. unfold Z.lt. auto.
+ rewrite Qmult_plus_distr_l.
+ setoid_replace ((1 # n) * (2 # 1))%Q with (2#n)%Q.
+ apply (Qplus_le_r _ _ (-(2#n))). rewrite Qplus_assoc.
+ rewrite Qplus_opp_r. rewrite Qplus_0_l. rewrite (Qplus_comm (-(2#n))).
+ unfold Qminus in Heqeps. unfold Qminus. rewrite <- Heqeps.
+ apply (Qle_trans _ (1 # k)). unfold Qle.
+ simpl. rewrite Pos.mul_1_r. rewrite Pos2Z.inj_max.
+ apply Z.le_max_r. apply Qle_lteq. left.
+ setoid_replace (Z.pos k # 1)%Q with (/(1#k))%Q in kmaj. 2: reflexivity.
+ apply Qinv_lt_contravar. reflexivity. apply epsPos. apply kmaj.
+ unfold Qeq. simpl. rewrite Pos.mul_1_r. reflexivity.
+ field. assumption.
+Defined.
+
+Definition linear_order_T x y z := CRealLt_dec x z y.
+
+Lemma CReal_le_lt_trans : forall x y z : CReal,
+ x <= y -> y < z -> x < z.
+Proof.
+ intros.
+ destruct (linear_order_T y x z H0). contradiction. apply c.
+Defined.
+
+Lemma CReal_lt_le_trans : forall x y z : CReal,
+ x < y -> y <= z -> x < z.
+Proof.
+ intros.
+ destruct (linear_order_T x z y H). apply c. contradiction.
+Defined.
+
+Lemma CReal_le_trans : forall x y z : CReal,
+ x <= y -> y <= z -> x <= z.
+Proof.
+ intros. intro abs. apply H0.
+ apply (CReal_lt_le_trans _ x); assumption.
+Qed.
+
+Lemma CReal_lt_trans : forall x y z : CReal,
+ x < y -> y < z -> x < z.
+Proof.
+ intros. apply (CReal_lt_le_trans _ y _ H).
+ apply CRealLt_asym. exact H0.
+Defined.
+
+Lemma CRealEq_trans : forall x y z : CReal,
+ CRealEq x y -> CRealEq y z -> CRealEq x z.
+Proof.
+ intros. destruct H,H0. split.
+ - intro abs. destruct (CRealLt_dec _ _ y abs); contradiction.
+ - intro abs. destruct (CRealLt_dec _ _ y abs); contradiction.
+Qed.
+
+Add Parametric Relation : CReal CRealEq
+ reflexivity proved by CRealEq_refl
+ symmetry proved by CRealEq_sym
+ transitivity proved by CRealEq_trans
+ as CRealEq_rel.
+
+Instance CRealEq_relT : CRelationClasses.Equivalence CRealEq.
+Proof.
+ split. exact CRealEq_refl. exact CRealEq_sym. exact CRealEq_trans.
+Qed.
+
+Instance CRealLt_morph
+ : CMorphisms.Proper
+ (CMorphisms.respectful CRealEq (CMorphisms.respectful CRealEq CRelationClasses.iffT)) CRealLt.
+Proof.
+ intros x y H x0 y0 H0. destruct H, H0. split.
+ - intro. destruct (CRealLt_dec x x0 y). assumption.
+ contradiction. destruct (CRealLt_dec y x0 y0).
+ assumption. assumption. contradiction.
+ - intro. destruct (CRealLt_dec y y0 x). assumption.
+ contradiction. destruct (CRealLt_dec x y0 x0).
+ assumption. assumption. contradiction.
+Qed.
+
+Instance CRealGt_morph
+ : CMorphisms.Proper
+ (CMorphisms.respectful CRealEq (CMorphisms.respectful CRealEq CRelationClasses.iffT)) CRealGt.
+Proof.
+ intros x y H x0 y0 H0. apply CRealLt_morph; assumption.
+Qed.
+
+Instance CReal_appart_morph
+ : CMorphisms.Proper
+ (CMorphisms.respectful CRealEq (CMorphisms.respectful CRealEq CRelationClasses.iffT)) CReal_appart.
+Proof.
+ split.
+ - intros. destruct H1. left. rewrite <- H0, <- H. exact c.
+ right. rewrite <- H0, <- H. exact c.
+ - intros. destruct H1. left. rewrite H0, H. exact c.
+ right. rewrite H0, H. exact c.
+Qed.
+
+Add Parametric Morphism : CRealLtProp
+ with signature CRealEq ==> CRealEq ==> iff
+ as CRealLtProp_morph.
+Proof.
+ intros x y H x0 y0 H0. split.
+ - intro. apply CRealLtForget. apply CRealLtEpsilon in H1.
+ rewrite <- H, <- H0. exact H1.
+ - intro. apply CRealLtForget. apply CRealLtEpsilon in H1.
+ rewrite H, H0. exact H1.
+Qed.
+
+Add Parametric Morphism : CRealLe
+ with signature CRealEq ==> CRealEq ==> iff
+ as CRealLe_morph.
+Proof.
+ intros. split.
+ - intros H1 H2. unfold CRealLe in H1.
+ rewrite <- H0 in H2. rewrite <- H in H2. contradiction.
+ - intros H1 H2. unfold CRealLe in H1.
+ rewrite H0 in H2. rewrite H in H2. contradiction.
+Qed.
+
+Add Parametric Morphism : CRealGe
+ with signature CRealEq ==> CRealEq ==> iff
+ as CRealGe_morph.
+Proof.
+ intros. unfold CRealGe. apply CRealLe_morph; assumption.
+Qed.
+
+Lemma CRealLt_proper_l : forall x y z : CReal,
+ CRealEq x y
+ -> CRealLt x z -> CRealLt y z.
+Proof.
+ intros. apply (CRealLt_morph x y H z z).
+ apply CRealEq_refl. apply H0.
+Qed.
+
+Lemma CRealLt_proper_r : forall x y z : CReal,
+ CRealEq x y
+ -> CRealLt z x -> CRealLt z y.
+Proof.
+ intros. apply (CRealLt_morph z z (CRealEq_refl z) x y).
+ apply H. apply H0.
+Qed.
+
+Lemma CRealLe_proper_l : forall x y z : CReal,
+ CRealEq x y
+ -> CRealLe x z -> CRealLe y z.
+Proof.
+ intros. apply (CRealLe_morph x y H z z).
+ apply CRealEq_refl. apply H0.
+Qed.
+
+Lemma CRealLe_proper_r : forall x y z : CReal,
+ CRealEq x y
+ -> CRealLe z x -> CRealLe z y.
+Proof.
+ intros. apply (CRealLe_morph z z (CRealEq_refl z) x y).
+ apply H. apply H0.
+Qed.
+
+
+
+(* Injection of Q into CReal *)
+
+Lemma ConstCauchy : forall q : Q,
+ QCauchySeq (fun _ => q) Pos.to_nat.
+Proof.
+ intros. intros k p r H H0.
+ unfold Qminus. rewrite Qplus_opp_r. unfold Qlt. simpl.
+ unfold Z.lt. auto.
+Qed.
+
+Definition inject_Q : Q -> CReal.
+Proof.
+ intro q. exists (fun n => q). apply ConstCauchy.
+Defined.
+
+Definition inject_Z : Z -> CReal
+ := fun n => inject_Q (n # 1).
+
+Notation "0" := (inject_Q 0) : CReal_scope.
+Notation "1" := (inject_Q 1) : CReal_scope.
+Notation "2" := (inject_Q 2) : CReal_scope.
+
+Lemma CRealLt_0_1 : CRealLt (inject_Q 0) (inject_Q 1).
+Proof.
+ exists 3%positive. reflexivity.
+Qed.
+
+Lemma CReal_injectQPos : forall q : Q,
+ Qlt 0 q -> CRealLt (inject_Q 0) (inject_Q q).
+Proof.
+ intros. destruct (Qarchimedean ((2#1) / q)).
+ exists x. simpl. unfold Qminus. rewrite Qplus_0_r.
+ apply (Qmult_lt_compat_r _ _ q) in q0. 2: apply H.
+ unfold Qdiv in q0.
+ rewrite <- Qmult_assoc in q0. rewrite <- (Qmult_comm q) in q0.
+ rewrite Qmult_inv_r in q0. rewrite Qmult_1_r in q0.
+ unfold Qlt; simpl. unfold Qlt in q0; simpl in q0.
+ rewrite Z.mul_1_r in q0. destruct q; simpl. simpl in q0.
+ destruct Qnum. apply q0.
+ rewrite <- Pos2Z.inj_mul. rewrite Pos.mul_comm. apply q0.
+ inversion H. intro abs. rewrite abs in H. apply (Qlt_irrefl 0 H).
+Qed.
+
+(* A rational number has a constant Cauchy sequence realizing it
+ as a real number, which increases the precision of the majoration
+ by a factor 2. *)
+Lemma CRealLtQ : forall (x : CReal) (q : Q),
+ CRealLt x (inject_Q q)
+ -> forall p:positive, Qlt (proj1_sig x (Pos.to_nat p)) (q + (1#p)).
+Proof.
+ intros [xn cau] q maj p. simpl.
+ destruct (Qlt_le_dec (xn (Pos.to_nat p)) (q + (1 # p))). assumption.
+ exfalso.
+ apply CRealLt_above in maj.
+ destruct maj as [k maj]; simpl in maj.
+ specialize (maj (Pos.max k p) (Pos.le_max_l _ _)).
+ specialize (cau p (Pos.to_nat p) (Pos.to_nat (Pos.max k p)) (le_refl _)).
+ pose proof (Qplus_lt_le_compat (2#k) (q - xn (Pos.to_nat (Pos.max k p)))
+ (q + (1 # p)) (xn (Pos.to_nat p)) maj q0).
+ rewrite Qplus_comm in H. unfold Qminus in H. rewrite <- Qplus_assoc in H.
+ rewrite <- Qplus_assoc in H. apply Qplus_lt_r in H.
+ rewrite <- (Qplus_lt_r _ _ (xn (Pos.to_nat p))) in maj.
+ apply (Qlt_not_le (1#p) ((1 # p) + (2 # k))).
+ rewrite <- (Qplus_0_r (1#p)). rewrite <- Qplus_assoc.
+ apply Qplus_lt_r. reflexivity.
+ apply Qlt_le_weak.
+ apply (Qlt_trans _ (- xn (Pos.to_nat (Pos.max k p)) + xn (Pos.to_nat p)) _ H).
+ rewrite Qplus_comm.
+ apply (Qle_lt_trans _ (Qabs (xn (Pos.to_nat p) - xn (Pos.to_nat (Pos.max k p))))).
+ apply Qle_Qabs. apply cau. apply Pos2Nat.inj_le. apply Pos.le_max_r.
+Qed.
+
+Lemma CRealLtQopp : forall (x : CReal) (q : Q),
+ CRealLt (inject_Q q) x
+ -> forall p:positive, Qlt (q - (1#p)) (proj1_sig x (Pos.to_nat p)).
+Proof.
+ intros [xn cau] q maj p. simpl.
+ destruct (Qlt_le_dec (q - (1 # p)) (xn (Pos.to_nat p))). assumption.
+ exfalso.
+ apply CRealLt_above in maj.
+ destruct maj as [k maj]; simpl in maj.
+ specialize (maj (Pos.max k p) (Pos.le_max_l _ _)).
+ specialize (cau p (Pos.to_nat (Pos.max k p)) (Pos.to_nat p)).
+ pose proof (Qplus_lt_le_compat (2#k) (xn (Pos.to_nat (Pos.max k p)) - q)
+ (xn (Pos.to_nat p)) (q - (1 # p)) maj q0).
+ unfold Qminus in H. rewrite <- Qplus_assoc in H.
+ rewrite (Qplus_assoc (-q)) in H. rewrite (Qplus_comm (-q)) in H.
+ rewrite Qplus_opp_r in H. rewrite Qplus_0_l in H.
+ apply (Qplus_lt_l _ _ (1#p)) in H.
+ rewrite <- (Qplus_assoc (xn (Pos.to_nat (Pos.max k p)))) in H.
+ rewrite (Qplus_comm (-(1#p))) in H. rewrite Qplus_opp_r in H.
+ rewrite Qplus_0_r in H. rewrite Qplus_comm in H.
+ rewrite Qplus_assoc in H. apply (Qplus_lt_l _ _ (- xn (Pos.to_nat p))) in H.
+ rewrite <- Qplus_assoc in H. rewrite Qplus_opp_r in H. rewrite Qplus_0_r in H.
+ apply (Qlt_not_le (1#p) ((1 # p) + (2 # k))).
+ rewrite <- (Qplus_0_r (1#p)). rewrite <- Qplus_assoc.
+ apply Qplus_lt_r. reflexivity.
+ apply Qlt_le_weak.
+ apply (Qlt_trans _ (xn (Pos.to_nat (Pos.max k p)) - xn (Pos.to_nat p)) _ H).
+ apply (Qle_lt_trans _ (Qabs (xn (Pos.to_nat (Pos.max k p)) - xn (Pos.to_nat p)))).
+ apply Qle_Qabs. apply cau. apply Pos2Nat.inj_le.
+ apply Pos.le_max_r. apply le_refl.
+Qed.
+
+Lemma inject_Q_compare : forall (x : CReal) (p : positive),
+ x <= inject_Q (proj1_sig x (Pos.to_nat p) + (1#p)).
+Proof.
+ intros. intros [n nmaj].
+ destruct x as [xn xcau]; simpl in nmaj.
+ apply (Qplus_lt_l _ _ (1#p)) in nmaj.
+ ring_simplify in nmaj.
+ destruct (Pos.max_dec p n).
+ - apply Pos.max_l_iff in e.
+ apply Pos2Nat.inj_le in e.
+ specialize (xcau n (Pos.to_nat n) (Pos.to_nat p) (le_refl _) e).
+ apply (Qlt_le_trans _ _ (Qabs (xn (Pos.to_nat n) + -1 * xn (Pos.to_nat p)))) in nmaj.
+ 2: apply Qle_Qabs.
+ apply (Qlt_trans _ _ _ nmaj) in xcau.
+ apply (Qplus_lt_l _ _ (-(1#n)-(1#p))) in xcau. ring_simplify in xcau.
+ setoid_replace ((2 # n) + -1 * (1 # n)) with (1#n)%Q in xcau.
+ discriminate xcau. setoid_replace (-1 * (1 # n)) with (-1#n)%Q. 2: reflexivity.
+ rewrite Qinv_plus_distr. reflexivity.
+ - apply Pos.max_r_iff, Pos2Nat.inj_le in e.
+ specialize (xcau p (Pos.to_nat n) (Pos.to_nat p) e (le_refl _)).
+ apply (Qlt_le_trans _ _ (Qabs (xn (Pos.to_nat n) + -1 * xn (Pos.to_nat p)))) in nmaj.
+ 2: apply Qle_Qabs.
+ apply (Qlt_trans _ _ _ nmaj) in xcau.
+ apply (Qplus_lt_l _ _ (-(1#p))) in xcau. ring_simplify in xcau. discriminate.
+Qed.
+
+
+Add Parametric Morphism : inject_Q
+ with signature Qeq ==> CRealEq
+ as inject_Q_morph.
+Proof.
+ split.
+ - intros [n abs]. simpl in abs. rewrite H in abs.
+ unfold Qminus in abs. rewrite Qplus_opp_r in abs. discriminate abs.
+ - intros [n abs]. simpl in abs. rewrite H in abs.
+ unfold Qminus in abs. rewrite Qplus_opp_r in abs. discriminate abs.
+Qed.
+
+Instance inject_Q_morph_T
+ : CMorphisms.Proper
+ (CMorphisms.respectful Qeq CRealEq) inject_Q.
+Proof.
+ split.
+ - intros [n abs]. simpl in abs. rewrite H in abs.
+ unfold Qminus in abs. rewrite Qplus_opp_r in abs. discriminate abs.
+ - intros [n abs]. simpl in abs. rewrite H in abs.
+ unfold Qminus in abs. rewrite Qplus_opp_r in abs. discriminate abs.
+Qed.
+
+
+
+(* Algebraic operations *)
+
+Lemma CReal_plus_cauchy
+ : forall (xn yn zn : nat -> Q) (cvmod : positive -> nat),
+ QSeqEquiv xn yn cvmod
+ -> QCauchySeq zn Pos.to_nat
+ -> QSeqEquiv (fun n:nat => xn n + zn n) (fun n:nat => yn n + zn n)
+ (fun p => max (cvmod (2 * p)%positive)
+ (Pos.to_nat (2 * p)%positive)).
+Proof.
+ intros. intros p n k H1 H2.
+ setoid_replace (xn n + zn n - (yn k + zn k))
+ with (xn n - yn k + (zn n - zn k)).
+ 2: field.
+ apply (Qle_lt_trans _ (Qabs (xn n - yn k) + Qabs (zn n - zn k))).
+ apply Qabs_triangle.
+ setoid_replace (1#p)%Q with ((1#2*p) + (1#2*p))%Q.
+ apply Qplus_lt_le_compat.
+ - apply H. apply (le_trans _ (Init.Nat.max (cvmod (2 * p)%positive) (Pos.to_nat (2 * p)))).
+ apply Nat.le_max_l. apply H1.
+ apply (le_trans _ (Init.Nat.max (cvmod (2 * p)%positive) (Pos.to_nat (2 * p)))).
+ apply Nat.le_max_l. apply H2.
+ - apply Qle_lteq. left. apply H0.
+ apply (le_trans _ (Init.Nat.max (cvmod (2 * p)%positive) (Pos.to_nat (2 * p)))).
+ apply Nat.le_max_r. apply H1.
+ apply (le_trans _ (Init.Nat.max (cvmod (2 * p)%positive) (Pos.to_nat (2 * p)))).
+ apply Nat.le_max_r. apply H2.
+ - rewrite Qinv_plus_distr. unfold Qeq. reflexivity.
+Qed.
+
+Definition CReal_plus (x y : CReal) : CReal.
+Proof.
+ destruct x as [xn limx], y as [yn limy].
+ pose proof (CReal_plus_cauchy xn xn yn Pos.to_nat limx limy).
+ exists (fun n : nat => xn (2 * n)%nat + yn (2 * n)%nat).
+ intros p k n H0 H1. apply H.
+ - rewrite max_l. rewrite Pos2Nat.inj_mul.
+ apply Nat.mul_le_mono_nonneg. apply le_0_n. apply le_refl.
+ apply le_0_n. apply H0. apply le_refl.
+ - rewrite Pos2Nat.inj_mul. rewrite max_l.
+ apply Nat.mul_le_mono_nonneg. apply le_0_n. apply le_refl.
+ apply le_0_n. apply H1. apply le_refl.
+Defined.
+
+Infix "+" := CReal_plus : CReal_scope.
+
+Lemma CReal_plus_nth : forall (x y : CReal) (n : nat),
+ proj1_sig (x + y) n = Qplus (proj1_sig x (2*n)%nat) (proj1_sig y (2*n)%nat).
+Proof.
+ intros. destruct x,y; reflexivity.
+Qed.
+
+Lemma CReal_plus_unfold : forall (x y : CReal),
+ QSeqEquiv (proj1_sig (CReal_plus x y))
+ (fun n : nat => proj1_sig x n + proj1_sig y n)%Q
+ (fun p => Pos.to_nat (2 * p)).
+Proof.
+ intros [xn limx] [yn limy].
+ unfold CReal_plus; simpl.
+ intros p n k H H0.
+ setoid_replace (xn (2 * n)%nat + yn (2 * n)%nat - (xn k + yn k))%Q
+ with (xn (2 * n)%nat - xn k + (yn (2 * n)%nat - yn k))%Q.
+ 2: field.
+ apply (Qle_lt_trans _ (Qabs (xn (2 * n)%nat - xn k) + Qabs (yn (2 * n)%nat - yn k))).
+ apply Qabs_triangle.
+ setoid_replace (1#p)%Q with ((1#2*p) + (1#2*p))%Q.
+ apply Qplus_lt_le_compat.
+ - apply limx. apply (le_trans _ n). apply H.
+ rewrite <- (mult_1_l n). rewrite mult_assoc.
+ apply Nat.mul_le_mono_nonneg. auto. simpl. auto.
+ apply le_0_n. apply le_refl. apply H0.
+ - apply Qlt_le_weak. apply limy. apply (le_trans _ n). apply H.
+ rewrite <- (mult_1_l n). rewrite mult_assoc.
+ apply Nat.mul_le_mono_nonneg. auto. simpl. auto.
+ apply le_0_n. apply le_refl. apply H0.
+ - rewrite Qinv_plus_distr. unfold Qeq. reflexivity.
+Qed.
+
+Definition CReal_opp (x : CReal) : CReal.
+Proof.
+ destruct x as [xn limx].
+ exists (fun n : nat => - xn n).
+ intros k p q H H0. unfold Qminus. rewrite Qopp_involutive.
+ rewrite Qplus_comm. apply limx; assumption.
+Defined.
+
+Notation "- x" := (CReal_opp x) : CReal_scope.
+
+Definition CReal_minus (x y : CReal) : CReal
+ := CReal_plus x (CReal_opp y).
+
+Infix "-" := CReal_minus : CReal_scope.
+
+Lemma belowMultiple : forall n p : nat, lt 0 p -> le n (p * n).
+Proof.
+ intros. rewrite <- (mult_1_l n). apply Nat.mul_le_mono_nonneg.
+ auto. assumption. apply le_0_n. rewrite mult_1_l. apply le_refl.
+Qed.
+
+Lemma CReal_plus_assoc : forall (x y z : CReal),
+ CRealEq (CReal_plus (CReal_plus x y) z)
+ (CReal_plus x (CReal_plus y z)).
+Proof.
+ intros. apply CRealEq_diff. intro n.
+ destruct x as [xn limx], y as [yn limy], z as [zn limz].
+ unfold CReal_plus; unfold proj1_sig.
+ setoid_replace (xn (2 * (2 * Pos.to_nat n))%nat + yn (2 * (2 * Pos.to_nat n))%nat
+ + zn (2 * Pos.to_nat n)%nat
+ - (xn (2 * Pos.to_nat n)%nat + (yn (2 * (2 * Pos.to_nat n))%nat
+ + zn (2 * (2 * Pos.to_nat n))%nat)))%Q
+ with (xn (2 * (2 * Pos.to_nat n))%nat - xn (2 * Pos.to_nat n)%nat
+ + (zn (2 * Pos.to_nat n)%nat - zn (2 * (2 * Pos.to_nat n))%nat))%Q.
+ apply (Qle_trans _ (Qabs (xn (2 * (2 * Pos.to_nat n))%nat - xn (2 * Pos.to_nat n)%nat)
+ + Qabs (zn (2 * Pos.to_nat n)%nat - zn (2 * (2 * Pos.to_nat n))%nat))).
+ apply Qabs_triangle.
+ rewrite <- (Qinv_plus_distr 1 1 n). apply Qplus_le_compat.
+ apply Qle_lteq. left. apply limx. rewrite mult_assoc.
+ apply belowMultiple. simpl. auto. apply belowMultiple. auto.
+ apply Qle_lteq. left. apply limz. apply belowMultiple. auto.
+ rewrite mult_assoc. apply belowMultiple. simpl. auto. field.
+Qed.
+
+Lemma CReal_plus_comm : forall x y : CReal,
+ x + y == y + x.
+Proof.
+ intros [xn limx] [yn limy]. apply CRealEq_diff. intros.
+ unfold CReal_plus, proj1_sig.
+ setoid_replace (xn (2 * Pos.to_nat n)%nat + yn (2 * Pos.to_nat n)%nat
+ - (yn (2 * Pos.to_nat n)%nat + xn (2 * Pos.to_nat n)%nat))%Q
+ with 0%Q.
+ unfold Qle. simpl. unfold Z.le. intro absurd. inversion absurd.
+ field.
+Qed.
+
+Lemma CReal_plus_0_l : forall r : CReal,
+ CRealEq (CReal_plus (inject_Q 0) r) r.
+Proof.
+ intro r. assert (forall n:nat, le n (2 * n)).
+ { intro n. simpl. rewrite <- (plus_0_r n). rewrite <- plus_assoc.
+ apply Nat.add_le_mono_l. apply le_0_n. }
+ split.
+ - intros [n maj]. destruct r as [xn q]; unfold CReal_plus, proj1_sig, inject_Q in maj.
+ rewrite Qplus_0_l in maj.
+ specialize (q n (Pos.to_nat n) (mult 2 (Pos.to_nat n)) (le_refl _)).
+ apply (Qlt_not_le (2#n) (xn (Pos.to_nat n) - xn (2 * Pos.to_nat n)%nat)).
+ assumption.
+ apply (Qle_trans _ (Qabs (xn (Pos.to_nat n) - xn (2 * Pos.to_nat n)%nat))).
+ apply Qle_Qabs. apply (Qle_trans _ (1#n)). apply Qlt_le_weak. apply q.
+ apply H. unfold Qle, Z.le; simpl. apply Pos2Nat.inj_le. rewrite Pos2Nat.inj_xO.
+ apply H.
+ - intros [n maj]. destruct r as [xn q]; unfold CReal_plus, proj1_sig, inject_Q in maj.
+ rewrite Qplus_0_l in maj.
+ specialize (q n (Pos.to_nat n) (mult 2 (Pos.to_nat n)) (le_refl _)).
+ rewrite Qabs_Qminus in q.
+ apply (Qlt_not_le (2#n) (xn (mult 2 (Pos.to_nat n)) - xn (Pos.to_nat n))).
+ assumption.
+ apply (Qle_trans _ (Qabs (xn (mult 2 (Pos.to_nat n)) - xn (Pos.to_nat n)))).
+ apply Qle_Qabs. apply (Qle_trans _ (1#n)). apply Qlt_le_weak. apply q.
+ apply H. unfold Qle, Z.le; simpl. apply Pos2Nat.inj_le. rewrite Pos2Nat.inj_xO.
+ apply H.
+Qed.
+
+Lemma CReal_plus_0_r : forall r : CReal,
+ r + 0 == r.
+Proof.
+ intro r. rewrite CReal_plus_comm. apply CReal_plus_0_l.
+Qed.
+
+Lemma CReal_plus_lt_compat_l :
+ forall x y z : CReal, y < z -> x + y < x + z.
+Proof.
+ intros.
+ apply CRealLt_above in H. destruct H as [n maj].
+ exists n. specialize (maj (xO n)).
+ rewrite Pos2Nat.inj_xO in maj.
+ setoid_replace (proj1_sig (CReal_plus x z) (Pos.to_nat n)
+ - proj1_sig (CReal_plus x y) (Pos.to_nat n))%Q
+ with (proj1_sig z (2 * Pos.to_nat n)%nat - proj1_sig y (2 * Pos.to_nat n)%nat)%Q.
+ apply maj. apply Pos2Nat.inj_le.
+ rewrite <- (plus_0_r (Pos.to_nat n)). rewrite Pos2Nat.inj_xO.
+ simpl. apply Nat.add_le_mono_l. apply le_0_n.
+ simpl. destruct x as [xn limx], y as [yn limy], z as [zn limz].
+ simpl; ring.
+Qed.
+
+Lemma CReal_plus_lt_compat_r :
+ forall x y z : CReal, y < z -> y + x < z + x.
+Proof.
+ intros. do 2 rewrite <- (CReal_plus_comm x).
+ apply CReal_plus_lt_compat_l. assumption.
+Qed.
+
+Lemma CReal_plus_lt_reg_l :
+ forall x y z : CReal, x + y < x + z -> y < z.
+Proof.
+ intros. destruct H as [n maj]. exists (2*n)%positive.
+ setoid_replace (proj1_sig z (Pos.to_nat (2 * n)) - proj1_sig y (Pos.to_nat (2 * n)))%Q
+ with (proj1_sig (CReal_plus x z) (Pos.to_nat n) - proj1_sig (CReal_plus x y) (Pos.to_nat n))%Q.
+ apply (Qle_lt_trans _ (2#n)). unfold Qle, Z.le; simpl. apply Pos2Nat.inj_le.
+ rewrite <- (plus_0_r (Pos.to_nat n~0)). rewrite (Pos2Nat.inj_xO (n~0)).
+ simpl. apply Nat.add_le_mono_l. apply le_0_n.
+ apply maj. rewrite Pos2Nat.inj_xO.
+ destruct x as [xn limx], y as [yn limy], z as [zn limz].
+ simpl; ring.
+Qed.
+
+Lemma CReal_plus_lt_reg_r :
+ forall x y z : CReal, y + x < z + x -> y < z.
+Proof.
+ intros x y z H. rewrite (CReal_plus_comm y), (CReal_plus_comm z) in H.
+ apply CReal_plus_lt_reg_l in H. exact H.
+Qed.
+
+Lemma CReal_plus_le_reg_l :
+ forall x y z : CReal, x + y <= x + z -> y <= z.
+Proof.
+ intros. intro abs. apply H. clear H.
+ apply CReal_plus_lt_compat_l. exact abs.
+Qed.
+
+Lemma CReal_plus_le_reg_r :
+ forall x y z : CReal, y + x <= z + x -> y <= z.
+Proof.
+ intros. intro abs. apply H. clear H.
+ apply CReal_plus_lt_compat_r. exact abs.
+Qed.
+
+Lemma CReal_plus_le_compat_l : forall r r1 r2, r1 <= r2 -> r + r1 <= r + r2.
+Proof.
+ intros. intro abs. apply CReal_plus_lt_reg_l in abs. contradiction.
+Qed.
+
+Lemma CReal_plus_le_lt_compat :
+ forall r1 r2 r3 r4 : CReal, r1 <= r2 -> r3 < r4 -> r1 + r3 < r2 + r4.
+Proof.
+ intros; apply CReal_le_lt_trans with (r2 + r3).
+ intro abs. rewrite CReal_plus_comm, (CReal_plus_comm r1) in abs.
+ apply CReal_plus_lt_reg_l in abs. contradiction.
+ apply CReal_plus_lt_compat_l; exact H0.
+Qed.
+
+Lemma CReal_plus_le_compat :
+ forall r1 r2 r3 r4 : CReal, r1 <= r2 -> r3 <= r4 -> r1 + r3 <= r2 + r4.
+Proof.
+ intros; apply CReal_le_trans with (r2 + r3).
+ intro abs. rewrite CReal_plus_comm, (CReal_plus_comm r1) in abs.
+ apply CReal_plus_lt_reg_l in abs. contradiction.
+ apply CReal_plus_le_compat_l; exact H0.
+Qed.
+
+Lemma CReal_plus_opp_r : forall x : CReal,
+ x + - x == 0.
+Proof.
+ intros [xn limx]. apply CRealEq_diff. intros.
+ unfold CReal_plus, CReal_opp, inject_Q, proj1_sig.
+ setoid_replace (xn (2 * Pos.to_nat n)%nat + - xn (2 * Pos.to_nat n)%nat - 0)%Q
+ with 0%Q.
+ unfold Qle. simpl. unfold Z.le. intro absurd. inversion absurd. field.
+Qed.
+
+Lemma CReal_plus_opp_l : forall x : CReal,
+ - x + x == 0.
+Proof.
+ intro x. rewrite CReal_plus_comm. apply CReal_plus_opp_r.
+Qed.
+
+Lemma CReal_plus_proper_r : forall x y z : CReal,
+ CRealEq x y -> CRealEq (CReal_plus x z) (CReal_plus y z).
+Proof.
+ intros. apply (CRealEq_trans _ (CReal_plus z x)).
+ apply CReal_plus_comm. apply (CRealEq_trans _ (CReal_plus z y)).
+ 2: apply CReal_plus_comm.
+ split. intro abs. apply CReal_plus_lt_reg_l in abs.
+ destruct H. contradiction. intro abs. apply CReal_plus_lt_reg_l in abs.
+ destruct H. contradiction.
+Qed.
+
+Lemma CReal_plus_proper_l : forall x y z : CReal,
+ CRealEq x y -> CRealEq (CReal_plus z x) (CReal_plus z y).
+Proof.
+ intros. split. intro abs. apply CReal_plus_lt_reg_l in abs.
+ destruct H. contradiction. intro abs. apply CReal_plus_lt_reg_l in abs.
+ destruct H. contradiction.
+Qed.
+
+Add Parametric Morphism : CReal_plus
+ with signature CRealEq ==> CRealEq ==> CRealEq
+ as CReal_plus_morph.
+Proof.
+ intros x y H z t H0. apply (CRealEq_trans _ (CReal_plus x t)).
+ - destruct H0.
+ split. intro abs. apply CReal_plus_lt_reg_l in abs. contradiction.
+ intro abs. apply CReal_plus_lt_reg_l in abs. contradiction.
+ - apply CReal_plus_proper_r. apply H.
+Qed.
+
+Instance CReal_plus_morph_T
+ : CMorphisms.Proper
+ (CMorphisms.respectful CRealEq (CMorphisms.respectful CRealEq CRealEq)) CReal_plus.
+Proof.
+ intros x y H z t H0. apply (CRealEq_trans _ (CReal_plus x t)).
+ - destruct H0.
+ split. intro abs. apply CReal_plus_lt_reg_l in abs. contradiction.
+ intro abs. apply CReal_plus_lt_reg_l in abs. contradiction.
+ - apply CReal_plus_proper_r. apply H.
+Qed.
+
+Lemma CReal_plus_eq_reg_l : forall (r r1 r2 : CReal),
+ r + r1 == r + r2 -> r1 == r2.
+Proof.
+ intros. destruct H. split.
+ - intro abs. apply (CReal_plus_lt_compat_l r) in abs. contradiction.
+ - intro abs. apply (CReal_plus_lt_compat_l r) in abs. contradiction.
+Qed.
+
+Lemma CReal_opp_0 : -0 == 0.
+Proof.
+ apply (CReal_plus_eq_reg_l 0).
+ rewrite CReal_plus_0_r, CReal_plus_opp_r. reflexivity.
+Qed.
+
+Lemma CReal_opp_plus_distr : forall r1 r2, - (r1 + r2) == - r1 + - r2.
+Proof.
+ intros. apply (CReal_plus_eq_reg_l (r1+r2)).
+ rewrite CReal_plus_opp_r, (CReal_plus_comm (-r1)), CReal_plus_assoc.
+ rewrite <- (CReal_plus_assoc r2), CReal_plus_opp_r, CReal_plus_0_l.
+ rewrite CReal_plus_opp_r. reflexivity.
+Qed.
+
+Lemma CReal_opp_involutive : forall x:CReal, --x == x.
+Proof.
+ intros. apply (CReal_plus_eq_reg_l (-x)).
+ rewrite CReal_plus_opp_l, CReal_plus_opp_r. reflexivity.
+Qed.
+
+Lemma CReal_opp_gt_lt_contravar : forall r1 r2, r1 > r2 -> - r1 < - r2.
+Proof.
+ unfold CRealGt; intros.
+ apply (CReal_plus_lt_reg_l (r2 + r1)).
+ rewrite CReal_plus_assoc, CReal_plus_opp_r, CReal_plus_0_r.
+ rewrite CReal_plus_comm, <- CReal_plus_assoc, CReal_plus_opp_l.
+ rewrite CReal_plus_0_l. exact H.
+Qed.
+
+Lemma CReal_opp_ge_le_contravar : forall r1 r2, r1 >= r2 -> - r1 <= - r2.
+Proof.
+ intros. intro abs. apply H. clear H.
+ apply (CReal_plus_lt_reg_r (-r1-r2)).
+ unfold CReal_minus. rewrite <- CReal_plus_assoc, CReal_plus_opp_r, CReal_plus_0_l.
+ rewrite (CReal_plus_comm (-r1)), <- CReal_plus_assoc, CReal_plus_opp_r, CReal_plus_0_l.
+ exact abs.
+Qed.
+
+Lemma inject_Q_plus : forall q r : Q,
+ inject_Q (q + r) == inject_Q q + inject_Q r.
+Proof.
+ split.
+ - intros [n nmaj]. simpl in nmaj.
+ ring_simplify in nmaj. discriminate.
+ - intros [n nmaj]. simpl in nmaj.
+ ring_simplify in nmaj. discriminate.
+Qed.
+
+Lemma inject_Q_one : inject_Q 1 == 1.
+Proof.
+ split.
+ - intros [n nmaj]. simpl in nmaj.
+ ring_simplify in nmaj. discriminate.
+ - intros [n nmaj]. simpl in nmaj.
+ ring_simplify in nmaj. discriminate.
+Qed.
+
+Lemma inject_Q_lt : forall q r : Q,
+ Qlt q r -> inject_Q q < inject_Q r.
+Proof.
+ intros. destruct (Qarchimedean (/(r-q))).
+ exists (2*x)%positive; simpl.
+ setoid_replace (2 # x~0)%Q with (/(Z.pos x#1))%Q. 2: reflexivity.
+ apply Qlt_shift_inv_r. reflexivity.
+ apply (Qmult_lt_l _ _ (r-q)) in q0. rewrite Qmult_inv_r in q0.
+ exact q0. intro abs. rewrite Qlt_minus_iff in H.
+ unfold Qminus in abs. rewrite abs in H. discriminate H.
+ unfold Qminus. rewrite <- Qlt_minus_iff. exact H.
+Qed.
+
+Lemma opp_inject_Q : forall q : Q,
+ inject_Q (-q) == - inject_Q q.
+Proof.
+ split.
+ - intros [n maj]. simpl in maj. ring_simplify in maj. discriminate.
+ - intros [n maj]. simpl in maj. ring_simplify in maj. discriminate.
+Qed.
+
+Lemma lt_inject_Q : forall q r : Q,
+ inject_Q q < inject_Q r -> Qlt q r.
+Proof.
+ intros. destruct H. simpl in q0.
+ apply Qlt_minus_iff, (Qlt_trans _ (2#x)).
+ reflexivity. exact q0.
+Qed.
+
+Lemma le_inject_Q : forall q r : Q,
+ inject_Q q <= inject_Q r -> Qle q r.
+Proof.
+ intros. destruct (Qlt_le_dec r q). 2: exact q0.
+ exfalso. apply H. clear H. apply inject_Q_lt. exact q0.
+Qed.
+
+Lemma inject_Q_le : forall q r : Q,
+ Qle q r -> inject_Q q <= inject_Q r.
+Proof.
+ intros. intros [n maj]. simpl in maj.
+ apply (Qlt_not_le _ _ maj). apply (Qle_trans _ 0).
+ apply (Qplus_le_l _ _ r). ring_simplify. exact H. discriminate.
+Qed.
+
+Lemma inject_Z_plus : forall q r : Z,
+ inject_Z (q + r) == inject_Z q + inject_Z r.
+Proof.
+ intros. unfold inject_Z.
+ setoid_replace (q + r # 1)%Q with ((q#1) + (r#1))%Q.
+ apply inject_Q_plus. rewrite Qinv_plus_distr. reflexivity.
+Qed.
+
+Lemma opp_inject_Z : forall n : Z,
+ inject_Z (-n) == - inject_Z n.
+Proof.
+ intros. unfold inject_Z.
+ setoid_replace (-n # 1)%Q with (-(n#1))%Q.
+ rewrite opp_inject_Q. reflexivity. reflexivity.
+Qed.
diff --git a/theories/Reals/Cauchy/ConstructiveCauchyRealsMult.v b/theories/Reals/Cauchy/ConstructiveCauchyRealsMult.v
new file mode 100644
index 0000000000..fa24bd988e
--- /dev/null
+++ b/theories/Reals/Cauchy/ConstructiveCauchyRealsMult.v
@@ -0,0 +1,1503 @@
+(************************************************************************)
+(* * The Coq Proof Assistant / The Coq Development Team *)
+(* v * Copyright INRIA, CNRS and contributors *)
+(* Q) (k : nat) (A : positive) { struct k }
+ : (forall n:nat, le k n -> Qlt (Qabs (qn n)) (Z.pos A # 1))
+ -> { B : positive | forall n:nat, Qlt (Qabs (qn n)) (Z.pos B # 1) }.
+Proof.
+ intro H. destruct k.
+ - exists A. intros. apply H. apply le_0_n.
+ - destruct (Qarchimedean (Qabs (qn k))) as [a maj].
+ apply (BoundFromZero qn k (Pos.max A a)).
+ intros n H0. destruct (Nat.le_gt_cases n k).
+ + pose proof (Nat.le_antisymm n k H1 H0). subst k.
+ apply (Qlt_le_trans _ (Z.pos a # 1)). apply maj.
+ unfold Qle; simpl. rewrite Pos.mul_1_r. rewrite Pos.mul_1_r.
+ apply Pos.le_max_r.
+ + apply (Qlt_le_trans _ (Z.pos A # 1)). apply H.
+ apply H1. unfold Qle; simpl. rewrite Pos.mul_1_r. rewrite Pos.mul_1_r.
+ apply Pos.le_max_l.
+Qed.
+
+Lemma QCauchySeq_bounded (qn : nat -> Q) (cvmod : positive -> nat)
+ : QCauchySeq qn cvmod
+ -> { A : positive | forall n:nat, Qlt (Qabs (qn n)) (Z.pos A # 1) }.
+Proof.
+ intros. remember (Zplus (Qnum (Qabs (qn (cvmod xH)))) 1) as z.
+ assert (Z.lt 0 z) as zPos.
+ { subst z. assert (Qle 0 (Qabs (qn (cvmod 1%positive)))).
+ apply Qabs_nonneg. destruct (Qabs (qn (cvmod 1%positive))). simpl.
+ unfold Qle in H0. simpl in H0. rewrite Zmult_1_r in H0.
+ apply (Z.lt_le_trans 0 1). unfold Z.lt. auto.
+ rewrite <- (Zplus_0_l 1). rewrite Zplus_assoc. apply Zplus_le_compat_r.
+ rewrite Zplus_0_r. assumption. }
+ assert { A : positive | forall n:nat,
+ le (cvmod xH) n -> Qlt ((Qabs (qn n)) * (1#A)) 1 }.
+ destruct z eqn:des.
+ - exfalso. apply (Z.lt_irrefl 0). assumption.
+ - exists p. intros. specialize (H xH (cvmod xH) n (le_refl _) H0).
+ assert (Qlt (Qabs (qn n)) (Qabs (qn (cvmod 1%positive)) + 1)).
+ { apply (Qplus_lt_l _ _ (-Qabs (qn (cvmod 1%positive)))).
+ rewrite <- (Qplus_comm 1). rewrite <- Qplus_assoc. rewrite Qplus_opp_r.
+ rewrite Qplus_0_r. apply (Qle_lt_trans _ (Qabs (qn n - qn (cvmod 1%positive)))).
+ apply Qabs_triangle_reverse. rewrite Qabs_Qminus. assumption. }
+ apply (Qlt_le_trans _ ((Qabs (qn (cvmod 1%positive)) + 1) * (1#p))).
+ apply Qmult_lt_r. unfold Qlt. simpl. unfold Z.lt. auto. assumption.
+ unfold Qle. simpl. rewrite Zmult_1_r. rewrite Zmult_1_r. rewrite Zmult_1_r.
+ rewrite Pos.mul_1_r. rewrite Pos2Z.inj_mul. rewrite Heqz.
+ destruct (Qabs (qn (cvmod 1%positive))) eqn:desAbs.
+ rewrite Z.mul_add_distr_l. rewrite Zmult_1_r.
+ apply Zplus_le_compat_r. rewrite <- (Zmult_1_l (QArith_base.Qnum (Qnum # Qden))).
+ rewrite Zmult_assoc. apply Zmult_le_compat_r. rewrite Zmult_1_r.
+ simpl. unfold Z.le. rewrite <- Pos2Z.inj_compare.
+ unfold Pos.compare. destruct Qden; discriminate.
+ simpl. assert (Qle 0 (Qnum # Qden)). rewrite <- desAbs.
+ apply Qabs_nonneg. unfold Qle in H2. simpl in H2. rewrite Zmult_1_r in H2.
+ assumption.
+ - exfalso. inversion zPos.
+ - destruct H0. apply (BoundFromZero _ (cvmod xH) x). intros n H0.
+ specialize (q n H0). setoid_replace (Z.pos x # 1)%Q with (/(1#x))%Q.
+ rewrite <- (Qmult_1_l (/(1#x))). apply Qlt_shift_div_l.
+ reflexivity. apply q. reflexivity.
+Qed.
+
+Lemma CReal_mult_cauchy
+ : forall (xn yn zn : nat -> Q) (Ay Az : positive) (cvmod : positive -> nat),
+ QSeqEquiv xn yn cvmod
+ -> QCauchySeq zn Pos.to_nat
+ -> (forall n:nat, Qlt (Qabs (yn n)) (Z.pos Ay # 1))
+ -> (forall n:nat, Qlt (Qabs (zn n)) (Z.pos Az # 1))
+ -> QSeqEquiv (fun n:nat => xn n * zn n) (fun n:nat => yn n * zn n)
+ (fun p => max (cvmod (2 * (Pos.max Ay Az) * p)%positive)
+ (Pos.to_nat (2 * (Pos.max Ay Az) * p)%positive)).
+Proof.
+ intros xn yn zn Ay Az cvmod limx limz majy majz.
+ remember (Pos.mul 2 (Pos.max Ay Az)) as z.
+ intros k p q H H0.
+ assert (Pos.to_nat k <> O) as kPos.
+ { intro absurd. pose proof (Pos2Nat.is_pos k).
+ rewrite absurd in H1. inversion H1. }
+ setoid_replace (xn p * zn p - yn q * zn q)%Q
+ with ((xn p - yn q) * zn p + yn q * (zn p - zn q))%Q.
+ 2: ring.
+ apply (Qle_lt_trans _ (Qabs ((xn p - yn q) * zn p)
+ + Qabs (yn q * (zn p - zn q)))).
+ apply Qabs_triangle. rewrite Qabs_Qmult. rewrite Qabs_Qmult.
+ setoid_replace (1#k)%Q with ((1#2*k) + (1#2*k))%Q.
+ apply Qplus_lt_le_compat.
+ - apply (Qle_lt_trans _ ((1#z * k) * Qabs (zn p)%nat)).
+ + apply Qmult_le_compat_r. apply Qle_lteq. left. apply limx.
+ apply (le_trans _ (Init.Nat.max (cvmod (z * k)%positive) (Pos.to_nat (z * k)))).
+ apply Nat.le_max_l. assumption.
+ apply (le_trans _ (Init.Nat.max (cvmod (z * k)%positive) (Pos.to_nat (z * k)))).
+ apply Nat.le_max_l. assumption. apply Qabs_nonneg.
+ + subst z. rewrite <- (Qmult_1_r (1 # 2 * k)).
+ rewrite <- Pos.mul_assoc. rewrite <- (Pos.mul_comm k). rewrite Pos.mul_assoc.
+ rewrite (factorDenom _ _ (2 * k)). rewrite <- Qmult_assoc.
+ apply Qmult_lt_l. unfold Qlt. simpl. unfold Z.lt. auto.
+ apply (Qle_lt_trans _ (Qabs (zn p)%nat * (1 # Az))).
+ rewrite <- (Qmult_comm (1 # Az)). apply Qmult_le_compat_r.
+ unfold Qle. simpl. rewrite Pos2Z.inj_max. apply Z.le_max_r.
+ apply Qabs_nonneg. rewrite <- (Qmult_inv_r (1#Az)).
+ rewrite Qmult_comm. apply Qmult_lt_l. reflexivity.
+ setoid_replace (/(1#Az))%Q with (Z.pos Az # 1)%Q. apply majz.
+ reflexivity. intro abs. inversion abs.
+ - apply (Qle_trans _ ((1 # z * k) * Qabs (yn q)%nat)).
+ + rewrite Qmult_comm. apply Qmult_le_compat_r. apply Qle_lteq.
+ left. apply limz.
+ apply (le_trans _ (max (cvmod (z * k)%positive)
+ (Pos.to_nat (z * k)%positive))).
+ apply Nat.le_max_r. assumption.
+ apply (le_trans _ (max (cvmod (z * k)%positive)
+ (Pos.to_nat (z * k)%positive))).
+ apply Nat.le_max_r. assumption. apply Qabs_nonneg.
+ + subst z. rewrite <- (Qmult_1_r (1 # 2 * k)).
+ rewrite <- Pos.mul_assoc. rewrite <- (Pos.mul_comm k). rewrite Pos.mul_assoc.
+ rewrite (factorDenom _ _ (2 * k)). rewrite <- Qmult_assoc.
+ apply Qle_lteq. left.
+ apply Qmult_lt_l. unfold Qlt. simpl. unfold Z.lt. auto.
+ apply (Qle_lt_trans _ (Qabs (yn q)%nat * (1 # Ay))).
+ rewrite <- (Qmult_comm (1 # Ay)). apply Qmult_le_compat_r.
+ unfold Qle. simpl. rewrite Pos2Z.inj_max. apply Z.le_max_l.
+ apply Qabs_nonneg. rewrite <- (Qmult_inv_r (1#Ay)).
+ rewrite Qmult_comm. apply Qmult_lt_l. reflexivity.
+ setoid_replace (/(1#Ay))%Q with (Z.pos Ay # 1)%Q. apply majy.
+ reflexivity. intro abs. inversion abs.
+ - rewrite Qinv_plus_distr. unfold Qeq. reflexivity.
+Qed.
+
+Lemma linear_max : forall (p Ax Ay : positive) (i : nat),
+ le (Pos.to_nat p) i
+ -> (Init.Nat.max (Pos.to_nat (2 * Pos.max Ax Ay * p))
+ (Pos.to_nat (2 * Pos.max Ax Ay * p)) <= Pos.to_nat (2 * Pos.max Ax Ay) * i)%nat.
+Proof.
+ intros. rewrite max_l. 2: apply le_refl.
+ rewrite Pos2Nat.inj_mul. apply Nat.mul_le_mono_nonneg.
+ apply le_0_n. apply le_refl. apply le_0_n. apply H.
+Qed.
+
+Definition CReal_mult (x y : CReal) : CReal.
+Proof.
+ destruct x as [xn limx]. destruct y as [yn limy].
+ destruct (QCauchySeq_bounded xn Pos.to_nat limx) as [Ax majx].
+ destruct (QCauchySeq_bounded yn Pos.to_nat limy) as [Ay majy].
+ pose proof (CReal_mult_cauchy xn xn yn Ax Ay Pos.to_nat limx limy majx majy).
+ exists (fun n : nat => xn (Pos.to_nat (2 * Pos.max Ax Ay)* n)%nat
+ * yn (Pos.to_nat (2 * Pos.max Ax Ay) * n)%nat).
+ intros p n k H0 H1.
+ apply H; apply linear_max; assumption.
+Defined.
+
+Infix "*" := CReal_mult : CReal_scope.
+
+Lemma CReal_mult_unfold : forall x y : CReal,
+ QSeqEquivEx (proj1_sig (CReal_mult x y))
+ (fun n : nat => proj1_sig x n * proj1_sig y n)%Q.
+Proof.
+ intros [xn limx] [yn limy]. unfold CReal_mult ; simpl.
+ destruct (QCauchySeq_bounded xn Pos.to_nat limx) as [Ax majx].
+ destruct (QCauchySeq_bounded yn Pos.to_nat limy) as [Ay majy].
+ simpl.
+ pose proof (CReal_mult_cauchy xn xn yn Ax Ay Pos.to_nat limx limy majx majy).
+ exists (fun p : positive =>
+ Init.Nat.max (Pos.to_nat (2 * Pos.max Ax Ay * p))
+ (Pos.to_nat (2 * Pos.max Ax Ay * p))).
+ intros p n k H0 H1. rewrite max_l in H0, H1.
+ 2: apply le_refl. 2: apply le_refl.
+ apply H. apply linear_max.
+ apply (le_trans _ (Pos.to_nat (2 * Pos.max Ax Ay * p))).
+ rewrite <- (mult_1_l (Pos.to_nat p)). rewrite Pos2Nat.inj_mul.
+ apply Nat.mul_le_mono_nonneg. auto. apply Pos2Nat.is_pos.
+ apply le_0_n. apply le_refl. apply H0. rewrite max_l.
+ apply H1. apply le_refl.
+Qed.
+
+Lemma CReal_mult_assoc_bounded_r : forall (xn yn zn : nat -> Q),
+ QSeqEquivEx xn yn (* both are Cauchy with same limit *)
+ -> QSeqEquiv zn zn Pos.to_nat
+ -> QSeqEquivEx (fun n => xn n * zn n)%Q (fun n => yn n * zn n)%Q.
+Proof.
+ intros. destruct H as [cvmod cveq].
+ destruct (QCauchySeq_bounded yn (fun k => cvmod (2 * k)%positive)
+ (QSeqEquiv_cau_r xn yn cvmod cveq))
+ as [Ay majy].
+ destruct (QCauchySeq_bounded zn Pos.to_nat H0) as [Az majz].
+ exists (fun p => max (cvmod (2 * (Pos.max Ay Az) * p)%positive)
+ (Pos.to_nat (2 * (Pos.max Ay Az) * p)%positive)).
+ apply CReal_mult_cauchy; assumption.
+Qed.
+
+Lemma CReal_mult_assoc : forall x y z : CReal,
+ CRealEq (CReal_mult (CReal_mult x y) z)
+ (CReal_mult x (CReal_mult y z)).
+Proof.
+ intros. apply CRealEq_diff. apply CRealEq_modindep.
+ apply (QSeqEquivEx_trans _ (fun n => proj1_sig x n * proj1_sig y n * proj1_sig z n)%Q).
+ - apply (QSeqEquivEx_trans _ (fun n => proj1_sig (CReal_mult x y) n * proj1_sig z n)%Q).
+ apply CReal_mult_unfold.
+ destruct x as [xn limx], y as [yn limy], z as [zn limz]; unfold CReal_mult; simpl.
+ destruct (QCauchySeq_bounded xn Pos.to_nat limx) as [Ax majx].
+ destruct (QCauchySeq_bounded yn Pos.to_nat limy) as [Ay majy].
+ destruct (QCauchySeq_bounded zn Pos.to_nat limz) as [Az majz].
+ apply CReal_mult_assoc_bounded_r. 2: apply limz.
+ simpl.
+ pose proof (CReal_mult_cauchy xn xn yn Ax Ay Pos.to_nat limx limy majx majy).
+ exists (fun p : positive =>
+ Init.Nat.max (Pos.to_nat (2 * Pos.max Ax Ay * p))
+ (Pos.to_nat (2 * Pos.max Ax Ay * p))).
+ intros p n k H0 H1. rewrite max_l in H0, H1.
+ 2: apply le_refl. 2: apply le_refl.
+ apply H. apply linear_max.
+ apply (le_trans _ (Pos.to_nat (2 * Pos.max Ax Ay * p))).
+ rewrite <- (mult_1_l (Pos.to_nat p)). rewrite Pos2Nat.inj_mul.
+ apply Nat.mul_le_mono_nonneg. auto. apply Pos2Nat.is_pos.
+ apply le_0_n. apply le_refl. apply H0. rewrite max_l.
+ apply H1. apply le_refl.
+ - apply (QSeqEquivEx_trans _ (fun n => proj1_sig x n * proj1_sig (CReal_mult y z) n)%Q).
+ 2: apply QSeqEquivEx_sym; apply CReal_mult_unfold.
+ destruct x as [xn limx], y as [yn limy], z as [zn limz]; unfold CReal_mult; simpl.
+ destruct (QCauchySeq_bounded xn Pos.to_nat limx) as [Ax majx].
+ destruct (QCauchySeq_bounded yn Pos.to_nat limy) as [Ay majy].
+ destruct (QCauchySeq_bounded zn Pos.to_nat limz) as [Az majz].
+ simpl.
+ pose proof (CReal_mult_assoc_bounded_r (fun n0 : nat => yn n0 * zn n0)%Q (fun n : nat =>
+ yn (Pos.to_nat (Pos.max Ay Az)~0 * n)%nat
+ * zn (Pos.to_nat (Pos.max Ay Az)~0 * n)%nat)%Q xn)
+ as [cvmod cveq].
+
+ pose proof (CReal_mult_cauchy yn yn zn Ay Az Pos.to_nat limy limz majy majz).
+ exists (fun p : positive =>
+ Init.Nat.max (Pos.to_nat (2 * Pos.max Ay Az * p))
+ (Pos.to_nat (2 * Pos.max Ay Az * p))).
+ intros p n k H0 H1. rewrite max_l in H0, H1.
+ 2: apply le_refl. 2: apply le_refl.
+ apply H. rewrite max_l. apply H0. apply le_refl.
+ apply linear_max.
+ apply (le_trans _ (Pos.to_nat (2 * Pos.max Ay Az * p))).
+ rewrite <- (mult_1_l (Pos.to_nat p)). rewrite Pos2Nat.inj_mul.
+ apply Nat.mul_le_mono_nonneg. auto. apply Pos2Nat.is_pos.
+ apply le_0_n. apply le_refl. apply H1.
+ apply limx.
+ exists cvmod. intros p k n H1 H2. specialize (cveq p k n H1 H2).
+ setoid_replace (xn k * yn k * zn k -
+ xn n *
+ (yn (Pos.to_nat (Pos.max Ay Az)~0 * n)%nat *
+ zn (Pos.to_nat (Pos.max Ay Az)~0 * n)%nat))%Q
+ with ((fun n : nat => yn n * zn n * xn n) k -
+ (fun n : nat =>
+ yn (Pos.to_nat (Pos.max Ay Az)~0 * n)%nat *
+ zn (Pos.to_nat (Pos.max Ay Az)~0 * n)%nat *
+ xn n) n)%Q.
+ apply cveq. ring.
+Qed.
+
+Lemma CReal_mult_comm : forall x y : CReal,
+ CRealEq (CReal_mult x y) (CReal_mult y x).
+Proof.
+ intros. apply CRealEq_diff. apply CRealEq_modindep.
+ apply (QSeqEquivEx_trans _ (fun n => proj1_sig y n * proj1_sig x n)%Q).
+ destruct x as [xn limx], y as [yn limy]; simpl.
+ 2: apply QSeqEquivEx_sym; apply CReal_mult_unfold.
+ destruct (QCauchySeq_bounded xn Pos.to_nat limx) as [Ax majx].
+ destruct (QCauchySeq_bounded yn Pos.to_nat limy) as [Ay majy]; simpl.
+ apply QSeqEquivEx_sym.
+
+ pose proof (CReal_mult_cauchy yn yn xn Ay Ax Pos.to_nat limy limx majy majx).
+ exists (fun p : positive =>
+ Init.Nat.max (Pos.to_nat (2 * Pos.max Ay Ax * p))
+ (Pos.to_nat (2 * Pos.max Ay Ax * p))).
+ intros p n k H0 H1. rewrite max_l in H0, H1.
+ 2: apply le_refl. 2: apply le_refl.
+ rewrite (Qmult_comm (xn (Pos.to_nat (Pos.max Ax Ay)~0 * k)%nat)).
+ apply (H p n). rewrite max_l. apply H0. apply le_refl.
+ rewrite max_l. apply (le_trans _ k). apply H1.
+ rewrite <- (mult_1_l k). rewrite mult_assoc.
+ apply Nat.mul_le_mono_nonneg. auto. rewrite mult_1_r.
+ apply Pos2Nat.is_pos. apply le_0_n. apply le_refl.
+ apply le_refl.
+Qed.
+
+Lemma CReal_mult_proper_l : forall x y z : CReal,
+ CRealEq y z -> CRealEq (CReal_mult x y) (CReal_mult x z).
+Proof.
+ intros. apply CRealEq_diff. apply CRealEq_modindep.
+ apply (QSeqEquivEx_trans _ (fun n => proj1_sig x n * proj1_sig y n)%Q).
+ apply CReal_mult_unfold.
+ rewrite CRealEq_diff in H. rewrite <- CRealEq_modindep in H.
+ apply QSeqEquivEx_sym.
+ apply (QSeqEquivEx_trans _ (fun n => proj1_sig x n * proj1_sig z n)%Q).
+ apply CReal_mult_unfold.
+ destruct x as [xn limx], y as [yn limy], z as [zn limz]; simpl.
+ destruct H. simpl in H.
+ destruct (QCauchySeq_bounded xn Pos.to_nat limx) as [Ax majx].
+ destruct (QCauchySeq_bounded zn Pos.to_nat limz) as [Az majz].
+ pose proof (CReal_mult_cauchy yn zn xn Az Ax x H limx majz majx).
+ apply QSeqEquivEx_sym.
+ exists (fun p : positive =>
+ Init.Nat.max (x (2 * Pos.max Az Ax * p)%positive)
+ (Pos.to_nat (2 * Pos.max Az Ax * p))).
+ intros p n k H1 H2. specialize (H0 p n k H1 H2).
+ setoid_replace (xn n * yn n - xn k * zn k)%Q
+ with (yn n * xn n - zn k * xn k)%Q.
+ apply H0. ring.
+Qed.
+
+Lemma CReal_mult_lt_0_compat : forall x y : CReal,
+ CRealLt (inject_Q 0) x
+ -> CRealLt (inject_Q 0) y
+ -> CRealLt (inject_Q 0) (CReal_mult x y).
+Proof.
+ intros. destruct H as [x0 H], H0 as [x1 H0].
+ pose proof (CRealLt_aboveSig (inject_Q 0) x x0 H).
+ pose proof (CRealLt_aboveSig (inject_Q 0) y x1 H0).
+ destruct x as [xn limx], y as [yn limy].
+ simpl in H, H1, H2. simpl.
+ destruct (QCauchySeq_bounded xn Pos.to_nat limx) as [Ax majx].
+ destruct (QCauchySeq_bounded yn Pos.to_nat limy) as [Ay majy].
+ destruct (Qarchimedean (/ (xn (Pos.to_nat x0) - 0 - (2 # x0)))).
+ destruct (Qarchimedean (/ (yn (Pos.to_nat x1) - 0 - (2 # x1)))).
+ exists (Pos.max x0 x~0 * Pos.max x1 x2~0)%positive.
+ simpl. unfold Qminus. rewrite Qplus_0_r.
+ rewrite <- Pos2Nat.inj_mul.
+ unfold Qminus in H1, H2.
+ specialize (H1 ((Pos.max Ax Ay)~0 * (Pos.max x0 x~0 * Pos.max x1 x2~0))%positive).
+ assert (Pos.max x1 x2~0 <= (Pos.max Ax Ay)~0 * (Pos.max x0 x~0 * Pos.max x1 x2~0))%positive.
+ { apply Pos2Nat.inj_le.
+ rewrite Pos.mul_assoc. rewrite Pos2Nat.inj_mul.
+ rewrite <- (mult_1_l (Pos.to_nat (Pos.max x1 x2~0))).
+ rewrite mult_assoc. apply Nat.mul_le_mono_nonneg. auto.
+ rewrite mult_1_r. apply Pos2Nat.is_pos. apply le_0_n.
+ apply le_refl. }
+ specialize (H2 ((Pos.max Ax Ay)~0 * (Pos.max x0 x~0 * Pos.max x1 x2~0))%positive H3).
+ rewrite Qplus_0_r in H1, H2.
+ apply (Qlt_trans _ ((2 # Pos.max x0 x~0) * (2 # Pos.max x1 x2~0))).
+ unfold Qlt; simpl. assert (forall p : positive, (Z.pos p < Z.pos p~0)%Z).
+ intro p. rewrite <- (Z.mul_1_l (Z.pos p)).
+ replace (Z.pos p~0) with (2 * Z.pos p)%Z. apply Z.mul_lt_mono_pos_r.
+ apply Pos2Z.is_pos. reflexivity. reflexivity.
+ apply H4.
+ apply (Qlt_trans _ ((2 # Pos.max x0 x~0) * (yn (Pos.to_nat ((Pos.max Ax Ay)~0 * (Pos.max x0 x~0 * Pos.max x1 x2~0)))))).
+ apply Qmult_lt_l. reflexivity. apply H2. apply Qmult_lt_r.
+ apply (Qlt_trans 0 (2 # Pos.max x1 x2~0)). reflexivity. apply H2.
+ apply H1. rewrite Pos.mul_comm. apply Pos2Nat.inj_le.
+ rewrite <- Pos.mul_assoc. rewrite Pos2Nat.inj_mul.
+ rewrite <- (mult_1_r (Pos.to_nat (Pos.max x0 x~0))).
+ rewrite <- mult_assoc. apply Nat.mul_le_mono_nonneg.
+ apply le_0_n. apply le_refl. auto.
+ rewrite mult_1_l. apply Pos2Nat.is_pos.
+Qed.
+
+Lemma CReal_mult_plus_distr_l : forall r1 r2 r3 : CReal,
+ r1 * (r2 + r3) == (r1 * r2) + (r1 * r3).
+Proof.
+ intros x y z. apply CRealEq_diff. apply CRealEq_modindep.
+ apply (QSeqEquivEx_trans _ (fun n => proj1_sig x n
+ * (proj1_sig (CReal_plus y z) n))%Q).
+ apply CReal_mult_unfold.
+ apply (QSeqEquivEx_trans _ (fun n => proj1_sig (CReal_mult x y) n
+ + proj1_sig (CReal_mult x z) n))%Q.
+ 2: apply QSeqEquivEx_sym; exists (fun p => Pos.to_nat (2 * p))
+ ; apply CReal_plus_unfold.
+ apply (QSeqEquivEx_trans _ (fun n => proj1_sig x n
+ * (proj1_sig y n + proj1_sig z n))%Q).
+ - pose proof (CReal_plus_unfold y z).
+ destruct x as [xn limx], y as [yn limy], z as [zn limz]; simpl; simpl in H.
+ destruct (QCauchySeq_bounded xn Pos.to_nat limx) as [Ax majx].
+ destruct (QCauchySeq_bounded yn Pos.to_nat limy) as [Ay majy].
+ destruct (QCauchySeq_bounded zn Pos.to_nat limz) as [Az majz].
+ pose proof (CReal_mult_cauchy (fun n => yn (n + (n + 0))%nat + zn (n + (n + 0))%nat)%Q
+ (fun n => yn n + zn n)%Q
+ xn (Ay + Az) Ax
+ (fun p => Pos.to_nat (2 * p)) H limx).
+ exists (fun p : positive => (Pos.to_nat (2 * (2 * Pos.max (Ay + Az) Ax * p)))).
+ intros p n k H1 H2.
+ setoid_replace (xn n * (yn (n + (n + 0))%nat + zn (n + (n + 0))%nat) - xn k * (yn k + zn k))%Q
+ with ((yn (n + (n + 0))%nat + zn (n + (n + 0))%nat) * xn n - (yn k + zn k) * xn k)%Q.
+ 2: ring.
+ assert (Pos.to_nat (2 * Pos.max (Ay + Az) Ax * p) <=
+ Pos.to_nat 2 * Pos.to_nat (2 * Pos.max (Ay + Az) Ax * p))%nat.
+ { rewrite (Pos2Nat.inj_mul 2).
+ rewrite <- (mult_1_l (Pos.to_nat (2 * Pos.max (Ay + Az) Ax * p))).
+ rewrite mult_assoc. apply Nat.mul_le_mono_nonneg. auto.
+ simpl. auto. apply le_0_n. apply le_refl. }
+ apply H0. intro n0. apply (Qle_lt_trans _ (Qabs (yn n0) + Qabs (zn n0))).
+ apply Qabs_triangle. rewrite Pos2Z.inj_add.
+ rewrite <- Qinv_plus_distr. apply Qplus_lt_le_compat.
+ apply majy. apply Qlt_le_weak. apply majz.
+ apply majx. rewrite max_l.
+ apply H1. rewrite (Pos2Nat.inj_mul 2). apply H3.
+ rewrite max_l. apply H2. rewrite (Pos2Nat.inj_mul 2).
+ apply H3.
+ - destruct x as [xn limx], y as [yn limy], z as [zn limz]; simpl.
+ destruct (QCauchySeq_bounded xn Pos.to_nat limx) as [Ax majx].
+ destruct (QCauchySeq_bounded yn Pos.to_nat limy) as [Ay majy].
+ destruct (QCauchySeq_bounded zn Pos.to_nat limz) as [Az majz].
+ simpl.
+ exists (fun p : positive => (Pos.to_nat (2 * (Pos.max (Pos.max Ax Ay) Az) * (2 * p)))).
+ intros p n k H H0.
+ setoid_replace (xn n * (yn n + zn n) -
+ (xn (Pos.to_nat (Pos.max Ax Ay)~0 * k)%nat *
+ yn (Pos.to_nat (Pos.max Ax Ay)~0 * k)%nat +
+ xn (Pos.to_nat (Pos.max Ax Az)~0 * k)%nat *
+ zn (Pos.to_nat (Pos.max Ax Az)~0 * k)%nat))%Q
+ with (xn n * yn n - (xn (Pos.to_nat (Pos.max Ax Ay)~0 * k)%nat *
+ yn (Pos.to_nat (Pos.max Ax Ay)~0 * k)%nat)
+ + (xn n * zn n - xn (Pos.to_nat (Pos.max Ax Az)~0 * k)%nat *
+ zn (Pos.to_nat (Pos.max Ax Az)~0 * k)%nat))%Q.
+ 2: ring.
+ apply (Qle_lt_trans _ (Qabs (xn n * yn n - (xn (Pos.to_nat (Pos.max Ax Ay)~0 * k)%nat *
+ yn (Pos.to_nat (Pos.max Ax Ay)~0 * k)%nat))
+ + Qabs (xn n * zn n - xn (Pos.to_nat (Pos.max Ax Az)~0 * k)%nat *
+ zn (Pos.to_nat (Pos.max Ax Az)~0 * k)%nat))).
+ apply Qabs_triangle.
+ setoid_replace (1#p)%Q with ((1#2*p) + (1#2*p))%Q.
+ apply Qplus_lt_le_compat.
+ + pose proof (CReal_mult_cauchy xn xn yn Ax Ay Pos.to_nat limx limy).
+ apply H1. apply majx. apply majy. rewrite max_l.
+ apply (le_trans _ (Pos.to_nat (2 * Pos.max (Pos.max Ax Ay) Az * (2 * p)))).
+ rewrite (Pos.mul_comm 2). rewrite <- Pos.mul_assoc.
+ rewrite <- (Pos.mul_comm (Pos.max (Pos.max Ax Ay) Az)).
+ rewrite <- Pos.mul_assoc.
+ rewrite Pos2Nat.inj_mul.
+ rewrite (Pos2Nat.inj_mul (Pos.max (Pos.max Ax Ay) Az)).
+ apply Nat.mul_le_mono_nonneg. apply le_0_n.
+ apply Pos2Nat.inj_le. apply Pos.le_max_l.
+ apply le_0_n. apply le_refl. apply H. apply le_refl.
+ rewrite max_l. apply (le_trans _ k).
+ apply (le_trans _ (Pos.to_nat (2 * Pos.max (Pos.max Ax Ay) Az * (2 * p)))).
+ rewrite (Pos.mul_comm 2). rewrite <- Pos.mul_assoc.
+ rewrite <- (Pos.mul_comm (Pos.max (Pos.max Ax Ay) Az)).
+ rewrite <- Pos.mul_assoc.
+ rewrite Pos2Nat.inj_mul.
+ rewrite (Pos2Nat.inj_mul (Pos.max (Pos.max Ax Ay) Az)).
+ apply Nat.mul_le_mono_nonneg. apply le_0_n.
+ apply Pos2Nat.inj_le. apply Pos.le_max_l.
+ apply le_0_n. apply le_refl. apply H0.
+ rewrite <- (mult_1_l k). rewrite mult_assoc.
+ apply Nat.mul_le_mono_nonneg. auto.
+ rewrite mult_1_r. apply Pos2Nat.is_pos. apply le_0_n.
+ apply le_refl. apply le_refl.
+ + apply Qlt_le_weak.
+ pose proof (CReal_mult_cauchy xn xn zn Ax Az Pos.to_nat limx limz).
+ apply H1. apply majx. apply majz. rewrite max_l. 2: apply le_refl.
+ apply (le_trans _ (Pos.to_nat (2 * Pos.max (Pos.max Ax Ay) Az * (2 * p)))).
+ rewrite (Pos.mul_comm 2). rewrite <- Pos.mul_assoc.
+ rewrite <- (Pos.mul_comm (Pos.max (Pos.max Ax Ay) Az)).
+ rewrite <- Pos.mul_assoc.
+ rewrite Pos2Nat.inj_mul.
+ rewrite (Pos2Nat.inj_mul (Pos.max (Pos.max Ax Ay) Az)).
+ apply Nat.mul_le_mono_nonneg. apply le_0_n.
+ rewrite <- Pos.max_assoc. rewrite (Pos.max_comm Ay Az).
+ rewrite Pos.max_assoc. apply Pos2Nat.inj_le. apply Pos.le_max_l.
+ apply le_0_n. apply le_refl. apply H.
+ rewrite max_l. apply (le_trans _ k).
+ apply (le_trans _ (Pos.to_nat (2 * Pos.max (Pos.max Ax Ay) Az * (2 * p)))).
+ rewrite (Pos.mul_comm 2). rewrite <- Pos.mul_assoc.
+ rewrite <- (Pos.mul_comm (Pos.max (Pos.max Ax Ay) Az)).
+ rewrite <- Pos.mul_assoc.
+ rewrite Pos2Nat.inj_mul.
+ rewrite (Pos2Nat.inj_mul (Pos.max (Pos.max Ax Ay) Az)).
+ apply Nat.mul_le_mono_nonneg. apply le_0_n.
+ rewrite <- Pos.max_assoc. rewrite (Pos.max_comm Ay Az).
+ rewrite Pos.max_assoc. apply Pos2Nat.inj_le. apply Pos.le_max_l.
+ apply le_0_n. apply le_refl. apply H0.
+ rewrite <- (mult_1_l k). rewrite mult_assoc.
+ apply Nat.mul_le_mono_nonneg. auto.
+ rewrite mult_1_r. apply Pos2Nat.is_pos. apply le_0_n.
+ apply le_refl. apply le_refl.
+ + rewrite Qinv_plus_distr. unfold Qeq. reflexivity.
+Qed.
+
+Lemma CReal_mult_plus_distr_r : forall r1 r2 r3 : CReal,
+ (r2 + r3) * r1 == (r2 * r1) + (r3 * r1).
+Proof.
+ intros.
+ rewrite CReal_mult_comm, CReal_mult_plus_distr_l,
+ <- (CReal_mult_comm r1), <- (CReal_mult_comm r1).
+ reflexivity.
+Qed.
+
+Lemma CReal_mult_1_l : forall r: CReal, 1 * r == r.
+Proof.
+ intros [rn limr]. split.
+ - intros [m maj]. simpl in maj.
+ destruct (QCauchySeq_bounded (fun _ : nat => 1%Q) Pos.to_nat (ConstCauchy 1)).
+ destruct (QCauchySeq_bounded rn Pos.to_nat limr).
+ simpl in maj. rewrite Qmult_1_l in maj.
+ specialize (limr m).
+ apply (Qlt_not_le (2 # m) (1 # m)).
+ apply (Qlt_trans _ (rn (Pos.to_nat m) - rn (Pos.to_nat (Pos.max x x0)~0 * Pos.to_nat m)%nat)).
+ apply maj.
+ apply (Qle_lt_trans _ (Qabs (rn (Pos.to_nat m) - rn (Pos.to_nat (Pos.max x x0)~0 * Pos.to_nat m)%nat))).
+ apply Qle_Qabs. apply limr. apply le_refl.
+ rewrite <- (mult_1_l (Pos.to_nat m)). rewrite mult_assoc.
+ apply Nat.mul_le_mono_nonneg. auto. rewrite mult_1_r.
+ apply Pos2Nat.is_pos. apply le_0_n. apply le_refl.
+ apply Z.mul_le_mono_nonneg. discriminate. discriminate.
+ discriminate. apply Z.le_refl.
+ - intros [m maj]. simpl in maj.
+ destruct (QCauchySeq_bounded (fun _ : nat => 1%Q) Pos.to_nat (ConstCauchy 1)).
+ destruct (QCauchySeq_bounded rn Pos.to_nat limr).
+ simpl in maj. rewrite Qmult_1_l in maj.
+ specialize (limr m).
+ apply (Qlt_not_le (2 # m) (1 # m)).
+ apply (Qlt_trans _ (rn (Pos.to_nat (Pos.max x x0)~0 * Pos.to_nat m)%nat - rn (Pos.to_nat m))).
+ apply maj.
+ apply (Qle_lt_trans _ (Qabs (rn (Pos.to_nat (Pos.max x x0)~0 * Pos.to_nat m)%nat - rn (Pos.to_nat m)))).
+ apply Qle_Qabs. apply limr.
+ rewrite <- (mult_1_l (Pos.to_nat m)). rewrite mult_assoc.
+ apply Nat.mul_le_mono_nonneg. auto. rewrite mult_1_r.
+ apply Pos2Nat.is_pos. apply le_0_n. apply le_refl.
+ apply le_refl. apply Z.mul_le_mono_nonneg. discriminate. discriminate.
+ discriminate. apply Z.le_refl.
+Qed.
+
+Lemma CReal_isRingExt : ring_eq_ext CReal_plus CReal_mult CReal_opp CRealEq.
+Proof.
+ split.
+ - intros x y H z t H0. apply CReal_plus_morph; assumption.
+ - intros x y H z t H0. apply (CRealEq_trans _ (CReal_mult x t)).
+ apply CReal_mult_proper_l. apply H0.
+ apply (CRealEq_trans _ (CReal_mult t x)). apply CReal_mult_comm.
+ apply (CRealEq_trans _ (CReal_mult t y)).
+ apply CReal_mult_proper_l. apply H. apply CReal_mult_comm.
+ - intros x y H. apply (CReal_plus_eq_reg_l x).
+ apply (CRealEq_trans _ (inject_Q 0)). apply CReal_plus_opp_r.
+ apply (CRealEq_trans _ (CReal_plus y (CReal_opp y))).
+ apply CRealEq_sym. apply CReal_plus_opp_r.
+ apply CReal_plus_proper_r. apply CRealEq_sym. apply H.
+Qed.
+
+Lemma CReal_isRing : ring_theory (inject_Q 0) (inject_Q 1)
+ CReal_plus CReal_mult
+ CReal_minus CReal_opp
+ CRealEq.
+Proof.
+ intros. split.
+ - apply CReal_plus_0_l.
+ - apply CReal_plus_comm.
+ - intros x y z. symmetry. apply CReal_plus_assoc.
+ - apply CReal_mult_1_l.
+ - apply CReal_mult_comm.
+ - intros x y z. symmetry. apply CReal_mult_assoc.
+ - intros x y z. rewrite <- (CReal_mult_comm z).
+ rewrite CReal_mult_plus_distr_l.
+ apply (CRealEq_trans _ (CReal_plus (CReal_mult x z) (CReal_mult z y))).
+ apply CReal_plus_proper_r. apply CReal_mult_comm.
+ apply CReal_plus_proper_l. apply CReal_mult_comm.
+ - intros x y. apply CRealEq_refl.
+ - apply CReal_plus_opp_r.
+Qed.
+
+Add Parametric Morphism : CReal_mult
+ with signature CRealEq ==> CRealEq ==> CRealEq
+ as CReal_mult_morph.
+Proof.
+ apply CReal_isRingExt.
+Qed.
+
+Instance CReal_mult_morph_T
+ : CMorphisms.Proper
+ (CMorphisms.respectful CRealEq (CMorphisms.respectful CRealEq CRealEq)) CReal_mult.
+Proof.
+ apply CReal_isRingExt.
+Qed.
+
+Add Parametric Morphism : CReal_opp
+ with signature CRealEq ==> CRealEq
+ as CReal_opp_morph.
+Proof.
+ apply (Ropp_ext CReal_isRingExt).
+Qed.
+
+Instance CReal_opp_morph_T
+ : CMorphisms.Proper
+ (CMorphisms.respectful CRealEq CRealEq) CReal_opp.
+Proof.
+ apply CReal_isRingExt.
+Qed.
+
+Add Parametric Morphism : CReal_minus
+ with signature CRealEq ==> CRealEq ==> CRealEq
+ as CReal_minus_morph.
+Proof.
+ intros. unfold CReal_minus. rewrite H,H0. reflexivity.
+Qed.
+
+Instance CReal_minus_morph_T
+ : CMorphisms.Proper
+ (CMorphisms.respectful CRealEq (CMorphisms.respectful CRealEq CRealEq)) CReal_minus.
+Proof.
+ intros x y exy z t ezt. unfold CReal_minus. rewrite exy,ezt. reflexivity.
+Qed.
+
+Add Ring CRealRing : CReal_isRing.
+
+(**********)
+Lemma CReal_mult_0_l : forall r, 0 * r == 0.
+Proof.
+ intro; ring.
+Qed.
+
+Lemma CReal_mult_0_r : forall r, r * 0 == 0.
+Proof.
+ intro; ring.
+Qed.
+
+(**********)
+Lemma CReal_mult_1_r : forall r, r * 1 == r.
+Proof.
+ intro; ring.
+Qed.
+
+Lemma CReal_opp_mult_distr_l
+ : forall r1 r2 : CReal, - (r1 * r2) == (- r1) * r2.
+Proof.
+ intros. ring.
+Qed.
+
+Lemma CReal_opp_mult_distr_r
+ : forall r1 r2 : CReal, - (r1 * r2) == r1 * (- r2).
+Proof.
+ intros. ring.
+Qed.
+
+Lemma CReal_mult_lt_compat_l : forall x y z : CReal,
+ 0 < x -> y < z -> x*y < x*z.
+Proof.
+ intros. apply (CReal_plus_lt_reg_l
+ (CReal_opp (CReal_mult x y))).
+ rewrite CReal_plus_comm. pose proof CReal_plus_opp_r.
+ unfold CReal_minus in H1. rewrite H1.
+ rewrite CReal_mult_comm, CReal_opp_mult_distr_l, CReal_mult_comm.
+ rewrite <- CReal_mult_plus_distr_l.
+ apply CReal_mult_lt_0_compat. exact H.
+ apply (CReal_plus_lt_reg_l y).
+ rewrite CReal_plus_comm, CReal_plus_0_l.
+ rewrite <- CReal_plus_assoc, H1, CReal_plus_0_l. exact H0.
+Qed.
+
+Lemma CReal_mult_lt_compat_r : forall x y z : CReal,
+ 0 < x -> y < z -> y*x < z*x.
+Proof.
+ intros. rewrite <- (CReal_mult_comm x), <- (CReal_mult_comm x).
+ apply (CReal_mult_lt_compat_l x); assumption.
+Qed.
+
+Lemma CReal_mult_eq_reg_l : forall (r r1 r2 : CReal),
+ r # 0
+ -> CRealEq (CReal_mult r r1) (CReal_mult r r2)
+ -> CRealEq r1 r2.
+Proof.
+ intros. destruct H; split.
+ - intro abs. apply (CReal_mult_lt_compat_l (-r)) in abs.
+ rewrite <- CReal_opp_mult_distr_l, <- CReal_opp_mult_distr_l, H0 in abs.
+ exact (CRealLt_irrefl _ abs). apply (CReal_plus_lt_reg_l r).
+ rewrite CReal_plus_opp_r, CReal_plus_comm, CReal_plus_0_l. exact c.
+ - intro abs. apply (CReal_mult_lt_compat_l (-r)) in abs.
+ rewrite <- CReal_opp_mult_distr_l, <- CReal_opp_mult_distr_l, H0 in abs.
+ exact (CRealLt_irrefl _ abs). apply (CReal_plus_lt_reg_l r).
+ rewrite CReal_plus_opp_r, CReal_plus_comm, CReal_plus_0_l. exact c.
+ - intro abs. apply (CReal_mult_lt_compat_l r) in abs. rewrite H0 in abs.
+ exact (CRealLt_irrefl _ abs). exact c.
+ - intro abs. apply (CReal_mult_lt_compat_l r) in abs. rewrite H0 in abs.
+ exact (CRealLt_irrefl _ abs). exact c.
+Qed.
+
+Lemma CReal_abs_appart_zero : forall (x : CReal) (n : positive),
+ Qlt (2#n) (Qabs (proj1_sig x (Pos.to_nat n)))
+ -> 0 # x.
+Proof.
+ intros. destruct x as [xn xcau]. simpl in H.
+ destruct (Qlt_le_dec 0 (xn (Pos.to_nat n))).
+ - left. exists n; simpl. rewrite Qabs_pos in H.
+ ring_simplify. exact H. apply Qlt_le_weak. exact q.
+ - right. exists n; simpl. rewrite Qabs_neg in H.
+ unfold Qminus. rewrite Qplus_0_l. exact H. exact q.
+Qed.
+
+
+(*********************************************************)
+(** * Field *)
+(*********************************************************)
+
+Lemma CRealArchimedean
+ : forall x:CReal, { n:Z & x < inject_Q (n#1) < x+2 }.
+Proof.
+ (* Locate x within 1/4 and pick the first integer above this interval. *)
+ intros [xn limx].
+ pose proof (Qlt_floor (xn 4%nat + (1#4))). unfold inject_Z in H.
+ pose proof (Qfloor_le (xn 4%nat + (1#4))). unfold inject_Z in H0.
+ remember (Qfloor (xn 4%nat + (1#4)))%Z as n.
+ exists (n+1)%Z. split.
+ - assert (Qlt 0 ((n + 1 # 1) - (xn 4%nat + (1 # 4)))) as epsPos.
+ { unfold Qminus. rewrite <- Qlt_minus_iff. exact H. }
+ destruct (Qarchimedean (/((1#2)*((n + 1 # 1) - (xn 4%nat + (1 # 4)))))) as [k kmaj].
+ exists (Pos.max 4 k). simpl.
+ apply (Qlt_trans _ ((n + 1 # 1) - (xn 4%nat + (1 # 4)))).
+ + setoid_replace (Z.pos k # 1)%Q with (/(1#k))%Q in kmaj. 2: reflexivity.
+ rewrite <- Qinv_lt_contravar in kmaj. 2: reflexivity.
+ apply (Qle_lt_trans _ (2#k)).
+ rewrite <- (Qmult_le_l _ _ (1#2)).
+ setoid_replace ((1 # 2) * (2 # k))%Q with (1#k)%Q. 2: reflexivity.
+ setoid_replace ((1 # 2) * (2 # Pos.max 4 k))%Q with (1#Pos.max 4 k)%Q. 2: reflexivity.
+ unfold Qle; simpl. apply Pos2Z.pos_le_pos. apply Pos.le_max_r.
+ reflexivity.
+ rewrite <- (Qmult_lt_l _ _ (1#2)).
+ setoid_replace ((1 # 2) * (2 # k))%Q with (1#k)%Q. exact kmaj.
+ reflexivity. reflexivity. rewrite <- (Qmult_0_r (1#2)).
+ rewrite Qmult_lt_l. exact epsPos. reflexivity.
+ + rewrite <- (Qplus_lt_r _ _ (xn (Pos.to_nat (Pos.max 4 k)) - (n + 1 # 1) + (1#4))).
+ ring_simplify.
+ apply (Qle_lt_trans _ (Qabs (xn (Pos.to_nat (Pos.max 4 k)) - xn 4%nat))).
+ apply Qle_Qabs. apply limx.
+ rewrite Pos2Nat.inj_max. apply Nat.le_max_l. apply le_refl.
+ - apply (CReal_plus_lt_reg_l (-(2))). ring_simplify.
+ exists 4%positive. simpl.
+ rewrite <- Qinv_plus_distr.
+ rewrite <- (Qplus_lt_r _ _ ((n#1) - (1#2))). ring_simplify.
+ apply (Qle_lt_trans _ (xn 4%nat + (1 # 4)) _ H0).
+ unfold Pos.to_nat; simpl.
+ rewrite <- (Qplus_lt_r _ _ (-xn 4%nat)). ring_simplify.
+ reflexivity.
+Defined.
+
+Definition Rup_pos (x : CReal)
+ : { n : positive & x < inject_Q (Z.pos n # 1) }.
+Proof.
+ intros. destruct (CRealArchimedean x) as [p [maj _]].
+ destruct p.
+ - exists 1%positive. apply (CReal_lt_trans _ 0 _ maj). apply CRealLt_0_1.
+ - exists p. exact maj.
+ - exists 1%positive. apply (CReal_lt_trans _ (inject_Q (Z.neg p # 1)) _ maj).
+ apply (CReal_lt_trans _ 0). apply inject_Q_lt. reflexivity.
+ apply CRealLt_0_1.
+Qed.
+
+Lemma CRealLtDisjunctEpsilon : forall a b c d : CReal,
+ (CRealLtProp a b \/ CRealLtProp c d) -> CRealLt a b + CRealLt c d.
+Proof.
+ intros.
+ assert (exists n : nat, n <> O /\
+ (Qlt (2 # Pos.of_nat n) (proj1_sig b n - proj1_sig a n)
+ \/ Qlt (2 # Pos.of_nat n) (proj1_sig d n - proj1_sig c n))).
+ { destruct H. destruct H as [n maj]. exists (Pos.to_nat n). split.
+ intro abs. destruct (Pos2Nat.is_succ n). rewrite H in abs.
+ inversion abs. left. rewrite Pos2Nat.id. apply maj.
+ destruct H as [n maj]. exists (Pos.to_nat n). split.
+ intro abs. destruct (Pos2Nat.is_succ n). rewrite H in abs.
+ inversion abs. right. rewrite Pos2Nat.id. apply maj. }
+ apply constructive_indefinite_ground_description_nat in H0.
+ - destruct H0 as [n [nPos maj]].
+ destruct (Qlt_le_dec (2 # Pos.of_nat n)
+ (proj1_sig b n - proj1_sig a n)).
+ left. exists (Pos.of_nat n). rewrite Nat2Pos.id. apply q. apply nPos.
+ assert (2 # Pos.of_nat n < proj1_sig d n - proj1_sig c n)%Q.
+ destruct maj. exfalso.
+ apply (Qlt_not_le (2 # Pos.of_nat n) (proj1_sig b n - proj1_sig a n)); assumption.
+ assumption. clear maj. right. exists (Pos.of_nat n). rewrite Nat2Pos.id.
+ apply H0. apply nPos.
+ - clear H0. clear H. intro n. destruct n. right.
+ intros [abs _]. exact (abs (eq_refl O)).
+ destruct (Qlt_le_dec (2 # Pos.of_nat (S n)) (proj1_sig b (S n) - proj1_sig a (S n))).
+ left. split. discriminate. left. apply q.
+ destruct (Qlt_le_dec (2 # Pos.of_nat (S n)) (proj1_sig d (S n) - proj1_sig c (S n))).
+ left. split. discriminate. right. apply q0.
+ right. intros [_ [abs|abs]].
+ apply (Qlt_not_le (2 # Pos.of_nat (S n))
+ (proj1_sig b (S n) - proj1_sig a (S n))); assumption.
+ apply (Qlt_not_le (2 # Pos.of_nat (S n))
+ (proj1_sig d (S n) - proj1_sig c (S n))); assumption.
+Qed.
+
+Lemma CRealShiftReal : forall (x : CReal) (k : nat),
+ QCauchySeq (fun n => proj1_sig x (plus n k)) Pos.to_nat.
+Proof.
+ intros x k n p q H H0.
+ destruct x as [xn cau]; unfold proj1_sig.
+ destruct k. rewrite plus_0_r. rewrite plus_0_r. apply cau; assumption.
+ specialize (cau (n + Pos.of_nat (S k))%positive (p + S k)%nat (q + S k)%nat).
+ apply (Qlt_trans _ (1 # n + Pos.of_nat (S k))).
+ apply cau. rewrite Pos2Nat.inj_add. rewrite Nat2Pos.id.
+ apply Nat.add_le_mono_r. apply H. discriminate.
+ rewrite Pos2Nat.inj_add. rewrite Nat2Pos.id.
+ apply Nat.add_le_mono_r. apply H0. discriminate.
+ apply Pos2Nat.inj_lt; simpl. rewrite Pos2Nat.inj_add.
+ rewrite <- (plus_0_r (Pos.to_nat n)). rewrite <- plus_assoc.
+ apply Nat.add_lt_mono_l. apply Pos2Nat.is_pos.
+Qed.
+
+Lemma CRealShiftEqual : forall (x : CReal) (k : nat),
+ CRealEq x (exist _ (fun n => proj1_sig x (plus n k)) (CRealShiftReal x k)).
+Proof.
+ intros. split.
+ - intros [n maj]. destruct x as [xn cau]; simpl in maj.
+ specialize (cau n (Pos.to_nat n + k)%nat (Pos.to_nat n)).
+ apply Qlt_not_le in maj. apply maj. clear maj.
+ apply (Qle_trans _ (Qabs (xn (Pos.to_nat n + k)%nat - xn (Pos.to_nat n)))).
+ apply Qle_Qabs. apply (Qle_trans _ (1#n)). apply Zlt_le_weak.
+ apply cau. rewrite <- (plus_0_r (Pos.to_nat n)).
+ rewrite <- plus_assoc. apply Nat.add_le_mono_l. apply le_0_n.
+ apply le_refl. apply Z.mul_le_mono_pos_r. apply Pos2Z.is_pos.
+ discriminate.
+ - intros [n maj]. destruct x as [xn cau]; simpl in maj.
+ specialize (cau n (Pos.to_nat n) (Pos.to_nat n + k)%nat).
+ apply Qlt_not_le in maj. apply maj. clear maj.
+ apply (Qle_trans _ (Qabs (xn (Pos.to_nat n) - xn (Pos.to_nat n + k)%nat))).
+ apply Qle_Qabs. apply (Qle_trans _ (1#n)). apply Zlt_le_weak.
+ apply cau. apply le_refl. rewrite <- (plus_0_r (Pos.to_nat n)).
+ rewrite <- plus_assoc. apply Nat.add_le_mono_l. apply le_0_n.
+ apply Z.mul_le_mono_pos_r. apply Pos2Z.is_pos. discriminate.
+Qed.
+
+(* Find an equal negative real number, which rational sequence
+ stays below 0, so that it can be inversed. *)
+Definition CRealNegShift (x : CReal)
+ : CRealLt x (inject_Q 0)
+ -> { y : prod positive CReal | CRealEq x (snd y)
+ /\ forall n:nat, Qlt (proj1_sig (snd y) n) (-1 # fst y) }.
+Proof.
+ intro xNeg.
+ pose proof (CRealLt_aboveSig x (inject_Q 0)).
+ pose proof (CRealShiftReal x).
+ pose proof (CRealShiftEqual x).
+ destruct xNeg as [n maj], x as [xn cau]; simpl in maj.
+ specialize (H n maj); simpl in H.
+ destruct (Qarchimedean (/ (0 - xn (Pos.to_nat n) - (2 # n)))) as [a _].
+ remember (Pos.max n a~0) as k.
+ clear Heqk. clear maj. clear n.
+ exists (pair k
+ (exist _ (fun n => xn (plus n (Pos.to_nat k))) (H0 (Pos.to_nat k)))).
+ split. apply H1. intro n. simpl. apply Qlt_minus_iff.
+ destruct n.
+ - specialize (H k).
+ unfold Qminus in H. rewrite Qplus_0_l in H. apply Qlt_minus_iff in H.
+ unfold Qminus. rewrite Qplus_comm.
+ apply (Qlt_trans _ (- xn (Pos.to_nat k)%nat - (2 #k))). apply H.
+ unfold Qminus. simpl. apply Qplus_lt_r.
+ apply Z.mul_lt_mono_pos_r. simpl. apply Pos2Z.is_pos.
+ reflexivity. apply Pos.le_refl.
+ - apply (Qlt_trans _ (-(2 # k) - xn (S n + Pos.to_nat k)%nat)).
+ rewrite <- (Nat2Pos.id (S n)). rewrite <- Pos2Nat.inj_add.
+ specialize (H (Pos.of_nat (S n) + k)%positive).
+ unfold Qminus in H. rewrite Qplus_0_l in H. apply Qlt_minus_iff in H.
+ unfold Qminus. rewrite Qplus_comm. apply H. apply Pos2Nat.inj_le.
+ rewrite <- (plus_0_l (Pos.to_nat k)). rewrite Pos2Nat.inj_add.
+ apply Nat.add_le_mono_r. apply le_0_n. discriminate.
+ apply Qplus_lt_l.
+ apply Z.mul_lt_mono_pos_r. simpl. apply Pos2Z.is_pos.
+ reflexivity.
+Qed.
+
+Definition CRealPosShift (x : CReal)
+ : inject_Q 0 < x
+ -> { y : prod positive CReal | CRealEq x (snd y)
+ /\ forall n:nat, Qlt (1 # fst y) (proj1_sig (snd y) n) }.
+Proof.
+ intro xPos.
+ pose proof (CRealLt_aboveSig (inject_Q 0) x).
+ pose proof (CRealShiftReal x).
+ pose proof (CRealShiftEqual x).
+ destruct xPos as [n maj], x as [xn cau]; simpl in maj.
+ simpl in H. specialize (H n).
+ destruct (Qarchimedean (/ (xn (Pos.to_nat n) - 0 - (2 # n)))) as [a _].
+ specialize (H maj); simpl in H.
+ remember (Pos.max n a~0) as k.
+ clear Heqk. clear maj. clear n.
+ exists (pair k
+ (exist _ (fun n => xn (plus n (Pos.to_nat k))) (H0 (Pos.to_nat k)))).
+ split. apply H1. intro n. simpl. apply Qlt_minus_iff.
+ destruct n.
+ - specialize (H k).
+ unfold Qminus in H. rewrite Qplus_0_r in H.
+ simpl. rewrite <- Qlt_minus_iff.
+ apply (Qlt_trans _ (2 #k)).
+ apply Z.mul_lt_mono_pos_r. simpl. apply Pos2Z.is_pos.
+ reflexivity. apply H. apply Pos.le_refl.
+ - rewrite <- Qlt_minus_iff. apply (Qlt_trans _ (2 # k)).
+ apply Z.mul_lt_mono_pos_r. simpl. apply Pos2Z.is_pos.
+ reflexivity. specialize (H (Pos.of_nat (S n) + k)%positive).
+ unfold Qminus in H. rewrite Qplus_0_r in H.
+ rewrite Pos2Nat.inj_add in H. rewrite Nat2Pos.id in H.
+ apply H. apply Pos2Nat.inj_le.
+ rewrite <- (plus_0_l (Pos.to_nat k)). rewrite Pos2Nat.inj_add.
+ apply Nat.add_le_mono_r. apply le_0_n. discriminate.
+Qed.
+
+Lemma CReal_inv_neg : forall (yn : nat -> Q) (k : positive),
+ (QCauchySeq yn Pos.to_nat)
+ -> (forall n : nat, yn n < -1 # k)%Q
+ -> QCauchySeq (fun n : nat => / yn (Pos.to_nat k ^ 2 * n)%nat) Pos.to_nat.
+Proof.
+ (* Prove the inverse sequence is Cauchy *)
+ intros yn k cau maj n p q H0 H1.
+ setoid_replace (/ yn (Pos.to_nat k ^ 2 * p)%nat -
+ / yn (Pos.to_nat k ^ 2 * q)%nat)%Q
+ with ((yn (Pos.to_nat k ^ 2 * q)%nat -
+ yn (Pos.to_nat k ^ 2 * p)%nat)
+ / (yn (Pos.to_nat k ^ 2 * q)%nat *
+ yn (Pos.to_nat k ^ 2 * p)%nat)).
+ + apply (Qle_lt_trans _ (Qabs (yn (Pos.to_nat k ^ 2 * q)%nat
+ - yn (Pos.to_nat k ^ 2 * p)%nat)
+ / (1 # (k^2)))).
+ assert (1 # k ^ 2
+ < Qabs (yn (Pos.to_nat k ^ 2 * q)%nat * yn (Pos.to_nat k ^ 2 * p)%nat))%Q.
+ { rewrite Qabs_Qmult. unfold "^"%positive; simpl.
+ rewrite factorDenom. rewrite Pos.mul_1_r.
+ apply (Qlt_trans _ ((1#k) * Qabs (yn (Pos.to_nat k * (Pos.to_nat k * 1) * p)%nat))).
+ apply Qmult_lt_l. reflexivity. rewrite Qabs_neg.
+ specialize (maj (Pos.to_nat k * (Pos.to_nat k * 1) * p)%nat).
+ apply Qlt_minus_iff in maj. apply Qlt_minus_iff.
+ rewrite Qplus_comm. setoid_replace (-(1#k))%Q with (-1 # k)%Q. apply maj.
+ reflexivity. apply (Qle_trans _ (-1 # k)). apply Zlt_le_weak.
+ apply maj. discriminate.
+ apply Qmult_lt_r. apply (Qlt_trans 0 (1#k)). reflexivity.
+ rewrite Qabs_neg.
+ specialize (maj (Pos.to_nat k * (Pos.to_nat k * 1) * p)%nat).
+ apply Qlt_minus_iff in maj. apply Qlt_minus_iff.
+ rewrite Qplus_comm. setoid_replace (-(1#k))%Q with (-1 # k)%Q. apply maj.
+ reflexivity. apply (Qle_trans _ (-1 # k)). apply Zlt_le_weak.
+ apply maj. discriminate.
+ rewrite Qabs_neg.
+ specialize (maj (Pos.to_nat k * (Pos.to_nat k * 1) * q)%nat).
+ apply Qlt_minus_iff in maj. apply Qlt_minus_iff.
+ rewrite Qplus_comm. setoid_replace (-(1#k))%Q with (-1 # k)%Q. apply maj.
+ reflexivity. apply (Qle_trans _ (-1 # k)). apply Zlt_le_weak.
+ apply maj. discriminate. }
+ unfold Qdiv. rewrite Qabs_Qmult. rewrite Qabs_Qinv.
+ rewrite Qmult_comm. rewrite <- (Qmult_comm (/ (1 # k ^ 2))).
+ apply Qmult_le_compat_r. apply Qlt_le_weak.
+ rewrite <- Qmult_1_l. apply Qlt_shift_div_r.
+ apply (Qlt_trans 0 (1 # k ^ 2)). reflexivity. apply H.
+ rewrite Qmult_comm. apply Qlt_shift_div_l.
+ reflexivity. rewrite Qmult_1_l. apply H.
+ apply Qabs_nonneg. simpl in maj.
+ specialize (cau (n * (k^2))%positive
+ (Pos.to_nat k ^ 2 * q)%nat
+ (Pos.to_nat k ^ 2 * p)%nat).
+ apply Qlt_shift_div_r. reflexivity.
+ apply (Qlt_le_trans _ (1 # n * k ^ 2)). apply cau.
+ rewrite Pos2Nat.inj_mul. rewrite mult_comm.
+ unfold "^"%positive. simpl. rewrite Pos2Nat.inj_mul.
+ rewrite <- mult_assoc. rewrite <- mult_assoc.
+ apply Nat.mul_le_mono_nonneg_l. apply le_0_n.
+ rewrite (mult_1_r). rewrite Pos.mul_1_r.
+ apply Nat.mul_le_mono_nonneg_l. apply le_0_n.
+ apply (le_trans _ (q+0)). rewrite plus_0_r. assumption.
+ rewrite plus_0_r. apply le_refl.
+ rewrite Pos2Nat.inj_mul. rewrite mult_comm.
+ unfold "^"%positive; simpl. rewrite Pos2Nat.inj_mul.
+ rewrite <- mult_assoc. rewrite <- mult_assoc.
+ apply Nat.mul_le_mono_nonneg_l. apply le_0_n.
+ rewrite (mult_1_r). rewrite Pos.mul_1_r.
+ apply Nat.mul_le_mono_nonneg_l. apply le_0_n.
+ apply (le_trans _ (p+0)). rewrite plus_0_r. assumption.
+ rewrite plus_0_r. apply le_refl.
+ rewrite factorDenom. apply Qle_refl.
+ + field. split. intro abs.
+ specialize (maj (Pos.to_nat k ^ 2 * p)%nat).
+ rewrite abs in maj. inversion maj.
+ intro abs.
+ specialize (maj (Pos.to_nat k ^ 2 * q)%nat).
+ rewrite abs in maj. inversion maj.
+Qed.
+
+Lemma CReal_inv_pos : forall (yn : nat -> Q) (k : positive),
+ (QCauchySeq yn Pos.to_nat)
+ -> (forall n : nat, 1 # k < yn n)%Q
+ -> QCauchySeq (fun n : nat => / yn (Pos.to_nat k ^ 2 * n)%nat) Pos.to_nat.
+Proof.
+ intros yn k cau maj n p q H0 H1.
+ setoid_replace (/ yn (Pos.to_nat k ^ 2 * p)%nat -
+ / yn (Pos.to_nat k ^ 2 * q)%nat)%Q
+ with ((yn (Pos.to_nat k ^ 2 * q)%nat -
+ yn (Pos.to_nat k ^ 2 * p)%nat)
+ / (yn (Pos.to_nat k ^ 2 * q)%nat *
+ yn (Pos.to_nat k ^ 2 * p)%nat)).
+ + apply (Qle_lt_trans _ (Qabs (yn (Pos.to_nat k ^ 2 * q)%nat
+ - yn (Pos.to_nat k ^ 2 * p)%nat)
+ / (1 # (k^2)))).
+ assert (1 # k ^ 2
+ < Qabs (yn (Pos.to_nat k ^ 2 * q)%nat * yn (Pos.to_nat k ^ 2 * p)%nat))%Q.
+ { rewrite Qabs_Qmult. unfold "^"%positive; simpl.
+ rewrite factorDenom. rewrite Pos.mul_1_r.
+ apply (Qlt_trans _ ((1#k) * Qabs (yn (Pos.to_nat k * (Pos.to_nat k * 1) * p)%nat))).
+ apply Qmult_lt_l. reflexivity. rewrite Qabs_pos.
+ specialize (maj (Pos.to_nat k * (Pos.to_nat k * 1) * p)%nat).
+ apply maj. apply (Qle_trans _ (1 # k)).
+ discriminate. apply Zlt_le_weak. apply maj.
+ apply Qmult_lt_r. apply (Qlt_trans 0 (1#k)). reflexivity.
+ rewrite Qabs_pos.
+ specialize (maj (Pos.to_nat k * (Pos.to_nat k * 1) * p)%nat).
+ apply maj. apply (Qle_trans _ (1 # k)). discriminate.
+ apply Zlt_le_weak. apply maj.
+ rewrite Qabs_pos.
+ specialize (maj (Pos.to_nat k * (Pos.to_nat k * 1) * q)%nat).
+ apply maj. apply (Qle_trans _ (1 # k)). discriminate.
+ apply Zlt_le_weak. apply maj. }
+ unfold Qdiv. rewrite Qabs_Qmult. rewrite Qabs_Qinv.
+ rewrite Qmult_comm. rewrite <- (Qmult_comm (/ (1 # k ^ 2))).
+ apply Qmult_le_compat_r. apply Qlt_le_weak.
+ rewrite <- Qmult_1_l. apply Qlt_shift_div_r.
+ apply (Qlt_trans 0 (1 # k ^ 2)). reflexivity. apply H.
+ rewrite Qmult_comm. apply Qlt_shift_div_l.
+ reflexivity. rewrite Qmult_1_l. apply H.
+ apply Qabs_nonneg. simpl in maj.
+ specialize (cau (n * (k^2))%positive
+ (Pos.to_nat k ^ 2 * q)%nat
+ (Pos.to_nat k ^ 2 * p)%nat).
+ apply Qlt_shift_div_r. reflexivity.
+ apply (Qlt_le_trans _ (1 # n * k ^ 2)). apply cau.
+ rewrite Pos2Nat.inj_mul. rewrite mult_comm.
+ unfold "^"%positive. simpl. rewrite Pos2Nat.inj_mul.
+ rewrite <- mult_assoc. rewrite <- mult_assoc.
+ apply Nat.mul_le_mono_nonneg_l. apply le_0_n.
+ rewrite (mult_1_r). rewrite Pos.mul_1_r.
+ apply Nat.mul_le_mono_nonneg_l. apply le_0_n.
+ apply (le_trans _ (q+0)). rewrite plus_0_r. assumption.
+ rewrite plus_0_r. apply le_refl.
+ rewrite Pos2Nat.inj_mul. rewrite mult_comm.
+ unfold "^"%positive; simpl. rewrite Pos2Nat.inj_mul.
+ rewrite <- mult_assoc. rewrite <- mult_assoc.
+ apply Nat.mul_le_mono_nonneg_l. apply le_0_n.
+ rewrite (mult_1_r). rewrite Pos.mul_1_r.
+ apply Nat.mul_le_mono_nonneg_l. apply le_0_n.
+ apply (le_trans _ (p+0)). rewrite plus_0_r. assumption.
+ rewrite plus_0_r. apply le_refl.
+ rewrite factorDenom. apply Qle_refl.
+ + field. split. intro abs.
+ specialize (maj (Pos.to_nat k ^ 2 * p)%nat).
+ rewrite abs in maj. inversion maj.
+ intro abs.
+ specialize (maj (Pos.to_nat k ^ 2 * q)%nat).
+ rewrite abs in maj. inversion maj.
+Qed.
+
+Definition CReal_inv (x : CReal) (xnz : x # 0) : CReal.
+Proof.
+ destruct xnz as [xNeg | xPos].
+ - destruct (CRealNegShift x xNeg) as [[k y] [_ maj]].
+ destruct y as [yn cau]; unfold proj1_sig, snd, fst in maj.
+ exists (fun n => Qinv (yn (mult (Pos.to_nat k^2) n))).
+ apply (CReal_inv_neg yn). apply cau. apply maj.
+ - destruct (CRealPosShift x xPos) as [[k y] [_ maj]].
+ destruct y as [yn cau]; unfold proj1_sig, snd, fst in maj.
+ exists (fun n => Qinv (yn (mult (Pos.to_nat k^2) n))).
+ apply (CReal_inv_pos yn). apply cau. apply maj.
+Defined.
+
+Notation "/ x" := (CReal_inv x) (at level 35, right associativity) : CReal_scope.
+
+Lemma CReal_inv_0_lt_compat
+ : forall (r : CReal) (rnz : r # 0),
+ 0 < r -> 0 < ((/ r) rnz).
+Proof.
+ intros. unfold CReal_inv. simpl.
+ destruct rnz.
+ - exfalso. apply CRealLt_asym in H. contradiction.
+ - destruct (CRealPosShift r c) as [[k rpos] [req maj]].
+ clear req. destruct rpos as [rn cau]; simpl in maj.
+ unfold CRealLt; simpl.
+ destruct (Qarchimedean (rn 1%nat)) as [A majA].
+ exists (2 * (A + 1))%positive. unfold Qminus. rewrite Qplus_0_r.
+ rewrite <- (Qmult_1_l (Qinv (rn (Pos.to_nat k * (Pos.to_nat k * 1) * Pos.to_nat (2 * (A + 1)))%nat))).
+ apply Qlt_shift_div_l. apply (Qlt_trans 0 (1#k)). reflexivity.
+ apply maj. rewrite <- (Qmult_inv_r (Z.pos A + 1 # 1)).
+ setoid_replace (2 # 2 * (A + 1))%Q with (Qinv (Z.pos A + 1 # 1)).
+ 2: reflexivity.
+ rewrite Qmult_comm. apply Qmult_lt_r. reflexivity.
+ rewrite mult_1_r. rewrite <- Pos2Nat.inj_mul. rewrite <- Pos2Nat.inj_mul.
+ rewrite <- (Qplus_lt_l _ _ (- rn 1%nat)).
+ apply (Qle_lt_trans _ (Qabs (rn (Pos.to_nat (k * k * (2 * (A + 1)))) + - rn 1%nat))).
+ apply Qle_Qabs. apply (Qlt_le_trans _ 1). apply cau.
+ apply Pos2Nat.is_pos. apply le_refl.
+ rewrite <- Qinv_plus_distr. rewrite <- (Qplus_comm 1).
+ rewrite <- Qplus_0_r. rewrite <- Qplus_assoc. rewrite <- Qplus_assoc.
+ rewrite Qplus_le_r. rewrite Qplus_0_l. apply Qlt_le_weak.
+ apply Qlt_minus_iff in majA. apply majA.
+ intro abs. inversion abs.
+Qed.
+
+Lemma CReal_linear_shift : forall (x : CReal) (k : nat),
+ le 1 k -> QCauchySeq (fun n => proj1_sig x (k * n)%nat) Pos.to_nat.
+Proof.
+ intros [xn limx] k lek p n m H H0. unfold proj1_sig.
+ apply limx. apply (le_trans _ n). apply H.
+ rewrite <- (mult_1_l n). rewrite mult_assoc.
+ apply Nat.mul_le_mono_nonneg_r. apply le_0_n.
+ rewrite mult_1_r. apply lek. apply (le_trans _ m). apply H0.
+ rewrite <- (mult_1_l m). rewrite mult_assoc.
+ apply Nat.mul_le_mono_nonneg_r. apply le_0_n.
+ rewrite mult_1_r. apply lek.
+Qed.
+
+Lemma CReal_linear_shift_eq : forall (x : CReal) (k : nat) (kPos : le 1 k),
+ CRealEq x
+ (exist (fun n : nat -> Q => QCauchySeq n Pos.to_nat)
+ (fun n : nat => proj1_sig x (k * n)%nat) (CReal_linear_shift x k kPos)).
+Proof.
+ intros. apply CRealEq_diff. intro n.
+ destruct x as [xn limx]; unfold proj1_sig.
+ specialize (limx n (Pos.to_nat n) (k * Pos.to_nat n)%nat).
+ apply (Qle_trans _ (1 # n)). apply Qlt_le_weak. apply limx.
+ apply le_refl. rewrite <- (mult_1_l (Pos.to_nat n)).
+ rewrite mult_assoc. apply Nat.mul_le_mono_nonneg_r. apply le_0_n.
+ rewrite mult_1_r. apply kPos. apply Z.mul_le_mono_nonneg_r.
+ discriminate. discriminate.
+Qed.
+
+Lemma CReal_inv_l : forall (r:CReal) (rnz : r # 0),
+ ((/ r) rnz) * r == 1.
+Proof.
+ intros. unfold CReal_inv; simpl.
+ destruct rnz.
+ - (* r < 0 *) destruct (CRealNegShift r c) as [[k rneg] [req maj]].
+ simpl in req. apply CRealEq_diff. apply CRealEq_modindep.
+ apply (QSeqEquivEx_trans _
+ (proj1_sig (CReal_mult ((let
+ (yn, cau) as s
+ return ((forall n : nat, proj1_sig s n < -1 # k) -> CReal) := rneg in
+ fun maj0 : forall n : nat, yn n < -1 # k =>
+ exist (fun x : nat -> Q => QCauchySeq x Pos.to_nat)
+ (fun n : nat => Qinv (yn (Pos.to_nat k * (Pos.to_nat k * 1) * n))%nat)
+ (CReal_inv_neg yn k cau maj0)) maj) rneg)))%Q.
+ + apply CRealEq_modindep. apply CRealEq_diff.
+ apply CReal_mult_proper_l. apply req.
+ + assert (le 1 (Pos.to_nat k * (Pos.to_nat k * 1))%nat). rewrite mult_1_r.
+ rewrite <- Pos2Nat.inj_mul. apply Pos2Nat.is_pos.
+ apply (QSeqEquivEx_trans _
+ (proj1_sig (CReal_mult ((let
+ (yn, cau) as s
+ return ((forall n : nat, proj1_sig s n < -1 # k) -> CReal) := rneg in
+ fun maj0 : forall n : nat, yn n < -1 # k =>
+ exist (fun x : nat -> Q => QCauchySeq x Pos.to_nat)
+ (fun n : nat => Qinv (yn (Pos.to_nat k * (Pos.to_nat k * 1) * n)%nat))
+ (CReal_inv_neg yn k cau maj0)) maj)
+ (exist _ (fun n => proj1_sig rneg (Pos.to_nat k * (Pos.to_nat k * 1) * n)%nat) (CReal_linear_shift rneg _ H)))))%Q.
+ apply CRealEq_modindep. apply CRealEq_diff.
+ apply CReal_mult_proper_l. apply CReal_linear_shift_eq.
+ destruct r as [rn limr], rneg as [rnn limneg]; simpl.
+ destruct (QCauchySeq_bounded
+ (fun n : nat => Qinv (rnn (Pos.to_nat k * (Pos.to_nat k * 1) * n)%nat))
+ Pos.to_nat (CReal_inv_neg rnn k limneg maj)).
+ destruct (QCauchySeq_bounded
+ (fun n : nat => rnn (Pos.to_nat k * (Pos.to_nat k * 1) * n)%nat)
+ Pos.to_nat
+ (CReal_linear_shift
+ (exist (fun x0 : nat -> Q => QCauchySeq x0 Pos.to_nat) rnn limneg)
+ (Pos.to_nat k * (Pos.to_nat k * 1)) H)) ; simpl.
+ exists (fun n => 1%nat). intros p n m H0 H1. rewrite Qmult_comm.
+ rewrite Qmult_inv_r. unfold Qminus. rewrite Qplus_opp_r.
+ reflexivity. intro abs.
+ specialize (maj (Pos.to_nat k * (Pos.to_nat k * 1)
+ * (Pos.to_nat (Pos.max x x0)~0 * n))%nat).
+ simpl in maj. rewrite abs in maj. inversion maj.
+ - (* r > 0 *) destruct (CRealPosShift r c) as [[k rneg] [req maj]].
+ simpl in req. apply CRealEq_diff. apply CRealEq_modindep.
+ apply (QSeqEquivEx_trans _
+ (proj1_sig (CReal_mult ((let
+ (yn, cau) as s
+ return ((forall n : nat, 1 # k < proj1_sig s n) -> CReal) := rneg in
+ fun maj0 : forall n : nat, 1 # k < yn n =>
+ exist (fun x : nat -> Q => QCauchySeq x Pos.to_nat)
+ (fun n : nat => Qinv (yn (Pos.to_nat k * (Pos.to_nat k * 1) * n)%nat))
+ (CReal_inv_pos yn k cau maj0)) maj) rneg)))%Q.
+ + apply CRealEq_modindep. apply CRealEq_diff.
+ apply CReal_mult_proper_l. apply req.
+ + assert (le 1 (Pos.to_nat k * (Pos.to_nat k * 1))%nat). rewrite mult_1_r.
+ rewrite <- Pos2Nat.inj_mul. apply Pos2Nat.is_pos.
+ apply (QSeqEquivEx_trans _
+ (proj1_sig (CReal_mult ((let
+ (yn, cau) as s
+ return ((forall n : nat, 1 # k < proj1_sig s n) -> CReal) := rneg in
+ fun maj0 : forall n : nat, 1 # k < yn n =>
+ exist (fun x : nat -> Q => QCauchySeq x Pos.to_nat)
+ (fun n : nat => Qinv (yn (Pos.to_nat k * (Pos.to_nat k * 1) * n)%nat))
+ (CReal_inv_pos yn k cau maj0)) maj)
+ (exist _ (fun n => proj1_sig rneg (Pos.to_nat k * (Pos.to_nat k * 1) * n)%nat) (CReal_linear_shift rneg _ H)))))%Q.
+ apply CRealEq_modindep. apply CRealEq_diff.
+ apply CReal_mult_proper_l. apply CReal_linear_shift_eq.
+ destruct r as [rn limr], rneg as [rnn limneg]; simpl.
+ destruct (QCauchySeq_bounded
+ (fun n : nat => Qinv (rnn (Pos.to_nat k * (Pos.to_nat k * 1) * n)%nat))
+ Pos.to_nat (CReal_inv_pos rnn k limneg maj)).
+ destruct (QCauchySeq_bounded
+ (fun n : nat => rnn (Pos.to_nat k * (Pos.to_nat k * 1) * n)%nat)
+ Pos.to_nat
+ (CReal_linear_shift
+ (exist (fun x0 : nat -> Q => QCauchySeq x0 Pos.to_nat) rnn limneg)
+ (Pos.to_nat k * (Pos.to_nat k * 1)) H)) ; simpl.
+ exists (fun n => 1%nat). intros p n m H0 H1. rewrite Qmult_comm.
+ rewrite Qmult_inv_r. unfold Qminus. rewrite Qplus_opp_r.
+ reflexivity. intro abs.
+ specialize (maj (Pos.to_nat k * (Pos.to_nat k * 1)
+ * (Pos.to_nat (Pos.max x x0)~0 * n))%nat).
+ simpl in maj. rewrite abs in maj. inversion maj.
+Qed.
+
+Lemma CReal_inv_r : forall (r:CReal) (rnz : r # 0),
+ r * ((/ r) rnz) == 1.
+Proof.
+ intros. rewrite CReal_mult_comm, CReal_inv_l.
+ reflexivity.
+Qed.
+
+Lemma CReal_inv_1 : forall nz : 1 # 0, (/ 1) nz == 1.
+Proof.
+ intros. rewrite <- (CReal_mult_1_l ((/1) nz)). rewrite CReal_inv_r.
+ reflexivity.
+Qed.
+
+Lemma CReal_inv_mult_distr :
+ forall r1 r2 (r1nz : r1 # 0) (r2nz : r2 # 0) (rmnz : (r1*r2) # 0),
+ (/ (r1 * r2)) rmnz == (/ r1) r1nz * (/ r2) r2nz.
+Proof.
+ intros. apply (CReal_mult_eq_reg_l r1). exact r1nz.
+ rewrite <- CReal_mult_assoc. rewrite CReal_inv_r. rewrite CReal_mult_1_l.
+ apply (CReal_mult_eq_reg_l r2). exact r2nz.
+ rewrite CReal_inv_r. rewrite <- CReal_mult_assoc.
+ rewrite (CReal_mult_comm r2 r1). rewrite CReal_inv_r.
+ reflexivity.
+Qed.
+
+Lemma Rinv_eq_compat : forall x y (rxnz : x # 0) (rynz : y # 0),
+ x == y
+ -> (/ x) rxnz == (/ y) rynz.
+Proof.
+ intros. apply (CReal_mult_eq_reg_l x). exact rxnz.
+ rewrite CReal_inv_r, H, CReal_inv_r. reflexivity.
+Qed.
+
+Lemma CReal_mult_lt_reg_l : forall r r1 r2, 0 < r -> r * r1 < r * r2 -> r1 < r2.
+Proof.
+ intros z x y H H0.
+ apply (CReal_mult_lt_compat_l ((/z) (inr H))) in H0.
+ repeat rewrite <- CReal_mult_assoc in H0. rewrite CReal_inv_l in H0.
+ repeat rewrite CReal_mult_1_l in H0. apply H0.
+ apply CReal_inv_0_lt_compat. exact H.
+Qed.
+
+Lemma CReal_mult_lt_reg_r : forall r r1 r2, 0 < r -> r1 * r < r2 * r -> r1 < r2.
+Proof.
+ intros.
+ apply CReal_mult_lt_reg_l with r.
+ exact H.
+ now rewrite 2!(CReal_mult_comm r).
+Qed.
+
+Lemma CReal_mult_eq_reg_r : forall r r1 r2, r1 * r == r2 * r -> r # 0 -> r1 == r2.
+Proof.
+ intros. apply (CReal_mult_eq_reg_l r). exact H0.
+ now rewrite 2!(CReal_mult_comm r).
+Qed.
+
+Lemma CReal_mult_eq_compat_l : forall r r1 r2, r1 == r2 -> r * r1 == r * r2.
+Proof.
+ intros. rewrite H. reflexivity.
+Qed.
+
+Lemma CReal_mult_eq_compat_r : forall r r1 r2, r1 == r2 -> r1 * r == r2 * r.
+Proof.
+ intros. rewrite H. reflexivity.
+Qed.
+
+(* In particular x * y == 1 implies that 0 # x, 0 # y and
+ that x and y are inverses of each other. *)
+Lemma CReal_mult_pos_appart_zero : forall x y : CReal, 0 < x * y -> 0 # x.
+Proof.
+ intros. destruct (linear_order_T 0 x 1 (CRealLt_0_1)).
+ left. exact c. destruct (linear_order_T (CReal_opp 1) x 0).
+ rewrite <- CReal_opp_0. apply CReal_opp_gt_lt_contravar, CRealLt_0_1.
+ 2: right; exact c0.
+ pose proof (CRealLt_above _ _ H). destruct H0 as [k kmaj].
+ simpl in kmaj.
+ apply CRealLt_above in c. destruct c as [i imaj]. simpl in imaj.
+ apply CRealLt_above in c0. destruct c0 as [j jmaj]. simpl in jmaj.
+ pose proof (CReal_abs_appart_zero y).
+ destruct x as [xn xcau], y as [yn ycau]. simpl in kmaj.
+ destruct (QCauchySeq_bounded xn Pos.to_nat xcau) as [a amaj],
+ (QCauchySeq_bounded yn Pos.to_nat ycau) as [b bmaj]; simpl in kmaj.
+ clear amaj bmaj. simpl in imaj, jmaj. simpl in H0.
+ specialize (kmaj (Pos.max k (Pos.max i j)) (Pos.le_max_l _ _)).
+ destruct (H0 ((Pos.max a b)~0 * (Pos.max k (Pos.max i j)))%positive).
+ - apply (Qlt_trans _ (2#k)).
+ + unfold Qlt. rewrite <- Z.mul_lt_mono_pos_l. 2: reflexivity.
+ unfold Qden. apply Pos2Z.pos_lt_pos.
+ apply (Pos.le_lt_trans _ (1 * Pos.max k (Pos.max i j))).
+ rewrite Pos.mul_1_l. apply Pos.le_max_l.
+ apply Pos2Nat.inj_lt. do 2 rewrite Pos2Nat.inj_mul.
+ rewrite <- Nat.mul_lt_mono_pos_r. 2: apply Pos2Nat.is_pos.
+ fold (2*Pos.max a b)%positive. rewrite Pos2Nat.inj_mul.
+ apply Nat.lt_1_mul_pos. auto. apply Pos2Nat.is_pos.
+ + apply (Qlt_le_trans _ _ _ kmaj). unfold Qminus. rewrite Qplus_0_r.
+ rewrite <- (Qmult_1_l (Qabs (yn (Pos.to_nat ((Pos.max a b)~0 * Pos.max k (Pos.max i j)))))).
+ apply (Qle_trans _ _ _ (Qle_Qabs _)). rewrite Qabs_Qmult.
+ replace (Pos.to_nat (Pos.max a b)~0 * Pos.to_nat (Pos.max k (Pos.max i j)))%nat
+ with (Pos.to_nat ((Pos.max a b)~0 * Pos.max k (Pos.max i j))).
+ 2: apply Pos2Nat.inj_mul.
+ apply Qmult_le_compat_r. 2: apply Qabs_nonneg.
+ apply Qabs_Qle_condition. split.
+ apply Qlt_le_weak. apply Qlt_minus_iff, (Qlt_trans _ (2#j)).
+ reflexivity. apply jmaj.
+ apply (Pos.le_trans _ (1 * Pos.max k (Pos.max i j))).
+ rewrite Pos.mul_1_l.
+ apply (Pos.le_trans _ (Pos.max i j) _ (Pos.le_max_r _ _)).
+ apply Pos.le_max_r.
+ apply Pos2Nat.inj_le. do 2 rewrite Pos2Nat.inj_mul.
+ rewrite <- Nat.mul_le_mono_pos_r. 2: apply Pos2Nat.is_pos.
+ apply Pos2Nat.is_pos.
+ apply Qlt_le_weak. apply Qlt_minus_iff, (Qlt_trans _ (2#i)).
+ reflexivity. apply imaj.
+ apply (Pos.le_trans _ (1 * Pos.max k (Pos.max i j))).
+ rewrite Pos.mul_1_l.
+ apply (Pos.le_trans _ (Pos.max i j) _ (Pos.le_max_l _ _)).
+ apply Pos.le_max_r.
+ apply Pos2Nat.inj_le. do 2 rewrite Pos2Nat.inj_mul.
+ rewrite <- Nat.mul_le_mono_pos_r. 2: apply Pos2Nat.is_pos.
+ apply Pos2Nat.is_pos.
+ - left. apply (CReal_mult_lt_reg_r (exist _ yn ycau) _ _ c).
+ rewrite CReal_mult_0_l. exact H.
+ - right. apply (CReal_mult_lt_reg_r (CReal_opp (exist _ yn ycau))).
+ rewrite <- CReal_opp_0. apply CReal_opp_gt_lt_contravar. exact c.
+ rewrite CReal_mult_0_l, <- CReal_opp_0, <- CReal_opp_mult_distr_r.
+ apply CReal_opp_gt_lt_contravar. exact H.
+Qed.
+
+Fixpoint pow (r:CReal) (n:nat) : CReal :=
+ match n with
+ | O => 1
+ | S n => r * (pow r n)
+ end.
+
+
+Lemma CReal_mult_le_compat_l_half : forall r r1 r2,
+ 0 < r -> r1 <= r2 -> r * r1 <= r * r2.
+Proof.
+ intros. intro abs. apply (CReal_mult_lt_reg_l) in abs.
+ contradiction. apply H.
+Qed.
+
+Lemma CReal_invQ : forall (b : positive) (pos : Qlt 0 (Z.pos b # 1)),
+ CRealEq (CReal_inv (inject_Q (Z.pos b # 1)) (inr (CReal_injectQPos (Z.pos b # 1) pos)))
+ (inject_Q (1 # b)).
+Proof.
+ intros.
+ apply (CReal_mult_eq_reg_l (inject_Q (Z.pos b # 1))).
+ - right. apply CReal_injectQPos. exact pos.
+ - rewrite CReal_mult_comm, CReal_inv_l.
+ apply CRealEq_diff. intro n. simpl;
+ destruct (QCauchySeq_bounded (fun _ : nat => 1 # b)%Q Pos.to_nat (ConstCauchy (1 # b))),
+ (QCauchySeq_bounded (fun _ : nat => Z.pos b # 1)%Q Pos.to_nat (ConstCauchy (Z.pos b # 1))); simpl.
+ do 2 rewrite Pos.mul_1_r. rewrite Z.pos_sub_diag. discriminate.
+Qed.
+
+Definition CRealQ_dense (a b : CReal)
+ : a < b -> { q : Q & a < inject_Q q < b }.
+Proof.
+ (* Locate a and b at the index given by a q) Pos.to_nat (ConstCauchy q)).
+ destruct (QCauchySeq_bounded (fun _ : nat => r) Pos.to_nat (ConstCauchy r)).
+ simpl in maj. ring_simplify in maj. discriminate maj.
+ - intros [n maj]. simpl in maj.
+ destruct (QCauchySeq_bounded (fun _ : nat => q) Pos.to_nat (ConstCauchy q)).
+ destruct (QCauchySeq_bounded (fun _ : nat => r) Pos.to_nat (ConstCauchy r)).
+ simpl in maj. ring_simplify in maj. discriminate maj.
+Qed.
+
+Definition Rup_nat (x : CReal)
+ : { n : nat & x < inject_Q (Z.of_nat n #1) }.
+Proof.
+ intros. destruct (CRealArchimedean x) as [p maj].
+ destruct p.
+ - exists O. apply maj.
+ - exists (Pos.to_nat p). rewrite positive_nat_Z. apply maj.
+ - exists O. apply (CReal_lt_trans _ (inject_Q (Z.neg p # 1))).
+ apply maj. apply inject_Q_lt. reflexivity.
+Qed.
+
+Lemma CReal_mult_le_0_compat : forall (a b : CReal),
+ 0 <= a -> 0 <= b -> 0 <= a * b.
+Proof.
+ (* Limit of (a + 1/n)*b when n -> infty. *)
+ intros. intro abs.
+ assert (0 < -(a*b)) as epsPos.
+ { rewrite <- CReal_opp_0. apply CReal_opp_gt_lt_contravar. exact abs. }
+ destruct (Rup_nat (b * (/ (-(a*b))) (inr epsPos)))
+ as [n maj].
+ destruct n as [|n].
+ - apply (CReal_mult_lt_compat_r (-(a*b))) in maj.
+ rewrite CReal_mult_0_l, CReal_mult_assoc, CReal_inv_l, CReal_mult_1_r in maj.
+ contradiction. exact epsPos.
+ - (* n > 0 *)
+ assert (0 < inject_Q (Z.of_nat (S n) #1)) as nPos.
+ { apply inject_Q_lt. unfold Qlt, Qnum, Qden.
+ do 2 rewrite Z.mul_1_r. apply Z2Nat.inj_lt. discriminate.
+ apply Zle_0_nat. rewrite Nat2Z.id. apply le_n_S, le_0_n. }
+ assert (b * (/ inject_Q (Z.of_nat (S n) #1)) (inr nPos) < -(a*b)).
+ { apply (CReal_mult_lt_reg_r (inject_Q (Z.of_nat (S n) #1))). apply nPos.
+ rewrite CReal_mult_assoc, CReal_inv_l, CReal_mult_1_r.
+ apply (CReal_mult_lt_compat_r (-(a*b))) in maj.
+ rewrite CReal_mult_assoc, CReal_inv_l, CReal_mult_1_r in maj.
+ rewrite CReal_mult_comm. apply maj. apply epsPos. }
+ pose proof (CReal_mult_le_compat_l_half
+ (a + (/ inject_Q (Z.of_nat (S n) #1)) (inr nPos)) 0 b).
+ assert (0 + 0 < a + (/ inject_Q (Z.of_nat (S n) #1)) (inr nPos)).
+ { apply CReal_plus_le_lt_compat. apply H. apply CReal_inv_0_lt_compat. apply nPos. }
+ rewrite CReal_plus_0_l in H3. specialize (H2 H3 H0).
+ clear H3. rewrite CReal_mult_0_r in H2.
+ apply H2. clear H2. rewrite CReal_mult_plus_distr_r.
+ apply (CReal_plus_lt_compat_l (a*b)) in H1.
+ rewrite CReal_plus_opp_r in H1.
+ rewrite (CReal_mult_comm ((/ inject_Q (Z.of_nat (S n) #1)) (inr nPos))).
+ apply H1.
+Qed.
+
+Lemma CReal_mult_le_compat_l : forall (r r1 r2:CReal),
+ 0 <= r -> r1 <= r2 -> r * r1 <= r * r2.
+Proof.
+ intros. apply (CReal_plus_le_reg_r (-(r*r1))).
+ rewrite CReal_plus_opp_r, CReal_opp_mult_distr_r.
+ rewrite <- CReal_mult_plus_distr_l.
+ apply CReal_mult_le_0_compat. exact H.
+ apply (CReal_plus_le_reg_r r1).
+ rewrite CReal_plus_0_l, CReal_plus_assoc, CReal_plus_opp_l, CReal_plus_0_r.
+ exact H0.
+Qed.
+
+Lemma CReal_mult_le_compat_r : forall (r r1 r2:CReal),
+ 0 <= r -> r1 <= r2 -> r1 * r <= r2 * r.
+Proof.
+ intros. apply (CReal_plus_le_reg_r (-(r1*r))).
+ rewrite CReal_plus_opp_r, CReal_opp_mult_distr_l.
+ rewrite <- CReal_mult_plus_distr_r.
+ apply CReal_mult_le_0_compat. 2: exact H.
+ apply (CReal_plus_le_reg_r r1). ring_simplify. exact H0.
+Qed.
+
+Lemma CReal_mult_le_reg_l :
+ forall x y z : CReal,
+ 0 < x -> x * y <= x * z -> y <= z.
+Proof.
+ intros. intro abs.
+ apply (CReal_mult_lt_compat_l x) in abs. contradiction.
+ exact H.
+Qed.
+
+Lemma CReal_mult_le_reg_r :
+ forall x y z : CReal,
+ 0 < x -> y * x <= z * x -> y <= z.
+Proof.
+ intros. intro abs.
+ apply (CReal_mult_lt_compat_r x) in abs. contradiction.
+ exact H.
+Qed.
diff --git a/theories/Reals/Cauchy/ConstructiveRcomplete.v b/theories/Reals/Cauchy/ConstructiveRcomplete.v
new file mode 100644
index 0000000000..51fd0dd7f9
--- /dev/null
+++ b/theories/Reals/Cauchy/ConstructiveRcomplete.v
@@ -0,0 +1,446 @@
+(************************************************************************)
+(* * The Coq Proof Assistant / The Coq Development Team *)
+(* v * Copyright INRIA, CNRS and contributors *)
+(* CReal) (l : CReal) : Set
+ := forall p : positive,
+ { n : nat | forall i:nat, le n i -> CReal_abs (un i - l) <= inject_Q (1#p) }.
+
+Definition Un_cauchy_mod (un : nat -> CReal) : Set
+ := forall p : positive,
+ { n : nat | forall i j:nat, le n i -> le n j
+ -> CReal_abs (un i - un j) <= inject_Q (1#p) }.
+
+Lemma seq_cv_proper : forall (un : nat -> CReal) (a b : CReal),
+ seq_cv un a
+ -> a == b
+ -> seq_cv un b.
+Proof.
+ intros. intro p. specialize (H p) as [n H].
+ exists n. intros. rewrite <- H0. apply H, H1.
+Qed.
+
+Instance seq_cv_morph
+ : forall (un : nat -> CReal), CMorphisms.Proper
+ (CMorphisms.respectful CRealEq CRelationClasses.iffT) (seq_cv un).
+Proof.
+ split. intros. apply (seq_cv_proper un x). exact H0. exact H.
+ intros. apply (seq_cv_proper un y). exact H0. symmetry. exact H.
+Qed.
+
+Lemma growing_transit : forall un : nat -> CReal,
+ (forall n:nat, un n <= un (S n))
+ -> forall n p : nat, le n p -> un n <= un p.
+Proof.
+ induction p.
+ - intros. inversion H0. apply CRealLe_refl.
+ - intros. apply Nat.le_succ_r in H0. destruct H0.
+ apply (CReal_le_trans _ (un p)). apply IHp, H0. apply H.
+ subst n. apply CRealLe_refl.
+Qed.
+
+Lemma growing_infinite : forall un : nat -> nat,
+ (forall n:nat, lt (un n) (un (S n)))
+ -> forall n : nat, le n (un n).
+Proof.
+ induction n.
+ - apply le_0_n.
+ - specialize (H n). unfold lt in H.
+ apply (le_trans _ (S (un n))). apply le_n_S, IHn. exact H.
+Qed.
+
+Lemma Un_cv_growing : forall (un : nat -> CReal) (l : CReal),
+ (forall n:nat, un n <= un (S n))
+ -> (forall n:nat, un n <= l)
+ -> (forall p : positive, { n : nat | l - un n <= inject_Q (1#p) })
+ -> seq_cv un l.
+Proof.
+ intros. intro p.
+ specialize (H1 p) as [n nmaj]. exists n.
+ intros. rewrite CReal_abs_minus_sym, CReal_abs_right.
+ apply (CReal_le_trans _ (l - un n)). apply CReal_plus_le_compat_l.
+ apply CReal_opp_ge_le_contravar.
+ exact (growing_transit _ H n i H1). exact nmaj.
+ rewrite <- (CReal_plus_opp_r (un i)). apply CReal_plus_le_compat.
+ apply H0. apply CRealLe_refl.
+Qed.
+
+
+
+(* Sharpen the archimedean property : constructive versions of
+ the usual floor and ceiling functions. *)
+Definition Rfloor (a : CReal)
+ : { p : Z & inject_Q (p#1) < a < inject_Q (p#1) + 2 }.
+Proof.
+ destruct (CRealArchimedean a) as [n [H H0]].
+ exists (n-2)%Z. split.
+ - setoid_replace (n - 2 # 1)%Q with ((n#1) + - 2)%Q.
+ rewrite inject_Q_plus, (opp_inject_Q 2).
+ apply (CReal_plus_lt_reg_r 2). ring_simplify.
+ rewrite CReal_plus_comm. exact H0.
+ rewrite Qinv_plus_distr. reflexivity.
+ - setoid_replace (n - 2 # 1)%Q with ((n#1) + - 2)%Q.
+ rewrite inject_Q_plus, (opp_inject_Q 2).
+ ring_simplify. exact H.
+ rewrite Qinv_plus_distr. reflexivity.
+Defined.
+
+
+(* A point in an archimedean field is the limit of a
+ sequence of rational numbers (n maps to the q between
+ a and a+1/n). This will yield a maximum
+ archimedean field, which is the field of real numbers. *)
+Definition FQ_dense (a b : CReal)
+ : a < b -> { q : Q & a < inject_Q q < b }.
+Proof.
+ intros H. assert (0 < b - a) as epsPos.
+ { apply (CReal_plus_lt_compat_l (-a)) in H.
+ rewrite CReal_plus_opp_l, CReal_plus_comm in H.
+ apply H. }
+ pose proof (Rup_pos ((/(b-a)) (inr epsPos)))
+ as [n maj].
+ destruct (Rfloor (inject_Q (2 * Z.pos n # 1) * b)) as [p maj2].
+ exists (p # (2*n))%Q. split.
+ - apply (CReal_lt_trans a (b - inject_Q (1 # n))).
+ apply (CReal_plus_lt_reg_r (inject_Q (1#n))).
+ unfold CReal_minus. rewrite CReal_plus_assoc. rewrite CReal_plus_opp_l.
+ rewrite CReal_plus_0_r. apply (CReal_plus_lt_reg_l (-a)).
+ rewrite <- CReal_plus_assoc, CReal_plus_opp_l, CReal_plus_0_l.
+ rewrite CReal_plus_comm.
+ apply (CReal_mult_lt_reg_l (inject_Q (Z.pos n # 1))).
+ apply inject_Q_lt. reflexivity. rewrite <- inject_Q_mult.
+ setoid_replace ((Z.pos n # 1) * (1 # n))%Q with 1%Q.
+ apply (CReal_mult_lt_compat_l (b-a)) in maj.
+ rewrite CReal_inv_r, CReal_mult_comm in maj. exact maj.
+ exact epsPos. unfold Qeq; simpl. do 2 rewrite Pos.mul_1_r. reflexivity.
+ apply (CReal_plus_lt_reg_r (inject_Q (1 # n))).
+ unfold CReal_minus. rewrite CReal_plus_assoc, CReal_plus_opp_l.
+ rewrite CReal_plus_0_r. rewrite <- inject_Q_plus.
+ destruct maj2 as [_ maj2].
+ setoid_replace ((p # 2 * n) + (1 # n))%Q
+ with ((p + 2 # 2 * n))%Q.
+ apply (CReal_mult_lt_reg_r (inject_Q (Z.pos (2 * n) # 1))).
+ apply inject_Q_lt. reflexivity. rewrite <- inject_Q_mult.
+ setoid_replace ((p + 2 # 2 * n) * (Z.pos (2 * n) # 1))%Q
+ with ((p#1) + 2)%Q.
+ rewrite inject_Q_plus. rewrite Pos2Z.inj_mul.
+ rewrite CReal_mult_comm. exact maj2.
+ unfold Qeq; simpl. rewrite Pos.mul_1_r, Z.mul_1_r. ring.
+ setoid_replace (1#n)%Q with (2#2*n)%Q. 2: reflexivity.
+ apply Qinv_plus_distr.
+ - destruct maj2 as [maj2 _].
+ apply (CReal_mult_lt_reg_r (inject_Q (Z.pos (2 * n) # 1))).
+ apply inject_Q_lt. reflexivity.
+ rewrite <- inject_Q_mult.
+ setoid_replace ((p # 2 * n) * (Z.pos (2 * n) # 1))%Q
+ with ((p#1))%Q.
+ rewrite CReal_mult_comm. exact maj2.
+ unfold Qeq; simpl. rewrite Pos.mul_1_r, Z.mul_1_r. reflexivity.
+Qed.
+
+Definition RQ_limit : forall (x : CReal) (n:nat),
+ { q:Q & x < inject_Q q < x + inject_Q (1 # Pos.of_nat n) }.
+Proof.
+ intros x n. apply (FQ_dense x (x + inject_Q (1 # Pos.of_nat n))).
+ rewrite <- (CReal_plus_0_r x). rewrite CReal_plus_assoc.
+ apply CReal_plus_lt_compat_l. rewrite CReal_plus_0_l. apply inject_Q_lt.
+ reflexivity.
+Qed.
+
+Lemma Qabs_Rabs : forall q : Q,
+ inject_Q (Qabs q) == CReal_abs (inject_Q q).
+Proof.
+ intro q. apply Qabs_case.
+ - intros. rewrite CReal_abs_right. reflexivity.
+ apply inject_Q_le, H.
+ - intros. rewrite CReal_abs_left, opp_inject_Q. reflexivity.
+ apply inject_Q_le, H.
+Qed.
+
+Definition Un_cauchy_Q (xn : nat -> Q) : Set
+ := forall n : positive,
+ { k : nat | forall p q : nat, le k p -> le k q
+ -> (Qabs (xn p - xn q) <= 1#n)%Q }.
+
+Lemma CReal_smaller_interval : forall a b c d : CReal,
+ a <= c -> c <= b
+ -> a <= d -> d <= b
+ -> CReal_abs (d - c) <= b-a.
+Proof.
+ intros. apply CReal_abs_le. split.
+ - apply (CReal_plus_le_reg_l (b+c)). ring_simplify.
+ apply CReal_plus_le_compat; assumption.
+ - apply (CReal_plus_le_reg_l (a+c)). ring_simplify.
+ apply CReal_plus_le_compat; assumption.
+Qed.
+
+Lemma Rdiag_cauchy_sequence : forall (xn : nat -> CReal),
+ Un_cauchy_mod xn
+ -> Un_cauchy_Q (fun n:nat => let (l,_) := RQ_limit (xn n) n in l).
+Proof.
+ intros xn H p. specialize (H (2 * p)%positive) as [k cv].
+ exists (max k (2 * Pos.to_nat p)). intros.
+ specialize (cv p0 q
+ (le_trans _ _ _ (Nat.le_max_l _ _) H)
+ (le_trans _ _ _ (Nat.le_max_l _ _) H0)).
+ destruct (RQ_limit (xn p0) p0) as [r rmaj].
+ destruct (RQ_limit (xn q) q) as [s smaj].
+ apply Qabs_Qle_condition. split.
+ - apply le_inject_Q. unfold Qminus.
+ apply (CReal_le_trans _ (xn p0 - (xn q + inject_Q (1 # 2 * p)))).
+ + unfold CReal_minus. rewrite CReal_opp_plus_distr.
+ rewrite <- CReal_plus_assoc.
+ apply (CReal_plus_le_reg_r (xn q - xn p0 - inject_Q (-(1#p)))).
+ ring_simplify. unfold CReal_minus. do 2 rewrite <- opp_inject_Q.
+ rewrite <- inject_Q_plus.
+ setoid_replace (- - (1 # p) + - (1 # 2 * p))%Q with (1 # 2 * p)%Q.
+ rewrite CReal_abs_minus_sym in cv.
+ exact (CReal_le_trans _ _ _ (CReal_le_abs _ ) cv).
+ rewrite Qopp_involutive.
+ setoid_replace (1#p)%Q with (2 # 2 *p)%Q. rewrite Qinv_minus_distr.
+ reflexivity. reflexivity.
+ + rewrite inject_Q_plus. apply CReal_plus_le_compat.
+ apply CRealLt_asym.
+ destruct (RQ_limit (xn p0) p0); simpl. apply rmaj.
+ apply CRealLt_asym.
+ rewrite opp_inject_Q. apply CReal_opp_gt_lt_contravar.
+ destruct smaj. apply (CReal_lt_le_trans _ _ _ c0).
+ apply CReal_plus_le_compat_l. apply inject_Q_le.
+ apply Z2Nat.inj_le. discriminate. discriminate.
+ simpl. assert ((Pos.to_nat p~0 <= q)%nat).
+ { apply (le_trans _ (Init.Nat.max k (2 * Pos.to_nat p))).
+ 2: apply H0. replace (p~0)%positive with (2*p)%positive.
+ 2: reflexivity. rewrite Pos2Nat.inj_mul.
+ apply Nat.le_max_r. }
+ rewrite Nat2Pos.id. apply H1. intro abs. subst q.
+ inversion H1. pose proof (Pos2Nat.is_pos (p~0)).
+ rewrite H3 in H2. inversion H2.
+ - apply le_inject_Q. unfold Qminus.
+ apply (CReal_le_trans _ (xn p0 + inject_Q (1 # 2 * p) - xn q)).
+ + rewrite inject_Q_plus. apply CReal_plus_le_compat.
+ apply CRealLt_asym.
+ destruct (RQ_limit (xn p0) p0); unfold proj1_sig.
+ apply (CReal_lt_le_trans _ (xn p0 + inject_Q (1 # Pos.of_nat p0))).
+ apply rmaj. apply CReal_plus_le_compat_l. apply inject_Q_le.
+ apply Z2Nat.inj_le. discriminate. discriminate.
+ simpl. assert ((Pos.to_nat p~0 <= p0)%nat).
+ { apply (le_trans _ (Init.Nat.max k (2 * Pos.to_nat p))).
+ 2: apply H. replace (p~0)%positive with (2*p)%positive.
+ 2: reflexivity. rewrite Pos2Nat.inj_mul.
+ apply Nat.le_max_r. }
+ rewrite Nat2Pos.id. apply H1. intro abs. subst p0.
+ inversion H1. pose proof (Pos2Nat.is_pos (p~0)).
+ rewrite H3 in H2. inversion H2.
+ apply CRealLt_asym.
+ rewrite opp_inject_Q. apply CReal_opp_gt_lt_contravar.
+ destruct (RQ_limit (xn q) q); simpl. apply smaj.
+ + unfold CReal_minus. rewrite (CReal_plus_comm (xn p0)).
+ rewrite CReal_plus_assoc.
+ apply (CReal_plus_le_reg_l (- inject_Q (1 # 2 * p))).
+ rewrite <- CReal_plus_assoc. rewrite CReal_plus_opp_l. rewrite CReal_plus_0_l.
+ rewrite <- opp_inject_Q. rewrite <- inject_Q_plus.
+ setoid_replace (- (1 # 2 * p) + (1 # p))%Q with (1 # 2 * p)%Q.
+ exact (CReal_le_trans _ _ _ (CReal_le_abs _) cv).
+ rewrite Qplus_comm.
+ setoid_replace (1#p)%Q with (2 # 2*p)%Q. rewrite Qinv_minus_distr.
+ reflexivity. reflexivity.
+Qed.
+
+Lemma CReal_absSmall : forall (x y : CReal) (n : positive),
+ (Qlt (2 # n)
+ (proj1_sig x (Pos.to_nat n) - Qabs (proj1_sig y (Pos.to_nat n))))
+ -> CReal_abs y <= x.
+Proof.
+ intros x y n maj. apply CReal_abs_le. split.
+ - apply CRealLt_asym. exists n. destruct x as [xn caux], y as [yn cauy]; simpl.
+ simpl in maj. unfold Qminus. rewrite Qopp_involutive.
+ rewrite Qplus_comm.
+ apply (Qlt_le_trans _ (xn (Pos.to_nat n) - Qabs (yn (Pos.to_nat n)))).
+ apply maj. apply Qplus_le_r.
+ rewrite <- (Qopp_involutive (yn (Pos.to_nat n))).
+ apply Qopp_le_compat. rewrite Qabs_opp. apply Qle_Qabs.
+ - apply CRealLt_asym. exists n. destruct x as [xn caux], y as [yn cauy]; simpl.
+ simpl in maj.
+ apply (Qlt_le_trans _ (xn (Pos.to_nat n) - Qabs (yn (Pos.to_nat n)))).
+ apply maj. apply Qplus_le_r. apply Qopp_le_compat. apply Qle_Qabs.
+Qed.
+
+
+(* An element of CReal is a Cauchy sequence of rational numbers,
+ show that it converges to itself in CReal. *)
+Lemma CReal_cv_self : forall (qn : nat -> Q) (x : CReal) (cvmod : positive -> nat),
+ QSeqEquiv qn (fun n => proj1_sig x n) cvmod
+ -> seq_cv (fun n => inject_Q (qn n)) x.
+Proof.
+ intros qn x cvmod H p.
+ specialize (H (2*p)%positive). exists (cvmod (2*p)%positive).
+ intros p0 H0.
+ apply (CReal_absSmall
+ _ _ (Pos.max (4 * p)%positive (Pos.of_nat (cvmod (2 * p)%positive)))).
+ setoid_replace (proj1_sig (inject_Q (1 # p)) (Pos.to_nat (Pos.max (4 * p) (Pos.of_nat (cvmod (2 * p)%positive)))))
+ with (1 # p)%Q.
+ 2: reflexivity.
+ setoid_replace (proj1_sig (CReal_plus (inject_Q (qn p0)) (CReal_opp x)) (Pos.to_nat (Pos.max (4 * p) (Pos.of_nat (cvmod (2 * p)%positive)))))
+ with (qn p0 - proj1_sig x (2 * (Pos.to_nat (Pos.max (4 * p) (Pos.of_nat (cvmod (2 * p)%positive)))))%nat)%Q.
+ 2: destruct x; reflexivity.
+ apply (Qle_lt_trans _ (1 # 2 * p)).
+ unfold Qle; simpl. rewrite Pos2Z.inj_max. apply Z.le_max_l.
+ rewrite <- (Qplus_lt_r
+ _ _ (Qabs
+ (qn p0 -
+ proj1_sig x
+ (2 * Pos.to_nat (Pos.max (4 * p) (Pos.of_nat (cvmod (2 * p)%positive))))%nat)
+ -(1#2*p))).
+ ring_simplify.
+ setoid_replace (-1 * (1 # 2 * p) + (1 # p))%Q with (1 # 2 * p)%Q.
+ apply H. apply H0. rewrite Pos2Nat.inj_max.
+ apply (le_trans _ (1 * Nat.max (Pos.to_nat (4 * p)) (Pos.to_nat (Pos.of_nat (cvmod (2 * p)%positive))))).
+ destruct (cvmod (2*p)%positive). apply le_0_n. rewrite mult_1_l.
+ rewrite Nat2Pos.id. 2: discriminate. apply Nat.le_max_r.
+ apply Nat.mul_le_mono_nonneg_r. apply le_0_n. auto.
+ setoid_replace (1 # p)%Q with (2 # 2 * p)%Q.
+ rewrite Qplus_comm. rewrite Qinv_minus_distr.
+ reflexivity. reflexivity.
+Qed.
+
+(* Q is dense in Archimedean fields, so all real numbers
+ are limits of rational sequences.
+ The biggest computable such field has all rational limits. *)
+Lemma R_has_all_rational_limits : forall qn : nat -> Q,
+ Un_cauchy_Q qn
+ -> { r : CReal & seq_cv (fun n:nat => inject_Q (qn n)) r }.
+Proof.
+ (* qn is an element of CReal. Show that inject_Q qn
+ converges to it in CReal. *)
+ intros.
+ destruct (standard_modulus qn (fun p => proj1_sig (H (Pos.succ p)))).
+ - intros p n k H0 H1. destruct (H (Pos.succ p)%positive) as [x a]; simpl in H0,H1.
+ specialize (a n k H0 H1).
+ apply (Qle_lt_trans _ (1#Pos.succ p) _ a).
+ apply Pos2Z.pos_lt_pos. simpl. apply Pos.lt_succ_diag_r.
+ - exists (exist _ (fun n : nat =>
+ qn (increasing_modulus (fun p : positive => proj1_sig (H (Pos.succ p))) n)) H0).
+ apply (CReal_cv_self qn (exist _ (fun n : nat =>
+ qn (increasing_modulus (fun p : positive => proj1_sig (H (Pos.succ p))) n)) H0)
+ (fun p : positive => Init.Nat.max (proj1_sig (H (Pos.succ p))) (Pos.to_nat p))).
+ apply H1.
+Qed.
+
+Lemma Rcauchy_complete : forall (xn : nat -> CReal),
+ Un_cauchy_mod xn
+ -> { l : CReal & seq_cv xn l }.
+Proof.
+ intros xn cau.
+ destruct (R_has_all_rational_limits (fun n => let (l,_) := RQ_limit (xn n) n in l)
+ (Rdiag_cauchy_sequence xn cau))
+ as [l cv].
+ exists l. intro p. specialize (cv (2*p)%positive) as [k cv].
+ exists (max k (2 * Pos.to_nat p)). intros p0 H.
+ specialize (cv p0 (le_trans _ _ _ (Nat.le_max_l _ _) H)).
+ destruct (RQ_limit (xn p0) p0) as [q maj].
+ apply CReal_abs_le. split.
+ - apply (CReal_le_trans _ (inject_Q q - inject_Q (1 # 2 * p) - l)).
+ + unfold CReal_minus. rewrite (CReal_plus_comm (inject_Q q)).
+ apply (CReal_plus_le_reg_r (inject_Q (1 # p) + l - inject_Q q)).
+ ring_simplify. unfold CReal_minus.
+ rewrite <- (opp_inject_Q (1# 2*p)), <- inject_Q_plus.
+ setoid_replace ((1 # p) + - (1 # 2* p))%Q with (1#2*p)%Q.
+ rewrite CReal_abs_minus_sym in cv.
+ exact (CReal_le_trans _ _ _ (CReal_le_abs _) cv).
+ setoid_replace (1#p)%Q with (2 # 2*p)%Q.
+ rewrite Qinv_minus_distr. reflexivity. reflexivity.
+ + unfold CReal_minus.
+ do 2 rewrite <- (CReal_plus_comm (-l)). apply CReal_plus_le_compat_l.
+ apply (CReal_plus_le_reg_r (inject_Q (1 # 2 * p))).
+ ring_simplify. rewrite CReal_plus_comm.
+ apply (CReal_le_trans _ (xn p0 + inject_Q (1 # Pos.of_nat p0))).
+ apply CRealLt_asym, maj. apply CReal_plus_le_compat_l.
+ apply inject_Q_le.
+ apply Z2Nat.inj_le. discriminate. discriminate.
+ simpl. assert ((Pos.to_nat p~0 <= p0)%nat).
+ { apply (le_trans _ (Init.Nat.max k (2 * Pos.to_nat p))).
+ 2: apply H. replace (p~0)%positive with (2*p)%positive.
+ 2: reflexivity. rewrite Pos2Nat.inj_mul.
+ apply Nat.le_max_r. }
+ rewrite Nat2Pos.id. apply H0. intro abs. subst p0.
+ inversion H0. pose proof (Pos2Nat.is_pos (p~0)).
+ rewrite H2 in H1. inversion H1.
+ - apply (CReal_le_trans _ (inject_Q q - l)).
+ + unfold CReal_minus. do 2 rewrite <- (CReal_plus_comm (-l)).
+ apply CReal_plus_le_compat_l. apply CRealLt_asym, maj.
+ + apply (CReal_le_trans _ (inject_Q (1 # 2 * p))).
+ exact (CReal_le_trans _ _ _ (CReal_le_abs _) cv).
+ apply inject_Q_le. rewrite <- Qplus_0_r.
+ setoid_replace (1#p)%Q with ((1#2*p)+(1#2*p))%Q.
+ apply Qplus_le_r. discriminate.
+ rewrite Qinv_plus_distr. reflexivity.
+Qed.
+
+Lemma CRealLtIsLinear : isLinearOrder CRealLt.
+Proof.
+ repeat split. exact CRealLt_asym.
+ exact CReal_lt_trans.
+ intros. destruct (CRealLt_dec x z y H).
+ left. exact c. right. exact c.
+Qed.
+
+Lemma CRealAbsLUB : forall x y : CReal,
+ x <= y /\ (- x) <= y <-> (CReal_abs x) <= y.
+Proof.
+ split.
+ - intros [H H0]. apply CReal_abs_le. split. 2: exact H.
+ apply (CReal_plus_le_reg_r (y-x)). ring_simplify. exact H0.
+ - intros. apply CReal_abs_def2 in H. destruct H. split.
+ exact H. fold (-x <= y).
+ apply (CReal_plus_le_reg_r (x-y)). ring_simplify. exact H0.
+Qed.
+
+Lemma CRealComplete : forall xn : nat -> CReal,
+ (forall p : positive,
+ {n : nat |
+ forall i j : nat,
+ (n <= i)%nat -> (n <= j)%nat -> (CReal_abs (xn i + - xn j)) <= (inject_Q (1 # p))}) ->
+ {l : CReal &
+ forall p : positive,
+ {n : nat |
+ forall i : nat, (n <= i)%nat -> (CReal_abs (xn i + - l)) <= (inject_Q (1 # p))}}.
+Proof.
+ intros. destruct (Rcauchy_complete xn) as [l cv].
+ intro p. destruct (H p) as [n a]. exists n. intros.
+ exact (a i j H0 H1).
+ exists l. intros p. destruct (cv p).
+ exists x. exact c.
+Defined.
+
+Definition CRealConstructive : ConstructiveReals
+ := Build_ConstructiveReals
+ CReal CRealLt CRealLtIsLinear CRealLtProp
+ CRealLtEpsilon CRealLtForget CRealLtDisjunctEpsilon
+ (inject_Q 0) (inject_Q 1)
+ CReal_plus CReal_opp CReal_mult
+ CReal_isRing CReal_isRingExt CRealLt_0_1
+ CReal_plus_lt_compat_l CReal_plus_lt_reg_l
+ CReal_mult_lt_0_compat
+ CReal_inv CReal_inv_l CReal_inv_0_lt_compat
+ inject_Q inject_Q_plus inject_Q_mult
+ inject_Q_one inject_Q_lt lt_inject_Q
+ CRealQ_dense Rup_pos CReal_abs CRealAbsLUB CRealComplete.
diff --git a/theories/Reals/ConstructiveCauchyReals.v b/theories/Reals/ConstructiveCauchyReals.v
deleted file mode 100644
index 62e42a7ef3..0000000000
--- a/theories/Reals/ConstructiveCauchyReals.v
+++ /dev/null
@@ -1,1348 +0,0 @@
-(************************************************************************)
-(* * The Coq Proof Assistant / The Coq Development Team *)
-(* v * Copyright INRIA, CNRS and contributors *)
-(* un O) (fun q => O)
- which says nothing about the limit of un.
- *)
-Definition QSeqEquiv (un vn : nat -> Q) (cvmod : positive -> nat)
- : Prop
- := forall (k : positive) (p q : nat),
- le (cvmod k) p
- -> le (cvmod k) q
- -> Qlt (Qabs (un p - vn q)) (1 # k).
-
-(* A Cauchy sequence is a sequence equivalent to itself.
- If sequences are equivalent, they are both Cauchy and have the same limit. *)
-Definition QCauchySeq (un : nat -> Q) (cvmod : positive -> nat) : Prop
- := QSeqEquiv un un cvmod.
-
-Lemma QSeqEquiv_sym : forall (un vn : nat -> Q) (cvmod : positive -> nat),
- QSeqEquiv un vn cvmod
- -> QSeqEquiv vn un cvmod.
-Proof.
- intros. intros k p q H0 H1.
- rewrite Qabs_Qminus. apply H; assumption.
-Qed.
-
-Lemma factorDenom : forall (a:Z) (b d:positive), (a # (d * b)) == (1#d) * (a#b).
-Proof.
- intros. unfold Qeq. simpl. destruct a; reflexivity.
-Qed.
-
-Lemma QSeqEquiv_trans : forall (un vn wn : nat -> Q)
- (cvmod cvmodw : positive -> nat),
- QSeqEquiv un vn cvmod
- -> QSeqEquiv vn wn cvmodw
- -> QSeqEquiv un wn (fun q => max (cvmod (2 * q)%positive) (cvmodw (2 * q)%positive)).
-Proof.
- intros. intros k p q H1 H2.
- setoid_replace (un p - wn q) with (un p - vn p + (vn p - wn q)).
- apply (Qle_lt_trans
- _ (Qabs (un p - vn p) + Qabs (vn p - wn q))).
- apply Qabs_triangle. apply (Qlt_le_trans _ ((1 # (2*k)) + (1 # (2*k)))).
- apply Qplus_lt_le_compat.
- - assert ((cvmod (2 * k)%positive <= p)%nat).
- { apply (le_trans _ (max (cvmod (2 * k)%positive) (cvmodw (2 * k)%positive))).
- apply Nat.le_max_l. assumption. }
- apply H. assumption. assumption.
- - apply Qle_lteq. left. apply H0.
- apply (le_trans _ (max (cvmod (2 * k)%positive) (cvmodw (2 * k)%positive))).
- apply Nat.le_max_r. assumption.
- apply (le_trans _ (max (cvmod (2 * k)%positive) (cvmodw (2 * k)%positive))).
- apply Nat.le_max_r. assumption.
- - rewrite (factorDenom _ _ 2). ring_simplify. apply Qle_refl.
- - ring.
-Qed.
-
-Definition QSeqEquivEx (un vn : nat -> Q) : Prop
- := exists (cvmod : positive -> nat), QSeqEquiv un vn cvmod.
-
-Lemma QSeqEquivEx_sym : forall (un vn : nat -> Q), QSeqEquivEx un vn -> QSeqEquivEx vn un.
-Proof.
- intros. destruct H. exists x. apply QSeqEquiv_sym. apply H.
-Qed.
-
-Lemma QSeqEquivEx_trans : forall un vn wn : nat -> Q,
- QSeqEquivEx un vn
- -> QSeqEquivEx vn wn
- -> QSeqEquivEx un wn.
-Proof.
- intros. destruct H,H0.
- exists (fun q => max (x (2 * q)%positive) (x0 (2 * q)%positive)).
- apply (QSeqEquiv_trans un vn wn); assumption.
-Qed.
-
-Lemma QSeqEquiv_cau_r : forall (un vn : nat -> Q) (cvmod : positive -> nat),
- QSeqEquiv un vn cvmod
- -> QCauchySeq vn (fun k => cvmod (2 * k)%positive).
-Proof.
- intros. intros k p q H0 H1.
- setoid_replace (vn p - vn q)
- with (vn p
- - un (cvmod (2 * k)%positive)
- + (un (cvmod (2 * k)%positive) - vn q)).
- - apply (Qle_lt_trans
- _ (Qabs (vn p
- - un (cvmod (2 * k)%positive))
- + Qabs (un (cvmod (2 * k)%positive) - vn q))).
- apply Qabs_triangle.
- apply (Qlt_le_trans _ ((1 # (2 * k)) + (1 # (2 * k)))).
- apply Qplus_lt_le_compat.
- + rewrite Qabs_Qminus. apply H. apply le_refl. assumption.
- + apply Qle_lteq. left. apply H. apply le_refl. assumption.
- + rewrite (factorDenom _ _ 2). ring_simplify. apply Qle_refl.
- - ring.
-Qed.
-
-Fixpoint increasing_modulus (modulus : positive -> nat) (n : nat)
- := match n with
- | O => modulus xH
- | S p => max (modulus (Pos.of_nat n)) (increasing_modulus modulus p)
- end.
-
-Lemma increasing_modulus_inc : forall (modulus : positive -> nat) (n p : nat),
- le (increasing_modulus modulus n)
- (increasing_modulus modulus (p + n)).
-Proof.
- induction p.
- - apply le_refl.
- - apply (le_trans _ (increasing_modulus modulus (p + n))).
- apply IHp. simpl. destruct (plus p n). apply Nat.le_max_r. apply Nat.le_max_r.
-Qed.
-
-Lemma increasing_modulus_max : forall (modulus : positive -> nat) (p n : nat),
- le n p -> le (modulus (Pos.of_nat n))
- (increasing_modulus modulus p).
-Proof.
- induction p.
- - intros. inversion H. subst n. apply le_refl.
- - intros. simpl. destruct p. simpl.
- + destruct n. apply Nat.le_max_l. apply le_S_n in H.
- inversion H. apply Nat.le_max_l.
- + apply Nat.le_succ_r in H. destruct H.
- apply (le_trans _ (increasing_modulus modulus (S p))).
- 2: apply Nat.le_max_r. apply IHp. apply H.
- subst n. apply (le_trans _ (modulus (Pos.succ (Pos.of_nat (S p))))).
- apply le_refl. apply Nat.le_max_l.
-Qed.
-
-(* Choice of a standard element in each QSeqEquiv class. *)
-Lemma standard_modulus : forall (un : nat -> Q) (cvmod : positive -> nat),
- QCauchySeq un cvmod
- -> (QCauchySeq (fun n => un (increasing_modulus cvmod n)) Pos.to_nat
- /\ QSeqEquiv un (fun n => un (increasing_modulus cvmod n))
- (fun p => max (cvmod p) (Pos.to_nat p))).
-Proof.
- intros. split.
- - intros k p q H0 H1. apply H.
- + apply (le_trans _ (increasing_modulus cvmod (Pos.to_nat k))).
- apply (le_trans _ (cvmod (Pos.of_nat (Pos.to_nat k)))).
- rewrite Pos2Nat.id. apply le_refl.
- destruct (Pos.to_nat k). apply le_refl. apply Nat.le_max_l.
- destruct (Nat.le_exists_sub (Pos.to_nat k) p H0) as [i [H2 H3]]. subst p.
- apply increasing_modulus_inc.
- + apply (le_trans _ (increasing_modulus cvmod (Pos.to_nat k))).
- apply (le_trans _ (cvmod (Pos.of_nat (Pos.to_nat k)))).
- rewrite Pos2Nat.id. apply le_refl.
- destruct (Pos.to_nat k). apply le_refl. apply Nat.le_max_l.
- destruct (Nat.le_exists_sub (Pos.to_nat k) q H1) as [i [H2 H3]]. subst q.
- apply increasing_modulus_inc.
- - intros k p q H0 H1. apply H.
- + apply (le_trans _ (Init.Nat.max (cvmod k) (Pos.to_nat k))).
- apply Nat.le_max_l. assumption.
- + apply (le_trans _ (increasing_modulus cvmod (Pos.to_nat k))).
- apply (le_trans _ (cvmod (Pos.of_nat (Pos.to_nat k)))).
- rewrite Pos2Nat.id. apply le_refl.
- destruct (Pos.to_nat k). apply le_refl. apply Nat.le_max_l.
- assert (le (Pos.to_nat k) q).
- { apply (le_trans _ (Init.Nat.max (cvmod k) (Pos.to_nat k))).
- apply Nat.le_max_r. assumption. }
- destruct (Nat.le_exists_sub (Pos.to_nat k) q H2) as [i [H3 H4]]. subst q.
- apply increasing_modulus_inc.
-Qed.
-
-(* A Cauchy real is a Cauchy sequence with the standard modulus *)
-Definition CReal : Set
- := { x : (nat -> Q) | QCauchySeq x Pos.to_nat }.
-
-Declare Scope CReal_scope.
-
-(* Declare Scope R_scope with Key R *)
-Delimit Scope CReal_scope with CReal.
-
-(* Automatically open scope R_scope for arguments of type R *)
-Bind Scope CReal_scope with CReal.
-
-Local Open Scope CReal_scope.
-
-
-(* So QSeqEquiv is the equivalence relation of this constructive pre-order *)
-Definition CRealLt (x y : CReal) : Set
- := { n : positive | Qlt (2 # n)
- (proj1_sig y (Pos.to_nat n) - proj1_sig x (Pos.to_nat n)) }.
-
-Definition CRealLtProp (x y : CReal) : Prop
- := exists n : positive, Qlt (2 # n)
- (proj1_sig y (Pos.to_nat n) - proj1_sig x (Pos.to_nat n)).
-
-Definition CRealGt (x y : CReal) := CRealLt y x.
-Definition CReal_appart (x y : CReal) := sum (CRealLt x y) (CRealLt y x).
-
-Infix "<" := CRealLt : CReal_scope.
-Infix ">" := CRealGt : CReal_scope.
-Infix "#" := CReal_appart : CReal_scope.
-
-(* This Prop can be extracted as a sigma type *)
-Lemma CRealLtEpsilon : forall x y : CReal,
- CRealLtProp x y -> x < y.
-Proof.
- intros.
- assert (exists n : nat, n <> O
- /\ Qlt (2 # Pos.of_nat n) (proj1_sig y n - proj1_sig x n)).
- { destruct H as [n maj]. exists (Pos.to_nat n). split.
- intro abs. destruct (Pos2Nat.is_succ n). rewrite H in abs.
- inversion abs. rewrite Pos2Nat.id. apply maj. }
- apply constructive_indefinite_ground_description_nat in H0.
- destruct H0 as [n maj]. exists (Pos.of_nat n).
- rewrite Nat2Pos.id. apply maj. apply maj.
- intro n. destruct n. right.
- intros [abs _]. exact (abs (eq_refl O)).
- destruct (Qlt_le_dec (2 # Pos.of_nat (S n))
- (proj1_sig y (S n) - proj1_sig x (S n))).
- left. split. discriminate. apply q.
- right. intros [_ abs].
- apply (Qlt_not_le (2 # Pos.of_nat (S n))
- (proj1_sig y (S n) - proj1_sig x (S n))); assumption.
-Qed.
-
-Lemma CRealLtForget : forall x y : CReal,
- x < y -> CRealLtProp x y.
-Proof.
- intros. destruct H. exists x0. exact q.
-Qed.
-
-(* CRealLt is decided by the LPO in Type,
- which is a non-constructive oracle. *)
-Lemma CRealLt_lpo_dec : forall x y : CReal,
- (forall (P : nat -> Prop), (forall n, {P n} + {~P n})
- -> {n | ~P n} + {forall n, P n})
- -> CRealLt x y + (CRealLt x y -> False).
-Proof.
- intros x y lpo.
- destruct (lpo (fun n:nat => Qle (proj1_sig y (S n) - proj1_sig x (S n))
- (2 # Pos.of_nat (S n)))).
- - intro n. destruct (Qlt_le_dec (2 # Pos.of_nat (S n))
- (proj1_sig y (S n) - proj1_sig x (S n))).
- right. apply Qlt_not_le. exact q. left. exact q.
- - left. destruct s as [n nmaj]. exists (Pos.of_nat (S n)).
- rewrite Nat2Pos.id. apply Qnot_le_lt. exact nmaj. discriminate.
- - right. intro abs. destruct abs as [n majn].
- specialize (q (pred (Pos.to_nat n))).
- replace (S (pred (Pos.to_nat n))) with (Pos.to_nat n) in q.
- rewrite Pos2Nat.id in q.
- pose proof (Qle_not_lt _ _ q). contradiction.
- symmetry. apply Nat.succ_pred. intro abs.
- pose proof (Pos2Nat.is_pos n). rewrite abs in H. inversion H.
-Qed.
-
-(* Alias the quotient order equality *)
-Definition CRealEq (x y : CReal) : Prop
- := (CRealLt x y -> False) /\ (CRealLt y x -> False).
-
-Infix "==" := CRealEq : CReal_scope.
-
-(* Alias the large order *)
-Definition CRealLe (x y : CReal) : Prop
- := CRealLt y x -> False.
-
-Definition CRealGe (x y : CReal) := CRealLe y x.
-
-Infix "<=" := CRealLe : CReal_scope.
-Infix ">=" := CRealGe : CReal_scope.
-
-Notation "x <= y <= z" := (x <= y /\ y <= z) : CReal_scope.
-Notation "x <= y < z" := (prod (x <= y) (y < z)) : CReal_scope.
-Notation "x < y < z" := (prod (x < y) (y < z)) : CReal_scope.
-Notation "x < y <= z" := (prod (x < y) (y <= z)) : CReal_scope.
-
-Lemma CRealLe_not_lt : forall x y : CReal,
- (forall n:positive, Qle (proj1_sig x (Pos.to_nat n) - proj1_sig y (Pos.to_nat n))
- (2 # n))
- <-> x <= y.
-Proof.
- intros. split.
- - intros. intro H0. destruct H0 as [n H0]. specialize (H n).
- apply (Qle_not_lt (2 # n) (2 # n)). apply Qle_refl.
- apply (Qlt_le_trans _ (proj1_sig x (Pos.to_nat n) - proj1_sig y (Pos.to_nat n))).
- assumption. assumption.
- - intros.
- destruct (Qlt_le_dec (2 # n) (proj1_sig x (Pos.to_nat n) - proj1_sig y (Pos.to_nat n))).
- exfalso. apply H. exists n. assumption. assumption.
-Qed.
-
-Lemma CRealEq_diff : forall (x y : CReal),
- CRealEq x y
- <-> forall n:positive, Qle (Qabs (proj1_sig x (Pos.to_nat n) - proj1_sig y (Pos.to_nat n)))
- (2 # n).
-Proof.
- intros. split.
- - intros. destruct H. apply Qabs_case. intro.
- pose proof (CRealLe_not_lt x y) as [_ H2]. apply H2. assumption.
- intro. pose proof (CRealLe_not_lt y x) as [_ H2].
- setoid_replace (- (proj1_sig x (Pos.to_nat n) - proj1_sig y (Pos.to_nat n)))
- with (proj1_sig y (Pos.to_nat n) - proj1_sig x (Pos.to_nat n)).
- apply H2. assumption. ring.
- - intros. split. apply CRealLe_not_lt. intro n. specialize (H n).
- rewrite Qabs_Qminus in H.
- apply (Qle_trans _ (Qabs (proj1_sig y (Pos.to_nat n) - proj1_sig x (Pos.to_nat n)))).
- apply Qle_Qabs. apply H.
- apply CRealLe_not_lt. intro n. specialize (H n).
- apply (Qle_trans _ (Qabs (proj1_sig x (Pos.to_nat n) - proj1_sig y (Pos.to_nat n)))).
- apply Qle_Qabs. apply H.
-Qed.
-
-(* The equality on Cauchy reals is just QSeqEquiv,
- which is independant of the convergence modulus. *)
-Lemma CRealEq_modindep : forall (x y : CReal),
- QSeqEquivEx (proj1_sig x) (proj1_sig y)
- <-> forall n:positive,
- Qle (Qabs (proj1_sig x (Pos.to_nat n) - proj1_sig y (Pos.to_nat n))) (2 # n).
-Proof.
- assert (forall x y: CReal, QSeqEquivEx (proj1_sig x) (proj1_sig y) -> x <= y ).
- { intros [xn limx] [yn limy] [cvmod H] [n abs]. simpl in abs, H.
- pose (xn (Pos.to_nat n) - yn (Pos.to_nat n) - (2#n)) as eps.
- destruct (Qarchimedean (/eps)) as [k maj].
- remember (max (cvmod k) (Pos.to_nat n)) as p.
- assert (le (cvmod k) p).
- { rewrite Heqp. apply Nat.le_max_l. }
- assert (Pos.to_nat n <= p)%nat.
- { rewrite Heqp. apply Nat.le_max_r. }
- specialize (H k p p H0 H0).
- setoid_replace (Z.pos k #1)%Q with (/ (1#k)) in maj. 2: reflexivity.
- apply Qinv_lt_contravar in maj. 2: reflexivity. unfold eps in maj.
- clear abs. (* less precise majoration *)
- apply (Qplus_lt_r _ _ (2#n)) in maj. ring_simplify in maj.
- apply (Qlt_not_le _ _ maj). clear maj.
- setoid_replace (xn (Pos.to_nat n) + -1 * yn (Pos.to_nat n))
- with (xn (Pos.to_nat n) - xn p + (xn p - yn p + (yn p - yn (Pos.to_nat n)))).
- 2: ring.
- setoid_replace (2 # n)%Q with ((1 # n) + (1#n)).
- rewrite <- Qplus_assoc.
- apply Qplus_le_compat. apply (Qle_trans _ _ _ (Qle_Qabs _)).
- apply Qlt_le_weak. apply limx. apply le_refl. assumption.
- rewrite (Qplus_comm (1#n)).
- apply Qplus_le_compat. apply (Qle_trans _ _ _ (Qle_Qabs _)).
- apply Qlt_le_weak. exact H.
- apply (Qle_trans _ _ _ (Qle_Qabs _)). apply Qlt_le_weak. apply limy.
- assumption. apply le_refl. ring_simplify. reflexivity.
- unfold eps. unfold Qminus. rewrite <- Qlt_minus_iff. exact abs. }
- split.
- - rewrite <- CRealEq_diff. intros. split.
- apply H, QSeqEquivEx_sym. exact H0. apply H. exact H0.
- - clear H. intros. destruct x as [xn limx], y as [yn limy].
- exists (fun q => Pos.to_nat (2 * (3 * q))). intros k p q H0 H1.
- unfold proj1_sig. specialize (H (2 * (3 * k))%positive).
- assert ((Pos.to_nat (3 * k) <= Pos.to_nat (2 * (3 * k)))%nat).
- { generalize (3 * k)%positive. intros. rewrite Pos2Nat.inj_mul.
- rewrite <- (mult_1_l (Pos.to_nat p0)). apply Nat.mul_le_mono_nonneg.
- auto. unfold Pos.to_nat. simpl. auto.
- apply (le_trans 0 1). auto. apply Pos2Nat.is_pos. rewrite mult_1_l.
- apply le_refl. }
- setoid_replace (xn p - yn q)
- with (xn p - xn (Pos.to_nat (2 * (3 * k)))
- + (xn (Pos.to_nat (2 * (3 * k))) - yn (Pos.to_nat (2 * (3 * k)))
- + (yn (Pos.to_nat (2 * (3 * k))) - yn q))).
- setoid_replace (1 # k)%Q with ((1 # 3 * k) + ((1 # 3 * k) + (1 # 3 * k))).
- apply (Qle_lt_trans
- _ (Qabs (xn p - xn (Pos.to_nat (2 * (3 * k))))
- + (Qabs (xn (Pos.to_nat (2 * (3 * k))) - yn (Pos.to_nat (2 * (3 * k)))
- + (yn (Pos.to_nat (2 * (3 * k))) - yn q))))).
- apply Qabs_triangle. apply Qplus_lt_le_compat.
- apply limx. apply (le_trans _ (Pos.to_nat (2 * (3 * k)))). assumption. assumption.
- assumption.
- apply (Qle_trans
- _ (Qabs (xn (Pos.to_nat (2 * (3 * k))) - yn (Pos.to_nat (2 * (3 * k))))
- + Qabs (yn (Pos.to_nat (2 * (3 * k))) - yn q))).
- apply Qabs_triangle. apply Qplus_le_compat.
- setoid_replace (1 # 3 * k)%Q with (2 # 2 * (3 * k))%Q. apply H.
- rewrite (factorDenom _ _ 3). rewrite (factorDenom _ _ 2). rewrite (factorDenom _ _ 3).
- rewrite Qmult_assoc. rewrite (Qmult_comm (1#2)).
- rewrite <- Qmult_assoc. apply Qmult_comp. reflexivity.
- unfold Qeq. reflexivity.
- apply Qle_lteq. left. apply limy. assumption.
- apply (le_trans _ (Pos.to_nat (2 * (3 * k)))). assumption. assumption.
- rewrite (factorDenom _ _ 3). ring_simplify. reflexivity. field.
-Qed.
-
-(* Extend separation to all indices above *)
-Lemma CRealLt_aboveSig : forall (x y : CReal) (n : positive),
- (Qlt (2 # n)
- (proj1_sig y (Pos.to_nat n) - proj1_sig x (Pos.to_nat n)))
- -> let (k, _) := Qarchimedean (/(proj1_sig y (Pos.to_nat n) - proj1_sig x (Pos.to_nat n) - (2#n)))
- in forall p:positive,
- Pos.le (Pos.max n (2*k)) p
- -> Qlt (2 # (Pos.max n (2*k)))
- (proj1_sig y (Pos.to_nat p) - proj1_sig x (Pos.to_nat p)).
-Proof.
- intros [xn limx] [yn limy] n maj.
- unfold proj1_sig; unfold proj1_sig in maj.
- pose (yn (Pos.to_nat n) - xn (Pos.to_nat n)) as dn.
- destruct (Qarchimedean (/(yn (Pos.to_nat n) - xn (Pos.to_nat n) - (2#n)))) as [k kmaj].
- assert (0 < yn (Pos.to_nat n) - xn (Pos.to_nat n) - (2 # n))%Q as H0.
- { rewrite <- (Qplus_opp_r (2#n)). apply Qplus_lt_l. assumption. }
- intros.
- remember (yn (Pos.to_nat p) - xn (Pos.to_nat p)) as dp.
-
- rewrite <- (Qplus_0_r dp). rewrite <- (Qplus_opp_r dn).
- rewrite (Qplus_comm dn). rewrite Qplus_assoc.
- assert (Qlt (Qabs (dp - dn)) (2#n)).
- { rewrite Heqdp. unfold dn.
- setoid_replace (yn (Pos.to_nat p) - xn (Pos.to_nat p) - (yn (Pos.to_nat n) - xn (Pos.to_nat n)))
- with (yn (Pos.to_nat p) - yn (Pos.to_nat n)
- + (xn (Pos.to_nat n) - xn (Pos.to_nat p))).
- apply (Qle_lt_trans _ (Qabs (yn (Pos.to_nat p) - yn (Pos.to_nat n))
- + Qabs (xn (Pos.to_nat n) - xn (Pos.to_nat p)))).
- apply Qabs_triangle.
- setoid_replace (2#n)%Q with ((1#n) + (1#n))%Q.
- apply Qplus_lt_le_compat. apply limy.
- apply Pos2Nat.inj_le. apply (Pos.le_trans _ (Pos.max n (2 * k))).
- apply Pos.le_max_l. assumption.
- apply le_refl. apply Qlt_le_weak. apply limx. apply le_refl.
- apply Pos2Nat.inj_le. apply (Pos.le_trans _ (Pos.max n (2 * k))).
- apply Pos.le_max_l. assumption.
- rewrite Qinv_plus_distr. reflexivity. field. }
- apply (Qle_lt_trans _ (-(2#n) + dn)).
- rewrite Qplus_comm. unfold dn. apply Qlt_le_weak.
- apply (Qle_lt_trans _ (2 # (2 * k))). apply Pos.le_max_r.
- setoid_replace (2 # 2 * k)%Q with (1 # k)%Q. 2: reflexivity.
- setoid_replace (Z.pos k # 1)%Q with (/(1#k))%Q in kmaj. 2: reflexivity.
- apply Qinv_lt_contravar. reflexivity. apply H0. apply kmaj.
- apply Qplus_lt_l. rewrite <- Qplus_0_r. rewrite <- (Qplus_opp_r dn).
- rewrite Qplus_assoc. apply Qplus_lt_l. rewrite Qplus_comm.
- rewrite <- (Qplus_0_r dp). rewrite <- (Qplus_opp_r (2#n)).
- rewrite Qplus_assoc. apply Qplus_lt_l.
- rewrite <- (Qplus_0_l dn). rewrite <- (Qplus_opp_r dp).
- rewrite <- Qplus_assoc. apply Qplus_lt_r. rewrite Qplus_comm.
- apply (Qle_lt_trans _ (Qabs (dp - dn))). rewrite Qabs_Qminus.
- unfold Qminus. apply Qle_Qabs. assumption.
-Qed.
-
-Lemma CRealLt_above : forall (x y : CReal),
- CRealLt x y
- -> { k : positive | forall p:positive,
- Pos.le k p -> Qlt (2 # k) (proj1_sig y (Pos.to_nat p)
- - proj1_sig x (Pos.to_nat p)) }.
-Proof.
- intros x y [n maj].
- pose proof (CRealLt_aboveSig x y n maj).
- destruct (Qarchimedean (/ (proj1_sig y (Pos.to_nat n) - proj1_sig x (Pos.to_nat n) - (2 # n))))
- as [k kmaj].
- exists (Pos.max n (2*k)). apply H.
-Qed.
-
-(* The CRealLt index separates the Cauchy sequences *)
-Lemma CRealLt_above_same : forall (x y : CReal) (n : positive),
- Qlt (2 # n)
- (proj1_sig y (Pos.to_nat n) - proj1_sig x (Pos.to_nat n))
- -> forall p:positive, Pos.le n p
- -> Qlt (proj1_sig x (Pos.to_nat p)) (proj1_sig y (Pos.to_nat p)).
-Proof.
- intros [xn limx] [yn limy] n inf p H.
- simpl. simpl in inf.
- apply (Qplus_lt_l _ _ (- xn (Pos.to_nat n))).
- apply (Qle_lt_trans _ (Qabs (xn (Pos.to_nat p) + - xn (Pos.to_nat n)))).
- apply Qle_Qabs. apply (Qlt_trans _ (1#n)).
- apply limx. apply Pos2Nat.inj_le. assumption. apply le_refl.
- rewrite <- (Qplus_0_r (yn (Pos.to_nat p))).
- rewrite <- (Qplus_opp_r (yn (Pos.to_nat n))).
- rewrite (Qplus_comm (yn (Pos.to_nat n))). rewrite Qplus_assoc.
- rewrite <- Qplus_assoc.
- setoid_replace (1#n)%Q with (-(1#n) + (2#n))%Q. apply Qplus_lt_le_compat.
- apply (Qplus_lt_l _ _ (1#n)). rewrite Qplus_opp_r.
- apply (Qplus_lt_r _ _ (yn (Pos.to_nat n) + - yn (Pos.to_nat p))).
- ring_simplify.
- setoid_replace (yn (Pos.to_nat n) + (-1 # 1) * yn (Pos.to_nat p))
- with (yn (Pos.to_nat n) - yn (Pos.to_nat p)).
- apply (Qle_lt_trans _ (Qabs (yn (Pos.to_nat n) - yn (Pos.to_nat p)))).
- apply Qle_Qabs. apply limy. apply le_refl. apply Pos2Nat.inj_le. assumption.
- field. apply Qle_lteq. left. assumption.
- rewrite Qplus_comm. rewrite Qinv_minus_distr.
- reflexivity.
-Qed.
-
-Lemma CRealLt_asym : forall x y : CReal, x < y -> x <= y.
-Proof.
- intros x y H [n q].
- apply CRealLt_above in H. destruct H as [p H].
- pose proof (CRealLt_above_same y x n q).
- apply (Qlt_not_le (proj1_sig y (Pos.to_nat (Pos.max n p)))
- (proj1_sig x (Pos.to_nat (Pos.max n p)))).
- apply H0. apply Pos.le_max_l.
- apply Qlt_le_weak. apply (Qplus_lt_l _ _ (-proj1_sig x (Pos.to_nat (Pos.max n p)))).
- rewrite Qplus_opp_r. apply (Qlt_trans _ (2#p)).
- unfold Qlt. simpl. unfold Z.lt. auto. apply H. apply Pos.le_max_r.
-Qed.
-
-Lemma CRealLt_irrefl : forall x:CReal, x < x -> False.
-Proof.
- intros x abs. exact (CRealLt_asym x x abs abs).
-Qed.
-
-Lemma CRealLe_refl : forall x : CReal, x <= x.
-Proof.
- intros. intro abs.
- pose proof (CRealLt_asym x x abs). contradiction.
-Qed.
-
-Lemma CRealEq_refl : forall x : CReal, x == x.
-Proof.
- intros. split; apply CRealLe_refl.
-Qed.
-
-Lemma CRealEq_sym : forall x y : CReal, CRealEq x y -> CRealEq y x.
-Proof.
- intros. destruct H. split; intro abs; contradiction.
-Qed.
-
-Lemma CRealLt_dec : forall x y z : CReal,
- x < y -> sum (x < z) (z < y).
-Proof.
- intros [xn limx] [yn limy] [zn limz] [n inf].
- unfold proj1_sig in inf.
- remember (yn (Pos.to_nat n) - xn (Pos.to_nat n) - (2 # n)) as eps.
- assert (Qlt 0 eps) as epsPos.
- { subst eps. unfold Qminus. apply (Qlt_minus_iff (2#n)). assumption. }
- assert (forall n p, Pos.to_nat n <= Pos.to_nat (Pos.max n p))%nat.
- { intros. apply Pos2Nat.inj_le. unfold Pos.max. unfold Pos.le.
- destruct (n0 ?= p)%positive eqn:des.
- rewrite des. discriminate. rewrite des. discriminate.
- unfold Pos.compare. rewrite Pos.compare_cont_refl. discriminate. }
- destruct (Qarchimedean (/eps)) as [k kmaj].
- destruct (Qlt_le_dec ((yn (Pos.to_nat n) + xn (Pos.to_nat n)) / (2#1))
- (zn (Pos.to_nat (Pos.max n (4 * k)))))
- as [decMiddle|decMiddle].
- - left. exists (Pos.max n (4 * k)). unfold proj1_sig. unfold Qminus.
- rewrite <- (Qplus_0_r (zn (Pos.to_nat (Pos.max n (4 * k))))).
- rewrite <- (Qplus_opp_r (xn (Pos.to_nat n))).
- rewrite (Qplus_comm (xn (Pos.to_nat n))). rewrite Qplus_assoc.
- rewrite <- Qplus_assoc. rewrite <- Qplus_0_r.
- rewrite <- (Qplus_opp_r (1#n)). rewrite Qplus_assoc.
- apply Qplus_lt_le_compat.
- + apply (Qplus_lt_l _ _ (- xn (Pos.to_nat n))) in decMiddle.
- apply (Qlt_trans _ ((yn (Pos.to_nat n) + xn (Pos.to_nat n)) / (2 # 1)
- + - xn (Pos.to_nat n))).
- setoid_replace ((yn (Pos.to_nat n) + xn (Pos.to_nat n)) / (2 # 1)
- - xn (Pos.to_nat n))
- with ((yn (Pos.to_nat n) - xn (Pos.to_nat n)) / (2 # 1)).
- apply Qlt_shift_div_l. unfold Qlt. simpl. unfold Z.lt. auto.
- rewrite Qmult_plus_distr_l.
- setoid_replace ((1 # n) * (2 # 1))%Q with (2#n)%Q.
- apply (Qplus_lt_l _ _ (-(2#n))). rewrite <- Qplus_assoc.
- rewrite Qplus_opp_r. unfold Qminus. unfold Qminus in Heqeps.
- rewrite <- Heqeps. rewrite Qplus_0_r.
- apply (Qle_lt_trans _ (1 # k)). unfold Qle.
- simpl. rewrite Pos.mul_1_r. rewrite Pos2Z.inj_max.
- apply Z.le_max_r.
- setoid_replace (Z.pos k # 1)%Q with (/(1#k))%Q in kmaj. 2: reflexivity.
- apply Qinv_lt_contravar. reflexivity. apply epsPos. apply kmaj.
- unfold Qeq. simpl. rewrite Pos.mul_1_r. reflexivity.
- field. assumption.
- + setoid_replace (xn (Pos.to_nat n) + - xn (Pos.to_nat (Pos.max n (4 * k))))
- with (-(xn (Pos.to_nat (Pos.max n (4 * k))) - xn (Pos.to_nat n))).
- apply Qopp_le_compat.
- apply (Qle_trans _ (Qabs (xn (Pos.to_nat (Pos.max n (4 * k))) - xn (Pos.to_nat n)))).
- apply Qle_Qabs. apply Qle_lteq. left. apply limx. apply H.
- apply le_refl. field.
- - right. exists (Pos.max n (4 * k)). unfold proj1_sig. unfold Qminus.
- rewrite <- (Qplus_0_r (yn (Pos.to_nat (Pos.max n (4 * k))))).
- rewrite <- (Qplus_opp_r (yn (Pos.to_nat n))).
- rewrite (Qplus_comm (yn (Pos.to_nat n))). rewrite Qplus_assoc.
- rewrite <- Qplus_assoc. rewrite <- Qplus_0_l.
- rewrite <- (Qplus_opp_r (1#n)). rewrite (Qplus_comm (1#n)).
- rewrite <- Qplus_assoc. apply Qplus_lt_le_compat.
- + apply (Qplus_lt_r _ _ (yn (Pos.to_nat n) - yn (Pos.to_nat (Pos.max n (4 * k))) + (1#n)))
- ; ring_simplify.
- setoid_replace (-1 * yn (Pos.to_nat (Pos.max n (4 * k))))
- with (- yn (Pos.to_nat (Pos.max n (4 * k)))). 2: ring.
- apply (Qle_lt_trans _ (Qabs (yn (Pos.to_nat n)
- - yn (Pos.to_nat (Pos.max n (4 * k)))))).
- apply Qle_Qabs. apply limy. apply le_refl. apply H.
- + apply Qopp_le_compat in decMiddle.
- apply (Qplus_le_r _ _ (yn (Pos.to_nat n))) in decMiddle.
- apply (Qle_trans _ (yn (Pos.to_nat n) + - ((yn (Pos.to_nat n) + xn (Pos.to_nat n)) / (2 # 1)))).
- setoid_replace (yn (Pos.to_nat n) + - ((yn (Pos.to_nat n) + xn (Pos.to_nat n)) / (2 # 1)))
- with ((yn (Pos.to_nat n) - xn (Pos.to_nat n)) / (2 # 1)).
- apply Qle_shift_div_l. unfold Qlt. simpl. unfold Z.lt. auto.
- rewrite Qmult_plus_distr_l.
- setoid_replace ((1 # n) * (2 # 1))%Q with (2#n)%Q.
- apply (Qplus_le_r _ _ (-(2#n))). rewrite Qplus_assoc.
- rewrite Qplus_opp_r. rewrite Qplus_0_l. rewrite (Qplus_comm (-(2#n))).
- unfold Qminus in Heqeps. unfold Qminus. rewrite <- Heqeps.
- apply (Qle_trans _ (1 # k)). unfold Qle.
- simpl. rewrite Pos.mul_1_r. rewrite Pos2Z.inj_max.
- apply Z.le_max_r. apply Qle_lteq. left.
- setoid_replace (Z.pos k # 1)%Q with (/(1#k))%Q in kmaj. 2: reflexivity.
- apply Qinv_lt_contravar. reflexivity. apply epsPos. apply kmaj.
- unfold Qeq. simpl. rewrite Pos.mul_1_r. reflexivity.
- field. assumption.
-Defined.
-
-Definition linear_order_T x y z := CRealLt_dec x z y.
-
-Lemma CReal_le_lt_trans : forall x y z : CReal,
- x <= y -> y < z -> x < z.
-Proof.
- intros.
- destruct (linear_order_T y x z H0). contradiction. apply c.
-Defined.
-
-Lemma CReal_lt_le_trans : forall x y z : CReal,
- x < y -> y <= z -> x < z.
-Proof.
- intros.
- destruct (linear_order_T x z y H). apply c. contradiction.
-Defined.
-
-Lemma CReal_le_trans : forall x y z : CReal,
- x <= y -> y <= z -> x <= z.
-Proof.
- intros. intro abs. apply H0.
- apply (CReal_lt_le_trans _ x); assumption.
-Qed.
-
-Lemma CReal_lt_trans : forall x y z : CReal,
- x < y -> y < z -> x < z.
-Proof.
- intros. apply (CReal_lt_le_trans _ y _ H).
- apply CRealLt_asym. exact H0.
-Defined.
-
-Lemma CRealEq_trans : forall x y z : CReal,
- CRealEq x y -> CRealEq y z -> CRealEq x z.
-Proof.
- intros. destruct H,H0. split.
- - intro abs. destruct (CRealLt_dec _ _ y abs); contradiction.
- - intro abs. destruct (CRealLt_dec _ _ y abs); contradiction.
-Qed.
-
-Add Parametric Relation : CReal CRealEq
- reflexivity proved by CRealEq_refl
- symmetry proved by CRealEq_sym
- transitivity proved by CRealEq_trans
- as CRealEq_rel.
-
-Instance CRealEq_relT : CRelationClasses.Equivalence CRealEq.
-Proof.
- split. exact CRealEq_refl. exact CRealEq_sym. exact CRealEq_trans.
-Qed.
-
-Instance CRealLt_morph
- : CMorphisms.Proper
- (CMorphisms.respectful CRealEq (CMorphisms.respectful CRealEq CRelationClasses.iffT)) CRealLt.
-Proof.
- intros x y H x0 y0 H0. destruct H, H0. split.
- - intro. destruct (CRealLt_dec x x0 y). assumption.
- contradiction. destruct (CRealLt_dec y x0 y0).
- assumption. assumption. contradiction.
- - intro. destruct (CRealLt_dec y y0 x). assumption.
- contradiction. destruct (CRealLt_dec x y0 x0).
- assumption. assumption. contradiction.
-Qed.
-
-Instance CRealGt_morph
- : CMorphisms.Proper
- (CMorphisms.respectful CRealEq (CMorphisms.respectful CRealEq CRelationClasses.iffT)) CRealGt.
-Proof.
- intros x y H x0 y0 H0. apply CRealLt_morph; assumption.
-Qed.
-
-Instance CReal_appart_morph
- : CMorphisms.Proper
- (CMorphisms.respectful CRealEq (CMorphisms.respectful CRealEq CRelationClasses.iffT)) CReal_appart.
-Proof.
- split.
- - intros. destruct H1. left. rewrite <- H0, <- H. exact c.
- right. rewrite <- H0, <- H. exact c.
- - intros. destruct H1. left. rewrite H0, H. exact c.
- right. rewrite H0, H. exact c.
-Qed.
-
-Add Parametric Morphism : CRealLtProp
- with signature CRealEq ==> CRealEq ==> iff
- as CRealLtProp_morph.
-Proof.
- intros x y H x0 y0 H0. split.
- - intro. apply CRealLtForget. apply CRealLtEpsilon in H1.
- rewrite <- H, <- H0. exact H1.
- - intro. apply CRealLtForget. apply CRealLtEpsilon in H1.
- rewrite H, H0. exact H1.
-Qed.
-
-Add Parametric Morphism : CRealLe
- with signature CRealEq ==> CRealEq ==> iff
- as CRealLe_morph.
-Proof.
- intros. split.
- - intros H1 H2. unfold CRealLe in H1.
- rewrite <- H0 in H2. rewrite <- H in H2. contradiction.
- - intros H1 H2. unfold CRealLe in H1.
- rewrite H0 in H2. rewrite H in H2. contradiction.
-Qed.
-
-Add Parametric Morphism : CRealGe
- with signature CRealEq ==> CRealEq ==> iff
- as CRealGe_morph.
-Proof.
- intros. unfold CRealGe. apply CRealLe_morph; assumption.
-Qed.
-
-Lemma CRealLt_proper_l : forall x y z : CReal,
- CRealEq x y
- -> CRealLt x z -> CRealLt y z.
-Proof.
- intros. apply (CRealLt_morph x y H z z).
- apply CRealEq_refl. apply H0.
-Qed.
-
-Lemma CRealLt_proper_r : forall x y z : CReal,
- CRealEq x y
- -> CRealLt z x -> CRealLt z y.
-Proof.
- intros. apply (CRealLt_morph z z (CRealEq_refl z) x y).
- apply H. apply H0.
-Qed.
-
-Lemma CRealLe_proper_l : forall x y z : CReal,
- CRealEq x y
- -> CRealLe x z -> CRealLe y z.
-Proof.
- intros. apply (CRealLe_morph x y H z z).
- apply CRealEq_refl. apply H0.
-Qed.
-
-Lemma CRealLe_proper_r : forall x y z : CReal,
- CRealEq x y
- -> CRealLe z x -> CRealLe z y.
-Proof.
- intros. apply (CRealLe_morph z z (CRealEq_refl z) x y).
- apply H. apply H0.
-Qed.
-
-
-
-(* Injection of Q into CReal *)
-
-Lemma ConstCauchy : forall q : Q,
- QCauchySeq (fun _ => q) Pos.to_nat.
-Proof.
- intros. intros k p r H H0.
- unfold Qminus. rewrite Qplus_opp_r. unfold Qlt. simpl.
- unfold Z.lt. auto.
-Qed.
-
-Definition inject_Q : Q -> CReal.
-Proof.
- intro q. exists (fun n => q). apply ConstCauchy.
-Defined.
-
-Definition inject_Z : Z -> CReal
- := fun n => inject_Q (n # 1).
-
-Notation "0" := (inject_Q 0) : CReal_scope.
-Notation "1" := (inject_Q 1) : CReal_scope.
-Notation "2" := (inject_Q 2) : CReal_scope.
-
-Lemma CRealLt_0_1 : CRealLt (inject_Q 0) (inject_Q 1).
-Proof.
- exists 3%positive. reflexivity.
-Qed.
-
-Lemma CReal_injectQPos : forall q : Q,
- Qlt 0 q -> CRealLt (inject_Q 0) (inject_Q q).
-Proof.
- intros. destruct (Qarchimedean ((2#1) / q)).
- exists x. simpl. unfold Qminus. rewrite Qplus_0_r.
- apply (Qmult_lt_compat_r _ _ q) in q0. 2: apply H.
- unfold Qdiv in q0.
- rewrite <- Qmult_assoc in q0. rewrite <- (Qmult_comm q) in q0.
- rewrite Qmult_inv_r in q0. rewrite Qmult_1_r in q0.
- unfold Qlt; simpl. unfold Qlt in q0; simpl in q0.
- rewrite Z.mul_1_r in q0. destruct q; simpl. simpl in q0.
- destruct Qnum. apply q0.
- rewrite <- Pos2Z.inj_mul. rewrite Pos.mul_comm. apply q0.
- inversion H. intro abs. rewrite abs in H. apply (Qlt_irrefl 0 H).
-Qed.
-
-(* A rational number has a constant Cauchy sequence realizing it
- as a real number, which increases the precision of the majoration
- by a factor 2. *)
-Lemma CRealLtQ : forall (x : CReal) (q : Q),
- CRealLt x (inject_Q q)
- -> forall p:positive, Qlt (proj1_sig x (Pos.to_nat p)) (q + (1#p)).
-Proof.
- intros [xn cau] q maj p. simpl.
- destruct (Qlt_le_dec (xn (Pos.to_nat p)) (q + (1 # p))). assumption.
- exfalso.
- apply CRealLt_above in maj.
- destruct maj as [k maj]; simpl in maj.
- specialize (maj (Pos.max k p) (Pos.le_max_l _ _)).
- specialize (cau p (Pos.to_nat p) (Pos.to_nat (Pos.max k p)) (le_refl _)).
- pose proof (Qplus_lt_le_compat (2#k) (q - xn (Pos.to_nat (Pos.max k p)))
- (q + (1 # p)) (xn (Pos.to_nat p)) maj q0).
- rewrite Qplus_comm in H. unfold Qminus in H. rewrite <- Qplus_assoc in H.
- rewrite <- Qplus_assoc in H. apply Qplus_lt_r in H.
- rewrite <- (Qplus_lt_r _ _ (xn (Pos.to_nat p))) in maj.
- apply (Qlt_not_le (1#p) ((1 # p) + (2 # k))).
- rewrite <- (Qplus_0_r (1#p)). rewrite <- Qplus_assoc.
- apply Qplus_lt_r. reflexivity.
- apply Qlt_le_weak.
- apply (Qlt_trans _ (- xn (Pos.to_nat (Pos.max k p)) + xn (Pos.to_nat p)) _ H).
- rewrite Qplus_comm.
- apply (Qle_lt_trans _ (Qabs (xn (Pos.to_nat p) - xn (Pos.to_nat (Pos.max k p))))).
- apply Qle_Qabs. apply cau. apply Pos2Nat.inj_le. apply Pos.le_max_r.
-Qed.
-
-Lemma CRealLtQopp : forall (x : CReal) (q : Q),
- CRealLt (inject_Q q) x
- -> forall p:positive, Qlt (q - (1#p)) (proj1_sig x (Pos.to_nat p)).
-Proof.
- intros [xn cau] q maj p. simpl.
- destruct (Qlt_le_dec (q - (1 # p)) (xn (Pos.to_nat p))). assumption.
- exfalso.
- apply CRealLt_above in maj.
- destruct maj as [k maj]; simpl in maj.
- specialize (maj (Pos.max k p) (Pos.le_max_l _ _)).
- specialize (cau p (Pos.to_nat (Pos.max k p)) (Pos.to_nat p)).
- pose proof (Qplus_lt_le_compat (2#k) (xn (Pos.to_nat (Pos.max k p)) - q)
- (xn (Pos.to_nat p)) (q - (1 # p)) maj q0).
- unfold Qminus in H. rewrite <- Qplus_assoc in H.
- rewrite (Qplus_assoc (-q)) in H. rewrite (Qplus_comm (-q)) in H.
- rewrite Qplus_opp_r in H. rewrite Qplus_0_l in H.
- apply (Qplus_lt_l _ _ (1#p)) in H.
- rewrite <- (Qplus_assoc (xn (Pos.to_nat (Pos.max k p)))) in H.
- rewrite (Qplus_comm (-(1#p))) in H. rewrite Qplus_opp_r in H.
- rewrite Qplus_0_r in H. rewrite Qplus_comm in H.
- rewrite Qplus_assoc in H. apply (Qplus_lt_l _ _ (- xn (Pos.to_nat p))) in H.
- rewrite <- Qplus_assoc in H. rewrite Qplus_opp_r in H. rewrite Qplus_0_r in H.
- apply (Qlt_not_le (1#p) ((1 # p) + (2 # k))).
- rewrite <- (Qplus_0_r (1#p)). rewrite <- Qplus_assoc.
- apply Qplus_lt_r. reflexivity.
- apply Qlt_le_weak.
- apply (Qlt_trans _ (xn (Pos.to_nat (Pos.max k p)) - xn (Pos.to_nat p)) _ H).
- apply (Qle_lt_trans _ (Qabs (xn (Pos.to_nat (Pos.max k p)) - xn (Pos.to_nat p)))).
- apply Qle_Qabs. apply cau. apply Pos2Nat.inj_le.
- apply Pos.le_max_r. apply le_refl.
-Qed.
-
-Lemma inject_Q_compare : forall (x : CReal) (p : positive),
- x <= inject_Q (proj1_sig x (Pos.to_nat p) + (1#p)).
-Proof.
- intros. intros [n nmaj].
- destruct x as [xn xcau]; simpl in nmaj.
- apply (Qplus_lt_l _ _ (1#p)) in nmaj.
- ring_simplify in nmaj.
- destruct (Pos.max_dec p n).
- - apply Pos.max_l_iff in e.
- apply Pos2Nat.inj_le in e.
- specialize (xcau n (Pos.to_nat n) (Pos.to_nat p) (le_refl _) e).
- apply (Qlt_le_trans _ _ (Qabs (xn (Pos.to_nat n) + -1 * xn (Pos.to_nat p)))) in nmaj.
- 2: apply Qle_Qabs.
- apply (Qlt_trans _ _ _ nmaj) in xcau.
- apply (Qplus_lt_l _ _ (-(1#n)-(1#p))) in xcau. ring_simplify in xcau.
- setoid_replace ((2 # n) + -1 * (1 # n)) with (1#n)%Q in xcau.
- discriminate xcau. setoid_replace (-1 * (1 # n)) with (-1#n)%Q. 2: reflexivity.
- rewrite Qinv_plus_distr. reflexivity.
- - apply Pos.max_r_iff, Pos2Nat.inj_le in e.
- specialize (xcau p (Pos.to_nat n) (Pos.to_nat p) e (le_refl _)).
- apply (Qlt_le_trans _ _ (Qabs (xn (Pos.to_nat n) + -1 * xn (Pos.to_nat p)))) in nmaj.
- 2: apply Qle_Qabs.
- apply (Qlt_trans _ _ _ nmaj) in xcau.
- apply (Qplus_lt_l _ _ (-(1#p))) in xcau. ring_simplify in xcau. discriminate.
-Qed.
-
-
-Add Parametric Morphism : inject_Q
- with signature Qeq ==> CRealEq
- as inject_Q_morph.
-Proof.
- split.
- - intros [n abs]. simpl in abs. rewrite H in abs.
- unfold Qminus in abs. rewrite Qplus_opp_r in abs. discriminate abs.
- - intros [n abs]. simpl in abs. rewrite H in abs.
- unfold Qminus in abs. rewrite Qplus_opp_r in abs. discriminate abs.
-Qed.
-
-Instance inject_Q_morph_T
- : CMorphisms.Proper
- (CMorphisms.respectful Qeq CRealEq) inject_Q.
-Proof.
- split.
- - intros [n abs]. simpl in abs. rewrite H in abs.
- unfold Qminus in abs. rewrite Qplus_opp_r in abs. discriminate abs.
- - intros [n abs]. simpl in abs. rewrite H in abs.
- unfold Qminus in abs. rewrite Qplus_opp_r in abs. discriminate abs.
-Qed.
-
-
-
-(* Algebraic operations *)
-
-Lemma CReal_plus_cauchy
- : forall (xn yn zn : nat -> Q) (cvmod : positive -> nat),
- QSeqEquiv xn yn cvmod
- -> QCauchySeq zn Pos.to_nat
- -> QSeqEquiv (fun n:nat => xn n + zn n) (fun n:nat => yn n + zn n)
- (fun p => max (cvmod (2 * p)%positive)
- (Pos.to_nat (2 * p)%positive)).
-Proof.
- intros. intros p n k H1 H2.
- setoid_replace (xn n + zn n - (yn k + zn k))
- with (xn n - yn k + (zn n - zn k)).
- 2: field.
- apply (Qle_lt_trans _ (Qabs (xn n - yn k) + Qabs (zn n - zn k))).
- apply Qabs_triangle.
- setoid_replace (1#p)%Q with ((1#2*p) + (1#2*p))%Q.
- apply Qplus_lt_le_compat.
- - apply H. apply (le_trans _ (Init.Nat.max (cvmod (2 * p)%positive) (Pos.to_nat (2 * p)))).
- apply Nat.le_max_l. apply H1.
- apply (le_trans _ (Init.Nat.max (cvmod (2 * p)%positive) (Pos.to_nat (2 * p)))).
- apply Nat.le_max_l. apply H2.
- - apply Qle_lteq. left. apply H0.
- apply (le_trans _ (Init.Nat.max (cvmod (2 * p)%positive) (Pos.to_nat (2 * p)))).
- apply Nat.le_max_r. apply H1.
- apply (le_trans _ (Init.Nat.max (cvmod (2 * p)%positive) (Pos.to_nat (2 * p)))).
- apply Nat.le_max_r. apply H2.
- - rewrite Qinv_plus_distr. unfold Qeq. reflexivity.
-Qed.
-
-Definition CReal_plus (x y : CReal) : CReal.
-Proof.
- destruct x as [xn limx], y as [yn limy].
- pose proof (CReal_plus_cauchy xn xn yn Pos.to_nat limx limy).
- exists (fun n : nat => xn (2 * n)%nat + yn (2 * n)%nat).
- intros p k n H0 H1. apply H.
- - rewrite max_l. rewrite Pos2Nat.inj_mul.
- apply Nat.mul_le_mono_nonneg. apply le_0_n. apply le_refl.
- apply le_0_n. apply H0. apply le_refl.
- - rewrite Pos2Nat.inj_mul. rewrite max_l.
- apply Nat.mul_le_mono_nonneg. apply le_0_n. apply le_refl.
- apply le_0_n. apply H1. apply le_refl.
-Defined.
-
-Infix "+" := CReal_plus : CReal_scope.
-
-Lemma CReal_plus_nth : forall (x y : CReal) (n : nat),
- proj1_sig (x + y) n = Qplus (proj1_sig x (2*n)%nat) (proj1_sig y (2*n)%nat).
-Proof.
- intros. destruct x,y; reflexivity.
-Qed.
-
-Lemma CReal_plus_unfold : forall (x y : CReal),
- QSeqEquiv (proj1_sig (CReal_plus x y))
- (fun n : nat => proj1_sig x n + proj1_sig y n)%Q
- (fun p => Pos.to_nat (2 * p)).
-Proof.
- intros [xn limx] [yn limy].
- unfold CReal_plus; simpl.
- intros p n k H H0.
- setoid_replace (xn (2 * n)%nat + yn (2 * n)%nat - (xn k + yn k))%Q
- with (xn (2 * n)%nat - xn k + (yn (2 * n)%nat - yn k))%Q.
- 2: field.
- apply (Qle_lt_trans _ (Qabs (xn (2 * n)%nat - xn k) + Qabs (yn (2 * n)%nat - yn k))).
- apply Qabs_triangle.
- setoid_replace (1#p)%Q with ((1#2*p) + (1#2*p))%Q.
- apply Qplus_lt_le_compat.
- - apply limx. apply (le_trans _ n). apply H.
- rewrite <- (mult_1_l n). rewrite mult_assoc.
- apply Nat.mul_le_mono_nonneg. auto. simpl. auto.
- apply le_0_n. apply le_refl. apply H0.
- - apply Qlt_le_weak. apply limy. apply (le_trans _ n). apply H.
- rewrite <- (mult_1_l n). rewrite mult_assoc.
- apply Nat.mul_le_mono_nonneg. auto. simpl. auto.
- apply le_0_n. apply le_refl. apply H0.
- - rewrite Qinv_plus_distr. unfold Qeq. reflexivity.
-Qed.
-
-Definition CReal_opp (x : CReal) : CReal.
-Proof.
- destruct x as [xn limx].
- exists (fun n : nat => - xn n).
- intros k p q H H0. unfold Qminus. rewrite Qopp_involutive.
- rewrite Qplus_comm. apply limx; assumption.
-Defined.
-
-Notation "- x" := (CReal_opp x) : CReal_scope.
-
-Definition CReal_minus (x y : CReal) : CReal
- := CReal_plus x (CReal_opp y).
-
-Infix "-" := CReal_minus : CReal_scope.
-
-Lemma belowMultiple : forall n p : nat, lt 0 p -> le n (p * n).
-Proof.
- intros. rewrite <- (mult_1_l n). apply Nat.mul_le_mono_nonneg.
- auto. assumption. apply le_0_n. rewrite mult_1_l. apply le_refl.
-Qed.
-
-Lemma CReal_plus_assoc : forall (x y z : CReal),
- CRealEq (CReal_plus (CReal_plus x y) z)
- (CReal_plus x (CReal_plus y z)).
-Proof.
- intros. apply CRealEq_diff. intro n.
- destruct x as [xn limx], y as [yn limy], z as [zn limz].
- unfold CReal_plus; unfold proj1_sig.
- setoid_replace (xn (2 * (2 * Pos.to_nat n))%nat + yn (2 * (2 * Pos.to_nat n))%nat
- + zn (2 * Pos.to_nat n)%nat
- - (xn (2 * Pos.to_nat n)%nat + (yn (2 * (2 * Pos.to_nat n))%nat
- + zn (2 * (2 * Pos.to_nat n))%nat)))%Q
- with (xn (2 * (2 * Pos.to_nat n))%nat - xn (2 * Pos.to_nat n)%nat
- + (zn (2 * Pos.to_nat n)%nat - zn (2 * (2 * Pos.to_nat n))%nat))%Q.
- apply (Qle_trans _ (Qabs (xn (2 * (2 * Pos.to_nat n))%nat - xn (2 * Pos.to_nat n)%nat)
- + Qabs (zn (2 * Pos.to_nat n)%nat - zn (2 * (2 * Pos.to_nat n))%nat))).
- apply Qabs_triangle.
- rewrite <- (Qinv_plus_distr 1 1 n). apply Qplus_le_compat.
- apply Qle_lteq. left. apply limx. rewrite mult_assoc.
- apply belowMultiple. simpl. auto. apply belowMultiple. auto.
- apply Qle_lteq. left. apply limz. apply belowMultiple. auto.
- rewrite mult_assoc. apply belowMultiple. simpl. auto. field.
-Qed.
-
-Lemma CReal_plus_comm : forall x y : CReal,
- x + y == y + x.
-Proof.
- intros [xn limx] [yn limy]. apply CRealEq_diff. intros.
- unfold CReal_plus, proj1_sig.
- setoid_replace (xn (2 * Pos.to_nat n)%nat + yn (2 * Pos.to_nat n)%nat
- - (yn (2 * Pos.to_nat n)%nat + xn (2 * Pos.to_nat n)%nat))%Q
- with 0%Q.
- unfold Qle. simpl. unfold Z.le. intro absurd. inversion absurd.
- field.
-Qed.
-
-Lemma CReal_plus_0_l : forall r : CReal,
- CRealEq (CReal_plus (inject_Q 0) r) r.
-Proof.
- intro r. assert (forall n:nat, le n (2 * n)).
- { intro n. simpl. rewrite <- (plus_0_r n). rewrite <- plus_assoc.
- apply Nat.add_le_mono_l. apply le_0_n. }
- split.
- - intros [n maj]. destruct r as [xn q]; unfold CReal_plus, proj1_sig, inject_Q in maj.
- rewrite Qplus_0_l in maj.
- specialize (q n (Pos.to_nat n) (mult 2 (Pos.to_nat n)) (le_refl _)).
- apply (Qlt_not_le (2#n) (xn (Pos.to_nat n) - xn (2 * Pos.to_nat n)%nat)).
- assumption.
- apply (Qle_trans _ (Qabs (xn (Pos.to_nat n) - xn (2 * Pos.to_nat n)%nat))).
- apply Qle_Qabs. apply (Qle_trans _ (1#n)). apply Qlt_le_weak. apply q.
- apply H. unfold Qle, Z.le; simpl. apply Pos2Nat.inj_le. rewrite Pos2Nat.inj_xO.
- apply H.
- - intros [n maj]. destruct r as [xn q]; unfold CReal_plus, proj1_sig, inject_Q in maj.
- rewrite Qplus_0_l in maj.
- specialize (q n (Pos.to_nat n) (mult 2 (Pos.to_nat n)) (le_refl _)).
- rewrite Qabs_Qminus in q.
- apply (Qlt_not_le (2#n) (xn (mult 2 (Pos.to_nat n)) - xn (Pos.to_nat n))).
- assumption.
- apply (Qle_trans _ (Qabs (xn (mult 2 (Pos.to_nat n)) - xn (Pos.to_nat n)))).
- apply Qle_Qabs. apply (Qle_trans _ (1#n)). apply Qlt_le_weak. apply q.
- apply H. unfold Qle, Z.le; simpl. apply Pos2Nat.inj_le. rewrite Pos2Nat.inj_xO.
- apply H.
-Qed.
-
-Lemma CReal_plus_0_r : forall r : CReal,
- r + 0 == r.
-Proof.
- intro r. rewrite CReal_plus_comm. apply CReal_plus_0_l.
-Qed.
-
-Lemma CReal_plus_lt_compat_l :
- forall x y z : CReal, y < z -> x + y < x + z.
-Proof.
- intros.
- apply CRealLt_above in H. destruct H as [n maj].
- exists n. specialize (maj (xO n)).
- rewrite Pos2Nat.inj_xO in maj.
- setoid_replace (proj1_sig (CReal_plus x z) (Pos.to_nat n)
- - proj1_sig (CReal_plus x y) (Pos.to_nat n))%Q
- with (proj1_sig z (2 * Pos.to_nat n)%nat - proj1_sig y (2 * Pos.to_nat n)%nat)%Q.
- apply maj. apply Pos2Nat.inj_le.
- rewrite <- (plus_0_r (Pos.to_nat n)). rewrite Pos2Nat.inj_xO.
- simpl. apply Nat.add_le_mono_l. apply le_0_n.
- simpl. destruct x as [xn limx], y as [yn limy], z as [zn limz].
- simpl; ring.
-Qed.
-
-Lemma CReal_plus_lt_compat_r :
- forall x y z : CReal, y < z -> y + x < z + x.
-Proof.
- intros. do 2 rewrite <- (CReal_plus_comm x).
- apply CReal_plus_lt_compat_l. assumption.
-Qed.
-
-Lemma CReal_plus_lt_reg_l :
- forall x y z : CReal, x + y < x + z -> y < z.
-Proof.
- intros. destruct H as [n maj]. exists (2*n)%positive.
- setoid_replace (proj1_sig z (Pos.to_nat (2 * n)) - proj1_sig y (Pos.to_nat (2 * n)))%Q
- with (proj1_sig (CReal_plus x z) (Pos.to_nat n) - proj1_sig (CReal_plus x y) (Pos.to_nat n))%Q.
- apply (Qle_lt_trans _ (2#n)). unfold Qle, Z.le; simpl. apply Pos2Nat.inj_le.
- rewrite <- (plus_0_r (Pos.to_nat n~0)). rewrite (Pos2Nat.inj_xO (n~0)).
- simpl. apply Nat.add_le_mono_l. apply le_0_n.
- apply maj. rewrite Pos2Nat.inj_xO.
- destruct x as [xn limx], y as [yn limy], z as [zn limz].
- simpl; ring.
-Qed.
-
-Lemma CReal_plus_lt_reg_r :
- forall x y z : CReal, y + x < z + x -> y < z.
-Proof.
- intros x y z H. rewrite (CReal_plus_comm y), (CReal_plus_comm z) in H.
- apply CReal_plus_lt_reg_l in H. exact H.
-Qed.
-
-Lemma CReal_plus_le_reg_l :
- forall x y z : CReal, x + y <= x + z -> y <= z.
-Proof.
- intros. intro abs. apply H. clear H.
- apply CReal_plus_lt_compat_l. exact abs.
-Qed.
-
-Lemma CReal_plus_le_reg_r :
- forall x y z : CReal, y + x <= z + x -> y <= z.
-Proof.
- intros. intro abs. apply H. clear H.
- apply CReal_plus_lt_compat_r. exact abs.
-Qed.
-
-Lemma CReal_plus_le_compat_l : forall r r1 r2, r1 <= r2 -> r + r1 <= r + r2.
-Proof.
- intros. intro abs. apply CReal_plus_lt_reg_l in abs. contradiction.
-Qed.
-
-Lemma CReal_plus_le_lt_compat :
- forall r1 r2 r3 r4 : CReal, r1 <= r2 -> r3 < r4 -> r1 + r3 < r2 + r4.
-Proof.
- intros; apply CReal_le_lt_trans with (r2 + r3).
- intro abs. rewrite CReal_plus_comm, (CReal_plus_comm r1) in abs.
- apply CReal_plus_lt_reg_l in abs. contradiction.
- apply CReal_plus_lt_compat_l; exact H0.
-Qed.
-
-Lemma CReal_plus_le_compat :
- forall r1 r2 r3 r4 : CReal, r1 <= r2 -> r3 <= r4 -> r1 + r3 <= r2 + r4.
-Proof.
- intros; apply CReal_le_trans with (r2 + r3).
- intro abs. rewrite CReal_plus_comm, (CReal_plus_comm r1) in abs.
- apply CReal_plus_lt_reg_l in abs. contradiction.
- apply CReal_plus_le_compat_l; exact H0.
-Qed.
-
-Lemma CReal_plus_opp_r : forall x : CReal,
- x + - x == 0.
-Proof.
- intros [xn limx]. apply CRealEq_diff. intros.
- unfold CReal_plus, CReal_opp, inject_Q, proj1_sig.
- setoid_replace (xn (2 * Pos.to_nat n)%nat + - xn (2 * Pos.to_nat n)%nat - 0)%Q
- with 0%Q.
- unfold Qle. simpl. unfold Z.le. intro absurd. inversion absurd. field.
-Qed.
-
-Lemma CReal_plus_opp_l : forall x : CReal,
- - x + x == 0.
-Proof.
- intro x. rewrite CReal_plus_comm. apply CReal_plus_opp_r.
-Qed.
-
-Lemma CReal_plus_proper_r : forall x y z : CReal,
- CRealEq x y -> CRealEq (CReal_plus x z) (CReal_plus y z).
-Proof.
- intros. apply (CRealEq_trans _ (CReal_plus z x)).
- apply CReal_plus_comm. apply (CRealEq_trans _ (CReal_plus z y)).
- 2: apply CReal_plus_comm.
- split. intro abs. apply CReal_plus_lt_reg_l in abs.
- destruct H. contradiction. intro abs. apply CReal_plus_lt_reg_l in abs.
- destruct H. contradiction.
-Qed.
-
-Lemma CReal_plus_proper_l : forall x y z : CReal,
- CRealEq x y -> CRealEq (CReal_plus z x) (CReal_plus z y).
-Proof.
- intros. split. intro abs. apply CReal_plus_lt_reg_l in abs.
- destruct H. contradiction. intro abs. apply CReal_plus_lt_reg_l in abs.
- destruct H. contradiction.
-Qed.
-
-Add Parametric Morphism : CReal_plus
- with signature CRealEq ==> CRealEq ==> CRealEq
- as CReal_plus_morph.
-Proof.
- intros x y H z t H0. apply (CRealEq_trans _ (CReal_plus x t)).
- - destruct H0.
- split. intro abs. apply CReal_plus_lt_reg_l in abs. contradiction.
- intro abs. apply CReal_plus_lt_reg_l in abs. contradiction.
- - apply CReal_plus_proper_r. apply H.
-Qed.
-
-Instance CReal_plus_morph_T
- : CMorphisms.Proper
- (CMorphisms.respectful CRealEq (CMorphisms.respectful CRealEq CRealEq)) CReal_plus.
-Proof.
- intros x y H z t H0. apply (CRealEq_trans _ (CReal_plus x t)).
- - destruct H0.
- split. intro abs. apply CReal_plus_lt_reg_l in abs. contradiction.
- intro abs. apply CReal_plus_lt_reg_l in abs. contradiction.
- - apply CReal_plus_proper_r. apply H.
-Qed.
-
-Lemma CReal_plus_eq_reg_l : forall (r r1 r2 : CReal),
- r + r1 == r + r2 -> r1 == r2.
-Proof.
- intros. destruct H. split.
- - intro abs. apply (CReal_plus_lt_compat_l r) in abs. contradiction.
- - intro abs. apply (CReal_plus_lt_compat_l r) in abs. contradiction.
-Qed.
-
-Lemma CReal_opp_0 : -0 == 0.
-Proof.
- apply (CReal_plus_eq_reg_l 0).
- rewrite CReal_plus_0_r, CReal_plus_opp_r. reflexivity.
-Qed.
-
-Lemma CReal_opp_plus_distr : forall r1 r2, - (r1 + r2) == - r1 + - r2.
-Proof.
- intros. apply (CReal_plus_eq_reg_l (r1+r2)).
- rewrite CReal_plus_opp_r, (CReal_plus_comm (-r1)), CReal_plus_assoc.
- rewrite <- (CReal_plus_assoc r2), CReal_plus_opp_r, CReal_plus_0_l.
- rewrite CReal_plus_opp_r. reflexivity.
-Qed.
-
-Lemma CReal_opp_involutive : forall x:CReal, --x == x.
-Proof.
- intros. apply (CReal_plus_eq_reg_l (-x)).
- rewrite CReal_plus_opp_l, CReal_plus_opp_r. reflexivity.
-Qed.
-
-Lemma CReal_opp_gt_lt_contravar : forall r1 r2, r1 > r2 -> - r1 < - r2.
-Proof.
- unfold CRealGt; intros.
- apply (CReal_plus_lt_reg_l (r2 + r1)).
- rewrite CReal_plus_assoc, CReal_plus_opp_r, CReal_plus_0_r.
- rewrite CReal_plus_comm, <- CReal_plus_assoc, CReal_plus_opp_l.
- rewrite CReal_plus_0_l. exact H.
-Qed.
-
-Lemma CReal_opp_ge_le_contravar : forall r1 r2, r1 >= r2 -> - r1 <= - r2.
-Proof.
- intros. intro abs. apply H. clear H.
- apply (CReal_plus_lt_reg_r (-r1-r2)).
- unfold CReal_minus. rewrite <- CReal_plus_assoc, CReal_plus_opp_r, CReal_plus_0_l.
- rewrite (CReal_plus_comm (-r1)), <- CReal_plus_assoc, CReal_plus_opp_r, CReal_plus_0_l.
- exact abs.
-Qed.
-
-Lemma inject_Q_plus : forall q r : Q,
- inject_Q (q + r) == inject_Q q + inject_Q r.
-Proof.
- split.
- - intros [n nmaj]. simpl in nmaj.
- ring_simplify in nmaj. discriminate.
- - intros [n nmaj]. simpl in nmaj.
- ring_simplify in nmaj. discriminate.
-Qed.
-
-Lemma inject_Q_one : inject_Q 1 == 1.
-Proof.
- split.
- - intros [n nmaj]. simpl in nmaj.
- ring_simplify in nmaj. discriminate.
- - intros [n nmaj]. simpl in nmaj.
- ring_simplify in nmaj. discriminate.
-Qed.
-
-Lemma inject_Q_lt : forall q r : Q,
- Qlt q r -> inject_Q q < inject_Q r.
-Proof.
- intros. destruct (Qarchimedean (/(r-q))).
- exists (2*x)%positive; simpl.
- setoid_replace (2 # x~0)%Q with (/(Z.pos x#1))%Q. 2: reflexivity.
- apply Qlt_shift_inv_r. reflexivity.
- apply (Qmult_lt_l _ _ (r-q)) in q0. rewrite Qmult_inv_r in q0.
- exact q0. intro abs. rewrite Qlt_minus_iff in H.
- unfold Qminus in abs. rewrite abs in H. discriminate H.
- unfold Qminus. rewrite <- Qlt_minus_iff. exact H.
-Qed.
-
-Lemma opp_inject_Q : forall q : Q,
- inject_Q (-q) == - inject_Q q.
-Proof.
- split.
- - intros [n maj]. simpl in maj. ring_simplify in maj. discriminate.
- - intros [n maj]. simpl in maj. ring_simplify in maj. discriminate.
-Qed.
-
-Lemma lt_inject_Q : forall q r : Q,
- inject_Q q < inject_Q r -> Qlt q r.
-Proof.
- intros. destruct H. simpl in q0.
- apply Qlt_minus_iff, (Qlt_trans _ (2#x)).
- reflexivity. exact q0.
-Qed.
-
-Lemma le_inject_Q : forall q r : Q,
- inject_Q q <= inject_Q r -> Qle q r.
-Proof.
- intros. destruct (Qlt_le_dec r q). 2: exact q0.
- exfalso. apply H. clear H. apply inject_Q_lt. exact q0.
-Qed.
-
-Lemma inject_Q_le : forall q r : Q,
- Qle q r -> inject_Q q <= inject_Q r.
-Proof.
- intros. intros [n maj]. simpl in maj.
- apply (Qlt_not_le _ _ maj). apply (Qle_trans _ 0).
- apply (Qplus_le_l _ _ r). ring_simplify. exact H. discriminate.
-Qed.
-
-Lemma inject_Z_plus : forall q r : Z,
- inject_Z (q + r) == inject_Z q + inject_Z r.
-Proof.
- intros. unfold inject_Z.
- setoid_replace (q + r # 1)%Q with ((q#1) + (r#1))%Q.
- apply inject_Q_plus. rewrite Qinv_plus_distr. reflexivity.
-Qed.
-
-Lemma opp_inject_Z : forall n : Z,
- inject_Z (-n) == - inject_Z n.
-Proof.
- intros. unfold inject_Z.
- setoid_replace (-n # 1)%Q with (-(n#1))%Q.
- rewrite opp_inject_Q. reflexivity. reflexivity.
-Qed.
diff --git a/theories/Reals/ConstructiveCauchyRealsMult.v b/theories/Reals/ConstructiveCauchyRealsMult.v
deleted file mode 100644
index 7530a8f1ef..0000000000
--- a/theories/Reals/ConstructiveCauchyRealsMult.v
+++ /dev/null
@@ -1,1415 +0,0 @@
-(************************************************************************)
-(* * The Coq Proof Assistant / The Coq Development Team *)
-(* v * Copyright INRIA, CNRS and contributors *)
-(* Q) (k : nat) (A : positive) { struct k }
- : (forall n:nat, le k n -> Qlt (Qabs (qn n)) (Z.pos A # 1))
- -> { B : positive | forall n:nat, Qlt (Qabs (qn n)) (Z.pos B # 1) }.
-Proof.
- intro H. destruct k.
- - exists A. intros. apply H. apply le_0_n.
- - destruct (Qarchimedean (Qabs (qn k))) as [a maj].
- apply (BoundFromZero qn k (Pos.max A a)).
- intros n H0. destruct (Nat.le_gt_cases n k).
- + pose proof (Nat.le_antisymm n k H1 H0). subst k.
- apply (Qlt_le_trans _ (Z.pos a # 1)). apply maj.
- unfold Qle; simpl. rewrite Pos.mul_1_r. rewrite Pos.mul_1_r.
- apply Pos.le_max_r.
- + apply (Qlt_le_trans _ (Z.pos A # 1)). apply H.
- apply H1. unfold Qle; simpl. rewrite Pos.mul_1_r. rewrite Pos.mul_1_r.
- apply Pos.le_max_l.
-Qed.
-
-Lemma QCauchySeq_bounded (qn : nat -> Q) (cvmod : positive -> nat)
- : QCauchySeq qn cvmod
- -> { A : positive | forall n:nat, Qlt (Qabs (qn n)) (Z.pos A # 1) }.
-Proof.
- intros. remember (Zplus (Qnum (Qabs (qn (cvmod xH)))) 1) as z.
- assert (Z.lt 0 z) as zPos.
- { subst z. assert (Qle 0 (Qabs (qn (cvmod 1%positive)))).
- apply Qabs_nonneg. destruct (Qabs (qn (cvmod 1%positive))). simpl.
- unfold Qle in H0. simpl in H0. rewrite Zmult_1_r in H0.
- apply (Z.lt_le_trans 0 1). unfold Z.lt. auto.
- rewrite <- (Zplus_0_l 1). rewrite Zplus_assoc. apply Zplus_le_compat_r.
- rewrite Zplus_0_r. assumption. }
- assert { A : positive | forall n:nat,
- le (cvmod xH) n -> Qlt ((Qabs (qn n)) * (1#A)) 1 }.
- destruct z eqn:des.
- - exfalso. apply (Z.lt_irrefl 0). assumption.
- - exists p. intros. specialize (H xH (cvmod xH) n (le_refl _) H0).
- assert (Qlt (Qabs (qn n)) (Qabs (qn (cvmod 1%positive)) + 1)).
- { apply (Qplus_lt_l _ _ (-Qabs (qn (cvmod 1%positive)))).
- rewrite <- (Qplus_comm 1). rewrite <- Qplus_assoc. rewrite Qplus_opp_r.
- rewrite Qplus_0_r. apply (Qle_lt_trans _ (Qabs (qn n - qn (cvmod 1%positive)))).
- apply Qabs_triangle_reverse. rewrite Qabs_Qminus. assumption. }
- apply (Qlt_le_trans _ ((Qabs (qn (cvmod 1%positive)) + 1) * (1#p))).
- apply Qmult_lt_r. unfold Qlt. simpl. unfold Z.lt. auto. assumption.
- unfold Qle. simpl. rewrite Zmult_1_r. rewrite Zmult_1_r. rewrite Zmult_1_r.
- rewrite Pos.mul_1_r. rewrite Pos2Z.inj_mul. rewrite Heqz.
- destruct (Qabs (qn (cvmod 1%positive))) eqn:desAbs.
- rewrite Z.mul_add_distr_l. rewrite Zmult_1_r.
- apply Zplus_le_compat_r. rewrite <- (Zmult_1_l (QArith_base.Qnum (Qnum # Qden))).
- rewrite Zmult_assoc. apply Zmult_le_compat_r. rewrite Zmult_1_r.
- simpl. unfold Z.le. rewrite <- Pos2Z.inj_compare.
- unfold Pos.compare. destruct Qden; discriminate.
- simpl. assert (Qle 0 (Qnum # Qden)). rewrite <- desAbs.
- apply Qabs_nonneg. unfold Qle in H2. simpl in H2. rewrite Zmult_1_r in H2.
- assumption.
- - exfalso. inversion zPos.
- - destruct H0. apply (BoundFromZero _ (cvmod xH) x). intros n H0.
- specialize (q n H0). setoid_replace (Z.pos x # 1)%Q with (/(1#x))%Q.
- rewrite <- (Qmult_1_l (/(1#x))). apply Qlt_shift_div_l.
- reflexivity. apply q. reflexivity.
-Qed.
-
-Lemma CReal_mult_cauchy
- : forall (xn yn zn : nat -> Q) (Ay Az : positive) (cvmod : positive -> nat),
- QSeqEquiv xn yn cvmod
- -> QCauchySeq zn Pos.to_nat
- -> (forall n:nat, Qlt (Qabs (yn n)) (Z.pos Ay # 1))
- -> (forall n:nat, Qlt (Qabs (zn n)) (Z.pos Az # 1))
- -> QSeqEquiv (fun n:nat => xn n * zn n) (fun n:nat => yn n * zn n)
- (fun p => max (cvmod (2 * (Pos.max Ay Az) * p)%positive)
- (Pos.to_nat (2 * (Pos.max Ay Az) * p)%positive)).
-Proof.
- intros xn yn zn Ay Az cvmod limx limz majy majz.
- remember (Pos.mul 2 (Pos.max Ay Az)) as z.
- intros k p q H H0.
- assert (Pos.to_nat k <> O) as kPos.
- { intro absurd. pose proof (Pos2Nat.is_pos k).
- rewrite absurd in H1. inversion H1. }
- setoid_replace (xn p * zn p - yn q * zn q)%Q
- with ((xn p - yn q) * zn p + yn q * (zn p - zn q))%Q.
- 2: ring.
- apply (Qle_lt_trans _ (Qabs ((xn p - yn q) * zn p)
- + Qabs (yn q * (zn p - zn q)))).
- apply Qabs_triangle. rewrite Qabs_Qmult. rewrite Qabs_Qmult.
- setoid_replace (1#k)%Q with ((1#2*k) + (1#2*k))%Q.
- apply Qplus_lt_le_compat.
- - apply (Qle_lt_trans _ ((1#z * k) * Qabs (zn p)%nat)).
- + apply Qmult_le_compat_r. apply Qle_lteq. left. apply limx.
- apply (le_trans _ (Init.Nat.max (cvmod (z * k)%positive) (Pos.to_nat (z * k)))).
- apply Nat.le_max_l. assumption.
- apply (le_trans _ (Init.Nat.max (cvmod (z * k)%positive) (Pos.to_nat (z * k)))).
- apply Nat.le_max_l. assumption. apply Qabs_nonneg.
- + subst z. rewrite <- (Qmult_1_r (1 # 2 * k)).
- rewrite <- Pos.mul_assoc. rewrite <- (Pos.mul_comm k). rewrite Pos.mul_assoc.
- rewrite (factorDenom _ _ (2 * k)). rewrite <- Qmult_assoc.
- apply Qmult_lt_l. unfold Qlt. simpl. unfold Z.lt. auto.
- apply (Qle_lt_trans _ (Qabs (zn p)%nat * (1 # Az))).
- rewrite <- (Qmult_comm (1 # Az)). apply Qmult_le_compat_r.
- unfold Qle. simpl. rewrite Pos2Z.inj_max. apply Z.le_max_r.
- apply Qabs_nonneg. rewrite <- (Qmult_inv_r (1#Az)).
- rewrite Qmult_comm. apply Qmult_lt_l. reflexivity.
- setoid_replace (/(1#Az))%Q with (Z.pos Az # 1)%Q. apply majz.
- reflexivity. intro abs. inversion abs.
- - apply (Qle_trans _ ((1 # z * k) * Qabs (yn q)%nat)).
- + rewrite Qmult_comm. apply Qmult_le_compat_r. apply Qle_lteq.
- left. apply limz.
- apply (le_trans _ (max (cvmod (z * k)%positive)
- (Pos.to_nat (z * k)%positive))).
- apply Nat.le_max_r. assumption.
- apply (le_trans _ (max (cvmod (z * k)%positive)
- (Pos.to_nat (z * k)%positive))).
- apply Nat.le_max_r. assumption. apply Qabs_nonneg.
- + subst z. rewrite <- (Qmult_1_r (1 # 2 * k)).
- rewrite <- Pos.mul_assoc. rewrite <- (Pos.mul_comm k). rewrite Pos.mul_assoc.
- rewrite (factorDenom _ _ (2 * k)). rewrite <- Qmult_assoc.
- apply Qle_lteq. left.
- apply Qmult_lt_l. unfold Qlt. simpl. unfold Z.lt. auto.
- apply (Qle_lt_trans _ (Qabs (yn q)%nat * (1 # Ay))).
- rewrite <- (Qmult_comm (1 # Ay)). apply Qmult_le_compat_r.
- unfold Qle. simpl. rewrite Pos2Z.inj_max. apply Z.le_max_l.
- apply Qabs_nonneg. rewrite <- (Qmult_inv_r (1#Ay)).
- rewrite Qmult_comm. apply Qmult_lt_l. reflexivity.
- setoid_replace (/(1#Ay))%Q with (Z.pos Ay # 1)%Q. apply majy.
- reflexivity. intro abs. inversion abs.
- - rewrite Qinv_plus_distr. unfold Qeq. reflexivity.
-Qed.
-
-Lemma linear_max : forall (p Ax Ay : positive) (i : nat),
- le (Pos.to_nat p) i
- -> (Init.Nat.max (Pos.to_nat (2 * Pos.max Ax Ay * p))
- (Pos.to_nat (2 * Pos.max Ax Ay * p)) <= Pos.to_nat (2 * Pos.max Ax Ay) * i)%nat.
-Proof.
- intros. rewrite max_l. 2: apply le_refl.
- rewrite Pos2Nat.inj_mul. apply Nat.mul_le_mono_nonneg.
- apply le_0_n. apply le_refl. apply le_0_n. apply H.
-Qed.
-
-Definition CReal_mult (x y : CReal) : CReal.
-Proof.
- destruct x as [xn limx]. destruct y as [yn limy].
- destruct (QCauchySeq_bounded xn Pos.to_nat limx) as [Ax majx].
- destruct (QCauchySeq_bounded yn Pos.to_nat limy) as [Ay majy].
- pose proof (CReal_mult_cauchy xn xn yn Ax Ay Pos.to_nat limx limy majx majy).
- exists (fun n : nat => xn (Pos.to_nat (2 * Pos.max Ax Ay)* n)%nat
- * yn (Pos.to_nat (2 * Pos.max Ax Ay) * n)%nat).
- intros p n k H0 H1.
- apply H; apply linear_max; assumption.
-Defined.
-
-Infix "*" := CReal_mult : CReal_scope.
-
-Lemma CReal_mult_unfold : forall x y : CReal,
- QSeqEquivEx (proj1_sig (CReal_mult x y))
- (fun n : nat => proj1_sig x n * proj1_sig y n)%Q.
-Proof.
- intros [xn limx] [yn limy]. unfold CReal_mult ; simpl.
- destruct (QCauchySeq_bounded xn Pos.to_nat limx) as [Ax majx].
- destruct (QCauchySeq_bounded yn Pos.to_nat limy) as [Ay majy].
- simpl.
- pose proof (CReal_mult_cauchy xn xn yn Ax Ay Pos.to_nat limx limy majx majy).
- exists (fun p : positive =>
- Init.Nat.max (Pos.to_nat (2 * Pos.max Ax Ay * p))
- (Pos.to_nat (2 * Pos.max Ax Ay * p))).
- intros p n k H0 H1. rewrite max_l in H0, H1.
- 2: apply le_refl. 2: apply le_refl.
- apply H. apply linear_max.
- apply (le_trans _ (Pos.to_nat (2 * Pos.max Ax Ay * p))).
- rewrite <- (mult_1_l (Pos.to_nat p)). rewrite Pos2Nat.inj_mul.
- apply Nat.mul_le_mono_nonneg. auto. apply Pos2Nat.is_pos.
- apply le_0_n. apply le_refl. apply H0. rewrite max_l.
- apply H1. apply le_refl.
-Qed.
-
-Lemma CReal_mult_assoc_bounded_r : forall (xn yn zn : nat -> Q),
- QSeqEquivEx xn yn (* both are Cauchy with same limit *)
- -> QSeqEquiv zn zn Pos.to_nat
- -> QSeqEquivEx (fun n => xn n * zn n)%Q (fun n => yn n * zn n)%Q.
-Proof.
- intros. destruct H as [cvmod cveq].
- destruct (QCauchySeq_bounded yn (fun k => cvmod (2 * k)%positive)
- (QSeqEquiv_cau_r xn yn cvmod cveq))
- as [Ay majy].
- destruct (QCauchySeq_bounded zn Pos.to_nat H0) as [Az majz].
- exists (fun p => max (cvmod (2 * (Pos.max Ay Az) * p)%positive)
- (Pos.to_nat (2 * (Pos.max Ay Az) * p)%positive)).
- apply CReal_mult_cauchy; assumption.
-Qed.
-
-Lemma CReal_mult_assoc : forall x y z : CReal,
- CRealEq (CReal_mult (CReal_mult x y) z)
- (CReal_mult x (CReal_mult y z)).
-Proof.
- intros. apply CRealEq_diff. apply CRealEq_modindep.
- apply (QSeqEquivEx_trans _ (fun n => proj1_sig x n * proj1_sig y n * proj1_sig z n)%Q).
- - apply (QSeqEquivEx_trans _ (fun n => proj1_sig (CReal_mult x y) n * proj1_sig z n)%Q).
- apply CReal_mult_unfold.
- destruct x as [xn limx], y as [yn limy], z as [zn limz]; unfold CReal_mult; simpl.
- destruct (QCauchySeq_bounded xn Pos.to_nat limx) as [Ax majx].
- destruct (QCauchySeq_bounded yn Pos.to_nat limy) as [Ay majy].
- destruct (QCauchySeq_bounded zn Pos.to_nat limz) as [Az majz].
- apply CReal_mult_assoc_bounded_r. 2: apply limz.
- simpl.
- pose proof (CReal_mult_cauchy xn xn yn Ax Ay Pos.to_nat limx limy majx majy).
- exists (fun p : positive =>
- Init.Nat.max (Pos.to_nat (2 * Pos.max Ax Ay * p))
- (Pos.to_nat (2 * Pos.max Ax Ay * p))).
- intros p n k H0 H1. rewrite max_l in H0, H1.
- 2: apply le_refl. 2: apply le_refl.
- apply H. apply linear_max.
- apply (le_trans _ (Pos.to_nat (2 * Pos.max Ax Ay * p))).
- rewrite <- (mult_1_l (Pos.to_nat p)). rewrite Pos2Nat.inj_mul.
- apply Nat.mul_le_mono_nonneg. auto. apply Pos2Nat.is_pos.
- apply le_0_n. apply le_refl. apply H0. rewrite max_l.
- apply H1. apply le_refl.
- - apply (QSeqEquivEx_trans _ (fun n => proj1_sig x n * proj1_sig (CReal_mult y z) n)%Q).
- 2: apply QSeqEquivEx_sym; apply CReal_mult_unfold.
- destruct x as [xn limx], y as [yn limy], z as [zn limz]; unfold CReal_mult; simpl.
- destruct (QCauchySeq_bounded xn Pos.to_nat limx) as [Ax majx].
- destruct (QCauchySeq_bounded yn Pos.to_nat limy) as [Ay majy].
- destruct (QCauchySeq_bounded zn Pos.to_nat limz) as [Az majz].
- simpl.
- pose proof (CReal_mult_assoc_bounded_r (fun n0 : nat => yn n0 * zn n0)%Q (fun n : nat =>
- yn (Pos.to_nat (Pos.max Ay Az)~0 * n)%nat
- * zn (Pos.to_nat (Pos.max Ay Az)~0 * n)%nat)%Q xn)
- as [cvmod cveq].
-
- pose proof (CReal_mult_cauchy yn yn zn Ay Az Pos.to_nat limy limz majy majz).
- exists (fun p : positive =>
- Init.Nat.max (Pos.to_nat (2 * Pos.max Ay Az * p))
- (Pos.to_nat (2 * Pos.max Ay Az * p))).
- intros p n k H0 H1. rewrite max_l in H0, H1.
- 2: apply le_refl. 2: apply le_refl.
- apply H. rewrite max_l. apply H0. apply le_refl.
- apply linear_max.
- apply (le_trans _ (Pos.to_nat (2 * Pos.max Ay Az * p))).
- rewrite <- (mult_1_l (Pos.to_nat p)). rewrite Pos2Nat.inj_mul.
- apply Nat.mul_le_mono_nonneg. auto. apply Pos2Nat.is_pos.
- apply le_0_n. apply le_refl. apply H1.
- apply limx.
- exists cvmod. intros p k n H1 H2. specialize (cveq p k n H1 H2).
- setoid_replace (xn k * yn k * zn k -
- xn n *
- (yn (Pos.to_nat (Pos.max Ay Az)~0 * n)%nat *
- zn (Pos.to_nat (Pos.max Ay Az)~0 * n)%nat))%Q
- with ((fun n : nat => yn n * zn n * xn n) k -
- (fun n : nat =>
- yn (Pos.to_nat (Pos.max Ay Az)~0 * n)%nat *
- zn (Pos.to_nat (Pos.max Ay Az)~0 * n)%nat *
- xn n) n)%Q.
- apply cveq. ring.
-Qed.
-
-Lemma CReal_mult_comm : forall x y : CReal,
- CRealEq (CReal_mult x y) (CReal_mult y x).
-Proof.
- intros. apply CRealEq_diff. apply CRealEq_modindep.
- apply (QSeqEquivEx_trans _ (fun n => proj1_sig y n * proj1_sig x n)%Q).
- destruct x as [xn limx], y as [yn limy]; simpl.
- 2: apply QSeqEquivEx_sym; apply CReal_mult_unfold.
- destruct (QCauchySeq_bounded xn Pos.to_nat limx) as [Ax majx].
- destruct (QCauchySeq_bounded yn Pos.to_nat limy) as [Ay majy]; simpl.
- apply QSeqEquivEx_sym.
-
- pose proof (CReal_mult_cauchy yn yn xn Ay Ax Pos.to_nat limy limx majy majx).
- exists (fun p : positive =>
- Init.Nat.max (Pos.to_nat (2 * Pos.max Ay Ax * p))
- (Pos.to_nat (2 * Pos.max Ay Ax * p))).
- intros p n k H0 H1. rewrite max_l in H0, H1.
- 2: apply le_refl. 2: apply le_refl.
- rewrite (Qmult_comm (xn (Pos.to_nat (Pos.max Ax Ay)~0 * k)%nat)).
- apply (H p n). rewrite max_l. apply H0. apply le_refl.
- rewrite max_l. apply (le_trans _ k). apply H1.
- rewrite <- (mult_1_l k). rewrite mult_assoc.
- apply Nat.mul_le_mono_nonneg. auto. rewrite mult_1_r.
- apply Pos2Nat.is_pos. apply le_0_n. apply le_refl.
- apply le_refl.
-Qed.
-
-Lemma CReal_mult_proper_l : forall x y z : CReal,
- CRealEq y z -> CRealEq (CReal_mult x y) (CReal_mult x z).
-Proof.
- intros. apply CRealEq_diff. apply CRealEq_modindep.
- apply (QSeqEquivEx_trans _ (fun n => proj1_sig x n * proj1_sig y n)%Q).
- apply CReal_mult_unfold.
- rewrite CRealEq_diff in H. rewrite <- CRealEq_modindep in H.
- apply QSeqEquivEx_sym.
- apply (QSeqEquivEx_trans _ (fun n => proj1_sig x n * proj1_sig z n)%Q).
- apply CReal_mult_unfold.
- destruct x as [xn limx], y as [yn limy], z as [zn limz]; simpl.
- destruct H. simpl in H.
- destruct (QCauchySeq_bounded xn Pos.to_nat limx) as [Ax majx].
- destruct (QCauchySeq_bounded zn Pos.to_nat limz) as [Az majz].
- pose proof (CReal_mult_cauchy yn zn xn Az Ax x H limx majz majx).
- apply QSeqEquivEx_sym.
- exists (fun p : positive =>
- Init.Nat.max (x (2 * Pos.max Az Ax * p)%positive)
- (Pos.to_nat (2 * Pos.max Az Ax * p))).
- intros p n k H1 H2. specialize (H0 p n k H1 H2).
- setoid_replace (xn n * yn n - xn k * zn k)%Q
- with (yn n * xn n - zn k * xn k)%Q.
- apply H0. ring.
-Qed.
-
-Lemma CReal_mult_lt_0_compat : forall x y : CReal,
- CRealLt (inject_Q 0) x
- -> CRealLt (inject_Q 0) y
- -> CRealLt (inject_Q 0) (CReal_mult x y).
-Proof.
- intros. destruct H as [x0 H], H0 as [x1 H0].
- pose proof (CRealLt_aboveSig (inject_Q 0) x x0 H).
- pose proof (CRealLt_aboveSig (inject_Q 0) y x1 H0).
- destruct x as [xn limx], y as [yn limy].
- simpl in H, H1, H2. simpl.
- destruct (QCauchySeq_bounded xn Pos.to_nat limx) as [Ax majx].
- destruct (QCauchySeq_bounded yn Pos.to_nat limy) as [Ay majy].
- destruct (Qarchimedean (/ (xn (Pos.to_nat x0) - 0 - (2 # x0)))).
- destruct (Qarchimedean (/ (yn (Pos.to_nat x1) - 0 - (2 # x1)))).
- exists (Pos.max x0 x~0 * Pos.max x1 x2~0)%positive.
- simpl. unfold Qminus. rewrite Qplus_0_r.
- rewrite <- Pos2Nat.inj_mul.
- unfold Qminus in H1, H2.
- specialize (H1 ((Pos.max Ax Ay)~0 * (Pos.max x0 x~0 * Pos.max x1 x2~0))%positive).
- assert (Pos.max x1 x2~0 <= (Pos.max Ax Ay)~0 * (Pos.max x0 x~0 * Pos.max x1 x2~0))%positive.
- { apply Pos2Nat.inj_le.
- rewrite Pos.mul_assoc. rewrite Pos2Nat.inj_mul.
- rewrite <- (mult_1_l (Pos.to_nat (Pos.max x1 x2~0))).
- rewrite mult_assoc. apply Nat.mul_le_mono_nonneg. auto.
- rewrite mult_1_r. apply Pos2Nat.is_pos. apply le_0_n.
- apply le_refl. }
- specialize (H2 ((Pos.max Ax Ay)~0 * (Pos.max x0 x~0 * Pos.max x1 x2~0))%positive H3).
- rewrite Qplus_0_r in H1, H2.
- apply (Qlt_trans _ ((2 # Pos.max x0 x~0) * (2 # Pos.max x1 x2~0))).
- unfold Qlt; simpl. assert (forall p : positive, (Z.pos p < Z.pos p~0)%Z).
- intro p. rewrite <- (Z.mul_1_l (Z.pos p)).
- replace (Z.pos p~0) with (2 * Z.pos p)%Z. apply Z.mul_lt_mono_pos_r.
- apply Pos2Z.is_pos. reflexivity. reflexivity.
- apply H4.
- apply (Qlt_trans _ ((2 # Pos.max x0 x~0) * (yn (Pos.to_nat ((Pos.max Ax Ay)~0 * (Pos.max x0 x~0 * Pos.max x1 x2~0)))))).
- apply Qmult_lt_l. reflexivity. apply H2. apply Qmult_lt_r.
- apply (Qlt_trans 0 (2 # Pos.max x1 x2~0)). reflexivity. apply H2.
- apply H1. rewrite Pos.mul_comm. apply Pos2Nat.inj_le.
- rewrite <- Pos.mul_assoc. rewrite Pos2Nat.inj_mul.
- rewrite <- (mult_1_r (Pos.to_nat (Pos.max x0 x~0))).
- rewrite <- mult_assoc. apply Nat.mul_le_mono_nonneg.
- apply le_0_n. apply le_refl. auto.
- rewrite mult_1_l. apply Pos2Nat.is_pos.
-Qed.
-
-Lemma CReal_mult_plus_distr_l : forall r1 r2 r3 : CReal,
- r1 * (r2 + r3) == (r1 * r2) + (r1 * r3).
-Proof.
- intros x y z. apply CRealEq_diff. apply CRealEq_modindep.
- apply (QSeqEquivEx_trans _ (fun n => proj1_sig x n
- * (proj1_sig (CReal_plus y z) n))%Q).
- apply CReal_mult_unfold.
- apply (QSeqEquivEx_trans _ (fun n => proj1_sig (CReal_mult x y) n
- + proj1_sig (CReal_mult x z) n))%Q.
- 2: apply QSeqEquivEx_sym; exists (fun p => Pos.to_nat (2 * p))
- ; apply CReal_plus_unfold.
- apply (QSeqEquivEx_trans _ (fun n => proj1_sig x n
- * (proj1_sig y n + proj1_sig z n))%Q).
- - pose proof (CReal_plus_unfold y z).
- destruct x as [xn limx], y as [yn limy], z as [zn limz]; simpl; simpl in H.
- destruct (QCauchySeq_bounded xn Pos.to_nat limx) as [Ax majx].
- destruct (QCauchySeq_bounded yn Pos.to_nat limy) as [Ay majy].
- destruct (QCauchySeq_bounded zn Pos.to_nat limz) as [Az majz].
- pose proof (CReal_mult_cauchy (fun n => yn (n + (n + 0))%nat + zn (n + (n + 0))%nat)%Q
- (fun n => yn n + zn n)%Q
- xn (Ay + Az) Ax
- (fun p => Pos.to_nat (2 * p)) H limx).
- exists (fun p : positive => (Pos.to_nat (2 * (2 * Pos.max (Ay + Az) Ax * p)))).
- intros p n k H1 H2.
- setoid_replace (xn n * (yn (n + (n + 0))%nat + zn (n + (n + 0))%nat) - xn k * (yn k + zn k))%Q
- with ((yn (n + (n + 0))%nat + zn (n + (n + 0))%nat) * xn n - (yn k + zn k) * xn k)%Q.
- 2: ring.
- assert (Pos.to_nat (2 * Pos.max (Ay + Az) Ax * p) <=
- Pos.to_nat 2 * Pos.to_nat (2 * Pos.max (Ay + Az) Ax * p))%nat.
- { rewrite (Pos2Nat.inj_mul 2).
- rewrite <- (mult_1_l (Pos.to_nat (2 * Pos.max (Ay + Az) Ax * p))).
- rewrite mult_assoc. apply Nat.mul_le_mono_nonneg. auto.
- simpl. auto. apply le_0_n. apply le_refl. }
- apply H0. intro n0. apply (Qle_lt_trans _ (Qabs (yn n0) + Qabs (zn n0))).
- apply Qabs_triangle. rewrite Pos2Z.inj_add.
- rewrite <- Qinv_plus_distr. apply Qplus_lt_le_compat.
- apply majy. apply Qlt_le_weak. apply majz.
- apply majx. rewrite max_l.
- apply H1. rewrite (Pos2Nat.inj_mul 2). apply H3.
- rewrite max_l. apply H2. rewrite (Pos2Nat.inj_mul 2).
- apply H3.
- - destruct x as [xn limx], y as [yn limy], z as [zn limz]; simpl.
- destruct (QCauchySeq_bounded xn Pos.to_nat limx) as [Ax majx].
- destruct (QCauchySeq_bounded yn Pos.to_nat limy) as [Ay majy].
- destruct (QCauchySeq_bounded zn Pos.to_nat limz) as [Az majz].
- simpl.
- exists (fun p : positive => (Pos.to_nat (2 * (Pos.max (Pos.max Ax Ay) Az) * (2 * p)))).
- intros p n k H H0.
- setoid_replace (xn n * (yn n + zn n) -
- (xn (Pos.to_nat (Pos.max Ax Ay)~0 * k)%nat *
- yn (Pos.to_nat (Pos.max Ax Ay)~0 * k)%nat +
- xn (Pos.to_nat (Pos.max Ax Az)~0 * k)%nat *
- zn (Pos.to_nat (Pos.max Ax Az)~0 * k)%nat))%Q
- with (xn n * yn n - (xn (Pos.to_nat (Pos.max Ax Ay)~0 * k)%nat *
- yn (Pos.to_nat (Pos.max Ax Ay)~0 * k)%nat)
- + (xn n * zn n - xn (Pos.to_nat (Pos.max Ax Az)~0 * k)%nat *
- zn (Pos.to_nat (Pos.max Ax Az)~0 * k)%nat))%Q.
- 2: ring.
- apply (Qle_lt_trans _ (Qabs (xn n * yn n - (xn (Pos.to_nat (Pos.max Ax Ay)~0 * k)%nat *
- yn (Pos.to_nat (Pos.max Ax Ay)~0 * k)%nat))
- + Qabs (xn n * zn n - xn (Pos.to_nat (Pos.max Ax Az)~0 * k)%nat *
- zn (Pos.to_nat (Pos.max Ax Az)~0 * k)%nat))).
- apply Qabs_triangle.
- setoid_replace (1#p)%Q with ((1#2*p) + (1#2*p))%Q.
- apply Qplus_lt_le_compat.
- + pose proof (CReal_mult_cauchy xn xn yn Ax Ay Pos.to_nat limx limy).
- apply H1. apply majx. apply majy. rewrite max_l.
- apply (le_trans _ (Pos.to_nat (2 * Pos.max (Pos.max Ax Ay) Az * (2 * p)))).
- rewrite (Pos.mul_comm 2). rewrite <- Pos.mul_assoc.
- rewrite <- (Pos.mul_comm (Pos.max (Pos.max Ax Ay) Az)).
- rewrite <- Pos.mul_assoc.
- rewrite Pos2Nat.inj_mul.
- rewrite (Pos2Nat.inj_mul (Pos.max (Pos.max Ax Ay) Az)).
- apply Nat.mul_le_mono_nonneg. apply le_0_n.
- apply Pos2Nat.inj_le. apply Pos.le_max_l.
- apply le_0_n. apply le_refl. apply H. apply le_refl.
- rewrite max_l. apply (le_trans _ k).
- apply (le_trans _ (Pos.to_nat (2 * Pos.max (Pos.max Ax Ay) Az * (2 * p)))).
- rewrite (Pos.mul_comm 2). rewrite <- Pos.mul_assoc.
- rewrite <- (Pos.mul_comm (Pos.max (Pos.max Ax Ay) Az)).
- rewrite <- Pos.mul_assoc.
- rewrite Pos2Nat.inj_mul.
- rewrite (Pos2Nat.inj_mul (Pos.max (Pos.max Ax Ay) Az)).
- apply Nat.mul_le_mono_nonneg. apply le_0_n.
- apply Pos2Nat.inj_le. apply Pos.le_max_l.
- apply le_0_n. apply le_refl. apply H0.
- rewrite <- (mult_1_l k). rewrite mult_assoc.
- apply Nat.mul_le_mono_nonneg. auto.
- rewrite mult_1_r. apply Pos2Nat.is_pos. apply le_0_n.
- apply le_refl. apply le_refl.
- + apply Qlt_le_weak.
- pose proof (CReal_mult_cauchy xn xn zn Ax Az Pos.to_nat limx limz).
- apply H1. apply majx. apply majz. rewrite max_l. 2: apply le_refl.
- apply (le_trans _ (Pos.to_nat (2 * Pos.max (Pos.max Ax Ay) Az * (2 * p)))).
- rewrite (Pos.mul_comm 2). rewrite <- Pos.mul_assoc.
- rewrite <- (Pos.mul_comm (Pos.max (Pos.max Ax Ay) Az)).
- rewrite <- Pos.mul_assoc.
- rewrite Pos2Nat.inj_mul.
- rewrite (Pos2Nat.inj_mul (Pos.max (Pos.max Ax Ay) Az)).
- apply Nat.mul_le_mono_nonneg. apply le_0_n.
- rewrite <- Pos.max_assoc. rewrite (Pos.max_comm Ay Az).
- rewrite Pos.max_assoc. apply Pos2Nat.inj_le. apply Pos.le_max_l.
- apply le_0_n. apply le_refl. apply H.
- rewrite max_l. apply (le_trans _ k).
- apply (le_trans _ (Pos.to_nat (2 * Pos.max (Pos.max Ax Ay) Az * (2 * p)))).
- rewrite (Pos.mul_comm 2). rewrite <- Pos.mul_assoc.
- rewrite <- (Pos.mul_comm (Pos.max (Pos.max Ax Ay) Az)).
- rewrite <- Pos.mul_assoc.
- rewrite Pos2Nat.inj_mul.
- rewrite (Pos2Nat.inj_mul (Pos.max (Pos.max Ax Ay) Az)).
- apply Nat.mul_le_mono_nonneg. apply le_0_n.
- rewrite <- Pos.max_assoc. rewrite (Pos.max_comm Ay Az).
- rewrite Pos.max_assoc. apply Pos2Nat.inj_le. apply Pos.le_max_l.
- apply le_0_n. apply le_refl. apply H0.
- rewrite <- (mult_1_l k). rewrite mult_assoc.
- apply Nat.mul_le_mono_nonneg. auto.
- rewrite mult_1_r. apply Pos2Nat.is_pos. apply le_0_n.
- apply le_refl. apply le_refl.
- + rewrite Qinv_plus_distr. unfold Qeq. reflexivity.
-Qed.
-
-Lemma CReal_mult_plus_distr_r : forall r1 r2 r3 : CReal,
- (r2 + r3) * r1 == (r2 * r1) + (r3 * r1).
-Proof.
- intros.
- rewrite CReal_mult_comm, CReal_mult_plus_distr_l,
- <- (CReal_mult_comm r1), <- (CReal_mult_comm r1).
- reflexivity.
-Qed.
-
-Lemma CReal_mult_1_l : forall r: CReal, 1 * r == r.
-Proof.
- intros [rn limr]. split.
- - intros [m maj]. simpl in maj.
- destruct (QCauchySeq_bounded (fun _ : nat => 1%Q) Pos.to_nat (ConstCauchy 1)).
- destruct (QCauchySeq_bounded rn Pos.to_nat limr).
- simpl in maj. rewrite Qmult_1_l in maj.
- specialize (limr m).
- apply (Qlt_not_le (2 # m) (1 # m)).
- apply (Qlt_trans _ (rn (Pos.to_nat m) - rn (Pos.to_nat (Pos.max x x0)~0 * Pos.to_nat m)%nat)).
- apply maj.
- apply (Qle_lt_trans _ (Qabs (rn (Pos.to_nat m) - rn (Pos.to_nat (Pos.max x x0)~0 * Pos.to_nat m)%nat))).
- apply Qle_Qabs. apply limr. apply le_refl.
- rewrite <- (mult_1_l (Pos.to_nat m)). rewrite mult_assoc.
- apply Nat.mul_le_mono_nonneg. auto. rewrite mult_1_r.
- apply Pos2Nat.is_pos. apply le_0_n. apply le_refl.
- apply Z.mul_le_mono_nonneg. discriminate. discriminate.
- discriminate. apply Z.le_refl.
- - intros [m maj]. simpl in maj.
- destruct (QCauchySeq_bounded (fun _ : nat => 1%Q) Pos.to_nat (ConstCauchy 1)).
- destruct (QCauchySeq_bounded rn Pos.to_nat limr).
- simpl in maj. rewrite Qmult_1_l in maj.
- specialize (limr m).
- apply (Qlt_not_le (2 # m) (1 # m)).
- apply (Qlt_trans _ (rn (Pos.to_nat (Pos.max x x0)~0 * Pos.to_nat m)%nat - rn (Pos.to_nat m))).
- apply maj.
- apply (Qle_lt_trans _ (Qabs (rn (Pos.to_nat (Pos.max x x0)~0 * Pos.to_nat m)%nat - rn (Pos.to_nat m)))).
- apply Qle_Qabs. apply limr.
- rewrite <- (mult_1_l (Pos.to_nat m)). rewrite mult_assoc.
- apply Nat.mul_le_mono_nonneg. auto. rewrite mult_1_r.
- apply Pos2Nat.is_pos. apply le_0_n. apply le_refl.
- apply le_refl. apply Z.mul_le_mono_nonneg. discriminate. discriminate.
- discriminate. apply Z.le_refl.
-Qed.
-
-Lemma CReal_isRingExt : ring_eq_ext CReal_plus CReal_mult CReal_opp CRealEq.
-Proof.
- split.
- - intros x y H z t H0. apply CReal_plus_morph; assumption.
- - intros x y H z t H0. apply (CRealEq_trans _ (CReal_mult x t)).
- apply CReal_mult_proper_l. apply H0.
- apply (CRealEq_trans _ (CReal_mult t x)). apply CReal_mult_comm.
- apply (CRealEq_trans _ (CReal_mult t y)).
- apply CReal_mult_proper_l. apply H. apply CReal_mult_comm.
- - intros x y H. apply (CReal_plus_eq_reg_l x).
- apply (CRealEq_trans _ (inject_Q 0)). apply CReal_plus_opp_r.
- apply (CRealEq_trans _ (CReal_plus y (CReal_opp y))).
- apply CRealEq_sym. apply CReal_plus_opp_r.
- apply CReal_plus_proper_r. apply CRealEq_sym. apply H.
-Qed.
-
-Lemma CReal_isRing : ring_theory (inject_Q 0) (inject_Q 1)
- CReal_plus CReal_mult
- CReal_minus CReal_opp
- CRealEq.
-Proof.
- intros. split.
- - apply CReal_plus_0_l.
- - apply CReal_plus_comm.
- - intros x y z. symmetry. apply CReal_plus_assoc.
- - apply CReal_mult_1_l.
- - apply CReal_mult_comm.
- - intros x y z. symmetry. apply CReal_mult_assoc.
- - intros x y z. rewrite <- (CReal_mult_comm z).
- rewrite CReal_mult_plus_distr_l.
- apply (CRealEq_trans _ (CReal_plus (CReal_mult x z) (CReal_mult z y))).
- apply CReal_plus_proper_r. apply CReal_mult_comm.
- apply CReal_plus_proper_l. apply CReal_mult_comm.
- - intros x y. apply CRealEq_refl.
- - apply CReal_plus_opp_r.
-Qed.
-
-Add Parametric Morphism : CReal_mult
- with signature CRealEq ==> CRealEq ==> CRealEq
- as CReal_mult_morph.
-Proof.
- apply CReal_isRingExt.
-Qed.
-
-Instance CReal_mult_morph_T
- : CMorphisms.Proper
- (CMorphisms.respectful CRealEq (CMorphisms.respectful CRealEq CRealEq)) CReal_mult.
-Proof.
- apply CReal_isRingExt.
-Qed.
-
-Add Parametric Morphism : CReal_opp
- with signature CRealEq ==> CRealEq
- as CReal_opp_morph.
-Proof.
- apply (Ropp_ext CReal_isRingExt).
-Qed.
-
-Instance CReal_opp_morph_T
- : CMorphisms.Proper
- (CMorphisms.respectful CRealEq CRealEq) CReal_opp.
-Proof.
- apply CReal_isRingExt.
-Qed.
-
-Add Parametric Morphism : CReal_minus
- with signature CRealEq ==> CRealEq ==> CRealEq
- as CReal_minus_morph.
-Proof.
- intros. unfold CReal_minus. rewrite H,H0. reflexivity.
-Qed.
-
-Instance CReal_minus_morph_T
- : CMorphisms.Proper
- (CMorphisms.respectful CRealEq (CMorphisms.respectful CRealEq CRealEq)) CReal_minus.
-Proof.
- intros x y exy z t ezt. unfold CReal_minus. rewrite exy,ezt. reflexivity.
-Qed.
-
-Add Ring CRealRing : CReal_isRing.
-
-(**********)
-Lemma CReal_mult_0_l : forall r, 0 * r == 0.
-Proof.
- intro; ring.
-Qed.
-
-Lemma CReal_mult_0_r : forall r, r * 0 == 0.
-Proof.
- intro; ring.
-Qed.
-
-(**********)
-Lemma CReal_mult_1_r : forall r, r * 1 == r.
-Proof.
- intro; ring.
-Qed.
-
-Lemma CReal_opp_mult_distr_l
- : forall r1 r2 : CReal, - (r1 * r2) == (- r1) * r2.
-Proof.
- intros. ring.
-Qed.
-
-Lemma CReal_opp_mult_distr_r
- : forall r1 r2 : CReal, - (r1 * r2) == r1 * (- r2).
-Proof.
- intros. ring.
-Qed.
-
-Lemma CReal_mult_lt_compat_l : forall x y z : CReal,
- 0 < x -> y < z -> x*y < x*z.
-Proof.
- intros. apply (CReal_plus_lt_reg_l
- (CReal_opp (CReal_mult x y))).
- rewrite CReal_plus_comm. pose proof CReal_plus_opp_r.
- unfold CReal_minus in H1. rewrite H1.
- rewrite CReal_mult_comm, CReal_opp_mult_distr_l, CReal_mult_comm.
- rewrite <- CReal_mult_plus_distr_l.
- apply CReal_mult_lt_0_compat. exact H.
- apply (CReal_plus_lt_reg_l y).
- rewrite CReal_plus_comm, CReal_plus_0_l.
- rewrite <- CReal_plus_assoc, H1, CReal_plus_0_l. exact H0.
-Qed.
-
-Lemma CReal_mult_lt_compat_r : forall x y z : CReal,
- 0 < x -> y < z -> y*x < z*x.
-Proof.
- intros. rewrite <- (CReal_mult_comm x), <- (CReal_mult_comm x).
- apply (CReal_mult_lt_compat_l x); assumption.
-Qed.
-
-Lemma CReal_mult_eq_reg_l : forall (r r1 r2 : CReal),
- r # 0
- -> CRealEq (CReal_mult r r1) (CReal_mult r r2)
- -> CRealEq r1 r2.
-Proof.
- intros. destruct H; split.
- - intro abs. apply (CReal_mult_lt_compat_l (-r)) in abs.
- rewrite <- CReal_opp_mult_distr_l, <- CReal_opp_mult_distr_l, H0 in abs.
- exact (CRealLt_irrefl _ abs). apply (CReal_plus_lt_reg_l r).
- rewrite CReal_plus_opp_r, CReal_plus_comm, CReal_plus_0_l. exact c.
- - intro abs. apply (CReal_mult_lt_compat_l (-r)) in abs.
- rewrite <- CReal_opp_mult_distr_l, <- CReal_opp_mult_distr_l, H0 in abs.
- exact (CRealLt_irrefl _ abs). apply (CReal_plus_lt_reg_l r).
- rewrite CReal_plus_opp_r, CReal_plus_comm, CReal_plus_0_l. exact c.
- - intro abs. apply (CReal_mult_lt_compat_l r) in abs. rewrite H0 in abs.
- exact (CRealLt_irrefl _ abs). exact c.
- - intro abs. apply (CReal_mult_lt_compat_l r) in abs. rewrite H0 in abs.
- exact (CRealLt_irrefl _ abs). exact c.
-Qed.
-
-Lemma CReal_abs_appart_zero : forall (x : CReal) (n : positive),
- Qlt (2#n) (Qabs (proj1_sig x (Pos.to_nat n)))
- -> 0 # x.
-Proof.
- intros. destruct x as [xn xcau]. simpl in H.
- destruct (Qlt_le_dec 0 (xn (Pos.to_nat n))).
- - left. exists n; simpl. rewrite Qabs_pos in H.
- ring_simplify. exact H. apply Qlt_le_weak. exact q.
- - right. exists n; simpl. rewrite Qabs_neg in H.
- unfold Qminus. rewrite Qplus_0_l. exact H. exact q.
-Qed.
-
-
-(*********************************************************)
-(** * Field *)
-(*********************************************************)
-
-Lemma CRealArchimedean
- : forall x:CReal, { n:Z & x < inject_Q (n#1) < x+2 }.
-Proof.
- (* Locate x within 1/4 and pick the first integer above this interval. *)
- intros [xn limx].
- pose proof (Qlt_floor (xn 4%nat + (1#4))). unfold inject_Z in H.
- pose proof (Qfloor_le (xn 4%nat + (1#4))). unfold inject_Z in H0.
- remember (Qfloor (xn 4%nat + (1#4)))%Z as n.
- exists (n+1)%Z. split.
- - assert (Qlt 0 ((n + 1 # 1) - (xn 4%nat + (1 # 4)))) as epsPos.
- { unfold Qminus. rewrite <- Qlt_minus_iff. exact H. }
- destruct (Qarchimedean (/((1#2)*((n + 1 # 1) - (xn 4%nat + (1 # 4)))))) as [k kmaj].
- exists (Pos.max 4 k). simpl.
- apply (Qlt_trans _ ((n + 1 # 1) - (xn 4%nat + (1 # 4)))).
- + setoid_replace (Z.pos k # 1)%Q with (/(1#k))%Q in kmaj. 2: reflexivity.
- rewrite <- Qinv_lt_contravar in kmaj. 2: reflexivity.
- apply (Qle_lt_trans _ (2#k)).
- rewrite <- (Qmult_le_l _ _ (1#2)).
- setoid_replace ((1 # 2) * (2 # k))%Q with (1#k)%Q. 2: reflexivity.
- setoid_replace ((1 # 2) * (2 # Pos.max 4 k))%Q with (1#Pos.max 4 k)%Q. 2: reflexivity.
- unfold Qle; simpl. apply Pos2Z.pos_le_pos. apply Pos.le_max_r.
- reflexivity.
- rewrite <- (Qmult_lt_l _ _ (1#2)).
- setoid_replace ((1 # 2) * (2 # k))%Q with (1#k)%Q. exact kmaj.
- reflexivity. reflexivity. rewrite <- (Qmult_0_r (1#2)).
- rewrite Qmult_lt_l. exact epsPos. reflexivity.
- + rewrite <- (Qplus_lt_r _ _ (xn (Pos.to_nat (Pos.max 4 k)) - (n + 1 # 1) + (1#4))).
- ring_simplify.
- apply (Qle_lt_trans _ (Qabs (xn (Pos.to_nat (Pos.max 4 k)) - xn 4%nat))).
- apply Qle_Qabs. apply limx.
- rewrite Pos2Nat.inj_max. apply Nat.le_max_l. apply le_refl.
- - apply (CReal_plus_lt_reg_l (-(2))). ring_simplify.
- exists 4%positive. simpl.
- rewrite <- Qinv_plus_distr.
- rewrite <- (Qplus_lt_r _ _ ((n#1) - (1#2))). ring_simplify.
- apply (Qle_lt_trans _ (xn 4%nat + (1 # 4)) _ H0).
- unfold Pos.to_nat; simpl.
- rewrite <- (Qplus_lt_r _ _ (-xn 4%nat)). ring_simplify.
- reflexivity.
-Defined.
-
-Definition Rup_pos (x : CReal)
- : { n : positive & x < inject_Q (Z.pos n # 1) }.
-Proof.
- intros. destruct (CRealArchimedean x) as [p [maj _]].
- destruct p.
- - exists 1%positive. apply (CReal_lt_trans _ 0 _ maj). apply CRealLt_0_1.
- - exists p. exact maj.
- - exists 1%positive. apply (CReal_lt_trans _ (inject_Q (Z.neg p # 1)) _ maj).
- apply (CReal_lt_trans _ 0). apply inject_Q_lt. reflexivity.
- apply CRealLt_0_1.
-Qed.
-
-Lemma CRealLtDisjunctEpsilon : forall a b c d : CReal,
- (CRealLtProp a b \/ CRealLtProp c d) -> CRealLt a b + CRealLt c d.
-Proof.
- intros.
- assert (exists n : nat, n <> O /\
- (Qlt (2 # Pos.of_nat n) (proj1_sig b n - proj1_sig a n)
- \/ Qlt (2 # Pos.of_nat n) (proj1_sig d n - proj1_sig c n))).
- { destruct H. destruct H as [n maj]. exists (Pos.to_nat n). split.
- intro abs. destruct (Pos2Nat.is_succ n). rewrite H in abs.
- inversion abs. left. rewrite Pos2Nat.id. apply maj.
- destruct H as [n maj]. exists (Pos.to_nat n). split.
- intro abs. destruct (Pos2Nat.is_succ n). rewrite H in abs.
- inversion abs. right. rewrite Pos2Nat.id. apply maj. }
- apply constructive_indefinite_ground_description_nat in H0.
- - destruct H0 as [n [nPos maj]].
- destruct (Qlt_le_dec (2 # Pos.of_nat n)
- (proj1_sig b n - proj1_sig a n)).
- left. exists (Pos.of_nat n). rewrite Nat2Pos.id. apply q. apply nPos.
- assert (2 # Pos.of_nat n < proj1_sig d n - proj1_sig c n)%Q.
- destruct maj. exfalso.
- apply (Qlt_not_le (2 # Pos.of_nat n) (proj1_sig b n - proj1_sig a n)); assumption.
- assumption. clear maj. right. exists (Pos.of_nat n). rewrite Nat2Pos.id.
- apply H0. apply nPos.
- - clear H0. clear H. intro n. destruct n. right.
- intros [abs _]. exact (abs (eq_refl O)).
- destruct (Qlt_le_dec (2 # Pos.of_nat (S n)) (proj1_sig b (S n) - proj1_sig a (S n))).
- left. split. discriminate. left. apply q.
- destruct (Qlt_le_dec (2 # Pos.of_nat (S n)) (proj1_sig d (S n) - proj1_sig c (S n))).
- left. split. discriminate. right. apply q0.
- right. intros [_ [abs|abs]].
- apply (Qlt_not_le (2 # Pos.of_nat (S n))
- (proj1_sig b (S n) - proj1_sig a (S n))); assumption.
- apply (Qlt_not_le (2 # Pos.of_nat (S n))
- (proj1_sig d (S n) - proj1_sig c (S n))); assumption.
-Qed.
-
-Lemma CRealShiftReal : forall (x : CReal) (k : nat),
- QCauchySeq (fun n => proj1_sig x (plus n k)) Pos.to_nat.
-Proof.
- intros x k n p q H H0.
- destruct x as [xn cau]; unfold proj1_sig.
- destruct k. rewrite plus_0_r. rewrite plus_0_r. apply cau; assumption.
- specialize (cau (n + Pos.of_nat (S k))%positive (p + S k)%nat (q + S k)%nat).
- apply (Qlt_trans _ (1 # n + Pos.of_nat (S k))).
- apply cau. rewrite Pos2Nat.inj_add. rewrite Nat2Pos.id.
- apply Nat.add_le_mono_r. apply H. discriminate.
- rewrite Pos2Nat.inj_add. rewrite Nat2Pos.id.
- apply Nat.add_le_mono_r. apply H0. discriminate.
- apply Pos2Nat.inj_lt; simpl. rewrite Pos2Nat.inj_add.
- rewrite <- (plus_0_r (Pos.to_nat n)). rewrite <- plus_assoc.
- apply Nat.add_lt_mono_l. apply Pos2Nat.is_pos.
-Qed.
-
-Lemma CRealShiftEqual : forall (x : CReal) (k : nat),
- CRealEq x (exist _ (fun n => proj1_sig x (plus n k)) (CRealShiftReal x k)).
-Proof.
- intros. split.
- - intros [n maj]. destruct x as [xn cau]; simpl in maj.
- specialize (cau n (Pos.to_nat n + k)%nat (Pos.to_nat n)).
- apply Qlt_not_le in maj. apply maj. clear maj.
- apply (Qle_trans _ (Qabs (xn (Pos.to_nat n + k)%nat - xn (Pos.to_nat n)))).
- apply Qle_Qabs. apply (Qle_trans _ (1#n)). apply Zlt_le_weak.
- apply cau. rewrite <- (plus_0_r (Pos.to_nat n)).
- rewrite <- plus_assoc. apply Nat.add_le_mono_l. apply le_0_n.
- apply le_refl. apply Z.mul_le_mono_pos_r. apply Pos2Z.is_pos.
- discriminate.
- - intros [n maj]. destruct x as [xn cau]; simpl in maj.
- specialize (cau n (Pos.to_nat n) (Pos.to_nat n + k)%nat).
- apply Qlt_not_le in maj. apply maj. clear maj.
- apply (Qle_trans _ (Qabs (xn (Pos.to_nat n) - xn (Pos.to_nat n + k)%nat))).
- apply Qle_Qabs. apply (Qle_trans _ (1#n)). apply Zlt_le_weak.
- apply cau. apply le_refl. rewrite <- (plus_0_r (Pos.to_nat n)).
- rewrite <- plus_assoc. apply Nat.add_le_mono_l. apply le_0_n.
- apply Z.mul_le_mono_pos_r. apply Pos2Z.is_pos. discriminate.
-Qed.
-
-(* Find an equal negative real number, which rational sequence
- stays below 0, so that it can be inversed. *)
-Definition CRealNegShift (x : CReal)
- : CRealLt x (inject_Q 0)
- -> { y : prod positive CReal | CRealEq x (snd y)
- /\ forall n:nat, Qlt (proj1_sig (snd y) n) (-1 # fst y) }.
-Proof.
- intro xNeg.
- pose proof (CRealLt_aboveSig x (inject_Q 0)).
- pose proof (CRealShiftReal x).
- pose proof (CRealShiftEqual x).
- destruct xNeg as [n maj], x as [xn cau]; simpl in maj.
- specialize (H n maj); simpl in H.
- destruct (Qarchimedean (/ (0 - xn (Pos.to_nat n) - (2 # n)))) as [a _].
- remember (Pos.max n a~0) as k.
- clear Heqk. clear maj. clear n.
- exists (pair k
- (exist _ (fun n => xn (plus n (Pos.to_nat k))) (H0 (Pos.to_nat k)))).
- split. apply H1. intro n. simpl. apply Qlt_minus_iff.
- destruct n.
- - specialize (H k).
- unfold Qminus in H. rewrite Qplus_0_l in H. apply Qlt_minus_iff in H.
- unfold Qminus. rewrite Qplus_comm.
- apply (Qlt_trans _ (- xn (Pos.to_nat k)%nat - (2 #k))). apply H.
- unfold Qminus. simpl. apply Qplus_lt_r.
- apply Z.mul_lt_mono_pos_r. simpl. apply Pos2Z.is_pos.
- reflexivity. apply Pos.le_refl.
- - apply (Qlt_trans _ (-(2 # k) - xn (S n + Pos.to_nat k)%nat)).
- rewrite <- (Nat2Pos.id (S n)). rewrite <- Pos2Nat.inj_add.
- specialize (H (Pos.of_nat (S n) + k)%positive).
- unfold Qminus in H. rewrite Qplus_0_l in H. apply Qlt_minus_iff in H.
- unfold Qminus. rewrite Qplus_comm. apply H. apply Pos2Nat.inj_le.
- rewrite <- (plus_0_l (Pos.to_nat k)). rewrite Pos2Nat.inj_add.
- apply Nat.add_le_mono_r. apply le_0_n. discriminate.
- apply Qplus_lt_l.
- apply Z.mul_lt_mono_pos_r. simpl. apply Pos2Z.is_pos.
- reflexivity.
-Qed.
-
-Definition CRealPosShift (x : CReal)
- : inject_Q 0 < x
- -> { y : prod positive CReal | CRealEq x (snd y)
- /\ forall n:nat, Qlt (1 # fst y) (proj1_sig (snd y) n) }.
-Proof.
- intro xPos.
- pose proof (CRealLt_aboveSig (inject_Q 0) x).
- pose proof (CRealShiftReal x).
- pose proof (CRealShiftEqual x).
- destruct xPos as [n maj], x as [xn cau]; simpl in maj.
- simpl in H. specialize (H n).
- destruct (Qarchimedean (/ (xn (Pos.to_nat n) - 0 - (2 # n)))) as [a _].
- specialize (H maj); simpl in H.
- remember (Pos.max n a~0) as k.
- clear Heqk. clear maj. clear n.
- exists (pair k
- (exist _ (fun n => xn (plus n (Pos.to_nat k))) (H0 (Pos.to_nat k)))).
- split. apply H1. intro n. simpl. apply Qlt_minus_iff.
- destruct n.
- - specialize (H k).
- unfold Qminus in H. rewrite Qplus_0_r in H.
- simpl. rewrite <- Qlt_minus_iff.
- apply (Qlt_trans _ (2 #k)).
- apply Z.mul_lt_mono_pos_r. simpl. apply Pos2Z.is_pos.
- reflexivity. apply H. apply Pos.le_refl.
- - rewrite <- Qlt_minus_iff. apply (Qlt_trans _ (2 # k)).
- apply Z.mul_lt_mono_pos_r. simpl. apply Pos2Z.is_pos.
- reflexivity. specialize (H (Pos.of_nat (S n) + k)%positive).
- unfold Qminus in H. rewrite Qplus_0_r in H.
- rewrite Pos2Nat.inj_add in H. rewrite Nat2Pos.id in H.
- apply H. apply Pos2Nat.inj_le.
- rewrite <- (plus_0_l (Pos.to_nat k)). rewrite Pos2Nat.inj_add.
- apply Nat.add_le_mono_r. apply le_0_n. discriminate.
-Qed.
-
-Lemma CReal_inv_neg : forall (yn : nat -> Q) (k : positive),
- (QCauchySeq yn Pos.to_nat)
- -> (forall n : nat, yn n < -1 # k)%Q
- -> QCauchySeq (fun n : nat => / yn (Pos.to_nat k ^ 2 * n)%nat) Pos.to_nat.
-Proof.
- (* Prove the inverse sequence is Cauchy *)
- intros yn k cau maj n p q H0 H1.
- setoid_replace (/ yn (Pos.to_nat k ^ 2 * p)%nat -
- / yn (Pos.to_nat k ^ 2 * q)%nat)%Q
- with ((yn (Pos.to_nat k ^ 2 * q)%nat -
- yn (Pos.to_nat k ^ 2 * p)%nat)
- / (yn (Pos.to_nat k ^ 2 * q)%nat *
- yn (Pos.to_nat k ^ 2 * p)%nat)).
- + apply (Qle_lt_trans _ (Qabs (yn (Pos.to_nat k ^ 2 * q)%nat
- - yn (Pos.to_nat k ^ 2 * p)%nat)
- / (1 # (k^2)))).
- assert (1 # k ^ 2
- < Qabs (yn (Pos.to_nat k ^ 2 * q)%nat * yn (Pos.to_nat k ^ 2 * p)%nat))%Q.
- { rewrite Qabs_Qmult. unfold "^"%positive; simpl.
- rewrite factorDenom. rewrite Pos.mul_1_r.
- apply (Qlt_trans _ ((1#k) * Qabs (yn (Pos.to_nat k * (Pos.to_nat k * 1) * p)%nat))).
- apply Qmult_lt_l. reflexivity. rewrite Qabs_neg.
- specialize (maj (Pos.to_nat k * (Pos.to_nat k * 1) * p)%nat).
- apply Qlt_minus_iff in maj. apply Qlt_minus_iff.
- rewrite Qplus_comm. setoid_replace (-(1#k))%Q with (-1 # k)%Q. apply maj.
- reflexivity. apply (Qle_trans _ (-1 # k)). apply Zlt_le_weak.
- apply maj. discriminate.
- apply Qmult_lt_r. apply (Qlt_trans 0 (1#k)). reflexivity.
- rewrite Qabs_neg.
- specialize (maj (Pos.to_nat k * (Pos.to_nat k * 1) * p)%nat).
- apply Qlt_minus_iff in maj. apply Qlt_minus_iff.
- rewrite Qplus_comm. setoid_replace (-(1#k))%Q with (-1 # k)%Q. apply maj.
- reflexivity. apply (Qle_trans _ (-1 # k)). apply Zlt_le_weak.
- apply maj. discriminate.
- rewrite Qabs_neg.
- specialize (maj (Pos.to_nat k * (Pos.to_nat k * 1) * q)%nat).
- apply Qlt_minus_iff in maj. apply Qlt_minus_iff.
- rewrite Qplus_comm. setoid_replace (-(1#k))%Q with (-1 # k)%Q. apply maj.
- reflexivity. apply (Qle_trans _ (-1 # k)). apply Zlt_le_weak.
- apply maj. discriminate. }
- unfold Qdiv. rewrite Qabs_Qmult. rewrite Qabs_Qinv.
- rewrite Qmult_comm. rewrite <- (Qmult_comm (/ (1 # k ^ 2))).
- apply Qmult_le_compat_r. apply Qlt_le_weak.
- rewrite <- Qmult_1_l. apply Qlt_shift_div_r.
- apply (Qlt_trans 0 (1 # k ^ 2)). reflexivity. apply H.
- rewrite Qmult_comm. apply Qlt_shift_div_l.
- reflexivity. rewrite Qmult_1_l. apply H.
- apply Qabs_nonneg. simpl in maj.
- specialize (cau (n * (k^2))%positive
- (Pos.to_nat k ^ 2 * q)%nat
- (Pos.to_nat k ^ 2 * p)%nat).
- apply Qlt_shift_div_r. reflexivity.
- apply (Qlt_le_trans _ (1 # n * k ^ 2)). apply cau.
- rewrite Pos2Nat.inj_mul. rewrite mult_comm.
- unfold "^"%positive. simpl. rewrite Pos2Nat.inj_mul.
- rewrite <- mult_assoc. rewrite <- mult_assoc.
- apply Nat.mul_le_mono_nonneg_l. apply le_0_n.
- rewrite (mult_1_r). rewrite Pos.mul_1_r.
- apply Nat.mul_le_mono_nonneg_l. apply le_0_n.
- apply (le_trans _ (q+0)). rewrite plus_0_r. assumption.
- rewrite plus_0_r. apply le_refl.
- rewrite Pos2Nat.inj_mul. rewrite mult_comm.
- unfold "^"%positive; simpl. rewrite Pos2Nat.inj_mul.
- rewrite <- mult_assoc. rewrite <- mult_assoc.
- apply Nat.mul_le_mono_nonneg_l. apply le_0_n.
- rewrite (mult_1_r). rewrite Pos.mul_1_r.
- apply Nat.mul_le_mono_nonneg_l. apply le_0_n.
- apply (le_trans _ (p+0)). rewrite plus_0_r. assumption.
- rewrite plus_0_r. apply le_refl.
- rewrite factorDenom. apply Qle_refl.
- + field. split. intro abs.
- specialize (maj (Pos.to_nat k ^ 2 * p)%nat).
- rewrite abs in maj. inversion maj.
- intro abs.
- specialize (maj (Pos.to_nat k ^ 2 * q)%nat).
- rewrite abs in maj. inversion maj.
-Qed.
-
-Lemma CReal_inv_pos : forall (yn : nat -> Q) (k : positive),
- (QCauchySeq yn Pos.to_nat)
- -> (forall n : nat, 1 # k < yn n)%Q
- -> QCauchySeq (fun n : nat => / yn (Pos.to_nat k ^ 2 * n)%nat) Pos.to_nat.
-Proof.
- intros yn k cau maj n p q H0 H1.
- setoid_replace (/ yn (Pos.to_nat k ^ 2 * p)%nat -
- / yn (Pos.to_nat k ^ 2 * q)%nat)%Q
- with ((yn (Pos.to_nat k ^ 2 * q)%nat -
- yn (Pos.to_nat k ^ 2 * p)%nat)
- / (yn (Pos.to_nat k ^ 2 * q)%nat *
- yn (Pos.to_nat k ^ 2 * p)%nat)).
- + apply (Qle_lt_trans _ (Qabs (yn (Pos.to_nat k ^ 2 * q)%nat
- - yn (Pos.to_nat k ^ 2 * p)%nat)
- / (1 # (k^2)))).
- assert (1 # k ^ 2
- < Qabs (yn (Pos.to_nat k ^ 2 * q)%nat * yn (Pos.to_nat k ^ 2 * p)%nat))%Q.
- { rewrite Qabs_Qmult. unfold "^"%positive; simpl.
- rewrite factorDenom. rewrite Pos.mul_1_r.
- apply (Qlt_trans _ ((1#k) * Qabs (yn (Pos.to_nat k * (Pos.to_nat k * 1) * p)%nat))).
- apply Qmult_lt_l. reflexivity. rewrite Qabs_pos.
- specialize (maj (Pos.to_nat k * (Pos.to_nat k * 1) * p)%nat).
- apply maj. apply (Qle_trans _ (1 # k)).
- discriminate. apply Zlt_le_weak. apply maj.
- apply Qmult_lt_r. apply (Qlt_trans 0 (1#k)). reflexivity.
- rewrite Qabs_pos.
- specialize (maj (Pos.to_nat k * (Pos.to_nat k * 1) * p)%nat).
- apply maj. apply (Qle_trans _ (1 # k)). discriminate.
- apply Zlt_le_weak. apply maj.
- rewrite Qabs_pos.
- specialize (maj (Pos.to_nat k * (Pos.to_nat k * 1) * q)%nat).
- apply maj. apply (Qle_trans _ (1 # k)). discriminate.
- apply Zlt_le_weak. apply maj. }
- unfold Qdiv. rewrite Qabs_Qmult. rewrite Qabs_Qinv.
- rewrite Qmult_comm. rewrite <- (Qmult_comm (/ (1 # k ^ 2))).
- apply Qmult_le_compat_r. apply Qlt_le_weak.
- rewrite <- Qmult_1_l. apply Qlt_shift_div_r.
- apply (Qlt_trans 0 (1 # k ^ 2)). reflexivity. apply H.
- rewrite Qmult_comm. apply Qlt_shift_div_l.
- reflexivity. rewrite Qmult_1_l. apply H.
- apply Qabs_nonneg. simpl in maj.
- specialize (cau (n * (k^2))%positive
- (Pos.to_nat k ^ 2 * q)%nat
- (Pos.to_nat k ^ 2 * p)%nat).
- apply Qlt_shift_div_r. reflexivity.
- apply (Qlt_le_trans _ (1 # n * k ^ 2)). apply cau.
- rewrite Pos2Nat.inj_mul. rewrite mult_comm.
- unfold "^"%positive. simpl. rewrite Pos2Nat.inj_mul.
- rewrite <- mult_assoc. rewrite <- mult_assoc.
- apply Nat.mul_le_mono_nonneg_l. apply le_0_n.
- rewrite (mult_1_r). rewrite Pos.mul_1_r.
- apply Nat.mul_le_mono_nonneg_l. apply le_0_n.
- apply (le_trans _ (q+0)). rewrite plus_0_r. assumption.
- rewrite plus_0_r. apply le_refl.
- rewrite Pos2Nat.inj_mul. rewrite mult_comm.
- unfold "^"%positive; simpl. rewrite Pos2Nat.inj_mul.
- rewrite <- mult_assoc. rewrite <- mult_assoc.
- apply Nat.mul_le_mono_nonneg_l. apply le_0_n.
- rewrite (mult_1_r). rewrite Pos.mul_1_r.
- apply Nat.mul_le_mono_nonneg_l. apply le_0_n.
- apply (le_trans _ (p+0)). rewrite plus_0_r. assumption.
- rewrite plus_0_r. apply le_refl.
- rewrite factorDenom. apply Qle_refl.
- + field. split. intro abs.
- specialize (maj (Pos.to_nat k ^ 2 * p)%nat).
- rewrite abs in maj. inversion maj.
- intro abs.
- specialize (maj (Pos.to_nat k ^ 2 * q)%nat).
- rewrite abs in maj. inversion maj.
-Qed.
-
-Definition CReal_inv (x : CReal) (xnz : x # 0) : CReal.
-Proof.
- destruct xnz as [xNeg | xPos].
- - destruct (CRealNegShift x xNeg) as [[k y] [_ maj]].
- destruct y as [yn cau]; unfold proj1_sig, snd, fst in maj.
- exists (fun n => Qinv (yn (mult (Pos.to_nat k^2) n))).
- apply (CReal_inv_neg yn). apply cau. apply maj.
- - destruct (CRealPosShift x xPos) as [[k y] [_ maj]].
- destruct y as [yn cau]; unfold proj1_sig, snd, fst in maj.
- exists (fun n => Qinv (yn (mult (Pos.to_nat k^2) n))).
- apply (CReal_inv_pos yn). apply cau. apply maj.
-Defined.
-
-Notation "/ x" := (CReal_inv x) (at level 35, right associativity) : CReal_scope.
-
-Lemma CReal_inv_0_lt_compat
- : forall (r : CReal) (rnz : r # 0),
- 0 < r -> 0 < ((/ r) rnz).
-Proof.
- intros. unfold CReal_inv. simpl.
- destruct rnz.
- - exfalso. apply CRealLt_asym in H. contradiction.
- - destruct (CRealPosShift r c) as [[k rpos] [req maj]].
- clear req. destruct rpos as [rn cau]; simpl in maj.
- unfold CRealLt; simpl.
- destruct (Qarchimedean (rn 1%nat)) as [A majA].
- exists (2 * (A + 1))%positive. unfold Qminus. rewrite Qplus_0_r.
- rewrite <- (Qmult_1_l (Qinv (rn (Pos.to_nat k * (Pos.to_nat k * 1) * Pos.to_nat (2 * (A + 1)))%nat))).
- apply Qlt_shift_div_l. apply (Qlt_trans 0 (1#k)). reflexivity.
- apply maj. rewrite <- (Qmult_inv_r (Z.pos A + 1 # 1)).
- setoid_replace (2 # 2 * (A + 1))%Q with (Qinv (Z.pos A + 1 # 1)).
- 2: reflexivity.
- rewrite Qmult_comm. apply Qmult_lt_r. reflexivity.
- rewrite mult_1_r. rewrite <- Pos2Nat.inj_mul. rewrite <- Pos2Nat.inj_mul.
- rewrite <- (Qplus_lt_l _ _ (- rn 1%nat)).
- apply (Qle_lt_trans _ (Qabs (rn (Pos.to_nat (k * k * (2 * (A + 1)))) + - rn 1%nat))).
- apply Qle_Qabs. apply (Qlt_le_trans _ 1). apply cau.
- apply Pos2Nat.is_pos. apply le_refl.
- rewrite <- Qinv_plus_distr. rewrite <- (Qplus_comm 1).
- rewrite <- Qplus_0_r. rewrite <- Qplus_assoc. rewrite <- Qplus_assoc.
- rewrite Qplus_le_r. rewrite Qplus_0_l. apply Qlt_le_weak.
- apply Qlt_minus_iff in majA. apply majA.
- intro abs. inversion abs.
-Qed.
-
-Lemma CReal_linear_shift : forall (x : CReal) (k : nat),
- le 1 k -> QCauchySeq (fun n => proj1_sig x (k * n)%nat) Pos.to_nat.
-Proof.
- intros [xn limx] k lek p n m H H0. unfold proj1_sig.
- apply limx. apply (le_trans _ n). apply H.
- rewrite <- (mult_1_l n). rewrite mult_assoc.
- apply Nat.mul_le_mono_nonneg_r. apply le_0_n.
- rewrite mult_1_r. apply lek. apply (le_trans _ m). apply H0.
- rewrite <- (mult_1_l m). rewrite mult_assoc.
- apply Nat.mul_le_mono_nonneg_r. apply le_0_n.
- rewrite mult_1_r. apply lek.
-Qed.
-
-Lemma CReal_linear_shift_eq : forall (x : CReal) (k : nat) (kPos : le 1 k),
- CRealEq x
- (exist (fun n : nat -> Q => QCauchySeq n Pos.to_nat)
- (fun n : nat => proj1_sig x (k * n)%nat) (CReal_linear_shift x k kPos)).
-Proof.
- intros. apply CRealEq_diff. intro n.
- destruct x as [xn limx]; unfold proj1_sig.
- specialize (limx n (Pos.to_nat n) (k * Pos.to_nat n)%nat).
- apply (Qle_trans _ (1 # n)). apply Qlt_le_weak. apply limx.
- apply le_refl. rewrite <- (mult_1_l (Pos.to_nat n)).
- rewrite mult_assoc. apply Nat.mul_le_mono_nonneg_r. apply le_0_n.
- rewrite mult_1_r. apply kPos. apply Z.mul_le_mono_nonneg_r.
- discriminate. discriminate.
-Qed.
-
-Lemma CReal_inv_l : forall (r:CReal) (rnz : r # 0),
- ((/ r) rnz) * r == 1.
-Proof.
- intros. unfold CReal_inv; simpl.
- destruct rnz.
- - (* r < 0 *) destruct (CRealNegShift r c) as [[k rneg] [req maj]].
- simpl in req. apply CRealEq_diff. apply CRealEq_modindep.
- apply (QSeqEquivEx_trans _
- (proj1_sig (CReal_mult ((let
- (yn, cau) as s
- return ((forall n : nat, proj1_sig s n < -1 # k) -> CReal) := rneg in
- fun maj0 : forall n : nat, yn n < -1 # k =>
- exist (fun x : nat -> Q => QCauchySeq x Pos.to_nat)
- (fun n : nat => Qinv (yn (Pos.to_nat k * (Pos.to_nat k * 1) * n))%nat)
- (CReal_inv_neg yn k cau maj0)) maj) rneg)))%Q.
- + apply CRealEq_modindep. apply CRealEq_diff.
- apply CReal_mult_proper_l. apply req.
- + assert (le 1 (Pos.to_nat k * (Pos.to_nat k * 1))%nat). rewrite mult_1_r.
- rewrite <- Pos2Nat.inj_mul. apply Pos2Nat.is_pos.
- apply (QSeqEquivEx_trans _
- (proj1_sig (CReal_mult ((let
- (yn, cau) as s
- return ((forall n : nat, proj1_sig s n < -1 # k) -> CReal) := rneg in
- fun maj0 : forall n : nat, yn n < -1 # k =>
- exist (fun x : nat -> Q => QCauchySeq x Pos.to_nat)
- (fun n : nat => Qinv (yn (Pos.to_nat k * (Pos.to_nat k * 1) * n)%nat))
- (CReal_inv_neg yn k cau maj0)) maj)
- (exist _ (fun n => proj1_sig rneg (Pos.to_nat k * (Pos.to_nat k * 1) * n)%nat) (CReal_linear_shift rneg _ H)))))%Q.
- apply CRealEq_modindep. apply CRealEq_diff.
- apply CReal_mult_proper_l. apply CReal_linear_shift_eq.
- destruct r as [rn limr], rneg as [rnn limneg]; simpl.
- destruct (QCauchySeq_bounded
- (fun n : nat => Qinv (rnn (Pos.to_nat k * (Pos.to_nat k * 1) * n)%nat))
- Pos.to_nat (CReal_inv_neg rnn k limneg maj)).
- destruct (QCauchySeq_bounded
- (fun n : nat => rnn (Pos.to_nat k * (Pos.to_nat k * 1) * n)%nat)
- Pos.to_nat
- (CReal_linear_shift
- (exist (fun x0 : nat -> Q => QCauchySeq x0 Pos.to_nat) rnn limneg)
- (Pos.to_nat k * (Pos.to_nat k * 1)) H)) ; simpl.
- exists (fun n => 1%nat). intros p n m H0 H1. rewrite Qmult_comm.
- rewrite Qmult_inv_r. unfold Qminus. rewrite Qplus_opp_r.
- reflexivity. intro abs.
- specialize (maj (Pos.to_nat k * (Pos.to_nat k * 1)
- * (Pos.to_nat (Pos.max x x0)~0 * n))%nat).
- simpl in maj. rewrite abs in maj. inversion maj.
- - (* r > 0 *) destruct (CRealPosShift r c) as [[k rneg] [req maj]].
- simpl in req. apply CRealEq_diff. apply CRealEq_modindep.
- apply (QSeqEquivEx_trans _
- (proj1_sig (CReal_mult ((let
- (yn, cau) as s
- return ((forall n : nat, 1 # k < proj1_sig s n) -> CReal) := rneg in
- fun maj0 : forall n : nat, 1 # k < yn n =>
- exist (fun x : nat -> Q => QCauchySeq x Pos.to_nat)
- (fun n : nat => Qinv (yn (Pos.to_nat k * (Pos.to_nat k * 1) * n)%nat))
- (CReal_inv_pos yn k cau maj0)) maj) rneg)))%Q.
- + apply CRealEq_modindep. apply CRealEq_diff.
- apply CReal_mult_proper_l. apply req.
- + assert (le 1 (Pos.to_nat k * (Pos.to_nat k * 1))%nat). rewrite mult_1_r.
- rewrite <- Pos2Nat.inj_mul. apply Pos2Nat.is_pos.
- apply (QSeqEquivEx_trans _
- (proj1_sig (CReal_mult ((let
- (yn, cau) as s
- return ((forall n : nat, 1 # k < proj1_sig s n) -> CReal) := rneg in
- fun maj0 : forall n : nat, 1 # k < yn n =>
- exist (fun x : nat -> Q => QCauchySeq x Pos.to_nat)
- (fun n : nat => Qinv (yn (Pos.to_nat k * (Pos.to_nat k * 1) * n)%nat))
- (CReal_inv_pos yn k cau maj0)) maj)
- (exist _ (fun n => proj1_sig rneg (Pos.to_nat k * (Pos.to_nat k * 1) * n)%nat) (CReal_linear_shift rneg _ H)))))%Q.
- apply CRealEq_modindep. apply CRealEq_diff.
- apply CReal_mult_proper_l. apply CReal_linear_shift_eq.
- destruct r as [rn limr], rneg as [rnn limneg]; simpl.
- destruct (QCauchySeq_bounded
- (fun n : nat => Qinv (rnn (Pos.to_nat k * (Pos.to_nat k * 1) * n)%nat))
- Pos.to_nat (CReal_inv_pos rnn k limneg maj)).
- destruct (QCauchySeq_bounded
- (fun n : nat => rnn (Pos.to_nat k * (Pos.to_nat k * 1) * n)%nat)
- Pos.to_nat
- (CReal_linear_shift
- (exist (fun x0 : nat -> Q => QCauchySeq x0 Pos.to_nat) rnn limneg)
- (Pos.to_nat k * (Pos.to_nat k * 1)) H)) ; simpl.
- exists (fun n => 1%nat). intros p n m H0 H1. rewrite Qmult_comm.
- rewrite Qmult_inv_r. unfold Qminus. rewrite Qplus_opp_r.
- reflexivity. intro abs.
- specialize (maj (Pos.to_nat k * (Pos.to_nat k * 1)
- * (Pos.to_nat (Pos.max x x0)~0 * n))%nat).
- simpl in maj. rewrite abs in maj. inversion maj.
-Qed.
-
-Lemma CReal_inv_r : forall (r:CReal) (rnz : r # 0),
- r * ((/ r) rnz) == 1.
-Proof.
- intros. rewrite CReal_mult_comm, CReal_inv_l.
- reflexivity.
-Qed.
-
-Lemma CReal_inv_1 : forall nz : 1 # 0, (/ 1) nz == 1.
-Proof.
- intros. rewrite <- (CReal_mult_1_l ((/1) nz)). rewrite CReal_inv_r.
- reflexivity.
-Qed.
-
-Lemma CReal_inv_mult_distr :
- forall r1 r2 (r1nz : r1 # 0) (r2nz : r2 # 0) (rmnz : (r1*r2) # 0),
- (/ (r1 * r2)) rmnz == (/ r1) r1nz * (/ r2) r2nz.
-Proof.
- intros. apply (CReal_mult_eq_reg_l r1). exact r1nz.
- rewrite <- CReal_mult_assoc. rewrite CReal_inv_r. rewrite CReal_mult_1_l.
- apply (CReal_mult_eq_reg_l r2). exact r2nz.
- rewrite CReal_inv_r. rewrite <- CReal_mult_assoc.
- rewrite (CReal_mult_comm r2 r1). rewrite CReal_inv_r.
- reflexivity.
-Qed.
-
-Lemma Rinv_eq_compat : forall x y (rxnz : x # 0) (rynz : y # 0),
- x == y
- -> (/ x) rxnz == (/ y) rynz.
-Proof.
- intros. apply (CReal_mult_eq_reg_l x). exact rxnz.
- rewrite CReal_inv_r, H, CReal_inv_r. reflexivity.
-Qed.
-
-Lemma CReal_mult_lt_reg_l : forall r r1 r2, 0 < r -> r * r1 < r * r2 -> r1 < r2.
-Proof.
- intros z x y H H0.
- apply (CReal_mult_lt_compat_l ((/z) (inr H))) in H0.
- repeat rewrite <- CReal_mult_assoc in H0. rewrite CReal_inv_l in H0.
- repeat rewrite CReal_mult_1_l in H0. apply H0.
- apply CReal_inv_0_lt_compat. exact H.
-Qed.
-
-Lemma CReal_mult_lt_reg_r : forall r r1 r2, 0 < r -> r1 * r < r2 * r -> r1 < r2.
-Proof.
- intros.
- apply CReal_mult_lt_reg_l with r.
- exact H.
- now rewrite 2!(CReal_mult_comm r).
-Qed.
-
-Lemma CReal_mult_eq_reg_r : forall r r1 r2, r1 * r == r2 * r -> r # 0 -> r1 == r2.
-Proof.
- intros. apply (CReal_mult_eq_reg_l r). exact H0.
- now rewrite 2!(CReal_mult_comm r).
-Qed.
-
-Lemma CReal_mult_eq_compat_l : forall r r1 r2, r1 == r2 -> r * r1 == r * r2.
-Proof.
- intros. rewrite H. reflexivity.
-Qed.
-
-Lemma CReal_mult_eq_compat_r : forall r r1 r2, r1 == r2 -> r1 * r == r2 * r.
-Proof.
- intros. rewrite H. reflexivity.
-Qed.
-
-(* In particular x * y == 1 implies that 0 # x, 0 # y and
- that x and y are inverses of each other. *)
-Lemma CReal_mult_pos_appart_zero : forall x y : CReal, 0 < x * y -> 0 # x.
-Proof.
- intros. destruct (linear_order_T 0 x 1 (CRealLt_0_1)).
- left. exact c. destruct (linear_order_T (CReal_opp 1) x 0).
- rewrite <- CReal_opp_0. apply CReal_opp_gt_lt_contravar, CRealLt_0_1.
- 2: right; exact c0.
- pose proof (CRealLt_above _ _ H). destruct H0 as [k kmaj].
- simpl in kmaj.
- apply CRealLt_above in c. destruct c as [i imaj]. simpl in imaj.
- apply CRealLt_above in c0. destruct c0 as [j jmaj]. simpl in jmaj.
- pose proof (CReal_abs_appart_zero y).
- destruct x as [xn xcau], y as [yn ycau]. simpl in kmaj.
- destruct (QCauchySeq_bounded xn Pos.to_nat xcau) as [a amaj],
- (QCauchySeq_bounded yn Pos.to_nat ycau) as [b bmaj]; simpl in kmaj.
- clear amaj bmaj. simpl in imaj, jmaj. simpl in H0.
- specialize (kmaj (Pos.max k (Pos.max i j)) (Pos.le_max_l _ _)).
- destruct (H0 ((Pos.max a b)~0 * (Pos.max k (Pos.max i j)))%positive).
- - apply (Qlt_trans _ (2#k)).
- + unfold Qlt. rewrite <- Z.mul_lt_mono_pos_l. 2: reflexivity.
- unfold Qden. apply Pos2Z.pos_lt_pos.
- apply (Pos.le_lt_trans _ (1 * Pos.max k (Pos.max i j))).
- rewrite Pos.mul_1_l. apply Pos.le_max_l.
- apply Pos2Nat.inj_lt. do 2 rewrite Pos2Nat.inj_mul.
- rewrite <- Nat.mul_lt_mono_pos_r. 2: apply Pos2Nat.is_pos.
- fold (2*Pos.max a b)%positive. rewrite Pos2Nat.inj_mul.
- apply Nat.lt_1_mul_pos. auto. apply Pos2Nat.is_pos.
- + apply (Qlt_le_trans _ _ _ kmaj). unfold Qminus. rewrite Qplus_0_r.
- rewrite <- (Qmult_1_l (Qabs (yn (Pos.to_nat ((Pos.max a b)~0 * Pos.max k (Pos.max i j)))))).
- apply (Qle_trans _ _ _ (Qle_Qabs _)). rewrite Qabs_Qmult.
- replace (Pos.to_nat (Pos.max a b)~0 * Pos.to_nat (Pos.max k (Pos.max i j)))%nat
- with (Pos.to_nat ((Pos.max a b)~0 * Pos.max k (Pos.max i j))).
- 2: apply Pos2Nat.inj_mul.
- apply Qmult_le_compat_r. 2: apply Qabs_nonneg.
- apply Qabs_Qle_condition. split.
- apply Qlt_le_weak. apply Qlt_minus_iff, (Qlt_trans _ (2#j)).
- reflexivity. apply jmaj.
- apply (Pos.le_trans _ (1 * Pos.max k (Pos.max i j))).
- rewrite Pos.mul_1_l.
- apply (Pos.le_trans _ (Pos.max i j) _ (Pos.le_max_r _ _)).
- apply Pos.le_max_r.
- apply Pos2Nat.inj_le. do 2 rewrite Pos2Nat.inj_mul.
- rewrite <- Nat.mul_le_mono_pos_r. 2: apply Pos2Nat.is_pos.
- apply Pos2Nat.is_pos.
- apply Qlt_le_weak. apply Qlt_minus_iff, (Qlt_trans _ (2#i)).
- reflexivity. apply imaj.
- apply (Pos.le_trans _ (1 * Pos.max k (Pos.max i j))).
- rewrite Pos.mul_1_l.
- apply (Pos.le_trans _ (Pos.max i j) _ (Pos.le_max_l _ _)).
- apply Pos.le_max_r.
- apply Pos2Nat.inj_le. do 2 rewrite Pos2Nat.inj_mul.
- rewrite <- Nat.mul_le_mono_pos_r. 2: apply Pos2Nat.is_pos.
- apply Pos2Nat.is_pos.
- - left. apply (CReal_mult_lt_reg_r (exist _ yn ycau) _ _ c).
- rewrite CReal_mult_0_l. exact H.
- - right. apply (CReal_mult_lt_reg_r (CReal_opp (exist _ yn ycau))).
- rewrite <- CReal_opp_0. apply CReal_opp_gt_lt_contravar. exact c.
- rewrite CReal_mult_0_l, <- CReal_opp_0, <- CReal_opp_mult_distr_r.
- apply CReal_opp_gt_lt_contravar. exact H.
-Qed.
-
-Fixpoint pow (r:CReal) (n:nat) : CReal :=
- match n with
- | O => 1
- | S n => r * (pow r n)
- end.
-
-
-Lemma CReal_mult_le_compat_l_half : forall r r1 r2,
- 0 < r -> r1 <= r2 -> r * r1 <= r * r2.
-Proof.
- intros. intro abs. apply (CReal_mult_lt_reg_l) in abs.
- contradiction. apply H.
-Qed.
-
-Lemma CReal_invQ : forall (b : positive) (pos : Qlt 0 (Z.pos b # 1)),
- CRealEq (CReal_inv (inject_Q (Z.pos b # 1)) (inr (CReal_injectQPos (Z.pos b # 1) pos)))
- (inject_Q (1 # b)).
-Proof.
- intros.
- apply (CReal_mult_eq_reg_l (inject_Q (Z.pos b # 1))).
- - right. apply CReal_injectQPos. exact pos.
- - rewrite CReal_mult_comm, CReal_inv_l.
- apply CRealEq_diff. intro n. simpl;
- destruct (QCauchySeq_bounded (fun _ : nat => 1 # b)%Q Pos.to_nat (ConstCauchy (1 # b))),
- (QCauchySeq_bounded (fun _ : nat => Z.pos b # 1)%Q Pos.to_nat (ConstCauchy (Z.pos b # 1))); simpl.
- do 2 rewrite Pos.mul_1_r. rewrite Z.pos_sub_diag. discriminate.
-Qed.
-
-Definition CRealQ_dense (a b : CReal)
- : a < b -> { q : Q & a < inject_Q q < b }.
-Proof.
- (* Locate a and b at the index given by a q) Pos.to_nat (ConstCauchy q)).
- destruct (QCauchySeq_bounded (fun _ : nat => r) Pos.to_nat (ConstCauchy r)).
- simpl in maj. ring_simplify in maj. discriminate maj.
- - intros [n maj]. simpl in maj.
- destruct (QCauchySeq_bounded (fun _ : nat => q) Pos.to_nat (ConstCauchy q)).
- destruct (QCauchySeq_bounded (fun _ : nat => r) Pos.to_nat (ConstCauchy r)).
- simpl in maj. ring_simplify in maj. discriminate maj.
-Qed.
diff --git a/theories/Reals/ConstructiveRcomplete.v b/theories/Reals/ConstructiveRcomplete.v
deleted file mode 100644
index 7d743e464e..0000000000
--- a/theories/Reals/ConstructiveRcomplete.v
+++ /dev/null
@@ -1,382 +0,0 @@
-(************************************************************************)
-(* * The Coq Proof Assistant / The Coq Development Team *)
-(* v * Copyright INRIA, CNRS and contributors *)
-(* absLe y x.
-Proof.
- intros x y n maj. split.
- - apply CRealLt_asym. exists n. destruct x as [xn caux], y as [yn cauy]; simpl.
- simpl in maj. unfold Qminus. rewrite Qopp_involutive.
- rewrite Qplus_comm.
- apply (Qlt_le_trans _ (xn (Pos.to_nat n) - Qabs (yn (Pos.to_nat n)))).
- apply maj. apply Qplus_le_r.
- rewrite <- (Qopp_involutive (yn (Pos.to_nat n))).
- apply Qopp_le_compat. rewrite Qabs_opp. apply Qle_Qabs.
- - apply CRealLt_asym. exists n. destruct x as [xn caux], y as [yn cauy]; simpl.
- simpl in maj.
- apply (Qlt_le_trans _ (xn (Pos.to_nat n) - Qabs (yn (Pos.to_nat n)))).
- apply maj. apply Qplus_le_r. apply Qopp_le_compat. apply Qle_Qabs.
-Qed.
-
-(* We use absLe in sort Prop rather than Set,
- to extract smaller programs. *)
-Definition Un_cv_mod (un : nat -> CReal) (l : CReal) : Set
- := forall p : positive,
- { n : nat | forall i:nat, le n i -> absLe (un i - l) (inject_Q (1#p)) }.
-
-Lemma Un_cv_mod_eq : forall (v u : nat -> CReal) (s : CReal),
- (forall n:nat, u n == v n)
- -> Un_cv_mod u s
- -> Un_cv_mod v s.
-Proof.
- intros v u s seq H1 p. specialize (H1 p) as [N H0].
- exists N. intros. split.
- rewrite <- seq. apply H0. apply H.
- rewrite <- seq. apply H0. apply H.
-Qed.
-
-Definition Un_cauchy_mod (un : nat -> CReal) : Set
- := forall p : positive,
- { n : nat | forall i j:nat, le n i -> le n j
- -> absLe (un i - un j) (inject_Q (1#p)) }.
-
-
-(* Sharpen the archimedean property : constructive versions of
- the usual floor and ceiling functions. *)
-Definition Rfloor (a : CReal)
- : { p : Z & inject_Q (p#1) < a < inject_Q (p#1) + 2 }.
-Proof.
- destruct (CRealArchimedean a) as [n [H H0]].
- exists (n-2)%Z. split.
- - setoid_replace (n - 2 # 1)%Q with ((n#1) + - 2)%Q.
- rewrite inject_Q_plus, (opp_inject_Q 2).
- apply (CReal_plus_lt_reg_r 2). ring_simplify.
- rewrite CReal_plus_comm. exact H0.
- rewrite Qinv_plus_distr. reflexivity.
- - setoid_replace (n - 2 # 1)%Q with ((n#1) + - 2)%Q.
- rewrite inject_Q_plus, (opp_inject_Q 2).
- ring_simplify. exact H.
- rewrite Qinv_plus_distr. reflexivity.
-Defined.
-
-
-(* A point in an archimedean field is the limit of a
- sequence of rational numbers (n maps to the q between
- a and a+1/n). This will yield a maximum
- archimedean field, which is the field of real numbers. *)
-Definition FQ_dense (a b : CReal)
- : a < b -> { q : Q & a < inject_Q q < b }.
-Proof.
- intros H. assert (0 < b - a) as epsPos.
- { apply (CReal_plus_lt_compat_l (-a)) in H.
- rewrite CReal_plus_opp_l, CReal_plus_comm in H.
- apply H. }
- pose proof (Rup_pos ((/(b-a)) (inr epsPos)))
- as [n maj].
- destruct (Rfloor (inject_Q (2 * Z.pos n # 1) * b)) as [p maj2].
- exists (p # (2*n))%Q. split.
- - apply (CReal_lt_trans a (b - inject_Q (1 # n))).
- apply (CReal_plus_lt_reg_r (inject_Q (1#n))).
- unfold CReal_minus. rewrite CReal_plus_assoc. rewrite CReal_plus_opp_l.
- rewrite CReal_plus_0_r. apply (CReal_plus_lt_reg_l (-a)).
- rewrite <- CReal_plus_assoc, CReal_plus_opp_l, CReal_plus_0_l.
- rewrite CReal_plus_comm.
- apply (CReal_mult_lt_reg_l (inject_Q (Z.pos n # 1))).
- apply inject_Q_lt. reflexivity. rewrite <- inject_Q_mult.
- setoid_replace ((Z.pos n # 1) * (1 # n))%Q with 1%Q.
- apply (CReal_mult_lt_compat_l (b-a)) in maj.
- rewrite CReal_inv_r, CReal_mult_comm in maj. exact maj.
- exact epsPos. unfold Qeq; simpl. do 2 rewrite Pos.mul_1_r. reflexivity.
- apply (CReal_plus_lt_reg_r (inject_Q (1 # n))).
- unfold CReal_minus. rewrite CReal_plus_assoc, CReal_plus_opp_l.
- rewrite CReal_plus_0_r. rewrite <- inject_Q_plus.
- destruct maj2 as [_ maj2].
- setoid_replace ((p # 2 * n) + (1 # n))%Q
- with ((p + 2 # 2 * n))%Q.
- apply (CReal_mult_lt_reg_r (inject_Q (Z.pos (2 * n) # 1))).
- apply inject_Q_lt. reflexivity. rewrite <- inject_Q_mult.
- setoid_replace ((p + 2 # 2 * n) * (Z.pos (2 * n) # 1))%Q
- with ((p#1) + 2)%Q.
- rewrite inject_Q_plus. rewrite Pos2Z.inj_mul.
- rewrite CReal_mult_comm. exact maj2.
- unfold Qeq; simpl. rewrite Pos.mul_1_r, Z.mul_1_r. ring.
- setoid_replace (1#n)%Q with (2#2*n)%Q. 2: reflexivity.
- apply Qinv_plus_distr.
- - destruct maj2 as [maj2 _].
- apply (CReal_mult_lt_reg_r (inject_Q (Z.pos (2 * n) # 1))).
- apply inject_Q_lt. reflexivity.
- rewrite <- inject_Q_mult.
- setoid_replace ((p # 2 * n) * (Z.pos (2 * n) # 1))%Q
- with ((p#1))%Q.
- rewrite CReal_mult_comm. exact maj2.
- unfold Qeq; simpl. rewrite Pos.mul_1_r, Z.mul_1_r. reflexivity.
-Qed.
-
-Definition RQ_limit : forall (x : CReal) (n:nat),
- { q:Q & x < inject_Q q < x + inject_Q (1 # Pos.of_nat n) }.
-Proof.
- intros x n. apply (FQ_dense x (x + inject_Q (1 # Pos.of_nat n))).
- rewrite <- (CReal_plus_0_r x). rewrite CReal_plus_assoc.
- apply CReal_plus_lt_compat_l. rewrite CReal_plus_0_l. apply inject_Q_lt.
- reflexivity.
-Qed.
-
-Definition Un_cauchy_Q (xn : nat -> Q) : Set
- := forall n : positive,
- { k : nat | forall p q : nat, le k p -> le k q
- -> Qle (-(1#n)) (xn p - xn q)
- /\ Qle (xn p - xn q) (1#n) }.
-
-Lemma Rdiag_cauchy_sequence : forall (xn : nat -> CReal),
- Un_cauchy_mod xn
- -> Un_cauchy_Q (fun n:nat => let (l,_) := RQ_limit (xn n) n in l).
-Proof.
- intros xn H p. specialize (H (2 * p)%positive) as [k cv].
- exists (max k (2 * Pos.to_nat p)). intros.
- specialize (cv p0 q). destruct cv.
- apply (le_trans _ (Init.Nat.max k (2 * Pos.to_nat p))).
- apply Nat.le_max_l. apply H.
- apply (le_trans _ (Init.Nat.max k (2 * Pos.to_nat p))).
- apply Nat.le_max_l. apply H0.
- split.
- - apply le_inject_Q. unfold Qminus.
- apply (CReal_le_trans _ (xn p0 - (xn q + inject_Q (1 # 2 * p)))).
- + unfold CReal_minus. rewrite CReal_opp_plus_distr.
- rewrite <- CReal_plus_assoc.
- apply (CReal_plus_le_reg_r (inject_Q (1 # 2 * p))).
- rewrite CReal_plus_assoc. rewrite CReal_plus_opp_l. rewrite CReal_plus_0_r.
- rewrite <- inject_Q_plus.
- setoid_replace (- (1 # p) + (1 # 2 * p))%Q with (- (1 # 2 * p))%Q.
- rewrite opp_inject_Q. exact H1.
- rewrite Qplus_comm.
- setoid_replace (1#p)%Q with (2 # 2 *p)%Q. rewrite Qinv_minus_distr.
- reflexivity. reflexivity.
- + rewrite inject_Q_plus. apply CReal_plus_le_compat.
- apply CRealLt_asym.
- destruct (RQ_limit (xn p0) p0); simpl. apply p1.
- apply CRealLt_asym.
- destruct (RQ_limit (xn q) q); unfold proj1_sig.
- rewrite opp_inject_Q. apply CReal_opp_gt_lt_contravar.
- apply (CReal_lt_le_trans _ (xn q + inject_Q (1 # Pos.of_nat q))).
- apply p1. apply CReal_plus_le_compat_l. apply inject_Q_le.
- apply Z2Nat.inj_le. discriminate. discriminate.
- simpl. assert ((Pos.to_nat p~0 <= q)%nat).
- { apply (le_trans _ (Init.Nat.max k (2 * Pos.to_nat p))).
- 2: apply H0. replace (p~0)%positive with (2*p)%positive.
- 2: reflexivity. rewrite Pos2Nat.inj_mul.
- apply Nat.le_max_r. }
- rewrite Nat2Pos.id. apply H3. intro abs. subst q.
- inversion H3. pose proof (Pos2Nat.is_pos (p~0)).
- rewrite H5 in H4. inversion H4.
- - apply le_inject_Q. unfold Qminus.
- apply (CReal_le_trans _ (xn p0 + inject_Q (1 # 2 * p) - xn q)).
- + rewrite inject_Q_plus. apply CReal_plus_le_compat.
- apply CRealLt_asym.
- destruct (RQ_limit (xn p0) p0); unfold proj1_sig.
- apply (CReal_lt_le_trans _ (xn p0 + inject_Q (1 # Pos.of_nat p0))).
- apply p1. apply CReal_plus_le_compat_l. apply inject_Q_le.
- apply Z2Nat.inj_le. discriminate. discriminate.
- simpl. assert ((Pos.to_nat p~0 <= p0)%nat).
- { apply (le_trans _ (Init.Nat.max k (2 * Pos.to_nat p))).
- 2: apply H. replace (p~0)%positive with (2*p)%positive.
- 2: reflexivity. rewrite Pos2Nat.inj_mul.
- apply Nat.le_max_r. }
- rewrite Nat2Pos.id. apply H3. intro abs. subst p0.
- inversion H3. pose proof (Pos2Nat.is_pos (p~0)).
- rewrite H5 in H4. inversion H4.
- apply CRealLt_asym.
- rewrite opp_inject_Q. apply CReal_opp_gt_lt_contravar.
- destruct (RQ_limit (xn q) q); simpl. apply p1.
- + unfold CReal_minus. rewrite (CReal_plus_comm (xn p0)).
- rewrite CReal_plus_assoc.
- apply (CReal_plus_le_reg_l (- inject_Q (1 # 2 * p))).
- rewrite <- CReal_plus_assoc. rewrite CReal_plus_opp_l. rewrite CReal_plus_0_l.
- rewrite <- opp_inject_Q. rewrite <- inject_Q_plus.
- setoid_replace (- (1 # 2 * p) + (1 # p))%Q with (1 # 2 * p)%Q.
- exact H2. rewrite Qplus_comm.
- setoid_replace (1#p)%Q with (2 # 2*p)%Q. rewrite Qinv_minus_distr.
- reflexivity. reflexivity.
-Qed.
-
-Lemma doubleLeCovariant : forall a b c d e f : CReal,
- a == b -> c == d -> e == f
- -> (a <= c <= e)
- -> (b <= d <= f).
-Proof.
- split. rewrite <- H. rewrite <- H0. apply H2.
- rewrite <- H0. rewrite <- H1. apply H2.
-Qed.
-
-(* An element of CReal is a Cauchy sequence of rational numbers,
- show that it converges to itself in CReal. *)
-Lemma CReal_cv_self : forall (qn : nat -> Q) (x : CReal) (cvmod : positive -> nat),
- QSeqEquiv qn (fun n => proj1_sig x n) cvmod
- -> Un_cv_mod (fun n => inject_Q (qn n)) x.
-Proof.
- intros qn x cvmod H p.
- specialize (H (2*p)%positive). exists (cvmod (2*p)%positive).
- intros p0 H0. unfold absLe, CReal_minus.
- apply (doubleLeCovariant (-inject_Q (1#p)) _ (inject_Q (qn p0) - x) _ (inject_Q (1#p))).
- reflexivity. reflexivity. reflexivity.
- apply (CReal_absSmall _ _ (Pos.max (4 * p)%positive (Pos.of_nat (cvmod (2 * p)%positive)))).
- setoid_replace (proj1_sig (inject_Q (1 # p)) (Pos.to_nat (Pos.max (4 * p) (Pos.of_nat (cvmod (2 * p)%positive)))))
- with (1 # p)%Q.
- 2: reflexivity.
- setoid_replace (proj1_sig (CReal_plus (inject_Q (qn p0)) (CReal_opp x)) (Pos.to_nat (Pos.max (4 * p) (Pos.of_nat (cvmod (2 * p)%positive)))))
- with (qn p0 - proj1_sig x (2 * (Pos.to_nat (Pos.max (4 * p) (Pos.of_nat (cvmod (2 * p)%positive)))))%nat)%Q.
- 2: destruct x; reflexivity.
- apply (Qle_lt_trans _ (1 # 2 * p)).
- unfold Qle; simpl. rewrite Pos2Z.inj_max. apply Z.le_max_l.
- rewrite <- (Qplus_lt_r
- _ _ (Qabs
- (qn p0 -
- proj1_sig x
- (2 * Pos.to_nat (Pos.max (4 * p) (Pos.of_nat (cvmod (2 * p)%positive))))%nat)
- -(1#2*p))).
- ring_simplify.
- setoid_replace (-1 * (1 # 2 * p) + (1 # p))%Q with (1 # 2 * p)%Q.
- apply H. apply H0. rewrite Pos2Nat.inj_max.
- apply (le_trans _ (1 * Nat.max (Pos.to_nat (4 * p)) (Pos.to_nat (Pos.of_nat (cvmod (2 * p)%positive))))).
- destruct (cvmod (2*p)%positive). apply le_0_n. rewrite mult_1_l.
- rewrite Nat2Pos.id. 2: discriminate. apply Nat.le_max_r.
- apply Nat.mul_le_mono_nonneg_r. apply le_0_n. auto.
- setoid_replace (1 # p)%Q with (2 # 2 * p)%Q.
- rewrite Qplus_comm. rewrite Qinv_minus_distr.
- reflexivity. reflexivity.
-Qed.
-
-Lemma Un_cv_extens : forall (xn yn : nat -> CReal) (l : CReal),
- Un_cv_mod xn l
- -> (forall n : nat, xn n == yn n)
- -> Un_cv_mod yn l.
-Proof.
- intros. intro p. destruct (H p) as [n cv]. exists n.
- intros. unfold absLe, CReal_minus.
- split; rewrite <- (H0 i); apply cv; apply H1.
-Qed.
-
-(* Q is dense in Archimedean fields, so all real numbers
- are limits of rational sequences.
- The biggest computable such field has all rational limits. *)
-Lemma R_has_all_rational_limits : forall qn : nat -> Q,
- Un_cauchy_Q qn
- -> { r : CReal & Un_cv_mod (fun n:nat => inject_Q (qn n)) r }.
-Proof.
- (* qn is an element of CReal. Show that inject_Q qn
- converges to it in CReal. *)
- intros.
- destruct (standard_modulus qn (fun p => proj1_sig (H (Pos.succ p)))).
- - intros p n k H0 H1. destruct (H (Pos.succ p)%positive) as [x a]; simpl in H0,H1.
- specialize (a n k H0 H1).
- apply (Qle_lt_trans _ (1#Pos.succ p)).
- apply Qabs_Qle_condition. exact a.
- apply Pos2Z.pos_lt_pos. simpl. apply Pos.lt_succ_diag_r.
- - exists (exist _ (fun n : nat =>
- qn (increasing_modulus (fun p : positive => proj1_sig (H (Pos.succ p))) n)) H0).
- apply (CReal_cv_self qn (exist _ (fun n : nat =>
- qn (increasing_modulus (fun p : positive => proj1_sig (H (Pos.succ p))) n)) H0)
- (fun p : positive => Init.Nat.max (proj1_sig (H (Pos.succ p))) (Pos.to_nat p))).
- apply H1.
-Qed.
-
-Lemma Rcauchy_complete : forall (xn : nat -> CReal),
- Un_cauchy_mod xn
- -> { l : CReal & Un_cv_mod xn l }.
-Proof.
- intros xn cau.
- destruct (R_has_all_rational_limits (fun n => let (l,_) := RQ_limit (xn n) n in l)
- (Rdiag_cauchy_sequence xn cau))
- as [l cv].
- exists l. intro p. specialize (cv (2*p)%positive) as [k cv].
- exists (max k (2 * Pos.to_nat p)). intros p0 H. specialize (cv p0).
- destruct cv as [H0 H1]. apply (le_trans _ (max k (2 * Pos.to_nat p))).
- apply Nat.le_max_l. apply H.
- destruct (RQ_limit (xn p0) p0) as [q maj]; unfold proj1_sig in H0,H1.
- split.
- - apply (CReal_le_trans _ (inject_Q q - inject_Q (1 # 2 * p) - l)).
- + unfold CReal_minus. rewrite (CReal_plus_comm (inject_Q q)).
- apply (CReal_plus_le_reg_l (inject_Q (1 # 2 * p))).
- ring_simplify. unfold CReal_minus. rewrite <- opp_inject_Q. rewrite <- inject_Q_plus.
- setoid_replace ((1 # 2 * p) + - (1 # p))%Q with (-(1#2*p))%Q.
- rewrite opp_inject_Q. apply H0.
- setoid_replace (1#p)%Q with (2 # 2*p)%Q.
- rewrite Qinv_minus_distr. reflexivity. reflexivity.
- + unfold CReal_minus.
- do 2 rewrite <- (CReal_plus_comm (-l)). apply CReal_plus_le_compat_l.
- apply (CReal_plus_le_reg_r (inject_Q (1 # 2 * p))).
- ring_simplify. rewrite CReal_plus_comm.
- apply (CReal_le_trans _ (xn p0 + inject_Q (1 # Pos.of_nat p0))).
- apply CRealLt_asym, maj. apply CReal_plus_le_compat_l.
- apply inject_Q_le.
- apply Z2Nat.inj_le. discriminate. discriminate.
- simpl. assert ((Pos.to_nat p~0 <= p0)%nat).
- { apply (le_trans _ (Init.Nat.max k (2 * Pos.to_nat p))).
- 2: apply H. replace (p~0)%positive with (2*p)%positive.
- 2: reflexivity. rewrite Pos2Nat.inj_mul.
- apply Nat.le_max_r. }
- rewrite Nat2Pos.id. apply H2. intro abs. subst p0.
- inversion H2. pose proof (Pos2Nat.is_pos (p~0)).
- rewrite H4 in H3. inversion H3.
- - apply (CReal_le_trans _ (inject_Q q - l)).
- + unfold CReal_minus. do 2 rewrite <- (CReal_plus_comm (-l)).
- apply CReal_plus_le_compat_l. apply CRealLt_asym, maj.
- + apply (CReal_le_trans _ (inject_Q (1 # 2 * p))).
- apply H1. apply inject_Q_le.
- rewrite <- Qplus_0_r.
- setoid_replace (1#p)%Q with ((1#2*p)+(1#2*p))%Q.
- apply Qplus_le_r. discriminate.
- rewrite Qinv_plus_distr. reflexivity.
-Qed.
-
-Definition CRealImplem : ConstructiveReals.
-Proof.
- assert (isLinearOrder CReal CRealLt) as lin.
- { repeat split. exact CRealLt_asym.
- exact CReal_lt_trans.
- intros. destruct (CRealLt_dec x z y H).
- left. exact c. right. exact c. }
- apply (Build_ConstructiveReals
- CReal CRealLt lin CRealLtProp
- CRealLtEpsilon CRealLtForget CRealLtDisjunctEpsilon
- (inject_Q 0) (inject_Q 1)
- CReal_plus CReal_opp CReal_mult
- CReal_isRing CReal_isRingExt CRealLt_0_1
- CReal_plus_lt_compat_l CReal_plus_lt_reg_l
- CReal_mult_lt_0_compat
- CReal_inv CReal_inv_l CReal_inv_0_lt_compat
- inject_Q inject_Q_plus inject_Q_mult
- inject_Q_one inject_Q_lt lt_inject_Q
- CRealQ_dense Rup_pos).
- - intros. destruct (Rcauchy_complete xn) as [l cv].
- intro n. destruct (H n). exists x. intros.
- specialize (a i j H0 H1) as [a b]. split. 2: exact b.
- rewrite <- opp_inject_Q.
- setoid_replace (-(1#n))%Q with (-1#n)%Q. exact a. reflexivity.
- exists l. intros p. destruct (cv p).
- exists x. intros. specialize (a i H0). split. 2: apply a.
- unfold orderLe.
- intro abs. setoid_replace (-1#p)%Q with (-(1#p))%Q in abs.
- rewrite opp_inject_Q in abs. destruct a. contradiction.
- reflexivity.
-Defined.
diff --git a/theories/Reals/ConstructiveReals.v b/theories/Reals/ConstructiveReals.v
deleted file mode 100644
index d6eee518d3..0000000000
--- a/theories/Reals/ConstructiveReals.v
+++ /dev/null
@@ -1,835 +0,0 @@
-(************************************************************************)
-(* * The Coq Proof Assistant / The Coq Development Team *)
-(* v * Copyright INRIA, CNRS and contributors *)
-(* Prop;
- upper : Q -> Prop;
- (* The cuts respect equality on Q. *)
- lower_proper : Proper (Qeq ==> iff) lower;
- upper_proper : Proper (Qeq ==> iff) upper;
- (* The cuts are inhabited. *)
- lower_bound : { q : Q | lower q };
- upper_bound : { r : Q | upper r };
- (* The lower cut is a lower set. *)
- lower_lower : forall q r, q < r -> lower r -> lower q;
- (* The lower cut is open. *)
- lower_open : forall q, lower q -> exists r, q < r /\ lower r;
- (* The upper cut is an upper set. *)
- upper_upper : forall q r, q < r -> upper q -> upper r;
- (* The upper cut is open. *)
- upper_open : forall r, upper r -> exists q, q < r /\ upper q;
- (* The cuts are disjoint. *)
- disjoint : forall q, ~ (lower q /\ upper q);
- (* There is no gap between the cuts. *)
- located : forall q r, q < r -> { lower q } + { upper r }
-}.
-
- see github.com/andrejbauer/dedekind-reals for the Prop-based
- version of those Dedekind reals (although Prop fails to make
- them an instance of ConstructiveReals).
-
- Any computation about constructive reals, can be worked
- in the fastest instance for it; we then transport the results
- to all other instances by the isomorphisms. This way of working
- is different from the usual interfaces, where we would rather
- prove things abstractly, by quantifying universally on the instance.
-
- The functions of ConstructiveReals do not have a direct impact
- on performance, because algorithms will be extracted from instances,
- and because fast ConstructiveReals morphisms should be coded
- manually. However, since instances are forced to implement
- those functions, it is probable that they will also use them
- in their algorithms. So those functions hint at what we think
- will yield fast and small extracted programs. *)
-
-
-Require Import QArith.
-
-Definition isLinearOrder (X : Set) (Xlt : X -> X -> Set) : Set
- := (forall x y:X, Xlt x y -> Xlt y x -> False)
- * (forall x y z : X, Xlt x y -> Xlt y z -> Xlt x z)
- * (forall x y z : X, Xlt x z -> Xlt x y + Xlt y z).
-
-Definition orderEq (X : Set) (Xlt : X -> X -> Set) (x y : X) : Prop
- := (Xlt x y -> False) /\ (Xlt y x -> False).
-
-Definition orderAppart (X : Set) (Xlt : X -> X -> Set) (x y : X) : Set
- := Xlt x y + Xlt y x.
-
-Definition orderLe (X : Set) (Xlt : X -> X -> Set) (x y : X) : Prop
- := Xlt y x -> False.
-
-Definition sig_forall_dec_T : Type
- := forall (P : nat -> Prop), (forall n, {P n} + {~P n})
- -> {n | ~P n} + {forall n, P n}.
-
-Definition sig_not_dec_T : Type := forall P : Prop, { ~~P } + { ~P }.
-
-Record ConstructiveReals : Type :=
- {
- CRcarrier : Set;
-
- (* Put this order relation in sort Set rather than Prop,
- to allow the definition of fast ConstructiveReals morphisms.
- For example, the Cauchy reals do store information in
- the proofs of CRlt, which is used in algorithms in sort Set. *)
- CRlt : CRcarrier -> CRcarrier -> Set;
- CRltLinear : isLinearOrder CRcarrier CRlt;
-
- (* The propositional truncation of CRlt. It facilitates proofs
- when computations are not considered important, for example in
- classical reals with extra logical axioms. *)
- CRltProp : CRcarrier -> CRcarrier -> Prop;
- (* This choice algorithm can be slow, keep it for the classical
- quotient of the reals, where computations are blocked by
- axioms like LPO. *)
- CRltEpsilon : forall x y : CRcarrier, CRltProp x y -> CRlt x y;
- CRltForget : forall x y : CRcarrier, CRlt x y -> CRltProp x y;
- CRltDisjunctEpsilon : forall a b c d : CRcarrier,
- (CRltProp a b \/ CRltProp c d) -> CRlt a b + CRlt c d;
-
- (* Constants *)
- CRzero : CRcarrier;
- CRone : CRcarrier;
-
- (* Addition and multiplication *)
- CRplus : CRcarrier -> CRcarrier -> CRcarrier;
- CRopp : CRcarrier -> CRcarrier; (* Computable opposite,
- stronger than Prop-existence of opposite *)
- CRmult : CRcarrier -> CRcarrier -> CRcarrier;
-
- CRisRing : ring_theory CRzero CRone CRplus CRmult
- (fun x y => CRplus x (CRopp y)) CRopp (orderEq CRcarrier CRlt);
- CRisRingExt : ring_eq_ext CRplus CRmult CRopp (orderEq CRcarrier CRlt);
-
- (* Compatibility with order *)
- CRzero_lt_one : CRlt CRzero CRone; (* 0 # 1 would only allow 0 < 1 because
- of Fmult_lt_0_compat so request 0 < 1 directly. *)
- CRplus_lt_compat_l : forall r r1 r2 : CRcarrier,
- CRlt r1 r2 -> CRlt (CRplus r r1) (CRplus r r2);
- CRplus_lt_reg_l : forall r r1 r2 : CRcarrier,
- CRlt (CRplus r r1) (CRplus r r2) -> CRlt r1 r2;
- CRmult_lt_0_compat : forall x y : CRcarrier,
- CRlt CRzero x -> CRlt CRzero y -> CRlt CRzero (CRmult x y);
-
- (* A constructive total inverse function on F would need to be continuous,
- which is impossible because we cannot connect plus and minus infinities.
- Therefore it has to be a partial function, defined on non zero elements.
- For this reason we cannot use Coq's field_theory and field tactic.
-
- To implement Finv by Cauchy sequences we need orderAppart,
- ~orderEq is not enough. *)
- CRinv : forall x : CRcarrier, orderAppart _ CRlt x CRzero -> CRcarrier;
- CRinv_l : forall (r:CRcarrier) (rnz : orderAppart _ CRlt r CRzero),
- orderEq _ CRlt (CRmult (CRinv r rnz) r) CRone;
- CRinv_0_lt_compat : forall (r : CRcarrier) (rnz : orderAppart _ CRlt r CRzero),
- CRlt CRzero r -> CRlt CRzero (CRinv r rnz);
-
- (* The initial field morphism (in characteristic zero).
- The abstract definition by iteration of addition is
- probably the slowest. Let each instance implement
- a faster (and often simpler) version. *)
- CR_of_Q : Q -> CRcarrier;
- CR_of_Q_plus : forall q r : Q, orderEq _ CRlt (CR_of_Q (q+r))
- (CRplus (CR_of_Q q) (CR_of_Q r));
- CR_of_Q_mult : forall q r : Q, orderEq _ CRlt (CR_of_Q (q*r))
- (CRmult (CR_of_Q q) (CR_of_Q r));
- CR_of_Q_one : orderEq _ CRlt (CR_of_Q 1) CRone;
- CR_of_Q_lt : forall q r : Q,
- Qlt q r -> CRlt (CR_of_Q q) (CR_of_Q r);
- lt_CR_of_Q : forall q r : Q,
- CRlt (CR_of_Q q) (CR_of_Q r) -> Qlt q r;
-
- (* This function is very fast in both the Cauchy and Dedekind
- instances, because this rational number q is almost what
- the proof of CRlt x y contains.
- This function is also the heart of the computation of
- constructive real numbers : it approximates x to any
- requested precision y. *)
- CR_Q_dense : forall x y : CRcarrier, CRlt x y ->
- { q : Q & prod (CRlt x (CR_of_Q q))
- (CRlt (CR_of_Q q) y) };
- CR_archimedean : forall x : CRcarrier,
- { n : positive & CRlt x (CR_of_Q (Z.pos n # 1)) };
-
- CRminus (x y : CRcarrier) : CRcarrier
- := CRplus x (CRopp y);
-
- (* Definitions of convergence and Cauchy-ness. The formulas
- with orderLe or CRlt are logically equivalent, the choice of
- orderLe in sort Prop is a question of performance.
- It is very rare to turn back to the strict order to
- define functions in sort Set, so we prefer to discard
- those proofs during extraction. And even in those rare cases,
- it is easy to divide epsilon by 2 for example. *)
- CR_cv (un : nat -> CRcarrier) (l : CRcarrier) : Set
- := forall p:positive,
- { n : nat | forall i:nat, le n i
- -> orderLe _ CRlt (CR_of_Q (-1#p)) (CRminus (un i) l)
- /\ orderLe _ CRlt (CRminus (un i) l) (CR_of_Q (1#p)) };
- CR_cauchy (un : nat -> CRcarrier) : Set
- := forall p : positive,
- { n : nat | forall i j:nat, le n i -> le n j
- -> orderLe _ CRlt (CR_of_Q (-1#p)) (CRminus (un i) (un j))
- /\ orderLe _ CRlt (CRminus (un i) (un j)) (CR_of_Q (1#p)) };
-
- (* For the Cauchy reals, this algorithm consists in building
- a Cauchy sequence of rationals un : nat -> Q that has
- the same limit as xn. For each n:nat, un n is a 1/n
- rational approximation of a point of xn that has converged
- within 1/n. *)
- CR_complete :
- forall xn : (nat -> CRcarrier),
- CR_cauchy xn -> { l : CRcarrier & CR_cv xn l };
- }.
-
-Lemma CRlt_asym : forall (R : ConstructiveReals) (x y : CRcarrier R),
- CRlt R x y -> CRlt R y x -> False.
-Proof.
- intros. destruct (CRltLinear R), p.
- apply (f x y); assumption.
-Qed.
-
-Lemma CRlt_proper
- : forall R : ConstructiveReals,
- CMorphisms.Proper
- (CMorphisms.respectful (orderEq _ (CRlt R))
- (CMorphisms.respectful (orderEq _ (CRlt R)) CRelationClasses.iffT)) (CRlt R).
-Proof.
- intros R x y H x0 y0 H0. destruct H, H0.
- destruct (CRltLinear R). split.
- - intro. destruct (s x y x0). assumption.
- contradiction. destruct (s y y0 x0).
- assumption. assumption. contradiction.
- - intro. destruct (s y x y0). assumption.
- contradiction. destruct (s x x0 y0).
- assumption. assumption. contradiction.
-Qed.
-
-Lemma CRle_refl : forall (R : ConstructiveReals) (x : CRcarrier R),
- CRlt R x x -> False.
-Proof.
- intros. destruct (CRltLinear R), p.
- exact (f x x H H).
-Qed.
-
-Lemma CRle_lt_trans : forall (R : ConstructiveReals) (r1 r2 r3 : CRcarrier R),
- (CRlt R r2 r1 -> False) -> CRlt R r2 r3 -> CRlt R r1 r3.
-Proof.
- intros. destruct (CRltLinear R).
- destruct (s r2 r1 r3 H0). contradiction. apply c.
-Qed.
-
-Lemma CRlt_le_trans : forall (R : ConstructiveReals) (r1 r2 r3 : CRcarrier R),
- CRlt R r1 r2 -> (CRlt R r3 r2 -> False) -> CRlt R r1 r3.
-Proof.
- intros. destruct (CRltLinear R).
- destruct (s r1 r3 r2 H). apply c. contradiction.
-Qed.
-
-Lemma CRle_trans : forall (R : ConstructiveReals) (x y z : CRcarrier R),
- orderLe _ (CRlt R) x y -> orderLe _ (CRlt R) y z -> orderLe _ (CRlt R) x z.
-Proof.
- intros. intro abs. apply H0.
- apply (CRlt_le_trans _ _ x); assumption.
-Qed.
-
-Lemma CRlt_trans : forall (R : ConstructiveReals) (x y z : CRcarrier R),
- CRlt R x y -> CRlt R y z -> CRlt R x z.
-Proof.
- intros. apply (CRlt_le_trans R _ y _ H).
- apply CRlt_asym. exact H0.
-Defined.
-
-Lemma CRlt_trans_flip : forall (R : ConstructiveReals) (x y z : CRcarrier R),
- CRlt R y z -> CRlt R x y -> CRlt R x z.
-Proof.
- intros. apply (CRlt_le_trans R _ y). exact H0.
- apply CRlt_asym. exact H.
-Defined.
-
-Lemma CReq_refl : forall (R : ConstructiveReals) (x : CRcarrier R),
- orderEq _ (CRlt R) x x.
-Proof.
- split; apply CRle_refl.
-Qed.
-
-Lemma CReq_sym : forall (R : ConstructiveReals) (x y : CRcarrier R),
- orderEq _ (CRlt R) x y
- -> orderEq _ (CRlt R) y x.
-Proof.
- intros. destruct H. split; intro abs; contradiction.
-Qed.
-
-Lemma CReq_trans : forall (R : ConstructiveReals) (x y z : CRcarrier R),
- orderEq _ (CRlt R) x y
- -> orderEq _ (CRlt R) y z
- -> orderEq _ (CRlt R) x z.
-Proof.
- intros. destruct H,H0. destruct (CRltLinear R), p. split.
- - intro abs. destruct (s _ y _ abs); contradiction.
- - intro abs. destruct (s _ y _ abs); contradiction.
-Qed.
-
-Lemma CR_setoid : forall R : ConstructiveReals,
- Setoid_Theory (CRcarrier R) (orderEq _ (CRlt R)).
-Proof.
- split. intro x. apply CReq_refl.
- intros x y. apply CReq_sym.
- intros x y z. apply CReq_trans.
-Qed.
-
-Lemma CRplus_0_r : forall (R : ConstructiveReals) (x : CRcarrier R),
- orderEq _ (CRlt R) (CRplus R x (CRzero R)) x.
-Proof.
- intros. destruct (CRisRing R).
- apply (CReq_trans R _ (CRplus R (CRzero R) x)).
- apply Radd_comm. apply Radd_0_l.
-Qed.
-
-Lemma CRmult_1_r : forall (R : ConstructiveReals) (x : CRcarrier R),
- orderEq _ (CRlt R) (CRmult R x (CRone R)) x.
-Proof.
- intros. destruct (CRisRing R).
- apply (CReq_trans R _ (CRmult R (CRone R) x)).
- apply Rmul_comm. apply Rmul_1_l.
-Qed.
-
-Lemma CRplus_opp_l : forall (R : ConstructiveReals) (x : CRcarrier R),
- orderEq _ (CRlt R) (CRplus R (CRopp R x) x) (CRzero R).
-Proof.
- intros. destruct (CRisRing R).
- apply (CReq_trans R _ (CRplus R x (CRopp R x))).
- apply Radd_comm. apply Ropp_def.
-Qed.
-
-Lemma CRplus_lt_compat_r : forall (R : ConstructiveReals) (r r1 r2 : CRcarrier R),
- CRlt R r1 r2 -> CRlt R (CRplus R r1 r) (CRplus R r2 r).
-Proof.
- intros. destruct (CRisRing R).
- apply (CRlt_proper R (CRplus R r r1) (CRplus R r1 r) (Radd_comm _ _)
- (CRplus R r2 r) (CRplus R r2 r)).
- apply CReq_refl.
- apply (CRlt_proper R _ _ (CReq_refl _ _) _ (CRplus R r r2)).
- apply Radd_comm. apply CRplus_lt_compat_l. exact H.
-Qed.
-
-Lemma CRplus_lt_reg_r : forall (R : ConstructiveReals) (r r1 r2 : CRcarrier R),
- CRlt R (CRplus R r1 r) (CRplus R r2 r) -> CRlt R r1 r2.
-Proof.
- intros. destruct (CRisRing R).
- apply (CRlt_proper R (CRplus R r r1) (CRplus R r1 r) (Radd_comm _ _)
- (CRplus R r2 r) (CRplus R r2 r)) in H.
- 2: apply CReq_refl.
- apply (CRlt_proper R _ _ (CReq_refl _ _) _ (CRplus R r r2)) in H.
- apply CRplus_lt_reg_l in H. exact H.
- apply Radd_comm.
-Qed.
-
-Lemma CRplus_le_compat_l : forall (R : ConstructiveReals) (r r1 r2 : CRcarrier R),
- orderLe _ (CRlt R) r1 r2
- -> orderLe _ (CRlt R) (CRplus R r r1) (CRplus R r r2).
-Proof.
- intros. intros abs. apply CRplus_lt_reg_l in abs. apply H. exact abs.
-Qed.
-
-Lemma CRplus_le_compat_r : forall (R : ConstructiveReals) (r r1 r2 : CRcarrier R),
- orderLe _ (CRlt R) r1 r2
- -> orderLe _ (CRlt R) (CRplus R r1 r) (CRplus R r2 r).
-Proof.
- intros. intros abs. apply CRplus_lt_reg_r in abs. apply H. exact abs.
-Qed.
-
-Lemma CRplus_le_reg_l : forall (R : ConstructiveReals) (r r1 r2 : CRcarrier R),
- orderLe _ (CRlt R) (CRplus R r r1) (CRplus R r r2)
- -> orderLe _ (CRlt R) r1 r2.
-Proof.
- intros. intro abs. apply H. clear H.
- apply CRplus_lt_compat_l. exact abs.
-Qed.
-
-Lemma CRplus_le_reg_r : forall (R : ConstructiveReals) (r r1 r2 : CRcarrier R),
- orderLe _ (CRlt R) (CRplus R r1 r) (CRplus R r2 r)
- -> orderLe _ (CRlt R) r1 r2.
-Proof.
- intros. intro abs. apply H. clear H.
- apply CRplus_lt_compat_r. exact abs.
-Qed.
-
-Lemma CRplus_lt_le_compat :
- forall (R : ConstructiveReals) (r1 r2 r3 r4 : CRcarrier R),
- CRlt R r1 r2
- -> (CRlt R r4 r3 -> False)
- -> CRlt R (CRplus R r1 r3) (CRplus R r2 r4).
-Proof.
- intros. apply (CRlt_le_trans R _ (CRplus R r2 r3)).
- apply CRplus_lt_compat_r. exact H. intro abs.
- apply CRplus_lt_reg_l in abs. contradiction.
-Qed.
-
-Lemma CRplus_eq_reg_l : forall (R : ConstructiveReals) (r r1 r2 : CRcarrier R),
- orderEq _ (CRlt R) (CRplus R r r1) (CRplus R r r2)
- -> orderEq _ (CRlt R) r1 r2.
-Proof.
- intros.
- destruct (CRisRingExt R). clear Rmul_ext Ropp_ext.
- pose proof (Radd_ext
- (CRopp R r) (CRopp R r) (CReq_refl _ _)
- _ _ H).
- destruct (CRisRing R).
- apply (CReq_trans _ r1) in H0.
- apply (CReq_trans R _ _ _ H0).
- apply (CReq_trans R _ (CRplus R (CRplus R (CRopp R r) r) r2)).
- apply Radd_assoc.
- apply (CReq_trans R _ (CRplus R (CRzero R) r2)).
- apply Radd_ext. apply CRplus_opp_l. apply CReq_refl.
- apply Radd_0_l. apply CReq_sym.
- apply (CReq_trans R _ (CRplus R (CRplus R (CRopp R r) r) r1)).
- apply Radd_assoc.
- apply (CReq_trans R _ (CRplus R (CRzero R) r1)).
- apply Radd_ext. apply CRplus_opp_l. apply CReq_refl.
- apply Radd_0_l.
-Qed.
-
-Lemma CRplus_eq_reg_r : forall (R : ConstructiveReals) (r r1 r2 : CRcarrier R),
- orderEq _ (CRlt R) (CRplus R r1 r) (CRplus R r2 r)
- -> orderEq _ (CRlt R) r1 r2.
-Proof.
- intros. apply (CRplus_eq_reg_l R r).
- apply (CReq_trans R _ (CRplus R r1 r)). apply (Radd_comm (CRisRing R)).
- apply (CReq_trans R _ (CRplus R r2 r)).
- exact H. apply (Radd_comm (CRisRing R)).
-Qed.
-
-Lemma CRopp_involutive : forall (R : ConstructiveReals) (r : CRcarrier R),
- orderEq _ (CRlt R) (CRopp R (CRopp R r)) r.
-Proof.
- intros. apply (CRplus_eq_reg_l R (CRopp R r)).
- apply (CReq_trans R _ (CRzero R)). apply CRisRing.
- apply CReq_sym, (CReq_trans R _ (CRplus R r (CRopp R r))).
- apply CRisRing. apply CRisRing.
-Qed.
-
-Lemma CRopp_gt_lt_contravar
- : forall (R : ConstructiveReals) (r1 r2 : CRcarrier R),
- CRlt R r2 r1 -> CRlt R (CRopp R r1) (CRopp R r2).
-Proof.
- intros. apply (CRplus_lt_reg_l R r1).
- destruct (CRisRing R).
- apply (CRle_lt_trans R _ (CRzero R)). apply Ropp_def.
- apply (CRplus_lt_compat_l R (CRopp R r2)) in H.
- apply (CRle_lt_trans R _ (CRplus R (CRopp R r2) r2)).
- apply (CRle_trans R _ (CRplus R r2 (CRopp R r2))).
- destruct (Ropp_def r2). exact H0.
- destruct (Radd_comm r2 (CRopp R r2)). exact H1.
- apply (CRlt_le_trans R _ _ _ H).
- destruct (Radd_comm r1 (CRopp R r2)). exact H0.
-Qed.
-
-Lemma CRopp_lt_cancel : forall (R : ConstructiveReals) (r1 r2 : CRcarrier R),
- CRlt R (CRopp R r2) (CRopp R r1) -> CRlt R r1 r2.
-Proof.
- intros. apply (CRplus_lt_compat_r R r1) in H.
- destruct (CRplus_opp_l R r1) as [_ H1].
- apply (CRlt_le_trans R _ _ _ H) in H1. clear H.
- apply (CRplus_lt_compat_l R r2) in H1.
- destruct (CRplus_0_r R r2) as [_ H0].
- apply (CRlt_le_trans R _ _ _ H1) in H0. clear H1.
- destruct (Radd_assoc (CRisRing R) r2 (CRopp R r2) r1) as [H _].
- apply (CRle_lt_trans R _ _ _ H) in H0. clear H.
- apply (CRle_lt_trans R _ (CRplus R (CRzero R) r1)).
- apply (Radd_0_l (CRisRing R)).
- apply (CRle_lt_trans R _ (CRplus R (CRplus R r2 (CRopp R r2)) r1)).
- 2: exact H0. apply CRplus_le_compat_r.
- destruct (Ropp_def (CRisRing R) r2). exact H.
-Qed.
-
-Lemma CRopp_plus_distr : forall (R : ConstructiveReals) (r1 r2 : CRcarrier R),
- orderEq _ (CRlt R) (CRopp R (CRplus R r1 r2)) (CRplus R (CRopp R r1) (CRopp R r2)).
-Proof.
- intros. destruct (CRisRing R), (CRisRingExt R).
- apply (CRplus_eq_reg_l R (CRplus R r1 r2)).
- apply (CReq_trans R _ (CRzero R)). apply Ropp_def.
- apply (CReq_trans R _ (CRplus R (CRplus R r2 r1) (CRplus R (CRopp R r1) (CRopp R r2)))).
- apply (CReq_trans R _ (CRplus R r2 (CRplus R r1 (CRplus R (CRopp R r1) (CRopp R r2))))).
- apply (CReq_trans R _ (CRplus R r2 (CRopp R r2))).
- apply CReq_sym. apply Ropp_def. apply Radd_ext.
- apply CReq_refl.
- apply (CReq_trans R _ (CRplus R (CRzero R) (CRopp R r2))).
- apply CReq_sym, Radd_0_l.
- apply (CReq_trans R _ (CRplus R (CRplus R r1 (CRopp R r1)) (CRopp R r2))).
- apply Radd_ext. 2: apply CReq_refl. apply CReq_sym, Ropp_def.
- apply CReq_sym, Radd_assoc. apply Radd_assoc.
- apply Radd_ext. 2: apply CReq_refl. apply Radd_comm.
-Qed.
-
-Lemma CRmult_plus_distr_l : forall (R : ConstructiveReals) (r1 r2 r3 : CRcarrier R),
- orderEq _ (CRlt R) (CRmult R r1 (CRplus R r2 r3))
- (CRplus R (CRmult R r1 r2) (CRmult R r1 r3)).
-Proof.
- intros. destruct (CRisRing R).
- apply (CReq_trans R _ (CRmult R (CRplus R r2 r3) r1)).
- apply Rmul_comm.
- apply (CReq_trans R _ (CRplus R (CRmult R r2 r1) (CRmult R r3 r1))).
- apply Rdistr_l.
- apply (CReq_trans R _ (CRplus R (CRmult R r1 r2) (CRmult R r3 r1))).
- destruct (CRisRingExt R). apply Radd_ext.
- apply Rmul_comm. apply CReq_refl.
- destruct (CRisRingExt R). apply Radd_ext.
- apply CReq_refl. apply Rmul_comm.
-Qed.
-
-(* x == x+x -> x == 0 *)
-Lemma CRzero_double : forall (R : ConstructiveReals) (x : CRcarrier R),
- orderEq _ (CRlt R) x (CRplus R x x)
- -> orderEq _ (CRlt R) x (CRzero R).
-Proof.
- intros.
- apply (CRplus_eq_reg_l R x), CReq_sym, (CReq_trans R _ x).
- apply CRplus_0_r. exact H.
-Qed.
-
-Lemma CRmult_0_r : forall (R : ConstructiveReals) (x : CRcarrier R),
- orderEq _ (CRlt R) (CRmult R x (CRzero R)) (CRzero R).
-Proof.
- intros. apply CRzero_double.
- apply (CReq_trans R _ (CRmult R x (CRplus R (CRzero R) (CRzero R)))).
- destruct (CRisRingExt R). apply Rmul_ext. apply CReq_refl.
- apply CReq_sym, CRplus_0_r.
- destruct (CRisRing R). apply CRmult_plus_distr_l.
-Qed.
-
-Lemma CRopp_mult_distr_r : forall (R : ConstructiveReals) (r1 r2 : CRcarrier R),
- orderEq _ (CRlt R) (CRopp R (CRmult R r1 r2))
- (CRmult R r1 (CRopp R r2)).
-Proof.
- intros. apply (CRplus_eq_reg_l R (CRmult R r1 r2)).
- destruct (CRisRing R).
- apply (CReq_trans R _ (CRzero R)). apply Ropp_def.
- apply (CReq_trans R _ (CRmult R r1 (CRplus R r2 (CRopp R r2)))).
- 2: apply CRmult_plus_distr_l.
- apply (CReq_trans R _ (CRmult R r1 (CRzero R))).
- apply CReq_sym, CRmult_0_r.
- destruct (CRisRingExt R). apply Rmul_ext. apply CReq_refl.
- apply CReq_sym, Ropp_def.
-Qed.
-
-Lemma CRopp_mult_distr_l : forall (R : ConstructiveReals) (r1 r2 : CRcarrier R),
- orderEq _ (CRlt R) (CRopp R (CRmult R r1 r2))
- (CRmult R (CRopp R r1) r2).
-Proof.
- intros. apply (CReq_trans R _ (CRmult R r2 (CRopp R r1))).
- apply (CReq_trans R _ (CRopp R (CRmult R r2 r1))).
- apply (Ropp_ext (CRisRingExt R)).
- apply CReq_sym, (Rmul_comm (CRisRing R)).
- apply CRopp_mult_distr_r.
- apply CReq_sym, (Rmul_comm (CRisRing R)).
-Qed.
-
-Lemma CRmult_lt_compat_r : forall (R : ConstructiveReals) (r r1 r2 : CRcarrier R),
- CRlt R (CRzero R) r
- -> CRlt R r1 r2
- -> CRlt R (CRmult R r1 r) (CRmult R r2 r).
-Proof.
- intros. apply (CRplus_lt_reg_r R (CRopp R (CRmult R r1 r))).
- apply (CRle_lt_trans R _ (CRzero R)).
- apply (Ropp_def (CRisRing R)).
- apply (CRlt_le_trans R _ (CRplus R (CRmult R r2 r) (CRmult R (CRopp R r1) r))).
- apply (CRlt_le_trans R _ (CRmult R (CRplus R r2 (CRopp R r1)) r)).
- apply CRmult_lt_0_compat. 2: exact H.
- apply (CRplus_lt_reg_r R r1).
- apply (CRle_lt_trans R _ r1). apply (Radd_0_l (CRisRing R)).
- apply (CRlt_le_trans R _ r2 _ H0).
- apply (CRle_trans R _ (CRplus R r2 (CRplus R (CRopp R r1) r1))).
- apply (CRle_trans R _ (CRplus R r2 (CRzero R))).
- destruct (CRplus_0_r R r2). exact H1.
- apply CRplus_le_compat_l. destruct (CRplus_opp_l R r1). exact H1.
- destruct (Radd_assoc (CRisRing R) r2 (CRopp R r1) r1). exact H2.
- destruct (CRisRing R).
- destruct (Rdistr_l r2 (CRopp R r1) r). exact H2.
- apply CRplus_le_compat_l. destruct (CRopp_mult_distr_l R r1 r).
- exact H1.
-Qed.
-
-Lemma CRinv_r : forall (R : ConstructiveReals) (r:CRcarrier R)
- (rnz : orderAppart _ (CRlt R) r (CRzero R)),
- orderEq _ (CRlt R) (CRmult R r (CRinv R r rnz)) (CRone R).
-Proof.
- intros. apply (CReq_trans R _ (CRmult R (CRinv R r rnz) r)).
- apply (CRisRing R). apply CRinv_l.
-Qed.
-
-Lemma CRmult_lt_reg_r : forall (R : ConstructiveReals) (r r1 r2 : CRcarrier R),
- CRlt R (CRzero R) r
- -> CRlt R (CRmult R r1 r) (CRmult R r2 r)
- -> CRlt R r1 r2.
-Proof.
- intros. apply (CRmult_lt_compat_r R (CRinv R r (inr H))) in H0.
- 2: apply CRinv_0_lt_compat, H.
- apply (CRle_lt_trans R _ (CRmult R (CRmult R r1 r) (CRinv R r (inr H)))).
- - clear H0. apply (CRle_trans R _ (CRmult R r1 (CRone R))).
- destruct (CRmult_1_r R r1). exact H0.
- apply (CRle_trans R _ (CRmult R r1 (CRmult R r (CRinv R r (inr H))))).
- destruct (Rmul_ext (CRisRingExt R) r1 r1 (CReq_refl R r1)
- (CRmult R r (CRinv R r (inr H))) (CRone R)).
- apply CRinv_r. exact H0.
- destruct (Rmul_assoc (CRisRing R) r1 r (CRinv R r (inr H))). exact H1.
- - apply (CRlt_le_trans R _ (CRmult R (CRmult R r2 r) (CRinv R r (inr H)))).
- exact H0. clear H0.
- apply (CRle_trans R _ (CRmult R r2 (CRone R))).
- 2: destruct (CRmult_1_r R r2); exact H1.
- apply (CRle_trans R _ (CRmult R r2 (CRmult R r (CRinv R r (inr H))))).
- destruct (Rmul_assoc (CRisRing R) r2 r (CRinv R r (inr H))). exact H0.
- destruct (Rmul_ext (CRisRingExt R) r2 r2 (CReq_refl R r2)
- (CRmult R r (CRinv R r (inr H))) (CRone R)).
- apply CRinv_r. exact H1.
-Qed.
-
-Lemma CRmult_lt_reg_l : forall (R : ConstructiveReals) (r r1 r2 : CRcarrier R),
- CRlt R (CRzero R) r
- -> CRlt R (CRmult R r r1) (CRmult R r r2)
- -> CRlt R r1 r2.
-Proof.
- intros.
- destruct (Rmul_comm (CRisRing R) r r1) as [H1 _].
- apply (CRle_lt_trans R _ _ _ H1) in H0. clear H1.
- destruct (Rmul_comm (CRisRing R) r r2) as [_ H1].
- apply (CRlt_le_trans R _ _ _ H0) in H1. clear H0.
- apply CRmult_lt_reg_r in H1.
- exact H1. exact H.
-Qed.
-
-Lemma CRmult_le_compat_l : forall (R : ConstructiveReals) (r r1 r2 : CRcarrier R),
- CRlt R (CRzero R) r
- -> orderLe _ (CRlt R) r1 r2
- -> orderLe _ (CRlt R) (CRmult R r r1) (CRmult R r r2).
-Proof.
- intros. intro abs. apply CRmult_lt_reg_l in abs.
- contradiction. exact H.
-Qed.
-
-Lemma CRmult_le_compat_r : forall (R : ConstructiveReals) (r r1 r2 : CRcarrier R),
- CRlt R (CRzero R) r
- -> orderLe _ (CRlt R) r1 r2
- -> orderLe _ (CRlt R) (CRmult R r1 r) (CRmult R r2 r).
-Proof.
- intros. intro abs. apply CRmult_lt_reg_r in abs.
- contradiction. exact H.
-Qed.
-
-Lemma CRmult_eq_reg_r : forall (R : ConstructiveReals) (r r1 r2 : CRcarrier R),
- orderAppart _ (CRlt R) (CRzero R) r
- -> orderEq _ (CRlt R) (CRmult R r1 r) (CRmult R r2 r)
- -> orderEq _ (CRlt R) r1 r2.
-Proof.
- intros. destruct H0,H.
- - split.
- + intro abs. apply H0. apply CRmult_lt_compat_r.
- exact c. exact abs.
- + intro abs. apply H1. apply CRmult_lt_compat_r.
- exact c. exact abs.
- - split.
- + intro abs. apply H1. apply CRopp_lt_cancel.
- apply (CRle_lt_trans R _ (CRmult R r1 (CRopp R r))).
- apply CRopp_mult_distr_r.
- apply (CRlt_le_trans R _ (CRmult R r2 (CRopp R r))).
- 2: apply CRopp_mult_distr_r.
- apply CRmult_lt_compat_r. 2: exact abs.
- apply (CRplus_lt_reg_r R r). apply (CRle_lt_trans R _ r).
- apply (Radd_0_l (CRisRing R)).
- apply (CRlt_le_trans R _ (CRzero R) _ c).
- apply CRplus_opp_l.
- + intro abs. apply H0. apply CRopp_lt_cancel.
- apply (CRle_lt_trans R _ (CRmult R r2 (CRopp R r))).
- apply CRopp_mult_distr_r.
- apply (CRlt_le_trans R _ (CRmult R r1 (CRopp R r))).
- 2: apply CRopp_mult_distr_r.
- apply CRmult_lt_compat_r. 2: exact abs.
- apply (CRplus_lt_reg_r R r). apply (CRle_lt_trans R _ r).
- apply (Radd_0_l (CRisRing R)).
- apply (CRlt_le_trans R _ (CRzero R) _ c).
- apply CRplus_opp_l.
-Qed.
-
-Lemma CR_of_Q_proper : forall (R : ConstructiveReals) (q r : Q),
- q == r -> orderEq _ (CRlt R) (CR_of_Q R q) (CR_of_Q R r).
-Proof.
- split.
- - intro abs. apply lt_CR_of_Q in abs. rewrite H in abs.
- exact (Qlt_not_le r r abs (Qle_refl r)).
- - intro abs. apply lt_CR_of_Q in abs. rewrite H in abs.
- exact (Qlt_not_le r r abs (Qle_refl r)).
-Qed.
-
-Lemma CR_of_Q_zero : forall (R : ConstructiveReals),
- orderEq _ (CRlt R) (CR_of_Q R 0) (CRzero R).
-Proof.
- intros. apply CRzero_double.
- apply (CReq_trans R _ (CR_of_Q R (0+0))). apply CR_of_Q_proper.
- reflexivity. apply CR_of_Q_plus.
-Qed.
-
-Lemma CR_of_Q_opp : forall (R : ConstructiveReals) (q : Q),
- orderEq _ (CRlt R) (CR_of_Q R (-q)) (CRopp R (CR_of_Q R q)).
-Proof.
- intros. apply (CRplus_eq_reg_l R (CR_of_Q R q)).
- apply (CReq_trans R _ (CRzero R)).
- apply (CReq_trans R _ (CR_of_Q R (q-q))).
- apply CReq_sym, CR_of_Q_plus.
- apply (CReq_trans R _ (CR_of_Q R 0)).
- apply CR_of_Q_proper. ring. apply CR_of_Q_zero.
- apply CReq_sym. apply (CRisRing R).
-Qed.
-
-Lemma CR_of_Q_le : forall (R : ConstructiveReals) (r q : Q),
- Qle r q
- -> orderLe _ (CRlt R) (CR_of_Q R r) (CR_of_Q R q).
-Proof.
- intros. intro abs. apply lt_CR_of_Q in abs.
- exact (Qlt_not_le _ _ abs H).
-Qed.
-
-Lemma CR_of_Q_pos : forall (R : ConstructiveReals) (q:Q),
- Qlt 0 q -> CRlt R (CRzero R) (CR_of_Q R q).
-Proof.
- intros. apply (CRle_lt_trans R _ (CR_of_Q R 0)).
- apply CR_of_Q_zero. apply CR_of_Q_lt. exact H.
-Qed.
-
-Lemma CR_cv_above_rat
- : forall (R : ConstructiveReals) (xn : nat -> Q) (x : CRcarrier R) (q : Q),
- CR_cv R (fun n : nat => CR_of_Q R (xn n)) x
- -> CRlt R (CR_of_Q R q) x
- -> { n : nat | forall p:nat, le n p -> Qlt q (xn p) }.
-Proof.
- intros.
- destruct (CR_Q_dense R _ _ H0) as [r [H1 H2]].
- apply lt_CR_of_Q in H1. clear H0.
- destruct (Qarchimedean (/(r-q))) as [p pmaj].
- destruct (H p) as [n nmaj].
- exists n. intros k lenk. specialize (nmaj k lenk) as [H3 _].
- apply (lt_CR_of_Q R), (CRlt_le_trans R _ (CRplus R x (CR_of_Q R (-1#p)))).
- apply (CRlt_trans R _ (CRplus R (CR_of_Q R r) (CR_of_Q R (-1#p)))).
- 2: apply CRplus_lt_compat_r, H2.
- apply (CRlt_le_trans R _ (CR_of_Q R (r+(-1#p)))).
- - apply CR_of_Q_lt.
- apply (Qplus_lt_l _ _ (-(-1#p)-q)). field_simplify.
- setoid_replace (-1*(-1#p)) with (1#p). 2: reflexivity.
- apply (Qmult_lt_l _ _ (r-q)) in pmaj.
- rewrite Qmult_inv_r in pmaj. apply Qlt_shift_div_r in pmaj.
- 2: reflexivity. setoid_replace (-1*q + r) with (r-q). exact pmaj.
- ring. intro abs. apply Qlt_minus_iff in H1.
- rewrite abs in H1. inversion H1.
- apply Qlt_minus_iff in H1. exact H1.
- - apply CR_of_Q_plus.
- - apply (CRplus_le_reg_r R (CRopp R x)).
- apply (CRle_trans R _ (CR_of_Q R (-1#p))). 2: exact H3. clear H3.
- apply (CRle_trans R _ (CRplus R (CRopp R x) (CRplus R x (CR_of_Q R (-1 # p))))).
- exact (proj1 (Radd_comm (CRisRing R) _ _)).
- apply (CRle_trans R _ (CRplus R (CRplus R (CRopp R x) x) (CR_of_Q R (-1 # p)))).
- exact (proj2 (Radd_assoc (CRisRing R) _ _ _)).
- apply (CRle_trans R _ (CRplus R (CRzero R) (CR_of_Q R (-1 # p)))).
- apply CRplus_le_compat_r. exact (proj2 (CRplus_opp_l R _)).
- exact (proj2 (Radd_0_l (CRisRing R) _)).
-Qed.
-
-Lemma CR_cv_below_rat
- : forall (R : ConstructiveReals) (xn : nat -> Q) (x : CRcarrier R) (q : Q),
- CR_cv R (fun n : nat => CR_of_Q R (xn n)) x
- -> CRlt R x (CR_of_Q R q)
- -> { n : nat | forall p:nat, le n p -> Qlt (xn p) q }.
-Proof.
- intros.
- destruct (CR_Q_dense R _ _ H0) as [r [H1 H2]].
- apply lt_CR_of_Q in H2. clear H0.
- destruct (Qarchimedean (/(q-r))) as [p pmaj].
- destruct (H p) as [n nmaj].
- exists n. intros k lenk. specialize (nmaj k lenk) as [_ H4].
- apply (lt_CR_of_Q R), (CRle_lt_trans R _ (CRplus R x (CR_of_Q R (1#p)))).
- - apply (CRplus_le_reg_r R (CRopp R x)).
- apply (CRle_trans R _ (CR_of_Q R (1#p))). exact H4. clear H4.
- apply (CRle_trans R _ (CRplus R (CRopp R x) (CRplus R x (CR_of_Q R (1 # p))))).
- 2: exact (proj1 (Radd_comm (CRisRing R) _ _)).
- apply (CRle_trans R _ (CRplus R (CRplus R (CRopp R x) x) (CR_of_Q R (1 # p)))).
- 2: exact (proj1 (Radd_assoc (CRisRing R) _ _ _)).
- apply (CRle_trans R _ (CRplus R (CRzero R) (CR_of_Q R (1 # p)))).
- exact (proj1 (Radd_0_l (CRisRing R) _)).
- apply CRplus_le_compat_r. exact (proj1 (CRplus_opp_l R _)).
- - apply (CRlt_trans R _ (CRplus R (CR_of_Q R r) (CR_of_Q R (1 # p)))).
- apply CRplus_lt_compat_r. exact H1.
- apply (CRle_lt_trans R _ (CR_of_Q R (r + (1#p)))).
- apply CR_of_Q_plus. apply CR_of_Q_lt.
- apply (Qmult_lt_l _ _ (q-r)) in pmaj.
- rewrite Qmult_inv_r in pmaj. apply Qlt_shift_div_r in pmaj.
- apply (Qplus_lt_l _ _ (-r)). field_simplify.
- setoid_replace (-1*r + q) with (q-r). exact pmaj.
- ring. reflexivity. intro abs. apply Qlt_minus_iff in H2.
- rewrite abs in H2. inversion H2.
- apply Qlt_minus_iff in H2. exact H2.
-Qed.
-
-Lemma CR_cv_const : forall (R : ConstructiveReals) (x y : CRcarrier R),
- CR_cv R (fun _ => x) y -> orderEq _ (CRlt R) x y.
-Proof.
- intros. destruct (CRisRing R). split.
- - intro abs.
- destruct (CR_Q_dense R x y abs) as [q [H0 H1]].
- destruct (CR_Q_dense R _ _ H1) as [r [H2 H3]].
- apply lt_CR_of_Q in H2.
- destruct (Qarchimedean (/(r-q))) as [p pmaj].
- destruct (H p) as [n nmaj]. specialize (nmaj n (le_refl n)) as [nmaj _].
- apply nmaj. clear nmaj.
- apply (CRlt_trans R _ (CR_of_Q R (q-r))).
- apply (CRlt_le_trans R _ (CRplus R (CR_of_Q R q) (CRopp R (CR_of_Q R r)))).
- + apply CRplus_lt_le_compat. exact H0.
- intro H4. apply CRopp_lt_cancel in H4. exact (CRlt_asym R _ _ H4 H3).
- + apply (CRle_trans R _ (CRplus R (CR_of_Q R q) (CR_of_Q R (-r)))).
- apply CRplus_le_compat_l. exact (proj1 (CR_of_Q_opp R r)).
- exact (proj1 (CR_of_Q_plus R _ _)).
- + apply CR_of_Q_lt.
- apply (Qplus_lt_l _ _ (-(-1#p)+r-q)). field_simplify.
- setoid_replace (-1*(-1#p)) with (1#p). 2: reflexivity.
- apply (Qmult_lt_l _ _ (r-q)) in pmaj.
- rewrite Qmult_inv_r in pmaj. apply Qlt_shift_div_r in pmaj.
- 2: reflexivity. setoid_replace (-1*q + r) with (r-q). exact pmaj.
- ring. intro H4. apply Qlt_minus_iff in H2.
- rewrite H4 in H2. inversion H2.
- apply Qlt_minus_iff in H2. exact H2.
- - intro abs.
- destruct (CR_Q_dense R _ _ abs) as [q [H0 H1]].
- destruct (CR_Q_dense R _ _ H0) as [r [H2 H3]].
- apply lt_CR_of_Q in H3.
- destruct (Qarchimedean (/(q-r))) as [p pmaj].
- destruct (H p) as [n nmaj]. specialize (nmaj n (le_refl n)) as [_ nmaj].
- apply nmaj. clear nmaj.
- apply (CRlt_trans R _ (CR_of_Q R (q-r))).
- + apply CR_of_Q_lt.
- apply (Qmult_lt_l _ _ (q-r)) in pmaj.
- rewrite Qmult_inv_r in pmaj. apply Qlt_shift_div_r in pmaj.
- exact pmaj. reflexivity.
- intro H4. apply Qlt_minus_iff in H3.
- rewrite H4 in H3. inversion H3.
- apply Qlt_minus_iff in H3. exact H3.
- + apply (CRle_lt_trans R _ (CRplus R (CR_of_Q R q) (CR_of_Q R (-r)))).
- apply CR_of_Q_plus.
- apply (CRle_lt_trans R _ (CRplus R (CR_of_Q R q) (CRopp R (CR_of_Q R r)))).
- apply CRplus_le_compat_l. exact (proj2 (CR_of_Q_opp R r)).
- apply CRplus_lt_le_compat. exact H1.
- intro H4. apply CRopp_lt_cancel in H4.
- exact (CRlt_asym R _ _ H4 H2).
-Qed.
diff --git a/theories/Reals/ConstructiveRealsLUB.v b/theories/Reals/ConstructiveRealsLUB.v
deleted file mode 100644
index cc18bd910d..0000000000
--- a/theories/Reals/ConstructiveRealsLUB.v
+++ /dev/null
@@ -1,318 +0,0 @@
-(************************************************************************)
-(* * The Coq Proof Assistant / The Coq Development Team *)
-(* v * Copyright INRIA, CNRS and contributors *)
-(* Prop), (forall n, {P n} + {~P n})
- -> {n | ~P n} + {forall n, P n}.
-
-Definition sig_not_dec_T : Type := forall P : Prop, { ~~P } + { ~P }.
-
-Definition is_upper_bound (E:CReal -> Prop) (m:CReal)
- := forall x:CReal, E x -> x <= m.
-
-Definition is_lub (E:CReal -> Prop) (m:CReal) :=
- is_upper_bound E m /\ (forall b:CReal, is_upper_bound E b -> m <= b).
-
-Lemma is_upper_bound_dec :
- forall (E:CReal -> Prop) (x:CReal),
- sig_forall_dec_T
- -> sig_not_dec_T
- -> { is_upper_bound E x } + { ~is_upper_bound E x }.
-Proof.
- intros E x lpo sig_not_dec.
- destruct (sig_not_dec (~exists y:CReal, E y /\ CRealLtProp x y)).
- - left. intros y H.
- destruct (CRealLt_lpo_dec x y lpo). 2: exact f.
- exfalso. apply n. intro abs. apply abs.
- exists y. split. exact H. destruct c. exists x0. exact q.
- - right. intro abs. apply n. intros [y [H H0]].
- specialize (abs y H). apply CRealLtEpsilon in H0. contradiction.
-Qed.
-
-Lemma is_upper_bound_epsilon :
- forall (E:CReal -> Prop),
- sig_forall_dec_T
- -> sig_not_dec_T
- -> (exists x:CReal, is_upper_bound E x)
- -> { n:nat | is_upper_bound E (inject_Q (Z.of_nat n # 1)) }.
-Proof.
- intros E lpo sig_not_dec Ebound.
- apply constructive_indefinite_ground_description_nat.
- - intro n. apply is_upper_bound_dec. exact lpo. exact sig_not_dec.
- - destruct Ebound as [x H]. destruct (Rup_pos x). exists (Pos.to_nat x0).
- intros y ey. specialize (H y ey).
- apply CRealLt_asym. apply (CReal_le_lt_trans _ x).
- exact H. rewrite positive_nat_Z. exact c.
-Qed.
-
-Lemma is_upper_bound_not_epsilon :
- forall E:CReal -> Prop,
- sig_forall_dec_T
- -> sig_not_dec_T
- -> (exists x : CReal, E x)
- -> { m:nat | ~is_upper_bound E (-inject_Q (Z.of_nat m # 1)) }.
-Proof.
- intros E lpo sig_not_dec H.
- apply constructive_indefinite_ground_description_nat.
- - intro n. destruct (is_upper_bound_dec E (-inject_Q (Z.of_nat n # 1)) lpo sig_not_dec).
- right. intro abs. contradiction. left. exact n0.
- - destruct H as [x H]. destruct (Rup_pos (-x)) as [n H0].
- exists (Pos.to_nat n). intro abs. specialize (abs x H).
- apply abs. rewrite positive_nat_Z.
- apply (CReal_plus_lt_reg_l (inject_Q (Z.pos n # 1)-x)).
- ring_simplify. exact H0.
-Qed.
-
-(* Decidable Dedekind cuts are Cauchy reals. *)
-Record DedekindDecCut : Type :=
- {
- DDupcut : Q -> Prop;
- DDproper : forall q r : Q, (q == r -> DDupcut q -> DDupcut r)%Q;
- DDlow : Q;
- DDhigh : Q;
- DDdec : forall q:Q, { DDupcut q } + { ~DDupcut q };
- DDinterval : forall q r : Q, Qle q r -> DDupcut q -> DDupcut r;
- DDhighProp : DDupcut DDhigh;
- DDlowProp : ~DDupcut DDlow;
- }.
-
-Lemma DDlow_below_up : forall (upcut : DedekindDecCut) (a b : Q),
- DDupcut upcut a -> ~DDupcut upcut b -> Qlt b a.
-Proof.
- intros. destruct (Qlt_le_dec b a). exact q.
- exfalso. apply H0. apply (DDinterval upcut a).
- exact q. exact H.
-Qed.
-
-Fixpoint DDcut_limit_fix (upcut : DedekindDecCut) (r : Q) (n : nat) :
- Qlt 0 r
- -> (DDupcut upcut (DDlow upcut + (Z.of_nat n#1) * r))
- -> { q : Q | DDupcut upcut q /\ ~DDupcut upcut (q - r) }.
-Proof.
- destruct n.
- - intros. exfalso. simpl in H0.
- apply (DDproper upcut _ (DDlow upcut)) in H0. 2: ring.
- exact (DDlowProp upcut H0).
- - intros. destruct (DDdec upcut (DDlow upcut + (Z.of_nat n # 1) * r)).
- + exact (DDcut_limit_fix upcut r n H d).
- + exists (DDlow upcut + (Z.of_nat (S n) # 1) * r)%Q. split.
- exact H0. intro abs.
- apply (DDproper upcut _ (DDlow upcut + (Z.of_nat n # 1) * r)) in abs.
- contradiction.
- rewrite Nat2Z.inj_succ. unfold Z.succ. rewrite <- Qinv_plus_distr.
- ring.
-Qed.
-
-Lemma DDcut_limit : forall (upcut : DedekindDecCut) (r : Q),
- Qlt 0 r
- -> { q : Q | DDupcut upcut q /\ ~DDupcut upcut (q - r) }.
-Proof.
- intros.
- destruct (Qarchimedean ((DDhigh upcut - DDlow upcut)/r)) as [n nmaj].
- apply (DDcut_limit_fix upcut r (Pos.to_nat n) H).
- apply (Qmult_lt_r _ _ r) in nmaj. 2: exact H.
- unfold Qdiv in nmaj.
- rewrite <- Qmult_assoc, (Qmult_comm (/r)), Qmult_inv_r, Qmult_1_r in nmaj.
- apply (DDinterval upcut (DDhigh upcut)). 2: exact (DDhighProp upcut).
- apply Qlt_le_weak. apply (Qplus_lt_r _ _ (-DDlow upcut)).
- rewrite Qplus_assoc, <- (Qplus_comm (DDlow upcut)), Qplus_opp_r,
- Qplus_0_l, Qplus_comm.
- rewrite positive_nat_Z. exact nmaj.
- intros abs. rewrite abs in H. exact (Qlt_irrefl 0 H).
-Qed.
-
-Lemma glb_dec_Q : forall upcut : DedekindDecCut,
- { x : CReal | forall r:Q, (x < inject_Q r -> DDupcut upcut r)
- /\ (inject_Q r < x -> ~DDupcut upcut r) }.
-Proof.
- intros.
- assert (forall a b : Q, Qle a b -> Qle (-b) (-a)).
- { intros. apply (Qplus_le_l _ _ (a+b)). ring_simplify. exact H. }
- assert (QCauchySeq (fun n:nat => proj1_sig (DDcut_limit
- upcut (1#Pos.of_nat n) (eq_refl _)))
- Pos.to_nat).
- { intros p i j pi pj.
- destruct (DDcut_limit upcut (1 # Pos.of_nat i) eq_refl),
- (DDcut_limit upcut (1 # Pos.of_nat j) eq_refl); unfold proj1_sig.
- apply Qabs_case. intros.
- apply (Qplus_lt_l _ _ (x0- (1#p))). ring_simplify.
- setoid_replace (x + -1 * (1 # p))%Q with (x - (1 # p))%Q.
- 2: ring. apply (Qle_lt_trans _ (x- (1#Pos.of_nat i))).
- apply Qplus_le_r. apply H.
- apply Z2Nat.inj_le. discriminate. discriminate. simpl.
- rewrite Nat2Pos.id. exact pi. intro abs.
- subst i. inversion pi. pose proof (Pos2Nat.is_pos p).
- rewrite H2 in H1. inversion H1.
- apply (DDlow_below_up upcut). apply a0. apply a.
- intros.
- apply (Qplus_lt_l _ _ (x- (1#p))). ring_simplify.
- setoid_replace (x0 + -1 * (1 # p))%Q with (x0 - (1 # p))%Q.
- 2: ring. apply (Qle_lt_trans _ (x0- (1#Pos.of_nat j))).
- apply Qplus_le_r. apply H.
- apply Z2Nat.inj_le. discriminate. discriminate. simpl.
- rewrite Nat2Pos.id. exact pj. intro abs.
- subst j. inversion pj. pose proof (Pos2Nat.is_pos p).
- rewrite H2 in H1. inversion H1.
- apply (DDlow_below_up upcut). apply a. apply a0. }
- pose (exist (fun qn => QSeqEquiv qn qn Pos.to_nat) _ H0) as l.
- exists l. split.
- - intros. (* find an upper point between the limit and r *)
- destruct H1 as [p pmaj].
- unfold l,proj1_sig in pmaj.
- destruct (DDcut_limit upcut (1 # Pos.of_nat (Pos.to_nat p)) eq_refl) as [q qmaj]
- ; simpl in pmaj.
- apply (DDinterval upcut q). 2: apply qmaj.
- apply (Qplus_lt_l _ _ q) in pmaj. ring_simplify in pmaj.
- apply (Qle_trans _ ((2#p) + q)).
- apply (Qplus_le_l _ _ (-q)). ring_simplify. discriminate.
- apply Qlt_le_weak. exact pmaj.
- - intros [p pmaj] abs.
- unfold l,proj1_sig in pmaj.
- destruct (DDcut_limit upcut (1 # Pos.of_nat (Pos.to_nat p)) eq_refl) as [q qmaj]
- ; simpl in pmaj.
- rewrite Pos2Nat.id in qmaj.
- apply (Qplus_lt_r _ _ (r - (2#p))) in pmaj. ring_simplify in pmaj.
- destruct qmaj. apply H2.
- apply (DDinterval upcut r). 2: exact abs.
- apply Qlt_le_weak, (Qlt_trans _ (-1*(2#p) + q) _ pmaj).
- apply (Qplus_lt_l _ _ ((2#p) -q)). ring_simplify.
- setoid_replace (-1 * (1 # p))%Q with (-(1#p))%Q.
- 2: ring. rewrite Qinv_minus_distr. reflexivity.
-Qed.
-
-Lemma is_upper_bound_glb :
- forall (E:CReal -> Prop),
- sig_not_dec_T
- -> sig_forall_dec_T
- -> (exists x : CReal, E x)
- -> (exists x : CReal, is_upper_bound E x)
- -> { x : CReal | forall r:Q, (x < inject_Q r -> is_upper_bound E (inject_Q r))
- /\ (inject_Q r < x -> ~is_upper_bound E (inject_Q r)) }.
-Proof.
- intros E sig_not_dec lpo Einhab Ebound.
- destruct (is_upper_bound_epsilon E lpo sig_not_dec Ebound) as [a luba].
- destruct (is_upper_bound_not_epsilon E lpo sig_not_dec Einhab) as [b glbb].
- pose (fun q => is_upper_bound E (inject_Q q)) as upcut.
- assert (forall q:Q, { upcut q } + { ~upcut q } ).
- { intro q. apply is_upper_bound_dec. exact lpo. exact sig_not_dec. }
- assert (forall q r : Q, (q <= r)%Q -> upcut q -> upcut r).
- { intros. intros x Ex. specialize (H1 x Ex). intro abs.
- apply H1. apply (CReal_le_lt_trans _ (inject_Q r)). 2: exact abs.
- apply inject_Q_le. exact H0. }
- assert (upcut (Z.of_nat a # 1)%Q).
- { intros x Ex. exact (luba x Ex). }
- assert (~upcut (- Z.of_nat b # 1)%Q).
- { intros abs. apply glbb. intros x Ex.
- specialize (abs x Ex). rewrite <- opp_inject_Q.
- exact abs. }
- assert (forall q r : Q, (q == r)%Q -> upcut q -> upcut r).
- { intros. intros x Ex. specialize (H4 x Ex). rewrite <- H3. exact H4. }
- destruct (glb_dec_Q (Build_DedekindDecCut
- upcut H3 (-Z.of_nat b # 1)%Q (Z.of_nat a # 1)
- H H0 H1 H2)).
- simpl in a0. exists x. intro r. split.
- - intros. apply a0. exact H4.
- - intros H6 abs. specialize (a0 r) as [_ a0]. apply a0.
- exact H6. exact abs.
-Qed.
-
-Lemma is_upper_bound_closed :
- forall (E:CReal -> Prop) (sig_forall_dec : sig_forall_dec_T)
- (sig_not_dec : sig_not_dec_T)
- (Einhab : exists x : CReal, E x)
- (Ebound : exists x : CReal, is_upper_bound E x),
- is_lub
- E (proj1_sig (is_upper_bound_glb
- E sig_not_dec sig_forall_dec Einhab Ebound)).
-Proof.
- intros. split.
- - intros x Ex.
- destruct (is_upper_bound_glb E sig_not_dec sig_forall_dec Einhab Ebound); simpl.
- intro abs. destruct (FQ_dense x0 x abs) as [q [qmaj H]].
- specialize (a q) as [a _]. specialize (a qmaj x Ex).
- contradiction.
- - intros.
- destruct (is_upper_bound_glb E sig_not_dec sig_forall_dec Einhab Ebound); simpl.
- intro abs. destruct (FQ_dense b x abs) as [q [qmaj H0]].
- specialize (a q) as [_ a]. apply a. exact H0.
- intros y Ey. specialize (H y Ey). intro abs2.
- apply H. exact (CReal_lt_trans _ (inject_Q q) _ qmaj abs2).
-Qed.
-
-Lemma sig_lub :
- forall (E:CReal -> Prop),
- sig_forall_dec_T
- -> sig_not_dec_T
- -> (exists x : CReal, E x)
- -> (exists x : CReal, is_upper_bound E x)
- -> { u : CReal | is_lub E u }.
-Proof.
- intros E sig_forall_dec sig_not_dec Einhab Ebound.
- pose proof (is_upper_bound_closed E sig_forall_dec sig_not_dec Einhab Ebound).
- destruct (is_upper_bound_glb
- E sig_not_dec sig_forall_dec Einhab Ebound); simpl in H.
- exists x. exact H.
-Qed.
-
-Definition CRis_upper_bound (R : ConstructiveReals) (E:CRcarrier R -> Prop) (m:CRcarrier R)
- := forall x:CRcarrier R, E x -> CRlt R m x -> False.
-
-Lemma CR_sig_lub :
- forall (R : ConstructiveReals) (E:CRcarrier R -> Prop),
- (forall x y : CRcarrier R, orderEq _ (CRlt R) x y -> (E x <-> E y))
- -> sig_forall_dec_T
- -> sig_not_dec_T
- -> (exists x : CRcarrier R, E x)
- -> (exists x : CRcarrier R, CRis_upper_bound R E x)
- -> { u : CRcarrier R | CRis_upper_bound R E u /\
- forall y:CRcarrier R, CRis_upper_bound R E y -> CRlt R y u -> False }.
-Proof.
- intros. destruct (sig_lub (fun x:CReal => E (CauchyMorph R x)) X X0) as [u ulub].
- - destruct H0. exists (CauchyMorph_inv R x).
- specialize (H (CauchyMorph R (CauchyMorph_inv R x)) x
- (CauchyMorph_surject R x)) as [_ H].
- exact (H H0).
- - destruct H1. exists (CauchyMorph_inv R x).
- intros y Ey. specialize (H1 (CauchyMorph R y) Ey).
- intros abs. apply H1.
- apply (CauchyMorph_increasing R) in abs.
- apply (CRle_lt_trans R _ (CauchyMorph R (CauchyMorph_inv R x))).
- 2: exact abs. apply (CauchyMorph_surject R x).
- - exists (CauchyMorph R u). destruct ulub. split.
- + intros y Ey abs. specialize (H2 (CauchyMorph_inv R y)).
- simpl in H2.
- specialize (H (CauchyMorph R (CauchyMorph_inv R y)) y
- (CauchyMorph_surject R y)) as [_ H].
- specialize (H2 (H Ey)). apply H2.
- apply CauchyMorph_inv_increasing in abs.
- rewrite CauchyMorph_inject in abs. exact abs.
- + intros. apply (H3 (CauchyMorph_inv R y)).
- intros z Ez abs. specialize (H4 (CauchyMorph R z)).
- apply (H4 Ez). apply (CauchyMorph_increasing R) in abs.
- apply (CRle_lt_trans R _ (CauchyMorph R (CauchyMorph_inv R y))).
- 2: exact abs. apply (CauchyMorph_surject R y).
- apply CauchyMorph_inv_increasing in H5.
- rewrite CauchyMorph_inject in H5. exact H5.
-Qed.
diff --git a/theories/Reals/ConstructiveRealsMorphisms.v b/theories/Reals/ConstructiveRealsMorphisms.v
deleted file mode 100644
index 4af95e2980..0000000000
--- a/theories/Reals/ConstructiveRealsMorphisms.v
+++ /dev/null
@@ -1,1158 +0,0 @@
-(************************************************************************)
-(* * The Coq Proof Assistant / The Coq Development Team *)
-(* v * Copyright INRIA, CNRS and contributors *)
-(* R2 are extensionally equal. We will
- further show that they exist, and so are isomorphisms.
- The difference between two morphisms R1 -> R2 is therefore
- the speed of computation.
-
- The canonical isomorphisms we provide here are often very slow,
- when a new implementation of constructive reals is added,
- it should define its own ad hoc isomorphisms for better speed.
-
- Apart from the speed, those unique isomorphisms also serve as
- sanity checks of the interface ConstructiveReals :
- it captures a concept with a strong notion of uniqueness. *)
-
-Require Import QArith.
-Require Import Qabs.
-Require Import ConstructiveReals.
-Require Import ConstructiveCauchyRealsMult.
-Require Import ConstructiveRcomplete.
-
-
-Record ConstructiveRealsMorphism (R1 R2 : ConstructiveReals) : Set :=
- {
- CRmorph : CRcarrier R1 -> CRcarrier R2;
- CRmorph_rat : forall q : Q,
- orderEq _ (CRlt R2) (CRmorph (CR_of_Q R1 q)) (CR_of_Q R2 q);
- CRmorph_increasing : forall x y : CRcarrier R1,
- CRlt R1 x y -> CRlt R2 (CRmorph x) (CRmorph y);
- }.
-
-
-Lemma CRmorph_increasing_inv
- : forall (R1 R2 : ConstructiveReals)
- (f : ConstructiveRealsMorphism R1 R2)
- (x y : CRcarrier R1),
- CRlt R2 (CRmorph _ _ f x) (CRmorph _ _ f y)
- -> CRlt R1 x y.
-Proof.
- intros. destruct (CR_Q_dense R2 _ _ H) as [q [H0 H1]].
- destruct (CR_Q_dense R2 _ _ H0) as [r [H2 H3]].
- apply lt_CR_of_Q, (CR_of_Q_lt R1) in H3.
- destruct (CRltLinear R1).
- destruct (s _ x _ H3).
- - exfalso. apply (CRmorph_increasing _ _ f) in c.
- destruct (CRmorph_rat _ _ f r) as [H4 _].
- apply (CRle_lt_trans R2 _ _ _ H4) in c. clear H4.
- exact (CRlt_asym R2 _ _ c H2).
- - clear H2 H3 r. apply (CRlt_trans R1 _ _ _ c). clear c.
- destruct (CR_Q_dense R2 _ _ H1) as [t [H2 H3]].
- apply lt_CR_of_Q, (CR_of_Q_lt R1) in H2.
- destruct (s _ y _ H2). exact c.
- exfalso. apply (CRmorph_increasing _ _ f) in c.
- destruct (CRmorph_rat _ _ f t) as [_ H4].
- apply (CRlt_le_trans R2 _ _ _ c) in H4. clear c.
- exact (CRlt_asym R2 _ _ H4 H3).
-Qed.
-
-Lemma CRmorph_unique : forall (R1 R2 : ConstructiveReals)
- (f g : ConstructiveRealsMorphism R1 R2)
- (x : CRcarrier R1),
- orderEq _ (CRlt R2) (CRmorph _ _ f x) (CRmorph _ _ g x).
-Proof.
- split.
- - intro abs. destruct (CR_Q_dense R2 _ _ abs) as [q [H H0]].
- destruct (CRmorph_rat _ _ f q) as [H1 _].
- apply (CRlt_le_trans R2 _ _ _ H) in H1. clear H.
- apply CRmorph_increasing_inv in H1.
- destruct (CRmorph_rat _ _ g q) as [_ H2].
- apply (CRle_lt_trans R2 _ _ _ H2) in H0. clear H2.
- apply CRmorph_increasing_inv in H0.
- exact (CRlt_asym R1 _ _ H0 H1).
- - intro abs. destruct (CR_Q_dense R2 _ _ abs) as [q [H H0]].
- destruct (CRmorph_rat _ _ f q) as [_ H1].
- apply (CRle_lt_trans R2 _ _ _ H1) in H0. clear H1.
- apply CRmorph_increasing_inv in H0.
- destruct (CRmorph_rat _ _ g q) as [H2 _].
- apply (CRlt_le_trans R2 _ _ _ H) in H2. clear H.
- apply CRmorph_increasing_inv in H2.
- exact (CRlt_asym R1 _ _ H0 H2).
-Qed.
-
-
-(* The identity is the only endomorphism of constructive reals.
- For any ConstructiveReals R1, R2 and any morphisms
- f : R1 -> R2 and g : R2 -> R1,
- f and g are isomorphisms and are inverses of each other. *)
-Lemma Endomorph_id : forall (R : ConstructiveReals) (f : ConstructiveRealsMorphism R R)
- (x : CRcarrier R),
- orderEq _ (CRlt R) (CRmorph _ _ f x) x.
-Proof.
- split.
- - intro abs. destruct (CR_Q_dense R _ _ abs) as [q [H0 H1]].
- destruct (CRmorph_rat _ _ f q) as [H _].
- apply (CRlt_le_trans R _ _ _ H0) in H. clear H0.
- apply CRmorph_increasing_inv in H.
- exact (CRlt_asym R _ _ H1 H).
- - intro abs. destruct (CR_Q_dense R _ _ abs) as [q [H0 H1]].
- destruct (CRmorph_rat _ _ f q) as [_ H].
- apply (CRle_lt_trans R _ _ _ H) in H1. clear H.
- apply CRmorph_increasing_inv in H1.
- exact (CRlt_asym R _ _ H1 H0).
-Qed.
-
-Lemma CRmorph_proper : forall (R1 R2 : ConstructiveReals)
- (f : ConstructiveRealsMorphism R1 R2)
- (x y : CRcarrier R1),
- orderEq _ (CRlt R1) x y
- -> orderEq _ (CRlt R2) (CRmorph _ _ f x) (CRmorph _ _ f y).
-Proof.
- split.
- - intro abs. apply CRmorph_increasing_inv in abs.
- destruct H. contradiction.
- - intro abs. apply CRmorph_increasing_inv in abs.
- destruct H. contradiction.
-Qed.
-
-Definition CRmorph_compose (R1 R2 R3 : ConstructiveReals)
- (f : ConstructiveRealsMorphism R1 R2)
- (g : ConstructiveRealsMorphism R2 R3)
- : ConstructiveRealsMorphism R1 R3.
-Proof.
- apply (Build_ConstructiveRealsMorphism
- R1 R3 (fun x:CRcarrier R1 => CRmorph _ _ g (CRmorph _ _ f x))).
- - intro q. apply (CReq_trans R3 _ (CRmorph R2 R3 g (CR_of_Q R2 q))).
- apply CRmorph_proper. apply CRmorph_rat. apply CRmorph_rat.
- - intros. apply CRmorph_increasing. apply CRmorph_increasing. exact H.
-Defined.
-
-Lemma CRmorph_le : forall (R1 R2 : ConstructiveReals)
- (f : ConstructiveRealsMorphism R1 R2)
- (x y : CRcarrier R1),
- orderLe _ (CRlt R1) x y
- -> orderLe _ (CRlt R2) (CRmorph _ _ f x) (CRmorph _ _ f y).
-Proof.
- intros. intro abs. apply CRmorph_increasing_inv in abs. contradiction.
-Qed.
-
-Lemma CRmorph_le_inv : forall (R1 R2 : ConstructiveReals)
- (f : ConstructiveRealsMorphism R1 R2)
- (x y : CRcarrier R1),
- orderLe _ (CRlt R2) (CRmorph _ _ f x) (CRmorph _ _ f y)
- -> orderLe _ (CRlt R1) x y.
-Proof.
- intros. intro abs. apply (CRmorph_increasing _ _ f) in abs. contradiction.
-Qed.
-
-Lemma CRmorph_zero : forall (R1 R2 : ConstructiveReals)
- (f : ConstructiveRealsMorphism R1 R2),
- orderEq _ (CRlt R2) (CRmorph _ _ f (CRzero R1)) (CRzero R2).
-Proof.
- intros. apply (CReq_trans R2 _ (CRmorph _ _ f (CR_of_Q R1 0))).
- apply CRmorph_proper. apply CReq_sym, CR_of_Q_zero.
- apply (CReq_trans R2 _ (CR_of_Q R2 0)).
- apply CRmorph_rat. apply CR_of_Q_zero.
-Qed.
-
-Lemma CRmorph_one : forall (R1 R2 : ConstructiveReals)
- (f : ConstructiveRealsMorphism R1 R2),
- orderEq _ (CRlt R2) (CRmorph _ _ f (CRone R1)) (CRone R2).
-Proof.
- intros. apply (CReq_trans R2 _ (CRmorph _ _ f (CR_of_Q R1 1))).
- apply CRmorph_proper. apply CReq_sym, CR_of_Q_one.
- apply (CReq_trans R2 _ (CR_of_Q R2 1)).
- apply CRmorph_rat. apply CR_of_Q_one.
-Qed.
-
-Lemma CRmorph_opp : forall (R1 R2 : ConstructiveReals)
- (f : ConstructiveRealsMorphism R1 R2)
- (x : CRcarrier R1),
- orderEq _ (CRlt R2) (CRmorph _ _ f (CRopp R1 x))
- (CRopp R2 (CRmorph _ _ f x)).
-Proof.
- split.
- - intro abs.
- destruct (CR_Q_dense R2 _ _ abs) as [q [H H0]]. clear abs.
- destruct (CRmorph_rat R1 R2 f q) as [H1 _].
- apply (CRlt_le_trans R2 _ _ _ H) in H1. clear H.
- apply CRmorph_increasing_inv in H1.
- apply CRopp_gt_lt_contravar in H0.
- destruct (CR_of_Q_opp R2 q) as [H2 _].
- apply (CRlt_le_trans R2 _ _ _ H0) in H2. clear H0.
- pose proof (CRopp_involutive R2 (CRmorph R1 R2 f x)) as [H _].
- apply (CRle_lt_trans R2 _ _ _ H) in H2. clear H.
- destruct (CRmorph_rat R1 R2 f (-q)) as [H _].
- apply (CRlt_le_trans R2 _ _ _ H2) in H. clear H2.
- apply CRmorph_increasing_inv in H.
- destruct (CR_of_Q_opp R1 q) as [_ H2].
- apply (CRlt_le_trans R1 _ _ _ H) in H2. clear H.
- apply CRopp_gt_lt_contravar in H2.
- pose proof (CRopp_involutive R1 (CR_of_Q R1 q)) as [H _].
- apply (CRle_lt_trans R1 _ _ _ H) in H2. clear H.
- exact (CRlt_asym R1 _ _ H1 H2).
- - intro abs.
- destruct (CR_Q_dense R2 _ _ abs) as [q [H H0]]. clear abs.
- destruct (CRmorph_rat R1 R2 f q) as [_ H1].
- apply (CRle_lt_trans R2 _ _ _ H1) in H0. clear H1.
- apply CRmorph_increasing_inv in H0.
- apply CRopp_gt_lt_contravar in H.
- pose proof (CRopp_involutive R2 (CRmorph R1 R2 f x)) as [_ H1].
- apply (CRlt_le_trans R2 _ _ _ H) in H1. clear H.
- destruct (CR_of_Q_opp R2 q) as [_ H2].
- apply (CRle_lt_trans R2 _ _ _ H2) in H1. clear H2.
- destruct (CRmorph_rat R1 R2 f (-q)) as [_ H].
- apply (CRle_lt_trans R2 _ _ _ H) in H1. clear H.
- apply CRmorph_increasing_inv in H1.
- destruct (CR_of_Q_opp R1 q) as [H2 _].
- apply (CRle_lt_trans R1 _ _ _ H2) in H1. clear H2.
- apply CRopp_gt_lt_contravar in H1.
- pose proof (CRopp_involutive R1 (CR_of_Q R1 q)) as [_ H].
- apply (CRlt_le_trans R1 _ _ _ H1) in H. clear H1.
- exact (CRlt_asym R1 _ _ H0 H).
-Qed.
-
-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)).
-Proof.
- intros.
- apply (CRle_lt_trans R _ (CRplus R x (CRzero R))). apply CRplus_0_r.
- apply CRplus_lt_compat_l.
- apply (CRle_lt_trans R _ (CR_of_Q R 0)). apply CR_of_Q_zero.
- apply CR_of_Q_lt. exact H.
-Defined.
-
-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.
-Proof.
- intros.
- apply (CRlt_le_trans R _ (CRplus R x (CRzero R))). 2: apply CRplus_0_r.
- apply CRplus_lt_compat_l.
- apply (CRlt_le_trans R _ (CR_of_Q R 0)).
- apply CR_of_Q_lt. exact H. apply CR_of_Q_zero.
-Qed.
-
-Lemma CRmorph_plus_rat : forall (R1 R2 : ConstructiveReals)
- (f : ConstructiveRealsMorphism R1 R2)
- (x : CRcarrier R1) (q : Q),
- orderEq _ (CRlt R2) (CRmorph _ _ f (CRplus R1 x (CR_of_Q R1 q)))
- (CRplus R2 (CRmorph _ _ f x) (CR_of_Q R2 q)).
-Proof.
- split.
- - intro abs.
- destruct (CR_Q_dense R2 _ _ abs) as [r [H H0]]. clear abs.
- destruct (CRmorph_rat _ _ f r) as [H1 _].
- apply (CRlt_le_trans R2 _ _ _ H) in H1. clear H.
- apply CRmorph_increasing_inv in H1.
- apply (CRlt_asym R1 _ _ H1). clear H1.
- apply (CRplus_lt_reg_r R1 (CRopp R1 (CR_of_Q R1 q))).
- apply (CRlt_le_trans R1 _ x).
- apply (CRle_lt_trans R1 _ (CR_of_Q R1 (r-q))).
- apply (CRle_trans R1 _ (CRplus R1 (CR_of_Q R1 r) (CR_of_Q R1 (-q)))).
- apply CRplus_le_compat_l. destruct (CR_of_Q_opp R1 q). exact H.
- destruct (CR_of_Q_plus R1 r (-q)). exact H.
- apply (CRmorph_increasing_inv _ _ f).
- apply (CRle_lt_trans R2 _ (CR_of_Q R2 (r - q))).
- apply CRmorph_rat.
- apply (CRplus_lt_reg_r R2 (CR_of_Q R2 q)).
- apply (CRle_lt_trans R2 _ (CR_of_Q R2 r)). 2: exact H0.
- intro H.
- destruct (CR_of_Q_plus R2 (r-q) q) as [H1 _].
- apply (CRlt_le_trans R2 _ _ _ H) in H1. clear H.
- apply lt_CR_of_Q in H1. ring_simplify in H1.
- exact (Qlt_not_le _ _ H1 (Qle_refl _)).
- destruct (CRisRing R1).
- apply (CRle_trans R1 _ (CRplus R1 x (CRplus R1 (CR_of_Q R1 q) (CRopp R1 (CR_of_Q R1 q))))).
- apply (CRle_trans R1 _ (CRplus R1 x (CRzero R1))).
- destruct (CRplus_0_r R1 x). exact H.
- apply CRplus_le_compat_l. destruct (Ropp_def (CR_of_Q R1 q)). exact H.
- destruct (Radd_assoc x (CR_of_Q R1 q) (CRopp R1 (CR_of_Q R1 q))).
- exact H1.
- - intro abs.
- destruct (CR_Q_dense R2 _ _ abs) as [r [H H0]]. clear abs.
- destruct (CRmorph_rat _ _ f r) as [_ H1].
- apply (CRle_lt_trans R2 _ _ _ H1) in H0. clear H1.
- apply CRmorph_increasing_inv in H0.
- apply (CRlt_asym R1 _ _ H0). clear H0.
- apply (CRplus_lt_reg_r R1 (CRopp R1 (CR_of_Q R1 q))).
- apply (CRle_lt_trans R1 _ x).
- destruct (CRisRing R1).
- apply (CRle_trans R1 _ (CRplus R1 x (CRplus R1 (CR_of_Q R1 q) (CRopp R1 (CR_of_Q R1 q))))).
- destruct (Radd_assoc x (CR_of_Q R1 q) (CRopp R1 (CR_of_Q R1 q))).
- exact H0.
- apply (CRle_trans R1 _ (CRplus R1 x (CRzero R1))).
- apply CRplus_le_compat_l. destruct (Ropp_def (CR_of_Q R1 q)). exact H1.
- destruct (CRplus_0_r R1 x). exact H1.
- apply (CRlt_le_trans R1 _ (CR_of_Q R1 (r-q))).
- apply (CRmorph_increasing_inv _ _ f).
- apply (CRlt_le_trans R2 _ (CR_of_Q R2 (r - q))).
- apply (CRplus_lt_reg_r R2 (CR_of_Q R2 q)).
- apply (CRlt_le_trans R2 _ _ _ H).
- 2: apply CRmorph_rat.
- apply (CRle_trans R2 _ (CR_of_Q R2 (r-q+q))).
- intro abs. apply lt_CR_of_Q in abs. ring_simplify in abs.
- exact (Qlt_not_le _ _ abs (Qle_refl _)).
- destruct (CR_of_Q_plus R2 (r-q) q). exact H1.
- apply (CRle_trans R1 _ (CRplus R1 (CR_of_Q R1 r) (CR_of_Q R1 (-q)))).
- destruct (CR_of_Q_plus R1 r (-q)). exact H1.
- apply CRplus_le_compat_l. destruct (CR_of_Q_opp R1 q). exact H1.
-Qed.
-
-Lemma CRmorph_plus : forall (R1 R2 : ConstructiveReals)
- (f : ConstructiveRealsMorphism R1 R2)
- (x y : CRcarrier R1),
- orderEq _ (CRlt R2) (CRmorph _ _ f (CRplus R1 x y))
- (CRplus R2 (CRmorph _ _ f x) (CRmorph _ _ f y)).
-Proof.
- intros R1 R2 f.
- assert (forall (x y : CRcarrier R1),
- orderLe _ (CRlt R2) (CRplus R2 (CRmorph R1 R2 f x) (CRmorph R1 R2 f y))
- (CRmorph R1 R2 f (CRplus R1 x y))).
- { intros x y abs. destruct (CR_Q_dense R2 _ _ abs) as [r [H H0]]. clear abs.
- destruct (CRmorph_rat _ _ f r) as [H1 _].
- apply (CRlt_le_trans R2 _ _ _ H) in H1. clear H.
- apply CRmorph_increasing_inv in H1.
- apply (CRlt_asym R1 _ _ H1). clear H1.
- destruct (CR_Q_dense R2 _ _ H0) as [q [H2 H3]].
- apply lt_CR_of_Q in H2.
- assert (Qlt (r-q) 0) as epsNeg.
- { apply (Qplus_lt_r _ _ q). ring_simplify. exact H2. }
- destruct (CR_Q_dense R1 _ _ (CRplus_neg_rat_lt R1 x (r-q) epsNeg))
- as [s [H4 H5]].
- apply (CRlt_trans R1 _ (CRplus R1 (CR_of_Q R1 s) y)).
- 2: apply CRplus_lt_compat_r, H5.
- apply (CRmorph_increasing_inv _ _ f).
- apply (CRlt_le_trans R2 _ (CRplus R2 (CR_of_Q R2 s) (CRmorph _ _ f y))).
- apply (CRmorph_increasing _ _ f) in H4.
- destruct (CRmorph_plus_rat _ _ f x (r-q)) as [H _].
- apply (CRle_lt_trans R2 _ _ _ H) in H4. clear H.
- destruct (CRmorph_rat _ _ f s) as [_ H1].
- apply (CRlt_le_trans R2 _ _ _ H4) in H1. clear H4.
- apply (CRlt_trans R2 _ (CRplus R2 (CRplus R2 (CRmorph R1 R2 f x) (CR_of_Q R2 (r - q)))
- (CRmorph R1 R2 f y))).
- 2: apply CRplus_lt_compat_r, H1.
- apply (CRlt_le_trans R2 _ (CRplus R2 (CRplus R2 (CR_of_Q R2 (r - q)) (CRmorph R1 R2 f x))
- (CRmorph R1 R2 f y))).
- apply (CRlt_le_trans R2 _ (CRplus R2 (CR_of_Q R2 (r - q))
- (CRplus R2 (CRmorph R1 R2 f x) (CRmorph R1 R2 f y)))).
- apply (CRle_lt_trans R2 _ (CRplus R2 (CR_of_Q R2 (r - q)) (CR_of_Q R2 q))).
- 2: apply CRplus_lt_compat_l, H3.
- intro abs.
- destruct (CR_of_Q_plus R2 (r-q) q) as [_ H4].
- apply (CRle_lt_trans R2 _ _ _ H4) in abs. clear H4.
- destruct (CRmorph_rat _ _ f r) as [_ H4].
- apply (CRlt_le_trans R2 _ _ _ abs) in H4. clear abs.
- apply lt_CR_of_Q in H4. ring_simplify in H4.
- exact (Qlt_not_le _ _ H4 (Qle_refl _)).
- destruct (CRisRing R2); apply Radd_assoc.
- apply CRplus_le_compat_r. destruct (CRisRing R2).
- destruct (Radd_comm (CRmorph R1 R2 f x) (CR_of_Q R2 (r - q))).
- exact H.
- intro abs.
- destruct (CRmorph_plus_rat _ _ f y s) as [H _]. apply H. clear H.
- apply (CRlt_le_trans R2 _ (CRplus R2 (CR_of_Q R2 s) (CRmorph R1 R2 f y))).
- apply (CRle_lt_trans R2 _ (CRmorph R1 R2 f (CRplus R1 (CR_of_Q R1 s) y))).
- apply CRmorph_proper. destruct (CRisRing R1); apply Radd_comm.
- exact abs. destruct (CRisRing R2); apply Radd_comm. }
- split.
- - apply H.
- - specialize (H (CRplus R1 x y) (CRopp R1 y)).
- intro abs. apply H. clear H.
- apply (CRle_lt_trans R2 _ (CRmorph R1 R2 f x)).
- apply CRmorph_proper. destruct (CRisRing R1).
- apply (CReq_trans R1 _ (CRplus R1 x (CRplus R1 y (CRopp R1 y)))).
- apply CReq_sym, Radd_assoc.
- apply (CReq_trans R1 _ (CRplus R1 x (CRzero R1))). 2: apply CRplus_0_r.
- destruct (CRisRingExt R1). apply Radd_ext.
- apply CReq_refl. apply Ropp_def.
- apply (CRplus_lt_reg_r R2 (CRmorph R1 R2 f y)).
- apply (CRlt_le_trans R2 _ _ _ abs). clear abs.
- apply (CRle_trans R2 _ (CRplus R2 (CRmorph R1 R2 f (CRplus R1 x y)) (CRzero R2))).
- destruct (CRplus_0_r R2 (CRmorph R1 R2 f (CRplus R1 x y))). exact H.
- apply (CRle_trans R2 _ (CRplus R2 (CRmorph R1 R2 f (CRplus R1 x y))
- (CRplus R2 (CRmorph R1 R2 f (CRopp R1 y)) (CRmorph R1 R2 f y)))).
- apply CRplus_le_compat_l.
- apply (CRle_trans R2 _ (CRplus R2 (CRopp R2 (CRmorph R1 R2 f y)) (CRmorph R1 R2 f y))).
- destruct (CRplus_opp_l R2 (CRmorph R1 R2 f y)). exact H.
- apply CRplus_le_compat_r. destruct (CRmorph_opp _ _ f y). exact H.
- destruct (CRisRing R2).
- destruct (Radd_assoc (CRmorph R1 R2 f (CRplus R1 x y))
- (CRmorph R1 R2 f (CRopp R1 y)) (CRmorph R1 R2 f y)).
- exact H0.
-Qed.
-
-Lemma CRmorph_mult_pos : forall (R1 R2 : ConstructiveReals)
- (f : ConstructiveRealsMorphism R1 R2)
- (x : CRcarrier R1) (n : nat),
- orderEq _ (CRlt R2) (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))).
-Proof.
- induction n.
- - simpl. destruct (CRisRingExt R1).
- apply (CReq_trans R2 _ (CRzero R2)).
- + apply (CReq_trans R2 _ (CRmorph R1 R2 f (CRzero R1))).
- 2: apply CRmorph_zero. apply CRmorph_proper.
- apply (CReq_trans R1 _ (CRmult R1 x (CRzero R1))).
- 2: apply CRmult_0_r. apply Rmul_ext. apply CReq_refl. apply CR_of_Q_zero.
- + apply (CReq_trans R2 _ (CRmult R2 (CRmorph R1 R2 f x) (CRzero R2))).
- apply CReq_sym, CRmult_0_r. destruct (CRisRingExt R2).
- apply Rmul_ext0. apply CReq_refl. apply CReq_sym, CR_of_Q_zero.
- - destruct (CRisRingExt R1), (CRisRingExt R2).
- apply (CReq_trans
- R2 _ (CRmorph R1 R2 f (CRplus R1 x (CRmult R1 x (CR_of_Q R1 (Z.of_nat n # 1)))))).
- apply CRmorph_proper.
- apply (CReq_trans R1 _ (CRmult R1 x (CRplus R1 (CRone R1) (CR_of_Q R1 (Z.of_nat n # 1))))).
- apply Rmul_ext. apply CReq_refl.
- apply (CReq_trans R1 _ (CR_of_Q R1 (1 + (Z.of_nat n # 1)))).
- apply CR_of_Q_proper. rewrite Nat2Z.inj_succ. unfold Z.succ.
- rewrite Z.add_comm. rewrite Qinv_plus_distr. reflexivity.
- apply (CReq_trans R1 _ (CRplus R1 (CR_of_Q R1 1) (CR_of_Q R1 (Z.of_nat n # 1)))).
- apply CR_of_Q_plus. apply Radd_ext. apply CR_of_Q_one. apply CReq_refl.
- apply (CReq_trans R1 _ (CRplus R1 (CRmult R1 x (CRone R1))
- (CRmult R1 x (CR_of_Q R1 (Z.of_nat n # 1))))).
- apply CRmult_plus_distr_l. apply Radd_ext. apply CRmult_1_r. apply CReq_refl.
- apply (CReq_trans R2 _ (CRplus R2 (CRmorph R1 R2 f x)
- (CRmorph R1 R2 f (CRmult R1 x (CR_of_Q R1 (Z.of_nat n # 1)))))).
- apply CRmorph_plus.
- apply (CReq_trans R2 _ (CRplus R2 (CRmorph R1 R2 f x)
- (CRmult R2 (CRmorph R1 R2 f x) (CR_of_Q R2 (Z.of_nat n # 1))))).
- apply Radd_ext0. apply CReq_refl. exact IHn.
- apply (CReq_trans R2 _ (CRmult R2 (CRmorph R1 R2 f x) (CRplus R2 (CRone R2) (CR_of_Q R2 (Z.of_nat n # 1))))).
- apply (CReq_trans R2 _ (CRplus R2 (CRmult R2 (CRmorph R1 R2 f x) (CRone R2))
- (CRmult R2 (CRmorph _ _ f x) (CR_of_Q R2 (Z.of_nat n # 1))))).
- apply Radd_ext0. 2: apply CReq_refl. apply CReq_sym, CRmult_1_r.
- apply CReq_sym, CRmult_plus_distr_l.
- apply Rmul_ext0. apply CReq_refl.
- apply (CReq_trans R2 _ (CR_of_Q R2 (1 + (Z.of_nat n # 1)))).
- apply (CReq_trans R2 _ (CRplus R2 (CR_of_Q R2 1) (CR_of_Q R2 (Z.of_nat n # 1)))).
- apply Radd_ext0. apply CReq_sym, CR_of_Q_one. apply CReq_refl.
- apply CReq_sym, CR_of_Q_plus.
- apply CR_of_Q_proper. rewrite Nat2Z.inj_succ. unfold Z.succ.
- rewrite Z.add_comm. rewrite Qinv_plus_distr. reflexivity.
-Qed.
-
-Lemma NatOfZ : forall n : Z, { p : nat | n = Z.of_nat p \/ n = Z.opp (Z.of_nat p) }.
-Proof.
- intros [|p|n].
- - exists O. left. reflexivity.
- - exists (Pos.to_nat p). left. rewrite positive_nat_Z. reflexivity.
- - exists (Pos.to_nat n). right. rewrite positive_nat_Z. reflexivity.
-Qed.
-
-Lemma CRmorph_mult_int : forall (R1 R2 : ConstructiveReals)
- (f : ConstructiveRealsMorphism R1 R2)
- (x : CRcarrier R1) (n : Z),
- orderEq _ (CRlt R2) (CRmorph _ _ f (CRmult R1 x (CR_of_Q R1 (n # 1))))
- (CRmult R2 (CRmorph _ _ f x) (CR_of_Q R2 (n # 1))).
-Proof.
- intros. destruct (NatOfZ n) as [p [pos|neg]].
- - subst n. apply CRmorph_mult_pos.
- - subst n.
- apply (CReq_trans R2 _ (CRopp R2 (CRmorph R1 R2 f (CRmult R1 x (CR_of_Q R1 (Z.of_nat p # 1)))))).
- + apply (CReq_trans R2 _ (CRmorph R1 R2 f (CRopp R1 (CRmult R1 x (CR_of_Q R1 (Z.of_nat p # 1)))))).
- 2: apply CRmorph_opp. apply CRmorph_proper.
- apply (CReq_trans R1 _ (CRmult R1 x (CR_of_Q R1 (- (Z.of_nat p # 1))))).
- destruct (CRisRingExt R1). apply Rmul_ext. apply CReq_refl.
- apply CR_of_Q_proper. reflexivity.
- apply (CReq_trans R1 _ (CRmult R1 x (CRopp R1 (CR_of_Q R1 (Z.of_nat p # 1))))).
- destruct (CRisRingExt R1). apply Rmul_ext. apply CReq_refl.
- apply CR_of_Q_opp. apply CReq_sym, CRopp_mult_distr_r.
- + apply (CReq_trans R2 _ (CRopp R2 (CRmult R2 (CRmorph R1 R2 f x) (CR_of_Q R2 (Z.of_nat p # 1))))).
- destruct (CRisRingExt R2). apply Ropp_ext. apply CRmorph_mult_pos.
- apply (CReq_trans R2 _ (CRmult R2 (CRmorph R1 R2 f x) (CRopp R2 (CR_of_Q R2 (Z.of_nat p # 1))))).
- apply CRopp_mult_distr_r. destruct (CRisRingExt R2).
- apply Rmul_ext. apply CReq_refl.
- apply (CReq_trans R2 _ (CR_of_Q R2 (- (Z.of_nat p # 1)))).
- apply CReq_sym, CR_of_Q_opp. apply CR_of_Q_proper. reflexivity.
-Qed.
-
-Lemma CRmorph_mult_inv : forall (R1 R2 : ConstructiveReals)
- (f : ConstructiveRealsMorphism R1 R2)
- (x : CRcarrier R1) (p : positive),
- orderEq _ (CRlt R2) (CRmorph _ _ f (CRmult R1 x (CR_of_Q R1 (1 # p))))
- (CRmult R2 (CRmorph _ _ f x) (CR_of_Q R2 (1 # p))).
-Proof.
- intros. apply (CRmult_eq_reg_r R2 (CR_of_Q R2 (Z.pos p # 1))).
- left. apply (CRle_lt_trans R2 _ (CR_of_Q R2 0)).
- apply CR_of_Q_zero. apply CR_of_Q_lt. reflexivity.
- apply (CReq_trans R2 _ (CRmorph _ _ f x)).
- - apply (CReq_trans
- R2 _ (CRmorph R1 R2 f (CRmult R1 (CRmult R1 x (CR_of_Q R1 (1 # p)))
- (CR_of_Q R1 (Z.pos p # 1))))).
- apply CReq_sym, CRmorph_mult_int. apply CRmorph_proper.
- apply (CReq_trans
- R1 _ (CRmult R1 x (CRmult R1 (CR_of_Q R1 (1 # p))
- (CR_of_Q R1 (Z.pos p # 1))))).
- destruct (CRisRing R1). apply CReq_sym, Rmul_assoc.
- apply (CReq_trans R1 _ (CRmult R1 x (CRone R1))).
- apply (Rmul_ext (CRisRingExt R1)). apply CReq_refl.
- apply (CReq_trans R1 _ (CR_of_Q R1 ((1#p) * (Z.pos p # 1)))).
- apply CReq_sym, CR_of_Q_mult.
- apply (CReq_trans R1 _ (CR_of_Q R1 1)).
- apply CR_of_Q_proper. reflexivity. apply CR_of_Q_one.
- apply CRmult_1_r.
- - apply (CReq_trans R2 _ (CRmult R2 (CRmorph R1 R2 f x)
- (CRmult R2 (CR_of_Q R2 (1 # p)) (CR_of_Q R2 (Z.pos p # 1))))).
- 2: apply (Rmul_assoc (CRisRing R2)).
- apply (CReq_trans R2 _ (CRmult R2 (CRmorph R1 R2 f x) (CRone R2))).
- apply CReq_sym, CRmult_1_r.
- apply (Rmul_ext (CRisRingExt R2)). apply CReq_refl.
- apply (CReq_trans R2 _ (CR_of_Q R2 1)).
- apply CReq_sym, CR_of_Q_one.
- apply (CReq_trans R2 _ (CR_of_Q R2 ((1#p)*(Z.pos p # 1)))).
- apply CR_of_Q_proper. reflexivity. apply CR_of_Q_mult.
-Qed.
-
-Lemma CRmorph_mult_rat : forall (R1 R2 : ConstructiveReals)
- (f : ConstructiveRealsMorphism R1 R2)
- (x : CRcarrier R1) (q : Q),
- orderEq _ (CRlt R2) (CRmorph _ _ f (CRmult R1 x (CR_of_Q R1 q)))
- (CRmult R2 (CRmorph _ _ f x) (CR_of_Q R2 q)).
-Proof.
- intros. destruct q as [a b].
- apply (CReq_trans R2 _ (CRmult R2 (CRmorph _ _ f (CRmult R1 x (CR_of_Q R1 (a # 1))))
- (CR_of_Q R2 (1 # b)))).
- - apply (CReq_trans
- R2 _ (CRmorph R1 R2 f (CRmult R1 (CRmult R1 x (CR_of_Q R1 (a # 1)))
- (CR_of_Q R1 (1 # b))))).
- 2: apply CRmorph_mult_inv. apply CRmorph_proper.
- apply (CReq_trans R1 _ (CRmult R1 x (CRmult R1 (CR_of_Q R1 (a # 1))
- (CR_of_Q R1 (1 # b))))).
- apply (Rmul_ext (CRisRingExt R1)). apply CReq_refl.
- apply (CReq_trans R1 _ (CR_of_Q R1 ((a#1)*(1#b)))).
- apply CR_of_Q_proper. unfold Qeq; simpl. rewrite Z.mul_1_r. reflexivity.
- apply CR_of_Q_mult.
- apply (Rmul_assoc (CRisRing R1)).
- - apply (CReq_trans R2 _ (CRmult R2 (CRmult R2 (CRmorph _ _ f x) (CR_of_Q R2 (a # 1)))
- (CR_of_Q R2 (1 # b)))).
- apply (Rmul_ext (CRisRingExt R2)). apply CRmorph_mult_int.
- apply CReq_refl.
- apply (CReq_trans R2 _ (CRmult R2 (CRmorph R1 R2 f x)
- (CRmult R2 (CR_of_Q R2 (a # 1)) (CR_of_Q R2 (1 # b))))).
- apply CReq_sym, (Rmul_assoc (CRisRing R2)).
- apply (Rmul_ext (CRisRingExt R2)). apply CReq_refl.
- apply (CReq_trans R2 _ (CR_of_Q R2 ((a#1)*(1#b)))).
- apply CReq_sym, CR_of_Q_mult.
- apply CR_of_Q_proper. unfold Qeq; simpl. rewrite Z.mul_1_r. reflexivity.
-Qed.
-
-Lemma CRmorph_mult_pos_pos_le : forall (R1 R2 : ConstructiveReals)
- (f : ConstructiveRealsMorphism R1 R2)
- (x y : CRcarrier R1),
- CRlt R1 (CRzero R1) y
- -> orderLe _ (CRlt R2) (CRmult R2 (CRmorph _ _ f x) (CRmorph _ _ f y))
- (CRmorph _ _ f (CRmult R1 x y)).
-Proof.
- intros. intro abs. destruct (CR_Q_dense R2 _ _ abs) as [q [H1 H2]].
- destruct (CRmorph_rat _ _ f q) as [H3 _].
- apply (CRlt_le_trans R2 _ _ _ H1) in H3. clear H1.
- apply CRmorph_increasing_inv in H3.
- apply (CRlt_asym R1 _ _ H3). clear H3.
- destruct (CR_Q_dense R2 _ _ H2) as [r [H1 H3]].
- apply lt_CR_of_Q in H1.
- destruct (CR_archimedean R1 y) as [A Amaj].
- assert (/ ((r - q) * (1 # A)) * (q - r) == - (Z.pos A # 1)) as diveq.
- { rewrite Qinv_mult_distr. setoid_replace (q-r) with (-1*(r-q)).
- field_simplify. reflexivity. 2: field.
- split. intro H4. inversion H4. intro H4.
- apply Qlt_minus_iff in H1. rewrite H4 in H1. inversion H1. }
- destruct (CR_Q_dense R1 (CRplus R1 x (CR_of_Q R1 ((q-r) * (1#A)))) x)
- as [s [H4 H5]].
- - apply (CRlt_le_trans R1 _ (CRplus R1 x (CRzero R1))).
- 2: apply CRplus_0_r. apply CRplus_lt_compat_l.
- apply (CRplus_lt_reg_l R1 (CR_of_Q R1 ((r-q) * (1#A)))).
- apply (CRle_lt_trans R1 _ (CRzero R1)).
- apply (CRle_trans R1 _ (CR_of_Q R1 ((r-q)*(1#A) + (q-r)*(1#A)))).
- destruct (CR_of_Q_plus R1 ((r-q)*(1#A)) ((q-r)*(1#A))).
- exact H0. apply (CRle_trans R1 _ (CR_of_Q R1 0)).
- 2: destruct (CR_of_Q_zero R1); exact H4.
- intro H4. apply lt_CR_of_Q in H4. ring_simplify in H4.
- inversion H4.
- apply (CRlt_le_trans R1 _ (CR_of_Q R1 ((r - q) * (1 # A)))).
- 2: apply CRplus_0_r.
- apply (CRle_lt_trans R1 _ (CR_of_Q R1 0)).
- apply CR_of_Q_zero. apply CR_of_Q_lt.
- rewrite <- (Qmult_0_r (r-q)). apply Qmult_lt_l.
- apply Qlt_minus_iff in H1. exact H1. reflexivity.
- - apply (CRmorph_increasing _ _ f) in H4.
- destruct (CRmorph_plus _ _ f x (CR_of_Q R1 ((q-r) * (1#A)))) as [H6 _].
- apply (CRle_lt_trans R2 _ _ _ H6) in H4. clear H6.
- destruct (CRmorph_rat _ _ f s) as [_ H6].
- apply (CRlt_le_trans R2 _ _ _ H4) in H6. clear H4.
- apply (CRmult_lt_compat_r R2 (CRmorph _ _ f y)) in H6.
- destruct (Rdistr_l (CRisRing R2) (CRmorph _ _ f x)
- (CRmorph R1 R2 f (CR_of_Q R1 ((q-r) * (1#A))))
- (CRmorph _ _ f y)) as [H4 _].
- apply (CRle_lt_trans R2 _ _ _ H4) in H6. clear H4.
- apply (CRle_lt_trans R1 _ (CRmult R1 (CR_of_Q R1 s) y)).
- 2: apply CRmult_lt_compat_r. 2: exact H. 2: exact H5.
- apply (CRmorph_le_inv _ _ f).
- apply (CRle_trans R2 _ (CR_of_Q R2 q)).
- destruct (CRmorph_rat _ _ f q). exact H4.
- apply (CRle_trans R2 _ (CRmult R2 (CR_of_Q R2 s) (CRmorph _ _ f y))).
- apply (CRle_trans R2 _ (CRplus R2 (CRmult R2 (CRmorph _ _ f x) (CRmorph _ _ f y))
- (CR_of_Q R2 (q-r)))).
- apply (CRle_trans R2 _ (CRplus R2 (CR_of_Q R2 r) (CR_of_Q R2 (q - r)))).
- + apply (CRle_trans R2 _ (CR_of_Q R2 (r + (q-r)))).
- intro H4. apply lt_CR_of_Q in H4. ring_simplify in H4.
- exact (Qlt_not_le q q H4 (Qle_refl q)).
- destruct (CR_of_Q_plus R2 r (q-r)). exact H4.
- + apply CRplus_le_compat_r. intro H4.
- apply (CRlt_asym R2 _ _ H3). exact H4.
- + intro H4. apply (CRlt_asym R2 _ _ H4). clear H4.
- apply (CRlt_trans_flip R2 _ _ _ H6). clear H6.
- apply CRplus_lt_compat_l.
- apply (CRlt_le_trans R2 _ (CRmult R2 (CR_of_Q R2 ((q - r) * (1 # A))) (CRmorph R1 R2 f y))).
- apply (CRmult_lt_reg_l R2 (CR_of_Q R2 (/((r-q)*(1#A))))).
- apply (CRle_lt_trans R2 _ (CR_of_Q R2 0)). apply CR_of_Q_zero.
- apply CR_of_Q_lt, Qinv_lt_0_compat.
- rewrite <- (Qmult_0_r (r-q)). apply Qmult_lt_l.
- apply Qlt_minus_iff in H1. exact H1. reflexivity.
- apply (CRle_lt_trans R2 _ (CRopp R2 (CR_of_Q R2 (Z.pos A # 1)))).
- apply (CRle_trans R2 _ (CR_of_Q R2 (-(Z.pos A # 1)))).
- apply (CRle_trans R2 _ (CR_of_Q R2 ((/ ((r - q) * (1 # A))) * (q - r)))).
- destruct (CR_of_Q_mult R2 (/ ((r - q) * (1 # A))) (q - r)).
- exact H0. destruct (CR_of_Q_proper R2 (/ ((r - q) * (1 # A)) * (q - r))
- (-(Z.pos A # 1))).
- exact diveq. intro H7. apply lt_CR_of_Q in H7.
- rewrite diveq in H7. exact (Qlt_not_le _ _ H7 (Qle_refl _)).
- destruct (CR_of_Q_opp R2 (Z.pos A # 1)). exact H4.
- apply (CRlt_le_trans R2 _ (CRopp R2 (CRmorph _ _ f y))).
- apply CRopp_gt_lt_contravar.
- apply (CRlt_le_trans R2 _ (CRmorph _ _ f (CR_of_Q R1 (Z.pos A # 1)))).
- apply CRmorph_increasing. exact Amaj.
- destruct (CRmorph_rat _ _ f (Z.pos A # 1)). exact H4.
- apply (CRle_trans R2 _ (CRmult R2 (CRopp R2 (CRone R2)) (CRmorph _ _ f y))).
- apply (CRle_trans R2 _ (CRopp R2 (CRmult R2 (CRone R2) (CRmorph R1 R2 f y)))).
- destruct (Ropp_ext (CRisRingExt R2) (CRmorph _ _ f y)
- (CRmult R2 (CRone R2) (CRmorph R1 R2 f y))).
- apply CReq_sym, (Rmul_1_l (CRisRing R2)). exact H4.
- destruct (CRopp_mult_distr_l R2 (CRone R2) (CRmorph _ _ f y)). exact H4.
- apply (CRle_trans R2 _ (CRmult R2 (CRmult R2 (CR_of_Q R2 (/ ((r - q) * (1 # A))))
- (CR_of_Q R2 ((q - r) * (1 # A))))
- (CRmorph R1 R2 f y))).
- apply CRmult_le_compat_r.
- apply (CRle_lt_trans R2 _ (CRmorph _ _ f (CRzero R1))).
- apply CRmorph_zero. apply CRmorph_increasing. exact H.
- apply (CRle_trans R2 _ (CR_of_Q R2 ((/ ((r - q) * (1 # A)))
- * ((q - r) * (1 # A))))).
- apply (CRle_trans R2 _ (CR_of_Q R2 (-1))).
- apply (CRle_trans R2 _ (CRopp R2 (CR_of_Q R2 1))).
- destruct (Ropp_ext (CRisRingExt R2) (CRone R2) (CR_of_Q R2 1)).
- apply CReq_sym, CR_of_Q_one. exact H4.
- destruct (CR_of_Q_opp R2 1). exact H0.
- destruct (CR_of_Q_proper R2 (-1) (/ ((r - q) * (1 # A)) * ((q - r) * (1 # A)))).
- field. split.
- intro H4. inversion H4. intro H4. apply Qlt_minus_iff in H1.
- rewrite H4 in H1. inversion H1. exact H4.
- destruct (CR_of_Q_mult R2 (/ ((r - q) * (1 # A))) ((q - r) * (1 # A))).
- exact H4.
- destruct (Rmul_assoc (CRisRing R2) (CR_of_Q R2 (/ ((r - q) * (1 # A))))
- (CR_of_Q R2 ((q - r) * (1 # A)))
- (CRmorph R1 R2 f y)).
- exact H0.
- apply CRmult_le_compat_r.
- apply (CRle_lt_trans R2 _ (CRmorph _ _ f (CRzero R1))).
- apply CRmorph_zero. apply CRmorph_increasing. exact H.
- destruct (CRmorph_rat _ _ f ((q - r) * (1 # A))). exact H0.
- + apply (CRle_trans R2 _ (CRmorph _ _ f (CRmult R1 y (CR_of_Q R1 s)))).
- apply (CRle_trans R2 _ (CRmult R2 (CRmorph R1 R2 f y) (CR_of_Q R2 s))).
- destruct (Rmul_comm (CRisRing R2) (CRmorph R1 R2 f y) (CR_of_Q R2 s)).
- exact H0.
- destruct (CRmorph_mult_rat _ _ f y s). exact H0.
- destruct (CRmorph_proper _ _ f (CRmult R1 y (CR_of_Q R1 s))
- (CRmult R1 (CR_of_Q R1 s) y)).
- apply (Rmul_comm (CRisRing R1)). exact H4.
- + apply (CRle_lt_trans R2 _ (CRmorph _ _ f (CRzero R1))).
- apply CRmorph_zero. apply CRmorph_increasing. exact H.
-Qed.
-
-Lemma CRmorph_mult_pos_pos : forall (R1 R2 : ConstructiveReals)
- (f : ConstructiveRealsMorphism R1 R2)
- (x y : CRcarrier R1),
- CRlt R1 (CRzero R1) y
- -> orderEq _ (CRlt R2) (CRmorph _ _ f (CRmult R1 x y))
- (CRmult R2 (CRmorph _ _ f x) (CRmorph _ _ f y)).
-Proof.
- split. apply CRmorph_mult_pos_pos_le. exact H.
- intro abs. destruct (CR_Q_dense R2 _ _ abs) as [q [H1 H2]].
- destruct (CRmorph_rat _ _ f q) as [_ H3].
- apply (CRle_lt_trans R2 _ _ _ H3) in H2. clear H3.
- apply CRmorph_increasing_inv in H2.
- apply (CRlt_asym R1 _ _ H2). clear H2.
- destruct (CR_Q_dense R2 _ _ H1) as [r [H2 H3]].
- apply lt_CR_of_Q in H3.
- destruct (CR_archimedean R1 y) as [A Amaj].
- destruct (CR_Q_dense R1 x (CRplus R1 x (CR_of_Q R1 ((q-r) * (1#A)))))
- as [s [H4 H5]].
- - apply (CRle_lt_trans R1 _ (CRplus R1 x (CRzero R1))).
- apply CRplus_0_r. apply CRplus_lt_compat_l.
- apply (CRle_lt_trans R1 _ (CR_of_Q R1 0)).
- apply CR_of_Q_zero. apply CR_of_Q_lt.
- rewrite <- (Qmult_0_r (q-r)). apply Qmult_lt_l.
- apply Qlt_minus_iff in H3. exact H3. reflexivity.
- - apply (CRmorph_increasing _ _ f) in H5.
- destruct (CRmorph_plus _ _ f x (CR_of_Q R1 ((q-r) * (1#A)))) as [_ H6].
- apply (CRlt_le_trans R2 _ _ _ H5) in H6. clear H5.
- destruct (CRmorph_rat _ _ f s) as [H5 _ ].
- apply (CRle_lt_trans R2 _ _ _ H5) in H6. clear H5.
- apply (CRmult_lt_compat_r R2 (CRmorph _ _ f y)) in H6.
- apply (CRlt_le_trans R1 _ (CRmult R1 (CR_of_Q R1 s) y)).
- apply CRmult_lt_compat_r. exact H. exact H4. clear H4.
- apply (CRmorph_le_inv _ _ f).
- apply (CRle_trans R2 _ (CR_of_Q R2 q)).
- 2: destruct (CRmorph_rat _ _ f q); exact H0.
- apply (CRle_trans R2 _ (CRmult R2 (CR_of_Q R2 s) (CRmorph R1 R2 f y))).
- + apply (CRle_trans R2 _ (CRmorph _ _ f (CRmult R1 y (CR_of_Q R1 s)))).
- destruct (CRmorph_proper _ _ f (CRmult R1 (CR_of_Q R1 s) y)
- (CRmult R1 y (CR_of_Q R1 s))).
- apply (Rmul_comm (CRisRing R1)). exact H4.
- apply (CRle_trans R2 _ (CRmult R2 (CRmorph R1 R2 f y) (CR_of_Q R2 s))).
- exact (proj2 (CRmorph_mult_rat _ _ f y s)).
- destruct (Rmul_comm (CRisRing R2) (CR_of_Q R2 s) (CRmorph R1 R2 f y)).
- exact H0.
- + intro H5. apply (CRlt_asym R2 _ _ H5). clear H5.
- apply (CRlt_trans R2 _ _ _ H6). clear H6.
- apply (CRle_lt_trans
- R2 _ (CRplus R2
- (CRmult R2 (CRmorph _ _ f x) (CRmorph _ _ f y))
- (CRmult R2 (CRmorph R1 R2 f (CR_of_Q R1 ((q - r) * (1 # A))))
- (CRmorph R1 R2 f y)))).
- apply (Rdistr_l (CRisRing R2)).
- apply (CRle_lt_trans
- R2 _ (CRplus R2 (CR_of_Q R2 r)
- (CRmult R2 (CRmorph R1 R2 f (CR_of_Q R1 ((q - r) * (1 # A))))
- (CRmorph R1 R2 f y)))).
- apply CRplus_le_compat_r. intro H5. apply (CRlt_asym R2 _ _ H5 H2).
- clear H2.
- apply (CRle_lt_trans
- R2 _ (CRplus R2 (CR_of_Q R2 r)
- (CRmult R2 (CR_of_Q R2 ((q - r) * (1 # A)))
- (CRmorph R1 R2 f y)))).
- apply CRplus_le_compat_l, CRmult_le_compat_r.
- apply (CRle_lt_trans R2 _ (CRmorph _ _ f (CRzero R1))).
- apply CRmorph_zero. apply CRmorph_increasing. exact H.
- destruct (CRmorph_rat _ _ f ((q - r) * (1 # A))). exact H2.
- apply (CRlt_le_trans R2 _ (CRplus R2 (CR_of_Q R2 r)
- (CR_of_Q R2 ((q - r))))).
- apply CRplus_lt_compat_l.
- * apply (CRmult_lt_reg_l R2 (CR_of_Q R2 (/((q - r) * (1 # A))))).
- apply (CRle_lt_trans R2 _ (CR_of_Q R2 0)). apply CR_of_Q_zero.
- apply CR_of_Q_lt, Qinv_lt_0_compat.
- rewrite <- (Qmult_0_r (q-r)). apply Qmult_lt_l.
- apply Qlt_minus_iff in H3. exact H3. reflexivity.
- apply (CRle_lt_trans R2 _ (CRmorph _ _ f y)).
- apply (CRle_trans R2 _ (CRmult R2 (CRmult R2 (CR_of_Q R2 (/ ((q - r) * (1 # A))))
- (CR_of_Q R2 ((q - r) * (1 # A))))
- (CRmorph R1 R2 f y))).
- exact (proj2 (Rmul_assoc (CRisRing R2) (CR_of_Q R2 (/ ((q - r) * (1 # A))))
- (CR_of_Q R2 ((q - r) * (1 # A)))
- (CRmorph _ _ f y))).
- apply (CRle_trans R2 _ (CRmult R2 (CRone R2) (CRmorph R1 R2 f y))).
- apply CRmult_le_compat_r.
- apply (CRle_lt_trans R2 _ (CRmorph _ _ f (CRzero R1))).
- apply CRmorph_zero. apply CRmorph_increasing. exact H.
- apply (CRle_trans R2 _ (CR_of_Q R2 ((/ ((q - r) * (1 # A))) * ((q - r) * (1 # A))))).
- exact (proj1 (CR_of_Q_mult R2 (/ ((q - r) * (1 # A))) ((q - r) * (1 # A)))).
- apply (CRle_trans R2 _ (CR_of_Q R2 1)).
- destruct (CR_of_Q_proper R2 (/ ((q - r) * (1 # A)) * ((q - r) * (1 # A))) 1).
- field_simplify. reflexivity. split.
- intro H5. inversion H5. intro H5. apply Qlt_minus_iff in H3.
- rewrite H5 in H3. inversion H3. exact H2.
- destruct (CR_of_Q_one R2). exact H2.
- destruct (Rmul_1_l (CRisRing R2) (CRmorph _ _ f y)).
- intro H5. contradiction.
- apply (CRlt_le_trans R2 _ (CR_of_Q R2 (Z.pos A # 1))).
- apply (CRlt_le_trans R2 _ (CRmorph _ _ f (CR_of_Q R1 (Z.pos A # 1)))).
- apply CRmorph_increasing. exact Amaj.
- exact (proj2 (CRmorph_rat _ _ f (Z.pos A # 1))).
- apply (CRle_trans R2 _ (CR_of_Q R2 ((/ ((q - r) * (1 # A))) * (q - r)))).
- 2: exact (proj2 (CR_of_Q_mult R2 (/ ((q - r) * (1 # A))) (q - r))).
- destruct (CR_of_Q_proper R2 (Z.pos A # 1) (/ ((q - r) * (1 # A)) * (q - r))).
- field_simplify. reflexivity. split.
- intro H5. inversion H5. intro H5. apply Qlt_minus_iff in H3.
- rewrite H5 in H3. inversion H3. exact H2.
- * apply (CRle_trans R2 _ (CR_of_Q R2 (r + (q-r)))).
- exact (proj1 (CR_of_Q_plus R2 r (q-r))).
- destruct (CR_of_Q_proper R2 (r + (q-r)) q). ring. exact H2.
- + apply (CRle_lt_trans R2 _ (CRmorph _ _ f (CRzero R1))).
- apply CRmorph_zero. apply CRmorph_increasing. exact H.
-Qed.
-
-Lemma CRmorph_mult : forall (R1 R2 : ConstructiveReals)
- (f : ConstructiveRealsMorphism R1 R2)
- (x y : CRcarrier R1),
- orderEq _ (CRlt R2) (CRmorph _ _ f (CRmult R1 x y))
- (CRmult R2 (CRmorph _ _ f x) (CRmorph _ _ f y)).
-Proof.
- intros.
- destruct (CR_archimedean R1 (CRopp R1 y)) as [p pmaj].
- apply (CRplus_eq_reg_r R2 (CRmult R2 (CRmorph _ _ f x)
- (CR_of_Q R2 (Z.pos p # 1)))).
- apply (CReq_trans R2 _ (CRmorph _ _ f (CRmult R1 x (CRplus R1 y (CR_of_Q R1 (Z.pos p # 1)))))).
- - apply (CReq_trans R2 _ (CRplus R2 (CRmorph R1 R2 f (CRmult R1 x y))
- (CRmorph R1 R2 f (CRmult R1 x (CR_of_Q R1 (Z.pos p # 1)))))).
- apply (Radd_ext (CRisRingExt R2)). apply CReq_refl.
- apply CReq_sym, CRmorph_mult_int.
- apply (CReq_trans R2 _ (CRmorph _ _ f (CRplus R1 (CRmult R1 x y)
- (CRmult R1 x (CR_of_Q R1 (Z.pos p # 1)))))).
- apply CReq_sym, CRmorph_plus. apply CRmorph_proper.
- apply CReq_sym, CRmult_plus_distr_l.
- - apply (CReq_trans R2 _ (CRmult R2 (CRmorph _ _ f x)
- (CRmorph _ _ f (CRplus R1 y (CR_of_Q R1 (Z.pos p # 1)))))).
- apply CRmorph_mult_pos_pos.
- apply (CRplus_lt_compat_l R1 y) in pmaj.
- apply (CRle_lt_trans R1 _ (CRplus R1 y (CRopp R1 y))).
- 2: exact pmaj. apply (CRisRing R1).
- apply (CReq_trans R2 _ (CRmult R2 (CRmorph R1 R2 f x)
- (CRplus R2 (CRmorph R1 R2 f y) (CR_of_Q R2 (Z.pos p # 1))))).
- apply (Rmul_ext (CRisRingExt R2)). apply CReq_refl.
- apply (CReq_trans R2 _ (CRplus R2 (CRmorph R1 R2 f y)
- (CRmorph _ _ f (CR_of_Q R1 (Z.pos p # 1))))).
- apply CRmorph_plus.
- apply (Radd_ext (CRisRingExt R2)). apply CReq_refl.
- apply CRmorph_rat.
- apply CRmult_plus_distr_l.
-Qed.
-
-Lemma CRmorph_appart : forall (R1 R2 : ConstructiveReals)
- (f : ConstructiveRealsMorphism R1 R2)
- (x y : CRcarrier R1)
- (app : orderAppart _ (CRlt R1) x y),
- orderAppart _ (CRlt R2) (CRmorph _ _ f x) (CRmorph _ _ f y).
-Proof.
- intros. destruct app.
- - left. apply CRmorph_increasing. exact c.
- - right. apply CRmorph_increasing. exact c.
-Defined.
-
-Lemma CRmorph_appart_zero : forall (R1 R2 : ConstructiveReals)
- (f : ConstructiveRealsMorphism R1 R2)
- (x : CRcarrier R1)
- (app : orderAppart _ (CRlt R1) x (CRzero R1)),
- orderAppart _ (CRlt R2) (CRmorph _ _ f x) (CRzero R2).
-Proof.
- intros. destruct app.
- - left. apply (CRlt_le_trans R2 _ (CRmorph _ _ f (CRzero R1))).
- apply CRmorph_increasing. exact c.
- exact (proj2 (CRmorph_zero _ _ f)).
- - right. apply (CRle_lt_trans R2 _ (CRmorph _ _ f (CRzero R1))).
- exact (proj1 (CRmorph_zero _ _ f)).
- apply CRmorph_increasing. exact c.
-Defined.
-
-Lemma CRmorph_inv : forall (R1 R2 : ConstructiveReals)
- (f : ConstructiveRealsMorphism R1 R2)
- (x : CRcarrier R1)
- (xnz : orderAppart _ (CRlt R1) x (CRzero R1))
- (fxnz : orderAppart _ (CRlt R2) (CRmorph _ _ f x) (CRzero R2)),
- orderEq _ (CRlt R2) (CRmorph _ _ f (CRinv R1 x xnz))
- (CRinv R2 (CRmorph _ _ f x) fxnz).
-Proof.
- intros. apply (CRmult_eq_reg_r R2 (CRmorph _ _ f x)).
- destruct fxnz. right. exact c. left. exact c.
- apply (CReq_trans R2 _ (CRone R2)).
- 2: apply CReq_sym, CRinv_l.
- apply (CReq_trans R2 _ (CRmorph _ _ f (CRmult R1 (CRinv R1 x xnz) x))).
- apply CReq_sym, CRmorph_mult.
- apply (CReq_trans R2 _ (CRmorph _ _ f (CRone R1))).
- apply CRmorph_proper. apply CRinv_l.
- apply CRmorph_one.
-Qed.
-
-Definition CauchyMorph (R : ConstructiveReals)
- : CReal -> CRcarrier R.
-Proof.
- intros [xn xcau].
- destruct (CR_complete R (fun n:nat => CR_of_Q R (xn n))).
- - intros p. exists (Pos.to_nat p). intros.
- specialize (xcau p i j H H0). apply Qlt_le_weak in xcau.
- rewrite Qabs_Qle_condition in xcau. split.
- + unfold CRminus.
- apply (CRle_trans R _ (CRplus R (CR_of_Q R (xn i)) (CR_of_Q R (-xn j)))).
- apply (CRle_trans R _ (CR_of_Q R (xn i-xn j))).
- apply CR_of_Q_le. apply xcau. exact (proj2 (CR_of_Q_plus R _ _)).
- apply CRplus_le_compat_l. exact (proj2 (CR_of_Q_opp R (xn j))).
- + unfold CRminus.
- apply (CRle_trans R _ (CRplus R (CR_of_Q R (xn i)) (CR_of_Q R (-xn j)))).
- apply CRplus_le_compat_l. exact (proj1 (CR_of_Q_opp R (xn j))).
- apply (CRle_trans R _ (CR_of_Q R (xn i-xn j))).
- exact (proj1 (CR_of_Q_plus R _ _)).
- apply CR_of_Q_le. apply xcau.
- - exact x.
-Defined.
-
-Lemma CauchyMorph_rat : forall (R : ConstructiveReals) (q : Q),
- orderEq _ (CRlt R) (CauchyMorph R (inject_Q q)) (CR_of_Q R q).
-Proof.
- intros.
- unfold CauchyMorph; simpl;
- destruct (CRltLinear R), p, (CR_complete R (fun _ : nat => CR_of_Q R q)).
- apply CR_cv_const in c0. apply CReq_sym. exact c0.
-Qed.
-
-Lemma CauchyMorph_increasing_Ql : forall (R : ConstructiveReals) (x : CReal) (q : Q),
- CRealLt x (inject_Q q) -> CRlt R (CauchyMorph R x) (CR_of_Q R q).
-Proof.
- intros.
- unfold CauchyMorph; simpl;
- destruct x as [xn xcau], (CRltLinear R), p, (CR_complete R (fun n : nat => CR_of_Q R (xn n))).
- destruct (CRealQ_dense _ _ H) as [r [H0 H1]].
- apply lt_inject_Q in H1.
- destruct (s _ x _ (CR_of_Q_lt R _ _ H1)). 2: exact c1. exfalso.
- clear H1 H q.
- (* For an index high enough, xn should be both higher
- and lower than r, which is absurd. *)
- apply CRealLt_above in H0.
- destruct H0 as [p pmaj]. simpl in pmaj.
- destruct (CR_cv_above_rat R xn x r c0 c1).
- assert (x0 <= Nat.max (Pos.to_nat p) (S x0))%nat.
- { apply (le_trans _ (S x0)). apply le_S, le_refl. apply Nat.le_max_r. }
- specialize (q (Nat.max (Pos.to_nat p) (S x0)) H). clear H.
- specialize (pmaj (Pos.max p (Pos.of_nat (S x0))) (Pos.le_max_l _ _)).
- rewrite Pos2Nat.inj_max, Nat2Pos.id in pmaj. 2: discriminate.
- apply (Qlt_not_le _ _ q). apply Qlt_le_weak.
- apply Qlt_minus_iff. apply (Qlt_trans _ (2#p)). reflexivity. exact pmaj.
-Qed.
-
-Lemma CauchyMorph_increasing_Qr : forall (R : ConstructiveReals) (x : CReal) (q : Q),
- CRealLt (inject_Q q) x -> CRlt R (CR_of_Q R q) (CauchyMorph R x).
-Proof.
- intros.
- unfold CauchyMorph; simpl;
- destruct x as [xn xcau], (CRltLinear R), p, (CR_complete R (fun n : nat => CR_of_Q R (xn n))).
- destruct (CRealQ_dense _ _ H) as [r [H0 H1]].
- apply lt_inject_Q in H0.
- destruct (s _ x _ (CR_of_Q_lt R _ _ H0)). exact c1. exfalso.
- clear H0 H q.
- (* For an index high enough, xn should be both higher
- and lower than r, which is absurd. *)
- apply CRealLt_above in H1.
- destruct H1 as [p pmaj]. simpl in pmaj.
- destruct (CR_cv_below_rat R xn x r c0 c1).
- assert (x0 <= Nat.max (Pos.to_nat p) (S x0))%nat.
- { apply (le_trans _ (S x0)). apply le_S, le_refl. apply Nat.le_max_r. }
- specialize (q (Nat.max (Pos.to_nat p) (S x0)) H). clear H.
- specialize (pmaj (Pos.max p (Pos.of_nat (S x0))) (Pos.le_max_l _ _)).
- rewrite Pos2Nat.inj_max, Nat2Pos.id in pmaj. 2: discriminate.
- apply (Qlt_not_le _ _ q). apply Qlt_le_weak.
- apply Qlt_minus_iff. apply (Qlt_trans _ (2#p)). reflexivity. exact pmaj.
-Qed.
-
-Lemma CauchyMorph_increasing : forall (R : ConstructiveReals) (x y : CReal),
- CRealLt x y -> CRlt R (CauchyMorph R x) (CauchyMorph R y).
-Proof.
- intros.
- destruct (CRealQ_dense _ _ H) as [q [H0 H1]].
- apply (CRlt_trans R _ (CR_of_Q R q)).
- apply CauchyMorph_increasing_Ql. exact H0.
- apply CauchyMorph_increasing_Qr. exact H1.
-Qed.
-
-Definition CauchyMorphism (R : ConstructiveReals) : ConstructiveRealsMorphism CRealImplem R.
-Proof.
- apply (Build_ConstructiveRealsMorphism CRealImplem R (CauchyMorph R)).
- exact (CauchyMorph_rat R).
- exact (CauchyMorph_increasing R).
-Defined.
-
-Lemma RightBound : forall (R : ConstructiveReals) (x : CRcarrier R) (p q r : Q),
- CRlt R x (CR_of_Q R q)
- -> CRlt R x (CR_of_Q R r)
- -> CRlt R (CR_of_Q R q) (CRplus R x (CR_of_Q R p))
- -> CRlt R (CR_of_Q R r) (CRplus R x (CR_of_Q R p))
- -> Qlt (Qabs (q - r)) p.
-Proof.
- intros. apply Qabs_case.
- - intros. apply (Qplus_lt_l _ _ r). ring_simplify.
- apply (lt_CR_of_Q R), (CRlt_le_trans R _ _ _ H1).
- apply (CRle_trans R _ (CRplus R (CR_of_Q R r) (CR_of_Q R p))).
- intro abs. apply CRplus_lt_reg_r in abs.
- exact (CRlt_asym R _ _ abs H0).
- destruct (CR_of_Q_plus R r p). exact H4.
- - intros. apply (Qplus_lt_l _ _ q). ring_simplify.
- apply (lt_CR_of_Q R), (CRlt_le_trans R _ _ _ H2).
- apply (CRle_trans R _ (CRplus R (CR_of_Q R q) (CR_of_Q R p))).
- intro abs. apply CRplus_lt_reg_r in abs.
- exact (CRlt_asym R _ _ abs H).
- destruct (CR_of_Q_plus R q p). exact H4.
-Qed.
-
-Definition CauchyMorph_inv (R : ConstructiveReals)
- : CRcarrier R -> CReal.
-Proof.
- intro x.
- exists (fun n:nat => let (q,_) := CR_Q_dense
- R x _ (CRplus_pos_rat_lt R x (1 # Pos.of_nat (S n)) (eq_refl _))
- in q).
- intros n p q H0 H1.
- destruct (CR_Q_dense R x (CRplus R x (CR_of_Q R (1 # Pos.of_nat (S p))))
- (CRplus_pos_rat_lt R x (1 # Pos.of_nat (S p)) (eq_refl _)))
- as [r [H2 H3]].
- destruct (CR_Q_dense R x (CRplus R x (CR_of_Q R (1 # Pos.of_nat (S q))))
- (CRplus_pos_rat_lt R x (1 # Pos.of_nat (S q)) (eq_refl _)))
- as [s [H4 H5]].
- apply (RightBound R x (1#n) r s). exact H2. exact H4.
- apply (CRlt_trans R _ _ _ H3), CRplus_lt_compat_l, CR_of_Q_lt.
- unfold Qlt. do 2 rewrite Z.mul_1_l. unfold Qden.
- apply Pos2Z.pos_lt_pos, Pos2Nat.inj_lt. rewrite Nat2Pos.id.
- 2: discriminate. apply le_n_S. exact H0.
- apply (CRlt_trans R _ _ _ H5), CRplus_lt_compat_l, CR_of_Q_lt.
- unfold Qlt. do 2 rewrite Z.mul_1_l. unfold Qden.
- apply Pos2Z.pos_lt_pos, Pos2Nat.inj_lt. rewrite Nat2Pos.id.
- 2: discriminate. apply le_n_S. exact H1.
-Defined.
-
-Lemma CauchyMorph_inv_rat : forall (R : ConstructiveReals) (q : Q),
- CRealEq (CauchyMorph_inv R (CR_of_Q R q)) (inject_Q q).
-Proof.
- split.
- - intros [n nmaj]. unfold CauchyMorph_inv, proj1_sig, inject_Q in nmaj.
- destruct (CR_Q_dense R (CR_of_Q R q)
- (CRplus R (CR_of_Q R q) (CR_of_Q R (1 # Pos.of_nat (S (Pos.to_nat n)))))
- (CRplus_pos_rat_lt R (CR_of_Q R q) (1 # Pos.of_nat (S (Pos.to_nat n)))
- eq_refl))
- as [r [H _]].
- apply lt_CR_of_Q, Qlt_minus_iff in H.
- apply (Qlt_not_le _ _ H), (Qplus_le_l _ _ (q-r)).
- ring_simplify. apply (Qle_trans _ (2#n)). discriminate.
- apply Qlt_le_weak. ring_simplify in nmaj. rewrite Qplus_comm. exact nmaj.
- - intros [n nmaj]. unfold CauchyMorph_inv, proj1_sig, inject_Q in nmaj.
- destruct (CR_Q_dense R (CR_of_Q R q)
- (CRplus R (CR_of_Q R q) (CR_of_Q R (1 # Pos.of_nat (S (Pos.to_nat n)))))
- (CRplus_pos_rat_lt R (CR_of_Q R q) (1 # Pos.of_nat (S (Pos.to_nat n)))
- eq_refl))
- as [r [_ H0]].
- destruct (CR_of_Q_plus R q (1 # Pos.of_nat (S (Pos.to_nat n)))) as [H1 _].
- apply (CRlt_le_trans R _ _ _ H0) in H1. clear H0.
- apply lt_CR_of_Q, (Qplus_lt_l _ _ (-q)) in H1.
- ring_simplify in H1. ring_simplify in nmaj.
- apply (Qlt_trans _ _ _ nmaj) in H1. clear nmaj.
- apply (Qlt_not_le _ _ H1). clear H1.
- apply (Qle_trans _ (1#n)).
- unfold Qle, Qnum, Qden. do 2 rewrite Z.mul_1_l.
- apply Pos2Z.pos_le_pos. apply Pos2Nat.inj_le.
- rewrite Nat2Pos.id. 2: discriminate. apply le_S, le_refl.
- unfold Qle, Qnum, Qden. apply Z.mul_le_mono_nonneg_r.
- 2: discriminate. apply Pos2Z.pos_is_nonneg.
-Qed.
-
-(* The easier side, because CauchyMorph_inv takes a limit from above. *)
-Lemma CauchyMorph_inv_increasing_Qr
- : forall (R : ConstructiveReals) (x : CRcarrier R) (q : Q),
- CRlt R (CR_of_Q R q) x -> CRealLt (inject_Q q) (CauchyMorph_inv R x).
-Proof.
- intros.
- destruct (CR_Q_dense R _ _ H) as [r [H2 H3]].
- apply lt_CR_of_Q in H2.
- destruct (Qarchimedean (/(r-q))) as [p pmaj].
- exists (2*p)%positive. unfold CauchyMorph_inv, inject_Q, proj1_sig.
- destruct (CR_Q_dense
- R x (CRplus R x (CR_of_Q R (1 # Pos.of_nat (S (Pos.to_nat (2*p))))))
- (CRplus_pos_rat_lt R x (1 # Pos.of_nat (S (Pos.to_nat (2*p)))) eq_refl))
- as [t [H4 H5]].
- setoid_replace (2#2*p) with (1#p). 2: reflexivity.
- apply (Qlt_trans _ (r-q)).
- apply (Qmult_lt_l _ _ (r-q)) in pmaj.
- rewrite Qmult_inv_r in pmaj.
- apply Qlt_shift_inv_r in pmaj. 2: reflexivity. exact pmaj.
- intro abs. apply Qlt_minus_iff in H2.
- rewrite abs in H2. inversion H2.
- apply Qlt_minus_iff in H2. exact H2.
- apply Qplus_lt_l, (lt_CR_of_Q R), (CRlt_trans R _ x _ H3 H4).
-Qed.
-
-Lemma CauchyMorph_inv_increasing : forall (R : ConstructiveReals) (x y : CRcarrier R),
- CRlt R x y -> CRealLt (CauchyMorph_inv R x) (CauchyMorph_inv R y).
-Proof.
- intros.
- destruct (CR_Q_dense R _ _ H) as [q [H0 H1]].
- apply (CReal_lt_trans _ (inject_Q q)).
- - clear H1 H y.
- destruct (CR_Q_dense R _ _ H0) as [r [H2 H3]].
- apply lt_CR_of_Q in H3.
- destruct (Qarchimedean (/(q-r))) as [p pmaj].
- exists (4*p)%positive. unfold CauchyMorph_inv, inject_Q, proj1_sig.
- destruct (CR_Q_dense
- R x (CRplus R x (CR_of_Q R (1 # Pos.of_nat (S (Pos.to_nat (4*p))))))
- (CRplus_pos_rat_lt R x (1 # Pos.of_nat (S (Pos.to_nat (4*p)))) eq_refl))
- as [t [H4 H5]].
- setoid_replace (2#4*p) with (1#2*p). 2: reflexivity.
- assert (1 # 2 * p < (q - r) / 2) as H.
- { apply Qlt_shift_div_l. reflexivity.
- setoid_replace ((1#2*p)*2) with (1#p).
- apply (Qmult_lt_l _ _ (q-r)) in pmaj.
- rewrite Qmult_inv_r in pmaj.
- apply Qlt_shift_inv_r in pmaj. 2: reflexivity. exact pmaj.
- intro abs. apply Qlt_minus_iff in H3.
- rewrite abs in H3. inversion H3.
- apply Qlt_minus_iff in H3. exact H3.
- rewrite Qmult_comm. reflexivity. }
- apply (Qlt_trans _ ((q-r)/2)). exact H.
- apply (Qplus_lt_l _ _ (t + (r-q)/2)). field_simplify.
- setoid_replace (2*t/2) with t. 2: field.
- apply (lt_CR_of_Q R). apply (CRlt_trans R _ _ _ H5).
- apply (CRlt_trans
- R _ (CRplus R (CR_of_Q R r) (CR_of_Q R (1 # Pos.of_nat (S (Pos.to_nat (4 * p))))))).
- apply CRplus_lt_compat_r. exact H2.
- apply (CRle_lt_trans
- R _ (CR_of_Q R (r + (1 # Pos.of_nat (S (Pos.to_nat (4 * p))))))).
- apply CR_of_Q_plus. apply CR_of_Q_lt.
- apply (Qlt_le_trans _ (r + (q-r)/2)).
- 2: field_simplify; apply Qle_refl.
- apply Qplus_lt_r.
- apply (Qlt_trans _ (1#2*p)). 2: exact H.
- unfold Qlt. do 2 rewrite Z.mul_1_l. unfold Qden.
- apply Pos2Z.pos_lt_pos.
- rewrite Nat2Pos.inj_succ, Pos2Nat.id.
- apply (Pos.lt_trans _ (4*p)). apply Pos2Nat.inj_lt.
- do 2 rewrite Pos2Nat.inj_mul.
- apply Nat.mul_lt_mono_pos_r. apply Pos2Nat.is_pos.
- unfold Pos.to_nat. simpl. auto.
- apply Pos.lt_succ_diag_r.
- intro abs. pose proof (Pos2Nat.is_pos (4*p)).
- rewrite abs in H1. inversion H1.
- - apply CauchyMorph_inv_increasing_Qr. exact H1.
-Qed.
-
-Definition CauchyMorphismInv (R : ConstructiveReals)
- : ConstructiveRealsMorphism R CRealImplem.
-Proof.
- apply (Build_ConstructiveRealsMorphism R CRealImplem (CauchyMorph_inv R)).
- - apply CauchyMorph_inv_rat.
- - apply CauchyMorph_inv_increasing.
-Defined.
-
-Lemma CauchyMorph_surject : forall (R : ConstructiveReals) (x : CRcarrier R),
- orderEq _ (CRlt R) (CauchyMorph R (CauchyMorph_inv R x)) x.
-Proof.
- intros.
- apply (Endomorph_id
- R (CRmorph_compose _ _ _ (CauchyMorphismInv R) (CauchyMorphism R)) x).
-Qed.
-
-Lemma CauchyMorph_inject : forall (R : ConstructiveReals) (x : CReal),
- CRealEq (CauchyMorph_inv R (CauchyMorph R x)) x.
-Proof.
- intros.
- apply (Endomorph_id CRealImplem (CRmorph_compose _ _ _ (CauchyMorphism R) (CauchyMorphismInv R)) x).
-Qed.
-
-(* We call this morphism slow to remind that it should only be used
- for proofs, not for computations. *)
-Definition SlowConstructiveRealsMorphism (R1 R2 : ConstructiveReals)
- : ConstructiveRealsMorphism R1 R2
- := CRmorph_compose R1 CRealImplem R2
- (CauchyMorphismInv R1) (CauchyMorphism R2).
diff --git a/theories/Reals/Raxioms.v b/theories/Reals/Raxioms.v
index 57912a1196..8c5bc8475b 100644
--- a/theories/Reals/Raxioms.v
+++ b/theories/Reals/Raxioms.v
@@ -24,7 +24,7 @@ Require Import ClassicalDedekindReals.
Require Import ConstructiveCauchyReals.
Require Import ConstructiveCauchyRealsMult.
Require Import ConstructiveRcomplete.
-Require Import ConstructiveRealsLUB.
+Require Import ConstructiveLUB.
Require Export Rdefinitions.
Local Open Scope R_scope.
@@ -438,7 +438,7 @@ Proof.
as Ebound.
{ destruct H. exists (Rrepr x). intros y Ey. rewrite <- (Rquot2 y).
apply Rrepr_le. apply H. exact Ey. }
- destruct (CR_sig_lub CRealImplem
+ destruct (@CR_sig_lub CRealConstructive
Er Erproper sig_forall_dec sig_not_dec Einhab Ebound).
exists (Rabst x). split.
intros y Ey. apply Rrepr_le. rewrite Rquot2.
--
cgit v1.2.3
From ba8783c42ad3e2b22d917336ce5e52245d09441b Mon Sep 17 00:00:00 2001
From: Vincent Semeria
Date: Fri, 27 Mar 2020 23:06:01 +0100
Subject: Fix changelog
---
doc/changelog/10-standard-library/11725-cleanup-reals.rst | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/doc/changelog/10-standard-library/11725-cleanup-reals.rst b/doc/changelog/10-standard-library/11725-cleanup-reals.rst
index 84a8ceb514..02ee7e6c70 100644
--- a/doc/changelog/10-standard-library/11725-cleanup-reals.rst
+++ b/doc/changelog/10-standard-library/11725-cleanup-reals.rst
@@ -1,5 +1,5 @@
- **Changed:**
-Use implicit arguments for ``ConstructiveReals``. Move ``ConstructiveReals``
+ Use implicit arguments for ``ConstructiveReals``. Move ``ConstructiveReals``
into new directory ``Abstract``. Remove imports of implementations inside
those ``Abstract`` files. Move implementation by means of Cauchy sequences in new directory ``Cauchy``.
(`#11725 `_,
--
cgit v1.2.3
From ea0bfc872a1363b47bf91e65fba0ecb770b39981 Mon Sep 17 00:00:00 2001
From: Vincent Semeria
Date: Mon, 30 Mar 2020 18:13:37 +0200
Subject: Missing apartness notations
---
theories/Reals/Abstract/ConstructiveAbs.v | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/theories/Reals/Abstract/ConstructiveAbs.v b/theories/Reals/Abstract/ConstructiveAbs.v
index a98cd7d44a..d357ad2d54 100644
--- a/theories/Reals/Abstract/ConstructiveAbs.v
+++ b/theories/Reals/Abstract/ConstructiveAbs.v
@@ -198,7 +198,7 @@ Proof.
Qed.
Lemma CRabs_appart_0 : forall {R : ConstructiveReals} (x : CRcarrier R),
- 0 < CRabs R x -> CRapart R x 0.
+ 0 < CRabs R x -> x ≶ 0.
Proof.
intros. destruct (CRltLinear R). clear p.
pose proof (s _ x _ H) as [pos|neg].
@@ -224,8 +224,8 @@ Lemma CRabs_mult : forall {R : ConstructiveReals} (x y : CRcarrier R),
Proof.
intro R.
assert (forall (x y : CRcarrier R),
- CRapart R x 0
- -> CRapart R y 0
+ x ≶ 0
+ -> y ≶ 0
-> CRabs R (x * y) == CRabs R x * CRabs R y) as prep.
{ intros. destruct H, H0.
+ rewrite CRabs_right, CRabs_left, CRabs_left.
--
cgit v1.2.3