The library library(nb_set) defines non-backtrackable
sets, implemented as binary trees. The sets are represented as
compound terms and manipulated using nb_setarg/3.
Non-backtrackable manipulation of data structures is not supported by a
large number of Prolog implementations, but it has several advantages
over using the database. It produces less garbage, is thread-safe,
reentrant and deals with exceptions without leaking data.
Similar to the library(assoc) library, keys can be any
Prolog term, but it is not allowed to instantiate or modify a term.
One of the ways to use this library is to generate unique values on
backtracking without generating all solutions first,
for example to act as a filter between a generator producing many
duplicates and an expensive test routine, as outlined below:
generate_and_test(Solution) :-
empty_nb_set(Set),
generate(Solution),
add_nb_set(Solution, Set, true),
test(Solution).
- empty_nb_set(?Set)
- True if Set is a non-backtrackable empty set.
- add_nb_set(+Key,
!Set)
- Add Key to Set. If Key is already a
member of
Set, add_nb_set/3
succeeds without modifying Set.
- add_nb_set(+Key,
!Set, ?New)
- If Key is not in Set and New is unified
to
true, Key is added to Set. If Key
is in Set, New is unified to false.
It can be used for many purposes:
add_nb_set(+, +, false) | Test membership |
add_nb_set(+, +, true) | Succeed only if new
member |
add_nb_set(+, +, Var) | Succeed, binding Var |
- gen_nb_set(+Set,
-Key)
- Generate all members of Set on backtracking in the standard
order of terms. To test membership, use add_nb_set/3.
- size_nb_set(+Set,
-Size)
- Unify Size with the number of elements in Set.
- nb_set_to_list(+Set,
-List)
- Unify List with a list of all elements in Set in
the standard order of terms (i.e., an ordered list).