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

(* Specifications: *)
Theorem eq_rect_combine_dist : forall a b c d (w : word ((a + b) * c)) (H : b * c = d), b * c = d -> let H1 := (eq_rect_combine_dist_helper1 a b c H) in let H2 := (eq_rect_combine_dist_helper2 a b c H) in let w' := eq_rec ((a + b) * c) word w _ H1 in w = eq_rec _ word (combine (split1 (a * c) d w') (split2 (a * c) d w')) _ H2.
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 split1_zero : forall sz1 sz2, split1 sz1 sz2 (natToWord _ O) = natToWord _ O.
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.
Theorem mod2_S : forall n k, 2 * k = S n -> mod2 n = true.
Theorem wzero'_def : forall sz, wzero' sz = wzero sz.
Theorem posToWord_nat : forall p sz, posToWord sz p = natToWord sz (nat_of_P p).
Theorem NToWord_nat : forall sz n, NToWord sz n = natToWord sz (nat_of_N n).
Theorem wplus_alt : forall sz (x y : word sz), wplus x y = wplusN x y.
Theorem wmult_alt : forall sz (x y : word sz), wmult x y = wmultN x y.
Theorem wneg_alt : forall sz (x : word sz), wneg x = wnegN x.
Theorem wminus_Alt : forall sz (x y : word sz), wminus x y = wminusN x y.
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, wordToNat (natToWord (S sz) 1) = 1.
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.
Theorem div2_WS : forall sz (x : word sz) b, div2 (wordToNat (WS b x)) = wordToNat x.
Theorem wordToNat_bound : forall sz (w : word sz), (wordToNat w < pow2 sz)%nat.
Theorem natToWord_pow2 : forall sz, natToWord sz (pow2 sz) = natToWord sz 0.