0

我从这个页面复制了这段代码:

% 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).

例如,如果输入composition(2,[1,2,3,4],L),则结果为:

L = [1, 2] ;
L = [1, 3] ;
L = [1, 4] ;
L = [2, 3] ;
L = [2, 4] ;
L = [3, 4] ;

现在我想输入一些内容,使您可以从组合的确定点开始。例如,类似:combination(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]。

谢谢你的帮助!

4

1 回答 1

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.

首先我将所有解决方案收集在一个袋子中,然后遍历袋子以找到一个枢轴成员,如果找到它,则结果是一个列表,其中枢轴作为头部,其余的解决方案作为尾部。如果我不这样做,则结果是一个空列表。

不是一个非常明智的解决方案,但有效。

于 2013-04-14T15:11:26.193 回答