diff options
Diffstat (limited to 'theories/Reals/Cauchy/ConstructiveCauchyReals.v')
| -rw-r--r-- | theories/Reals/Cauchy/ConstructiveCauchyReals.v | 1031 |
1 files changed, 472 insertions, 559 deletions
diff --git a/theories/Reals/Cauchy/ConstructiveCauchyReals.v b/theories/Reals/Cauchy/ConstructiveCauchyReals.v index b332457a7b..8a11c155ce 100644 --- a/theories/Reals/Cauchy/ConstructiveCauchyReals.v +++ b/theories/Reals/Cauchy/ConstructiveCauchyReals.v @@ -10,10 +10,15 @@ (************************************************************************) Require Import QArith. +Require Import Qpower. Require Import Qabs. Require Import Qround. Require Import Logic.ConstructiveEpsilon. Require CMorphisms. +Require Import Lia. +Require Import Lqa. +Require Import QExtra. +Require Import ConstructiveExtra. (** The constructive Cauchy real numbers, ie the Cauchy sequences of rational numbers. @@ -34,24 +39,36 @@ Require CMorphisms. forall un, QSeqEquiv un (fun _ => un O) (fun q => O) which says nothing about the limit of un. - We define sequences as positive -> Q instead of nat -> Q, + We define sequences as Z -> Q instead of nat -> Q, so that we can compute arguments like 2^n fast. + Todo: doc for Z->Q + WARNING: this module is not meant to be imported directly, please import `Reals.Abstract.ConstructiveReals` instead. WARNING: this file is experimental and likely to change in future releases. *) -Definition QCauchySeq (un : positive -> Q) + +Definition QCauchySeq (xn : Z -> Q) + : Prop + := forall (k : Z) (p q : Z), + Z.le p k + -> Z.le q k + -> Qabs (xn p - xn q) < 2 ^ k. + +Definition QBound (xn : Z -> Q) (scale : Z) : Prop - := forall (k : positive) (p q : positive), - Pos.le k p - -> Pos.le k q - -> Qlt (Qabs (un p - un q)) (1 # k). + := forall (k : Z), + Qabs (xn k) < 2 ^ scale. -(* A Cauchy real is a Cauchy sequence with the standard modulus *) -Definition CReal : Set - := { x : (positive -> Q) | QCauchySeq x }. +(* A Cauchy real is a sequence with a proof that the sequence is Cauchy *) +Record CReal := mkCReal { + seq : Z -> Q; + scale : Z; + cauchy : QCauchySeq seq; + bound : QBound seq scale +}. Declare Scope CReal_scope. @@ -63,13 +80,11 @@ 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 n - proj1_sig x n) }. + := { n : Z | Qlt (2 * 2 ^ n) (seq y n - seq x n) }. Definition CRealLtProp (x y : CReal) : Prop - := exists n : positive, Qlt (2 # n) (proj1_sig y n - proj1_sig x n). + := exists n : Z, Qlt (2 * 2 ^ n)(seq y n - seq x n). Definition CRealGt (x y : CReal) := CRealLt y x. Definition CReal_appart (x y : CReal) := sum (CRealLt x y) (CRealLt y x). @@ -82,23 +97,13 @@ Infix "#" := CReal_appart : CReal_scope. Lemma CRealLtEpsilon : forall x y : CReal, CRealLtProp x y -> x < y. Proof. - intros. unfold CRealLtProp in H. - (* Convert to nat to use indefinite description. *) - assert (exists n : nat, lt O n /\ Qlt (2 # Pos.of_nat n) - (proj1_sig y (Pos.of_nat n) - proj1_sig x (Pos.of_nat n))). - { destruct H as [n maj]. exists (Pos.to_nat n). split. apply Pos2Nat.is_pos. - rewrite Pos2Nat.id. exact maj. } - clear H. - apply constructive_indefinite_ground_description_nat in H0. - destruct H0 as [n maj]. exists (Pos.of_nat n). exact (proj2 maj). - intro n. destruct n. right. - intros [abs _]. inversion abs. - destruct (Qlt_le_dec (2 # Pos.of_nat (S n)) - (proj1_sig y (Pos.of_nat (S n)) - proj1_sig x (Pos.of_nat (S n)))). - left. split. apply le_n_S, le_0_n. apply q. - right. intros [_ abs]. - apply (Qlt_not_le (2 # Pos.of_nat (S n)) - (proj1_sig y (Pos.of_nat (S n)) - proj1_sig x (Pos.of_nat (S n)))); assumption. + intros x y H. unfold CRealLtProp in H. + apply constructive_indefinite_ground_description_Z in H. apply H. + intros n. + pose proof Qlt_le_dec (2 * 2 ^ n) (seq y n - seq x n) as Hdec. + destruct Hdec as [H1|H1]. + - left; exact H1. + - right; apply Qle_not_lt in H1; exact H1. Qed. Lemma CRealLtForget : forall x y : CReal, @@ -115,20 +120,18 @@ Lemma CRealLt_lpo_dec : forall x y : CReal, -> CRealLt x y + (CRealLt x y -> False). Proof. intros x y lpo. - destruct (lpo (fun n:nat => Qle (proj1_sig y (Pos.of_nat (S n)) - proj1_sig x (Pos.of_nat (S n))) - (2 # Pos.of_nat (S n)))). - - intro n. destruct (Qlt_le_dec (2 # Pos.of_nat (S n)) - (proj1_sig y (Pos.of_nat (S n)) - proj1_sig x (Pos.of_nat (S n)))). - right. apply Qlt_not_le. exact q. left. exact q. - - left. destruct s as [n nmaj]. exists (Pos.of_nat (S n)). - apply Qnot_le_lt. exact nmaj. - - 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. + destruct (lpo (fun n:nat => + seq y (Z_inj_nat_rev n) - seq x (Z_inj_nat_rev n) <= 2 * 2 ^ (Z_inj_nat_rev n) + )). + - intro n. destruct (Qlt_le_dec (2 * 2 ^ (Z_inj_nat_rev n)) + (seq y (Z_inj_nat_rev n) - seq x (Z_inj_nat_rev n))). + + right; lra. + + left; lra. + - left; destruct s as [n nmaj]; exists (Z_inj_nat_rev n); lra. + - right; intro abs; destruct abs as [n majn]. + specialize (q (Z_inj_nat n)). + rewrite Z_inj_nat_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 *) @@ -152,127 +155,103 @@ Definition CRealEq (x y : CReal) : Prop Infix "==" := CRealEq : CReal_scope. Lemma CRealLe_not_lt : forall x y : CReal, - (forall n:positive, Qle (proj1_sig x n - proj1_sig y n) (2 # n)) + (forall n : Z, (seq x n - seq y n <= 2 * 2 ^ n)%Q) <-> 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 n - proj1_sig y n)). - assumption. assumption. - - intros. - destruct (Qlt_le_dec (2 # n) (proj1_sig x n - proj1_sig y n)). - exfalso. apply H. exists n. assumption. assumption. + - intros H H0. + destruct H0 as [n H0]; specialize (H n); lra. + - intros H n. + destruct (Qlt_le_dec (2 * 2 ^ n) (seq x n - seq y 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 n - proj1_sig y 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 n - proj1_sig y n)) - with (proj1_sig y n - proj1_sig x 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 n - proj1_sig x n))). - apply Qle_Qabs. apply H. - + apply CRealLe_not_lt. intro n. specialize (H n). - apply (Qle_trans _ (Qabs (proj1_sig x n - proj1_sig y n))). - apply Qle_Qabs. apply H. -Qed. - -(* Extend separation to all indices above *) -Lemma CRealLt_aboveSig : forall (x y : CReal) (n : positive), - (Qlt (2 # n) - (proj1_sig y n - proj1_sig x n)) - -> let (k, _) := Qarchimedean (/(proj1_sig y n - proj1_sig x 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 p - proj1_sig x p). -Proof. - intros [xn limx] [yn limy] n maj. - unfold proj1_sig; unfold proj1_sig in maj. - pose (yn n - xn n) as dn. - destruct (Qarchimedean (/(yn n - xn n - (2#n)))) as [k kmaj]. - assert (0 < yn n - xn n - (2 # n))%Q as H0. - { rewrite <- (Qplus_opp_r (2#n)). apply Qplus_lt_l. assumption. } - intros. remember (yn p - xn 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 p - xn p - (yn n - xn n)) - with (yn p - yn n + (xn n - xn p)). - apply (Qle_lt_trans _ (Qabs (yn p - yn n) + Qabs (xn n - xn p))). - apply Qabs_triangle. - setoid_replace (2#n)%Q with ((1#n) + (1#n))%Q. - apply Qplus_lt_le_compat. apply limy. - apply (Pos.le_trans _ (Pos.max n (2 * k))). - apply Pos.le_max_l. assumption. - apply Pos.le_refl. apply Qlt_le_weak. apply limx. apply Pos.le_refl. - apply (Pos.le_trans _ (Pos.max n (2 * k))). - apply Pos.le_max_l. assumption. - rewrite Qinv_plus_distr. reflexivity. ring. } - 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. + <-> forall n:Z, ((Qabs (seq x n - seq y n)) <= (2 * 2 ^ n))%Q. +Proof. + intros x y; split. + - intros H n; destruct H as [Hyx Hxy]. + pose proof (CRealLe_not_lt x y) as [_ Hxy']. specialize (Hxy' Hxy n). + pose proof (CRealLe_not_lt y x) as [_ Hyx']. specialize (Hyx' Hyx n). + apply Qabs_Qle_condition; lra. + - intros H; split; + apply CRealLe_not_lt; intro n; specialize (H n); + apply Qabs_Qle_condition in H; lra. +Qed. + +(** If the elements x(n) and y(n) of two Cauchy sequences x and are apart by + at least 2*eps(n), we can find a k such that all further elements of + the sequences are apart by at least 2*eps(k) *) + +Lemma CRealLt_aboveSig : forall (x y : CReal) (n : Z), + (2 * 2^n < seq y n - seq x n)%Q + -> let (k, _) := QarchimedeanExp2_Z (/(seq y n - seq x n - (2 * 2 ^ n)%Q)) + in forall p:Z, + (p <= n)%Z + -> (2^(-k) < seq y p - seq x p)%Q. +Proof. + intros x y n maj. + destruct (QarchimedeanExp2_Z (/((seq y) n - (seq x) n - (2*2^n)%Q))) as [k kmaj]. + intros p Hp. + apply Qinv_lt_contravar in kmaj. + 3: apply Qpower_pos_lt; lra. + 2: apply Qinv_lt_0_compat; lra. + rewrite Qinv_involutive, <- Qpower_opp in kmaj; clear maj. + pose proof ((cauchy x) n n p ltac:(lia) ltac:(lia)) as HCSx. + pose proof ((cauchy y) n p n ltac:(lia) ltac:(lia)) as HCSy. + rewrite Qabs_Qlt_condition in HCSx, HCSy. + lra. +Qed. + +(** This is a weakened form of CRealLt_aboveSig which a special shape of eps needed below *) + +Lemma CRealLt_aboveSig' : forall (x y : CReal) (n : Z), + (2 * 2^n < seq y n - seq x n)%Q + -> let (k, _) := QarchimedeanExp2_Z (/(seq y n - seq x n - (2 * 2 ^ n)%Q)) + in forall p:Z, + (p <= n)%Z + -> (2 * 2^(Z.min (-k-1) n) < seq y p - seq x p)%Q. +Proof. + intros x y n Hapart. + pose proof CRealLt_aboveSig x y n Hapart. + destruct (QarchimedeanExp2_Z (/ (seq y n - seq x n - (2 * 2 ^ n)))) + as [k kmaj]. + intros p Hp; specialize (H p Hp). + pose proof Qpower_le_compat 2 (Z.min (- k -1) n) (- k-1) (Z.le_min_l _ _) ltac:(lra) as H1. + rewrite Qpower_minus_pos in H1. + apply (Qmult_le_compat_r _ _ 2) in H1. + 2: lra. + ring_simplify in H1. + exact (Qle_lt_trans _ _ _ H1 H). 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 p - proj1_sig x p) }. + -> { n : Z | forall p : Z, + (p <= n)%Z -> (2 * 2 ^ n < seq y p - seq x p)%Q }. Proof. intros x y [n maj]. - pose proof (CRealLt_aboveSig x y n maj). - destruct (Qarchimedean (/ (proj1_sig y n - proj1_sig x n - (2 # n)))) + pose proof (CRealLt_aboveSig' x y n maj) as H. + destruct (QarchimedeanExp2_Z (/ (seq y n - seq x n - (2 * 2 ^ n)))) as [k kmaj]. - exists (Pos.max n (2*k)). apply H. + exists (Z.min (-k - 1) n)%Z; intros p Hp. + apply H. + lia. Qed. (* The CRealLt index separates the Cauchy sequences *) -Lemma CRealLt_above_same : forall (x y : CReal) (n : positive), - Qlt (2 # n) - (proj1_sig y n - proj1_sig x n) - -> forall p:positive, Pos.le n p -> Qlt (proj1_sig x p) (proj1_sig y p). -Proof. - intros [xn limx] [yn limy] n inf p H. - simpl. simpl in inf. - apply (Qplus_lt_l _ _ (- xn n)). - apply (Qle_lt_trans _ (Qabs (xn p + - xn n))). - apply Qle_Qabs. apply (Qlt_trans _ (1#n)). - apply limx. exact H. apply Pos.le_refl. - rewrite <- (Qplus_0_r (yn p)). - rewrite <- (Qplus_opp_r (yn n)). - rewrite (Qplus_comm (yn 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 n + - yn p)). - ring_simplify. - setoid_replace (yn n + (-1 # 1) * yn p) with (yn n - yn p). - apply (Qle_lt_trans _ (Qabs (yn n - yn p))). - apply Qle_Qabs. apply limy. apply Pos.le_refl. assumption. - field. apply Qle_lteq. left. assumption. - rewrite Qplus_comm. rewrite Qinv_minus_distr. - reflexivity. +Lemma CRealLt_above_same : forall (x y : CReal) (n : Z), + (2 * 2 ^ n < seq y n - seq x n)%Q + -> forall p:Z, (p <= n)%Z -> Qlt (seq x p) (seq y p). +Proof. + intros x y n inf p H. + simpl in inf |- *. + pose proof ((cauchy x) n p n ltac:(lia) ltac:(lia)). + pose proof ((cauchy y) n p n ltac:(lia) ltac:(lia)). + rewrite Qabs_Qlt_condition in *. + lra. Qed. Lemma CRealLt_asym : forall x y : CReal, x < y -> x <= y. @@ -280,12 +259,14 @@ 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.max n p)) - (proj1_sig x (Pos.max n p))). - apply H0. apply Pos.le_max_l. - apply Qlt_le_weak. apply (Qplus_lt_l _ _ (-proj1_sig x (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. + apply (Qlt_not_le (seq y (Z.min n p)) + (seq x (Z.min n p))). + apply H0. apply Z.le_min_l. + apply Qlt_le_weak. apply (Qplus_lt_l _ _ (-seq x (Z.min n p))). + rewrite Qplus_opp_r. apply (Qlt_trans _ (2*2^p)). + - pose proof Qpower_pos_lt 2 p ltac:(lra). lra. + - apply H. lia. + (* ToDo: use lra *) Qed. Lemma CRealLt_irrefl : forall x:CReal, x < x -> False. @@ -312,114 +293,71 @@ 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 n - xn n - (2 # n)) as eps. - assert (Qlt 0 eps) as epsPos. - { subst eps. unfold Qminus. apply (Qlt_minus_iff (2#n)). assumption. } - destruct (Qarchimedean (/eps)) as [k kmaj]. - destruct (Qlt_le_dec ((yn n + xn n) / (2#1)) - (zn (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.max n (4 * k)))). - rewrite <- (Qplus_opp_r (xn n)). - rewrite (Qplus_comm (xn 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 n)) in decMiddle. - apply (Qlt_trans _ ((yn n + xn n) / (2 # 1) + - xn n)). - setoid_replace ((yn n + xn n) / (2 # 1) - xn n) - with ((yn n - xn 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 n + - xn (Pos.max n (4 * k))) - with (-(xn (Pos.max n (4 * k)) - xn n)). - apply Qopp_le_compat. - apply (Qle_trans _ (Qabs (xn (Pos.max n (4 * k)) - xn n))). - apply Qle_Qabs. apply Qle_lteq. left. apply limx. apply Pos.le_max_l. - apply Pos.le_refl. ring. - - right. exists (Pos.max n (4 * k)). unfold proj1_sig. unfold Qminus. - rewrite <- (Qplus_0_r (yn (Pos.max n (4 * k)))). - rewrite <- (Qplus_opp_r (yn n)). - rewrite (Qplus_comm (yn 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 n - yn (Pos.max n (4 * k)) + (1#n))) - ; ring_simplify. - setoid_replace (-1 * yn (Pos.max n (4 * k))) - with (- yn (Pos.max n (4 * k))). 2: ring. - apply (Qle_lt_trans _ (Qabs (yn n - yn (Pos.max n (4 * k))))). - apply Qle_Qabs. apply limy. apply Pos.le_refl. apply Pos.le_max_l. - + apply Qopp_le_compat in decMiddle. - apply (Qplus_le_r _ _ (yn n)) in decMiddle. - apply (Qle_trans _ (yn n + - ((yn n + xn n) / (2 # 1)))). - setoid_replace (yn n + - ((yn n + xn n) / (2 # 1))) - with ((yn n - xn 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. + intros x y z [n inf]. + destruct (QarchimedeanExp2_Z (/((seq y) n - (seq x) n - (2 * 2 ^ n)))) as [k kmaj]. + rewrite Qinv_lt_contravar, Qinv_involutive, <- Qpower_opp in kmaj. + 3: apply Qpower_pos_lt; lra. + 2: apply Qinv_lt_0_compat; lra. + + destruct (Qlt_le_dec ((1#2) * ((seq y) n + (seq x) n)) ((seq z) (Z.min n (- k - 2)))) + as [Hxyltz|Hzlexy]; [left; pose (cauchy x) as HCS|right; pose (cauchy y) as HCS]. + + all: exists (Z.min (n)%Z (-k - 2))%Z. + all: specialize (HCS n n (Z.min n (-k-2))%Z ltac:(lia) ltac:(lia)). + all: rewrite Qabs_Qlt_condition in HCS. + all: assert (2 ^ Z.min n (- k - 2) <= 2 ^ (- k - 2))%Q as Hpowmin + by (apply Qpower_le_compat; [lia|lra]). + all: rewrite Qpower_minus_pos in Hpowmin; lra. +Qed. 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. + intros x y z Hle Hlt. + destruct (linear_order_T y x z Hlt) as [Hyltx|Hxltz]. + - contradiction. + - exact Hxltz. +Qed. +(* Todo: this was Defined. Why *) 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. + intros x y z Hlt Hle. + destruct (linear_order_T x z y Hlt) as [Hxltz|Hzlty]. + - exact Hxltz. + - contradiction. +Qed. +(* Todo: this was Defined. Why *) Lemma CReal_le_trans : forall x y z : CReal, x <= y -> y <= z -> x <= z. Proof. - intros. intro abs. apply H0. + intros x y z Hxley Hylez contra. + apply Hylez. 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. + intros x y z Hxlty Hyltz. + apply (CReal_lt_le_trans _ y _ Hxlty). + apply CRealLt_asym; exact Hyltz. +Qed. +(* Todo: this was Defined. Why *) 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. + intros x y z Hxeqy Hyeqz. + destruct Hxeqy as [Hylex Hxley]. + destruct Hyeqz as [Hzley Hylez]. + split. + - intro contra. destruct (CRealLt_dec _ _ y contra); contradiction. + - intro contra. destruct (CRealLt_dec _ _ y contra); contradiction. Qed. Add Parametric Relation : CReal CRealEq @@ -430,116 +368,143 @@ Add Parametric Relation : CReal CRealEq Instance CRealEq_relT : CRelationClasses.Equivalence CRealEq. Proof. - split. exact CRealEq_refl. exact CRealEq_sym. exact CRealEq_trans. + 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. + intros x y Hxeqy x0 y0 Hx0eqy0. + destruct Hxeqy as [Hylex Hxley]. + destruct Hx0eqy0 as [Hy0lex0 Hx0ley0]. + split. + - intro Hxltx0; destruct (CRealLt_dec x x0 y). + + assumption. + + contradiction. + + destruct (CRealLt_dec y x0 y0). + assumption. assumption. contradiction. + - intro Hylty0; 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. + intros x y Hxeqy x0 y0 Hx0eqy0. apply CRealLt_morph; assumption. Qed. Instance CReal_appart_morph : CMorphisms.Proper (CMorphisms.respectful CRealEq (CMorphisms.respectful CRealEq CRelationClasses.iffT)) CReal_appart. Proof. + intros x y Hxeqy x0 y0 Hx0eqy0. 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. + - intros Hapart. destruct Hapart as [Hxltx0|Hx0ltx]. + + left. rewrite <- Hx0eqy0, <- Hxeqy. exact Hxltx0. + + right. rewrite <- Hx0eqy0, <- Hxeqy. exact Hx0ltx. + - intros Hapart. destruct Hapart as [Hylty0|Hy0lty]. + + left. rewrite Hx0eqy0, Hxeqy. exact Hylty0. + + right. rewrite Hx0eqy0, Hxeqy. exact Hy0lty. 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. + intros x y Hxeqy x0 y0 Hx0eqy0. + split. + - intro Hxltpx0. apply CRealLtForget. apply CRealLtEpsilon in Hxltpx0. + rewrite <- Hxeqy, <- Hx0eqy0. exact Hxltpx0. + - intro Hylty0. apply CRealLtForget. apply CRealLtEpsilon in Hylty0. + rewrite Hxeqy, Hx0eqy0. exact Hylty0. 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. + intros x y Hxeqy x0 y0 Hx0eqy0. + split. + - intros Hxlex0 Hyley0. unfold CRealLe in Hxlex0. + rewrite <- Hx0eqy0 in Hyley0. rewrite <- Hxeqy in Hyley0. contradiction. + - intros Hxlex0 Hyley0. unfold CRealLe in Hxlex0. + rewrite Hx0eqy0 in Hyley0. rewrite Hxeqy in Hyley0. contradiction. Qed. Add Parametric Morphism : CRealGe with signature CRealEq ==> CRealEq ==> iff as CRealGe_morph. Proof. - intros. unfold CRealGe. apply CRealLe_morph; assumption. + intros x y Hxeqy x0 y0 Hx0eqy0. + 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. + intros x y z Hxeqy Hxltz. + apply (CRealLt_morph x y Hxeqy z z). + - apply CRealEq_refl. + - apply Hxltz. 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. + intros x y z Hxeqy Hzltx. + apply (CRealLt_morph z z (CRealEq_refl z) x y). + - apply Hxeqy. + - apply Hzltx. 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. + intros x y z Hxeqy Hxlez. + apply (CRealLe_morph x y Hxeqy z z). + - apply CRealEq_refl. + - apply Hxlez. 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. + intros x y z Hxeqy Hzlex. + apply (CRealLe_morph z z (CRealEq_refl z) x y). + - apply Hxeqy. + - apply Hzlex. Qed. (* Injection of Q into CReal *) -Lemma ConstCauchy : forall q : Q, QCauchySeq (fun _ => q). +Lemma inject_Q_cauchy : forall q : Q, QCauchySeq (fun _ => q). Proof. - intros. intros k p r H H0. - unfold Qminus. rewrite Qplus_opp_r. unfold Qlt. simpl. - unfold Z.lt. auto. + intros q k p r Hp Hr. + apply Qabs_Qlt_condition. + pose proof Qpower_pos_lt 2 k; lra. Qed. -Definition inject_Q : Q -> CReal. -Proof. - intro q. exists (fun n => q). apply ConstCauchy. -Defined. +Definition inject_Q (q : Q) : CReal := +{| + seq := (fun n : Z => q); + scale := Qbound_ltabs_ZExp2 q; + cauchy := inject_Q_cauchy q; + bound := (fun _ : Z => Qbound_ltabs_ZExp2_spec q) +|}. Definition inject_Z : Z -> CReal := fun n => inject_Q (n # 1). @@ -550,177 +515,140 @@ Notation "2" := (inject_Q 2) : CReal_scope. Lemma CRealLt_0_1 : CRealLt (inject_Q 0) (inject_Q 1). Proof. - exists 3%positive. reflexivity. + exists (-2)%Z; cbn; lra. 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 p) (q + (1#p)). -Proof. - intros [xn cau] q maj p. simpl. - destruct (Qlt_le_dec (xn 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 p (Pos.max k p) (Pos.le_refl _)). - pose proof (Qplus_lt_le_compat (2#k) (q - xn (Pos.max k p)) - (q + (1 # p)) (xn 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 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.max k p) + xn p) _ H). - rewrite Qplus_comm. - apply (Qle_lt_trans _ (Qabs (xn p - xn (Pos.max k p)))). - apply Qle_Qabs. apply cau. 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 p). -Proof. - intros [xn cau] q maj p. simpl. - destruct (Qlt_le_dec (q - (1 # p)) (xn 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.max k p) p). - pose proof (Qplus_lt_le_compat (2#k) (xn (Pos.max k p) - q) - (xn 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.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 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.max k p) - xn p) _ H). - apply (Qle_lt_trans _ (Qabs (xn (Pos.max k p) - xn p))). - apply Qle_Qabs. apply cau. - apply Pos.le_max_r. apply Pos.le_refl. -Qed. - -Lemma inject_Q_compare : forall (x : CReal) (p : positive), - x <= inject_Q (proj1_sig x 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. - specialize (xcau n n p (Pos.le_refl _) e). - apply (Qlt_le_trans _ _ (Qabs (xn n + -1 * xn 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 in e. - specialize (xcau p n p e (Pos.le_refl _)). - apply (Qlt_le_trans _ _ (Qabs (xn n + -1 * xn 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. + (0 < q)%Q -> CRealLt (inject_Q 0) (inject_Q q). +Proof. + intros q Hq. destruct (QarchimedeanExp2_Z ((2#1) / q)) as [k Hk]. + exists (-k)%Z; cbn. + apply (Qmult_lt_compat_r _ _ q) in Hk. + 2: assumption. + apply (Qmult_lt_compat_r _ _ (2^(-k))) in Hk. + 2: apply Qpower_pos_lt; lra. + field_simplify in Hk. + 2: lra. + (* ToDo: field_simplify should collect powers - the next 3 lines ... *) + rewrite <- Qmult_assoc, <- Qpower_plus in Hk by lra. + ring_simplify (-k +k)%Z in Hk. + rewrite Qpower_0_r in Hk. + lra. +Qed. + +Lemma inject_Q_compare : forall (x : CReal) (p : Z), + x <= inject_Q (seq x p + (2^p)). +Proof. + intros x p [n nmaj]. + cbn in nmaj. + assert(2^n>0)%Q by (apply Qpower_pos_lt; lra). + assert(2^p>0)%Q by (apply Qpower_pos_lt; lra). + pose proof x.(cauchy) as xcau. + destruct (Z.min_dec p n); + [ specialize (xcau n n p ltac:(lia) ltac:(lia)) | + specialize (xcau p n p ltac:(lia) ltac:(lia)) ]. + all: apply Qabs_Qlt_condition in xcau; lra. 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. + intros x y Heq; split. + all: intros [n Hapart]; cbn in Hapart; rewrite Heq in Hapart. + all: assert(2^n>0)%Q by (apply Qpower_pos_lt; lra); lra. 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 (x y : CReal), - QCauchySeq (fun n : positive => Qred (proj1_sig x (2 * n)%positive - + proj1_sig y (2 * n)%positive)). -Proof. - destruct x as [xn limx], y as [yn limy]; unfold proj1_sig. - intros n p q H H0. - rewrite Qred_correct, Qred_correct. - setoid_replace (xn (2 * p)%positive + yn (2 * p)%positive - - (xn (2 * q)%positive + yn (2 * q)%positive)) - with (xn (2 * p)%positive - xn (2 * q)%positive - + (yn (2 * p)%positive - yn (2 * q)%positive)). - 2: ring. - apply (Qle_lt_trans _ _ _ (Qabs_triangle _ _)). - setoid_replace (1#n)%Q with ((1#2*n) + (1#2*n))%Q. - apply Qplus_lt_le_compat. - - apply limx. unfold id. apply Pos.mul_le_mono_l, H. - unfold id. apply Pos.mul_le_mono_l, H0. - - apply Qlt_le_weak, limy. - unfold id. apply Pos.mul_le_mono_l, H. - unfold id. apply Pos.mul_le_mono_l, H0. - - rewrite Qinv_plus_distr. unfold Qeq. reflexivity. -Qed. - -(* We reduce the rational numbers to accelerate calculations. *) -Definition CReal_plus (x y : CReal) : CReal - := exist _ (fun n : positive => Qred (proj1_sig x (2 * n)%positive - + proj1_sig y (2 * n)%positive)) - (CReal_plus_cauchy x y). + intros x y Heq; split. + all: intros [n Hapart]; cbn in Hapart; rewrite Heq in Hapart. + all: assert(2^n>0)%Q by (apply Qpower_pos_lt; lra); lra. +Qed. + + + +(** * Algebraic operations *) + +(** We reduce the rational numbers to accelerate calculations. *) +Definition CReal_plus_seq (x y : CReal) := + (fun n : Z => Qred (seq x (n-1)%Z + seq y (n-1)%Z)). + +Definition CReal_plus_scale (x y : CReal) : Z := + Z.max x.(scale) y.(scale) + 1. + +Lemma CReal_plus_cauchy : forall (x y : CReal), + QCauchySeq (CReal_plus_seq x y). +Proof. + intros x y n p q Hp Hq. + unfold CReal_plus_seq. + pose proof ((cauchy x) (n-1)%Z (p-1)%Z (q-1)%Z ltac:(lia) ltac:(lia)) as Hxbnd. + pose proof ((cauchy y) (n-1)%Z (p-1)%Z (q-1)%Z ltac:(lia) ltac:(lia)) as Hybnd. + do 2 rewrite Qred_correct. + rewrite Qabs_Qlt_condition in Hxbnd, Hybnd |- *. + rewrite Qpower_minus_pos in Hxbnd, Hybnd. + lra. +Qed. + +Lemma CReal_plus_bound : forall (x y : CReal), + QBound (CReal_plus_seq x y) (CReal_plus_scale x y). +Proof. + intros x y k. + unfold CReal_plus_seq, CReal_plus_scale. + pose proof (bound x (k-1)%Z) as Hxbnd. + pose proof (bound y (k-1)%Z) as Hybnd. + rewrite Qpower_plus by lra. + pose proof Qpower_le_compat 2 (scale x) (Z.max (scale x) (scale y)) ltac:(lia) ltac:(lra) as Hxmax. + pose proof Qpower_le_compat 2 (scale y) (Z.max (scale x) (scale y)) ltac:(lia) ltac:(lra) as Hymax. + rewrite Qabs_Qlt_condition in Hxbnd, Hybnd |- *. + rewrite Qred_correct. + lra. +Qed. + +Definition CReal_plus (x y : CReal) : CReal := +{| + seq := CReal_plus_seq x y; + scale := CReal_plus_scale x y; + cauchy := CReal_plus_cauchy x y; + bound := CReal_plus_bound x y +|}. Infix "+" := CReal_plus : CReal_scope. -Definition CReal_opp (x : CReal) : CReal. +Definition CReal_opp_seq (x : CReal) := + (fun n : Z => - seq x n). + +Definition CReal_opp_scale (x : CReal) : Z := + x.(scale). + +Lemma CReal_opp_cauchy : forall (x : CReal), + QCauchySeq (CReal_opp_seq x). Proof. - destruct x as [xn limx]. - exists (fun n : positive => - xn n). - intros k p q H H0. unfold Qminus. rewrite Qopp_involutive. - rewrite Qplus_comm. apply limx; assumption. -Defined. + intros x n p q Hp Hq; unfold CReal_opp_seq. + pose proof ((cauchy x) n p q ltac:(lia) ltac:(lia)) as Hxbnd. + rewrite Qabs_Qlt_condition in Hxbnd |- *. + lra. +Qed. + +Lemma CReal_opp_bound : forall (x : CReal), + QBound (CReal_opp_seq x) (CReal_opp_scale x). +Proof. + intros x k. + unfold CReal_opp_seq, CReal_opp_scale. + pose proof (bound x k) as Hxbnd. + rewrite Qabs_Qlt_condition in Hxbnd |- *. + lra. +Qed. + +Definition CReal_opp (x : CReal) : CReal := +{| + seq := CReal_opp_seq x; + scale := CReal_opp_scale x; + cauchy := CReal_opp_cauchy x; + bound := CReal_opp_bound x +|}. Notation "- x" := (CReal_opp x) : CReal_scope. @@ -729,74 +657,52 @@ Definition CReal_minus (x y : CReal) : CReal Infix "-" := CReal_minus : CReal_scope. -Lemma belowMultiple : forall n p : positive, Pos.le n (p * n). +(* ToDo: make a tactic for this *) +Lemma CReal_red_seq: forall (a : Z -> Q) (b : Z) (c : QCauchySeq a) (d : QBound a b), + seq (mkCReal a b c d) = a. Proof. - intros. apply (Pos.le_trans _ (1*n)). apply Pos.le_refl. - apply Pos.mul_le_mono_r. destruct p; discriminate. + reflexivity. Qed. Lemma CReal_plus_assoc : forall (x y z : CReal), (x + y) + z == x + (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. - rewrite Qred_correct, Qred_correct, Qred_correct, Qred_correct. - setoid_replace (xn (2 * (2 * n))%positive + yn (2 * (2 * n))%positive - + zn (2 * n)%positive - - (xn (2 * n)%positive + (yn (2 * (2 * n))%positive - + zn (2 * (2 * n))%positive)))%Q - with (xn (2 * (2 * n))%positive - xn (2 * n)%positive - + (zn (2 * n)%positive - zn (2 * (2 * n))%positive))%Q. - apply (Qle_trans _ (Qabs (xn (2 * (2 * n))%positive - xn (2 * n)%positive) - + Qabs (zn (2 * n)%positive - zn (2 * (2 * n))%positive))). - apply Qabs_triangle. - rewrite <- (Qinv_plus_distr 1 1 n). apply Qplus_le_compat. - apply Qle_lteq. left. apply limx. rewrite Pos.mul_assoc. - apply belowMultiple. apply belowMultiple. - apply Qle_lteq. left. apply limz. apply belowMultiple. - rewrite Pos.mul_assoc. apply belowMultiple. simpl. field. + intros x y z; apply CRealEq_diff; intro n. + unfold CReal_plus, CReal_plus_seq. do 4 rewrite CReal_red_seq. + do 4 rewrite Qred_correct. + ring_simplify (n-1-1)%Z. + pose proof ((cauchy x) (n-1)%Z (n-2)%Z (n-1)%Z ltac:(lia) ltac:(lia)) as Hxbnd. + specialize ((cauchy z) (n-1)%Z (n-2)%Z (n-1)%Z ltac:(lia) ltac:(lia)) as Hzbnd. + apply Qlt_le_weak. + rewrite Qabs_Qlt_condition in Hxbnd, Hzbnd |- *. + rewrite Qpower_minus_pos in Hxbnd, Hzbnd. + lra. 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. rewrite Qred_correct, Qred_correct. - setoid_replace (xn (2 * n)%positive + yn (2 * n)%positive - - (yn (2 * n)%positive + xn (2 * n)%positive))%Q - with 0%Q. - unfold Qle. simpl. unfold Z.le. intro absurd. inversion absurd. - ring. + intros x y; apply CRealEq_diff; intros n. + unfold CReal_plus, CReal_plus_seq. do 2 rewrite CReal_red_seq. + do 2 rewrite Qred_correct. + pose proof ((cauchy x) (n-1)%Z (n-1)%Z (n-1)%Z ltac:(lia) ltac:(lia)) as Hxbnd. + pose proof ((cauchy y) (n-1)%Z (n-1)%Z (n-1)%Z ltac:(lia) ltac:(lia)) as Hybnd. + apply Qlt_le_weak. + rewrite Qabs_Qlt_condition in Hxbnd, Hybnd |- *. + rewrite Qpower_minus_pos in Hxbnd, Hybnd. + lra. Qed. Lemma CReal_plus_0_l : forall r : CReal, inject_Q 0 + r == r. Proof. - intro r. split. - - intros [n maj]. - destruct r as [xn q]; unfold CReal_plus, proj1_sig, inject_Q in maj. - rewrite Qplus_0_l, Qred_correct in maj. - specialize (q n n (Pos.mul 2 n) (Pos.le_refl _)). - apply (Qlt_not_le (2#n) (xn n - xn (2 * n)%positive)). - assumption. - apply (Qle_trans _ (Qabs (xn n - xn (2 * n)%positive))). - apply Qle_Qabs. apply (Qle_trans _ (1#n)). apply Qlt_le_weak. apply q. - apply belowMultiple. - unfold Qle, Qnum, Qden. apply Z.mul_le_mono_nonneg_r. - discriminate. discriminate. - - intros [n maj]. - destruct r as [xn q]; unfold CReal_plus, proj1_sig, inject_Q in maj. - rewrite Qplus_0_l, Qred_correct in maj. - specialize (q n n (Pos.mul 2 n) (Pos.le_refl _)). - rewrite Qabs_Qminus in q. - apply (Qlt_not_le (2#n) (xn (Pos.mul 2 n) - xn n)). - assumption. - apply (Qle_trans _ (Qabs (xn (Pos.mul 2 n) - xn n))). - apply Qle_Qabs. apply (Qle_trans _ (1#n)). apply Qlt_le_weak. apply q. - apply belowMultiple. - unfold Qle, Qnum, Qden. apply Z.mul_le_mono_nonneg_r. - discriminate. discriminate. + intros x; apply CRealEq_diff; intros n. + unfold CReal_plus, CReal_plus_seq, inject_Q. do 2 rewrite CReal_red_seq. + rewrite Qred_correct. + pose proof ((cauchy x) (n)%Z (n-1)%Z (n)%Z ltac:(lia) ltac:(lia)) as Hxbnd. + apply Qlt_le_weak. + rewrite Qabs_Qlt_condition in Hxbnd |- *. + lra. Qed. Lemma CReal_plus_0_r : forall r : CReal, @@ -808,94 +714,98 @@ 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 (2 * n)%positive). - setoid_replace (proj1_sig (CReal_plus x z) n - - proj1_sig (CReal_plus x y) n)%Q - with (proj1_sig z (2 * n)%positive - proj1_sig y (2 * n)%positive)%Q. - apply maj. apply belowMultiple. - destruct x as [xn limx], y as [yn limy], z as [zn limz]; - unfold CReal_plus, proj1_sig. - rewrite Qred_correct, Qred_correct. ring. + intros x y z Hlt. + apply CRealLt_above in Hlt; destruct Hlt as [n Hapart]; exists n. + unfold CReal_plus, CReal_plus_seq in Hapart |- *. do 2 rewrite CReal_red_seq. + do 2 rewrite Qred_correct. + specialize (Hapart (n-1)%Z ltac:(lia)). + lra. 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. + intros x y z. + do 2 rewrite <- (CReal_plus_comm x). + apply CReal_plus_lt_compat_l. 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 (2 * n)%positive - proj1_sig y (2 * n)%positive)%Q - with (proj1_sig (CReal_plus x z) n - proj1_sig (CReal_plus x y) n)%Q. - apply (Qle_lt_trans _ (2#n)). - setoid_replace (2 # 2 * n)%Q with (1 # n)%Q. 2: reflexivity. - unfold Qle, Qnum, Qden. apply Z.mul_le_mono_nonneg_r. - discriminate. discriminate. - apply maj. - destruct x as [xn limx], y as [yn limy], z as [zn limz]; - unfold CReal_plus, proj1_sig. - rewrite Qred_correct, Qred_correct. ring. + intros x y z Hlt. + destruct Hlt as [n maj]; exists (n - 1)%Z. + setoid_replace (seq z (n - 1)%Z - seq y (n - 1)%Z)%Q + with (seq (CReal_plus x z) n - seq (CReal_plus x y) n)%Q. + - rewrite Qpower_minus_pos. + assert (2 ^ n > 0)%Q by (apply Qpower_pos_lt; lra); lra. + - unfold CReal_plus, CReal_plus_seq in maj |- *. + do 2 rewrite CReal_red_seq in maj |- *. + do 2 rewrite Qred_correct; 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. + intros x y z Hlt. + rewrite (CReal_plus_comm y), (CReal_plus_comm z) in Hlt. + apply CReal_plus_lt_reg_l in Hlt; exact Hlt. 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. + intros x y z Hlt contra. + apply Hlt. + apply CReal_plus_lt_compat_l; exact contra. 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. + intros x y z Hlt contra. + apply Hlt. + apply CReal_plus_lt_compat_r; exact contra. 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. + intros x y z Hlt contra. + apply Hlt. + apply CReal_plus_lt_reg_l in contra; exact contra. 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. + intros r1 r2 r3 r4 Hr1ler2 Hr3ltr4. + apply CReal_le_lt_trans with (r2 + r3). + intro contra; rewrite CReal_plus_comm, (CReal_plus_comm r1) in contra. + apply CReal_plus_lt_reg_l in contra. contradiction. + apply CReal_plus_lt_compat_l. exact Hr3ltr4. 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. + intros r1 r2 r3 r4 Hr1ler2 Hr3ler4. + apply CReal_le_trans with (r2 + r3). + intro contra; rewrite CReal_plus_comm, (CReal_plus_comm r1) in contra. + apply CReal_plus_lt_reg_l in contra. contradiction. + apply CReal_plus_le_compat_l; exact Hr3ler4. 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. + intros x; apply CRealEq_diff; intros n. + unfold CReal_plus, CReal_plus_seq, CReal_opp, CReal_opp_seq, inject_Q. + do 3 rewrite CReal_red_seq. rewrite Qred_correct. - setoid_replace (xn (2 * n)%positive + - xn (2 * n)%positive - 0)%Q - with 0%Q. - unfold Qle. simpl. unfold Z.le. intro absurd. inversion absurd. ring. + pose proof ((cauchy x) (n)%Z (n-1)%Z (n)%Z ltac:(lia) ltac:(lia)) as Hxbnd. + apply Qlt_le_weak. + rewrite Qabs_Qlt_condition in Hxbnd |- *. + lra. Qed. Lemma CReal_plus_opp_l : forall x : CReal, @@ -994,80 +904,83 @@ Qed. Lemma inject_Q_plus : forall q r : Q, inject_Q (q + r) == inject_Q q + inject_Q r. Proof. + intros q r. split. - - intros [n nmaj]. unfold CReal_plus, inject_Q, proj1_sig in nmaj. - rewrite Qred_correct in nmaj. - ring_simplify in nmaj. discriminate. - - intros [n nmaj]. unfold CReal_plus, inject_Q, proj1_sig in nmaj. - rewrite Qred_correct in nmaj. - ring_simplify in nmaj. discriminate. + all: intros [n nmaj]; unfold CReal_plus, CReal_plus_seq, inject_Q in nmaj. + all: do 4 rewrite CReal_red_seq in nmaj. + all: rewrite Qred_correct in nmaj. + all: assert(2^n>0)%Q by (apply Qpower_pos_lt; lra); lra. 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. + all: intros [n nmaj]; cbn in nmaj. + all: assert(2^n>0)%Q by (apply Qpower_pos_lt; lra); lra. 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. + intros q r Hlt. + destruct (QarchimedeanExp2_Z (/(r-q))) as [n Hn]. + rewrite Qinv_lt_contravar, Qinv_involutive, <- Qpower_opp in Hn. + - exists (-n-1)%Z; cbn. + rewrite Qpower_minus_pos; lra. + - apply Qlt_shift_inv_l; lra. + - apply Qpower_pos_lt; lra. Qed. Lemma opp_inject_Q : forall q : Q, inject_Q (-q) == - inject_Q q. Proof. + intros q. split. - - intros [n maj]. simpl in maj. ring_simplify in maj. discriminate. - - intros [n maj]. simpl in maj. ring_simplify in maj. discriminate. + all: intros [n maj]; cbn in maj. + all: unfold CReal_opp_seq, inject_Q in maj. + all: rewrite CReal_red_seq in maj. + all: assert(2^n>0)%Q by (apply Qpower_pos_lt; lra); lra. Qed. Lemma lt_inject_Q : forall q r : Q, - inject_Q q < inject_Q r -> Qlt q r. + inject_Q q < inject_Q r -> (q < r)%Q. Proof. - intros. destruct H. simpl in q0. - apply Qlt_minus_iff, (Qlt_trans _ (2#x)). - reflexivity. exact q0. + intros q r [n Hn]; cbn in Hn. + apply Qlt_minus_iff. + assert(2^n>0)%Q by (apply Qpower_pos_lt; lra); lra. Qed. Lemma le_inject_Q : forall q r : Q, - inject_Q q <= inject_Q r -> Qle q r. + inject_Q q <= inject_Q r -> (q <= r)%Q. Proof. - intros. destruct (Qlt_le_dec r q). 2: exact q0. - exfalso. apply H. clear H. apply inject_Q_lt. exact q0. + intros q r Hle. + destruct (Qlt_le_dec r q) as [Hdec|Hdec]. + - exfalso. + apply Hle; apply inject_Q_lt; exact Hdec. + - exact Hdec. Qed. Lemma inject_Q_le : forall q r : Q, - Qle q r -> inject_Q q <= inject_Q r. + (q <= r)%Q -> 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. + intros q r Hle [n maj]; cbn in maj. + assert(2^n>0)%Q by (apply Qpower_pos_lt; lra); lra. Qed. Lemma inject_Z_plus : forall q r : Z, inject_Z (q + r) == inject_Z q + inject_Z r. Proof. - intros. unfold inject_Z. + intros q r; unfold inject_Z. setoid_replace (q + r # 1)%Q with ((q#1) + (r#1))%Q. - apply inject_Q_plus. rewrite Qinv_plus_distr. reflexivity. + - 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. + intros n; unfold inject_Z. setoid_replace (-n # 1)%Q with (-(n#1))%Q. - rewrite opp_inject_Q. reflexivity. reflexivity. + - rewrite opp_inject_Q; reflexivity. + - reflexivity. Qed. |
