Prolog中包含k个元素的列表的所有子集

时间:2012-01-31 09:17:25

标签: prolog

请帮我解决这个问题:

  

子集(N,[1,2,3],L)。

如果N = 2,我希望结果是:

  

[1,2];

     

[2,1];

     

[1,3];

     

[3,1];

     

[2,3];

     

并[3,2];

(以任何顺序)

2 个答案:

答案 0 :(得分:2)

我重写了这个解决方案:(基于:Permuted combinations of the elements of a list - Prolog

subset(N, InList, Out) :-
    splitSet(InList,_,SubList),
    permutation(SubList,Out),
    length(Out, N).

splitSet([ ],[ ],[ ]).
splitSet([H|T],[H|L],R) :-
    splitSet(T,L,R).
splitSet([H|T],L,[H|R]) :-
    splitSet(T,L,R).

结果(在SWI-Prolog中测试):

?- subset(2,[1,2,3],R).
R = [2, 3] ;
R = [3, 2] ;
R = [1, 3] ;
R = [3, 1] ;
R = [1, 2] ;
R = [2, 1] ;
false.

答案 1 :(得分:1)

嗯,你的基本情况很简单:

subset(0,Lst,[]).

如果N> 0,你有2个选择如何处理Lst的第一个元素:

  1. 您可以忽略它,并在剩余的Lst
  2. 中查找您的子集
  3. 您可以将其添加到您的子集中,将其添加到Lst剩余的1个较小子集中。
  4. 你可能认为你必须担心Lst太短(或者N太大了:同样的事情),但是如果你已经正确地编写了上述代码,那么应该为你照顾它。

    这足以让你开始。