¿Cómo añado las listas en Prolog?

¿Cómo añado las listas en Prolog? He buscado en Internet y encontré esto (de http://www.csupomona.edu/~jrfisher/www/prolog_tutorial/2_7.html )

append([X|Y],Z,[X|W]) :- append(Y,Z,W). append([],X,X). 

Entonces obtiene la Z quitando los elementos de [X|Y] en [X|W] . ¿Pero cómo añado dos listas?

Ejemplo,

 appendlist([1,2],[3,4,5],X). 

El resultado será X = [1,2,3,4,5] .

Además, no sé qué está pasando en la recursión. (Lo rastreé pero no entendí)

EDITAR: Lo que quiero saber es cómo se debe codificar para que funcione como el append() predefinido append() en Prolog.

El código tal como lo has publicado es (casi) correcto. El orden de las cláusulas solo necesita ser intercambiado (para que esta definición de predicado sea productiva, cuando se usa de forma 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 agregar A y B si A y C son listas no vacías, ambas tienen la misma cabecera (es decir, el primer elemento), y la cola de C es el resultado de agregar la cola de A con el mismo segundo argumento, B .

  aa ---------- bb cc . dd ee . . 

O de izquierda a derecha:

  a | bc . | de . a | bcde . append( [], Z, Z ). append( [X | Y ], Z, [X | W ] ) :- append( Y, Z, W). 

Piénselo, tiene perfecto sentido. Lo que hace es, queremos definir la relación append/3 , y sabemos lo que queremos que sea, así que simplemente escribimos algunos hechos obvios sobre eso que queremos que cumpla, las leyes que debe seguir si será.

Entonces, asumiendo que tenemos este código ya definido para nosotros, ¿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 la segunda línea de su código nos dice, dice, “al agregar una lista vacía con otra lista se produce esa lista como resultado” .

Sorprendentemente, haber escrito estas dos leyes que debe append/3 debe seguir, es lo mismo que escribir la definición en sí misma.

Además: esto lo explica desde un punto de vista declarativo; verifique una respuesta m09 que lo muestre más desde el punto de vista operacional.

¿Pero cómo añado dos listas?

Usted respondió su propia pregunta: usted usa append/3 .

Si desea agregar X e Y y almacenar el resultado en Z , lo hace

 append(X, Y, Z) 

Si, por ejemplo, X = [1, 2] e Y = [3, 4, 5] , Z se vinculará a [1, 2, 3, 4, 5] :

 | ?- append([1,2],[3,4,5], X). X = [1,2,3,4,5] yes | ?-