major set theory improvement

parent ae91a86d
......@@ -1735,14 +1735,14 @@ operation.
It is a higher order library, it takes a set of functions and construct set opaerations, amongst defined are, @code{∪,,,,⊕}, ordered and unordered.
@section API
@subsection API
You can reach this code by importing @code{(ice-9 set set)}
@code{scm (make-set-from-assoc-mac ...)} the macro version of the below
@code{scm (make-set-from-assoc null assoc acons delete hash mk-kv mk-kv kv? kv-key kv-val size value? order? equal? ar->l l->ar)}
@subsection Input
@subsubsection Input
@verbatim
null = the empty assoc/set
assoc = (assoc x set/map), maps to either a key value pair or x itself if x is a member of set, else @code{#f}
......@@ -1762,7 +1762,7 @@ ar->l = the identity map TODO remove this from the api
l->ar = the identity map TODO remove this from the api
@end verbatim
@subsection Output
@subsubsection Output
The outputs are a value list according to
@verbatim
(values #:= #:u u #:n n #:- s- #:+ s+ #:< #:<=
......@@ -1828,7 +1828,7 @@ more generalised lookup. complements of an ordered map sets have no map defined
for them, any such maps need to be taken from the world at instantiation of
a complemented set into that world, or the real sets it is intersecting with.
@section API
@subsection API
To use this library import @code{(ice-9 set complement)}.
@code{scm (make-complementable-set union intersection difference triple equiv? set-size set? make-one)}
......@@ -1848,7 +1848,7 @@ results in:
We also export a complement set struct according to @code{($ <set> set complement), cset?}.
@subsection Input
@subsubsection Input
@verbatim
union A,B -> {x|xA or xB} (AB)
intersection A,B -> {x|xA and xB} (AB)
......@@ -1861,7 +1861,7 @@ set? predicate for beeing a set of the underlying set structure
make-one Map a set to a set and an element to a set with one element
@end verbatim
@subsection Output
@subsubsection Output
@verbatim
#:u : ∪ - union for complemented sets 0,1,... arguments
#:n : ∩ - intersection for complemented sets 0,1,... arguments
......@@ -1878,7 +1878,7 @@ make-one Map a set to a set and an element to a set with one element
@section Theory
@subsubsection Theory
For a full solution one need to track orders in the complement channel as
well as the non complement channel.
......@@ -1920,7 +1920,7 @@ Q = (A/B)c n (C/D)c = (B u Ac) n (C u Dc) = .. It implements complementable set
@section implementations
This api is reached from @code{(ice-9 vset)}. It implements complementable set and setmaps from different underlying vhash datastructures.
@section API
@subsection API
There are several versions of datastructures that we create and the API for those will come in the subsectons to this section, but all these datastructures have in common the following.
@verbatim
......@@ -1943,7 +1943,7 @@ value? : if the value need to be important
order? : if ordering of this key is important
@end verbatim
@subsection vset that is based on equal? vhash datastructure
@subsubsection vset that is based on equal? vhash datastructure
@findex vset-equal?
@findex vset-union
@findex vset-intersection
......@@ -1996,7 +1996,7 @@ order? : if ordering of this key is important
vset-empty
@end verbatim
@subsection vset that is based on eq? vhash datastructure
@subsubsection vset that is based on eq? vhash datastructure
@findex vsetq-equal?
@findex vsetq-union
@findex vsetq-intersection
......@@ -2049,7 +2049,7 @@ order? : if ordering of this key is important
vsetq-empty
@end verbatim
@subsection vset that is based on eqv? vhash datastructure
@subsubsection vset that is based on eqv? vhash datastructure
@findex vsetv-equal?
@findex vsetv-union
@findex vsetv-intersection
......@@ -2102,7 +2102,7 @@ order? : if ordering of this key is important
vsetv-empty
@end verbatim
@subsection vset that is based on per element hash and equal redicates vhash datastructure
@subsubsection vset that is based on per element hash and equal redicates vhash datastructure
@findex vsetx-equal?
@findex vsetx-union
@findex vsetx-intersection
......@@ -2155,7 +2155,7 @@ order? : if ordering of this key is important
vsetx-empty
@end verbatim
@subsection weak vset that is based on per element hash and equal redicates vhash datastructure
@subsubsection weak vset that is based on per element hash and equal redicates vhash datastructure
@findex wsetx-equal?
@findex wsetx-union
@findex wsetx-intersection
......@@ -2212,7 +2212,7 @@ order? : if ordering of this key is important
@chapter inheritance
Consider a set of objects and that we can add arrow links between the objects that forms a forest of acyclic directed graphs. This is the same as defining a multiple inheritance relation to the objects. What we can compile is lookup structures that enables fast understanding if one object is an ancester to another object or not, use function @code{compile-sup-sub}. and vice versa. Another useful lookup structure origiates from associating each set obect with a value and then ask for all objects of an object and all it's decendants. This is a kind of tree lookup and one needs to reorder the objects to enable an effective lookup, this is dine in the special compiliation function, @code{compile-set-representation} or @code{order-the-set}. It's possible to build a search tree through function @code{mktree}. To use this lookup tree one can use @code{fold-matching-sets} which folds all decendants from a paren set object.
@chapter API
@section API
@verbatim
this code is found in (logic guile-log inheritance)
......@@ -2514,7 +2514,7 @@ the orders of fact1 and fact2 etc in the definitions of R1 and R2.
@chapter Minikanren
minikanren is a more modern streamlined kanren. The traditional implementation is interesting, but we implement the semantic differently using guile-log internals in stead. The basic implementation in minikanren is to construct a special trampolines that enables code to search the space of solutions in a breth first way. Also there is a logaritmic addition of clauses meaning that the first clauses in an or have higher rate of trying then the last one so that by ordering the most likely clauses first you get a higher hit ratio. Also in minikanren one maintains multiple stack datastructures and does a great degree of groveling in them in order to implement the needed features. Here we take anothre approach and use attributes instead. In all we reproduce the sematics of minikanren but with a completely different appoach that mix well with the rest of guile-log. The minikanren primitives is also used to enable those in guile-prolog and a few operators is defined that enable the minikanren features in prolog programs.
@chapter API
@section API
To use this library reference @code{(logic guile-log minikanren)}.
The method of the api is to combine functions and finally evaluate the result yielding the logic program. A minikanren goal @code{mk-goal} can be executed in guile log as @code{(mk-goal)} and you can construct a minikanren goal directly by wrapping it in @code{(<lambda> () ...)}.
......@@ -2573,6 +2573,7 @@ Guile log also sports an iso-prolog interface as a logic programming interface b
* scheme:: Hooking in scheme expressions
* functors:: map funcitons to functions
* closures:: Using closures in prolog
* extended matching:: Matching extensions deviating from normal prolog
* prolog-dynamic-functions:: A discussion of guile log's version of this
* dynamic-features:: Special construct to manage dynamic objects
* prolog-libraries:: Libraries that exposes guile-log features
......@@ -2980,6 +2981,60 @@ To reflect the closure we have from @code{[use-modules (logic guile-log guile-pr
@code{prolog closure_code_ref(Cl,F)}, will expose the code of the closure @code{Cl} into @code{F}.
@node extended matching
@section Extended Matching.
Good indexing of prolog clauses means mainly that fewer misstakes of leaving
a branch in the trail of the control stack in case the algorithms rely on garbage collection. Now there are also speedups potentials for large predicates to be gain as well. Lists is matched and destructed, but not all predicate versions and alternative matches is also not covered but needs to be coded explicitly inside the goal. Let's show how guile-log's extensions solve this.
The first example is how we matched predicates.
@verbatim
f(F(X|L),g(|M)) :- append(L,M,N), X=h(F|N).
% f is the same as f2 below
f2(A,B) :-
A =.. [F,X|L],
B =.. [g|M],
append(L,M,N),
X =.. [h,F|N].
@end verbatim
Guile-log destructs the arguments of a predicate just as with lists and have added a prefix version of @code{|} to enable a destruction of all arguments to a list. It is also clear code that can be understood immediately and it is terse, also a good thing is that the destruction in the head is much less general and indexing works much better. The drawback is that @code{|} has a special meaning inside matches.
The parser in prolog have been modified to allow expressions in the finction argument as well and we can now also do @code{(f+g)(X,Y)} in extended matching we also allow meaning to @code{, ; - + \+} here @code{A ; B} in the head means @code{((match(A) ; match(B)),!} e.g. no backtracking and @code{A , B} is matching the same thing with both @code{A} and @code{B} therefore for:
@findex extended
@verbatim
-extended.
f((Op,(< ; >))(X,Y),W) :- ...
@end verbatim
Here we will match either @code{(X < Y)} or @code{(X > Y)} and bind the actual operator to @code{Op} which is useful and gainful because the indexer is designed to do the right thing with all extra operators. The ideom above is a really great tool that enables efficient analyzation of expressions. @code{\+} is negation that is good to have and unary @code{+} enables normal unification and unary @code{-} enables @code{==} matching. The default is always that the expression starts in @code{+} mode e.g. @code{=}.
@verbatim
-extended.
f(-f(+X),X).
?- f(f(1),X).
X = 1
?- f(X,Y).
no
@end verbatim
In extended matching it is possible to change the operators by using
@verbatim
-extended(',',och,';',eller).
f(och(Op,eller(;,','))(X,Y) :- ...
@end verbatim
In the future we will allow som basic tests like @code{var,integer,...} etc that can increase the potential of the indexer somewhat, but it is not coded yet. also inside @code{==} matching it can look clumsy to use @code{+X} this is needed in order for terms to be allowed to be simply copied and used in a unification construct that follows the rules of the extended matching. These kind of unifications is not yet coded and is a todo for the future. But in principle variable binding should not need a @code{+} and in the future I would like this to be skipt in order to streamline @code{==} matching.
@node prolog-dynamic-functions
@section Explaing the guile-log dynamic functions
Dynamic functions in guile-log prolog follows the iso prolog interface. But they are more powerful. They belong to a class of object that we can call dynamic objects for which dynamic features can be added how to backtrack store and restore state. The driving feature is that the state infromation is updated in a funcitonal manner and that its encapsulated with a thread safe handle. But the datastructure are not only functional, in order to have decent properties in prolog program and let them for example back track with the logic program we allow a mark and reset feature. To understand this scope please read about dynamic features. The dynamic functions are optimized for fast lookup and guile log prolog is fully indexed and can yield the matching items faster than it takes to actually perform any common match consequent. The target is for systems that update seldom and do lookup often. The dynamic functions @code{assert*} compainion will compile the program to bytecode/native for faster execution. Do not use dynamic functions as a hash table that updates often, for that use the hash table library. Also currently at most 10000 elements can be stored for a dynamic function. (The algorithm scales badly after that and we do not support larger than that).
......@@ -3074,6 +3129,7 @@ There are a few interesting datastructures and algorithm taken from guile-log th
* prolog attributes:: Attributed vairbales for prolog
* prolog coroutines:: Coroutining
* prolog canonical:: Canonical representation of rational data
* prolog sequencing:: extensions of findall and bagall etc
@end menu
@node prolog interleaving
......@@ -3373,6 +3429,309 @@ In especially tablating, but also in other recursive datastructures like printin
@findex recursive_canonize
@code{prolog recursive_canonize(X,Out)}, which will produce as output a canonical representation of @code{X}.
@node prolog sequencing
@subsection Prolog Extensions Of Findall Bagof Etc
There are quite a number of acumumulations and related constructs defined in guile-log's prolog, we will discuss them here,
@findex findall
@findex bagof
@findex setof
@code{prolog findall(Template,Goal,Result)}, this will simply copy the template values for all solutions of goal and put it in result.
@code{prolog bagof(Template,Goal,Result)}, this will simply copy the template values for all solutions of goal and put it in result. any templates prefixed like @code{Goal = A^B^Goal2} means that variables @code{A,B} will be free to change for each solution of @code{Goal2} e.g. it will find the first acumulation of solutions with all other variables inside @code{Goal2} fixed to the first solution, then at backtracking the next one will be shown etc, here is an example
@verbatim
prolog@(prolog-user)> bagof([X,Y],X^(between(1,3,X),between(1,3,Y)),L).
Y = 1,
L = [[1, 1], [2, 1], [3, 1]].
more (y/n/a/s) > y
Y = 2,
L = [[1, 2], [2, 2], [3, 2]].
more (y/n/a/s) > y
Y = 3,
L = [[1, 3], [2, 3], [3, 3]].
more (y/n/a/s) > y
no
@end verbatim
@code{prolog setof(Template,Goal,Result)}, is the same as bagof, but the fixed variables will not be duplicated if they are. Example
@verbatim
%This will generate two solution with the same X,Y values
prolog@(prolog-user)> setof([X,Y],X^(between(1,3,X),between(1,3,Y),(true;true)),L).
Y = 1,
L = [[1, 1], [2, 1], [3, 1]].
more (y/n/a/s) > y
Y = 2,
L = [[1, 2], [2, 2], [3, 2]].
more (y/n/a/s) > y
Y = 3,
L = [[1, 3], [2, 3], [3, 3]].
more (y/n/a/s) > y
no
@end verbatim
The next section will document plain acumulations with numerics. The important adition is that template is evaluated which means that things like @code{sumof(X*X,between(1,10,X),SumOfSquares)} does the right thing. The acumulators are:
@findex foldof
@findex sumof
@findex prodof
@findex countof
@findex maxof
@findex minof
@findex lastof
@code{prolog sumof(Expr,Goal,Result)}, the sum of all expressions, like bagof.
@code{prolog prodof(Expr,Goal,Result)}, the product of all expressions, like bagof.
@code{prolog countof(Goal,Result)}, the count of all solutions, like bagof.
@code{prolog maxof(Expr,Goal,Result)}, the maximum of all expressions, like bagof.
@code{prolog minof(Expr,Goal,Result)}, the minimum of all expressions, like bagof.
@code{prolog lastof(Template,Goal,Result)}, the last expression, like bagof.
@code{prolog foldof(Template,Goal,Result)}.
@findex foldall
@findex sumall
@findex prodall
@findex countall
@findex maxall
@findex minall
@findex lastall
@code{prolog sumall(Expr,Goal,Result)}, the sum of all expressions, like findall.
@code{prolog prodall(Expr,Goal,Result)}, the product of all expressions, like findall.
@code{prolog countall(Goal,Result)}, the count of all solutions, like findall.
@code{prolog maxall(Expr,Goal,Result)}, the maximum of all expressions, like findall.
@code{prolog minall(Expr,Goal,Result)}, the minimum of all expressions, like findall.
@code{prolog lastall(Template,Goal,Result)}, the last expression, like findall.
@code{prolog foldall(Template,Goal,Result)}.
@findex foldstp
@findex sumstp
@findex prodstp
@findex countstp
@findex maxstp
@findex minstp
The next section describes ideoms like forall that for each acumulated value the predicate suceeds and at backtracking the next value is tried. e.g.
@verbatim
prolog@(prolog-user)> sumstp(X*X,between(1,3,X),L).
X = 1,
L = 1.
more (y/n/a/s) > y
X = 2,
L = 5.
more (y/n/a/s) > y
X = 3,
L = 14.
more (y/n/a/s) > y
no
@end verbatim
@code{prolog sumstp(Expr,Goal,Result)}, the sum of all expressions.
@code{prolog prodstp(Expr,Goal,Result)}, the product of all expressions.
@code{prolog countstp(Goal,Result)}, the count of all solutions.
@code{prolog maxstp(Expr,Goal,Result)}, the maximum of all expressions.
@code{prolog minstp(Expr,Goal,Result)}, the minimum of all expressions.
@code{prolog foldstp(Template,Goal,Result)}.
@findex foldalln
@findex sumalln
@findex prodalln
@findex countalln
@findex maxalln
@findex minalln
@findex lastalln
There is class named as above with the suffix @code{n}. This add an extra element first which if an integer @code{n} then it will acumulat at most @code{n} times and if @code{n == strict(m)}, then in order for it to sucess exactly @code{m} times and if less. So we get the interfaces example:
@verbatim
prolog@(prolog-user)> sumalln(3,X*X,between(1,3,X),L).
L = 14.
prolog@(prolog-user)> sumalln(2,X*X,between(1,3,X),L).
L = 5.
prolog@(prolog-user)> sumalln(10,X*X,between(1,3,X),L).
L = 14.
prolog@(prolog-user)> sumalln(strict(3),X*X,between(1,3,X),L).
L = 14.
prolog@(prolog-user)> sumalln(strict(2),X*X,between(1,3,X),L).
L = 5.
prolog@(prolog-user)> sumalln(strict(4),X*X,between(1,3,X),L).
no
@end verbatim
@code{prolog sumalln(N,Expr,Goal,Result)}, the sum of all expressions.
@code{prolog prodalln(N,Expr,Goal,Result)}, the product of all expressions.
@code{prolog countalln(N,Goal,Result)}, the count of all solutions.
@code{prolog maxalln(N,Expr,Goal,Result)}, the maximum of all expressions.
@code{prolog minalln(N,Expr,Goal,Result)}, the minimum of all expressions.
@code{prolog lastalln(N,Expr,Goal,Result)}, the last of all expressions.
@code{prolog foldalln(N,Template,Goal,Result)}.
@findex foldstpn
@findex sumstpn
@findex prodstpn
@findex countstpn
@findex maxstpn
@findex minstpn
@findex laststpn
The same as previous chunk of interfaces but the stepwise version is of cause
@code{prolog sumstpn(N,Expr,Goal,Result)}, the sum of all expressions.
@code{prolog prodstpn(N,Expr,Goal,Result)}, the product of all expressions.
@code{prolog counstpn(N,Goal,Result)}, the count of all solutions.
@code{prolog maxstpn(N,Expr,Goal,Result)}, the maximum of all expressions.
@code{prolog minstpn(N,Expr,Goal,Result)}, the minimum of all expressions.
@code{prolog foldstpn(N,Template,Goal,Result)}.
@findex foldofs
@findex sumofs
@findex prodofs
@findex countofs
@findex maxofs
@findex minofs
The @code{sumof} can be adjusted so that i the same solution appears twise then the solution is combined, e.g.
@verbatim
prolog@(prolog-user)> sumofs(X,member(X,[1,2,2,3]),L).
X = 1,
L = 1.
more (y/n/a/s) > y
X = 2,
L = 4.
more (y/n/a/s) > y
X = 3,
L = 3.
more (y/n/a/s) > y
no
@end verbatim
@code{prolog sumofs(Expr,Goal,Result)}, the sum of all expressions.
@code{prolog proofs(N,Expr,Goal,Result)}, the product of all expressions.
@code{prolog countofs(N,Goal,Result)}, the count of all solutions.
@code{prolog maxofs(N,Expr,Goal,Result)}, the maximum of all expressions.
@code{prolog minofs(N,Expr,Goal,Result)}, the minimum of all expressions.
@code{prolog foldofn(N,Template,Goal,Result)}.
@findex foldofn
@findex sumofn
@findex prodofn
@findex countofn
@findex maxofn
@findex minofn
The stepwise @code{sumof} are:
@code{prolog sumofn(Expr,Goal,Result)}, the sum of all expressions.
@code{prolog proofn(N,Expr,Goal,Result)}, the product of all expressions.
@code{prolog countofn(N,Goal,Result)}, the count of all solutions.
@code{prolog maxofn(N,Expr,Goal,Result)}, the maximum of all expressions.
@code{prolog minofn(N,Expr,Goal,Result)}, the minimum of all expressions.
@code{prolog foldofn(N,Template,Goal,Result)}.
@findex foldofsn
@findex sumofsn
@findex prodofsn
@findex countofsn
@findex maxofsn
@findex minofsn
And the combination of the @code{s} and @code{n} simply is
@code{prolog sumofsn(Expr,Goal,Result)}, the sum of all expressions.
@code{prolog proofsn(N,Expr,Goal,Result)}, the product of all expressions.
@code{prolog countofsn(N,Goal,Result)}, the count of all solutions.
@code{prolog maxofsn(N,Expr,Goal,Result)}, the maximum of all expressions.
@code{prolog minofsn(N,Expr,Goal,Result)}, the minimum of all expressions.
@code{prolog foldofsn(N,Template,Goal,Result)}.
@findex amaxof
@findex aminof
@findex bmaxof
@findex bminof
@findex amaxall
@findex aminall
@findex bmaxall
@findex bminall
@findex amaxstp
@findex aminstp
@findex bmaxstp
@findex bminstp
@findex amaxalln
@findex aminalln
@findex bmaxalln
@findex bminalln
@findex amaxstpn
@findex aminstpn
@findex bmaxstpn
@findex bminstpn
@findex amaxofp
@findex aminofp
@findex bmaxofp
@findex bminofp
@findex amaxofs
@findex aminofs
@findex bmaxofs
@findex bminofs
@findex amaxofn
@findex aminofn
@findex bmaxofn
@findex bminofn
@findex amaxofpn
@findex aminofpn
@findex bmaxofpn
@findex bminofpn
@findex amaxofsn
@findex aminofsn
@findex bmaxofsn
@findex bminofsn
Af all examples above we also av an argument max and argument min version as well just replace @code{sum} with @code{amax} or @code{amin} @code{bmax} or @code{bmin} in the name of the predicate e.g. The return value is in the form @code{MAX|ARGMAX} with index starting at one and zero for the empty list. Example:
@verbatim
prolog@(prolog-user)> aminall(X,member(X,[2,4,4,1,1,3]),L).
L = [1|4].
prolog@(prolog-user)> bminall(X,member(X,[2,4,4,1,1,3]),L).
L = [1|5].
prolog@(prolog-user)> amaxall(X,member(X,[2,4,4,1,1,3]),L).
L = [4|2].
prolog@(prolog-user)> bmaxall(X,member(X,[2,4,4,1,1,3]),L).
L = [4|3].
@end verbatim
@verbatim
@end verbatim
@node debugging
@section How to debug prolog programs
@findex Trace
......@@ -3413,7 +3772,7 @@ To note is that only variables and cons cells allocated from stacks will support
It is possible to persist logical datastructures and state. It is not trivial to accomplish this and the interface must enable varying logic in order to meet
different demands. One important aspect is that a named variable need to be able to be looked up and at loading new data those variables need to be updated. @code{define-named-object} enables this feature. Another feature is that you do not want to update a named objects value @code{make-shallow} enables that and will force the persister to just remember the module/name path to it and not persist the value. Finally if you do not want to change the value directly, but a substructure inside of it, associate a getter and a setter via @code{associate-getter-setter} and you will be able to maintain the integrity of variable values identity but still update the data. Guile structs, guile-log vlists and vhashes lists prolog variables and cons cells lists vectors closures primitive programs can all be persisted.
@chapter API
@section API
@findex make-persister
@code{scm (make-persister #:key (file "persist.scm"))}, this will make a persistance object. You can add datastructures and retrieve datastructures and persist to disk. Datastructures are keyed in.
......
......@@ -56,7 +56,7 @@ Previous: <a href="persistance.html#persistance" accesskey="p" rel="prev">persis
</div>
<hr>
<a name="Index-of-the-guile_002dlog-api"></a>
<h2 class="chapter">22 Index of the guile-log api</h2>
<h2 class="chapter">19 Index of the guile-log api</h2>
<a name="Index-1"></a>
<h2 class="unnumbered">Index</h2>
......@@ -265,6 +265,26 @@ Previous: <a href="persistance.html#persistance" accesskey="p" rel="prev">persis
<tr><td></td><td valign="top"><a href="kanren.html#index-all_0021_0021"><code>all!!</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="kanren.html#kanren">kanren</a></td></tr>
<tr><td></td><td valign="top"><a href="kanren.html#index-all_002dinterleave"><code>all-interleave</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="kanren.html#kanren">kanren</a></td></tr>
<tr><td></td><td valign="top"><a href="dynamic_002dfeatures.html#index-always_005fstate_005fguard_005fdynamic_005fobject"><code>always_state_guard_dynamic_object</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="dynamic_002dfeatures.html#dynamic_002dfeatures">dynamic-features</a></td></tr>
<tr><td></td><td valign="top"><a href="prolog-sequencing.html#index-amaxall"><code>amaxall</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="prolog-sequencing.html#prolog-sequencing">prolog sequencing</a></td></tr>
<tr><td></td><td valign="top"><a href="prolog-sequencing.html#index-amaxalln"><code>amaxalln</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="prolog-sequencing.html#prolog-sequencing">prolog sequencing</a></td></tr>
<tr><td></td><td valign="top"><a href="prolog-sequencing.html#index-amaxof"><code>amaxof</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="prolog-sequencing.html#prolog-sequencing">prolog sequencing</a></td></tr>
<tr><td></td><td valign="top"><a href="prolog-sequencing.html#index-amaxofn"><code>amaxofn</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="prolog-sequencing.html#prolog-sequencing">prolog sequencing</a></td></tr>
<tr><td></td><td valign="top"><a href="prolog-sequencing.html#index-amaxofp"><code>amaxofp</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="prolog-sequencing.html#prolog-sequencing">prolog sequencing</a></td></tr>
<tr><td></td><td valign="top"><a href="prolog-sequencing.html#index-amaxofpn"><code>amaxofpn</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="prolog-sequencing.html#prolog-sequencing">prolog sequencing</a></td></tr>
<tr><td></td><td valign="top"><a href="prolog-sequencing.html#index-amaxofs"><code>amaxofs</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="prolog-sequencing.html#prolog-sequencing">prolog sequencing</a></td></tr>
<tr><td></td><td valign="top"><a href="prolog-sequencing.html#index-amaxofsn"><code>amaxofsn</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="prolog-sequencing.html#prolog-sequencing">prolog sequencing</a></td></tr>
<tr><td></td><td valign="top"><a href="prolog-sequencing.html#index-amaxstp"><code>amaxstp</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="prolog-sequencing.html#prolog-sequencing">prolog sequencing</a></td></tr>
<tr><td></td><td valign="top"><a href="prolog-sequencing.html#index-amaxstpn"><code>amaxstpn</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="prolog-sequencing.html#prolog-sequencing">prolog sequencing</a></td></tr>
<tr><td></td><td valign="top"><a href="prolog-sequencing.html#index-aminall"><code>aminall</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="prolog-sequencing.html#prolog-sequencing">prolog sequencing</a></td></tr>
<tr><td></td><td valign="top"><a href="prolog-sequencing.html#index-aminalln"><code>aminalln</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="prolog-sequencing.html#prolog-sequencing">prolog sequencing</a></td></tr>
<tr><td></td><td valign="top"><a href="prolog-sequencing.html#index-aminof"><code>aminof</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="prolog-sequencing.html#prolog-sequencing">prolog sequencing</a></td></tr>
<tr><td></td><td valign="top"><a href="prolog-sequencing.html#index-aminofn"><code>aminofn</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="prolog-sequencing.html#prolog-sequencing">prolog sequencing</a></td></tr>
<tr><td></td><td valign="top"><a href="prolog-sequencing.html#index-aminofp"><code>aminofp</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="prolog-sequencing.html#prolog-sequencing">prolog sequencing</a></td></tr>
<tr><td></td><td valign="top"><a href="prolog-sequencing.html#index-aminofpn"><code>aminofpn</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="prolog-sequencing.html#prolog-sequencing">prolog sequencing</a></td></tr>
<tr><td></td><td valign="top"><a href="prolog-sequencing.html#index-aminofs"><code>aminofs</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="prolog-sequencing.html#prolog-sequencing">prolog sequencing</a></td></tr>
<tr><td></td><td valign="top"><a href="prolog-sequencing.html#index-aminofsn"><code>aminofsn</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="prolog-sequencing.html#prolog-sequencing">prolog sequencing</a></td></tr>
<tr><td></td><td valign="top"><a href="prolog-sequencing.html#index-aminstp"><code>aminstp</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="prolog-sequencing.html#prolog-sequencing">prolog sequencing</a></td></tr>
<tr><td></td><td valign="top"><a href="prolog-sequencing.html#index-aminstpn"><code>aminstpn</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="prolog-sequencing.html#prolog-sequencing">prolog sequencing</a></td></tr>
<tr><td></td><td valign="top"><a href="guile_002dlog.html#index-and_002dinterleave"><code>and-interleave</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="guile_002dlog.html#guile_002dlog">guile-log</a></td></tr>
<tr><td></td><td valign="top"><a href="prolog-interleaving.html#index-and_005fi"><code>and_i</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="prolog-interleaving.html#prolog-interleaving">prolog interleaving</a></td></tr>
<tr><td></td><td valign="top"><a href="kanren.html#index-any"><code>any</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="kanren.html#kanren">kanren</a></td></tr>
......@@ -276,6 +296,27 @@ Previous: <a href="persistance.html#persistance" accesskey="p" rel="prev">persis
<tr><td colspan="4"> <hr></td></tr>
<tr><th><a name="Index_fn_letter-B">B</a></th><td></td><td></td></tr>
<tr><td></td><td valign="top"><a href="dynamic_002dfeatures.html#index-backtrack_005fdynamic_005fobject"><code>backtrack_dynamic_object</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="dynamic_002dfeatures.html#dynamic_002dfeatures">dynamic-features</a></td></tr>
<tr><td></td><td valign="top"><a href="prolog-sequencing.html#index-bagof"><code>bagof</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="prolog-sequencing.html#prolog-sequencing">prolog sequencing</a></td></tr>
<tr><td></td><td valign="top"><a href="prolog-sequencing.html#index-bmaxall"><code>bmaxall</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="prolog-sequencing.html#prolog-sequencing">prolog sequencing</a></td></tr>
<tr><td></td><td valign="top"><a href="prolog-sequencing.html#index-bmaxalln"><code>bmaxalln</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="prolog-sequencing.html#prolog-sequencing">prolog sequencing</a></td></tr>
<tr><td></td><td valign="top"><a href="prolog-sequencing.html#index-bmaxof"><code>bmaxof</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="prolog-sequencing.html#prolog-sequencing">prolog sequencing</a></td></tr>
<tr><td></td><td valign="top"><a href="prolog-sequencing.html#index-bmaxofn"><code>bmaxofn</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="prolog-sequencing.html#prolog-sequencing">prolog sequencing</a></td></tr>
<tr><td></td><td valign="top"><a href="prolog-sequencing.html#index-bmaxofp"><code>bmaxofp</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="prolog-sequencing.html#prolog-sequencing">prolog sequencing</a></td></tr>
<tr><td></td><td valign="top"><a href="prolog-sequencing.html#index-bmaxofpn"><code>bmaxofpn</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="prolog-sequencing.html#prolog-sequencing">prolog sequencing</a></td></tr>
<tr><td></td><td valign="top"><a href="prolog-sequencing.html#index-bmaxofs"><code>bmaxofs</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="prolog-sequencing.html#prolog-sequencing">prolog sequencing</a></td></tr>
<tr><td></td><td valign="top"><a href="prolog-sequencing.html#index-bmaxofsn"><code>bmaxofsn</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="prolog-sequencing.html#prolog-sequencing">prolog sequencing</a></td></tr>
<tr><td></td><td valign="top"><a href="prolog-sequencing.html#index-bmaxstp"><code>bmaxstp</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="prolog-sequencing.html#prolog-sequencing">prolog sequencing</a></td></tr>
<tr><td></td><td valign="top"><a href="prolog-sequencing.html#index-bmaxstpn"><code>bmaxstpn</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="prolog-sequencing.html#prolog-sequencing">prolog sequencing</a></td></tr>
<tr><td></td><td valign="top"><a href="prolog-sequencing.html#index-bminall"><code>bminall</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="prolog-sequencing.html#prolog-sequencing">prolog sequencing</a></td></tr>
<tr><td></td><td valign="top"><a href="prolog-sequencing.html#index-bminalln"><code>bminalln</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="prolog-sequencing.html#prolog-sequencing">prolog sequencing</a></td></tr>
<tr><td></td><td valign="top"><a href="prolog-sequencing.html#index-bminof"><code>bminof</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="prolog-sequencing.html#prolog-sequencing">prolog sequencing</a></td></tr>
<tr><td></td><td valign="top"><a href="prolog-sequencing.html#index-bminofn"><code>bminofn</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="prolog-sequencing.html#prolog-sequencing">prolog sequencing</a></td></tr>
<tr><td></td><td valign="top"><a href="prolog-sequencing.html#index-bminofp"><code>bminofp</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="prolog-sequencing.html#prolog-sequencing">prolog sequencing</a></td></tr>
<tr><td></td><td valign="top"><a href="prolog-sequencing.html#index-bminofpn"><code>bminofpn</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="prolog-sequencing.html#prolog-sequencing">prolog sequencing</a></td></tr>
<tr><td></td><td valign="top"><a href="prolog-sequencing.html#index-bminofs"><code>bminofs</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="prolog-sequencing.html#prolog-sequencing">prolog sequencing</a></td></tr>
<tr><td></td><td valign="top"><a href="prolog-sequencing.html#index-bminofsn"><code>bminofsn</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="prolog-sequencing.html#prolog-sequencing">prolog sequencing</a></td></tr>
<tr><td></td><td valign="top"><a href="prolog-sequencing.html#index-bminstp"><code>bminstp</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="prolog-sequencing.html#prolog-sequencing">prolog sequencing</a></td></tr>
<tr><td></td><td valign="top"><a href="prolog-sequencing.html#index-bminstpn"><code>bminstpn</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="prolog-sequencing.html#prolog-sequencing">prolog sequencing</a></td></tr>
<tr><td></td><td valign="top"><a href="minikanren.html#index-booleano"><code>booleano</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="minikanren.html#minikanren">minikanren</a></td></tr>
<tr><td colspan="4"> <hr></td></tr>
<tr><th><a name="Index_fn_letter-C">C</a></th><td></td><td></td></tr>
......@@ -296,6 +337,14 @@ Previous: <a href="persistance.html#persistance" accesskey="p" rel="prev">persis
<tr><td></td><td valign="top"><a href="minikanren.html#index-conde"><code>conde</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="minikanren.html#minikanren">minikanren</a></td></tr>
<tr><td></td><td valign="top"><a href="minikanren.html#index-condu"><code>condu</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="minikanren.html#minikanren">minikanren</a></td></tr>
<tr><td></td><td valign="top"><a href="dynamic_002dfeatures.html#index-copy_005fdynamic_005fobject"><code>copy_dynamic_object</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="dynamic_002dfeatures.html#dynamic_002dfeatures">dynamic-features</a></td></tr>
<tr><td></td><td valign="top"><a href="prolog-sequencing.html#index-countall"><code>countall</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="prolog-sequencing.html#prolog-sequencing">prolog sequencing</a></td></tr>
<tr><td></td><td valign="top"><a href="prolog-sequencing.html#index-countalln"><code>countalln</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="prolog-sequencing.html#prolog-sequencing">prolog sequencing</a></td></tr>
<tr><td></td><td valign="top"><a href="prolog-sequencing.html#index-countof"><code>countof</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="prolog-sequencing.html#prolog-sequencing">prolog sequencing</a></td></tr>
<tr><td></td><td valign="top"><a href="prolog-sequencing.html#index-countofn"><code>countofn</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="prolog-sequencing.html#prolog-sequencing">prolog sequencing</a></td></tr>
<tr><td></td><td valign="top"><a href="prolog-sequencing.html#index-countofs"><code>countofs</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="prolog-sequencing.html#prolog-sequencing">prolog sequencing</a></td></tr>
<tr><td></td><td valign="top"><a href="prolog-sequencing.html#index-countofsn"><code>countofsn</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="prolog-sequencing.html#prolog-sequencing">prolog sequencing</a></td></tr>
<tr><td></td><td valign="top"><a href="prolog-sequencing.html#index-countstp"><code>countstp</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="prolog-sequencing.html#prolog-sequencing">prolog sequencing</a></td></tr>
<tr><td></td><td valign="top"><a href="prolog-sequencing.html#index-countstpn"><code>countstpn</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="prolog-sequencing.html#prolog-sequencing">prolog sequencing</a></td></tr>
<tr><td></td><td valign="top"><a href="guile_002dlog.html#index-CUT"><code>CUT</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="guile_002dlog.html#guile_002dlog">guile-log</a></td></tr>
<tr><td colspan="4"> <hr></td></tr>
<tr><th><a name="Index_fn_letter-D">D</a></th><td></td><td></td></tr>
......@@ -315,6 +364,7 @@ Previous: <a href="persistance.html#persistance" accesskey="p" rel="prev">persis
<tr><td></td><td valign="top"><a href="modules.html#index-error_005fon_005fnamespace_005fswitch"><code>error_on_namespace_switch</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="modules.html#modules">modules</a></td></tr>
<tr><td></td><td valign="top"><a href="kanren.html#index-extend_002drelation"><code>extend-relation</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="kanren.html#kanren">kanren</a></td></tr>
<tr><td></td><td valign="top"><a href="kanren.html#index-extend_002drelation_002dwith_002drecur_002dlimit"><code>extend-relation-with-recur-limit</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="kanren.html#kanren">kanren</a></td></tr>
<tr><td></td><td valign="top"><a href="extended-matching.html#index-extended"><code>extended</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="extended-matching.html#extended-matching">extended matching</a></td></tr>
<tr><td colspan="4"> <hr></td></tr>
<tr><th><a name="Index_fn_letter-F">F</a></th><td></td><td></td></tr>
<tr><td></td><td valign="top"><a href="parser-combinators.html#index-f_002a"><code>f*</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="parser-combinators.html#parser-combinators">parser combinators</a></td></tr>
......@@ -356,8 +406,17 @@ Previous: <a href="persistance.html#persistance" accesskey="p" rel="prev">persis
<tr><td></td><td valign="top"><a href="parser-combinators.html#index-ff_002a"><code>ff*</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="parser-combinators.html#parser-combinators">parser combinators</a></td></tr>
<tr><td></td><td valign="top"><a href="parser-combinators.html#index-ff_002b"><code>ff+</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="parser-combinators.html#parser-combinators">parser combinators</a></td></tr>
<tr><td></td><td valign="top"><a href="parser-combinators.html#index-ff_003f"><code>ff?</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="parser-combinators.html#parser-combinators">parser combinators</a></td></tr>
<tr><td></td><td valign="top"><a href="prolog-sequencing.html#index-findall"><code>findall</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="prolog-sequencing.html#prolog-sequencing">prolog sequencing</a></td></tr>
<tr><td></td><td valign="top"><a href="dynamic_002dfeatures.html#index-fluid_005fguard_005fdynamic_005fobject"><code>fluid_guard_dynamic_object</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="dynamic_002dfeatures.html#dynamic_002dfeatures">dynamic-features</a></td></tr>
<tr><td></td><td valign="top"><a href="parser-combinators.html#index-fn"><code>fn</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="parser-combinators.html#parser-combinators">parser combinators</a></td></tr>
<tr><td></td><td valign="top"><a href="prolog-sequencing.html#index-foldall"><code>foldall</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="prolog-sequencing.html#prolog-sequencing">prolog sequencing</a></td></tr>
<tr><td></td><td valign="top"><a href="prolog-sequencing.html#index-foldalln"><code>foldalln</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="prolog-sequencing.html#prolog-sequencing">prolog sequencing</a></td></tr>
<tr><td></td><td valign="top"><a href="prolog-sequencing.html#index-foldof"><code>foldof</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="prolog-sequencing.html#prolog-sequencing">prolog sequencing</a></td></tr>
<tr><td></td><td valign="top"><a href="prolog-sequencing.html#index-foldofn"><code>foldofn</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="prolog-sequencing.html#prolog-sequencing">prolog sequencing</a></td></tr>
<tr><td></td><td valign="top"><a href="prolog-sequencing.html#index-foldofs"><code>foldofs</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="prolog-sequencing.html#prolog-sequencing">prolog sequencing</a></td></tr>
<tr><td></td><td valign="top"><a href="prolog-sequencing.html#index-foldofsn"><code>foldofsn</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="prolog-sequencing.html#prolog-sequencing">prolog sequencing</a></td></tr>
<tr><td></td><td valign="top"><a href="prolog-sequencing.html#index-foldstp"><code>foldstp</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="prolog-sequencing.html#prolog-sequencing">prolog sequencing</a></td></tr>
<tr><td></td><td valign="top"><a href="prolog-sequencing.html#index-foldstpn"><code>foldstpn</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="prolog-sequencing.html#prolog-sequencing">prolog sequencing</a></td></tr>
<tr><td></td><td valign="top"><a href="prolog-coroutines.html#index-freeze"><code>freeze</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="prolog-coroutines.html#prolog-coroutines">prolog coroutines</a></td></tr>
<tr><td></td><td valign="top"><a href="prolog-coroutines.html#index-freezeBig"><code>freezeBig</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="prolog-coroutines.html#prolog-coroutines">prolog coroutines</a></td></tr>
<tr><td></td><td valign="top"><a href="prolog-coroutines.html#index-freezeId"><code>freezeId</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="prolog-coroutines.html#prolog-coroutines">prolog coroutines</a></td></tr>
......@@ -415,6 +474,10 @@ Previous: <a href="persistance.html#persistance" accesskey="p" rel="prev">persis
<tr><td></td><td valign="top"><a href="kanren.html#index-intersect_002drelation"><code>intersect-relation</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="kanren.html#kanren">kanren</a></td></tr>
<tr><td colspan="4"> <hr></td></tr>
<tr><th><a name="Index_fn_letter-L">L</a></th><td></td><td></td></tr>
<tr><td></td><td valign="top"><a href="prolog-sequencing.html#index-lastall"><code>lastall</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="prolog-sequencing.html#prolog-sequencing">prolog sequencing</a></td></tr>
<tr><td></td><td valign="top"><a href="prolog-sequencing.html#index-lastalln"><code>lastalln</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="prolog-sequencing.html#prolog-sequencing">prolog sequencing</a></td></tr>
<tr><td></td><td valign="top"><a href="prolog-sequencing.html#index-lastof"><code>lastof</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="prolog-sequencing.html#prolog-sequencing">prolog sequencing</a></td></tr>
<tr><td></td><td valign="top"><a href="prolog-sequencing.html#index-laststpn"><code>laststpn</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="prolog-sequencing.html#prolog-sequencing">prolog sequencing</a></td></tr>
<tr><td></td><td valign="top"><a href="umatch.html#index-leave_002dlogical"><code>leave-logical</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="umatch.html#umatch">umatch</a></td></tr>
<tr><td></td><td valign="top"><a href="kanren.html#index-let_002dgls"><code>let-gls</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="kanren.html#kanren">kanren</a></td></tr>
<tr><td></td><td valign="top"><a href="kanren.html#index-let_002dlv"><code>let-lv</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="kanren.html#kanren">kanren</a></td></tr>
......@@ -431,8 +494,24 @@ Previous: <a href="persistance.html#persistance" accesskey="p" rel="prev">persis
<tr><td></td><td valign="top"><a href="persistance.html#index-make_002dpersister"><code>make-persister</code></a>:</td><td>&nbsp;</td><td valign="top"><a href="persistance.html#persistance">persistance</a></td></tr>