package rocq-runtime
Install
dune-project
Dependency
Authors
Maintainers
Sources
sha256=a45280ab4fbaac7540b136a6b073b4a6db15739ec1e149bded43fa6f4fc25f20
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 and for Locate, string for printing (pr_notation_info)
type prim_token_infos = {pt_local : bool;(*Is this interpretation local?
*)pt_scope : Notation_term.scope_name;(*Concerned scope
*)pt_interp_info : PrimNotations.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 :
print_float:bool ->
'a Glob_term.glob_constr_g ->
Notation_term.subscopes ->
Constrexpr.prim_token * delimiters optionval uninterp_prim_token_cases_pattern :
print_float:bool ->
'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 Globnames.CustomName.t * int| IsEntryIdent of Globnames.CustomName.t * 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
val find_arguments_scope :
Environ.env ->
Names.GlobRef.t ->
Notation_term.scope_name list listComparison 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