Prolog X\=Y和dif(X,Y)之间的差异

Prolog X\=Y和dif(X,Y)之间的差异,prolog,prolog-dif,Prolog,Prolog Dif,这两者之间的区别是什么: X \= Y 这段代码: dif(X, Y) 我认为他们应该表现得一样,但他们没有。下面是一个例子: n_puta(L, N, X) :- nputa(L, N, 0, X). nputa([], N, C, _) :- N = C. nputa([G|R], N, C, X) :- G = X, nputa(R, N, Y, X), C is Y - 1. nputa([G|R], N, C, X) :- dif(G,X), nputa(R, N, C, X).

这两者之间的区别是什么:

X \= Y
这段代码:

dif(X, Y)
我认为他们应该表现得一样,但他们没有。下面是一个例子:

n_puta(L, N, X) :- nputa(L, N, 0, X).
nputa([], N, C, _) :- N = C.
nputa([G|R], N, C, X) :- G = X, nputa(R, N, Y, X), C is Y - 1.
nputa([G|R], N, C, X) :- dif(G,X), nputa(R, N, C, X).
以下是一些电话:

?- n_puta([a,a,b,b,b], 2, X).
X = a ;
false.

?- n_puta([a,a,b,a,b,b], 3, X).
X = a ;
X = b ;
false.
X应该是列表L中正好出现N次的原子。如果我用
G\=X
替换dif(G,X),我就不会得到预期的结果。有人能告诉我这两个操作员的区别吗?除了dif(G,X),我还能用别的东西吗


这个例子在SWI Prolog中非常有效,但在Amzi中不起作用!序言。

dif/2
(\=)/2
只要它们的参数是基础的,它们是相同的。但是只有
dif/2
是一个纯关系,它也可以正确地处理变量,并且可以在所有方向上使用。您的示例清楚地表明,在这种情况下,您应该使用
dif/2
,因为您不仅使用谓词进行测试,而且还生成解决方案。最广泛使用的Prolog系统都提供了
dif/2

我有一个类似的问题,得到了很多有用的答案: