Uczę się Prologu, a jako ćwiczenie eksperymentuję z prostą bazą danych, która oblicza sumę wszystkich liczb aż do podanej liczby (tj. 0 = 0, 1 = 1, 2 = 3, 3 = 6 , 4 = 10, ...). dość proste:Czy to może być rekurencyjne w Prologu?
counting_sum(0, 0).
counting_sum(Num, Sum) :- Num > 0, PrevNum is Num - 1,
counting_sum(PrevNum, PrevSum), Sum is Num + PrevSum.
To wysadza gdzieś counting_sum(150000, X).
z przepełnienie stosu. Rozumiem, że Prolog może zrobić ogon rekursji, ale jeśli przenieść rekurencyjne wywołanie do końca rządów, mam
error(instantiation_error,(is)/2)
które zakładam, że mówi mi, że nie można używać PrevSum
zanim został zunifikowany z counting_sum(PrevNum, PrevSum)
. Czy to prawda, i czy istnieje sposób na rekursję tego ogona? Używam GNU Prolog 1.3.1, jeśli to robi jakąkolwiek różnicę.
P.S. Wciąż jestem niepewny terminologii. Daj mi znać, jeśli użyłem tych terminów niepoprawnie.
Masz rację o przyczynie błędu konkretyzacji. –