Universidad Simón Bolívar Departamento de Computación y Tecnología de la Información CI2612 – Algoritmos y Estructuras II Enero-Abril 2010 Carnet: Nombre: Examen Parcial I (40 puntos) Antes de empezar, revise bien el examen, el cual consta de tres preguntas. Pregunta 0 Pregunta 1 Pregunta 2 Total 6 puntos 6 puntos 28 puntos 40 puntos Pregunta 0 — 6 puntos En relación con el texto sobre tipos abstractos de datos (TADs) de Barbara Liskov (con John Guttag), “Program Development in Java – Abstraction, Specification, and Object-Oriented Design”, responda las siguientes preguntas: 0.0 Indique brevemente si el estilo utilizado para la especificación de TADs es algebraico o basado en modelos, y si tales especificaciones se presentan por medio de lenguaje natural, lenguaje matemático, lenguaje de programación, o alguna combinación de estos. Utilice el ejemplo principal de especificación de TAD usado en el texto, la especificación de IntSet, para ilustrar su respuesta. 0.1 Liskov sugiere que la “abstraction function” y la “representation invariant” sean implementadas para mejorar la confiabilidad de los programas. Explique muy brevemente qué son estas dos componentes y cómo sugiere Liskov implementarlas. Pregunta 1 — 6 puntos En esta pregunta trabajaremos con una especificación algebraica de un tipo abstracto de datos (TAD) para manejar multiconjuntos. Nuestro TAD estará parametrizado, como de costumbre, con el tipo T de los elementos a ser contenidos en los multiconjuntos. Las operaciones a considerar son las siguientes: (i) vacio, que crea un multiconjunto vacío; (ii) agregar, que permite agregar un elemento a un multiconjunto; (iii) eliminarUna, que permite eliminar una ocurrencia de un elemento de un multiconjunto; (iv) eliminarTodas, que permite eliminar completamente un elemento de un multiconjunto (lo cual quiere decir que desaparecen todas las ocurrencias del elemento en cuestión); y (v) pertenencia, que permite determinar si un elemento está o no en el multiconjunto (independientemente de cuántas ocurrencias del elemento hay). Veamos parte de la especificación algebraica: Especificación Algebraica de TAD Mcjto (T ) Operaciones vacio : Mcjto(T ) agregar : T × Mcjto(T ) → Mcjto(T ) eliminarUna : T × Mcjto(T ) → Mcjto(T ) eliminarTodas : T × Mcjto(T ) → Mcjto(T ) pertenencia : T × Mcjto(T ) → boolean Axiomas pertenencia(x, vacio) = false pertenencia(x, agregar(x, m)) = true pertenencia(x, agregar(y, m)) = pertenencia(x, m) .. . si x 6= y Fin TAD Se desea que Ud. complete esta especificación, indicando axiomas que describan el comportamiento de las operaciones eliminarUna y eliminarTodas. Considere que ambas operaciones de eliminación son aplicables a cualquier multiconjunto. En caso de que estas operaciones sean aplicadas a un multiconjunto que no contenga ninguna ocurrencia del elemento al que se le desea eliminar una ocurrencia o todas las ocurrencias, el resultado será el mismo multiconjunto original. Note que, como todo multiconjunto puede ser expresado sólo en términos de vacio y agregar, en los axiomas de pertenencia bastó describir la interacción entre pertenencia y estas dos operaciones. Lo mismo bastará para los axiomas restantes requeridos; esto es, bastará describir la interacción de eliminarUna y eliminarTodas con vacio y agregar. Pregunta 2 — 28 puntos Se quiere construir un tipo de datos que permita almacenar información sobre compromisos en un planificador. Éste permite planificar actividades para exactamente N días; en el caso más común de un planificador anual, N sería 365. Cada una de las actividades almacenadas puede ocurrir una o más veces, y en cada uno de los días contemplados por el planificador pueden estar programadas cero o más actividades. Llamaremos compromiso a la planificación de una actividad en una fecha determinada. Cada planificador permite almacenar información de hasta M compromisos. A continuación presentamos una especificación de un tipo abstracto de datos (TAD) diseñado para almacenar la información de compromisos programados. En esta especificación, la información sobre las actividades almacenadas se modela mediante un conjunto de Strings, mientras que la información sobre las fechas en las que ocurre cada actividad (esto es, compromisos) estará representada mediante una relación entre actividades y números naturales. Cada una de las fechas del período a planificar será representada por medio de un número natural, con el natural 0 representando el primer día del período, y N − 1 representando el último. Restringiremos nuestra atención sólo a las siguientes operaciones del TAD: (i) agregarCompromiso, que dadas la actividad y la fecha de un compromiso permite almacenar a éste en el planificador; el compromiso puede estar ya previamente almacenado, en cuyo caso no hace falta agregar información nueva al planificador, y si el compromiso es nuevo debe haber espacio disponible para almacenar a éste; (ii) hayCompromisos, que dada una fecha determina si hay algún compromiso asociado a ésta almacenado en el planificador; y (iii) eliminarActividad, que dada una actividad permite eliminar todos los compromisos asociados a ésta que estén almacenados en el planificador, aun cuando no haya ningún compromiso asociado a la actividad dada, en cuyo caso el planificador no es modificado. Continúa. . . Veamos entonces la especificación con modelo abstracto de nuestro TAD: Especificación A de TAD Planificador Modelo de Representación const N, M : int var act : set(String) compr : String ↔ int Invariante de Representación N >0 ∧ M >0 ∧ ( ∀x : x ∈ ran(compr) : 0 6 x < N ) ∧ dom(compr) = act ∧ # compr 6 M Operaciones .. . proc agregarCompromiso ( in-out p : Planificador ; in a : String ; in f : int ) { Pre : 0 6 f < p.N ∧ ((a, f ) 6∈ p.compr ⇒ # p.compr < p.M ) } { Post : p.compr = p0 .compr ∪ { (a, f ) } } proc hayCompromisos ( in p : Planificador ; in f : int ; out h : boolean ) { Pre : 0 6 f < p.N } { Post : h ≡ (f ∈ ran(p.compr)) } proc eliminarActividad ( in-out p : Planificador ; in a : String ) { Pre : true } { Post : . . . } .. . Fin TAD Continúa. . . Como primera propuesta de estructura de datos para el TAD Planificador, se sugiere un arreglo unidimensional de actividades, y un arreglo unidimensional de fechas, en donde la ocurrencia de una actividad y una fecha en una misma posición indica que la actividad está planificada para esa fecha. Veamos la nueva especificación del TAD con este modelo concreto propuesto: Especificación B de TAD Planificador , refinamiento de A Modelo de Representación const N, M : int var actividades : array [ 0..M ) of String fechas : array [ 0..M ) of int cant : int Invariante de Representación N > 0 ∧ M > 0 ∧ 0 6 cant 6 M ∧ ( ∀i, j : 0 6 i < j < cant : actividades[i] 6= actividades[j] ∨ fechas[i] 6= fechas[j] ) ∧ ( ∀i : 0 6 i < cant : 0 6 fechas[i] < N ) Relación de Acoplamiento act = { i : 0 6 i < cant : actividades[i] } ∧ compr = { i : 0 6 i < cant : ( actividades[i] , fechas[i] ) } Operaciones .. . proc agregarCompromiso ( in-out p : Planificador ; in a : String ; in f : int ) { Pre : 0 6 f < p.N ∧ . . . } { Post : . . . } proc hayCompromisos ( in p : Planificador ; in f : int ; out h : boolean ) { Pre : 0 6 f < p.N } { Post : h ≡ ( ∃ i : 0 6 i < p.cant : p.fechas[i] = f ) } proc eliminarActividad ( in-out p : Planificador ; in a : String ) { Pre : true } { Post : . . . } .. . Fin TAD Continúa. . . Con toda esta información, responda ahora las siguientes preguntas: 2.0 (6 puntos) Complete la postcondición de la operación eliminarActividad en la especificación A con modelo abstracto. 2.1 (8 puntos) Demuestre formalmente que las postcondiciones de hayCompromisos en las dos especificaciones se corresponden adecuadamente, según la noción de refinamiento de datos. 2.2 (7 puntos) En la especificación B con modelo concreto, con una buena implementación para todas las operaciones, ¿de qué orden de complejidad estima Ud. que será el tiempo de ejecución de agregarCompromiso y hayCompromisos? Utilice notación asintótica para la complejidad en términos del tamaño (actual, no máximo) del planificador, y diferencie peor y mejor caso. Explique brevemente el por qué de su respuesta según los algoritmos que utilizaría la implementación. 2.3 (7 puntos) Considere una especificación C con modelo concreto, cuyo Modelo de Representación y Relación de Acoplamiento coinciden con los dados en la especificación B, y cuyo Invariante de Representación incluye adicionalmente una condición sobre el arreglo fechas que exige que éste esté ordenado. En esta nueva especificación C, con una buena implementación para todas las operaciones, ¿de qué orden de complejidad estima Ud. que será el tiempo de ejecución de agregarCompromiso y hayCompromisos? Al igual que antes, utilice notación asintótica para la complejidad en términos del tamaño (actual, no máximo) del planificador, y diferencie peor y mejor caso. Explique brevemente el por qué de su respuesta según los algoritmos que utilizaría la implementación.