Si desea transformar una lista de números en una expresión aditiva, desde
[1,2,3]
a
1 + 2 + 3
que podría hacer algo como esto, usando algo como una lista diferencia:
list_to_additive_expr([] , 0).
list_to_additive_expr([X|Xs] , X + RHS) :-
sum_of(Xs , RHS).
Como alternativa, puede utilizar un acumulador :
list_to_additive_expr(Xs , Expr) :-
list_to_additive_expr(Xs , 0 , Expr)
.
list_to_additive_expr([] , Expr , Expr) .
list_to_additive_expr([X|Xs] , RHS , Expr) :-
sum_of(Xs , X + RHS , Expr)
.
creo que se encuentra el primer estilo no es adecuadamente cola recursiva y así no conseguirá optimizado en un bucle a través de la optimización de recursión de cola (TRO) — y por lo tanto, si la lista es lo suficientemente larga, obtendrá un desbordamiento de la pila. El segundo enfoque debería tener TRO aplicado y debería funcionar para listas de cualquier longitud.
¿Qué es TRO, usted puede ser que pregunte? Aquí es Wikipedia with an answer for you:
En informática, una llamada de cola es una llamada a una subrutina que sucede dentro de otro procedimiento y que produce un valor de retorno, que luego se devuelve inmediatamente por el procedimiento de llamada . Luego se dice que el sitio de llamada está en posición de cola, es decir, al final de el procedimiento de llamada. Si una subrutina realiza una llamada de cola a sí misma, se llama recursivo de cola. Este es un caso especial de recursión.
Las llamadas de cola son importantes porque se pueden implementar sin agregar un nuevo marco de pila a la pila de llamadas. La mayor parte del marco del procedimiento actual no es necesario más, y puede ser reemplazado por el marco de la llamada final, modificado según corresponda (similar a la superposición para procesos, pero para llamadas a funciones). El programa puede saltar a la subrutina llamada.Producir dicho código en lugar de una secuencia de llamada estándar se llama eliminación de llamada de cola o optimización de cola de llamada.
Al menos en SWI Prolog, por que para evaluar escribir 'total es Cabeza + Sum1' en lugar de utilizar el signo =' '. Las pistas para repensar esto para usar Tail Recursion Optimization son válidas, pero si solo estás tratando de aprender la Programación Declarativa no son esenciales, ya que es la debilidad de la Realidad que la verdadera programación declarativa no exista, y como tal Prolog as cualquier otro idioma adolece de debilidades, como el orden de evaluación de los procedimientos, que en este caso no es óptimo. – Matej
"Este código devuelve verdadero." - ¿Para qué consulta? – ShiDoiSi