我试图找到 1000 以下的 3 和 5 的所有正倍数的总和。在添加应该从 5 的倍数的总和中删除 3 的倍数的部分后,gprolog 将继续吐出“No "用于查询 ?- sigma(1000,N)。
问题显然出在 sigma5 上,但我不太清楚:
sigma(Num, Result) :- sigma3(Num, 3, Result3),
sigma5(Num, 5, Result5),
Result is Result3 + Result5.
sigma3(Num, A, Result) :- A < Num,
Ax is A+3,
sigma3(Num, Ax, ResultX),
Result is ResultX + A.
sigma3(Num, A, Result) :- A >= Num,
Result is 0.
sigma5(Num, A, Result) :- A < Num,
mod3 is A mod 3,
0 \= mod3,
Ax is A+5,
sigma5(Num, Ax, ResultX),
Result is ResultX + A.
sigma5(Num, A, Result) :- A < Num,
mod3 is A mod 3,
0 == mod3,
Ax is A+5,
sigma5(Num, Ax, ResultX),
Result is ResultX.
sigma5(Num, A, Result) :- A >= Num,
Result is 0.
我的代码有什么问题?
最佳答案
由于涉及整数,请考虑使用 finite domain constraints .例如,使用 SWI-Prolog:
?- use_module(library(clpfd)).
true.
?- findall(N, (N mod 3 #= 0 #\/ N mod 5 #= 0, N in 0..999, indomain(N)), Ns),
sum(Ns, #=, Sum).
Ns = [0, 3, 5, 6, 9, 10, 12, 15, 18|...],
Sum = 233168.
关于prolog - 初学者 - 添加 3 和 5 的倍数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9181356/