(************************************************************************)
(*         *      The Rocq Prover / The Rocq Development Team           *)
(*  v      *         Copyright INRIA, CNRS and contributors             *)
(* <O___,, * (see version control and CREDITS file for authors & dates) *)
(*   \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)         *)
(************************************************************************)
Local Open Scope Z_scope.
(** * 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.
(** Properties in term of [if ... then ... else ...] *)

(* 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.
(** Lemmas on [Z.leb] used in contrib/graphs *)
Lemma Zle_bool_imp_le n m : (n <=? m) = true -> (n <= m).
Lemma Zle_imp_le_bool n m : (n <= m) -> (n <=? m) = true.
Notation Zle_bool_refl := Z.leb_refl (only parsing).
Lemma Zle_bool_antisym n m :
(n <=? m) = true -> (m <=? n) = true -> n = m.
Lemma Zle_bool_trans n m p :
(n <=? m) = true -> (m <=? p) = true -> (n <=? p) = true.