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

时间:2013-05-15 08:19:51

标签: 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).

以下是一些电话:

?- 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次的原子。如果我用dif(G, X)替换G \= X,我得不到预期的结果。有人能告诉我这两个运营商之间的区别是什么?我可以使用除dif(G, X)以外的任何其他内容吗?

此示例在SWI-Prolog中完美运行,但在Amzi中不起作用!序言

1 个答案:

答案 0 :(得分:3)

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