Next: CHR Guidelines, Previous: CHR Debugging, Up: lib-chr [Contents][Index]

Here are two example constraint solvers written in CHR.

- The program below defines a solver with one constraint,
`leq/2`

, which is a less-than-or-equal constraint, also known as a partial order constraint.:- module(leq,[leq/2]). :- use_module(library(chr)). :- chr_constraint leq/2. reflexivity @ leq(X,X) <=> true. antisymmetry @ leq(X,Y), leq(Y,X) <=> X = Y. idempotence @ leq(X,Y) \ leq(X,Y) <=> true. transitivity @ leq(X,Y), leq(Y,Z) ==> leq(X,Z).

When the above program is loaded, you can call the

`leq/2`

constraint in a query, e.g.:| ?-

`leq(X,Y), leq(Y,Z).`leq(X,Y), leq(X,Z), leq(Y,Z) ? - The program below implements a simple finite domain
constraint solver.
:- module(dom,[dom/2]). :- use_module(library(chr)). :- use_module(library(sets), [intersection/3]). :- chr_constraint dom(?int,+list(int)). :- chr_type list(T) ---> [] ; [T|list(T)]. dom(X,[]) <=> fail. dom(X,[Y]) <=> X = Y. dom(X,L) <=> nonvar(X) | memberchk(X,L). dom(X,L1), dom(X,L2) <=> intersection(L1,L2,L3), dom(X,L3).

When the above program is loaded, you can call the

`dom/2`

constraint in a query, e.g.:| ?-

`dom(A,[1,2,3]), dom(A,[3,4,5]).`A = 3

Finally, Martin Keser’s WebCHR package at http://chr.informatik.uni-ulm.de/~webchr/ contains more than 40 example programs for SICStus 4, complete with documentation and example queries.

Send feedback on this subject.