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

Lemma Zge_cases n m : if n >=? m then n >= m else n < m.