Today abbreviations cannot be only printing. I'm wondering if this limitation can be lifted, since it would provide a quick alternative to https://github.com/coq/coq/pull/17484
CC @Hugo Herbelin
In particular reverse coercions lets on type, say, nat
in place of nat_eqType
. If we could print nat
in place of nat_eqType
we would both obtain a nicer output and keep "round tripping", e.g. copy pasting the goal would just typecheck.
Also CC @Pierre Roux
so you would do Notation nat := nat_eqType (only printing).
?
but then depending on imports it might print mathcomp.whatever.nat
which sounds confusing (and not round trip since only printing)
On the technical side abbreviations are in the nametab and the nametab doesn't understand "only printing" so you would need to add that somehow. I don't know if it would be easy or a deeper redesign.
If they are only printing, then you don't add them to the nametab, no?
Abuot import, yes, but that is fine since if you don't import a file you also don't get the canonical instances which make the elaboration of nat to nat_eqType possible
printing an abbrev involves doing shortest_qualid_of
in the nametab doesn't it?
Was there a reason to not just reverse the canonical projections? That is, when printing a value that is registered in the table of canonical projections, just print the target. It seems straightforward but perhaps I am missing something.
some abbreviation printing behavior
Module M.
Notation x := nat.
End M.
Check nat. (* nat *)
Import M.
Check nat. (* x *)
Definition x := bool.
Check nat. (* M.x *)
@Gaëtan Gilbert I think I see, the nametab does not have a print-only thing. Could be added, but it is not there.
@Guillaume Melquiond I think you are right, it is more ad-hoc, but also simpler.
@Guillaume Melquiond there is a caveat.
Take a record with 2 projections hence 2 values, eg Canonical foo_canonical := {| p1 := x; p2 := y |}
.
Sometimes p2 is not flagged as a canonical projection, so there is a 1:1 correspondence between foo_canonical
and x
.
But we have to be careful not to print x
if the user wrote y
;-)
I guess it is worth trying
Oh! I guess you meant the opposite, that is, both p1
and p2
were registered as canonical projections, so we don't know whether x
or y
should be displayed.
are they both canonical projections AND coercions?
@Gaëtan Gilbert yes.
Indeed, so this printing behavior should only be enabled if the record has exactly 1 canonical projection
Shouldn't it then be "exactly 1 coercion that happens to be a canonical projection"?
This is a lot less restrictive.
Indeed, whereas it is common to have multiple fields being canonical projections, it seems much less common for more than one to be a coercion?
Last updated: Nov 29 2023 at 21:01 UTC