如何在没有 findall 的情况下对结果求和

How to sum the results without findall

是否有一种有效且通用的方法来汇总结果而不生成中间列表:

main(A) :-
  B #< 4000000,
  B mod 2 #= 0,
  findall(B, fibonacci(_, B), Bs), 
  sum_list(Bs, A).

注意:这是欧拉计划 #2。

您可以使用谓词 [aggregate_all/3][1] 进行聚合而不生成中间列表(使用 SWI 在常量内存中运行,我想也可以使用 SICStus)。

而不是使用 findall/3 + sum_list/2 使用 aggregate_all(sum(B), ..., Sum):

euler2(Sum):-
  B #< 4000000,
  B mod 2 #= 0,
  aggregate_all(sum(B), fibonacci(_, B), Sum).