【问题标题】:Prolog: slice big list in smaller seperate listsProlog:在较小的单独列表中切片大列表
【发布时间】:2013-05-30 23:24:17
【问题描述】:

我正在寻找机会将列表分割成更小的列表,如下所示:

[1,2,3,4] -> [[1,2],[2,3],[3,4]]
[1,2] -> [[1,2]]

等等..

首先,我搜索了一个带有内置谓词的解决方案。但我想不通要和他们一起做..这是对的吗?! 所以我自己写了一个谓词:

slice([],[]).
slice([H1,H2|T], Output) :-
    append([H2],T,New),
    slice(New, [[H1,H2]|Output]).

但在最后一个迭代步骤中,当 New 仅包含一个元素时,与 [H1,H2|T] 的统一失败..

【问题讨论】:

    标签: prolog


    【解决方案1】:

    根据 mapadj/3Prolog lambdas 定义slice/2!简单写:

    slice(Xs,Yss) :-
       mapadj(\X0^X1^[X0,X1]^true, Xs, Yss).
    

    示例查询:

    ?- slice([1,2],Yss).
    Yss = [[1,2]].
    
    ?- slice([1,2,3,4],Yss).
    Yss = [[1,2],[2,3],[3,4]].
    

    【讨论】:

      【解决方案2】:

      基于@SergeyDymchenko 的回答,很大程度上取决于您希望如何处理单个元素列表的特殊情况[1]

      你是否丢弃它,这样

      [1] --> []
      

      如果是这样,谢尔盖的回答是正确的。

      或者,您是否将其“切片”为单个元素的子列表,这样

      [1] --> [ [1] ]
      

      如果是这样,您需要修改 Sergey 答案的第二项:

      slice( []      , []            ) .
      slice( [H]     , [ [H] ]       ) .
      slice( [H1,H2|T] , [[H1,H2]|R] ) :-
        slice( [H2|T] , R )
        .
      

      第三种选择是简单地失败,将单个元素的列表视为谓词的无效输入:单个元素的列表不能分解为 2 元素子列表的列表,每个子列表由相邻的对组成.

      只有你才能确定这个问题的真实语义。

      【讨论】:

      • 您的第二种选择不符合问题中的测试示例。
      • @SergeyDymchenko - 由于 OP 没有给出单个元素列表的示例,尽管他暗示这是问题所在,但我宁愿怀疑这是她的分析没有考虑的特殊情况。在任何一种情况下,问题都没有指定对单个元素列表的期望处理:该单个元素是否应该导致失败、从结果集中排除或作为短子列表包含在结果集中。
      • 不可能在单个元素上失败,因为如果您从任何更长的列表开始,您总是会命中单个元素列表。
      【解决方案3】:
      slice([], []).
      slice([_], []) :- !.
      slice([H1, H2 | T], [[H1, H2] | SliceT]) :-
          slice([H2 | T], SliceT).
      

      【讨论】:

        猜你喜欢
        • 2023-01-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-27
        • 2010-12-14
        • 2023-03-13
        相关资源
        最近更新 更多