This PR makes bv_decide's preprocessing handle casts, as we are in the constant BitVec fragment we should be able to always remove them using BitVec.cast_eq.
24 lines
595 B
Text
24 lines
595 B
Text
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
|