Prolog:子列表列表

时间:2019-03-27 20:53:15

标签: prolog

我有一个任务来创建子列表的列表,其中元素以连续顺序排序。我有困难,因为当它遍历列表并返回带有列表的多个列表时,那不是我想要的。我的目标是创建一个包含多个长度为3的子列表的列表。

示例

list([]).
list([_|T]) :- list(T).

sublist(L, []) :- list(L).
sublist([HX|TX],[HX|TY]) :- sublist(TX,TY).
sublist([_|TY], X) :- X = [_|_], sublist(TY, X).

这将打印出每个子列表。

?- sublist([10,20,30,a,b], L).
L = [] ;
L = [10] ;
L = [10, 20] ;
L = [10, 20, 30] ;
L = [10, 20, 30, a] ;
L = [10, 20, 30, a, b] ;
L = [10, 20, 30, b] ;
..and so on

我想要的是这样的东西

?- sublist([10,20,30,a,b], L).
L = [[10,20,30],[20,30,a],[30,a,b]] 

我一直想得太多,而其他X = [_,_,_]破坏了我的功能。

1 个答案:

答案 0 :(得分:2)

您可以使用append/3获取所有“滑动”子列表。

对于3个元素的特定情况:

sublist(L, LSubL):-
  findall([A,B,C], append(_, [A,B,C|_], L), LSubL).

对于“大小”项目的滑动窗口更一般的情况:

sliding_window(L, Size, LSubL):-
  length(SubL, Size),
  append(SubL, _, SubLO),
  findall(SubL, append(_, SubLO, L), LSubL).