Module Names.MutInd
val make : KerName.t -> KerName.t -> tBuilds a mutual inductive name from a user and a canonical kernel name.
val user : t -> KerName.tval canonical : t -> KerName.tval repr2 : t -> ModPath.t * Label.tShortcut for
KerName.repr (user ...)
include QNameS with type t := t
type tA type of reference that implements an implicit quotient by containing two different names. The first one is the user name, i.e. what the user sees when printing. The second one is the canonical name, which is the actual absolute name of the reference.
This mechanism is fundamentally tied to the module system of Coq. Functor application and module inclusion are the typical ways to introduce names where the canonical and user components differ. In particular, the two components should be undistinguishable from the point of view of typing, i.e. from a "kernel" ground. This aliasing only makes sense inside an environment, but at this point this notion is not even defined so, this dual name trick is fragile. One has to ensure many invariants when creating such names, but the kernel is quite lenient when it comes to checking that these invariants hold. (Read: there are soundness bugs lurking in the module system.)
One could enforce the invariants by splitting the names and storing that information in the environment instead, but unfortunately, this wreaks havoc in the upper layers. The latter are infamously not stable by syntactic equality, in particular they might observe the difference between canonical and user names if not packed together.
For this reason, it is discouraged to use the canonical-accessing API in the upper layers, notably the
CanOrdmodule below. Instead, one should use their quotiented versions defined in theEnvironmodule. Eventually all uses toCanOrdoutside of the kernel should be removed.CAVEAT: name sets and maps are still exposing a canonical-accessing API surreptitiously.
module CanOrd : EqType with type t = tEquality functions over the canonical name. Their use should be restricted to the kernel.
module SyntacticOrd : EqType with type t = tEquality functions using both names, for low-level uses.
val hash : t -> int
val to_string : t -> stringEncode as a string (not to be used for user-facing messages).
val debug_to_string : t -> stringSame as
to_string, but outputs extra information related to debug.