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

时间:2017-05-11 08:48:47

标签: answer-set-programming

以下规则检查交叉点。

private string GetVerification(string responseBody)
{
     var data = QueryHelpers.ParseQuery(queryString: responseBody);
     string firstValue = data[key: "<input name"];
     var cutedValue = firstValue.Remove(startIndex: 0, count: 50);
     var result = cutedValue.Split('"')[0];
     return result;
}

然而,它会生成对称对。也就是说,它检查交叉点(A,B)和交叉点(B,A),显然其中一个检查是微不足道的。我在地滚球中发现了它。这是地面输出。

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

1 个答案:

答案 0 :(得分: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).

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