Diferencia entre revisiones de «Primer Parcial 1er Cuat 2007 (Paradigmas)»
Línea 10: | Línea 10: | ||
compare _ MenosInf = GT | compare _ MenosInf = GT | ||
compare _ MasInf = LT | compare _ MasInf = LT | ||
b) empty = (MasInf,MenosInf) | b) empty = (MasInf,MenosInf) | ||
isEmpty (a,b) = (a==MasInf) | | (b==MenosInf) | | (a>b) | isEmpty (a,b) = (a==MasInf) | | (b==MenosInf) | | (a>b) | ||
incl (a,b) (c,d) = (isEmpty (a,b)) | | ((a>=c) && (b<=d)) | incl (a,b) (c,d) = (isEmpty (a,b)) | | ((a>=c) && (b<=d)) | ||
c) compress = foldr insert [] | c) compress = foldr insert [] | ||
where insert e r = | where insert e r = | ||
Línea 21: | Línea 21: | ||
else | else | ||
(Cte e,Cte e):r | (Cte e,Cte e):r | ||
d) No funciona asi como esta, pero si es posible hacer una. | d) No funciona asi como esta, pero si es posible hacer una. | ||
compress [] = [] | compress [] = [] | ||
Línea 28: | Línea 28: | ||
else (insert x (compress y:xs)) | else (insert x (compress y:xs)) | ||
donde insert es la misma funcion de la solucion original. | donde insert es la misma funcion de la solucion original. | ||
e) expand (Cte a, Cte b) = [a..b] | e) expand (Cte a, Cte b) = [a..b] | ||
expand (MenosInf,Cte a) = map (λx-> (-x)) [-a..] | expand (MenosInf,Cte a) = map (λx-> (-x)) [-a..] | ||
Línea 34: | Línea 34: | ||
expand (MenosInf,MasInf) = 0:[x*s | x<-[1..],s<-[-1,1]] | expand (MenosInf,MasInf) = 0:[x*s | x<-[1..],s<-[-1,1]] | ||
expand _ = [] | expand _ = [] | ||
f) inters = foldr1 inter2 | f) inters = foldr1 inter2 | ||
where inter2 a b = (max (fst a) (fst b),min (snd a) (snd b)) | where inter2 a b = (max (fst a) (fst b),min (snd a) (snd b)) | ||
g) esHeap = snd.(foldBin heapInt (empty,True)) | g) esHeap = snd.(foldBin heapInt (empty,True)) | ||
where heapInt h (i,b1) (d,b2) = (h,b1 && b2 && (incl i h) && (incl d h)) | where heapInt h (i,b1) (d,b2) = (h,b1 && b2 && (incl i h) && (incl d h)) | ||
h) foldExpr f1 f2 c (Const a) = c a | h) foldExpr f1 f2 c (Const a) = c a | ||
foldExpr f1 f2 c (Op1 f e) = f1 f (foldExpr f1 f2 c e) | foldExpr f1 f2 c (Op1 f e) = f1 f (foldExpr f1 f2 c e) | ||
foldExpr f1 f2 c (Op2 f e1 e2) = f2 f (foldExpr f1 f2 c e1) (foldExpr f1 f2 c e2) | foldExpr f1 f2 c (Op2 f e1 e2) = f2 f (foldExpr f1 f2 c e1) (foldExpr f1 f2 c e2) | ||
i) eval = foldExpr id id id | i) eval = foldExpr id id id | ||
Revisión del 02:45 28 abr 2008
Ejercicio 1: Programación funcional
a) compare MenosInf MenosInf = EQ compare MasInf MasInf = EQ compare (Cte a) (Cte b) = compare a b compare MenosInf _ = LT compare MasInf _ = GT compare _ MenosInf = GT compare _ MasInf = LT
b) empty = (MasInf,MenosInf) isEmpty (a,b) = (a==MasInf) | | (b==MenosInf) | | (a>b) incl (a,b) (c,d) = (isEmpty (a,b)) | | ((a>=c) && (b<=d))
c) compress = foldr insert [] where insert e r = if (length r > 0 && value (fst (head r)) == e+1) then (Cte e,snd (head r)):(tail r) else (Cte e,Cte e):r
d) No funciona asi como esta, pero si es posible hacer una. compress [] = [] compress [x] = [(Cte x,Cte x)] compress (x:y:xs) = if (x<y-1) then ((Cte x,Cte x):(compress (y:xs))) else (insert x (compress y:xs)) donde insert es la misma funcion de la solucion original.
e) expand (Cte a, Cte b) = [a..b] expand (MenosInf,Cte a) = map (λx-> (-x)) [-a..] expand (Cte a,MasInf) = [a..] expand (MenosInf,MasInf) = 0:[x*s | x<-[1..],s<-[-1,1]] expand _ = []
f) inters = foldr1 inter2 where inter2 a b = (max (fst a) (fst b),min (snd a) (snd b))
g) esHeap = snd.(foldBin heapInt (empty,True)) where heapInt h (i,b1) (d,b2) = (h,b1 && b2 && (incl i h) && (incl d h))
h) foldExpr f1 f2 c (Const a) = c a foldExpr f1 f2 c (Op1 f e) = f1 f (foldExpr f1 f2 c e) foldExpr f1 f2 c (Op2 f e1 e2) = f2 f (foldExpr f1 f2 c e1) (foldExpr f1 f2 c e2)
i) eval = foldExpr id id id
Ejercicio 2: Lambda cálculo tipado
Se cuenta con un lengua je de lambda calculo tipado extendido para soportar naturales (se tienen los terminos 0, pred(M), succ(M) e isZero(M) donde las constantes naturales notadas con n abrevian como fue visto en la teorica). Ejemplos: 0 y 2 son las constantes que representan el 0 y el 2 respectivamente. Se pueden asumir las reglas de tipado y semantica correctas para los enteros como fueron dados.
El objetivo del ejercicio es extender este lenguaje para soportar una estructura switch que sea el equivalente a if pero para naturales. La sintaxis sera similar a la que usan C y C++ para el switch. La sintaxis del lengua je, entonces, sera la siguiente:
Aquı los representan numeros naturales y k es un entero positivo. La idea del comportamiento del switch es que primero evalue su condicion (lo que esta entre parentesis) y luego el resultado de toda la expresion se decide seguun el case que matchee el valor al que se evaluo la expresion (parecido al comportamiento del if.then.else). Esta prohi- bido incluir dos case con igual constante y tambien no incluir ninguno (esto no se asume, sino que se debe forzar con las reglas que correspondan). Si ningun case matchea el valor evaluado, la expresion debe quedar indefinida.
Ejercicio A
Introducir las reglas de tipado para la extension propuesta.
Respuesta
No se bien como restringir los casos que piden, se me ocurrió esto:
para
Ejercicio B
Indicar formalmente como se modifica el conjunto de valores.
Respuesta
Creo que funciona como el lambda:
Ejercicio C
Dar la semantica operacional de a un paso para la extension propuesta.
Respuesta
Ejercicio D
Decir si con las reglas introducidas existe un termino cerrado (sin variables libres) que este en forma normal y no sea un valor. Si lo hay, mostrar un ejemplo, y si no, justificar informalmente por que.
Respuesta
Creo que no hay porque todo switch introducido es un valor (por como definí los valores).
Ejercicio E
Modificar la sintaxis, las reglas de tipado y de semantica operacional rea- lizadas para que se pueda incluir tambien opcionalmente un label def ault : que debe aparecer una sola vez al final de los case y se utiliza para dar valor a toda la expresion en caso de que ningun case matchee. Se pueden reutilizar cosas introducidas en los items anteriores, pero debe especificarse exactamente que reglas se mantienen (si alguna regla debe ser modificada aunque sea levemente, se ruega reescribirla entera a fin de no generar problemas de interpretacion al corregir).
Ejercicio F
Escribir isZero en funcion de la extension realizada en el punto anterior.
Respuesta
isZero x = switch(x) { case 0: true, default: false }
Ejercicio 3: Inferencia de tipos
a) λx. λy. (x y) (λz. x) No tipa.
b) λx. λy. λz. x (y z) (b -> c) -> (a -> b) -> a -> c Toma dos funciones y devuelve su composicion.
c) λx. λy. (x y) (x y) No tipa.
d) W(caseNat U of 0 -> V ; Succ(x) -> W) =def SΓ1 U SΓ2 U SΓ3 |> S(caseNat M of 0 -> N ; Succ(x) -> O) : Sw donde W(U) = Γ1 |> M : s W(V) = Γ2 |> N : t W(W) = Γ'3 |> O : v Si x : p E Γ'3 entonces Γ3 = Γ'3 - {x : p},H = {p = Nat} sino Γ3 = Γ'3,H = Ø S = MGU(H U {w = t, t = v, s = Nat} U {p1 = p2 | y : p1 E Γi, y : p2 E Γj , i <> j}