下面的规则检查交叉点。
:- 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).