Here are two example constraint solvers written in CHR.
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) ?
:- 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.