仅出于优雅和说教的原因,dif/2
在这里以及在绝大多数其他情况下显然是更可取的,因为正如您已经注意到的那样,否则“可能会发生许多不必要的统一”,而且还因为dif/2
是一个纯粹且良好的声明性谓词,可以在子句主体中的所有方向和任何位置使用,而不改变程序的含义,与(\==)/2
. dif/2
也是 SWI-Prolog 中的自动加载谓词,这意味着您需要not显式导入任何库以使用它,并且dif/2
像任何内置谓词一样可用。
如果你使用dif/2
您可以更轻松地推理您的代码。例如,在您的情况下,您从以下开始:
edge(A, B) :- node(A, _, X), node(B, X, _), dif(A, B).
然后,如你所知dif/2
是一个完全纯粹的谓词,你知道你也可以将其写为:
edge(A, B) :- dif(A, B), node(A, _, X), node(B, X, _).
此外,既然你知道dif/2
总是终止,你知道这个改变最多可以improve程序的终止属性。
像所有的约束一样,dif/2
是用来使用的。我强烈推荐它而不是不可交换的不纯谓词。
如果您担心性能,这里有一个小比较,只是比较dif/2
反对非声明性(\==)/2
在两个谓词可以互换使用的用例中:
?- N = 1_000_000, time((between(1,N,_),dif(a,b),false)).
% 11,000,005 inferences, 0.352 CPU in 0.353 seconds (100% CPU, 31281029 Lips)
?- N = 1_000_000, time((between(1,N,_),a\==b,false)).
%@ % 3,000,001 inferences, 0.107 CPU in 0.107 seconds (99% CPU, 28167437 Lips)
因此,使用时有时会带来性能优势(\==)/2
。然而,使用这样的低级谓词也有更严重的缺点:它更难理解、更容易出错、并且不是声明性的。
因此我建议简单地使用dif/2
来表达两个术语不同。