1

所以我将简单谓词定义为

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]

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

4

2 回答 2

2

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

于 2018-05-11T13:19:57.253 回答
1

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

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).
于 2018-05-11T12:51:52.997 回答