Prolog:地图列表将结果附加到主列表而不是子列表



所以我将简单的谓词定义为

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/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).

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的建议使用flattenfold。或者,您可以"手动"编写自己的类似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).

相关内容

  • 没有找到相关文章