2013-11-02 19 views
2

的列表中刪除列表中的排列假設我有列表在序言中,如何從列表

L= [[1,2,3], [3,2,1],[2,1,2],[3,1,2], [1,2,2]]. 

,你可以看到,[1,2,3][3,2,1][3,1,2]互爲排列的列表。 [2,1,2][1,2,2]也是彼此的置換。

我的目標是刪除列表中所有元素的排列。 結果列表應該是:

L'=[[1,2,3],[2,1,2]]. 

我的想法到目前爲止是利用成員(X,L),以在列表中找到一個元素,那麼使用permutation(X,Xperm)獲得的X置換,然後檢查是否Xperm 是在L,如果是的話,刪除它。

然而,結果不是我想要的。

任何人都可以幫助我嗎?

回答

0

消除重複項的一種方法是使用標準的遞歸過程來移除重複項,而不是通過統一直接檢查相等性,更改代碼以嘗試統一已排序的列表。

/* This is the regular duplicate elimination 
    that sorts the head element before checking for duplicates 
*/ 
remove_dups([],[]). 
remove_dups([H|T], TT) :- msort(H,SH), contains_dup(SH,T), remove_dups(T, TT). 
remove_dups([H|T], [H|TT]) :- msort(H,SH), \+ contains_dup(SH,T), remove_dups(T, TT). 

/* This duplicate checker routine sorts the lists before trying to unify them */ 
contains_dup(_, []) :- fail. 
contains_dup(SH, [H|_]) :- msort(H, SH). 
contains_dup(SH, [_|T]) :- contains_dup(SH, T). 

該代碼使用SWI的msort/2謂詞。

這是demo on ideone

+0

如果L = [[0,0,1],[0,1,1]],remove_dups給了我X = [[0,1,1]]。這是不對的。是否因爲SWI-prolog的排序會刪除重複項?例如在我的序言實現中,sort([0,0,1])= [0,1]。 – user2683732

+0

@ user2683732你說得對,我錯過了那部分。 'sort/2'確實會刪除重複項。切換到'msort/2'來避免這種行爲。 – dasblinkenlight

0

上次我在Prolog上做了20多年前的事情,所以我不記得任何Prolog特定的東西。

但是,如果我以任何功能友好的語言來完成此操作,我會對大列表中的所有子列表進行排序,然後刪除所有重複列表。

+0

我無法排序。他們可能是這樣的子列表[3,2,2],排序會給[2,3],這不是我想要的。 – user2683732

+0

排序[3,2,2]應該給你[2,2,3] - 排序時不刪除重複值,然後刪除重複列表。 – zmbq

+0

奇怪,我使用SWI-prolog,sort([3,2,2],L)給了我L = [2,3]。 – user2683732