Pregunta

Si bien el aprendizaje Prolog, estoy tratando de resolver el siguiente problema, el uso de acumuladores:

  

Escribir un predicado addone2 ??/ cuyo primer argumento es una lista de números enteros, y cuyo argumento segunda es la lista de números enteros obtenidos mediante la adición de 1 a cada número entero en la primera lista. Por ejemplo, la consulta

       addone([1,2,7,2],X).
     

debe dar

       X = [2,3,8,3].

He creado el siguiente código:

addone([], _).
addone([E|Tail], [R|Rs]) :-
    NewE is E+1,
    append([R|Rs], [NewE], NewRs),
    addone(Tail, NewRs).

Sin embargo, no está funcionando. ¿Puede alguien decirme por qué? Por lo tanto, ¿cómo se utiliza acumuladores en Prolog?

Gracias!

¿Fue útil?

Solución

Anthares está en correcta que hay que refinar su caso base. Sin embargo, también están haciendo las cosas de manera muy ineficiente con sus llamadas append. En Prolog, se necesita algún tiempo para acostumbrarse a la potencia de la unificación, pero por ejemplo, en este caso se le ayuda a establecer inmediatamente su lista de resultados. Intente lo siguiente:

addone([E|Tail], [E1|Rs]) :-
    E1 is E+1,
    addone(Tail, Rs).

Eso es todo lo que hay que hacer. Al colocar inmediatamente E1 en el patrón de su segundo argumento, que ya ha creado el primer elemento de la lista de resultados. Los elementos de Rs restante se crea durante la recursión. Un patrón muy típico Prolog.

Otros consejos

La parte inferior de la recursión debe ser addone([],[]). en NewRs fin de ser conectado con el []

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top