Prolog:查找并放入列表中的重复项

  • 本文关键字:列表 查找 Prolog prolog
  • 更新时间 :
  • 英文 :


大家好。不明白为什么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中的成员资格只有在其所有条目统一后才能进行测试。

最新更新