Fact eq_rect_combine_dist_helper1 : forall a b c d, b * c = d -> (a + b) * c = a * c + d.

(* Specifications: *)
Lemma wzero_dist : forall a b c H,
wzero ((a + b) * c) = eq_rect _ word (wzero (a * c + b * c)) _ H.
Lemma wzero_rev : forall (a b : nat) H,
wzero (a + b) = eq_rect _ word (wzero (b + a)) _ H.
Lemma split2_zero : forall sz1 sz2, split2 sz1 sz2 (natToWord _ O) = natToWord _ O.
Theorem combine_inj : forall sz1 sz2 a b c d,
@combine sz1 a sz2 b = @combine sz1 c sz2 d -> a = c /\ b = d.
Theorem combine_wzero : forall sz1 sz2, combine (wzero sz1) (wzero sz2) = wzero (sz1 + sz2).
Theorem combine_wones : forall sz1 sz2, combine (wones sz1) (wones sz2) = wones (sz1 + sz2).
Theorem wordToN_nat : forall sz (w : word sz), wordToN w = N_of_nat (wordToNat w).
Lemma wordToN_to_nat sz: forall (w: word sz), BinNat.N.to_nat (wordToN w) = wordToNat w.
Local Hint Extern 1 (@eq nat _ _) => omega.
Theorem mod2_S : forall n k,
2 * k = S n
-> mod2 n = true.