Guía de Calculo Lambda
Ejercicios
Comprensión de expresiones Lambda
- (★) Escribir el equivalente de las siguientes expresiones Lambda en su versión con parentesis completos explicitos:
λx. λy. x yλx. λy. λz. x y zλa. λb. λc. e(λx. xz) λy. w λw. w y z x
- (★★) Dibujar el árbol de sintaxis de las siguientes expresiones Lambda:
λx. λy.x(λx. λy. x) 1 2λx. λy. xλf. λx. f x(λx. λy. λz. xy) z
-
(★★) Cuales de los siguientes pares de expresiones e1 y e2 tienen el mismo árbol de sintaxis abstracto?
nº e1 e2 i λx.y λx.(y) ii x y (y x) iii x y z (x y) z iv x y z x (y z) v λx.y z λx.(y z) vi λx.y z (λx.y) z vii λx.x λy.y viii λx.λy.x y λx. (λy.x y) ix λx.λy.x y (λx. λy.x) y x λx.λy.x y (λx. λy.x) y - (★) Identificar las variables ligadas y libres en las siguientes expresiones:
λx.x y λz.x z(λx.x y) λz.w λw.w z y xx λz.x λw.w z yλx.x y λx.y xf (λx.x y) λy.y x(λw.λz.z (λx.w x)) x y(λf.((λx.(f (x x))) (λx.(f (x x))))) (λx.x)(λu.λf.λx. u ((λu.λx.x (u f)) (λu. x) (λf. f))) (λf.λx.f(f x))
- (★★) Para las expresiones (5) y (6) del punto anterior, realizar las conversiones-α necesarias para que no existan variables de igual nombre con presencia tanto en ligadas como libres.
Desarrollo de expresiones Lambda
- (★★) Desarrollar las siguientes sustituciones:
(f (λx.x y) λz.x y z)[x→g](λx.λy.f x y)[y→x]((λx.f x) λf.f x)[f→(g x)](λf.λy.f x y)[x→(f y)]
-
(★★) Realizar la reduccion-β de las siguientes expresiones, con ambos conjuntos de parametros indicados:
Expression 1st Params 2nd Params λx.λy.x y(λb.b F T)), F(λb.b T F)), Tλx.λy.λw. w y xT, T, (λp.λq.p q p))(λb.b), (λf.f), zλw.λf.λx.f x f w wT, (λy.λx.x), TT, (λy.λx.y), Fλn.λf.λx.f (n f x)(λf.λx.x)(λf.λx.f(f x))λp.λq.p p q(λx.λy.x), (λx.λy.y)(λx.λy.y), (λx.λy.y) - (★★) Realizar la reduccion-β de las siguientes expresiones, utlizando la estrategia call-by-name y la estrategia call-by-value:
(λg.g 5) (λx.(add x 3))(λx.x x x) (λx.x x x)(λc.c (λa.λb.b)) ((λa.λb.λf.f a b) p q)(λf.f add (f mul (f add 5))) (λg.λx.g x x)
- (★★) Encontrar la forma normal de las siguientes expresiones normalizables:
- TBD
Logica Booleana y Matematica de Church
- (★★★) Considerando los valores booleanos en Calculo Lambda como las funciones
True=λx.λy.xyFalse=λx.λy.y, escribir las expresiones Lambda que emulen las siguientes operaciones booleanas:- AND
- OR
- NOT
- NAND
- NOR
- IF
- XOR
- EQ (igualdad booleana)
- (★★★★) Escribir la expresiones Lambda que describan las siguientes funciones matematicas en terminos de números de Church:
f(x) = x * 4f(x) = x * xf(x,y) = x + yf(x,y) = x * yf(x,y,z) = x + y + zf(x,y,z) = x * y * zf(x,y,z) = (x + y) * zisZero = f(n) = n == 0
Calculo Lambda Tipado
- (★) Analizar las siguientes expresiones, identificando el tipo de las variables, la validez de las expresiones y el tipo de la expresión:
λx:Int.xλx:Int.yλx:Int.x + 1(λx:Int.x + 1) trueλx:Int→Bool.λy:Int.x yλx:Bool. if 0 then true else falseλx:Bool. if x then 1 else falseλx:Int. if iszero x then 0 else x(λx:Bool. if not x then 0 else 1) (not y)
- (★★) Demostrar, usando las reglas de inferencia, si las siguientes expresiones son válidas o no:
{} ⊢ if true then 0 else 1 : Int{} ⊢ (λx:Int.x + 40) 2 : Int{x : Int, y : Bool} ⊢ if true then false else (λz : Bool. z) true : Bool{} ⊢ if λx: Bool. x then 0 else 1 : Int{x : Bool → Int, y : Bool} ⊢ x y : Int{y : Bool} ⊢ (λx:Bool→Int.x y) (λx:Bool.if not x then 0 else 10) : Int
- (★★★) Mediante el uso de las reglas de inferencia, inferir, de ser posible, los tipos de las siguientes expresiones:
if x then 1 else z(λx.x + 40) 2λx.if iszero x then y else (λz. z) trueλx.λy.λz.if iszero (x y) then y else z + 1λx.λy.λz.if not (x y z) then y else z + 1iszero ((λx.x y) (λx.if not x then 0 else 10))λa.λb.if iszero (( λx. f x ) (a + b)) then a else bλx.λy. not (f (if not(g x) then y else (x+y)))λa.if iszero (( λb.f (a+b)) c ) then (λx. g x) a else cλx.λy.λz.if not (iszero (g y) ) then f (x + z) else not y
Adicionales (dificiles)
- Escribir la expresión Lambda que reciba un numero de Church y obtenga su factorial.