大家好。不明白为什么prolog谓词将所有重复项放入我的新列表中。F.e.我必须挑选所有的副本:
?- duplicates([a, b, a, a, d, d], R).
R = [a, d]
我写了这个序言程序:
duplicates([], []).
duplicates([First|Rest], NewRest) :-
not(member(First, Rest)),
duplicates(Rest, NewRest).
duplicates([First|Rest], [First|NewRest]) :-
member(First, Rest),
duplicates(Rest, NewRest).
但它回来了:
R = [a, a] .
我想我需要在某个地方挂一个(!(标志,但无法理解,在哪里。有什么建议吗?
库(聚合(允许为您的问题提供一个紧凑的解决方案。
duplicates(L,D) :- findall(K,(aggregate(count,member(K,L),C),C>1),D).
?- duplicates([a, b, a, a, d, d], R).
R = [a, d].
显然,它没有@Raubsauger的好答案那么容易掌握,也不是每个Prolog都能提供的。
试试这个:
duplicates([], []).
duplicates([First|Rest], NewRest) :-
+ member(First, Rest),
duplicates(Rest, NewRest).
duplicates([First|Rest], NewRest) :-
duplicates(Rest, NewRest),
member(First, NewRest).
duplicates([First|Rest], [First|NewRest]) :-
member(First, Rest),
duplicates(Rest, NewRest),
+ member(First, NewRest).
?- duplicates([a, b, a, a, d, d], R).
R = [a, d] ;
false.
我选择了一个不需要剪切的版本(!
(。此外,我还添加了另一条规则:NewRest
中的元素只能出现一次。注意:NewRest
中的成员资格只有在其所有条目统一后才能进行测试。