The constraints that ic_sets implements are the usual relations over sets. The membership (in/2, notin/2) and cardinality constraints (#/2) establish relationships between set variables and integer variables:
 ?X in ?Set
 The integer X is member of the integer set Set
 ?X notin ?Set
 The integer X is not a member of the integer set Set
 #(?Set, ?Card)
 Card is the cardinality of the integer set Set
? X ::[]..[1, 2, 3], 2 in X, 3 in X, #(X, 2). X = [2, 3] Yes (0.01s cpu) ? X :: []..[1, 2, 3, 4], 3 in X, 4 notin X. X = X{[3] \/ ([] .. [1, 2]) : _2161{1 .. 3}} Yes (0.00s cpu)
Possible constraints between two sets are equality, inclusion/subset and disjointness:
? X subset [1, 2, 3, 4]. X = X{([] .. [1, 2, 3, 4]) : _2139{0 .. 4}} Yes (0.00s cpu) ? X :: []..[1, 2, 3, 4], Y :: []..[3, 4, 5, 6], X subset Y. X = X{([] .. [3, 4]) : _2176{0 .. 2}} Y = Y{([] .. [3, 4, 5, 6]) : _2367{0 .. 4}} There are 4 delayed goals. Yes (0.00s cpu) ? X :: [2] .. [1, 2, 3, 4], Y :: [3] .. [1, 2, 3, 4], X disjoint Y. X = X{[2] \/ ([] .. [1, 4]) : _2118{1 .. 3}} Y = Y{[3] \/ ([] .. [1, 4]) : _2213{1 .. 3}} There are 2 delayed goals. Yes (0.00s cpu)
 ?Set1 sameset ?Set2
 The sets Set1 and Set2 are equal
 ?Set1 disjoint ?Set2
 The integer sets Set1 and Set2 are disjoint
 ?Set1 includes ?Set2
 Set1 includes (is a superset) of the integer set Set2
 ?Set1 subset ?Set2
 Set1 is a (nonstrict) subset of the integer set Set2
 intersection(?Set1, ?Set2, ?Set3)
 Set3 is the intersection of the integer sets Set1 and Set2
 union(?Set1, ?Set2, ?Set3)
 Set3 is the union of the integer sets Set1 and Set2
 difference(?Set1, ?Set2, ?Set3)
 Set3 is the difference of the integer sets Set1 and Set2
 symdiff(?Set1, ?Set2, ?Set3)
 Set3 is the symmetric difference of the integer sets Set1 and Set2
Possible constraints between three sets are for example intersection, union, difference and symmetric difference. For example:
? X :: [2, 3] .. [1, 2, 3, 4], Y :: [3, 4] .. [3, 4, 5, 6], ic_sets : intersection(X, Y, Z). X = X{[2, 3] \/ ([] .. [1, 4]) : _2127{2 .. 4}} Y = Y{[3, 4] \/ ([] .. [5, 6]) : _2222{2 .. 4}} Z = Z{[3] \/ ([] .. [4]) : _2302{[1, 2]}} There are 6 delayed goals. Yes (0.00s cpu)


Finally, there are a number of nary constraints that apply to lists of sets: disjointness, union and intersection. For example:
 all_disjoint(+Sets)
 Sets is a list of integers sets which are all disjoint
 all_union(+Sets, ?SetUnion)
 SetUnion is the union of all the sets in the list Sets
 all_intersection(+Sets, ?SetIntersection)
 SetIntersection is the intersection of all the sets in the list Sets
? intsets(Sets, 5, 1, 5), all_intersection(Sets, Common). Sets = [_2079{([] .. [1, 2, 3, 4, 5]) : _2055{0 .. 5}}, ... ] Common = Common{([] .. [1, 2, 3, 4, 5]) : _3083{0 .. 5}} There are 24 delayed goals. Yes (0.00s cpu)
In most positions where a set or set variable is expected one can also use a set expression. A set expression is composed from ground sets (integer lists), set variables, and the following set operators:
Set1 /\ Set2 % intersection Set1 \/ Set2 % union Set1 \ Set2 % difference
When such set expressions occur, they are translated into auxiliary intersection/3, union/3 and difference/3 constraints, respectively.