Timings for ConstructiveMinMax.v
- /home/gitlab-runner/builds/gGKko-aj/0/coq/coq/_bench/opam.OLD/ocaml-OLD/.opam-switch/build/coq-stdlib.dev/_build/default/theories//./Reals/Abstract/ConstructiveMinMax.timing
- /home/gitlab-runner/builds/gGKko-aj/0/coq/coq/_bench/opam.NEW/ocaml-NEW/.opam-switch/build/coq-stdlib.dev/_build/default/theories//./Reals/Abstract/ConstructiveMinMax.timing
(************************************************************************)
(* * The Coq Proof Assistant / The Coq Development Team *)
(* v * INRIA, CNRS and contributors - Copyright 1999-2019 *)
(* <O___,, * (see CREDITS file for the list of authors) *)
(* \VV/ **************************************************************)
(* // * This file is distributed under the terms of the *)
(* * GNU Lesser General Public License Version 2.1 *)
(* * (see LICENSE file for the text of the license) *)
(************************************************************************)
(************************************************************************)
Require Import ConstructiveReals.
Require Import ConstructiveAbs.
Require Import ConstructiveRealsMorphisms.
Local Open Scope ConstructiveReals.
(** Definition and properties of minimum and maximum.
WARNING: this file is experimental and likely to change in future releases.
*)
(* 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.
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.
rewrite (CR_of_Q_plus R 1 1), CRmult_plus_distr_l, CRmult_1_r.
rewrite CRopp_plus_distr, CRplus_assoc, <- (CRplus_assoc y).
rewrite CRplus_opp_r, CRplus_0_l, CRopp_involutive.
apply (CRmult_lt_compat_r (CR_of_Q R 2)) in H.
2: apply CR_of_Q_pos; reflexivity.
apply (CRle_trans _ (x + y - CRabs R (y - x))).
rewrite CRopp_involutive, CRplus_comm.
rewrite CRplus_assoc, <- (CRplus_assoc (-x)), CRplus_opp_l.
rewrite CRplus_0_l, (CR_of_Q_plus R 1 1), CRmult_plus_distr_l.
rewrite CRmult_assoc, <- CR_of_Q_mult.
setoid_replace ((1 # 2) * 2)%Q with 1%Q.
Add Parametric Morphism {R : ConstructiveReals} : CRmin
with signature (CReq R) ==> (CReq R) ==> (CReq R)
as CRmin_morph.
#[global]
Instance CRmin_morphT
: forall {R : ConstructiveReals},
CMorphisms.Proper
(CMorphisms.respectful (CReq R) (CMorphisms.respectful (CReq R) (CReq R))) (@CRmin R).
Lemma CRmin_l : forall {R : ConstructiveReals} (x y : CRcarrier R),
CRmin x y <= x.
apply (CRmult_le_reg_r (CR_of_Q R 2)).
apply CR_of_Q_lt; reflexivity.
rewrite CRmult_assoc, <- CR_of_Q_mult.
setoid_replace ((1 # 2) * 2)%Q with 1%Q.
rewrite (CR_of_Q_plus _ 1 1), CRmult_plus_distr_l, CRmult_1_r.
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.
Lemma CRmin_r : forall {R : ConstructiveReals} (x y : CRcarrier R),
CRmin x y <= y.
apply (CRmult_le_reg_r (CR_of_Q R 2)).
apply CR_of_Q_lt; reflexivity.
rewrite CRmult_assoc, <- CR_of_Q_mult.
setoid_replace ((1 # 2) * 2)%Q with 1%Q.
rewrite (CR_of_Q_plus _ 1 1), CRmult_plus_distr_l, CRmult_1_r.
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.
Lemma CRnegPartAbsMin : forall {R : ConstructiveReals} (x : CRcarrier R),
CRmin 0 x == (x - CRabs _ x) * (CR_of_Q _ (1#2)).
rewrite CRopp_0, CRplus_0_r.
Lemma CRmin_sym : forall {R : ConstructiveReals} (x y : CRcarrier R),
CRmin x y == CRmin y x.
rewrite (CRplus_comm x y).
Lemma CRmin_mult :
forall {R : ConstructiveReals} (p q r : CRcarrier R),
0 <= r -> CRmin (r * p) (r * q) == r * CRmin p q.
setoid_replace (r * q - r * p) with (r * (q - p)).
rewrite CRopp_mult_distr_r.
do 2 rewrite <- CRmult_plus_distr_l.
rewrite CRopp_mult_distr_r.
rewrite <- CRmult_plus_distr_l.
Lemma CRmin_plus : forall {R : ConstructiveReals} (x y z : CRcarrier R),
x + CRmin y z == CRmin (x + y) (x + z).
setoid_replace (x + z + - (x + y)) with (z-y).
apply (CRmult_eq_reg_r (CR_of_Q _ 2)).
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.
rewrite CRmult_assoc, <- CR_of_Q_mult.
setoid_replace ((1 # 2) * 2)%Q with 1%Q.
rewrite (CR_of_Q_plus _ 1 1), CRmult_plus_distr_l, CRmult_1_r.
do 3 rewrite (CRplus_assoc x).
do 2 rewrite <- CRplus_assoc.
rewrite CRopp_plus_distr.
rewrite CRplus_comm, <- CRplus_assoc, CRplus_opp_l.
Lemma CRmin_left : forall {R : ConstructiveReals} (x y : CRcarrier R),
x <= y -> CRmin x y == x.
apply (CRmult_eq_reg_r (CR_of_Q R 2)).
apply CR_of_Q_lt; reflexivity.
rewrite CRmult_assoc, <- CR_of_Q_mult.
setoid_replace ((1 # 2) * 2)%Q with 1%Q.
rewrite (CR_of_Q_plus _ 1 1), CRmult_plus_distr_l, CRmult_1_r.
rewrite CRopp_plus_distr.
rewrite <- CRplus_assoc, CRplus_opp_r, CRplus_0_l.
rewrite <- (CRplus_opp_r x).
Lemma CRmin_right : forall {R : ConstructiveReals} (x y : CRcarrier R),
y <= x -> CRmin x y == y.
apply (CRmult_eq_reg_r (CR_of_Q R 2)).
apply CR_of_Q_lt; reflexivity.
rewrite CRmult_assoc, <- CR_of_Q_mult.
setoid_replace ((1 # 2) * 2)%Q with 1%Q.
rewrite (CR_of_Q_plus _ 1 1), CRmult_plus_distr_l, CRmult_1_r.
do 2 rewrite CRopp_plus_distr.
rewrite (CRplus_comm x y).
do 2 rewrite CRopp_involutive.
rewrite CRplus_comm, CRplus_assoc, CRplus_opp_l, CRplus_0_r.
rewrite <- (CRplus_opp_r x).
Lemma CRmin_lt : forall {R : ConstructiveReals} (x y z : CRcarrier R),
z < x -> z < y -> z < CRmin x y.
apply (CRmult_lt_reg_r (CR_of_Q R 2)).
apply CR_of_Q_lt; reflexivity.
rewrite CRmult_assoc, <- CR_of_Q_mult.
setoid_replace ((1 # 2) * 2)%Q with 1%Q.
apply (CRplus_lt_reg_l _ (CRabs _ (y - x) - (z*CR_of_Q R 2))).
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)).
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), CRmult_plus_distr_l.
apply CRplus_le_lt_compat.
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), CRmult_plus_distr_l.
apply CRplus_le_lt_compat.
apply CRopp_gt_lt_contravar, H0.
apply CRopp_gt_lt_contravar, H0.
Lemma CRmin_contract : forall {R : ConstructiveReals} (x y a : CRcarrier R),
CRabs _ (CRmin x a - CRmin y a) <= CRabs _ (x - y).
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: 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.
apply (CRle_trans
_ (CRabs _ (x - y) + CRabs _ (CRabs _ (a - y) - CRabs _ (a - x)))).
apply CRplus_le_compat_l.
rewrite (CRabs_morph (x-y) ((a-y)-(a-x))).
rewrite (CRplus_comm (a + - y)).
rewrite CRplus_comm, CRopp_plus_distr, <- CRplus_assoc.
rewrite CRplus_opp_r, CRopp_involutive, CRplus_0_l.
rewrite <- CRmult_plus_distr_l.
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.
do 4 rewrite CRplus_assoc.
rewrite CRplus_comm, CRopp_plus_distr.
rewrite CRopp_plus_distr.
rewrite (CRplus_comm (-a)).
rewrite CRplus_assoc, <- (CRplus_assoc (-a)), CRplus_opp_l.
rewrite CRplus_0_l, CRopp_involutive.
Lemma CRmin_glb : forall {R : ConstructiveReals} (x y z:CRcarrier R),
z <= x -> z <= y -> z <= CRmin x y.
apply (CRmult_le_reg_r (CR_of_Q R 2)).
apply CR_of_Q_lt; reflexivity.
rewrite CRmult_assoc, <- CR_of_Q_mult.
setoid_replace ((1 # 2) * 2)%Q with 1%Q.
apply (CRplus_le_reg_l (CRabs _ (y-x) - (z*CR_of_Q R 2))).
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.
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), CRmult_plus_distr_l.
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), CRmult_plus_distr_l.
apply CRplus_le_compat; apply CRopp_ge_le_contravar; exact H.
Lemma CRmin_assoc : forall {R : ConstructiveReals} (a b c : CRcarrier R),
CRmin a (CRmin b c) == CRmin (CRmin a b) c.
apply (CRle_trans _ (CRmin a b)).
apply (CRle_trans _ (CRmin a b)).
apply (CRle_trans _ (CRmin b c)).
apply (CRle_trans _ (CRmin b c)).
Lemma CRlt_min : forall {R : ConstructiveReals} (x y z : CRcarrier R),
z < CRmin x y -> prod (z < x) (z < y).
destruct (CR_Q_dense R _ _ H) as [q qmaj].
apply (CRlt_le_trans _ (CR_of_Q R q) _ c).
apply (CRlt_asym _ _ c0).
apply (CRle_lt_trans _ x).
apply (CRlt_le_trans _ (CR_of_Q R q) _ c).
apply (CRlt_asym _ _ c0).
apply (CRle_lt_trans _ y).
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.
#[global]
Instance CRmax_morphT
: forall {R : ConstructiveReals},
CMorphisms.Proper
(CMorphisms.respectful (CReq R) (CMorphisms.respectful (CReq R) (CReq R))) (@CRmax R).
Lemma CRmax_lub : forall {R : ConstructiveReals} (x y z:CRcarrier R),
x <= z -> y <= z -> CRmax x y <= z.
apply (CRmult_le_reg_r (CR_of_Q _ 2)).
apply CR_of_Q_lt; reflexivity.
rewrite CRmult_assoc, <- CR_of_Q_mult.
setoid_replace ((1 # 2) * 2)%Q with 1%Q.
apply (CRplus_le_reg_l (-x-y)).
rewrite <- CRopp_plus_distr, CRplus_opp_l, CRplus_0_l.
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, 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, CRmult_1_r.
apply CRplus_le_compat; assumption.
Lemma CRmax_l : forall {R : ConstructiveReals} (x y : CRcarrier R),
x <= CRmax x y.
apply (CRmult_le_reg_r (CR_of_Q R 2)).
apply CR_of_Q_lt; reflexivity.
rewrite CRmult_assoc, <- CR_of_Q_mult.
setoid_replace ((1 # 2) * 2)%Q with 1%Q.
setoid_replace 2%Q with (1+1)%Q.
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.
Lemma CRmax_r : forall {R : ConstructiveReals} (x y : CRcarrier R),
y <= CRmax x y.
apply (CRmult_le_reg_r (CR_of_Q _ 2)).
apply CR_of_Q_lt; reflexivity.
rewrite CRmult_assoc, <- CR_of_Q_mult.
setoid_replace ((1 # 2) * 2)%Q with 1%Q.
rewrite (CR_of_Q_plus _ 1 1), CRmult_plus_distr_l, CRmult_1_r.
apply CRplus_le_compat_l.
apply (CRplus_le_reg_l (-x)).
rewrite <- CRplus_assoc, CRplus_opp_l, CRplus_0_l.
Lemma CRposPartAbsMax : forall {R : ConstructiveReals} (x : CRcarrier R),
CRmax 0 x == (x + CRabs _ x) * (CR_of_Q R (1#2)).
rewrite CRopp_0, CRplus_0_r.
Lemma CRmax_sym : forall {R : ConstructiveReals} (x y : CRcarrier R),
CRmax x y == CRmax y x.
rewrite (CRplus_comm x y).
Lemma CRmax_plus : forall {R : ConstructiveReals} (x y z : CRcarrier R),
x + CRmax y z == CRmax (x + y) (x + z).
setoid_replace (x + z - (x + y)) with (z-y).
apply (CRmult_eq_reg_r (CR_of_Q _ 2)).
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.
rewrite CRmult_assoc, <- CR_of_Q_mult.
setoid_replace ((1 # 2) * 2)%Q with 1%Q.
rewrite (CR_of_Q_plus _ 1 1), CRmult_plus_distr_l, CRmult_1_r.
do 3 rewrite (CRplus_assoc x).
do 2 rewrite <- CRplus_assoc.
rewrite CRopp_plus_distr.
rewrite CRplus_comm, <- CRplus_assoc, CRplus_opp_l.
Lemma CRmax_left : forall {R : ConstructiveReals} (x y : CRcarrier R),
y <= x -> CRmax x y == x.
apply (CRmult_eq_reg_r (CR_of_Q R 2)).
apply CR_of_Q_lt; reflexivity.
rewrite CRmult_assoc, <- CR_of_Q_mult.
setoid_replace ((1 # 2) * 2)%Q with 1%Q.
rewrite (CR_of_Q_plus _ 1 1), CRmult_plus_distr_l, CRmult_1_r.
rewrite CRopp_plus_distr, CRopp_involutive.
rewrite <- CRplus_assoc, CRplus_opp_r, CRplus_0_l.
rewrite <- (CRplus_opp_r x).
apply CRplus_le_compat_r.
Lemma CRmax_right : forall {R : ConstructiveReals} (x y : CRcarrier R),
x <= y -> CRmax x y == y.
apply (CRmult_eq_reg_r (CR_of_Q R 2)).
apply CR_of_Q_lt; reflexivity.
rewrite CRmult_assoc, <- CR_of_Q_mult.
setoid_replace ((1 # 2) * 2)%Q with 1%Q.
rewrite (CR_of_Q_plus _ 1 1), CRmult_plus_distr_l, CRmult_1_r.
rewrite (CRplus_comm x y).
rewrite CRplus_assoc, CRplus_opp_l, CRplus_0_r.
rewrite <- (CRplus_opp_r x).
apply CRplus_le_compat_r.
Lemma CRmax_contract : forall {R : ConstructiveReals} (x y a : CRcarrier R),
CRabs _ (CRmax x a - CRmax y a) <= CRabs _ (x - y).
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: 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.
apply (CRle_trans
_ (CRabs _ (x - y) + CRabs _ (CRabs _ (a - x) - CRabs _ (a - y)))).
apply CRplus_le_compat_l.
rewrite (CRabs_minus_sym x y).
rewrite (CRabs_morph (y-x) ((a-x)-(a-y))).
rewrite (CRplus_comm (a + - x)).
rewrite CRplus_comm, CRopp_plus_distr, <- CRplus_assoc.
rewrite CRplus_opp_r, CRopp_involutive, CRplus_0_l.
rewrite <- CRmult_plus_distr_l.
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.
rewrite CRopp_mult_distr_l.
rewrite <- CRmult_plus_distr_r.
do 4 rewrite CRplus_assoc.
rewrite CRplus_comm, CRopp_plus_distr.
rewrite CRopp_plus_distr.
rewrite (CRplus_comm (-a)).
rewrite CRplus_assoc, <- (CRplus_assoc (-a)), CRplus_opp_l.
Lemma CRmax_lub_lt : forall {R : ConstructiveReals} (x y z : CRcarrier R),
x < z -> y < z -> CRmax x y < z.
apply (CRmult_lt_reg_r (CR_of_Q R 2)).
apply CR_of_Q_lt; reflexivity.
rewrite CRmult_assoc, <- CR_of_Q_mult.
setoid_replace ((1 # 2) * 2)%Q with 1%Q.
apply (CRplus_lt_reg_l _ (-y -x)).
rewrite CRplus_assoc, <- (CRplus_assoc (-x)), <- (CRplus_assoc (-x)).
rewrite CRplus_opp_l, CRplus_0_l, <- CRplus_assoc, CRplus_opp_l, CRplus_0_l.
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), CRmult_plus_distr_l.
apply CRplus_le_lt_compat.
rewrite CRopp_plus_distr, CRopp_involutive.
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), CRmult_plus_distr_l.
apply CRplus_le_lt_compat.
Lemma CRmax_assoc : forall {R : ConstructiveReals} (a b c : CRcarrier R),
CRmax a (CRmax b c) == CRmax (CRmax a b) c.
apply (CRle_trans _ (CRmax b c)).
apply (CRle_trans _ (CRmax b c)).
apply (CRle_trans _ (CRmax a b)).
apply (CRle_trans _ (CRmax a b)).
Lemma CRmax_min_mult_neg :
forall {R : ConstructiveReals} (p q r:CRcarrier R),
r <= 0 -> CRmax (r * p) (r * q) == r * CRmin p q.
setoid_replace (r * q - r * p) with (r * (q - p)).
rewrite (CRabs_left r), <- CRmult_assoc.
rewrite <- CRopp_mult_distr_l, CRopp_mult_distr_r,
CRmult_plus_distr_l, CRmult_plus_distr_l.
rewrite CRmult_plus_distr_l, CRopp_mult_distr_r.
Lemma CRlt_max : forall {R : ConstructiveReals} (x y z : CRcarrier R),
CRmax x y < z -> prod (x < z) (y < z).
destruct (CR_Q_dense R _ _ H) as [q qmaj].
apply (CRlt_le_trans _ (CR_of_Q R q)).
apply (CRle_lt_trans _ (CRmax x y)).
apply (CRlt_le_trans _ (CR_of_Q R q)).
apply (CRle_lt_trans _ (CRmax x y)).
Lemma CRmax_mult :
forall {R : ConstructiveReals} (p q r:CRcarrier R),
0 <= r -> CRmax (r * p) (r * q) == r * CRmax p q.
setoid_replace (r * q - r * p) with (r * (q - p)).
rewrite (CRabs_right r), <- CRmult_assoc.
rewrite CRmult_plus_distr_l, CRmult_plus_distr_l.
rewrite CRmult_plus_distr_l, CRopp_mult_distr_r.
Lemma CRmin_max_mult_neg :
forall {R : ConstructiveReals} (p q r:CRcarrier R),
r <= 0 -> CRmin (r * p) (r * q) == r * CRmax p q.
setoid_replace (r * q - r * p) with (r * (q - p)).
rewrite (CRabs_left r), <- CRmult_assoc.
rewrite CRopp_mult_distr_l, CRopp_involutive,
CRmult_plus_distr_l, CRmult_plus_distr_l.
rewrite CRmult_plus_distr_l, CRopp_mult_distr_r.
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).
do 2 rewrite CRmorph_plus.
apply CRopp_morph, CRmorph_proper.