检查答案集编程中两个矩形之间的交集

Checking intersection between two rectangles in answer set programming

下面的规则检查交集。

:- 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).

但是它生成对称对。也就是说,它检查 intersection(A,B) 和 intersection(B,A) 显然其中一项检查是微不足道的。我在接地器中检测到它。这是接地输出。

:-areaCoords(1,1,1,1),areaCoords(1,1,2,2).
:-areaCoords(1,1,2,2),areaCoords(1,1,1,1).

如何防止对称案例的发生?
如果问题出在其他地方,我提供了生成这些规则的完整源代码。

编辑:我认为以前的版本(完整源代码)对于其他人来说是非常复杂的,很难得出结论。所以我简化了它。此代码导致上述问题。

{ 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(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).

观察:

$ 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).

对比

$ 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).