我面临的问题有点琐碎。
我想在Prolog中不使用逻辑,但是not/1
似乎不是我想要的东西:
course(ai).
course(pl).
course(os).
have(X,Y) :- course(X),course(Y),not(X = Y).
我查询:
have(X,Y), write(X-Y), nl , fail.
而且我没有得到想要的结果:(
最佳答案
代替not(X = Y)
,您需要编写\+ X = Y
或X \= Y
。但是请考虑使用dif(X,Y)
代替。 dif/2
存在于B,SWI,YAP,SICStus中。要查看区别:
?- X = b, dif(a, X).
X = b.
?- X = b, \+ a = X.
X = b.
所以到目前为止,一切似乎还不错。但是,如果我们只是
交换两个目标的顺序?
?- \+ a = X, X = b.
false.
?- dif(a, X), X = b.
X = b.
(\+)/1
现在给我们一个不同的结果,因为有一个答案对于
a = X
,目标\+ a = X
将失败。因此,
(\+)/1
并非取反,但表示此时无法证明及时。
在ISO Prolog中也可以使用
dif/2
的A safe approximation。