Rya*_*art 5 stack-overflow recursion tail-recursion prolog instantiation-error
我正在学习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.
Run Code Online (Sandbox Code Playgroud)
counting_sum(150000, X).
随着堆栈溢出,它在某处爆炸.我知道Prolog可以做尾递归,但如果我将递归调用移到规则的末尾,我得到
error(instantiation_error,(is)/2)
Run Code Online (Sandbox Code Playgroud)
我假设它告诉我PrevSum
在统一之前我不能使用它counting_sum(PrevNum, PrevSum)
.这是正确的,有没有办法让这个尾递归?我正在使用GNU Prolog 1.3.1,如果这有任何区别.
PS我的术语仍然不稳定.如果我错误地使用了这些条款,请告诉我.
尝试这样的事情(使用累加器):
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).
Run Code Online (Sandbox Code Playgroud)