假设我有一个列表列表
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 :(得分:0)
上次我和Prolog做了20多年前的事情,所以我不记得Prolog的具体内容。
但是,如果我以任何功能友好的语言执行此操作,我会对大列表中的所有子列表进行排序,然后删除所有重复项。
答案 1 :(得分: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
谓词。