5

Estoy aprendiendo Prolog, y como ejercicio, estoy experimentando con una base de datos simple que calcula la suma de todos los números hasta el número dado (es decir 0 = 0, 1 = 1, 2 = 3, 3 = 6 , 4 = 10, ...). Es bastante fácil:¿Se puede hacer esto de forma recursiva en Prolog?

counting_sum(0, 0). 
counting_sum(Num, Sum) :- Num > 0, PrevNum is Num - 1, 
    counting_sum(PrevNum, PrevSum), Sum is Num + PrevSum. 

que sopla en algún lugar alrededor de counting_sum(150000, X). con un desbordamiento de pila. Entiendo que Prolog puede hacer la recursión de cola, pero si muevo la llamada recursiva al final de la regla, consigo

error(instantiation_error,(is)/2) 

que supongo que me está diciendo que no puedo usar PrevSum antes de que se ha unificado con counting_sum(PrevNum, PrevSum) . ¿Es correcto, y hay alguna forma de hacer que esta cola sea recursiva? Estoy usando GNU Prolog 1.3.1 si eso hace alguna diferencia.

P.S. Todavía estoy inestable en la terminología. Avísame si utilicé los términos incorrectamente.

+1

Tienes razón acerca de la causa del error de instancias. –

Respuesta

8

intentar algo como esto (use un acumulador):

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). 
+1

Gracias. No había encontrado acumuladores. Es [parece una expresión útil] (http://www.lix.polytechnique.fr/~liberti/public/computing/prog/prolog/prolog-tutorial.html#iteration). Después de leer y entender qué es un acumulador, pude escribir una nueva implementación usando una y luego verificarla con su código. Se me ocurrió lo mismo. Problema: Aún recibo un desbordamiento de pila en '' counting_sum (350000, X) .' ¿Alguna idea de por qué es así? –

+1

Eso es extraño. Probé el código que proporcioné con SWI con '3500000' (diez veces su cifra) y lo maneja fácilmente. – gusbro

+2

Estoy especulando, pero GNU Prolog puede no hacer optimización de cola en modo interpretado (pero SWI Prolog sí). @RyanStewart: ¿qué tal si confirmas si usaste un ejecutable de gprolog compilado o solo el intérprete? – hardmath

Cuestiones relacionadas