Open Scope word_scope.
Local Open Scope nat.

(* Specifications: *)
Lemma wzero_wones: forall sz, sz >= 1 ->
natToWord sz 0 <> wones sz.
Lemma wzero_wplus: forall sz w, wzero sz ^+ w = w.
Lemma wordToNat_nonZero sz (w: word sz):
w <> wzero sz -> wordToNat w > 0.
Lemma split2_pow2: forall sz n,
2 ^ sz <= n < 2 ^ S sz ->
wordToNat (split2 sz 1 (natToWord (sz + 1) n)) = 1.
Lemma combine_wones_WO sz:
forall w, w <> wzero sz -> split2 sz 1 (combine (wones sz) ($ 0) ^+ combine w ($ 0)) = WO~1.
Lemma wordToNat_plus sz (w1 w2: word sz):
natToWord sz (wordToNat w1 + wordToNat w2) = w1 ^+ w2.
Lemma wordToNat_natToWord_eqn sz:
forall n,
wordToNat (natToWord sz n) = n mod (pow2 sz).
Lemma mod_factor a b c:
b <> 0 ->
c <> 0 ->
(a mod (b * c)) mod b = a mod b.
Lemma split1_combine_wplus sz1 sz2 (w11 w21: word sz1) (w12 w22: word sz2):
split1 _ _ (combine w11 w12 ^+ combine w21 w22) = w11 ^+ w21.
Lemma div_2 a b:
b <> 0 ->
a < b * 2 ->
a >= b ->
a / b = 1.
Lemma mod_sub a b:
b <> 0 ->
a < b * 2 ->
a >= b ->
a mod b = a - b.
Lemma wordToNat_wneg_non_0 sz: forall (a: word sz),
a <> natToWord _ 0 ->
# (wneg a) = pow2 sz - #a.
Lemma wordToNat_wnot sz: forall (a: word sz),
# (wnot a) = pow2 sz - #a - 1.
Lemma wzero_wor: forall sz w, w ^| wzero sz = w.
Lemma bool_prop1: forall a b, a && negb (a && b) = a && negb b.
Lemma wordToNat_wplus sz (w1 w2: word sz):
#(w1 ^+ w2) = (#w1 + #w2) mod (pow2 sz).
Lemma wordToNat_wmult : forall (sz : nat) (w1 w2 : word sz),
#(w1 ^* w2) = (#w1 * #w2) mod pow2 sz.