我正在学习 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我仍然对术语感到不安。让我知道我是否错误地使用了这些术语。