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