UBA – Facultad de Ciencias Exactas y Naturales – Departamento de Computación– Algoritmos y Estructura de Datos I Parcial de Especificación– 21/04/2010 LU: Apellidos: Nombres: Aclaraciones: El parcial NO es a libro abierto. Cualquier decisión de interpretación que se tome debe ser aclarada y justificada. Para aprobar se requieren al menos 60 puntos. Entregar cada ejercicio en hoja separada. Importante: Para la resolución del parcial NO es necesario ni está permitido el uso de acum. Según una de las definiciones de la RAE, la poesı́a es el arte de componer obras poéticas en verso o en prosa. A fin de simplificar este concepto, una poesı́a se define como una secuencia de versos, donde un verso es una de las lı́neas que componen el poema. Ejemplo de un poema de 4 versos: Al olmo viejo, hendido por el rayo y en su mitad podrido, con las lluvias de abril y el sol de mayo algunas hojas verdes le han salido. (... extracto de “A un olmo seco de Campos de Castilla” - Antonio Machado) La rima es la repetición de una secuencia de fonemas o sonidos al final del verso a partir de la última vocal acentuada, incluida ésta. Si la repetición es de todos los fonemas a partir de dicho lı́mite, se denomina rima consonante; por ejemplo, en ((Todo necio / confunde valor y precio)) (Antonio Machado), la rima es consonante en -ecio, porque desde la última vocal acentuada todos los fonemas coinciden, incluida ésta. Si la repetición es sólo de las vocales a partir de dicho lı́mite, entonces se habla de rima asonante, como por ejemplo en ((Más vale pájaro en mano / que cien volando)) Debido al encargo de una editorial que publica los “poemas” de una reconocida modelo (B.F.), se decidió representar el problema de la siguiente manera: tipo Autor=String; tipo Nombre=String; tipo Pagina=Z; tipo Palabra=String; tipo Titulo=String; tipo Verso=[Palabra]; tipo Poema { observador titulo (p :Poema) : Titulo ; observador autor (p :Poema) : Autor ; observador versos (p :Poema) : [Verso] ; invariante conVerso : |versos(p)| > 0 ; invariante conPalabras : (∀v ← versos(p))|v| > 0 ; } tipo Libro { observador nombre (l :Libro) : Nombre ; observador autores (l :Libro) : [Autor] ; observador poemas (l :Libro, a: Autor) : [Poema] ; requiere autorEsDelLibro : a ∈ autores(l) ; observador paginas (l :Libro, t: Titulo) : [Pagina] ; requiere tituloEsDelLibro : t ∈ titulos(l) ; invariante sinAutoresRepe : sinRepetidos(autores(l)) ; invariante sinTitulosRepe : sinRepetidos(titulos(l)) ; invariante sonAutores : mismosAutores(l) ; invariante poemasDeAutor : (∀a ← autores(l)) sonP oemasDeAutor(l, a) ; invariante pagExiste : (∀t ← titulos(l))|paginas(l, t)| > 0 ; invariante pagPoemaConsec : (∀t ← titulos(l))pagConsecutivas(l, t) ; invariante pagNoSeSolapan : sinRepetidos(todasLasP aginas(l)) ; invariante pagLibroConsec : pagLibroConsec(l) ; } aux eliminarRepetidos (l : [T]) : [T] = [li |i ← [0..|l|), li ∈ / l[0..i) ] ; aux max (xs:[Z]) : Z = cab[x|x ← xs, (∀y ← xs)x ≥ y] ; aux mismosAutores (l:Libro) : Bool = mismos(autores(l), eliminarRepetidos([autor(p)|p ← todosLosP oemas(l)]) ; aux pagConsecutivas (l:Libro, t:Titulo) : Bool = (∀i ← (0..|paginas(l, t)|)paginas(l, t)i == paginas(l, t)i−1 + 1 ; aux pagLibroConsec (l:Libro) : Bool = (∀p1 ← todasLasP aginas(l), p1 6= max(todasLasP aginas(l))) (∃p2 ← todasLasP aginas(l))p1 + 1 == p2 ; aux sinRepetidos (l : [T]) : Bool = (∀i ← [0..|l|)) li ∈ / l(i..|l|) ; aux sonPoemasDeAutor (l : Libro, a: Autor) : Bool = (∀p ← poemas(l, a))autor(p) == a ; aux titulos (l:Libro) : [Titulo] = [titulo(p)|a ← autores(l), p ← poemas(l, a)] ; aux todasLasPaginas (l:Libro) : [Pagina] = concat([paginas(l, t)|t ← titulos(l)]) ; aux todosLosPoemas (l:Libro) : [Poema] = [p|a ← autores(l), p ← poemas(l, a)] ; Adicionalmente, puede suponer que cuenta con las siguientes funciones auxiliares: aux rimaConsonante(p1,p2: Palabra):Bool que devuelven verdadero si los fonemas p1 y p2 tienen rima consonante. aux rimaAsonante (p1,p2: Palabra):Bool que devuelven verdadero si los fonemas p1 y p2 tienen rima asonante. Ejercicio 1. [30 puntos] a) [20 p.] Completar el tipo Libro, agregando el invariante noHayP lagio, que indica que en el libro no hay poemas plagiados. Un poema “A” es plagio de otro “B” si y sólo si i) tienen distintos autores y ii) más del 50 % de los versos de “A” pertenecen a “B”. b) [10 p.] Escribir una función auxiliar aux constanteYSonante (l:Libro):[(Autor,[Poema])] que toma un Libro y devuelve la lista de Autores (sin repetidos) con la lista de sus poemas que tienen rima constante. Se dice que un poema tiene rima constante si TODOS sus versos tienen la misma rima (es decir, siempre consonante o siempre asonante). Ejercicio 2. [30 puntos] Especificar el problema agregarPoema (l:Libro,p:Poema, k:Z) . Este problema sólo modifica el libro l, agregando el poema p al final del libro. k representa a la cantidad de páginas que ocupa el poema. Ejercicio 3. [25 puntos] Especificar el problema grandesExitos (ls:[Libro], a:Autor) = result : (Libro,Z) Este problema devuelve, en la primer componente de la tupla, un nuevo libro con los grandes éxitos del autor a. Un poema pertenece al libro de grandes éxitos si y solo si pertenece al autor a y además fue publicado en más de un libro de la lista ls. La cantidad de hojas que ocupa un poema p en el libro de grandes éxitos, es la mı́nima cantidad de hojas que ocupa ese poema en los libros de ls. El nombre del nuevo libro deberá ser “Grandes Éxitos”. En la segunda componente de la tupla se debe devolver la cantidad de páginas del nuevo libro. (Nota: Observar que debiera ser requisito para la resolución de este problema que exista al menos un gran éxito en ls) Ejercicio 4. [15 puntos] (Ejercicio 16.6 de la práctica 4) Especificar el problema separar (l:[T], delim:T) = result : [[T]] que devuelve la lista resultante de separar l en cada posición donde aparece el delimitador delim (y eliminar dicho delimitador). Por ejemplo, problema separar([’h’,’o’,’l’,a’,’;’,’a’,’m’,’i’,’g’,’o’,’;’,’v’,’e’,’n’], ’;’)= [[’h’,’o’,’l’,a’],[’a’,’m’,’i’,’g’,’o’],[’v’,’e’,’n’]] .