Zulip Chat Archive
Stream: metaprogramming / tactics
Topic: presence of decl in env.constants of InfoTree of decl
llllvvuu (Jan 08 2025 at 10:34):
In the following code, foo
is in TreeConstants
but not Constants
. That is, it is in env.constants
of the ctx
surrounding the InfoTree
, but it is not in the getEnv
when actually doing things in the theorem body.
In particular,
- the
getEnv
has:foo.match_1
,foo.match_1._cstage1
- the
InfoTree
has:foo.match_1
,foo.match_1._cstage1
,foo
.
What is the reason for this?
(question motivated by repl#66)
import Lean
open Lean Elab Term Command
elab "foo_tac" : tactic =>
Lean.Elab.Tactic.withMainContext do
let env ← getEnv
dbg_trace "Constants: {env.constants.map₂.toList.map Prod.fst}"
def indentStr (n : Nat) (s : String) : String :=
(s.splitOn "\n").foldl (init := "") fun r line => r ++ (List.replicate n ' ').asString ++ line ++ "\n"
partial def printTree : InfoTree → Nat → CommandElabM Unit
| .context ctx t, indent => do
if let .commandCtx ctx := ctx then
dbg_trace indentStr indent s!"TreeConstants: {ctx.env.constants.map₂.toList.map Prod.fst}"
printTree t (indent + 1)
| .node i children, indent => do
dbg_trace indentStr indent s!"{i.stx}"
children.forM (printTree · (indent + 1))
| .hole mvarId, indent => do
dbg_trace indentStr indent s!"{mvarId.name}"
elab "#info " c:command : command => do
let initInfoTrees ← getResetInfoTrees
try
elabCommand c
let trees ← getInfoTrees
for tree in trees do
printTree tree 0
finally
modify fun st =>
{ st with infoState := { st.infoState with trees := initInfoTrees ++ st.infoState.trees } }
#info
def foo : (fun ((x, y, z) : Nat × Nat × Nat) => x = x) = fun x => True := by
foo_tac
sorry
Sebastian Ullrich (Jan 08 2025 at 12:17):
As far as I understood, you are comparing the environment inside the command to the info tree strictly after the command, so I'm not surprised foo
is listed only in the latter
Last updated: May 02 2025 at 03:31 UTC