5

我正在学习 Prolog,作为练习,我正在试验一个简单的数据库,该数据库计算所有数字的总和,直到给定数字(即 0=0、1=1、2=3、3=6、4 =10,...)。很简单:

counting_sum(0, 0).
counting_sum(Num, Sum) :- Num > 0, PrevNum is Num - 1,
    counting_sum(PrevNum, PrevSum), Sum is Num + PrevSum.

这会counting_sum(150000, X).因堆栈溢出而爆炸。我知道 Prolog 可以进行尾递归,但是如果我将递归调用移到规则的末尾,我会得到

error(instantiation_error,(is)/2)

我假设告诉我PrevSum在它与counting_sum(PrevNum, PrevSum). 这是正确的,有没有办法使这个尾递归?如果这有什么不同,我正在使用 GNU Prolog 1.3.1。

PS我仍然对术语感到不安。让我知道我是否错误地使用了这些术语。

4

1 回答 1

9

尝试这样的事情(使用累加器):

counting_sum(Count, Sum):-
  counting_sum(Count, 0, Sum).

counting_sum(0, Sum, Sum).
counting_sum(Num, PrevSum, Sum):- Num > 0, PrevNum is Num - 1,
    NextSum is PrevSum + Num,
    counting_sum(PrevNum, NextSum, Sum).
于 2011-10-22T23:09:04.777 回答