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 datastructures is not supported by a
large number of Prolog implementation, but it 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 outlines below.
generate_and_test(Solution) :- empty_nb_set(Set), generate(Solution), add_nb_set(Solution, Set, true), test(Solution).
trueKey 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, bindin Var|