prolog - 初学者 - 添加 3 和 5 的倍数

标签 prolog clpfd

我试图找到 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/

相关文章:

algorithm - Prolog 程序的复杂性?

prolog - 在 Prolog 中重新定义 AND 运算符

Prolog:单引号和双引号的不同行为

prolog - 在序言中组合两个数字

prolog - 使用 clpfd 进行过桥拼图

prolog - 从剩余目标中获取值(value)

prolog - 如何限制序言中我的解决方案中使用的可能整数?

prolog - 在 Prolog 中比较两个原子

prolog - 将 'mod' 运算符与 'or' 一起使用时是否强制具体化?

list - Prolog:具有元素总和 S 的 k 个元素的排列