 
 
 
10.4  Constraints
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 
 | 
	 
	
Figure 10.2: Membership and Cardinality Constraints
	
?- 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)
	
	
	
Figure 10.3: Basic Set Relations
	
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)
| 
⊗ Note that we needed to qualify the intersection/3 constraint with
the ic_sets module prefix because of a name conflict with a predicate from
the lists library of the same name.
 | 
| 
⊗ Note the lack of a complement constraint: this is because the complement
of a finite set is infinite and cannot be represented. Complements can be
modelled using an explicit universal set and a difference constraint.
 | 
Finally, there are a number of n-ary constraints that apply to lists of sets:
disjointness, union and intersection. For example:
	
	
	
Figure 10.4: N-ary Set Relations
	
?- 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.
 
 
