(* 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).