Hint Rewrite bits_and bits_or bits_xor bits_not: ints.

(* Specifications: *)
Theorem and_commut: forall x y, and x y = and y x.
Theorem and_assoc: forall x y z, and (and x y) z = and x (and y z).
Theorem and_zero: forall x, and x zero = zero.
Corollary and_zero_l: forall x, and zero x = zero.
Theorem and_mone: forall x, and x mone = x.
Corollary and_mone_l: forall x, and mone x = x.
Theorem and_idem: forall x, and x x = x.
Theorem or_commut: forall x y, or x y = or y x.
Theorem or_assoc: forall x y z, or (or x y) z = or x (or y z).
Theorem or_zero: forall x, or x zero = x.
Corollary or_zero_l: forall x, or zero x = x.
Theorem or_mone: forall x, or x mone = mone.
Theorem or_idem: forall x, or x x = x.
Theorem and_or_distrib:
forall x y z,
and x (or y z) = or (and x y) (and x z).
Corollary and_or_distrib_l:
forall x y z,
and (or x y) z = or (and x z) (and y z).
Theorem or_and_distrib:
forall x y z,
or x (and y z) = and (or x y) (or x z).
Corollary or_and_distrib_l:
forall x y z,
or (and x y) z = and (or x z) (or y z).
Theorem and_or_absorb: forall x y, and x (or x y) = x.
Theorem or_and_absorb: forall x y, or x (and x y) = x.
Theorem xor_commut: forall x y, xor x y = xor y x.
Theorem xor_assoc: forall x y z, xor (xor x y) z = xor x (xor y z).
Theorem xor_zero: forall x, xor x zero = x.
Corollary xor_zero_l: forall x, xor zero x = x.
Theorem xor_idem: forall x, xor x x = zero.
Theorem xor_zero_one: xor zero one = one.
Theorem xor_is_zero: forall x y, eq (xor x y) zero = eq x y.
Theorem and_xor_distrib:
forall x y z,
and x (xor y z) = xor (and x y) (and x z).
Theorem and_le:
forall x y, unsigned (and x y) <= unsigned x.
Theorem or_le:
forall x y, unsigned x <= unsigned (or x y).
Theorem and_commut: forall x y, and x y = and y x.
Theorem and_assoc: forall x y z, and (and x y) z = and x (and y z).
Theorem and_zero: forall x, and x zero = zero.
Corollary and_zero_l: forall x, and zero x = zero.
Theorem and_mone: forall x, and x mone = x.
Corollary and_mone_l: forall x, and mone x = x.
Theorem and_idem: forall x, and x x = x.
Theorem or_commut: forall x y, or x y = or y x.
Theorem or_assoc: forall x y z, or (or x y) z = or x (or y z).
Theorem or_zero: forall x, or x zero = x.
Corollary or_zero_l: forall x, or zero x = x.
Theorem or_mone: forall x, or x mone = mone.
Theorem or_idem: forall x, or x x = x.
Theorem and_or_distrib:
forall x y z,
and x (or y z) = or (and x y) (and x z).
Corollary and_or_distrib_l:
forall x y z,
and (or x y) z = or (and x z) (and y z).
Theorem or_and_distrib:
forall x y z,
or x (and y z) = and (or x y) (or x z).
Corollary or_and_distrib_l:
forall x y z,
or (and x y) z = and (or x z) (or y z).
Theorem and_or_absorb: forall x y, and x (or x y) = x.
Theorem or_and_absorb: forall x y, or x (and x y) = x.
Theorem xor_commut: forall x y, xor x y = xor y x.
Theorem xor_assoc: forall x y z, xor (xor x y) z = xor x (xor y z).
Theorem xor_zero: forall x, xor x zero = x.
Corollary xor_zero_l: forall x, xor zero x = x.
Theorem xor_idem: forall x, xor x x = zero.
Theorem xor_zero_one: xor zero one = one.
Theorem xor_is_zero: forall x y, eq (xor x y) zero = eq x y.
Theorem and_xor_distrib:
forall x y z,
and x (xor y z) = xor (and x y) (and x z).
Theorem and_le:
forall x y, unsigned (and x y) <= unsigned x.
Theorem or_le:
forall x y, unsigned x <= unsigned (or x y).