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 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).

**empty_nb_set**(`?Set`)-
True if
`Set`is a non-backtrackable emoty 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, bindin `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. and*ordered list*).