Author: Tom Schrijvers, K.U.Leuven
The bounds solver is a rather simple integer constraint solver,
implemented with attributed variables. Its syntax is a subset of the
SICStus clp(FD) syntax. Please note that the library(clp/bounds)
library is not an
autoload library and therefore this library must be loaded
explicitely before using it using:
:- use_module(library('clp/bounds')).
|
Here Expr can be one of
In addition, instead of being a reifyable constraint, either P or Q can be a boolean variable that is the truth value of the corresponding constraint.
The following constraints are reifyable: #=/2, #\=/2, #</2, #>/2, #=</2, #>/2.
For example, to count the number of occurrences of a particular value in a list of constraint variables:
occurrences(List,Value,Count) :-
occurrences(List,Value,0,Count).
occurrences([],_,Count,Count).
occurrences([X|Xs],Value,Acc,Count) :-
X #= Value #=> NAcc #= Acc + 1,
X #\= Value #=> NAcc #= Acc,
occurrences(Xs,Value,NAcc,Count).
|
occurrences(List,Value,Count) :-
occurrences(List,Value,0,Count).
occurrences([],_,Count,Count).
occurrences([X|Xs],Value,Acc,Count) :-
X #= Value #=> B,
NAcc #= Acc + B,
occurrences(Xs,Value,NAcc,Count).
|
:- use_module(library('clp/bounds')).
send([[S,E,N,D], [M,O,R,E], [M,O,N,E,Y]]) :-
Digits = [S,E,N,D,M,O,R,Y],
Carries = [C1,C2,C3,C4],
Digits in 0..9,
Carries in 0..1,
M #= C4,
O + 10 * C4 #= M + S + C3,
N + 10 * C3 #= O + E + C2,
E + 10 * C2 #= R + N + C1,
Y + 10 * C1 #= E + D,
M #>= 1,
S #>= 1,
all_different(Digits),
label(Digits).
|