我正在學習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.我仍然對術語感到不安。如果我錯誤地使用了這些術語,請告訴我。
你說得對有關實例錯誤的原因。 –