(* otherwise b is made implicit, while a isn't, which is weird *)

(* Specifications: *)
Lemma pow2_add_mul: forall a b,
pow2 (a + b) = (pow2 a) * (pow2 b).
Lemma mult_pow2_bound: forall a b x y,
x < pow2 a -> y < pow2 b -> x * y < pow2 (a + b).
Lemma mult_pow2_bound_ex: forall a c x y,
x < pow2 a -> y < pow2 (c - a) -> c >= a -> x * y < pow2 c.
Lemma lt_mul_mono' : forall c a b,
a < b -> a < b * (S c).
Lemma lt_mul_mono : forall a b c,
c <> 0 -> a < b -> a < b * c.
Lemma zero_lt_pow2 : forall sz, 0 < pow2 sz.
Lemma one_lt_pow2:
forall n,
1 < pow2 (S n).
Lemma one_le_pow2 : forall sz, 1 <= pow2 sz.
Lemma pow2_ne_zero: forall n, pow2 n <> 0.
Lemma mul2_add : forall n, n * 2 = n + n.
Lemma pow2_le_S : forall sz, (pow2 sz) + 1 <= pow2 (sz + 1).
Lemma pow2_bound_mono: forall a b x,
x < pow2 a -> a <= b -> x < pow2 b.
Lemma pow2_inc : forall n m,
0 < n -> n < m ->
pow2 n < pow2 m.
Lemma pow2_S: forall x, pow2 (S x) = 2 * pow2 x.
Lemma mod2_S_not : forall n,
mod2 (S n) = if (mod2 n) then false else true.
Lemma mod2_S_eq : forall n k,
mod2 n = mod2 k ->
mod2 (S n) = mod2 (S k).
Theorem drop_mod2_add : forall n k,
mod2 (n + 2 * k) = mod2 n.
Lemma mod2sub: forall a b,
b <= a ->
mod2 (a - b) = xorb (mod2 a) (mod2 b).
Theorem mod2_pow2_twice: forall n,
mod2 (pow2 n + (pow2 n + 0)) = false.
Theorem div2_plus_2 : forall n k,
div2 (n + 2 * k) = div2 n + k.
Lemma pred_add:
forall n, n <> 0 -> pred n + 1 = n.
Lemma pow2_zero: forall sz, (pow2 sz > 0)%nat.
Section omega_compat.