Qed.

(* Specifications: *)
Theorem mod2_double : forall n, mod2 (2 * n) = false.
induction n; simpl; intuition; rewrite <- plus_n_Sm; rethink.
Theorem div2_double : forall n, div2 (2 * n) = n.
induction n; simpl; intuition; rewrite <- plus_n_Sm; f_equal; rethink.
Theorem div2_S_double : forall n, div2 (S (2 * n)) = n.
induction n; simpl; intuition; f_equal; rethink.
Theorem roundTrip_0 : forall sz, wordToNat (natToWord sz 0) = 0.
induction sz; simpl; intuition.
Theorem wplus_unit : forall sz (x : word sz), natToWord sz 0 ^+ x = x.
intros; rewrite wplus_alt; unfold wplusN, wordBinN; intros.
Theorem drop_sub :
forall sz n k,
(k * pow2 sz <= n)%nat ->
natToWord sz (n - k * pow2 sz) = natToWord sz n.
Theorem roundTrip_1': forall sz, sz <> 0 -> wordToNat (natToWord sz 1) = 1.
Theorem mod2_WS : forall sz (x : word sz) b, mod2 (wordToNat (WS b x)) = b.
intros sz x b. rewrite wordToNat_wordToNat'.
Theorem wmult_unit_r : forall sz (x : word sz), x ^* natToWord sz 1 = x.
Lemma wmult_neut_l: forall (sz : nat) (x : word sz), $0 ^* x = $0.
Lemma wmult_neut_r: forall (sz : nat) (x : word sz), x ^* $0 = $0.
Theorem wmult_assoc : forall sz (x y z : word sz), x ^* (y ^* z) = x ^* y ^* z.
intros sz x y z; repeat rewrite wmult_alt; unfold wmultN, wordBinN; intros.
Theorem wordToNat_bound : forall sz (w : word sz), (wordToNat w < pow2 sz)%nat.
induction w as [|b]; simpl; intuition.
Theorem natToWord_inj : forall sz n m, natToWord sz n = natToWord sz m
-> (n < pow2 sz)%nat
-> (m < pow2 sz)%nat
-> n = m.