Zulip Chat Archive
Stream: general
Topic: elaborate a theorem without clashing
Damiano Testa (Jul 27 2024 at 12:04):
Often, writing linters, I want to take some theorem, modify it and elaborate it again.  However, this causes problems, since the environment already contains the declaration name.  I have a couple of workarounds for this (adding a namespace to the scope, replacing the declaration name by a fresh one, replacing the theorem by an example), but none of these is really satisfactory.
Is there a principled way to do this?
Here is some sample code:
import Lean.Elab.Command
import Batteries.Lean.Syntax
open Lean Elab Command in
elab "toIntro " cmd:command : command => do
  elabCommand cmd
  -- the next command is superfluous, I could have simply reelaborated `cmd`, but maybe it
  -- gives some context
  let newCmd ← cmd.replaceM fun s => if s.isOfKind ``Lean.Parser.Tactic.intros then
    return some (← `(tactic| intro)) else return none
  logInfo m!"Elaborating {newCmd}"
  elabCommand newCmd
/-
Elaborating theorem with_intros : ∀ x : Nat, x = x := by
  intro
  rfl
-/
toIntro
theorem with_intros : ∀ x : Nat, x = x := by  -- 'with_intros' has already been declared
  intros
  rfl
Eric Wieser (Jul 27 2024 at 12:16):
withoutModifyingState ?
Eric Wieser (Jul 27 2024 at 12:16):
That is, do the first elaboration in a context where everything (except your return value) is discarded
Damiano Testa (Jul 27 2024 at 12:21):
Unfortunately, with linters, the first elaboration is already done for you, so I'm stuck having to elaborate the second one.
Damiano Testa (Jul 27 2024 at 12:23):
Or, alternatively, is there a way to get the linter to run before the corresponding command is elaborated?
Last updated: May 02 2025 at 03:31 UTC