以下规则检查交叉点。
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).
答案 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).