2012-05-17 72 views
0

我在序言中的一些問題......再次 我需要接收三個列表功能: elementsToRemove fullList nonRepeatedElements 的功能應該是這樣的,如下所示:如何從序列中的列表中刪除重複的元素?

removeRepeatedElements(elementsToRemove, fullList, nonRepeatedElements) 

其中nonRepeatedElements是一個沒有任何elementToRemve AND fullList元素的列表。 任何人都可以請幫忙!有點絕望在這裏。 AHAH

+0

?即:func([1,2,3],[3,4,5],L)。 L = [1,2,4,5]? –

+0

no,func([1,2,3,4],[2,3],L)。 L = [1,4] – FriedRike

回答

1

SWI -Prolog有subtract(+ Set,+ Delete,-Result)。

它以這種方式實現的真實:

%% subtract(+Set, +Delete, -Result) is det. 
% 
% Delete all elements from `Set' that occur in `Delete' (a set) 
% and unify the result with `Result'. Deletion is based on 
% unification using memberchk/2. The complexity is |Delete|*|Set|. 
% 
% @see ord_subtract/3. 

subtract([], _, []) :- !. 
subtract([E|T], D, R) :- 
    memberchk(E, D), !, 
    subtract(T, D, R). 
subtract([H|T], D, [H|R]) :- 
    subtract(T, D, R). 

您可以使用實施任何其他的Prolog ...

你想要得到的獨特元素的結合
0

確定,根據你的描述,這將是答案:

% base case 
sto([],L,[]). 

% item isn't found in the other list 
sto([H|T],L,[H|T2]):- 
\+member(H,L),sto(T,L,T2). 

% item is present in the other list 
sto([H|T],L,N):- 
member(H,L),sto(T,L,N). 

member(X,[X|_]). 
member(X,[_|T]):- 
member(X,T). 

所以,sto是主要功能,member函數檢查元素出現在給定列表

+0

下面是這個事情:我用'tab'來創建一個列表,其中包含以下元素: 'tab([(top,left),(top,middle),(top,right), (中心,左邊),(中心,中間),(中心,右邊),(底部,左邊),(底部,中間),(底部,右邊)])。' 這個:'tab(AllPositions)'應該創建上面列出的名字AllPositions的權利? (上,中),(上,右),(中,中),(中,右) 我應該消除列表AllPositions給出的列表,並得到一個沒有重複元素的NewList。 – FriedRike

+0

我上面寫的代碼適用於單個元素(int,char,string等等),根據最後一個註釋你必須定製它以適用於2個元素而不是1個元素的元組。 –