Programación Funcional

Transcripción

Programación Funcional
Apellidos:
Nombre:
Programación Funcional
Ingenierı́a Informática – Optativa Segundo Ciclo
Examen Septiembre 2002 – Fundamentos
1.
a) Defina en O’Caml la función aplanar: ’a list list ->’a list ->’a list, que
dadas una lista de listas aplane el primer nivel. Por ejemplo, aplanar [[1;2]; [];
[3;4];[5] → [1;2;3;4;5.
b) Suponiendo que tenemos definidos en el λ-cálculo puro Y, null, cons, head, tail, if y
nil defina una función equivalente al aplanar del apartado anterior. (Pista, defina una
función append primero).
2. Dados el tipo árbol y las definiciones de tamaño de un árbol y altura de un árbol:
date Arbol a = Hoja a
| Rama (Arbol a) (Arbol a)
tamanho :: Arbol a -> Int
tamanho (Hoja _) = 1
tamanho (Rama xt yt) = tamanho xt + tamanho yt
altura :: Arbol a -> Int
altura (Hoja a) = 0
altura (Rama xt yt) = 1 + (altura xt ‘max‘ altura yt)
demuestre el resultado:
altura xt <tamanho xt <= 2 ‘pow‘ altura xt
Pista: Usar h = (altura xt ‘max‘ altura yt))
3. Defina una funcion conversion: term1 ->term2 que dado un termino de tipo term1, construya un término de tipo term2, haciendo:
a) la lista de variables que estan ligadas por la abstracción pasen a estar ligadas por
abstracciones individuales.
b) En term1 existen LetIn var t1 t2 que corresponde a la expresión let x = t1 in
t2. Transformar esto en un término que no use LetIn, cosiderese que no hay problemas
de captura de variables.
type variable = string
type term1 =
|
|
|
|
Var of variable
Abs of variable list * term
App of term * term
LetIn of variable * term * term
Cond of term * term * term
type term2 =
|
|
|
Var2 of variable
Abs2 of variable * term
App2 of term * term
Cond2 of term * term * term
Ejemplo:
conversion (App (Abs( ["x";"y";"z"], Var "x"), Var "a")) =
(App2 (Abs2 ("x", Abs2 ("y", Abs2 ("z", Var2 "x"))), Var2 "a")
4. Utilizando las reglas siguientes:
Γ ` b : Bool | {}
(CT-BOOL)
Γ ` i : Int | {}
(CT-INT)
Γ ` x : Γ(x) | {}
(CT-VAR)
Γ` e: T |C
Γ ` es cero e : Int | C ∪ {T = Int}
(CT-ES-CERO)
Γ ` e1 : T1 | C1
Γ ` e2 : T2 | C2
Γ ` e1 + e2 : Int | C1 ∪ C2 ∪ {T1 = Int, T2 = Int}
(CT-SUMA)
Γ ` e1 : T1 | C1
Γ ` e2 : T2 | C2
Γ ` e1 − e2 : Int | C1 ∪ C2 ∪ {T1 = Int, T2 = Int}
(CT-RESTA)
Γ ` e1 : T1 | C1
Γ ` e2 : T2 | C2
X fresca
Γ ` e1 e2 : X | C1 ∪ C2 ∪ {T1 = T2 → X}
Γ` e: T |C
X fresca
Γ ` Y e : X | C ∪ {T = X → X}
Γ ` e1 : T1 | C1
Γ ` e2 : T2 | C2
Γ ` e3 : T3 | C3
Γ ` if e1 then e2 else e3 : T | CCN D
(CT-APP)
(CT-Y)
(CT-CND)
donde CCN D = C1 ∪ C2 ∪ C3 ∪ {T = T2 , T1 = Bool, T2 = T3 }
determine detalladamente el tipo principal de la expresión:
(Y (λg : G. λn :
N. if (es cero n) then 1 else if (es cero(n − 1)) then 1 else g(n − 1) + g(n − 2)) 3

Documentos relacionados