2017-05-11 15 views
0

以下のルールは交差をチェックします。
アンサーセットプログラミングで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). 

ただし、対称ペアが生成されます。つまり、交差点(A、B)と交差点(B、A)があるかどうかを確認するのは明らかですが、チェックの1つは簡単です。私は地雷でそれを検出した。ここにgrounderの出力があります。

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

答えて

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). 
関連する問題