Optimización Automática de Programas (OAP) Examen Final —2 de Febrero de 2007— Ejercicio 1 (Tema 2) Dadas las siguientes reglas de inferencia de tipos: 0.5 puntos 0 τ `e:t (Fun) τ ` f : t → t 0 τ ` f (e) : t (Var) τ [x 7→ t] ` x : t y el entorno τ = [f 7→ (a → b), g 7→ (c → c), x 7→ IN], donde a, b, c son variables de tipo, escribe la verificación (paso a paso) de que la sentencia τ ` f (g(x)) : Bool es correcta e indica que valor deben tener las variables de tipo a, b, c. Respuesta: Ejercicio 2 (Tema 3) Dado el siguiente programa funcional: 0.5 puntos foo x y z = if x < z then y else z boh x y = x + (x ∗ y) la expresión (foo (boh 2 3) 42 10) se evalúa a 42. Dicha computación se representa en el λ-cálculo extendido ası́: (((λ x. λ y. λ z. if x < z then y else z) (((λ x. λ y. x + (x ∗ y)) 2) 3)) 42) 10 Escribe la secuencia de reducciones que llevan al resultado de su evaluación. Indica, para cada paso, la regla empleada (α, β, δ o condicional, puedes ignorar el resto) y subraya el subtérmino que se reduce. Respuesta: 1 Ejercicio 3 (Tema 4) La siguiente función: 1.5 puntos f x y = g (h (s x) x) y se representa mediante la expresión: (define (f x y) (call g (call h (call s x) x) y)) Dado el entorno τ = (D, S)—es decir, x es dinámica e y es estática—calcula el resultado de Be [[call g (call h (call s x) x) y]] τ Escribe la reducción completa y subraya la subexpresión (o subexpresiones) que reduces en cada paso. Nota: si en algún punto del desarrollo crees que no es necesario seguir porque el resultado final ya está completamente determinado, indica el por qué y no es necesario que sigas. Respuesta: 2 Ejercicio 4 (Tema 4) La siguiente función: 1.5 puntos f x y = g (h (s x) x) y se representa mediante la expresión: (define (f x y) (call g (call h (call s x) x) y)) Dado el entorno τ = (D, S)—es decir, x es dinámica e y es estática—calcula el resultado de Bv [[call g (call h (call s x) x) y]] τ g Escribe la reducción completa y subraya la subexpresión (o subexpresiones) que reduces en cada paso. Respuesta: 3 Ejercicio 5 (Tema 4) Considera las siguientes funciones: 2 puntos (define (f x y) (if (> x y) then (call g x y) else y)) (define (g x y) (call h x y x)) (define (h x y z) (call h x x x)) junto con el siguiente entorno inicial para la función f: (S, D). Aplica el algoritmo de BTA completo para calcular la división congruente menos dinámica. Escribe únicamente la secuencia de divisiones—es decir, la lista de valores S/D asociada a cada función—que se generan en cada iteración del algoritmo. Respuesta: Ejercicio 6 (Tema 4) Escribe la versión anotada de la siguiente función: 1 punto (define (f x y z) (if (> y z) then (if (= x 1) then x else y) else (call f (+ x 1) (call g x y) z))) teniendo en cuenta que la división computada por el BTA es: div = [f 7→ (S, D, S), g 7→ (S, S)] Nota: debéis considerar la estrategia de unfolding vista en clase, es decir, sólo se deben desplegar aquellas llamadas a función en las que todos los argumentos son estáticos. Además, no es necesario que incluyáis anotaciones con lift. Respuesta: 4 Ejercicio 7 (Tema 4) Consideremos el siguiente programa anotado: 2 puntos (define (f [x,y] []) (ifs (=s x y) then (calld g [x] [y]) else +s x (calls f [-s x 1, y]))) (define (g [x] [y]) (calls h [x,x])) (define (h [x,y] []) x) Suponiendo que el valor de los datos estáticos para la función f (es decir, la función inicial) son [2, 1], computad la evaluación parcial asociada. Concretamente, debéis escribir, para cada iteración, lo siguiente: el par (f, vs) seleccionado, la definición producida (newdef), el nuevo conjunto de funciones ya especializadas (newmarked) y el nuevo conjunto de funciones pendientes de especializar (newpending). Respuesta: 5 Ejercicio 8 (Tema 4) 1 punto Escribe un programa en el que, pese a que la especialización se realice sin proporcionar ningún dato estático, el programa especializado sea significativamente más eficiente que el programa original. Respuesta: 6