Documentation

Std.Data.BitVec.Lemmas

Prove equality of bitvectors in terms of nat operations.

@[deprecated Std.BitVec.eq_nil]

Replaced 2024-02-07.

@[simp]
theorem Std.BitVec.val_toFin {w : Nat} (x : Std.BitVec w) :
x.toFin = Std.BitVec.toNat x
@[simp]
theorem Std.BitVec.getLsb_ofFin {n : Nat} (x : Fin (2 ^ n)) (i : Nat) :
Std.BitVec.getLsb { toFin := x } i = Nat.testBit (x) i
@[simp]
theorem Std.BitVec.getLsb_ge {w : Nat} (x : Std.BitVec w) (i : Nat) (ge : i w) :
theorem Std.BitVec.eq_of_getLsb_eq {w : Nat} {x : Std.BitVec w} {y : Std.BitVec w} (pred : ∀ (i : Fin w), Std.BitVec.getLsb x i = Std.BitVec.getLsb y i) :
x = y
theorem Std.BitVec.eq_of_getMsb_eq {w : Nat} {x : Std.BitVec w} {y : Std.BitVec w} (pred : ∀ (i : Fin w), Std.BitVec.getMsb x i = Std.BitVec.getMsb y i) :
x = y
@[simp]
theorem Std.BitVec.toNat_ofFin {n : Nat} (x : Fin (2 ^ n)) :
Std.BitVec.toNat { toFin := x } = x
@[simp]
theorem Std.BitVec.toNat_ofNat (x : Nat) (w : Nat) :
Std.BitVec.toNat x#w = x % 2 ^ w
@[simp]
theorem Std.BitVec.getLsb_ofNat (n : Nat) (x : Nat) (i : Nat) :
@[deprecated Std.BitVec.toNat_ofNat]

cast #

@[simp]
@[simp]
theorem Std.BitVec.getLsb_cast :
∀ {a a_1 : Nat} {h : a = a_1} {v : Std.BitVec a} {i : Nat}, Std.BitVec.getLsb (Std.BitVec.cast h v) i = Std.BitVec.getLsb v i

zeroExtend and truncate #

@[simp]
@[simp]
@[simp]

extractLsb #

@[simp]
theorem Std.BitVec.extractLsb_ofFin {n : Nat} (x : Fin (2 ^ n)) (hi : Nat) (lo : Nat) :
Std.BitVec.extractLsb hi lo { toFin := x } = (x >>> lo)#(hi - lo + 1)
@[simp]
theorem Std.BitVec.extractLsb_ofNat (x : Nat) (n : Nat) (hi : Nat) (lo : Nat) :
Std.BitVec.extractLsb hi lo x#n = ((x % 2 ^ n) >>> lo)#(hi - lo + 1)
@[simp]
theorem Std.BitVec.extractLsb_toNat {n : Nat} (hi : Nat) (lo : Nat) (x : Std.BitVec n) :
@[simp]
theorem Std.BitVec.getLsb_extract {n : Nat} (hi : Nat) (lo : Nat) (x : Std.BitVec n) (i : Nat) :

or #

@[simp]

or #

xor #

@[simp]

not #

shiftLeft #

@[simp]
@[simp]
theorem Std.BitVec.getLsb_shiftLeft {m : Nat} {i : Nat} (x : Std.BitVec m) (n : Nat) :
Std.BitVec.getLsb (x <<< n) i = (decide (i < m) && !decide (i < n) && Std.BitVec.getLsb x (i - n))

ushiftRight #

@[simp]
theorem Std.BitVec.getLsb_ushiftRight {n : Nat} (x : Std.BitVec n) (i : Nat) (j : Nat) :

append #

@[simp]
theorem Std.BitVec.getLsb_append {n : Nat} {m : Nat} {i : Nat} {v : Std.BitVec n} {w : Std.BitVec m} :
Std.BitVec.getLsb (v ++ w) i = bif decide (i < m) then Std.BitVec.getLsb w i else Std.BitVec.getLsb v (i - m)

rev #

cons #

@[simp]
theorem Std.BitVec.getLsb_cons (b : Bool) {n : Nat} (x : Std.BitVec n) (i : Nat) :
Std.BitVec.getLsb (Std.BitVec.cons b x) i = if i = n then b else Std.BitVec.getLsb x i

add #

@[simp]

Definition of bitvector addition as a nat.

@[simp]
theorem Std.BitVec.ofFin_add {n : Nat} (x : Fin (2 ^ n)) (y : Std.BitVec n) :
{ toFin := x } + y = { toFin := x + y.toFin }
@[simp]
theorem Std.BitVec.add_ofFin {n : Nat} (x : Std.BitVec n) (y : Fin (2 ^ n)) :
x + { toFin := y } = { toFin := x.toFin + y }
@[simp]
theorem Std.BitVec.ofNat_add_ofNat {n : Nat} (x : Nat) (y : Nat) :
x#n + y#n = (x + y)#n
theorem Std.BitVec.add_assoc {n : Nat} (x : Std.BitVec n) (y : Std.BitVec n) (z : Std.BitVec n) :
x + y + z = x + (y + z)
theorem Std.BitVec.add_comm {n : Nat} (x : Std.BitVec n) (y : Std.BitVec n) :
x + y = y + x
@[simp]
theorem Std.BitVec.add_zero {n : Nat} (x : Std.BitVec n) :
x + 0#n = x
@[simp]
theorem Std.BitVec.zero_add {n : Nat} (x : Std.BitVec n) :
0#n + x = x

sub/neg #

theorem Std.BitVec.sub_def {n : Nat} (x : Std.BitVec n) (y : Std.BitVec n) :
@[simp]
theorem Std.BitVec.toNat_sub {n : Nat} (x : Std.BitVec n) (y : Std.BitVec n) :
@[deprecated Std.BitVec.toNat_sub]
theorem Std.BitVec.sub_toNat {n : Nat} (x : Std.BitVec n) (y : Std.BitVec n) :

Replaced 2024-02-06.

@[simp]
theorem Std.BitVec.ofFin_sub {n : Nat} (x : Fin (2 ^ n)) (y : Std.BitVec n) :
{ toFin := x } - y = { toFin := x - y.toFin }
@[simp]
theorem Std.BitVec.sub_ofFin {n : Nat} (x : Std.BitVec n) (y : Fin (2 ^ n)) :
x - { toFin := y } = { toFin := x.toFin - y }
@[simp]
theorem Std.BitVec.ofNat_sub_ofNat {n : Nat} (x : Nat) (y : Nat) :
x#n - y#n = (x + (2 ^ n - y % 2 ^ n))#n
@[simp]
theorem Std.BitVec.sub_zero {n : Nat} (x : Std.BitVec n) :
x - 0#n = x
@[simp]
theorem Std.BitVec.sub_self {n : Nat} (x : Std.BitVec n) :
x - x = 0#n
@[simp]
theorem Std.BitVec.toNat_neg {n : Nat} (x : Std.BitVec n) :
@[deprecated Std.BitVec.toNat_neg]
theorem Std.BitVec.neg_toNat {n : Nat} (x : Std.BitVec n) :

Replaced 2024-02-06.

theorem Std.BitVec.sub_toAdd {n : Nat} (x : Std.BitVec n) (y : Std.BitVec n) :
x - y = x + -y
@[simp]
theorem Std.BitVec.neg_zero (n : Nat) :
-0#n = 0#n

mul #

theorem Std.BitVec.mul_def {n : Nat} {x : Std.BitVec n} {y : Std.BitVec n} :
x * y = { toFin := x.toFin * y.toFin }

le and lt #

@[simp]
theorem Std.BitVec.le_ofFin {n : Nat} (x : Std.BitVec n) (y : Fin (2 ^ n)) :
x { toFin := y } x.toFin y
@[simp]
theorem Std.BitVec.ofFin_le {n : Nat} (x : Fin (2 ^ n)) (y : Std.BitVec n) :
{ toFin := x } y x y.toFin
@[simp]
theorem Std.BitVec.ofNat_le_ofNat {n : Nat} (x : Nat) (y : Nat) :
x#n y#n x % 2 ^ n y % 2 ^ n
@[simp]
theorem Std.BitVec.lt_ofFin {n : Nat} (x : Std.BitVec n) (y : Fin (2 ^ n)) :
x < { toFin := y } x.toFin < y
@[simp]
theorem Std.BitVec.ofFin_lt {n : Nat} (x : Fin (2 ^ n)) (y : Std.BitVec n) :
{ toFin := x } < y x < y.toFin
@[simp]
theorem Std.BitVec.ofNat_lt_ofNat {n : Nat} (x : Nat) (y : Nat) :
x#n < y#n x % 2 ^ n < y % 2 ^ n
theorem Std.BitVec.lt_of_le_ne {n : Nat} (x : Std.BitVec n) (y : Std.BitVec n) (h1 : x y) (h2 : ¬x = y) :
x < y