2013-04-25 51 views
0
% check if 2 squares colide by sides 
col(X, Y, S, X2, Y2, S2):- 
    EndX is X + S, EndY is Y + S, 
    EndX2 is X2 + S2, EndY2 is Y2 + S2, 
    (
    (EndX =:= X2, ((Y >= Y2, Y =< EndY2);(EndY >= Y2, EndY =< EndY2))); % left-l side 
    (X =:= X2, ((Y >= Y2, Y =< EndY2);(EndY >= Y2, EndY =< EndY2))); % left-r side 
    (EndX =:= EndX2, ((Y >= Y2, Y =< EndY2);(EndY >= Y2, EndY =< EndY2))); % right-l side 
    (X =:= EndX2, ((Y >= Y2, Y =< EndY2);(EndY >= Y2, EndY =< EndY2))); % right-r side  
    (EndY =:= Y2, ((X >= X2, X =< EndX2);(EndX >= X2, EndX =< EndX2))); % top-t side 
    (Y =:= Y2, ((X >= X2, X =< EndX2);(EndX >= X2, EndX =< EndX2))); % top-b side 
    (EndY =:= EndY2, ((X >= X2, X =< EndX2);(EndX >= X2, EndX =< EndX2))); % bottom-t side 
    (Y =:= EndY2, ((X >= X2, X =< EndX2);(EndX >= X2, EndX =< EndX2))) % bottom-b side 
    ). 

它的工作好,只有当我设置的所有变量,但我想问问如何改变它,所以我可以使用: col(0,0,3,1,2,S).甚至col(0, 0, 3, X,Y, S). 它甚至有可能?Prolog的发现变量

回答

1

我想你可以尝试library(clpqr)

:- [library(clpr)]. 

col(X, Y, S, X2, Y2, S2):- { 
    EndX = X + S, EndY = Y + S, 
    EndX2 = X2 + S2, EndY2 = Y2 + S2, 
    (
    (EndX = X2, ((Y >= Y2, Y =< EndY2);(EndY >= Y2, EndY =< EndY2))); % left-l side 
    (X = X2, ((Y >= Y2, Y =< EndY2);(EndY >= Y2, EndY =< EndY2))); % left-r side 
    (EndX = EndX2, ((Y >= Y2, Y =< EndY2);(EndY >= Y2, EndY =< EndY2))); % right-l side 
    (X = EndX2, ((Y >= Y2, Y =< EndY2);(EndY >= Y2, EndY =< EndY2))); % right-r side 
    (EndY = Y2, ((X >= X2, X =< EndX2);(EndX >= X2, EndX =< EndX2))); % top-t side 
    (Y = Y2, ((X >= X2, X =< EndX2);(EndX >= X2, EndX =< EndX2))); % top-b side 
    (EndY = EndY2, ((X >= X2, X =< EndX2);(EndX >= X2, EndX =< EndX2))); % bottom-t side 
    (Y = EndY2, ((X >= X2, X =< EndX2);(EndX >= X2, EndX =< EndX2))) % bottom-b side 
    ) 
       }. 

测试:

?- col(0,0,3,1,2,S). 
S = 2.0 ; 
false. 

有更多的变量之后,剩下的范围来处理:

?- col(0, 0, 3, X,Y, S). 
X = 3.0, 
{Y=< -0.0, _G6533>=0.0, S= -Y+_G6533, _G6550=3.0-Y+_G6533} ; 
X = 3.0, 
{Y=<3.0, _G8171>=3.0, S= -Y+_G8171, _G8188=3.0-Y+_G8171} ; 
X = 0.0, 
{Y=< -0.0, _G10154>=0.0, S= -Y+_G10154, _G10171= -Y+_G10154} . 
...