如果给定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)]]
...
答案 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)]]。