Práctica Cap´ıtulo 9 –El Modelo Computacional

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