feat: BV_EXTRACT_MUL (#7655)

This PR adds the preprocessing rule for extraction over multiplication
to bv_decide.
This commit is contained in:
Henrik Böving 2025-03-24 11:50:42 +01:00 committed by GitHub
parent 5e8cd72413
commit 7d651d559a
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 26 additions and 0 deletions

View file

@ -479,5 +479,27 @@ builtin_simproc [bv_normalize] extract_add
(← mkDecideProof (← mkLe lenExpr widthExpr))
return .visit { expr := expr, proof? := some proof }
builtin_simproc [bv_normalize] extract_mul
(BitVec.extractLsb' _ _ ((_ : BitVec _) * (_ : BitVec _))) := fun e => do
let_expr BitVec.extractLsb' widthExpr startExpr lenExpr targetExpr := e | return .continue
let_expr HMul.hMul _ _ _ _ lhsExpr rhsExpr := targetExpr | return .continue
let some start ← getNatValue? startExpr | return .continue
let some len ← getNatValue? lenExpr | return .continue
let some width ← getNatValue? widthExpr | return .continue
if !(start == 0 && len ≤ width) then return .continue
let newLhsExpr := mkApp4 (mkConst ``BitVec.extractLsb') widthExpr startExpr lenExpr lhsExpr
let newRhsExpr := mkApp4 (mkConst ``BitVec.extractLsb') widthExpr startExpr lenExpr rhsExpr
let expr ← mkMul newLhsExpr newRhsExpr
let proof :=
mkApp5
(mkConst ``BitVec.extractLsb'_mul)
widthExpr
lenExpr
lhsExpr
rhsExpr
(← mkDecideProof (← mkLe lenExpr widthExpr))
return .visit { expr := expr, proof? := some proof }
end Frontend.Normalize
end Lean.Elab.Tactic.BVDecide

View file

@ -633,6 +633,10 @@ example {x y : BitVec 8} :
BitVec.extractLsb' 0 4 (x + y) = BitVec.extractLsb' 0 4 x + BitVec.extractLsb' 0 4 y := by
bv_normalize
example {x y : BitVec 8} :
BitVec.extractLsb' 0 4 (x * y) = BitVec.extractLsb' 0 4 x * BitVec.extractLsb' 0 4 y := by
bv_normalize
section
namespace NormalizeMul