Zulip Chat Archive
Stream: metaprogramming / tactics
Topic: Replacing the result
Jannis Limperg (Sep 28 2020 at 14:46):
Is there a way to set the result of a tactic (i.e. the term that the tactic produces to inhabited the target type)? We can inspect the result with tactic.result
, but is there a way to replace this term?
Use case: I want to clean up the result term produced by one of my tactics, to see if this fixes a strange interaction with the equation compiler.
Patrick Massot (Sep 28 2020 at 14:47):
docs#tactic.interactive.show_term?
Rob Lewis (Sep 28 2020 at 14:52):
More low-level: you probably want to get the goal metavariable before calling your tactic, and then call instantiate_mvars
on it after.
Rob Lewis (Sep 28 2020 at 14:53):
Patrick's suggestion is better if you're in interactive mode/want a pretty-printed statement.
Jannis Limperg (Sep 28 2020 at 14:55):
This allows me to view the result term, but I want to replace it from within a tactic, telling Lean, "use this result term regardless of what happened earlier."
Actually, maybe I can execute a tactic, get the produced result, roll back the tactic and 'refine' with the cleaned-up result term.
Rob Lewis (Sep 28 2020 at 14:58):
Yep. docs#tactic.retrieve and variants can help with rolling back. But this does sound slightly convoluted...
Gabriel Ebner (Sep 28 2020 at 14:59):
You might want to take inspiration from docs#tactic.dsimp_result
Rob Lewis (Sep 28 2020 at 15:01):
Oh, nice, I didn't know about docs#tactic.intercept_result
Kevin Buzzard (Sep 28 2020 at 15:02):
Be careful!
Kevin Buzzard (Sep 28 2020 at 15:02):
(that was a slightly unnerving quote from the docstring, by the way!)
Rob Lewis (Sep 28 2020 at 15:03):
Hmm, is the implementation of intercept_result
right in the case where a metavariable appears in the goal?
Rob Lewis (Sep 28 2020 at 15:04):
It copies the goal metavariables for some reason, but if there are metavariables in their types those could still get assigned.
Jannis Limperg (Sep 28 2020 at 15:04):
Yes, that's exactly what I was looking for. Thanks all! Of course this is highly unsafe, but I promise to be careful. ;)
Rob Lewis (Sep 28 2020 at 15:04):
(I'm just glancing at it on GitHub, didn't look carefully at what it's doing.)
Patrick Massot (Sep 28 2020 at 15:05):
That sounds like a very honest docstring.
Rob Lewis (Sep 28 2020 at 15:06):
I like the ones at docs#module_info.resolve_module_name too
Patrick Massot (Sep 28 2020 at 15:08):
Oh, I never noticed the color choice for meta!
Rob Lewis (Sep 28 2020 at 15:08):
It's for constant
/axiom
Patrick Massot (Sep 28 2020 at 15:09):
I see, this makes even more sense.
Pedro Minicz (Sep 28 2020 at 16:55):
From docs#tactic.intercept_result:
-- and assign to the original goals.
-- (We have to use `assign` here, as `unify` and `exact` are apparently
-- unreliable about which way they do the assignment!)
unsafe.type_context.run $ unsafe.type_context.assign g g''),
Since the author used "apparently," maybe someone with a deep understanding of unify
could rewrite this tactic making is safer.
Rob Lewis (Sep 28 2020 at 17:03):
Maybe if @Jannis Limperg runs into issues with it, but I don't think this is any kind of priority.
Jannis Limperg (Sep 28 2020 at 17:12):
No issues in my use case, though that was just some simple debugging.
Last updated: Dec 20 2023 at 11:08 UTC