我面临的问题有点琐碎。
我想在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 = YX \= 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/2A safe approximation

10-06 07:02