我试图为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).
但是,我知道您也可以在声明性方法中使用否定来做到这一点,但我无法解决如何做到这一点。如果有人能指出我正确的方向,那将是伟大的。
答案 0 :(得分:2)
使用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.