Prolog - 使用否定(声明方法)将member / 2定义为仅对每个数字成功一次

时间:2018-01-03 19:58:24

标签: prolog negation

我试图为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).

但是,我知道您也可以在声明性方法中使用否定来做到这一点,但我无法解决如何做到这一点。如果有人能指出我正确的方向,那将是伟大的。

1 个答案:

答案 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.