Programación II 2010 Práctica Capı́tulo 9 –El Modelo Computacional– Prof. Responsables: Federico Severino Guimpel, Natalia Colussi Auxiliares: Pablo Rodriguez Monetti, Santiago Beltramone 1. Obtener la forma canónica de la siguiente expresión 2 × cuadrado.(hd.[2, 4, 5, 6, 7, 8]), aplicando las siguientes estrategias: a) Más interna y más a la izquierda. b) Más externa y más a la izquierda. c) Orden normal optimizado con variables locales (estrategia Lazy). En cada tipo de reducción contar la cantidad de desplegados necesarios de la funciones hd y cuadrado. Comparar la eficiencia teniendo en cuenta este último valor. 2. Dada la definición linf = ˙ 1 . linf mostrar los pasos de reducción, hasta llegar a la forma canónica de la expresión: hd.linf en los siguientes casos: a) Reduciendo primero las subexpresiones más internas. b) Utilizando la estrategia de reducción normal. Comparar ambos resultados. 3. Dada la definición: f.x. 0 = ˙ x f.x.(n + 1) = ˙ cuadrado.(f.x.n) mostrar los pasos de reducción hasta llegar a la forma canónica de la expresión f. 2. 3 en los siguientes casos: a) Utilizando la estrategia de reducción normal, sin utilizar definiciones locales. b) Utilizando el modelo computacional lazy. Comparar ambos resultados. 1 Programación II 2010 4. Utilizando las definiciones por pattern matching (capı́tulo 8) para las funciones: hd, tl, last, init, ↓ (tirar), ↑ (tomar), . (idexar), . (proyección) y #(cardinalidad) evaluar las siguientes expresiones utilizando la estrategia de reducción normal. Tener en cuenta las siguientes observaciones: Para reescribir una lista utilizaremos la siguiente regla: [e0 , e1 , e2 , . . . , en−2 , en−1 ] = ˙ e0 . [e1 , e2 , . . . , en−1 ] (RL) Particularmente para las operaciones de ↓, ↑, y . (indexar) cuya definición por pattern matching esta dada tanto en las listas como en los números naturales, ajustaremos la evaluación a las coincidencias sólo en el patrón de las listas sin incluir al patrón sobre los números naturales. Para el ajuste en el patrón de las lista utilizaremos primero la regla de reescritura dada en el item anterior. Por ejemplo, la evaluación de la expresión [4, 5, 6] ↓ 2 según el orden normal resulta como se muestra a continuación: [4, 5, 6] ↓ 2 hReescritura (RL)i (4 . [5, 6]) ↓ 2 hDef. ↓ caso 3i [5, 6] ↓ 1 hReescritura (RL)i (5 . [6]) ↓ 1 hDef. ↓ caso 3i [6] ↓ 0 hDef. ↓ caso 2i [6] = = = = = a) b) c) d) e) f) g) h) hd.(([ 3, 5, 8 ], true). 0) tl.[ [ 1 ], [ 2, 3, 4 ] ] (true, last.[ 3, 4, 5 ]). 1 init.[ ‘c’,‘a’,‘s’,‘a’ ] ([ (3, 4), (5, 6), (7, 8) ]. 0). 0 init.[ 3, 4, 5, 6, 7, 8 ] ↓ 3 init.([ 3, 4, 5, 6, 7, 8 ] ↓ 3) [ 0, 1, #[1, 0, 0, 1], 0, 0, 1 ] ↑ 3 5. Utilizando las siguientes funciones inf = ˙ inf + 1 K.x.y = ˙ x doble.x = ˙ x+x f act. 0 f act.(n + 1) = ˙ = ˙ 1 (n + 1) × f act. n 2 Programación II 2010 a) Reducir hasta llegar a su forma canónica la siguiente expresión, utilizando el método computacional lazy: K.(doble.(f act. 4)).inf b) Dar una estrategia de reducción en la cual el proceso de evaluación de la expresión del apartado anterior nunca termine. 6. Reduzca la siguientes expresiones empleando las estrategias i) lazy y ii) más interna más a la izquierda: a) mayor5.cd.(head.(tail.([5, 3, 7, 1, 0] ↓ 3))) b) cd.(last.(pf s0.(init.([5, 3, 7, 1, 0]))) + 1) según las definiciones de cd, mayor5, y pf s0 que se dan a continuación: mayor5 : Nat −→ Nat mayor5.n = ˙ ( n>5 n≤5 ) → → cd : Nat −→ Nat . cd.x = x × x 5 n pf s0 : [Nat] −→ [Nat] pf s0.xs = ˙ ( hd.xs = 0 ∧ last.xs = 0 hd.xs 6= 0 ∧ last.xs = 0 hd.xs = 0 ∧ last.xs 6= 0 hd.xs 6= 0 ∧ last.xs 6= 0 ) → → → → xs [0] ++xs xs ++[0] [0] ++xs ++[0] 7. Imaginemos un lenguaje de expresiones para representar enteros definidos por las siguientes reglas sintácticas: i. cero es una expresión. ii. Si E es una expresión, entonces también lo son pred(E) y suc(E). Un evaluador reduce expresiones de este lenguaje aplicando las siguientes reglas repetidamente hasta que no puedan aplicarse más: (R1) suc(pred(E)) = E. (R2) pred(suc(E)) = E. a) Simplificar la expresión suc(pred(suc(pred(pred(cero))))). b) ¿De cuántas maneras posibles se pueden aplicar las reglas de reducción a esta expresión?. ¿Conducen todas ellas al mismo resultado final? 8. Continuando con el ejercicio anterior, supongamos que se añade una regla sintáctica adicional al lenguaje: iii. Si E1 y E2 son expresiones, entonces también lo es suma(E1 , E2 ). Las reglas de reducción correspondiente son: 3 Programación II 2010 (R3) suma(cero, E2 ) = E2 . (R4) suma(suc(E1 ),E2 ) = suc(suma(E1 , E2 )). (R5) suma(pred(E1 ),E2 ) = pred(suma(E1 , E2 )). a) Simplificar la expresión suma(suc(pred(cero)), cero). b) Contar de cuantos modos diferentes se pueden aplicar las reglas de reducción a la expresión anterior. ¿Todos ellos conducen al mismo resultado final? 4