I've noticed a couple of things with Primitive Projections: first, it seems doesn't seem to use the abbreviations I've defined for certain terms; it seems to expand out all the terms, and the goal becomes quite ugly. Second, without Primitive Projections, I can't write out a list of possible Arguments; I can only have one. Are these two known limitations?

Can you show an example?

Here's a reduced-case example of the second: https://termbin.com/s3r8 -- the error I get is "Multiple sequences of implicit arguments available only for references that cannot be applied to an arbitrarily large number of arguments.", and it works with Set Primitive Projections.

I couldn't find any open or closed issues for the second, so I've filed a bug here: https://github.com/coq/coq/issues/15739

I'm going to try to work on a reduced-case example for the first.

Here's a minimised version:

```
(* Set Primitive Projections. *)
Record foo := { A : Type ; a : A }.
Arguments a {_}, _.
```

If I understand correctly the error message, Coq is telling you that without primitive projections it cannot determine which version of the implicit arguments should apply (because the first projection `A`

in my example can be an arrow type so `a`

can be applied to an arbitrary number of arguments depending on the choice of `A`

). I'm not sure how primitive projections make a difference in the implementation though...

Nice. @Gaëtan Gilbert has additionally pointed out the lines in the source that error out in the issue.

Here's an real-world goal-diff of the first: https://github.com/coq/coq/issues/15740 -- It'll take me some time to cook up a reduced case.

@Ramkumar Ramachandra looking at the issue, why would you expect it to use that definition? notations/abbreviations are supposed to be used when pretty-printing the body, but there’s no such expectation for definitions.

so, a priori, it just means the definition has been delta-reduced. Yes, Gaëtan’s example seems to reduce it very eagerly, maybe more than it should (hard to tell).

well, if that example were less eager, then the next risk would be that `simpl`

might reduce the definition, but `simpl`

gives users more control…

either way, an actual `Notation Layer’ args := (body).`

might be a way to control pretty-printing of the expanded terms.

It's not a notation, @Paolo Giarrusso -- it's a definition we use until the very end, proving everything else in terms of that.

`simpl`

leads to unusable blowups almost everywhere in our proof script, except for a few corners.

Without Primitive Projections, Coq uses all the Class projections uniformly, irrespective of whether they're a Definition, or just given a Type. With Primitive Projections, Definitions seem to be forgotten completely. Isn't this contrary to expectation?

The reason it's not a notation, is because we want to type-check the definition too. It lives within a big Class.

@Ramkumar Ramachandra I see the confusion: you said “abbreviation” early on, but that’s a technical term for these kind of notations.

re expectations, I can see your point but I don’t know what to expect of these definitions-in-records. It’s certainly a good question!

Yeah, I don’t know what the term for this is. When Hugo and I were chatting informally, he used the term “abbreviation” and it stuck :) We’re calling it “definition-projection” in the issue.

Side note on simpl: if you'd like it to be usable, you can tell it to stop unfolding a definition foo via Arguments foo : simpl never.

Ramkumar Ramachandra has marked this topic as resolved.

Last updated: Sep 23 2023 at 14:01 UTC