使用';不是';Eclipse Prolog中的运算符

使用';不是';Eclipse Prolog中的运算符,prolog,operators,Prolog,Operators,我有一个规则来计算两点之间的距离 distance(X1,Y1,X2,Y2,D) :- at(Car1,X1,Y1), at(Car2,X2,Y2), not(X1=X2),not(Y1=Y2), D is sqrt((X2 - X1)*(X2 - X1) + (Y2 - Y1)*(Y2 - Y1)). 这个很好用。操作不能完全按照预期工作。但后来我有了这个规则 canTurnLeft(Car,X,Y) :- at(Car,X,Y), light(green,X,Y), not(distanc

我有一个规则来计算两点之间的距离

distance(X1,Y1,X2,Y2,D) :- at(Car1,X1,Y1), at(Car2,X2,Y2), not(X1=X2),not(Y1=Y2), D is sqrt((X2 - X1)*(X2 - X1) + (Y2 - Y1)*(Y2 - Y1)).
这个很好用。操作不能完全按照预期工作。但后来我有了这个规则

canTurnLeft(Car,X,Y) :- at(Car,X,Y), light(green,X,Y), not(distance(X,Y,A,B,D), D < 80, oppDir(X,Y,A,B)).
canturnlight(Car,X,Y):-at(Car,X,Y),light(绿色,X,Y),not(距离(X,Y,A,B,D),D<80,oppDir(X,Y,A,B))。
它会说“调用一个未定义的过程不是(…)

不能在多个and上使用not运算符吗?如果没有,如果在80个单位内有任何车辆朝相反方向行驶,我如何返回false


Prolog是新手,因此任何帮助都是非常感谢的。谢谢

不是/1
接受一个参数。但是在你的第二个例子中有三个论点。尝试将三个参数括在括号中:

canTurnLeft(Car,X,Y) :- 
        at(Car,X,Y), 
        light(green,X,Y), 
        not((distance(X,Y,A,B,D), D < 80, oppDir(X,Y,A,B))).

not/1
已弃用。改用标准的
\+/1
运算符/内置控件结构。@hakank给出的建议同样适用。@hakank:当问题有效地应用于任何序言时,请删除特定于实现的标记。这里使用
(\+)/1
X = 3, not((X = 2, X = 4)).