所有订单中的组合

Combinations in all orders

我想以所有顺序生成 1..N 范围内所有数字的所有对,即 [X,Y] 和 [Y,X]

我在这里找到了这些:http://kti.ms.mff.cuni.cz/~bartak/prolog/combinatorics.html

 comb(0,_,[]).
 comb(N,[X|T],[X|Comb]):-N>0,N1 is N-1,comb(N1,T,Comb).
 comb(N,[_|T],Comb):-N>0,comb(N,T,Comb).

 comb_rep(0,_,[]).
 comb_rep(N,[X|T],[X|RComb]):-N>0,N1 is N-1,comb_rep(N1,[X|T],RComb).
 comb_rep(N,[_|T],RComb):-N>0,comb_rep(N,T,RComb).

 ?- findall(E1,comb_rep(2,[1,2,3],E1),C1),findall(E2,comb(2,[3,2,1],E2),C2),append(C1,C2,C),write(C).

 [[1,1],[1,2],[1,3],[2,2],[2,3],[3,3],[3,2],[3,1],[2,1]]

必须有更简单的方法吗?

此外,我更愿意将其作为生成器来执行,而不是完全呈现的列表(如上面的例子)

我怀疑我遗漏了一些东西,因为这比您发布的代码少得多,但这似乎按照您的要求创建了对:

limit_pairs(N, [X, Y]) :-
    between(1, N, X),
    between(1, N, Y).

例如

?- limit_pairs(3, P).
P = [1, 1]
P = [1, 2]
P = [1, 3]
P = [2, 1]
P = [2, 2]
P = [2, 3]
P = [3, 1]
P = [3, 2]
P = [3, 3]