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]].

到目前为止,我的想法是使用 member(X,L) 来定位列表中的元素,然后使用permutation(X,Xperm)来获取 的排列X,然后检查是否Xperm 在 中,如果是L,则删除它。

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

有人可以帮我吗?

4

2 回答 2

0

上次我用 Prolog 做任何事情是在 20 多年前,所以我不记得任何关于 Prolog 的内容。

但是,如果我要使用任何功能友好的语言来执行此操作,我将对大列表中的所有子列表进行排序,然后删除所有重复项。

于 2013-11-02T20:20:53.827 回答
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谓词。

这是关于 ideone 的演示

于 2013-11-02T20:39:12.243 回答