I have a few situations where I need a tactic that behaves very slightly different than apply or rewrite.
I was thinking I could write this in Ltac or Ltac2 using the pattern matching features in there. But I don't know how to emulate the behavior of apply and rewrite on quantified hypotheses
forall x : A, B(x) -> t(x) = s(x).
For a concrete example I want to write an Ltac function that takes a hypothesis
forall x1 : A1, forall x2 : A2(x1), ... forall xn : An(x1,.... n-1), t(x1.... xn) = s(x1.... xn) and checks to see if
t(x1.... xn) can be unified with a subterm of the goal, and if so, return the list of instantiations
(x1 := a1, ... xn := an).
(My specific motivation is that I have very large terms and the setoid rewrite typeclass unification is very slow. I need to hide or obscure these terms so that the setoid rewrite can perform more efficiently, but I can only do that after I get the unification I need.)
This doesn't sound trivial but I suspect it should be doable with some out of the box unification tools exposed by Ltac or Ltac2, I just don't know exactly what to use. The pattern matching tool in Pattern.v seems useful here but it only accepts patterns with one hole - should I write a recursive algorithm which leverages that to extend to the case of n possibly dependent holes rather than one hole, or is there some function which is more adequate to the purpose?
Last updated: Jan 31 2023 at 10:01 UTC