Definition zle: forall (x y: Z), {x <= y} + {x > y} := Z_le_gt_dec.

(* Specifications: *)
Lemma zle_true: forall (A: Type) (x y: Z) (a b: A), x <= y -> (if zle x y then a else b) = a.
Lemma zle_false: forall (A: Type) (x y: Z) (a b: A), x > y -> (if zle x y then a else b) = b.
Lemma two_power_nat_O : two_power_nat O = 1.
Lemma two_power_nat_pos : forall n : nat, two_power_nat n > 0.
Lemma two_power_nat_two_p: forall x, two_power_nat x = two_p (Z.of_nat x).
Lemma two_p_monotone: forall x y, 0 <= x <= y -> two_p x <= two_p y.
Lemma two_p_monotone_strict: forall x y, 0 <= x < y -> two_p x < two_p y.
Lemma two_p_strict: forall x, x >= 0 -> x < two_p x.
Lemma two_p_strict_2: forall x, x >= 0 -> 2 * x - 1 < two_p x.
Lemma Zmin_spec: forall x y, Z.min x y = if zlt x y then x else y.
Lemma Zmax_spec: forall x y, Z.max x y = if zlt y x then x else y.
Lemma Zmax_bound_l: forall x y z, x <= y -> x <= Z.max y z.
Lemma Zmax_bound_r: forall x y z, x <= z -> x <= Z.max y z.
Lemma Zdiv_small: forall x y, 0 <= x < y -> x / y = 0.
Lemma Zmod_small: forall x y, 0 <= x < y -> x mod y = x.
Lemma Zmod_unique: forall x y a b, x = a * y + b -> 0 <= b < y -> x mod y = b.
Lemma Zdiv_unique: forall x y a b, x = a * y + b -> 0 <= b < y -> x / y = a.
Lemma Zdiv_Zdiv: forall a b c, b > 0 -> c > 0 -> (a / b) / c = a / (b * c).
Lemma Zmult_le_compat_l_neg : forall n m p:Z, n >= m -> p <= 0 -> p * n <= p * m.
Lemma Zdiv_interval_1: forall lo hi a b, lo <= 0 -> hi > 0 -> b > 0 -> lo * b <= a < hi * b -> lo <= a/b < hi.
Lemma Zdiv_interval_2: forall lo hi a b, lo <= a <= hi -> lo <= 0 -> hi >= 0 -> b > 0 -> lo <= a/b <= hi.
Lemma Zmod_recombine: forall x a b, a > 0 -> b > 0 -> x mod (a * b) = ((x/b) mod a) * b + (x mod b).
Lemma Zdivides_trans: forall x y z, (x | y) -> (y | z) -> (x | z).
Lemma zle_true: forall (A: Type) (x y: Z) (a b: A), x <= y -> (if zle x y then a else b) = a.
Lemma zle_false: forall (A: Type) (x y: Z) (a b: A), x > y -> (if zle x y then a else b) = b.
Lemma two_power_nat_O : two_power_nat O = 1.
Lemma two_power_nat_pos : forall n : nat, two_power_nat n > 0.
Lemma two_power_nat_two_p: forall x, two_power_nat x = two_p (Z.of_nat x).
Lemma two_p_monotone: forall x y, 0 <= x <= y -> two_p x <= two_p y.
Lemma two_p_monotone_strict: forall x y, 0 <= x < y -> two_p x < two_p y.
Lemma two_p_strict: forall x, x >= 0 -> x < two_p x.
Lemma two_p_strict_2: forall x, x >= 0 -> 2 * x - 1 < two_p x.
Lemma Zmin_spec: forall x y, Z.min x y = if zlt x y then x else y.
Lemma Zmax_spec: forall x y, Z.max x y = if zlt y x then x else y.
Lemma Zmax_bound_l: forall x y z, x <= y -> x <= Z.max y z.
Lemma Zmax_bound_r: forall x y z, x <= z -> x <= Z.max y z.
Lemma Zdiv_small: forall x y, 0 <= x < y -> x / y = 0.
Lemma Zmod_small: forall x y, 0 <= x < y -> x mod y = x.
Lemma Zmod_unique: forall x y a b, x = a * y + b -> 0 <= b < y -> x mod y = b.
Lemma Zdiv_unique: forall x y a b, x = a * y + b -> 0 <= b < y -> x / y = a.
Lemma Zdiv_Zdiv: forall a b c, b > 0 -> c > 0 -> (a / b) / c = a / (b * c).
Lemma Zmult_le_compat_l_neg : forall n m p:Z, n >= m -> p <= 0 -> p * n <= p * m.
Lemma Zdiv_interval_1: forall lo hi a b, lo <= 0 -> hi > 0 -> b > 0 -> lo * b <= a < hi * b -> lo <= a/b < hi.
Lemma Zdiv_interval_2: forall lo hi a b, lo <= a <= hi -> lo <= 0 -> hi >= 0 -> b > 0 -> lo <= a/b <= hi.
Lemma Zmod_recombine: forall x a b, a > 0 -> b > 0 -> x mod (a * b) = ((x/b) mod a) * b + (x mod b).
Lemma Zdivides_trans: forall x y z, (x | y) -> (y | z) -> (x | z).