package rocq-runtime
Install
dune-project
Dependency
Authors
Maintainers
Sources
sha256=051f7bf702ff0a3b370449728921e5a95e18bc2b31b8eb949d48422888c98af4
doc/rocq-runtime.interp/Notation/index.html
Module NotationSource
Notations
Printing
module NotationSet : CSet.ExtS with type elt = Constrexpr.notationmodule NotationMap :
CMap.ExtS with type key = Constrexpr.notation and module Set := NotationSetmodule SpecificNotationSet :
CSet.ExtS with type elt = Constrexpr.specific_notationmodule SpecificNotationMap :
CMap.ExtS
with type key = Constrexpr.specific_notation
and module Set := SpecificNotationSetScopes
A scope is a set of interpreters for symbols + optional interpreter and printers for integers + optional delimiters
= scope_name list
Check where a scope is opened or not in a scope list, or in * the current opened scopes
Open scope
Return a scope taking either a scope name or delimiter
Declare delimiters for printing
Declare and uses back and forth an interpretation of primitive token
A number interpreter is the pair of an interpreter for **(hexa)decimal** numbers in terms and an optional interpreter in pattern, if non integer or negative numbers are not supported, the interpreter must fail with an appropriate error message
1st dirpath: dirpath of the library 2nd dirpath: module and section-only dirpath (ie Lib.current_dirpath true) string: string used to generate the notation
dirpaths are used for dumpglob, string for printing (pr_notation_info)
The unique id string below will be used to refer to a particular registered interpreter/uninterpreter of number or string notation. Using the same uid for different (un)interpreters will fail. If at most one interpretation of prim token is used per scope, then the scope name could be used as unique id.
val register_rawnumeral_interpretation :
?allow_overwrite:bool ->
prim_token_uid ->
rawnum prim_token_interpretation ->
unitval register_bignumeral_interpretation :
?allow_overwrite:bool ->
prim_token_uid ->
Z.t prim_token_interpretation ->
unitval register_string_interpretation :
?allow_overwrite:bool ->
prim_token_uid ->
string prim_token_interpretation ->
unit* Number notation
exception PrimTokenNotationError of string
* Environ.env
* Evd.evar_map
* prim_token_notation_errortype int_ty = {dec_uint : Names.inductive;dec_int : Names.inductive;hex_uint : Names.inductive;hex_int : Names.inductive;uint : Names.inductive;int : Names.inductive;
}type number_ty = {int : int_ty;decimal : Names.inductive;hexadecimal : Names.inductive;number : Names.inductive;
}A postprocessing translation to_post can be done after execution of the to_ty interpreter. The reverse translation is performed before the of_ty uninterpreter.
to_post is an array of n lists l_i of tuples (f, t, args). When the head symbol of the translated term matches one of the f in the list l_0 it is replaced by t and its arguments are translated acording to args where ToPostCopy means that the argument is kept unchanged and ToPostAs k means that the argument is recursively translated according to l_k. ToPostHole introduces an additional implicit argument hole (in the reverse translation, the corresponding argument is removed). ToPostCheck r behaves as ToPostCopy except in the reverse translation which fails if the copied term is not r. When n is null, no translation is performed.
type ('target, 'warning) prim_token_notation_obj = {to_kind : 'target conversion_kind;to_ty : Names.GlobRef.t;to_post : (Names.GlobRef.t * Names.GlobRef.t * to_post_arg list) list array;of_kind : 'target conversion_kind;of_ty : Names.GlobRef.t;ty_name : Libnames.qualid;warning : 'warning;
}type prim_token_interp_info = | Uid of prim_token_uid| NumberNotation of number_notation_obj| StringNotation of string_notation_obj
type prim_token_infos = {pt_local : bool;(*Is this interpretation local?
*)pt_scope : Notation_term.scope_name;(*Concerned scope
*)pt_interp_info : prim_token_interp_info;(*Unique id "pointing" to (un)interp functions, OR a number notation object describing (un)interp functions
*)pt_required : required_module;(*Module that should be loaded first
*)pt_refs : Names.GlobRef.t list;(*Entry points during uninterpretation
*)pt_in_match : bool;(*Is this prim token legal in match patterns ?
*)
}Note: most of the time, the pt_refs field above will contain inductive constructors (e.g. O and S for nat). But it could also be injection functions such as IZR for reals.
Activate a prim token interpretation whose unique id and functions have already been registered.
Return the term/cases_pattern bound to a primitive token in a given scope context
val interp_prim_token :
?loc:Loc.t ->
Constrexpr.prim_token ->
Notation_term.subscopes ->
Glob_term.glob_constr * Notation_term.scope_name optionval interp_prim_token_cases_pattern_expr :
?loc:Loc.t ->
(Glob_term.glob_constr -> unit) ->
Constrexpr.prim_token ->
Notation_term.subscopes ->
Glob_term.glob_constr * Notation_term.scope_name optionReturn the primitive token associated to a term/cases_pattern; raise No_match if no such token
val uninterp_prim_token :
'a Glob_term.glob_constr_g ->
Notation_term.subscopes ->
Constrexpr.prim_token * delimiters optionval uninterp_prim_token_cases_pattern :
'a Glob_term.cases_pattern_g ->
Notation_term.subscopes ->
Names.Name.t * Constrexpr.prim_token * delimiters optionval availability_of_prim_token :
Constrexpr.prim_token ->
Notation_term.scope_name ->
Notation_term.subscopes ->
delimiters option optionDeclare and interpret back and forth a notation
type entry_coercion_kind = | IsEntryCoercion of Constrexpr.notation_entry_level * Constrexpr.notation_entry_relative_level| IsEntryGlobal of string * int| IsEntryIdent of string * int
val declare_notation :
(Constrexpr.notation_with_optional_scope * Constrexpr.notation) ->
Notation_term.interpretation ->
notation_location ->
use:Notationextern.notation_use ->
entry_coercion_kind option ->
UserWarn.t option ->
unitval interp_notation :
?loc:Loc.t ->
Constrexpr.notation ->
Notation_term.subscopes ->
Notation_term.interpretation
* (notation_location * Notation_term.scope_name option)Return the interpretation bound to a notation
val availability_of_notation :
Constrexpr.specific_notation ->
Notation_term.subscopes ->
(Notation_term.scope_name option * delimiters option) optionTest if a notation is available in the scopes context scopes; if available, the result is not None; the first argument is itself not None if a delimiters is needed
val is_printing_inactive_rule :
Notationextern.interp_rule ->
Notation_term.interpretation ->
booltype 'a notation_query_pattern_gen = {notation_entry_pattern : Constrexpr.notation_entry list;interp_rule_key_pattern : (Constrexpr.notation_key, 'a) Util.union option;use_pattern : Notationextern.notation_use;scope_pattern : Constrexpr.notation_with_optional_scope option;interpretation_pattern : Notation_term.interpretation option;
}val toggle_notations :
on:bool ->
all:bool ->
?verbose:bool ->
(Glob_term.glob_constr -> Pp.t) ->
notation_query_pattern ->
unitMiscellaneous
Take a notation string and turn it into a notation key. eg. "x + y" becomes "_ + _".
type notation_as_reference_error = | AmbiguousNotationAsReference of Constrexpr.notation_key| NotationNotReference of Environ.env * Evd.evar_map * Constrexpr.notation_key * (Constrexpr.notation_key * Notation_term.notation_constr) list
val interp_notation_as_global_reference :
?loc:Loc.t ->
head:bool ->
(Names.GlobRef.t -> bool) ->
Constrexpr.notation_key ->
delimiters option ->
Names.GlobRef.tIf head is true, also allows applied global references. Raise NotationAsReferenceError if not resolvable as a global reference
val interp_notation_as_global_reference_expanded :
?loc:Loc.t ->
head:bool ->
(Names.GlobRef.t -> bool) ->
Constrexpr.notation_key ->
delimiters option ->
(Constrexpr.notation_entry * Constrexpr.notation_key)
* Constrexpr.notation_key
* Constrexpr.notation_with_optional_scope
* Notation_term.interpretation
* Names.GlobRef.tSame together with the full notation
val declare_arguments_scope :
bool ->
Names.GlobRef.t ->
Notation_term.scope_name list list ->
unitDeclares and looks for scopes associated to arguments of a global ref
Comparison of scope_class
val subst_scope_class :
Environ.env ->
Mod_subst.substitution ->
scope_class ->
scope_class optionval declare_scope_class :
bool ->
Notation_term.scope_name ->
?where:add_scope_where ->
scope_class ->
unitval compute_arguments_scope :
Environ.env ->
Evd.evar_map ->
EConstr.types ->
Notation_term.scope_name list listval compute_type_scope :
Environ.env ->
Evd.evar_map ->
EConstr.types ->
Notation_term.scope_name listGet the current scopes bound to Sortclass
Building notation key
type symbol = | Terminal of string| NonTerminal of Names.Id.t| SProdList of Names.Id.t * symbol list| Break of int
Make/decompose a notation of the form "_ U _"
type notation_symbols = {recvars : (Names.Id.t * Names.Id.t) list;mainvars : Names.Id.t list;symbols : symbol list;
}Decompose a notation of the form "a 'U' b" together with the lists of pairs of recursive variables and the list of all variables binding in the notation
Prints scopes (expects a pure aconstr printer)
val locate_notation :
(Glob_term.glob_constr -> Pp.t) ->
Constrexpr.notation_key ->
Notation_term.scope_name option ->
Pp.tval pr_visibility :
(Glob_term.glob_constr -> Pp.t) ->
Notation_term.scope_name option ->
Pp.tCoercions between entries
val is_coercion :
Constrexpr.notation_entry_level ->
Constrexpr.notation_entry_relative_level ->
boolFor a rule of the form "Notation string := x (in some-entry, x at some-relative-entry)", tell if going from some-entry to some-relative-entry is coercing
val declare_entry_coercion :
Constrexpr.specific_notation ->
Constrexpr.notation_entry_level ->
Constrexpr.notation_entry_relative_level ->
unitAdd a coercion from some-entry to some-relative-entry
val availability_of_entry_coercion :
?non_included:bool ->
Constrexpr.notation_entry_relative_level ->
Constrexpr.notation_entry_level ->
entry_coercion optionReturn a coercion path from some-relative-entry to some-entry if there is one
Special properties of entries
val may_capture_cont_after :
Constrexpr.entry_level option ->
Constrexpr.entry_relative_level ->
boolDeclare and test the level of a (possibly uninterpreted) notation
raise Not_found if not declared
Rem: printing rules for primitive token are canonical