如何在没有 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).
是否有一种有效且通用的方法来汇总结果而不生成中间列表:
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).