(** * Boolean operations from decidability of order *)
(** The decidability of equality and order relations over
    type [Z] gives some boolean functions with the adequate specification. *)

Definition Z_lt_ge_bool (x y:Z) := bool_of_sumbool (Z_lt_ge_dec x y).Definition Z_ge_lt_bool (x y:Z) := bool_of_sumbool (Z_ge_lt_dec x y).Definition Z_le_gt_bool (x y:Z) := bool_of_sumbool (Z_le_gt_dec x y).Definition Z_gt_le_bool (x y:Z) := bool_of_sumbool (Z_gt_le_dec x y).Definition Z_eq_bool (x y:Z) := bool_of_sumbool (Z.eq_dec x y).Definition Z_noteq_bool (x y:Z) := bool_of_sumbool (Z_noteq_dec x y).Definition Zeven_odd_bool (x:Z) := bool_of_sumbool (Zeven_odd_dec x).(**********************************************************************)
(** * Boolean comparisons of binary integers *)

Notation Zle_bool := Z.leb (only parsing).Notation Zge_bool := Z.geb (only parsing).Notation Zlt_bool := Z.ltb (only parsing).Notation Zgt_bool := Z.gtb (only parsing).(** We now provide a direct [Z.eqb] that doesn't refer to [Z.compare].
   The old [Zeq_bool] is kept for compatibility. *)

Definition Zeq_bool (x y:Z) :=
  match x ?= y with
    | Eq => true
    | _ => false
  end.Definition Zneq_bool (x y:Z) :=
  match x ?= y with
    | Eq => false
    | _ => true
  end.

(* Specifications: *)
Lemma Zle_cases n m : if n <=? m then n <= m else n > m.
Lemma Zlt_cases n m : if n <? m then n < m else n >= m.
Lemma Zge_cases n m : if n >=? m then n >= m else n < m.
Lemma Zgt_cases n m : if n >? m then n > m else n <= m.
Lemma Zle_bool_imp_le n m : (n <=? m) = true -> (n <= m).
Lemma Zle_imp_le_bool n m : (n <= m) -> (n <=? m) = true.