在prolog中,如何从列表列表中删除列表的排列

时间:2013-11-02 20:15:39

标签: prolog permutation

假设我有一个列表列表

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,如果是,请将其删除。

然而结果并不是我想要的。

有人可以帮助我吗?

2 个答案:

答案 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谓词。

这是demo on ideone