0

下面的规则检查交叉点。

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

但是它会生成对称对。也就是说,它检查交叉点(A,B)和交叉点(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).
4

1 回答 1

2

检查<而不是不等式应该防止对称约束:

{ 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).
于 2017-05-12T04:36:39.957 回答