Prolog中区间数和的程序设计

Prolog中区间数和的程序设计,prolog,Prolog,我试图在Prolog中创建一个程序,它接受两个数字——a和B,并找到从a到B的数字之和,包括它们 总结:总结(1,5,C)应该发现C是1+2+3+4+5=15 这是我的代码,不起作用:( sum(A,B,C):-A=

我试图在Prolog中创建一个程序,它接受两个数字——a和B,并找到从a到B的数字之和,包括它们

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

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

sum(A,B,C):-A=
然后我用sum(1,5,C)测试它。

我得到的是
错误:is/2:参数没有得到充分实例化,但我无法真正了解问题所在:(


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

你不能将
C1
实例化为
C+A
,因为
C
还不是整数

让我们调用
sum(1,5,C)

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

sum(A,B,C):-A=
在SWI Prolog中,实现它的最简单方法是:

?- numlist(1, 5, List), sum_list(List, Sum).
List = [1, 2, 3, 4, 5],
Sum = 15.
您的代码试图计算
C+A
,但
C
尚不清楚,因此会显示错误消息


顺便说一句,您也可以直接计算此总和,无需任何迭代或列表生成,请参见SWI Prolog中提供的

,library()是一个成熟的接口:

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

它的内部工作与你在卡雷尔的回答中看到的类似。无论如何,要学习序言,请遵循C.B.的详细解释。

我想你可以使用蛮力,但仅仅使用你的数学不是更容易吗

sum(A,B,X) :-
  A =< B ,
  N is 1+B-A ,
  X is N*(A+B) / 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)
  .
sum(A,B,S):-A=B
.
总和(A、B、T、S):-
A=
最干净的解决方法。使用
findall
library(apply)
library(aggreggate)
可以解决许多问题。非常感谢:)我写这篇文章是为了学习和练习,所以C.B.解决方案更适合我的情况。不过,这也是非常有用的,谢谢!非常感谢!:)正是我需要的!
?- numlist(1, 5, List), sum_list(List, Sum).
List = [1, 2, 3, 4, 5],
Sum = 15.
?- aggregate(sum(N), between(1,5,N), S).
S = 15.
sum(A,B,X) :-
  A =< B ,
  N is 1+B-A ,
  X is N*(A+B) / 2
  .
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)
  .