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