From 91cbd7c80e66fabbbc9cff20818129bbc27b9e00 Mon Sep 17 00:00:00 2001 From: Harun Khan <58151072+mhk119@users.noreply.github.com> Date: Tue, 7 Jan 2025 21:55:50 -0500 Subject: [PATCH] feat: `BitVec.toInt_shiftLeft` theorem (#6346) This PR completes the toNat/Int/Fin family for `shiftLeft`. --- src/Init/Data/BitVec/Lemmas.lean | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/Init/Data/BitVec/Lemmas.lean b/src/Init/Data/BitVec/Lemmas.lean index 0b6596bf43..68375c1c2c 100644 --- a/src/Init/Data/BitVec/Lemmas.lean +++ b/src/Init/Data/BitVec/Lemmas.lean @@ -1142,11 +1142,16 @@ theorem getMsb_not {x : BitVec w} : /-! ### shiftLeft -/ @[simp, bv_toNat] theorem toNat_shiftLeft {x : BitVec v} : - BitVec.toNat (x <<< n) = BitVec.toNat x <<< n % 2^v := + (x <<< n).toNat = x.toNat <<< n % 2^v := BitVec.toNat_ofNat _ _ +@[simp] theorem toInt_shiftLeft {x : BitVec w} : + (x <<< n).toInt = (x.toNat <<< n : Int).bmod (2^w) := by + rw [toInt_eq_toNat_bmod, toNat_shiftLeft, Nat.shiftLeft_eq] + simp + @[simp] theorem toFin_shiftLeft {n : Nat} (x : BitVec w) : - BitVec.toFin (x <<< n) = Fin.ofNat' (2^w) (x.toNat <<< n) := rfl + (x <<< n).toFin = Fin.ofNat' (2^w) (x.toNat <<< n) := rfl @[simp] theorem shiftLeft_zero (x : BitVec w) : x <<< 0 = x := by