这可以在Prolog中实现尾递归吗?



我正在学习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)

我认为它告诉我不能在PrevSumcounting_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).

最新更新