# Library Coq.ZArith.Zbool

Require Import BinInt.
Require Import Zeven.
Require Import Zorder.
Require Import Zcompare.
Require Import ZArith_dec.
Require Import Sumbool.
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 (compat "8.3").
Notation Zge_bool := Z.geb (compat "8.3").
Notation Zlt_bool := Z.ltb (compat "8.3").
Notation Zgt_bool := Z.gtb (compat "8.3").
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 ...
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 (compat "8.3").
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.
Definition Zle_bool_total x y :
{ x <=? y = true } + { y <=? x = true }.
Lemma Zle_bool_plus_mono n m p q :
( n <=? m ) = true ->
( p <=? q ) = true ->
( n + p <=? m + q ) = true.
Lemma Zone_pos : 1 <=? 0 = false.
Lemma Zone_min_pos n : ( n <=? 0) = false -> (1 <=? n ) = true.
Properties in term of iff
Lemma Zle_is_le_bool n m : ( n <= m ) <-> ( n <=? m ) = true.
Lemma Zge_is_le_bool n m : ( n >= m ) <-> ( m <=? n ) = true.
Lemma Zlt_is_lt_bool n m : ( n < m ) <-> ( n <? m ) = true.
Lemma Zgt_is_gt_bool n m : ( n > m ) <-> ( n >? m ) = true.
Lemma Zlt_is_le_bool n m : ( n < m ) <-> ( n <=? m - 1) = true.
Lemma Zgt_is_le_bool n m : ( n > m ) <-> ( m <=? n - 1) = true.
Properties of the deprecated Zeq_bool
Lemma Zeq_is_eq_bool x y : x = y <-> Zeq_bool x y = true.
Lemma Zeq_bool_eq x y : Zeq_bool x y = true -> x = y.
Lemma Zeq_bool_neq x y : Zeq_bool x y = false -> x <> y.
Lemma Zeq_bool_if x y : if Zeq_bool x y then x = y else x <> y.