我正在学习Prolog,作为一个练习,我正在试验一个简单的数据库,它可以计算所有数字之和,直到给定的数字(即0 = 0,1 = 1,2 = 3,3 = 6 ,4 = 10,...)。足够简单:这可以在Prolog中进行尾递归吗?
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,如果这有什么不同。
P.S.我仍然对术语感到不安。如果我错误地使用了这些术语,请告诉我。
你说得对有关实例错误的原因。 –