fix: replayConst with native_decide (#8157)
This PR fixes an incompatibility of `replayConst` as used by e.g. `aesop` with `native_decide`-using tactics such as `bv_decide`
This commit is contained in:
parent
d1ed57e92a
commit
eaf1c6b4e1
2 changed files with 25 additions and 9 deletions
|
|
@ -2081,6 +2081,16 @@ where
|
|||
replayKernel (exts : Array (EnvExtension EnvExtensionState)) (consts : List AsyncConst)
|
||||
(kenv : Kernel.Environment) : Except Kernel.Exception Kernel.Environment := do
|
||||
let mut kenv := kenv
|
||||
-- replay extensions first in case kernel checking needs them (`IR.declMapExt`)
|
||||
for ext in exts do
|
||||
if let some replay := ext.replay? then
|
||||
kenv := { kenv with
|
||||
-- safety: like in `modifyState`, but that one takes an elab env instead of a kernel env
|
||||
extensions := unsafe (ext.modifyStateImpl kenv.extensions <|
|
||||
replay
|
||||
(ext.getStateImpl oldEnv.toKernelEnv.extensions)
|
||||
(ext.getStateImpl newEnv.toKernelEnv.extensions)
|
||||
(consts.map (·.constInfo.name))) }
|
||||
for c in consts do
|
||||
if skipExisting && (kenv.find? c.constInfo.name).isSome then
|
||||
continue
|
||||
|
|
@ -2102,15 +2112,6 @@ where
|
|||
-- realized kernel additions cannot be interrupted - which would be bad anyway as they can be
|
||||
-- reused between snapshots
|
||||
kenv ← ofExcept <| kenv.addDeclCore 0 decl none
|
||||
for ext in exts do
|
||||
if let some replay := ext.replay? then
|
||||
kenv := { kenv with
|
||||
-- safety: like in `modifyState`, but that one takes an elab env instead of a kernel env
|
||||
extensions := unsafe (ext.modifyStateImpl kenv.extensions <|
|
||||
replay
|
||||
(ext.getStateImpl oldEnv.toKernelEnv.extensions)
|
||||
(ext.getStateImpl newEnv.toKernelEnv.extensions)
|
||||
(consts.map (·.constInfo.name))) }
|
||||
return kenv
|
||||
|
||||
/-- Like `evalConst`, but first check that `constName` indeed is a declaration of type `typeName`.
|
||||
|
|
|
|||
15
tests/lean/run/replayConst.lean
Normal file
15
tests/lean/run/replayConst.lean
Normal file
|
|
@ -0,0 +1,15 @@
|
|||
import Lean.Elab.Tactic.Basic
|
||||
import Std.Tactic.BVDecide
|
||||
|
||||
/-! `replayConst` should be able to replay constants using `native_decide`. -/
|
||||
|
||||
open Lean Lean.Meta Lean.Elab.Tactic in
|
||||
elab "replay" ts:tacticSeq : tactic => do
|
||||
let initEnv ← getEnv
|
||||
evalTactic ts
|
||||
let finalState ← saveState
|
||||
setEnv $ ← initEnv.replayConsts initEnv finalState.term.meta.core.env
|
||||
|
||||
theorem test
|
||||
(x y : BitVec 128) (h : y = x) : x = y := by
|
||||
replay bv_decide
|
||||
Loading…
Add table
Reference in a new issue