2014-05-17 65 views
0

我对自己感到困惑,如果有人能指引我朝着正确的方向,这将会很有帮助。我需要从嵌套列表中获取重复项。我想我可以简单地找出如何从常规列表中找出重复的东西,然后制定一个获取子集的规则,然后以某种方式将它们组合起来,它会起作用,但我认为我通过这样做会让自己更加困惑。嵌套列表重复

这是我到目前为止,它删除重复罚款。

删除重复:

duplicate([],[]). 
duplicate([H|T],C) :- var(H,T),!, duplicate(T,C). 
duplicate([H|T],[H|C]) :- duplicate(T,C). 

var(X,[H|_]) :- X==H,!. 
var(X,[_|T]) :- var(X,T). 

子集规则:

subset([],_). 
subset([H|T],L):- member(H,L),subset(T,L). 

目前如果我叫duplicate([1,2,2,3,4,a,a,a,b,b,b], X).它会返回X = [1,2,3,4a,b]这是正确的,但我希望能够调用duplicate([1,[2,[2,[1,[a,[a]]]]]], X).,并使其返回X = [1,2,a]

我的思维过程是正确的还是我错误地想到了这一点?

回答

1

您只需压平列表作为预处理步骤:

?- flatten([1,[2,[2,[1,[a,[a]]]]]], L). 
L = [1, 2, 2, 1, a, a]. 

然后用你的扁平化名单上现有duplicateflatten([1,[2,[2,[1,[a,[a]]]]]], L), duplicate(L, X).

+0

反正有没有包括在该规则,以便用户该过程可以调用'duplicate([1,[2,[2,[1,[a,[a]]]]]],L).'? – user3646479

+1

@ user3646479是的。将你的'duplicate'重命名为'duplicate_flatten'并且定义'duplicate(X,Y): - flatten(X,L),duplicate_flatten(L,Y).' –