Sto imparando Prolog e, come esercizio, sto sperimentando un semplice database che calcola la somma di tutti i numeri fino al numero specificato (cioè 0 = 0, 1 = 1, 2 = 3, 3 = 6 , 4 = 10, ...). Abbastanza facile:Questo può essere fatto ricorsivo in coda in Prolog?
counting_sum(0, 0).
counting_sum(Num, Sum) :- Num > 0, PrevNum is Num - 1,
counting_sum(PrevNum, PrevSum), Sum is Num + PrevSum.
che soffia da qualche parte intorno counting_sum(150000, X).
con un overflow dello stack. Capisco che Prolog può fare ricorsione in coda, ma se mi trasferisco la chiamata ricorsiva alla fine della regola, ottengo
error(instantiation_error,(is)/2)
che ammetto mi sta dicendo che non posso usare PrevSum
prima che è stato unificato con counting_sum(PrevNum, PrevSum)
. È corretto, e c'è un modo per rendere questa coda ricorsiva? Sto usando GNU Prolog 1.3.1 se questo fa alcuna differenza.
P.S. Sono ancora traballante sulla terminologia. Fammi sapere se ho usato i termini in modo errato.
Hai ragione circa la causa dell'errore di un'istanza. –