在prolog中找到列表的所有k长度子集

时间:2013-04-05 14:20:39

标签: list prolog subset

我需要在prolog中找到k长度的列表子集, 我有这个功能:

    subset([], []).
    subset([E|Tail], [E|NTail]):-
    subset(Tail, NTail).
    subset([_|Tail], NTail):-
    subset(Tail, NTail).

我对列表的长度应用另一条规则,

    length(Xs,Size)

问题是它非常慢,因为它搜索全长子集, 这个k长子集是否存在直接递归定义?

我搜索了一个星期而且找不到任何东西

1 个答案:

答案 0 :(得分:2)

使用subset/2的初始解决方案,您可以添加另一个参数(Len)和:

  • 当Len = 0
  • 时,基本情况成立
  • 递归步骤,添加元素递减Len并在新Len = 0
  • 时完成递归

那看起来:

 subset(0, [], []).
 subset(Len, [E|Tail], [E|NTail]):-
   succ(PLen, Len),
   (PLen > 0 -> subset(PLen, Tail, NTail) ; NTail=[]).
 subset(Len, [_|Tail], NTail):-
   subset(Len, Tail, NTail).