programacion - ¿Cómo agrego listas en Prolog?
predicados en prolog (2)
Pero, ¿cómo agrego dos listas juntas?
Respondiste tu propia pregunta: usas append/3
.
Si desea adjuntar 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]
entonces Z
unirá a [1, 2, 3, 4, 5]
:
| ?- append([1,2],[3,4,5], X).
X = [1,2,3,4,5]
yes
| ?-
¿Cómo agrego 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
eliminando los elementos de [X|Y]
en [X|W]
. Pero, ¿cómo agrego dos listas juntas?
Ejemplo,
appendlist([1,2],[3,4,5],X).
El resultado será X = [1,2,3,4,5]
.
Tampoco sé qué pasa en la recursión. (Lo rastreé pero no entendí)
EDITAR: Lo que quiero saber es cómo debe codificarse para que funcione como el append()
predefinido append()
en Prolog.
El código como lo ha publicado es (casi) OK. El orden de las cláusulas solo necesita ser cambiado (para que esta definición de predicado sea productiva, cuando se usa 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
La primera línea dice: " C
es el resultado de anexar A
y B
si A
y C
no son listas vacías, ambas tienen la misma cabeza (es decir, el primer elemento), y la cola de C
es el resultado de anexar la cola de A
con el mismo 2do argumento, B
" .
a a
----------
b b
c c
. d d
e e
. .
O de izquierda a derecha:
a | b c .
| d e .
a | b c d e .
append( [],
Z,
Z ).
append( [X | Y ],
Z,
[X | W ] ) :- append(
Y, Z, W).
Piénsalo, tiene perfecto sentido. Lo que hace es, queremos definir la relación append/3
, y sabemos lo que queremos que sea, por lo que solo escribimos algunos datos obvios que queremos que cumplan, las leyes que debe cumplir si usted será.
Entonces, asumiendo que ya tenemos este código definido para nosotros, ¿qué leyes debe cumplir? Obviamente, agregar una cola de una lista con otra lista nos da una cola del resultado de 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 más que 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, nos da esa lista como resultado. Obviamente. Y eso es lo que nos dice esa segunda línea en su código, dice, "agregar una lista vacía con otra lista produce esa lista como resultado" .
Sorprendentemente, haber escrito estas dos leyes que deben ir append/3
, es lo mismo que escribir la definición en sí.
Además: esto lo explica desde un punto de vista declarativo; verifique una respuesta por m09 que lo muestre más desde el punto de vista operativo.