2014-05-17 64 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).' –