Beware of duplicate entries in the input arguments:
?- union([a,b,a], [b,a,b], U). U = [b, a, b].
Did you know ... | Search Documentation: |
Predicate union/3 |
|
Set1|
*|
Set2|
.
A set is defined to be an unordered list without duplicates.
Elements are considered duplicates if they can be unified.
The library(lists) contains a number of old predicates for manipulating sets represented as unordered lists, notably intersection/3, union/3, subset/2 and subtract/3. These predicates all use memberchk/2 to find equivalent elements. As a result these are not logical while unification can easily lead to dubious results. Operating on unordered sets these predicates typically have complexity |Set1|*|Set2|.
When using these predicates
?- intersection([a,b,c], [b,e], X). X = [b]. ?- union([a,b,c], [b,e], X). X = [a, c, b, e]. ?- subset([a,b,c], [b,e]). false. ?- subset([b], [b,e]). true. ?- subtract([a,b,c], [b,e], X). X = [a, c].
?- intersection([a,b,c], [b,E], X). E = a, X = [a, b]. ?- subtract([a,b,c], [b,E], X). E = a, X = [c].
Insufficient instantiation also leads to problems
?- subtract([a,b,c], X, [c]). false.
Note that duplicates in the input may result in duplicates in the output (example by Boris).
?- intersection([a,b,a], [b,a,b], I). I = [a, b, a].