Documentation

Std.Tactic.BVDecide.Normalize.BitVec

This module contains the BitVec simplifying part of the bv_normalize simp set.

theorem Std.Tactic.BVDecide.Normalize.BitVec.slt_eq_ult {w : Nat} (x y : BitVec w) :
x.slt y = (!x.getLsbD (w - 1) == y.getLsbD (w - 1) ^^ x.ult y)
theorem Std.Tactic.BVDecide.Normalize.BitVec.sle_eq_ult {w : Nat} (x y : BitVec w) :
x.sle y = !(!x.getLsbD (w - 1) == y.getLsbD (w - 1) ^^ y.ult x)
theorem Std.Tactic.BVDecide.Normalize.BitVec.sdiv_udiv {w : Nat} (x y : BitVec w) :
x.sdiv y = bif x.getLsbD (w - 1) then bif y.getLsbD (w - 1) then -x / -y else -(-x / y) else bif y.getLsbD (w - 1) then -(x / -y) else x / y
theorem Std.Tactic.BVDecide.Normalize.BitVec.smod_umod {w : Nat} (x y : BitVec w) :
x.smod y = bif x.getLsbD (w - 1) then bif y.getLsbD (w - 1) then -(-x % -y) else bif -x % y == 0#w then -x % y else y - -x % y else bif y.getLsbD (w - 1) then bif x % -y == 0#w then x % -y else x % -y + y else x.umod y
theorem Std.Tactic.BVDecide.Normalize.BitVec.smtSDiv_smtUDiv {w : Nat} (x y : BitVec w) :
x.smtSDiv y = bif x.getLsbD (w - 1) then bif y.getLsbD (w - 1) then (-x).smtUDiv (-y) else -(-x).smtUDiv y else bif y.getLsbD (w - 1) then -x.smtUDiv (-y) else x.smtUDiv y
theorem Std.Tactic.BVDecide.Normalize.BitVec.srem_umod {w : Nat} (x y : BitVec w) :
x.srem y = bif x.getLsbD (w - 1) then bif y.getLsbD (w - 1) then -(-x % -y) else -(-x % y) else bif y.getLsbD (w - 1) then x % -y else x % y
theorem Std.Tactic.BVDecide.Normalize.BitVec.abs_eq {w : Nat} (x : BitVec w) :
x.abs = bif x.getLsbD (w - 1) then -x else x
theorem Std.Tactic.BVDecide.Normalize.BitVec.add_const_left {w : Nat} (a b c : BitVec w) :
a + (b + c) = a + b + c
theorem Std.Tactic.BVDecide.Normalize.BitVec.add_const_right {w : Nat} (a b c : BitVec w) :
a + (b + c) = a + c + b
theorem Std.Tactic.BVDecide.Normalize.BitVec.neg_mul {w : Nat} (x y : BitVec w) :
(~~~x + 1#w) * y = ~~~(x * y) + 1#w
theorem Std.Tactic.BVDecide.Normalize.BitVec.mul_neg {w : Nat} (x y : BitVec w) :
x * (~~~y + 1#w) = ~~~(x * y) + 1#w
theorem Std.Tactic.BVDecide.Normalize.BitVec.lt_one_iff {n : Nat} (a : BitVec n) (h : 0 < n) :
a.ult 1#n = (a == 0#n)
theorem Std.Tactic.BVDecide.Normalize.BitVec.udiv_ofNat_eq_of_lt (w : Nat) (x : BitVec w) (n k : Nat) (hk : 2 ^ k = n) (hlt : k < w) :
x / BitVec.ofNat w n = x >>> k

x / (BitVec.ofNat n) where n = 2^k is the same as shifting x right by k.