以下是您可以使用 SWI-Prolog 和 CHR 做什么的示例:
:- use_module(library(chr)).
:- op(700,xfx,before).
:- chr_constraint before/2, t/2, clean/0.
% X before Y means variable X is less-or-equal to variable Y
%
transitivity @ X before Y, Y before Z ==> X \= Y, Y \= Z | X before Z.
idempotence @ X before Y \ X before Y <=> true.
irreflexivity @ t(N,_) before t(M, _), t(M,_) before t(N, _) <=> fail.
generation @ t(N,X) before t(M, M1) ==> member(X, [1,2]),
member(Y, [1,2]),
X \= Y,
M \= N | t(N,Y) before t(M, M1).
generation @ t(N,N1) before t(M, X) ==> member(X, [1,2]),
member(Y, [1,2]),
X \= Y,
M \= N | t(N,N1) before t(M, Y).
% if task N is before task M keep only relevant before
clean_1 @ t(N,N1) before t(M,M1) \ t(N,N2) before t(M,M2) <=> N2 < N1, M1 =< M2 | true.
clean_1 @ t(N,N1) before t(M,M1) \ t(N,N2) before t(M,M2) <=> N2 =< N1, M1 < M2 | true.
%if task N is before task M, suppress unnecessary t(N, _) before t(N,_)
clean_2 @ t(N, _) before t(M,_)\ t(N, _) before t(N, _) <=> N \= M | true.
% if task N is before task M suppress unnecessary t(M, _) before t(M,_)
clean_3 @ t(N, _) before t(M,_)\ t(M, _) before t(M, _) <=> N \= M | true.
% if tasks are chained, suppress unnecessary t(First,_) before t(Last,_)
clean_4 @ t(N,_) before t(M,_), t(M,_) before t(P,_) \ t(N,_) before t(P,_) <=> N \= M, N \= P, M \= P
| true.
% when program is finished clear the set of constraints
clean @ clean \ _ before _ <=> true.
clean @ true \ clean <=> true.
go :-
% ta1 < ta2
t(1,1) before t(1,2),
% tb1 < tb2
t(2,1) before t(2,2),
% ta1 < tb1
t(1,1) before t(2,1),
% ta1 < tb2
t(1,1) before t(2,2),
% ta2 <= tb1
t(1,2) before t(2,1),
% ta2 < tb2
t(1,2) before t(2,2),
setof(X before Y, find_chr_constraint(X before Y) , Lt),
writeln(Lt),
clean.
你得到:
?- go.
[t(1,2)before t(2,1)]
true ;
false.