我面临的问题,有点微不足道。我想在Prolog中使用logical not,但似乎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.我没有得到我想要的结果:
发布于 2011-12-16 01:01:31
您需要编写\+ X = Y或X \= Y来代替not(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不是否定,而是意味着在这一点上是不可证明的。
dif/2的A safe approximation在ISO Prolog中也是可能的。
发布于 2011-12-16 01:00:38
在SWI-Prolog和GNU Prolog中,都应该可以执行以下操作:
have(X, Y) :- course(X), course(Y), X \= Y.在SWI-Prolog中,您还可以使用dif/2,这会更方便,因为您可以在谓词中更早地使用它:
have(X, Y) :- dif(X, Y), course(X), course(Y).发布于 2014-03-18 05:37:06
作为上述用户"false“回答的附加项,即
“您需要写+X= Y来代替not(X = Y),”
这可能会给人留下这样的印象:
a. "not“和"+”是不同的东西
b. +将起作用,而not将不起作用。
我的理解是"not“和"+”是等价的,但在现代Prolog程序中,+是首选的,因为它传达了一种更直观的感觉。具体地说,对于粗心大意的程序员来说," not“可能暗示”不是真的“,而"+”则暗示“不可证明”,这更接近于该操作真正所说的真相。在Prolog中,"not“是”否定为失败“的一个例子,但人们认为+将使程序员更清楚地知道在任何给定的规则中确切地断言了什么。因此,您可以使用"not“(大多数PL实现保留它是为了向后兼容),但要成为一名惯用的现代PL程序员,您可能更喜欢使用+。
https://stackoverflow.com/questions/8523608
复制相似问题