列表组合开始

时间:2013-04-14 12:46:08

标签: prolog

我从此页面复制了此代码:

% 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]。

谢谢你的帮助!

1 个答案:

答案 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.

首先我将所有解决方案收集在一个袋子里,然后我在袋子里迭代找到一个枢轴成员,如果我发现它是一个列表,其中枢轴为头部,其余的解决方案为尾部。如果我不这样做,那么这个名单就是空名单。

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