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:
Sebastian Ullrich 2025-04-28 22:35:15 +02:00 committed by GitHub
parent d1ed57e92a
commit eaf1c6b4e1
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 25 additions and 9 deletions

View file

@ -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`.

View 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