从另一个列表的元素创建大小为N的排列列表

时间:2018-05-04 20:05:37

标签: list prolog permutation

如果给定List = [(1,1),(1,2),(1,3),(1,4)],N = 2,我如何创建一个包含多个有序排列的列表列表,大小N:

permutations([(1,1),(1,2),(1,3),(1,4)],2,ListOut). ListOut=[[(1,1),(1,2)],[(1,1),(1,3)],[(1,1),(1,4)],[(1,2),(1,3)],[(1,2),(1,4)],[(1,3),(1,4)]]

...

1 个答案:

答案 0 :(得分:2)

首先让我们解决找到一个排列的问题:

perm(_, 0, []).
perm([X|Xs], N, [X|Ys]) :- N1 is N-1, perm(Xs,N1,Ys).
perm([_|Xs], N, Y) :- N>0, perm(Xs,N,Y).

有两个递归规则:1)X可以是输出的第一个元素,并为列表的其余部分找到N-1的剩余排列; 2)跳过第一个元素,找到输入列表中其余元素的排列。

查找所有排列只是使用findall/3

permutations(X, N, Y) :- findall(Z, perm(X, N, Z), Y).

测试:

?- permutations([(1,1),(1,2),(1,3),(1,4)], 2, X).
  

X = [[(1,1),(1,2)],[(1,1),(1,3)],[(1,1),(1,4)],[( 1,2(1),(1,3)],[(1,2),(1,4)],[(1,3),(1,4)]]。