Prolog中的程序,用于区间中的数字总和

时间:2014-01-22 22:10:37

标签: prolog

我正在尝试在Prolog中创建一个程序,它带有两个数字--A和B,并找到从A到B的数字之和,包括它们。

总结:总和(1,5,C)应该发现C是1 + 2 + 3 + 4 + 5 = 15

这是我的代码,它不起作用:(

sum(A, B, C) :- A =< B, A1 is A+1, C1 is C+A, sum(A1, B, C1).

然后我用sum(1, 5, C).

测试它

我得到的是ERROR: is/2: Arguments are not sufficiently instantiated,但我无法确定问题是什么。 :(

你能帮我理解为什么它不工作以及如何解决它?非常感谢你提前! :)

4 个答案:

答案 0 :(得分:3)

您无法将C1实例化为C+A,因为C还不是整数。

我们打电话给sum(1, 5, C)

sum(1, 5, C)

---> 1 =< 5 ... true

---> A1 is 1 + 1 ... A1 = 2 (fine)

---> C1 is C + 2, C = something like _G232, not yet instantiated.

让我们来看看你的逻辑。

当A和B相等时,我们会得到一个基本情况,这将是我们的“起始”总和

sum(X,X,X).

然后我们有一般情况。每个递归调用将给出从k + 1到n的和,我们称之为sum(k,n,sum)。

sum(A, B, C):- A =< B, A1 is A + 1, sum(A1,B,C1), C is C1 + A.

答案 1 :(得分:2)

在SWI-Prolog中,实现它的最简单方法是:

?- numlist(1, 5, List), sum_list(List, Sum).
List = [1, 2, 3, 4, 5],
Sum = 15.

您的代码尝试评估C+A,但C尚未知晓,因此错误消息。

顺便说一句,您也可以直接计算此总和,无需任何迭代或列表生成,请参阅https://math.stackexchange.com/questions/50485/sum-of-n-consecutive-numbers

答案 2 :(得分:2)

在SWI-Prolog中可用,库(aggregate)是一个完整的界面:

?- aggregate(sum(N), between(1,5,N), S).
S = 15.

它在内部做了类似的工作,你可以在Kaarel的回答中看到。无论如何,要学习Prolog,请遵循C.B.的详细解释。

答案 3 :(得分:2)

我想你可以对compute the sum of a finite arithmetic sequence使用蛮力,但使用你的数学会不会更容易?

sum(A,B,X) :-
  A =< B ,
  N is 1+B-A ,
  X is N*(A+B) / 2
  .

或者更一般地,用于计算 n 项的有限序列的总和,从 a 开始,具有<步长<(相对差异)< em> d ,你得到:

sum(A,D,N,S) :- S is (N*(2*A+(N-1)*D))/2 .

但是如果你要使用蛮力,那就让它尾递归:

sum(A,B,S) :- A =< B , sum(A,B,0,S) .

sum(A,B,S,S) :-
  A > B
  .
sum(A,B,T,S) :-
  A =< B ,
  T1 is T+A ,
  A1 is A+1 ,
  sum(A1,B,T1,S)
  .