[ library(cardinal) | Reference Manual | Alphabetic Index ]
# complement(?SetVar, ++Universe, ?Complement)

Set complement constraint
*SetVar*
- A variable.
*Universe*
- A ground set.
*Complement*
- A variable

## Description

Constrain sets so that Complement is the complement set of SetVar,
with respect to the given Universe. I.e. Complement is Universe \ SetVar.
If a variable (SetVar or Complement) is not yet a set domain variable,
it is declared as such, limited by the Universe.

This constraint is usually more efficient (stronger) than posting an
equivalent set difference constraint, due to specific inferences.

### Fail Conditions

Fails if Complement can not be the set complement of SetVar in set universe Universe.
### Resatisfiable

No.
## Examples

?- complement([7,8], [1,7,8,9], N).
N = [1,9]
?- complement(N, [1,7,8,9], [7,8]).
N = [1,9]
?- X `:: [a]+[b,c,d], Y `:: []+[a,b,c,d,e,f], complement(X, [a,b,c,d,e,f,g], Y).
no
?- X `:: [a]+[b,c,d], Y `:: []+[a,b,c,d,e,f], complement(X,[a,b,f],Y), domain(X,DX),domain(Y,DY).
DX = [[a]:1,[b]:2], DY = [[f]:1,[b]:2]
?- X `:: [a]+[b,c,d], Y `:: []+[a,b,c,d,e,f], complement(X, [a,b,c,d,e,f], Y), domain(Y,DY).
DY = [[e,f]:2,[b,c,d]:5]

## See Also

complement / 2, `$ / 2, `= / 2