rewrite <- IHn; clear IHn.
case_eq (Npow2 n); intuition.
Qed.
End omega_compat.

(* Specifications: *)
Theorem pow2_N : forall n, Npow2 n = N.of_nat (pow2 n).
Lemma Z_of_N_Npow2: forall n, Z.of_N (Npow2 n) = (2 ^ Z.of_nat n)%Z.
Lemma pow2_S_z:
forall n, Z.of_nat (pow2 (S n)) = (2 * Z.of_nat (pow2 n))%Z.
Lemma pow2_le:
forall n m, (n <= m)%nat -> (pow2 n <= pow2 m)%nat.
Lemma Zabs_of_nat:
forall n, Z.abs (Z.of_nat n) = Z.of_nat n.
Lemma Npow2_not_zero:
forall n, Npow2 n <> 0%N.
Lemma Npow2_S:
forall n, Npow2 (S n) = (Npow2 n + Npow2 n)%N.
Lemma Npow2_pos: forall a,
(0 < Npow2 a)%N.
Lemma minus_minus: forall a b c,
c <= b <= a ->
a - (b - c) = a - b + c.
Lemma mul_div_undo: forall i c,
c <> 0 ->
c * i / c = i.
Lemma mod_add_r: forall a b,
b <> 0 ->
(a + b) mod b = a mod b.
Lemma mod2_cases: forall (n: nat), n mod 2 = 0 \/ n mod 2 = 1.
Lemma div_mul_undo: forall a b,
b <> 0 ->
a mod b = 0 ->
a / b * b = a.
Lemma Smod2_1: forall k, S k mod 2 = 1 -> k mod 2 = 0.
Lemma mod_0_r: forall (m: nat),
m mod 0 = 0.
Lemma sub_mod_0: forall (a b m: nat),
a mod m = 0 ->
b mod m = 0 ->
(a - b) mod m = 0.
Lemma mul_div_exact: forall (a b: nat),
b <> 0 ->
a mod b = 0 ->
b * (a / b) = a.