5

私は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私はまだ用語が不安定です。用語を間違って使用した場合はお知らせください。

4

1 に答える 1

9

次のようなものを試してください(アキュムレータを使用してください):

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).
于 2011-10-22T23:09:04.777 に答える