序言并不完全一样



嗨,我是prolog的新手,我想知道如何在prolog中逻辑地表达"不一样"。

例如,如果我有一个函数valid(A, B, C, D),它以数字为输入,并要求a、B、C、D不完全相同,我该如何声明?

我试过valid(A, B, C, D) :- not(A == B == C == D).它似乎不起作用。

==/2是一个二进制谓词'=='(X,Y),它的成功或失败取决于XY是否绑定到相同的值。因此,您不能像A == B == C那样"级联"它们,因为这将是一个语法错误。

你能做的是单独配对。这将是一个足够的测试,可以判断ABCD中的任何一个是否不同(,它们"不完全相同"(:

valid(A, B, C, D) :-
    + (A == B, A == C, A == D).

你可以将其概括为一个数字列表,[a,B,C,…]:

valid([X|T]) :- + maplist(==(X), T).

获得:

| ?- valid([a,a,a,a]).
no
| ?- valid([a,a,a,b]).
yes

更新:

看看问题"不同/2-是否存在纯粹的、确定的定义?":

多个答案(像这个(设法将效率和逻辑纯度结合起来,这使得我在this中编写的代码已过时。旧代码在这个答案的末尾仍然可用。。。但是已经找到了更好的方法!


使用内置谓词dif/2安全地表达术语不等式!有关详细信息,请参阅prolog dif。

使用dif/2member/2,您可以像这样实现valid/4

valid(A,B,C,D) :- 
   dif(X,Y),
   member(X,[A,B,C,D]),
   member(Y,[A,B,C,D]).

相关内容

  • 没有找到相关文章

最新更新