我需要在prolog中找到k长度的列表子集, 我有这个功能:
subset([], []).
subset([E|Tail], [E|NTail]):-
subset(Tail, NTail).
subset([_|Tail], NTail):-
subset(Tail, NTail).
我对列表的长度应用另一条规则,
length(Xs,Size)
问题是它非常慢,因为它搜索全长子集, 这个k长子集是否存在直接递归定义?
我搜索了一个星期而且找不到任何东西
答案 0 :(得分:2)
使用subset/2
的初始解决方案,您可以添加另一个参数(Len)和:
那看起来:
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).