私は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)
。それは正しいですか、そしてこの末尾再帰を作成する方法はありますか?違いがあれば、GNUProlog1.3.1を使用しています。
PS私はまだ用語が不安定です。用語を間違って使用した場合はお知らせください。