The rule below checks for intersection.
:- areaCoords(X1,Y1,X2,Y2), areaCoords(XA,YA,XB,YB), XA >= X1, X2 >= XA, YB >= Y1, Y2 >= YA, (X1,Y1,X2,Y2) != (XA,YA,XB,YB).
However it generates symmetric pairs. That is, it checks for intersection(A,B) and intersection(B,A) obviously one of the checks is trivial. I detected it in the grounder. Here is the grounder output.
:-areaCoords(1,1,1,1),areaCoords(1,1,2,2).
:-areaCoords(1,1,2,2),areaCoords(1,1,1,1).
How can I prevent symmetric cases to occure?
In case the problem is somewhere else, I provide the full source that generates these rules.
Edit: I thought the previous version (full source) was very complicated for others to come to a conclution. So I simplified it. This code causes the above problem.
{ areaCoords(1,1,1,1); areaCoords(1,1,2,2) }.
:- areaCoords(X1,Y1,X2,Y2), areaCoords(XA,YA,XB,YB), XA >= X1, X2 >= XA, YB >= Y1, Y2 >= YA, (X1,Y1,X2,Y2) != (XA,YA,XB,YB).
Checking for <
instead of inequality should prevent the symmetric constraint:
{ areaCoords(1,1,1,1); areaCoords(1,1,2,2) }.
:- areaCoords(X1,Y1,X2,Y2), areaCoords(XA,YA,XB,YB),
XA >= X1, X2 >= XA, YB >= Y1, Y2 >= YA,
(X1,Y1,X2,Y2) < (XA,YA,XB,YB).
Observe:
$ gringo --text <<<'{ areaCoords(1,1,1,1); areaCoords(1,1,2,2) }. :- areaCoords(X1,Y1,X2,Y2), areaCoords(XA,YA,XB,YB), XA >= X1, X2 >= XA, YB >= Y1, Y2 >= YA, (X1,Y1,X2,Y2) < (XA,YA,XB,YB).'
{areaCoords(1,1,1,1);areaCoords(1,1,2,2)}.
:-areaCoords(1,1,2,2),areaCoords(1,1,1,1).
vs.
$ gringo --text <<<'{ areaCoords(1,1,1,1); areaCoords(1,1,2,2) }. :- areaCoords(X1,Y1,X2,Y2), areaCoords(XA,YA,XB,YB), XA >= X1, X2 >= XA, YB >= Y1, Y2 >= YA, (X1,Y1,X2,Y2) != (XA,YA,XB,YB).'
{areaCoords(1,1,1,1);areaCoords(1,1,2,2)}.
:-areaCoords(1,1,1,1),areaCoords(1,1,2,2).
:-areaCoords(1,1,2,2),areaCoords(1,1,1,1).