我刚刚开始尝试使用 Prolog,我正在尝试编写一个规则来确定列表是否仅包含唯一元素。我让它在第二个变体中工作(通过否定阳性测试),但我完全不明白为什么第一个变体不起作用。
鉴于此文件:
uniqueElements([X|Y]) :-
notmember(X, Y),
uniqueElements(Y).
notmember(X, Y) :-
\+ member(X, Y).
hasRepeatedElements([X|Y]) :-
(
member(X, Y) ->
true
; hasRepeatedElements(Y)
).
uniqueElements_2(X) :-
\+ hasRepeatedElements(X).
GNU Prolog 解释器给出以下响应:
| ?- uniqueElements([1,2,3]).
no
| ?- uniqueElements([1,2,3,2,3]).
no
| ?- uniqueElements_2([1,2,3]).
yes
| ?- uniqueElements_2([1,2,3,2,3]).
no
为什么第一反应是“不”?(我本来希望 member 返回 false,被否定为 true,因此 notmemeber 在 uniqueElements 的每次迭代中都返回 true)。我想我期待 '\+' 表现得像 '!' 在 C if 子句或 Python 中的 'not' 关键字中执行。这是误会吗?