2017-05-11 3 views
0

아래 규칙은 교차점을 확인합니다.
응답 집합 프로그래밍에서 두 직사각형 간의 교차 검사

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

답변

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