Merge branch 'master' of /home/pl/chr
[chr.git] / Examples / chrdif.chr
blobd185fd750c97514962bba9fdb5f55beadec4f40d
1 /*  $Id$
3     Part of CHR (Constraint Handling Rules)
5     Author:        Tom Schrijvers
6     E-mail:        Tom.Schrijvers@cs.kuleuven.ac.be
7     WWW:           http://www.swi-prolog.org
8     Copyright (C): 2003-2004, K.U. Leuven
12 :- module(chrdif,[chrdif/2]).
13 :- use_module(library(chr)).
15 :- constraints dif/2, dif2/3, or/2, or_seq/2, del_or/1.
17 chrdif(X,Y) :- dif(X,Y).
19 dif(X,Y) <=> compound(X), compound(Y) | dif1(X,Y).
20 dif(X,X) <=> fail.
21 dif(X,Y) <=> nonvar(X), nonvar(Y) /* X \== Y holds */ | true.
23 dif1(X,Y) :-
24         ( functor(X,F,A),
25           functor(Y,F,A) ->
26                 X =.. [_|XL],
27                 Y =.. [_|YL],
28                 dif1l(XL,YL,A)
29         ;
30                 true
31         ).
33 dif1l(Xs,Ys,N) :-
34         or(Or,N),
35         dif1l_2(Xs,Ys,Or).
37 dif1l_2([],[],_).
38 dif1l_2([X|Xs],[Y|Ys],Or) :-
39         dif2(X,Y,Or),
40         dif1l_2(Xs,Ys,Or).
42 or_seq(OrP,Or) \ or(Or,0), or(OrP,N) <=> M is N - 1, or_seq(OrP,M).
43 or(_,0) <=> fail.
45 dif2(X,Y,Or) <=> compound(X), compound(Y) | dif3(X,Y,Or).
46 dif2(X,X,Or), or(Or,N) <=> M is N - 1, or(Or,M).
47 dif2(X,Y,Or) <=> nonvar(X), nonvar(Y) /* X \== Y holds */ | del_or(Or).
49 del_or(Or) \ or_seq(OrP,Or) <=> del_or(OrP).
50 del_or(Or) \ or_seq(Or,OrC) <=> del_or(OrC).
51 del_or(Or) \ or(Or,_) <=> true.
52 del_or(Or) \ dif2(_,_,Or) <=> true.
53 del_or(Or) <=> true.
55 dif3(X,Y,Or) :-
56         ( functor(X,F,A),
57           functor(Y,F,A) ->
58                 X =.. [_|XL],
59                 Y =.. [_|YL],
60                 or_seq(Or,Or2),
61                 dif1l(XL,YL,A)
62         ;
63                 del_or(Or)
64         ).