检查答案集编程中两个矩形之间的交集
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).
下面的规则检查交集。
:- 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).