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