【问题标题】:Prolog: Maplist appending results to main list instead of sublistsProlog:Maplist将结果附加到主列表而不是子列表
【发布时间】:2018-05-11 11:33:21
【问题描述】:

所以我将简单谓词定义为

pred(Info, List, Result) :-
  maplist(pred_calculate(Info), List, Result).

pred_calculate 在对列表元素进行操作后返回 X 元素列表,例如,pred_calculate(Info, List, Result) 将返回类似于 [2,3,5] 的内容

我想将应用pred_calculate 谓词的所有结果添加到List 的所有元素,我遇到的问题是目前它将 pred_calculate 的所有结果添加为子列表而不是添加仅限于单个主列表。

所以此刻Result 返回 [[2,3,5],[5,7,8],[8,9,11]] 应该只返回 [2,3,5,5,7,8,8,9,11]

我将如何更改它以解决此问题?

【问题讨论】:

  • 压扁你的朋友,或者弃牌

标签: list prolog maplist


【解决方案1】:

当使用foldl/4append/3 时,如果项目的顺序很重要,则必须以正确的顺序传递参数以进行追加1

pred(Info, List, Result) :-
    maplist(pred_calculate(Info), List, List1),
    foldl([A, B, C] >> append(B, A, C), List1, [], Result).

另外,flatten/2 也会达到同样的效果,即:

pred(Info, List, Result) :-
    maplist(pred_calculate(Info), List, List1),
    flatten(List1, Result).

1foldl(append, List1, [], Result) 会给你[8,9,11,5,7,8,2,3,5] 作为结果。

【讨论】:

    【解决方案2】:

    maplistListResult 的每个对应元素上调用pred_calculate(Info)。如果pred_calculate 每次调用都生成一个列表,那么maplist 可能不是您真正想要在此处使用的,因为它不是1-1 对应关系。你有一个一对多,你想要一个大的扁平列表中的许多。您可以按照 !joel76 的建议使用 flattenfold。或者,您可以“手动”编写自己的 maplist 类谓词,这非常简单 - 只是一个基本的列表递归,并且可能使用 append 来实现每个步骤:

    pred(Info, List, Result) :-
        pred(Info, List, [], Result).
    
    pred(Info, [], Result, Result).
    pred(Info, [H|T], Acc, Result) :-
        pred_calculate(Info, H, R),
        append(Acc, R, Acc1),
        pred(Info, T, Acc1, Result).
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-28
      • 1970-01-01
      • 2018-08-15
      • 2014-02-14
      • 2021-06-07
      • 2012-12-20
      • 2012-03-10
      • 1970-01-01
      相关资源
      最近更新 更多