我从此页面复制了此代码:
% combination(K,L,C) :- C is a list of K distinct elements
% chosen from the list L
combination(0,_,[]).
combination(K,L,[X|Xs]) :- K > 0,
el(X,L,R), K1 is K-1, combination(K1,R,Xs).
el(X,[X|L],L).
el(X,[_|L],R) :- el(X,L,R).
例如,如果输入组合(2,[1,2,3,4],L),结果为:
L = [1, 2] ;
L = [1, 3] ;
L = [1, 4] ;
L = [2, 3] ;
L = [2, 4] ;
L = [3, 4] ;
现在我想输入一些允许你从组合的确定点开始的东西。例如,类似:组合(2,[1,2,3,4],[1,4],L),结果:
L = [1, 4] ;
L = [2, 3] ;
L = [2, 4] ;
L = [3, 4] ;
在[1,4]处开始组合并跳过“步骤”[1,2]和[1,3]。
谢谢你的帮助!
答案 0 :(得分:1)
试试这个
combination(0,_,[]).
combination(K,L,[X|Xs]) :-
K > 0,
el(X,L,R),
K1 is K-1,
combination(K1,R,Xs).
generate(K, L, X, Pivot, Resault) :-
bagof(X, L^combination(K, L, X), Bag),
iterate(Bag, Pivot, Resault).
iterate([], _, []).
iterate([P|T], P, [P|T]):-!.
iterate([H|T], P, Res) :-
iterate(T, P, Res).
el(X,[X|L],L).
el(X,[_|L],R) :- el(X,L,R).
像这样使用generate/5
:
| ?- generate(2, [1,2,3,4], X, [1,4], Res).
Res = [[1,4],[2,3],[2,4],[3,4]]
yes.
首先我将所有解决方案收集在一个袋子里,然后我在袋子里迭代找到一个枢轴成员,如果我发现它是一个列表,其中枢轴为头部,其余的解决方案为尾部。如果我不这样做,那么这个名单就是空名单。
不是一个非常明智的解决方案,但有效。