fix: bv_decide structures pass instantiate mvars (#7309)

This PR fixes a bug where bv_decide's new structure support would
sometimes not case split on all available structure fvars as their type
was an mvar.
This commit is contained in:
Henrik Böving 2025-03-03 22:27:53 +01:00 committed by GitHub
parent f8f1b2212a
commit 017a1f2b94
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 28 additions and 1 deletions

View file

@ -64,7 +64,7 @@ partial def structuresPass : Pass where
if decl.isLet || decl.isImplementationDetail then
return false
else
let some const := decl.type.getAppFn.constName? | return false
let some const := (← instantiateMVars decl.type).getAppFn.constName? | return false
return interesting.contains const
match goals with
| [goal] => postprocess goal interesting

View file

@ -22,6 +22,9 @@ partial def typeAnalysisPass : Pass where
name := `typeAnalysis
run' goal := do
checkContext goal
let analysis ← PreProcessM.getTypeAnalysis
trace[Meta.Tactic.bv] m!"Type analysis found structures: {analysis.interestingStructures.toList}"
trace[Meta.Tactic.bv] m!"Type analysis found enums: {analysis.interestingEnums.toList}"
return goal
where
checkContext (goal : MVarId) : PreProcessM Unit := do

24
tests/bv_relation.lean Normal file
View file

@ -0,0 +1,24 @@
import Std.Tactic.BVDecide
structure State where
x : BitVec 8
y : BitVec 8
z : BitVec 8
inductive Transfer : State → State → Prop
| step : Transfer ⟨x, y, z⟩ ⟨y, z, x⟩
@[simp]
theorem Transfer.iff_x : Transfer s1 s2 ↔ (s2.x = s1.y ∧ s2.y = s1.z ∧ s2.z = s1.x) := by
constructor
· intro h
cases h
simp
· intro h
cases s1 <;> cases s2 <;> simp_all [Transfer.step]
def P (s : State) : Prop := s.x > 3
example : ∀ s1 s2 s3 s4, P s1 ∧ Transfer s1 s2 ∧ P s2 ∧ Transfer s2 s3 ∧ P s3 ∧ Transfer s3 s4 → P s4 := by
simp [P]
bv_decide