nad

5
Paradigmas de Lenguajes de Programaci´ on 2 do Cuatrimestre de 2011 Pr´ actica N o 8 - Ejercicios adicionales para final Ejercicio 1 Sea el siguiente tipo, que representa a los ´ arboles ternarios: data AT a = Nil | Tern a (AT a) (AT a) (AT a) deriving Eq 1. Definir el esquema de recursi´ on estructural (fold ) para estos ´ arboles, y dar su tipo. 2. Definir el esquema de recursi´ on primitiva recAT::b->(AT a->b->b->b->b)->AT a->b. 3. Usando uno de los esquemas definidos, escribir la funci´ on esSub´ arbol::Eq a=>AT a -> AT a -> Bool, que indica si el primer ´ arbol est´ a contenido en el segundo como sub´ arbol (hijo, nieto, etc.; todo ´ arbol es sub´ arbol de s´ ı mismo, y Nil es sub´ arbol de todos los ´ arboles). Ejercicio 2 Completar la siguiente extensi´ on al C´ alculo λ: M ::= ... | raise M | try M 1 ,M 2 , ..., M n with N La expresi´ on raise M eval´ ua M a un n´ umero natural y genera una excepci´ on con ese n´ umero como par´ ametro. El objetivo de ese n´ umero es que el manejador lo utilice como dato para poder tratar ese error. La otra expresi´ on que se agrega es try M 1 ,M 2 , ..., M n with N . La sem´ antica de esta expresi´ on es que primero se eval´ ua M 1 , luego M 2 y as´ ı sucesivamente, descartando los resultados, hasta que alguno genera una excepci´ on y se pasa el control a la funci´ on N , que es el manejador. Si no se genera una excepci´ on, se retorna el valor de M n . Observar que el conjunto de valores no se modifica (un t´ ermino de la forma raise n es una expresi´ on de error). Tampoco es necesario que las M i tengan todas el mismo tipo. Ejercicio 3 (Pseudo confluencia o absorci´ on) Probar que si M →→ U y M →→ V con U una forma normal, entonces V →→ U . Ejercicio 4 1. Probar que si Γ .M : σ es derivable y Γ Γ 0 contiene a todas las variables libres de M , entonces Γ 0 .M : σ. 2. (Weakening) Si Γ .M : σ es derivable y x/ dom(Γ), entonces Γ ∪{x : τ } .M : σ es derivable. 3. (Strengthening) Si Γ Γ 0 .M : σ es derivable y FV (M ) Dom(Γ), entonces Γ .M : σ es derivable. Al unir contextos siempre se asume que tienen dominios disjuntos. (Pista: para alguna prueba puede usarse alg´ un ´ ıtem anterior.) Ejercicio 5 Probar la siguiente propiedad de unicidad de tipado: si Γ .M : σ .M : τ son derivables para M un ermino, entonces σ = τ . Ayuda: Usar inducci´ on estructural sobre M , apelando al siguiente lemadegeneraci´on: si Γ .M : σ es derivable, vale lo siguiente: si M = x, entonces x : σ Γ si M = n, entonces σ = nat si M = λx : τ.N , entonces existe ρ tq σ = τ ρ ∪{x : τ } .N : ρ es derivable si M = PQ, entonces existe ρ tq Γ .P : ρ σ .Q : ρ son derivables (Nota: por simplicidad se restringe este ejercicio al uso de naturales y no booleanos.) Ejercicio 6 Considerar la siguiente definici´ on: search def = λp : nat bool .letrec f = λx : nat if px then x else f (succ (x)) in f 0 Redefinir la funci´ on predecesor pred usando search . En el caso de 0, definir pred de manera que pred 0 0. P´agina1de 5

description

ñlkvcos

Transcript of nad

  • Paradigmas de Lenguajes de Programacion2do Cuatrimestre de 2011

    Practica No 8 - Ejercicios adicionales para final

    Ejercicio 1

    Sea el siguiente tipo, que representa a los arboles ternarios:data AT a = Nil | Tern a (AT a) (AT a) (AT a) deriving Eq

    1. Definir el esquema de recursion estructural (fold) para estos arboles, y dar su tipo.

    2. Definir el esquema de recursion primitiva recAT::b->(AT a->b->b->b->b)->AT a->b.

    3. Usando uno de los esquemas definidos, escribir la funcion esSubarbol::Eq a=>AT a -> AT a -> Bool,que indica si el primer arbol esta contenido en el segundo como subarbol (hijo, nieto, etc.; todo arbol essubarbol de s mismo, y Nil es subarbol de todos los arboles).

    Ejercicio 2

    Completar la siguiente extension al Calculo :M ::= ... | raise M | try M1,M2, ...,Mn with NLa expresion raiseM evaluaM a un numero natural y genera una excepcion con ese numero como parametro.

    El objetivo de ese numero es que el manejador lo utilice como dato para poder tratar ese error. La otra expresionque se agrega es try M1,M2, ...,Mn with N . La semantica de esta expresion es que primero se evalua M1, luegoM2 y as sucesivamente, descartando los resultados, hasta que alguno genera una excepcion y se pasa el controla la funcion N , que es el manejador. Si no se genera una excepcion, se retorna el valor de Mn.

    Observar que el conjunto de valores no se modifica (un termino de la forma raise n es una expresion deerror). Tampoco es necesario que las Mi tengan todas el mismo tipo.

    Ejercicio 3 (Pseudo confluencia o absorcion)

    Probar que si M U y M V con U una forma normal, entonces V U .

    Ejercicio 4

    1. Probar que si .M : es derivable y contiene a todas las variables libres de M , entonces .M : .

    2. (Weakening) Si . M : es derivable y x / dom(), entonces {x : } . M : es derivable.

    3. (Strengthening) Si . M : es derivable y FV (M) Dom(), entonces . M : es derivable. Alunir contextos siempre se asume que tienen dominios disjuntos.

    (Pista: para alguna prueba puede usarse algun tem anterior.)

    Ejercicio 5

    Probar la siguiente propiedad de unicidad de tipado: si . M : y . M : son derivables para M untermino, entonces = . Ayuda: Usar induccion estructural sobre M , apelando al siguiente lema de generacion:si . M : es derivable, vale lo siguiente:

    si M = x, entonces x : si M = n, entonces = natsi M = x : .N , entonces existe tq = y {x : } . N : es derivablesi M = PQ, entonces existe tq . P : y . Q : son derivables

    (Nota: por simplicidad se restringe este ejercicio al uso de naturales y no booleanos.)

    Ejercicio 6

    Considerar la siguiente definicion:

    searchdef= p : nat bool .letrec f = x : nat if p x then x else f(succ(x)) in f 0

    Redefinir la funcion predecesor pred usando search. En el caso de 0, definir pred de manera que pred 0 0.

    Pagina 1 de 5

  • Paradigmas de Lenguajes de Programacion2do Cuatrimestre de 2011

    Ejercicio 7

    En el Calculo extendido con listas, definir la funcion map, como macro usando fix.

    Ejercicio 8

    Extender el algoritmo de inferencia con la version polimorfica del let.La regla de tipado es la siguiente1:

    . M : . N{xM} : (T-Let)

    . let x = M in N :

    Observar que la condicion . M : es simplemente para asegurar que M este bien tipado (tener en cuentaque x puede no ocurrir en N).

    Asumir que se cuenta con una funcion copiarAnotaciones(V,M) que dados dos terminos V y M que unificanentre s, tales que V no posee anotaciones de tipos y M s, devuelve otro termino V con anotaciones, que resultade anotar V con los tipos correpondientes de M . Ejemplo:

    copiarAnotaciones( (x. succ(x)) y, (x : Nat.succ(x)) succ(0) ) = (x : Nat. succ(x)) y

    Aplicar el algoritmo extendido con el metodo del arbol para tipar la expresion: let id = (x.x) in id id,y comparar con lo que sucede si se utiliza la regla de tipado no polimorfica:

    . M : {x : } . N : (T-LetNoPoli)

    . let x = M in N :

    Ejercicio 9

    Considerar la siguiente expresion:let doble = f.x.f(f x) in (doble (x:Nat.succ (succ x)) 1, doble (x:Bool.x) true)

    a) Mostrar que la inferencia de tipos falla para la expresion anterior, usando la regla de tipado no polimorficapara let.

    b) El problema es que el algoritmo de inferencia utilizado no soporta polimorfismo. En la expresion presentadahay dos usos de doble, cada uno con tipos diferentes. Una solucion posible es introducir polimorfismolet. Probar que el termino visto s tipa, utilizando la version polimorfica de let definida en el ejercicio 9.

    Ejercicio 10

    Este ejercicio explora la inferencia de tipos en un lenguaje con polimorfismo let y con referencias.

    a) Mostrar que la inferencia de tipos de la siguiente expresion es exitosa y que, sin embargo, al intentarreducirla a su valor se llega a un error. Concluir que, en la presencia de polimorfismo let y referenciasse pierde la correccion.

    let r = ref (x.x) in (r:=(x:Nat. succ x); (!r) true)

    b) Una solucion al problema es restringir el lado derecho de una declaracion let a que sea un valor. Lasintaxis de las declaraciones quedan:

    M ::= ... | let x=V in M

    Mostrar que la inferencia de tipos2 falla (tal como es de esperarse) para la siguiente modificacion de laexpresion del punto a.

    let r=l in (r:=(x:Nat. succ x); (!r) true)

    1Si bien la regla que presentamos es mas simple y sirve como referencia, la misma omite algunos detalles. Una definicion masprecisa sera:

    . M : . N : M = erase(M ) erase(N){xM} = erase(N )

    . let x = M in N :

    2Las direcciones l deben tratarse como variables, y el tipo del store como los .

    Pagina 2 de 5

  • Paradigmas de Lenguajes de Programacion2do Cuatrimestre de 2011

    Ejercicio 11

    Dada la siguiente extension al conjunto de terminos para el calculo con listas: M ::= ... | map,La unica modificacion al sistema de tipos es la introduccion de un axioma de tipado para map, .Se extiende el algoritmo de inferencia con la siguiente regla:

    W(map) = . mapa,b : (a b) [a] [b] siendo a y b variables de tipo frescas.

    Se asumen dadas la extensiones correspondientes para Erase y mgu.Usar el algoritmo W con esta nueva extension para tipar la expresion map map.

    Ejercicio 12

    Se desea extender el algoritmo de inferencia para incorporar subtipado. El objetivo es que cada funcion queespera un argumento de un tipo determinado, pueda recibir tambien argumentos de un subtipo del mismo. Paraesto, la arregla de tipado de las aplicaciones es reemplazada por la siguiente regla:

    . M : . N :

  • Paradigmas de Lenguajes de Programacion2do Cuatrimestre de 2011

    Ejercicio 18

    1. Modificar el algoritmo de subtipado para que tenga en cuenta las relaciones entre Bool, Nat, Int y Float.

    2. Probar o refutar, usando esta nueva version del algoritmo de subtipado:

    a) {x : Float} {x : Nat}

  • Paradigmas de Lenguajes de Programacion2do Cuatrimestre de 2011

    extraer: valor

    (self puedeExtraer: valor) ifTrue: [balance := balance - valor]. ^self.

    transferir: valor a: otraCuenta

    (self puedeExtraer: valor) ifTrue: [self extraer: valor. otraCuenta depositar: valor].

    ^self.

    Y el metodo de clase:

    new

    ^super new inicializar: 0.

    Tambien tenemos la subclase CuentaVIP, que permite extraer una cantidad mayor que el saldo actual, hastaun cierto tope. Esta clase tiene la variable de instancia tope, que indica la maxima deuda que se puede contraer.La clase CuentaVIP tiene implementados los metodos de instancia:

    fijarTope: nuevoTope

    tope:=nuevoTope. ^self.

    puedeExtraer: valor

    ^balance+tope >= valor.

    Y el metodo de clase:

    new: tope

    ^super new fijarTope: tope.

    Se ejecuta el siguiente codigo:

    |cuentaA cuentaB|

    cuentaA := CuentaBancaria new.

    cuentaB := (CuentaVip new: 50) depositar: 40.

    cuentaB transferir: 70 a: cuentaA.

    Que mensajes se envan durante la ejecucion de este codigo? Cual es el objeto receptor de cada mensaje?

    Pagina 5 de 5

    Ejercicio 1Ejercicio 2Ejercicio 3Ejercicio 4Ejercicio 5Ejercicio 6Ejercicio 7Ejercicio 8Ejercicio 9Ejercicio 10Ejercicio 11Ejercicio 12Ejercicio 13Ejercicio 14Ejercicio 15Ejercicio 16Ejercicio 17Ejercicio 18Ejercicio 19Ejercicio 20Ejercicio 21Ejercicio 22