我正在尝试为member / 2写一个替代定义,它不会返回数字的重复(即每个元素只会成功一次)。我目前使用切割程序正式使用此代码:
once_member(X,[H|T]) :-
member(H,T),
!,
once_member(X,T).
once_member(H,[H|_]).
once_member(X,[_|T]) :-
once_member(X,T).
但是,我知道你也可以在声明方法中使用否定来做到这一点,但我无法弄清楚如何去做。如果有人能指出我正确的方向,那将是伟大的。
使用dif/2
非常简单:
once_member(X, [X|_]).
once_member(X, [Y|T]) :-
dif(X, Y),
once_member(X, T).
1 ?- once_member(A, [1,2,3,3,4]).
A = 1 ;
A = 2 ;
A = 3 ;
A = 4 ;
false.
2 ?- X = a, once_member(X,[A,b]).
X = A, A = a ;
false.
3 ?- once_member(X,[A,b]), X = a.
X = A, A = a ;
false.