首页 > 解决方案 > Prolog:Maplist将结果附加到主列表而不是子列表

问题描述

所以我将简单谓词定义为

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]

我将如何改变它来解决这种行为?

标签: listprologmaplist

解决方案


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

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]结果。


推荐阅读