Zulip Chat Archive
Stream: lean4
Topic: Aesop? suggestions on multi arm tactics
Shreyas Srinivas (Apr 15 2025 at 13:12):
one Screenshot from 2025-04-15 15-10-00.png
I have an induction goal that I can close with aesop. Even though I don't need this, I would like to use the output of aesop? instead. However, aesop? provides me five separate try this?s instead of one. Each suggestion is meant to work for one branch of the induction tactic. Is there a way to just one common suggestion?
Shreyas Srinivas (Apr 15 2025 at 13:13):
To make it clear, I have already solved the problem by taking the simp lemmas suggested in each try this and pasting them together in a try simp_all:
Screenshot from 2025-04-15 15-13-00.png
Shreyas Srinivas (Apr 15 2025 at 13:13):
I just wish to know if I can instead get one try this which gives a common proof that works on all branches
Jannis Limperg (Apr 15 2025 at 13:17):
I'm not sure whether I can detect, from within each Aesop call, that the different calls belong together. If so, something could be done, though I would likely just generate first | alt1 | alt2 | ..., which is maybe not much better. Please feel free to open an issue.
Shreyas Srinivas (Apr 15 2025 at 13:18):
So one trick might be to merge all the proofs by concatenating them in sequence with try on each suggestion
Shreyas Srinivas (Apr 15 2025 at 13:19):
Oh I just remembered that first | .. does that
EDIT : maybe first | try alt1 | try alt2 |..?
Eric Wieser (Apr 15 2025 at 13:20):
As a much simpler test-case:
import Aesop
example (p : P) (q : Q) (r : R) (s : S) : (P × Q) × (R × S) := by
constructor <;> constructor <;> aesop?
Eric Wieser (Apr 15 2025 at 13:21):
In this particular case you could produce
example (p : P) (q : Q) (r : R) (s : S) : (P × Q) × (R × S) := by
constructor <;> constructor <;> [(· exact p); (· exact q); (· exact r); (· exact s)]
but this doesn't work if the proof started as
example (p : P) (q : Q) (r : R) (s : S) : (P × Q) × (R × S) := by
constructor <;> (constructor <;> aesop?)
Shreyas Srinivas (Apr 15 2025 at 13:21):
And the results of aesop? suggestions can be concatentated as :
import Aesop
example (p : P) (q : Q) (r : R) (s : S) : (P × Q) × (R × S) := by
constructor <;>
constructor <;>
try exact p; try exact q; try exact r; try exact s
Eric Wieser (Apr 15 2025 at 13:23):
@Shreyas Srinivas, this is just first | exact p | exact q | exact r | exact s which was what Jannis suggested earlier
Shreyas Srinivas (Apr 15 2025 at 13:26):
Anyway, in my example all I had to do was put a try in front of the terminal simp_all suggestion and concatenate the lemma list. I guess this is harder to infer in general.
Eric Wieser (Apr 15 2025 at 13:27):
try is worse than putting first |
Shreyas Srinivas (Apr 15 2025 at 13:52):
alternatively, maybe aesop could look at the named goals, generate the arms and fill them in like you already showed
Last updated: May 02 2025 at 03:31 UTC