Zulip Chat Archive

Stream: metaprogramming / tactics

Topic: matching binders


Reid Barton (Oct 18 2020 at 16:53):

Is something like

meta def foo : expr  tactic expr
| `(Σ (_ : %%A), %%B) := failed
| _ := failed

ever a good idea? Or will B end up in some weird state (it should be an expression in a modified context)? Should I just use open_lambdas?

Simon Hudon (Oct 18 2020 at 16:59):

B will be an open term with one free de Bruijn variable. It's easy to repair. You can also match sigma applied to a lambda and use open_lambdas if you prefer. That seems over kill to me

Reid Barton (Oct 18 2020 at 17:01):

Just to check, by "match sigma applied to a lambda" you mean "match sigma applied to a variable, which I expect to be a lambda" right?

Reid Barton (Oct 18 2020 at 17:02):

In the MWE, everything is overkill :upside_down:

Simon Hudon (Oct 18 2020 at 17:02):

To be even more exact: "match sigma applied to a term, which I expect to be a lambda"

Reid Barton (Oct 18 2020 at 17:02):

right

Reid Barton (Oct 18 2020 at 17:02):

a term (which is the antiquotation of a variable)

Simon Hudon (Oct 18 2020 at 17:03):

I would say if you have only one bound variable, I wouldn't use open_*. If you have a few, you might need to write a specialized open_sigma function

Reid Barton (Oct 18 2020 at 17:04):

How do I "repair" B if I matched on it?

Mario Carneiro (Oct 18 2020 at 17:04):

expr.instantiate_local I think

Simon Hudon (Oct 18 2020 at 17:05):

do v <- mk_local_def `v A,
   let B := B.instantiate_var v,
   ...

Reid Barton (Oct 18 2020 at 17:05):

aha

Reid Barton (Oct 18 2020 at 17:06):

/-- `instantiate_var a b` takes the 0th de-Bruijn variable in `a` and replaces each occurrence with `b`. -/

Simon Hudon (Oct 18 2020 at 17:06):

Be careful, if B contains meta variables, the result will be messed up. You should use instantiate_mvars on B first.

Simon Hudon (Oct 18 2020 at 17:08):

Mario Carneiro said:

expr.instantiate_local I think

This is what you use when you're specifying a local constant to instantiate rather than a de Bruijn variable

Simon Hudon (Oct 18 2020 at 17:08):

There are a bunch of variations on abstract and instantiate, they're often easy to confuse for each other. (and not to mention kabstract)

Reid Barton (Oct 18 2020 at 17:20):

I want to think of B as a type in the context i : A anyways, and recurse on the structure of B, so maybe keeping B in this "open" form while I do the recursion is sensible anyways.
(I guess the alternative is, if i got turned into a local constant, then I need to recognize the variable i in the local_const case of expr.)

Simon Hudon (Oct 18 2020 at 17:25):

If you keep B open, tactics like infer_type and unify and anything that uses them breaks down. You may want to carry around a list of new locals instead

Reid Barton (Oct 18 2020 at 17:30):

Ah, that might be a problem, since expr doesn't have type information everywhere (e.g., not at app)

Simon Hudon (Oct 18 2020 at 17:31):

Exactly


Last updated: Dec 20 2023 at 11:08 UTC