El el código tal como lo ha publicado es (casi) correcto. El orden de las cláusulas sólo necesita ser cambiado (con el fin de hacer que esta definición predicado productiva, cuando se utiliza de manera generativa):
append([],X,X). % your 2nd line
append([X|Y],Z,[X|W]) :- append(Y,Z,W). % your first line
Esto define una relación entre los tres argumentos, digamos A
, B
y C
.
Su primera línea dice, "C
es el resultado de añadir A
y B
si A
y C
son listas no vacías, los dos tienen la misma cabeza (es decir, primer elemento), y la cola de C
es el resultado de agregar la cola de A
con el mismo segundo argumento, B
".
a a
----------
b b
c c
. d d
e e
. .
Piénselo, tiene mucho sentido. Lo que hace es que queremos definir la relación append/3
, y sabemos lo que queremos que sea, así que solo escribimos algunos hechos obvios que queremos que cumplan, las leyes que debe seguir si así lo desea.
Suponiendo que ya tenemos este código definido, ¿qué leyes debe seguir?Obviamente, agregar una cola de una lista con otra lista nos da una cola de resultado al agregar la lista completa con esa segunda lista.
Esto define cómo "deslizamos" a lo largo de la primera lista. Pero, ¿y si no hay otro lugar para deslizarse? ¿Qué pasa si hemos llegado al final de esa lista? Luego, llegamos a la lista vacía y al agregar una lista vacía con otra lista, obtenemos esa lista como resultado. Obviamente. Y eso es lo que esa 2da línea en su código nos dice, dice, "anexando una lista vacía con otra lista produce esa lista como resultado".
Sorprendentemente, después de haber escrito estas dos leyes que debe seguir append/3
, es lo mismo que escribir la definición en sí.
además: esto lo explica desde un punto de vista declarativo; verifique an answer by m09 que lo muestre más desde el punto de vista operacional.
Oh, lo que quiero decir es, ¿cómo codigo que funcionará de manera similar como append() de prolog – Zik
Usted codifica de la misma manera que 'append' está codificada? Ya descubrió la implementación (son las primeras dos líneas de código en su pregunta). – aioobe