there's no particular reason why this predicate isn't (?, ?) - (-, +) would be useful for getting the subsets. The (+, -) mode isn't that useful but why not.
|Did you know ...||Search Documentation:|
:- use_module(library(lists)).(can be autoloaded)
|. 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].