所有订单中的组合
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]
我想以所有顺序生成 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]