Está en la página 1de 3

Uso de listas en Prolog Abdiel E.

Caceres Gonzalez (recopilador) Instituto Tecnologico de Monterrey campus Ciudad de Mexico Abstract Este documento es un resumen del uso de listas en Prolog, se pretende que sea una guia rapida 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 atomo o una lista, pero a n 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 vaca (4) L=[] (a) cabeza= NO (b) cola=*+ la lista vaca 12 Manejo del contenido de las listas

En esta seccion se vera 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 vericaci 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 vaca. Pero esto solamente nos asegura la pertenencia de la cabeza de la lista, no si un elemento esta dentro de ella. Para esto se necesita una segunda clausula 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 verica 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 denir otras reglas utiles Consideremos esta pequena 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 aleman, 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). Ademas, podemos saber si un atomo es un perro siempre tiene una raza (aunque sea corriente) as que podemos denir una regla para saber si un

elemento es uno de los perros que hemos denido: perro(R):-perros(_,L), pertenece(R,L). 2Con la consulta :-perro(X). podemos determinar todos los perros que hemos denido. 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 Union 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 respuesta L = [a, b, c, d, e, f]. 4.1 Como obtener el nesimo elemento de una lista Esto se puede lograr eliminando recursivamente n elementos de una lista, la variable E controla el numero de elementos que se han eliminado. Cuando R=1, entonces X se asigna al enesimo 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] Introduccion a los lenguajes PROLOG y LISP; Vazquez, Gomez, Matus y Mnjarez. IPN 1999

También podría gustarte