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

问题描述 投票:1回答:1

我正在尝试为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).

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

prolog negation
1个回答
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.
© www.soinside.com 2019 - 2024. All rights reserved.