lean4-htt/tests/lean/run/bv_decide_enum_dependent.lean
Henrik Böving aa54390c85
fix: bv_decide preprocessing in dependently typed situations (#8306)
This PR makes it possible for `bv_decide` to tackle situations for its
enum type preprocessing where the enums themselves are use in a
dependently type context (for example inside of a `GetElem` body) and
thus not trivially accessible to `simp` for rewriting. To do this we
drop`GetElem` on `BitVec` as well as `dite` as early as possible in the
pipeline.
2025-05-12 21:03:58 +00:00

34 lines
1,011 B
Text

import Std.Tactic.BVDecide
inductive Bar : Type
| A : Bar
| B : Bar
| C : Bar -- Requires extra variant in enum
deriving DecidableEq
structure Foo where
state : Bar
num : BitVec 1
deriving DecidableEq
def r' (b : Bool)
: Bool :=
-- Two inline if-statements
let a : Foo :=
if b then { state := .A, num := 0 }
else { state := .B, num := 0 }
let x : Foo :=
if a.state = .A then { state := .A, num := 0}
else { state := .B, num := 0 }
x.num.getLsbD 0
/--
error: None of the hypotheses are in the supported BitVec fragment after applying preprocessing.
There are three potential reasons for this:
1. If you are using custom BitVec constructs simplify them to built-in ones.
2. If your problem is using only built-in ones it might currently be out of reach.
Consider expressing it in terms of different operations that are better supported.
3. The original goal was reduced to False and is thus invalid.
-/
#guard_msgs in
theorem wtf (a : Bool) : r' a := by
simp [r']
bv_decide