所以我将简单的谓词定义为
pred(Info, List, Result) :-
maplist(pred_calculate(Info), List, Result).
pred_calculate
在对 list 元素执行操作后返回 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]
我将如何更改它以修复此行为?
当将foldl/4
与append/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).
1:结果foldl(append, List1, [], Result)
会给你[8,9,11,5,7,8,2,3,5]
。
maplist
调用pred_calculate(Info)
List
的每个相应元素和Result
。如果pred_calculate
每次调用都会产生一个列表,也许maplist
不是您真正想在这里使用的,因为它不是 1-1 对应关系。你有一个一对多,你想要在一个大的、扁平的列表中。你可以按照!joel76的建议使用flatten
或fold
。或者,您可以"手动"编写自己的类似maplist
谓词,这非常简单 - 只是一个基本的列表递归,并可能使用追加来实现每个步骤:
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).