【问题标题】:Prolog: List of sublistsProlog:子列表列表
【发布时间】:2019-03-28 23:02:05
【问题描述】:

我的任务是创建一个子列表列表,其中元素按连续顺序排序。我遇到了困难,因为当它遍历列表并返回带有列表的多个列表时,这不是我想要的。我的目标是一个包含多个长度为 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


    【解决方案1】:

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

    对于3个元素的具体情况:

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

    对于'Size'项目的滑动窗口的更一般情况:

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

    【讨论】:

    • 不错的解决方案。比我最初为小列表发布的解决方案慢,但对于更大的列表更快。删除了我的并赞成你的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-14
    相关资源
    最近更新 更多