我正在使用GNU-Prolog尝试编写一个接受N
和M
正整数的程序,并对N
和M
之间的所有数字求和,包括{{1 }和N
。
我的代码是:
M
执行仅返回"否"没有答案,任何想法是什么问题?
答案 0 :(得分:1)
尝试
l = [1]
l + (2,) # error
你的第一个条款
l += [2]
l += list((2,))
是错误的,因为你必须将findnum(N, N, N).
findnum(N, M, Res) :-
N1 is N+1,
N < M,
findnum(N1, M, R0),
Res is R0 + N.
设置(统一)为一个值;如果您想要从findnum(N, N, M).
到M
的总和数字,则总和为N
,所以
N
第二个条款的想法是将N
加到findnum(N, N, N).
到N
之和;我在您的实现中看到了三个错误:
1)你必须调用终端子句(N+1
)所以保护M
是错误的,因为当findnum(N, N, N)
等于N1 < M
时你必须调用终端子句};正确的后卫是N1
或M
2)如果你对N < M
的递归调用,对于第三个参数,使用相同的变量(N1 <= M
),则无法添加findnum/3
,所以你必须在我的示例中使用另一个变量Res
进行调用
3)N
错了;正确的版本是R0
;当前号码(Res is N1 + M
)加上Res is R0 + N
到N
之和。
答案 1 :(得分:1)
我意识到这可能没什么用,但我只能说出来。
sums_upto(N, Sums) :- succ(N, N1), Sums is N * N1 / 2.
findnum(N, M, Total) :-
N < M,
sums_upto(N, NSum),
sums_upto(M, MSum),
Total is N + MSum - NSum.