Zulip Chat Archive

Stream: general

Topic: Check whether a constructor argument is named or anonymous

Jannis Limperg (Apr 14 2020 at 01:37):

For a tactic I'm writing, I need to know whether each argument of a given constructor is named or not. However, it seems that leaving an argument unnamed and naming it a produce the same result:

inductive I : Type
| intro : unit  I

inductive J : Type
| intro (a : unit) : J

namespace tactic

meta def check : tactic unit := do
(expr.pi n  b  _ _)  infer_type `(I.intro),
(expr.pi n' b' _ _)  infer_type `(J.intro),
trace (n = n'  b = b' : bool)

end tactic

run_cmd tactic.check

It seems like the elaborator makes up a name for the unnamed argument of I.intro. Any suggestions for how I could deal with this?

Simon Hudon (Apr 14 2020 at 04:18):

In kernel terms, named / unnamed is not a meaningful distinction. You can however distinguish between dependent and non-dependent. In (expr.pi n _ d b) ← infer_type (I.intro),, you can check b.has_varto see if the variable named by n is referenced in b`. If it is, you have a dependent product, otherwise, it's a simple function arrow / implication.

Jannis Limperg (Apr 14 2020 at 13:11):

I feared that would be the answer. Dependent/non-dependent is unfortunately not fine enough for my application. Might have to hack around this. Thanks for the explanation though!

Last updated: Dec 20 2023 at 11:08 UTC