You are on page 1of 3

Uso de listas en Prolog

Abdiel E. Cáceres González (recopilador)

Instituto Tecnológico de Monterrey


campus Ciudad de México

Abstract

Este documento es un resumen del uso de listas en Prolog, se pretende que sea una
guia rápida y de uso frecuente para los usuarios e interesados en el uso de Prolog.

1 Estructura de una lista

Una lista en Prolog (como en casi cualquier lenguaje que use listas) se divide
en dos partes:

(1) Cabeza. Es el primer elemento de la lista. Puede ser un átomo o una


lista, pero a fin de cuentas es el primer elemento de la lista original.
(2) Cola. Es el resto de los elementos de una lista, es de nuevo una lista.

Ejemplos:

(1) L=[perro, gato, raton, queso]


(a) cabeza= perro
(b) cola=[gato, raton, queso]
(2) L=[[perro, gato], [raton, queso]]
(a) cabeza=[perro, gato]
(b) cola=[[raton, queso]]
(3) L=[perro]
(a) cabeza=perro
(b) cola=[] la lista vacı́a
(4) L=[]
(a) cabeza= NO
(b) cola=[] la lista vacı́a

1
2 Manejo del contenido de las listas

En esta sección se verá el uso de las listas para determinar la existencia de un


elemento en la lista e incluso el uso de recursividad.

En primer lugar, la existencia de un elemento en la lista se puede verificaci


con una regla como: pertenece(E,L):-L=[E| ]. Que dice que el elemento E
pertenece a la lista L si L se puede hacer teniendo una lista cuya cabeza sea E
y cualquier cola, incluso la lista vacı́a.

Pero esto solamente nos asegura la pertenencia de la cabeza de la lista, no si


un elemento está dentro de ella. Para esto se necesita una segunda cláusula
recursiva: pertenece(E,[ |T]):-pertenece(E,T). Es decir “un elemento E
pertenece a una lista compuesta de cualquier cabeza y una cola T, si ese mismo
elemento E es la cabeza del resto de la lista T”.

Ası́ se tiene el siguiente programa en Prolog que verifica la pertenencia de un


elemento en una lista:

pertenece(E,L):-L=[E|_].
pertenece(E,[_|T]):-pertenece(E,T).

:-pertenece(E,[a,b,c,d,e].)

3 Uso de la pertenencia para definir otras reglas útiles

Consideremos esta pequeña base de reglas:

perros(pastor_aleman, [juli, esteban, pancho]).


perros(san_bernardo, [master, rigan, mujamad]).
perros(french_poodle, [figaro, piojo, ramiro]).

Para determinar la raza de determinado perro y ubicarlo como pastor alemán,


san bernardo o french poodle, primero es necesario establecer la raza y despues
buscar en la lista de esa raza a ese perro.

pastor_aleman(P):-perros(pastor_aleman, L), pertenece(P,L).

Además, podemos saber si un átomo es un perro siempre tiene una raza


(aunque sea corriente) ası́ que podemos definir una regla para saber si un
elemento es uno de los perros que hemos definido:

perro(R):-perros(_,L), pertenece(R,L).

2
Con la consulta :-perro(X). podemos determinar todos los perros que hemos
definido. Enseguida el programa completo.

perros(pastor_aleman, [juli, esteban, pancho]).


perros(san_bernardo, [master, rigan, mujamad]).
perros(french_poodle, [figaro, piojo, ramiro]).
pertenece(E,L):-L=[E|_].
pertenece(E,[_|T]):-pertenece(E,T).
pastor_aleman(P):-perros(pastor_aleman, L), pertenece(P,L).
raza(R):-perros(_,L), pertenece(R,L).

4 Unión de listas

Se quiere unir las listas [a,b,c] y [d,e,f] para obtener la lista [a,b,c,d,e,f].
Una manera de hacerlo es:

agregar([],L,L).
agregar([X|L1],L2,[X|L3]):-agregar(L1,L2,L3).

Con una consulta como: :-agegar([a,b,c],[d,e,f],L), obtendremos la re-


spuesta L = [a, b, c, d, e, f].

4.1 Cómo obtener el n−ésimo elemento de una lista

Esto se puede lograr eliminando recursivamente n elementos de una lista, la


variable E controla el número de elementos que se han eliminado. Cuando R=1,
entonces X se asigna al enésimo elemento.

enesimo(X,1,[X|_]).
enesimo(X,N,[_|L]):-R is N-1, enesimo(X,R,L).

Ası́ en la consulta :-enesimo(X,3,[a,b,c,d]), se obtiene la respuesta X=c.

References

[vgmm99] Introducción a los lenguajes PROLOG y LISP; Vázquez, Gómez,


Matus y Mı́ınjarez. IPN 1999

You might also like