F.QEDSourceLoosely closed terms.
Non-structural, machine dependent, but fast comparison and efficient merges
Non-structural, machine dependent, but fast comparison and efficient merges
Structuraly ordered, but less efficient access and non-linear merges
Structuraly ordered, but less efficient access and non-linear merges
Constant time.
Constant time.
Computes equality
Constant time
Path-positioning access
This part of the API is DEPRECATED
position of a subterm in a term.
Bind the given variable if it appears free in the term, or return the term unchanged.
Opens the top-most bound variable with a (fresh) variable. Can be only applied on top-most lc-term from `Bind(_,_,_)`, thanks to typing.
val e_open :
pool:pool ->
?forall:bool ->
?exists:bool ->
?lambda:bool ->
term ->
(Qed.Logic.binder * var) list * termOpen all the specified binders (flags default to `true`, so all consecutive top most binders are opened by default). The pool must contain all free variables of the term.
Closes all specified binders
The environment sigma must be prepared with the desired substitution. Its pool of fresh variables must covers the entire domain and co-domain of the substitution, and the transformed values.
These functions can be unsafe because they might expose terms that contains non-bound b-vars. Never use such terms to build substitutions (sigma).
Similar to f_iter but exposes non-closed sub-terms of `Bind` as regular term values instead of lc_term ones.
val f_map :
?pool:pool ->
?forall:bool ->
?exists:bool ->
?lambda:bool ->
(term -> term) ->
term ->
termPass and open binders, maps its direct sub-terms and then close then opened binders Raises Invalid_argument in case of a bind-term without pool. The optional pool must contain all free variables of the term.
val f_iter :
?pool:pool ->
?forall:bool ->
?exists:bool ->
?lambda:bool ->
(term -> unit) ->
term ->
unitIterates over its direct sub-terms (pass and open binders) Raises Invalid_argument in case of a bind-term without pool. The optional pool must contain all free variables of the term.
val typeof :
?field:(Field.t -> tau) ->
?record:(Field.t -> tau) ->
?call:(Fun.t -> tau option list -> tau) ->
term ->
tauTry to extract a type of term. Parameterized by optional extractors for field and functions. Extractors may raise Not_found ; however, they are only used when the provided kinds for fields and functions are not precise enough.
Register a simplifier for function f. The computation code may raise Not_found, in which case the symbol is not interpreted.
If f is an operator with algebraic rules (see type operator), the children are normalized before builtin call.
Highest priority is 0. Recursive calls must be performed on strictly smaller terms.
The force parameters defaults to false, when it is true, if there exist another builtin, it is replaced with the new one. Use with care.
Register a builtin for rewriting f a1..an into f b1..bm.
This is short cut for set_builtin, where the head application of f avoids to run into an infinite loop.
The force parameters defaults to false, when it is true, if there exist another builtin, it is replaced with the new one. Use with care.
set_builtin_get f rewrite register a builtin for rewriting (f a1..an)[k1]..[km] into rewrite (a1..an) (k1..km).
The force parameters defaults to false, when it is true, if there exist another builtin, it is replaced with the new one. Use with care.
Register a builtin for simplifying (f eā¦).fd expressions. Must only use recursive comparison for strictly smaller terms.
The force parameters defaults to false, when it is true, if there exist another builtin, it is replaced with the new one. Use with care.
Register a builtin equality for comparing any term with head-symbol. Must only use recursive comparison for strictly smaller terms. The recognized term with head function symbol is passed first.
Highest priority is 0. Recursive calls must be performed on strictly smaller terms.
The force parameters defaults to false, when it is true, if there exist another builtin, it is replaced with the new one. Use with care.
Register a builtin for comparing any term with head-symbol. Must only use recursive comparison for strictly smaller terms. The recognized term with head function symbol can be on both sides. Strict comparison is automatically derived from the non-strict one.
Highest priority is 0. Recursive calls must be performed on strictly smaller terms.
The force parameters defaults to false, when it is true, if there exist another builtin, it is replaced with the new one. Use with care.
Knowing h, consequence h a returns b such that h -> (a<->b)
internal id
head symbol with children id's
head symbol with children id's
Occurrence check. is_subterm a b returns true iff a is a subterm of b. Optimized wrt shared subterms, term size, and term variables.
Computes the sub-terms that appear several times. shared marked linked e returns the shared subterms of e.
The list of shared subterms is consistent with order of definition: each trailing terms only depend on heading ones.
The traversal is controlled by two optional arguments:
shared those terms are not traversed (considered as atomic, default to none)shareable those terms (is_simple excepted) that can be shared (default to all)subterms those sub-terms a term to be considered during traversal (lc_iter by default)Low-level shared primitives: shared is actually a combination of building marks, marking terms, and extracting definitions:
let share ?... e =
let m = marks ?... () in
List.iter (mark m) es ;
defs m Create a marking accumulator. Same defaults than shared.
Mark a term to be explicitly shared