package coq
Install
Dune Dependency
Authors
Maintainers
Sources
sha256=73466e61f229b23b4daffdd964be72bd7a110963b9d84bd4a86bb05c5dc19ef3
doc/coq-core.lib/Rtree/index.html
Module Rtree
Source
Type of regular tree with nodes labelled by values of type 'a The implementation uses de Bruijn indices, so binding capture is avoided by the lift operator (see example below)
Building trees
Build mutually recursive trees: X_1 = f_1(X_1,..,X_n) ... X_n = f_n(X_1,..,X_n) is obtained by the following pseudo-code let vx = mk_rec_calls n in let |x_1;..;x_n|
= mk_rec|f_1(vx.(0),..,vx.(n-1);..;f_n(vx.(0),..,vx.(n-1))|
First example: build rec X = a(X,Y) and Y = b(X,Y,Y) let |vx;vy|
= mk_rec_calls 2 in let |x;y|
= mk_rec |mk_node a [|vx;vy|]; mk_node b [|vx;vy;vy|]|
Another example: nested recursive trees rec Y = b(rec X = a(X,Y),Y,Y) let |vy|
= mk_rec_calls 1 in let |vx|
= mk_rec_calls 1 in let |x|
= mk_rec|mk_node a vx;lift 1 vy|
let |y|
= mk_rec|mk_node b x;vy;vy|
(note the lift to avoid
lift k t
increases of k
the free parameters of t
. Needed to avoid captures when a tree appears under mk_rec
dest_param is not needed for closed trees (i.e. with no free variable)
Tells if a tree has an infinite branch. The first arg is a comparison used to detect already seen elements, hence loops
Rtree.equiv eq eqlab t1 t2
compares t1 t2 (top-down). If t1 and t2 are both nodes, eqlab
is called on their labels, in case of success deeper nodes are examined. In case of loop (detected via structural equality parametrized by eq
), then the comparison is successful.
Rtree.equal eq t1 t2
compares t1 and t2, first via physical equality, then by structural equality (using eq
on elements), then by logical equivalence Rtree.equiv eq eq
Iterators