嗨,我是prolog的新手,我想知道如何在prolog中逻辑地表达"不一样"。
例如,如果我有一个函数valid(A, B, C, D)
,它以数字为输入,并要求a、B、C、D不完全相同,我该如何声明?
我试过valid(A, B, C, D) :- not(A == B == C == D).
它似乎不起作用。
==/2
是一个二进制谓词'=='(X,Y)
,它的成功或失败取决于X
和Y
是否绑定到相同的值。因此,您不能像A == B == C
那样"级联"它们,因为这将是一个语法错误。
你能做的是单独配对。这将是一个足够的测试,可以判断A
、B
、C
或D
中的任何一个是否不同(即,它们"不完全相同"(:
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/2
和member/2
,您可以像这样实现valid/4
:
valid(A,B,C,D) :-
dif(X,Y),
member(X,[A,B,C,D]),
member(Y,[A,B,C,D]).