Presentación de clase

Anuncio
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
Descargar