7.8 | Symbolic constraints

7.8.1 | `fd_all_different/1`

Templates

  `fd_all_different(+fd_variable_list)`

Description
`fd_all_different(List)` constrains all variables in `List` to take distinct values. This is equivalent to posting an inequality constraint for each pair of variables. This constraint is triggered when a variable becomes ground, removing its value from the domain of the other variables.
Errors

`List` is a partial list |  | `instantiation_error`
`List` is neither a partial list nor a list |  | `type_error(list, List)`
an element `E` of the `List` list is neither a variable nor an integer nor an FD variable |  | `type_error(fd_variable, E)`

Portability
GNU Prolog predicate.

7.8.2 | `fd_element/3`

Templates

  `fd_element(?fd_variable, +integer_list, ?fd_variable)`

Description
`fd_element(I, List, X)` constraints `X` to be equal to the `I` th integer (from 1) of `List`.
Errors

`I` is neither a variable nor an FD variable nor an integer |  | `type_error(fd_variable, I)`
`X` is neither a variable nor an FD variable nor an integer |  | `type_error(fd_variable, X)`
`List` is a partial list or a list with an element `E` which is a variable |  | `instantiation_error`
`List` is neither a partial list nor a list |  | `type_error(list, List)`
an element `E` of the `List` list is neither a variable nor an integer |  | `type_error(integer, E)`

Portability
GNU Prolog predicate.

7.8.3 | `fd_element_var/3`

Templates

  `fd_element_var(?fd_variable, +fd_variable_list, ?fd_variable)`

Description
`fd_element_var(I, List, X)` constraints `X` to be equal to the `I` th variable (from 1) of `List`. This constraint is similar to `fd_element/3` (section 7.8.2) but `List` can also contain FD variables (rather than just integers).
Errors

`I` is neither a variable nor an FD variable nor an integer |  | `type_error(fd_variable, I)`
`X` is neither a variable nor an FD variable nor an integer |  | `type_error(fd_variable, X)`
`List` is a partial list |  | `instantiation_error`
`List` is neither a partial list nor a list |  | `type_error(list, List)`
an element `E` of the `List` list is neither a variable nor an integer nor an FD variable |  | `type_error(fd_variable, E)`

Portability
GNU Prolog predicate.

7.8.4 | `fd_atmost/3`, `fd_atleast/3`, `fd_exactly/3`

Templates

  `fd_atmost(+integer, +fd_variable_list, +integer)
  fd_atleast(+integer, +fd_variable_list, +integer)
  fd_exactly(+integer, +fd_variable_list, +integer)`

Description
`fd_atmost(N, List, V)` posts the constraint that at most `N` variables of `List` are equal to the value `V`.
`fd_atleast(N, List, V)` posts the constraint that at least `N` variables of `List` are equal to the value `V`.
`fd_exactly(N, List, V)` posts the constraint that at exactly `N` variables of `List` are equal to the value `V`.
These constraints are special cases of `fd_cardinality/2` (section 7.7.3) but their implementation is more efficient.
Errors

`N` is a variable |  | `instantiation_error`
`N` is neither a variable nor an integer |  | `type_error(integer, N)`
`V` is a variable |  | `instantiation_error`
`V` is neither a variable nor an integer |  | `type_error(integer, V)`
`List` is a partial list |  | `instantiation_error`
`List` is neither a partial list nor a list |  | `type_error(list, List)`
an element `E` of the `List` list is neither a variable nor an FD variable nor an integer |  | `type_error(fd_variable, E)`

Portability
GNU Prolog predicates.

7.8.5 | `fd_relation/2`, `fd_relationc/2`

Templates

  `fd_relation(+integer_list_list, ?fd_variable_list)
  fd_relationc(+integer_list_list, ?fd_variable_list)`

Description
`fd_relation(Relation, Vars)` constraints the tuple of variables `Vars` to be equal to one tuple of the list `Relation`. A tuple is represented by a list.
Example: definition of the boolean AND relation so that X AND Y Û Z:

      and(X,Y,Z):-
              fd_relation([[0,0,0],[0,1,0],[1,0,0],[1,1,1]], [X,Y,Z]).

`fd_relationc(Columns, Vars)` is similar to `fd_relation/2` except that the relation is not given as the list of tuples but as the list of the columns of the relation. A column is represented by a list.
Example:

      and(X,Y,Z):-
              fd_relationc([[0,0,1,1],[0,1,0,1],[0,0,0,1]], [X,Y,Z]).

Errors

`Relation` is a partial list or a list with a sub-term `E` which is a variable |  | `instantiation_error`
`Relation` is neither a partial list nor a list |  | `type_error(list, Relation)`
an element `E` of the `Relation` list is neither a variable nor an integer |  | `type_error(integer, E)`
`Vars` is a partial list |  | `instantiation_error`
`Vars` is neither a partial list nor a list |  | `type_error(list, Vars)`
an element `E` of the `Vars` list is neither a variable nor an integer nor an FD variable |  | `type_error(fd_variable, E)`

Portability
GNU Prolog predicates.

Copyright (C) 1999,2000 Daniel Diaz
Verbatim copying and distribution of this entire article is permitted in any medium, provided this notice is preserved.
More about the copyright