nb_set.pl -- Non-backtrackable sets
This library provides a non-backtrackabe set of terms that are variants of each other. It is primarily intended to implement distinct/1 from library(solution_sequences). The set is implemented as a hash table that is built using non-backtrackable primitives, notably nb_setarg/3.
The original version of this library used binary trees which provides immediate ordering. As the trees were not balanced, performance could get really poor. The complexity of balancing trees using non-backtrackable primitives is too high.
- empty_nb_set(-Set)
- Create an empty non-backtrackable set.
- add_nb_set(+Key, !Set) is det
- add_nb_set(+Key, !Set, ?New) is semidet
- add_nb_set(+Key, !Set, ?New) is semidet
- Insert Key into the set. If a variant (see =@=/2) of Key is
already in the set, the set is unchanged and New is unified with
false
. Otherwise, New is unified withtrue
and a copy of Key is added to the set. - hash_key(+Term, +BucketCount, -Key) is det[private]
- Compute a hash for Term. Note that variant_hash/2 currently does not handle cyclic terms, so use term_factorized/3 to get rid of the cycles. This means that this library is rather slow when cyclic terms are involved.
- nb_set_to_list(+Set, -List)
- Get the elements of a an nb_set. List is sorted to the standard order of terms.
- gen_nb_set(+Set, -Key)
- Enumerate the members of a set in the standard order of terms.
- size_nb_set(+Set, -Size)
- Unify Size with the number of elements in the set
- add_nb_set(+Key, !Set) is det
- add_nb_set(+Key, !Set, ?New) is semidet
- add_nb_set(+Key, !Set, ?New) is semidet
- Insert Key into the set. If a variant (see =@=/2) of Key is
already in the set, the set is unchanged and New is unified with
false
. Otherwise, New is unified withtrue
and a copy of Key is added to the set.