Zulip Chat Archive
Stream: lean4
Topic: Working with TSyntax and cdot
Jon Eugster (Apr 20 2023 at 20:42):
I'm trying my hands on writing tactics and I could need some help. I can manually create single tactic calls (type TSyntax `tactic
) like cmd
below, but how would I combine these syntax elements into a structured tactic instruction using ·
(i.e. when there are multiple goals)?
For context, my goal is to create a logInfo
message that tells accurately what e.g. ext
did, which also includes focusing on newly created subgoals.
import Std
open Lean Meta Elab Tactic Term
variable (lemma₁ lemma₂ lemma₃ : Name)
def createTacticBlock (goal : MVarId) : MetaM (PUnit) := goal.withContext do
let mut myTactics : Array (TSyntax `tactic) := #[]
-- create some tactic calls
let cmd ←`(tactic| apply $(mkIdent lemma₁))
myTactics := myTactics.push cmd
-- Now instead of creating a list, create some valid tactic syntax that applies to multiple
-- goals, like:
--
-- · apply lemma₁
-- apply lemma₂
-- · apply lemma₃
logInfo m!"{myTactics}"
Jon Eugster (Apr 20 2023 at 20:44):
( I should say I'm mainly hacking at this point and have quite a hard time understanding the Metaprogramming book. I barely know anything about the different monads and only scrap together things from what I see in the source code, I might be going at this the wrong way :sweat_smile: )
Mario Carneiro (Apr 20 2023 at 20:52):
·
is a tactic, specifically of the form · $tac:tacticSeq
Mario Carneiro (Apr 20 2023 at 20:54):
so you can create one the same as any other tactic, you just use `(tactic| · foo; bar)
or whatever
Mario Carneiro (Apr 20 2023 at 20:55):
It's not really clear to me what exactly you want to put in that function though, there are a lot of placeholders
Mario Carneiro (Apr 20 2023 at 20:56):
I think you probably want createTacticBlock
to have a type like MetaM Syntax.Tactic
or MetaM (Array Syntax.Tactic)
so that it can call itself recursively
Jon Eugster (Apr 20 2023 at 20:58):
Mario Carneiro said:
·
is a tactic, specifically of the form· $tac:tacticSeq
oh. that's a tad simpler than expected.
Jon Eugster (Apr 20 2023 at 21:03):
I agree createTacticBlock
has the wrong type in the MWE, I just copied that from applyExtLemma
.
I was going to construct a Syntax.Tactic
term or someting in a IO.Ref
and then just add to that in the relevant funtion calls. Something like
initialize usedExtLemmas : IO.Ref (Array (TSyntax `tactic)) ← IO.mkRef #[]
Last updated: Dec 20 2023 at 11:08 UTC