(* 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.
Add Parametric Morphism : CReal_max
with signature CRealEq ==> CRealEq ==> CRealEq
as CReal_max_morph.

(* Specifications: *)
Lemma CReal_double : forall x:CReal, 2 * x == x + x.
Lemma CReal_max_lub : forall x y z:CReal,
x <= z -> y <= z -> CReal_max x y <= z.
Lemma CReal_min_glb : forall x y z:CReal,
z <= x -> z <= y -> z <= CReal_min x y.
Lemma CReal_max_l : forall x y : CReal, x <= CReal_max x y.
Lemma CReal_max_r : forall x y : CReal, y <= CReal_max x y.
Lemma CReal_min_l : forall x y : CReal, CReal_min x y <= x.
Lemma CReal_min_r : forall x y : CReal, CReal_min x y <= y.
Lemma CReal_min_left : forall x y : CReal,
x <= y -> CReal_min x y == x.
Lemma CReal_min_right : forall x y : CReal,
y <= x -> CReal_min x y == y.
Lemma CReal_max_left : forall x y : CReal,
y <= x -> CReal_max x y == x.
Lemma CReal_max_right : forall x y : CReal,
x <= y -> CReal_max x y == y.
Lemma CReal_min_lt_r : forall x y : CReal,
CReal_min x y < y -> CReal_min x y == x.
Lemma posPartAbsMax : forall x : CReal,
CReal_max 0 x == (x + CReal_abs x) * (inject_Q (1#2)).
Lemma negPartAbsMin : forall x : CReal,
CReal_min 0 x == (x - CReal_abs x) * (inject_Q (1#2)).
Lemma CReal_min_sym : forall (x y : CReal),
CReal_min x y == CReal_min y x.
Lemma CReal_max_sym : forall (x y : CReal),
CReal_max x y == CReal_max y x.
Lemma CReal_min_mult :
forall (p q r:CReal), 0 <= r -> CReal_min (r * p) (r * q) == r * CReal_min p q.
Lemma CReal_min_plus : forall (x y z : CReal),
x + CReal_min y z == CReal_min (x + y) (x + z).
Lemma CReal_max_plus : forall (x y z : CReal),
x + CReal_max y z == CReal_max (x + y) (x + z).
Lemma CReal_min_lt : forall x y z : CReal,
z < x -> z < y -> z < CReal_min x y.
Lemma CReal_max_assoc : forall a b c : CReal,
CReal_max a (CReal_max b c) == CReal_max (CReal_max a b) c.
Lemma CReal_min_max_mult_neg :
forall (p q r:CReal), r <= 0 -> CReal_min (r * p) (r * q) == r * CReal_max p q.
Lemma CReal_min_assoc : forall a b c : CReal,
CReal_min a (CReal_min b c) == CReal_min (CReal_min a b) c.
Lemma CReal_max_lub_lt : forall x y z : CReal,
x < z -> y < z -> CReal_max x y < z.
Lemma CReal_max_contract : forall x y a : CReal,
CReal_abs (CReal_max x a - CReal_max y a)
<= CReal_abs (x - y).
Lemma CReal_min_contract : forall x y a : CReal,
CReal_abs (CReal_min x a - CReal_min y a)
<= CReal_abs (x - y).