我正在学习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,如果这有任何区别的话。
注:我还不太懂术语。如果我用错了,请告诉我。
试试这样做(使用累加器):
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).