Programación Lógica Listas Preparado por: Cecilia Curlango Rosas Agenda ● Definir listas como una estructura de datos empleada ampliamente en la lingüistica computacional. Preparado por: Cecilia Curlango Rosas Agenda ● ● Definir listas como una estructura de datos empleada ampliamente en la lingüistica computacional. Definir el predicado miembro/2, herramienta fundamental de Prolog para la manipulación de listas. Preparado por: Cecilia Curlango Rosas Agenda ● ● ● Definir listas como una estructura de datos empleada ampliamente en la lingüistica computacional. Definir el predicado miembro/2, herramienta fundamental de Prolog para la manipulación de listas. Introducir la idea de recorrer listas recursivamente. Preparado por: Cecilia Curlango Rosas Definición Una lista es una secuencia finita de elementos. Preparado por: Cecilia Curlango Rosas Ejemplos de listas en Prolog [maria, raul, julio, yolanda] [jose, hija(blanca, paty), X, 2, miguel] [] [ mickey, [hugo, paco, luis], [goofy, personaje(disney)] ] Preparado por: Cecilia Curlango Rosas Características de listas 1. Una lista se especifica colocando los elementos de la lista entre corchetes. [ ] Preparado por: Cecilia Curlango Rosas Características de listas 1. Una lista se especifica colocando los elementos de la lista entre corchetes. [ ] 2. La longitud de la lista es el número de elementos que tiene. Preparado por: Cecilia Curlango Rosas Características de listas 1. Una lista se especifica colocando los elementos de la lista entre corchetes. [ ] 2. La longitud de la lista es el número de elementos que tiene. 3. Una lista puede tener distintos tipos de elementos. Preparado por: Cecilia Curlango Rosas Características de listas 1. Una lista se especifica colocando los elementos de la lista entre corchetes. [ ] 2. La longitud de la lista es el número de elementos que tiene. 3. Una lista puede tener distintos tipos de elementos. 4. Una lista puede tener elementos repetidos. Preparado por: Cecilia Curlango Rosas Características de listas 5. Un tipo especial de lista es la lista vacia. Su longitud es cero y no tiene elementos. Preparado por: Cecilia Curlango Rosas Características de listas 5. Un tipo especial de lista es la lista vacia. Su longitud es cero y no tiene elementos. 6. Una lista puede contener otra lista. Ésto es un ejemplo de una estructura de datos recursiva. Preparado por: Cecilia Curlango Rosas Características de listas 7. Una lista que no está vacia tiene dos partes: la cabeza y la cola. Preparado por: Cecilia Curlango Rosas Características de listas 7. Una lista que no está vacia tiene dos partes: la cabeza y la cola. La cabeza es el primer elemento de la lista. Preparado por: Cecilia Curlango Rosas Características de listas 7. Una lista que no está vacia tiene dos partes: la cabeza y la cola. La cabeza es el primer elemento de la lista. La cola es lo que queda al quitar la cabeza y siempre es una lista. Preparado por: Cecilia Curlango Rosas Ejercicio [maria, raul, julio, yolanda] ● ¿Qué longitud tiene la lista? ● ¿Cuál es la cabeza de la lista? ● ¿Cuál es la cola? Preparado por: Cecilia Curlango Rosas Ejercicio [maria, raul, julio, yolanda] ● ¿Qué longitud tiene la lista? 4 ● ¿Cuál es la cabeza de la lista? maria ● ¿Cuál es la cola? [raul, julio, yolanda] Preparado por: Cecilia Curlango Rosas Ejercicio [jose, hija(blanca, paty), X, 2, miguel] ● ¿Qué longitud tiene la lista? ● ¿Cuál es la cabeza de la lista? ● ¿Cuál es la cola? Preparado por: Cecilia Curlango Rosas Ejercicio [jose, hija(blanca, paty), X, 2, miguel] ● ¿Qué longitud tiene la lista? 5 ● ¿Cuál es la cabeza de la lista? jose ● ¿Cuál es la cola? [hija(blanca,paty), X, 2, miguel] Preparado por: Cecilia Curlango Rosas Ejercicio [ ] ● ¿Qué longitud tiene la lista? ● ¿Cuál es la cabeza de la lista? ● ¿Cuál es la cola? Preparado por: Cecilia Curlango Rosas Ejercicio [ ] ● ¿Qué longitud tiene la lista? 0 ● ¿Cuál es la cabeza de la lista? no tiene ● ¿Cuál es la cola? no tiene Preparado por: Cecilia Curlango Rosas Ejercicio [ mickey, [hugo, paco, luis], [goofy, personaje(disney)] ] ● ¿Qué longitud tiene la lista? ● ¿Cuál es la cabeza de la lista? ● ¿Cuál es la cola? Preparado por: Cecilia Curlango Rosas Ejercicio [ mickey, [hugo, paco, luis], [goofy, personaje(disney)] ] ● ¿Qué longitud tiene la lista? 3 ● ¿Cuál es la cabeza de la lista? mickey ● ¿Cuál es la cola? [[hugo, paco, luis], [goofy, personaje(disney)]] Preparado por: Cecilia Curlango Rosas Operador para Listas El operador | (pipe) se usa para separar la cabeza y la cola de una lista. Preparado por: Cecilia Curlango Rosas Ejemplo ?­ [Cabeza | Cola] = [maria, jose, hugo, paco]. Cabeza = maria. Cola = [jose, hugo, paco]. Yes Preparado por: Cecilia Curlango Rosas Ejemplo ?­ [H|T] = []. No Preparado por: Cecilia Curlango Rosas Ejemplo ?­ [X|Y] = [[], muerto(pedro), [2,[b,taco]], [], Z]. X = [] Y = [muerto(pedro), [2, [b, taco]], [], _G209] Z = _G209 Yes Preparado por: Cecilia Curlango Rosas Ejemplo ?­ [X,Y | W] = [[], muerto(pedro), [2,[b,taco]], [], Z]. X = [] Y = muerto(pedro) W = [ [2, [b, taco]], [], _G219] Z = _G219 Yes Preparado por: Cecilia Curlango Rosas Variable anonima _ El símbolo de subrayado _ (chaparro para sus amigos) es la variable anonima. Se utiliza cuando se necesita una variable pero no interesa el valor al cual Prolog la instancia. Cada instancia de _ es independiente, es decir, cada una vale algo distinto. Preparado por: Cecilia Curlango Rosas Ejemplo ?­ [ X1, X2, X3, X4|Cola ] = [[], muerto(pedro), [2,[b,taco]], [], Z]. X1 = [] X2 = muerto(pedro) X3 = [2, [b, taco]] X4 = [] Cola = [_G218] Z = _G218 Yes Preparado por: Cecilia Curlango Rosas Ejemplo ?­ [ X1, X2, X3, X4|Cola ] = [[], muerto(pedro), [2,[b,taco]], [], Z]. X1 = [] X2 = muerto(pedro) X3 = [2, [b, taco]] X4 = [] Cola = [_G218] Z = _G218 ¿Qué sucede si solo nos interesan el segundo y cuarto valor (X2 y X4)? Yes Preparado por: Cecilia Curlango Rosas Ejemplo ?­ [ _, X2, _, X4|_ ] = [[], muerto(pedro), [2,[b,taco]], [], Z]. X2 = muerto(pedro) X4 = [] Z = _G218 Yes ¿Qué sucede si solo nos interesan el segundo y cuarto valor (X2 y X4)? Sustituimos las variables que no nos interesan por la variable anonima. Preparado por: Cecilia Curlango Rosas Listas como Estructuras de Datos componente(computadora, [cpu, monitor, teclado]). componente(cpu, [motherboard, tarjetas, drives]). componente(teclado, [alfabeticas, numericas, control]). componente(tarjetas, [television, adquisicion, wireless]). componente(motherboard, [ram, rom, video, red]). Preparado por: Cecilia Curlango Rosas Miembros de una Lista Una de las operaciones básicas que se realizan con listas es determinar si un elemento pertenece a una lista. Puede definirse una regla recursiva que indique si un elemento pertenece o no a una lista. Preparado por: Cecilia Curlango Rosas Miembros de una Lista Una de las operaciones básicas que se realizan con listas es determinar si un elemento pertenece a una lista. Puede definirse una regla recursiva que indique si un elemento pertenece o no a una lista. miembro(X, [X|T]). miembro(X, [H|T]) :­ miembro(X,T). Preparado por: Cecilia Curlango Rosas Miembros de una Lista miembro(X, [X|T]). miembro(X, [H|T]) :­ miembro(X,T). El objeto X es un miembro de una lista si es la cabeza de la lista. Preparado por: Cecilia Curlango Rosas Miembros de una Lista miembro(X, [X|T]). miembro(X, [H|T]) :­ miembro(X,T). El objeto X es un miembro de una lista si es la cabeza de la lista. Un objeto X es un miembro de una lista si es un miembro de la cola de esa lista. Preparado por: Cecilia Curlango Rosas Miembros de una Lista Usando la variable anonima _ pueden eliminarse las variables que no nos interesan. miembro(X,[X|_]). miembro(X,[_|T]):-miembro(X,T). Preparado por: Cecilia Curlango Rosas Miembros de una Lista Usando la variable anonima _ pueden eliminarse las variables que no nos interesan. miembro(X,[X|_]). miembro(X,[_|T]):-miembro(X,T). Preparado por: Cecilia Curlango Rosas Ejemplo 1 miembro(X,[X|_]). miembro(X,[_|T]):-miembro(X,T). miembro(yolanda, [yolanda, jose, julio,eva]). Preparado por: Cecilia Curlango Rosas Ejemplo 1 miembro(X,[X|_]). miembro(X,[_|T]):-miembro(X,T). miembro(yolanda, [yolanda, jose, julio,eva]). Yes Preparado por: Cecilia Curlango Rosas Ejemplo 2 miembro(X,[X|_]). miembro(X,[_|T]):-miembro(X,T). miembro(julio, [yolanda, jose, julio,eva]). miembro(julio, [jose, julio,eva]). Preparado por: Cecilia Curlango Rosas Ejemplo 2 miembro(X,[X|_]). miembro(X,[_|T]):-miembro(X,T). miembro(julio, [yolanda, jose, julio,eva]). miembro(julio, [jose, julio,eva]). miembro(julio, [julio,eva]). Preparado por: Cecilia Curlango Rosas Ejemplo 2 miembro(X,[X|_]). miembro(X,[_|T]):-miembro(X,T). miembro(julio, [yolanda, jose, julio,eva]). miembro(julio, [jose, julio,eva]). miembro(julio, [julio,eva]). Yes Preparado por: Cecilia Curlango Rosas Ejemplo 3 miembro(X,[X|_]). miembro(X,[_|T]):-miembro(X,T). miembro(pepe, [yolanda, jose, julio,eva]). Preparado por: Cecilia Curlango Rosas Ejemplo 3 miembro(X,[X|_]). miembro(X,[_|T]):-miembro(X,T). miembro(pepe, [yolanda, jose, julio,eva]). miembro(pepe, [jose, julio,eva]). Preparado por: Cecilia Curlango Rosas Ejemplo 3 miembro(X,[X|_]). miembro(X,[_|T]):-miembro(X,T). miembro(pepe, [yolanda, jose, julio,eva]). miembro(pepe, [jose, julio,eva]). miembro(pepe, [julio,eva]). Preparado por: Cecilia Curlango Rosas Ejemplo 3 miembro(X,[X|_]). miembro(X,[_|T]):-miembro(X,T). miembro(pepe, [yolanda, jose, julio,eva]). miembro(pepe, [jose, julio,eva]). miembro(pepe, [julio,eva]). miembro(pepe, [eva]). Preparado por: Cecilia Curlango Rosas Ejemplo 3 miembro(X,[X|_]). miembro(X,[_|T]):-miembro(X,T). miembro(pepe, [yolanda, jose, julio,eva]). miembro(pepe, [jose, julio,eva]). miembro(pepe, [julio,eva]). miembro(pepe, [eva]). miembro(pepe, []). Preparado por: Cecilia Curlango Rosas Ejemplo 3 miembro(X,[X|_]). miembro(X,[_|T]):-miembro(X,T). miembro(pepe, [yolanda, jose, julio,eva]). miembro(pepe, [jose, julio,eva]). miembro(pepe, [julio,eva]). miembro(pepe, [eva]). miembro(pepe, []). X No Preparado por: Cecilia Curlango Rosas Miembros de una Lista La función miembro/2 también puede utilizarse para obtener los miembros de una lista. ?- miembro(M,[yolanda,jose,julio,eva]). M = yolanda ; M = jose ; M = julio ; M = eva ; No Preparado por: Cecilia Curlango Rosas Miembros de una Lista SWI­Prolog cuenta con una función integrada member/2 que tiene el mismo comportamiento que miembro/2. ?- member(M,[yolanda,jose,julio,eva]). M = yolanda ; M = jose ; M = julio ; M = eva ; No La referencia a esta función en el manual de SWI­Prolog puede consultarse en: http://gollem.science.uva.nl/SWI­Prolog/Manual/lists.html#member/2 Preparado por: Cecilia Curlango Rosas Recorrido Recursivo de Listas Los recorridos recursivos de listas son muy comunes en Prolog. Algunas de sus aplicaciones son: ● Comparar una lista con otra. ● Copiar parte de una lista a otra. ● Traducir el contenido de una lista a otra. Preparado por: Cecilia Curlango Rosas Ejemplo a2b/2 ⇒Recorre 2 listas e indica si ambas listas tienen la misma cantidad de a's y b's. Preparado por: Cecilia Curlango Rosas Ejemplo a2b/2 ⇒Recorre 2 listas e indica si ambas listas tienen la misma cantidad de a's y b's. ● Paso base. La lista mas corta de a's y b's es la lista vacia. a2b([],[]). Preparado por: Cecilia Curlango Rosas Ejemplo a2b/2 ⇒Recorre 2 listas e indica si ambas listas tienen la misma cantidad de a's y b's. ● ● Paso base. La lista mas corta de a's y b's es la lista vacia. a2b([],[]). Paso recursivo. El 1er elemento de una lista es a, el 1er elemento de la otra lista es b y sus colas tienen la misma cantidad de a's y b's. a2b([a|Ta],[b|Tb]):-a2b(Ta,Tb). Preparado por: Cecilia Curlango Rosas Ejemplo a2b/2 ⇒Recorre 2 listas e indica si ambas listas tienen la misma cantidad de a's y b's. ● ● Paso base. La lista mas corta de a's y b's es la lista vacia. a2b([],[]). Paso recursivo. El 1er elemento de una lista es a, el 1er elemento de la otra lista es b y sus colas tienen la misma cantidad de a's y b's. a2b([a|Ta],[b|Tb]):-a2b(Ta,Tb). Preparado por: Cecilia Curlango Rosas Ejemplo a2b/2 ⇒Recorre 2 listas e indica si ambas listas tienen la misma cantidad de a's y b's. ● ● Paso base. La lista mas corta de a's y b's es la lista vacia. a2b([],[]). Paso recursivo. El 1er elemento de una lista es a, el 1er elemento de la otra lista es b y sus colas tienen la misma cantidad de a's y b's. a2b([a|Ta],[b|Tb]):-a2b(Ta,Tb). Preparado por: Cecilia Curlango Rosas Ejercicio ¿Qué responde Prolog a las siguientes preguntas? ● a2b([a,a,a],[b,b,b]). ● a2b([a,a,a,a],[b,b,b]). ● a2b([a,c,a,a],[b,b,5,4]). ● a2b([a,a,a],X). ● a2b(U,[b,b,b,b]). ● a2b(X,Y). Preparado por: Cecilia Curlango Rosas Ejercicio I. Escriba el predicado conjunto/1 que regrese verdadero cuando la lista que recibe como argumento sea un conjunto. II. Escriba el predicado subconjunto/2 que tome dos listas como argumentos y regrese verdadero cuando la primer lista es un subconjunto de la segunda. Preparado por: Cecilia Curlango Rosas Ejercicio III. Escriba el predicado superconjunto/2 que tome dos listas como argumentos y regrese verdadero cuando la primer lista es un superconjunto de la segunda. Preparado por: Cecilia Curlango Rosas