首页 > 解决方案 > 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 = [_,_,_]破坏了我的功能。

标签: prolog

解决方案


您可以使用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).

推荐阅读