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 x
x λz.x λw.w z y
λx.x y λx.y x
f (λ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 x
T, T, (λp.λq.p q p))
(λb.b), (λf.f), z
λw.λf.λx.f x f w w
T, (λy.λx.x), T
T, (λ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.x
yFalse=λ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 * 4
f(x) = x * x
f(x,y) = x + y
f(x,y) = x * y
f(x,y,z) = x + y + z
f(x,y,z) = x * y * z
f(x,y,z) = (x + y) * z
isZero = 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 + 1
iszero ((λ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.