1. Consider the following datatype which encodes λ-expressions:
data LExpr = Var Char | Lambda Char LExpr | App LExpr LExpr
Enroll LExpr in class Show.
2. Write a function vars which returns a list of variables used in a λ-expression:
vars :: LExpr -> [Char]
3. Write a function reducible which tests if an expression can be reduced to another. Write tests first! What are the cases when an expression is reducible?
reducible :: LExpr -> Bool
4. Write a function which renames all occurrences of a variable with another, in a λ-expression:
rename :: Char -> Char -> LExpr -> LExpr
5. Write a function which replaces all occurrences of a variable with a λ-expression, in a λ-expression:
replace :: Char -> LExpr -> LExpr -> LExpr
6. Write a function which takes a λ-expression of the form (λx.<body> <arg>) and reduces it in a SINGLE step.
(λx.(x x) y) produce?(λx.λx.(x x) y) produce?
7. Add two data constructors to the type LExpr so that we can also model functions and applications in uncurry form.
Examples: (λx y z.<body>), (f x y z).
8. Write a proper display function for these new constructors.
9. Write a function luncurry which takes an uncurries λ-expression and transforms it in curry form.
lcurry :: LExpr -> LExpr
10. Write a function lcurry which takes a curried λ-expression and transforms it in uncurry form.
(((f x) y) z) becomes (f x y z) (((f ((g a) b)) y) ((h u) v)) becomes (f (g a b) y (h u v))
11. Write the function fv which computes the list of all free variables of a λ-expression.
fv :: LExpr -> [Char]
12. Write a function bv which computes the list of all bound variables of a λ-expression.
bv :: LExpr -> [Char]
13. Write a function subst which computes the textual substitution of all free occurrences of some variable x by e in e', according to the lecture definition:
subst :: Char -> LExpr -> LExpr -> LExpr
14. Implement a function which reduces a reducible λ-expression to an irreducible one. (According to the lecture definition, what happens with λx.(λx.x x) ?
reduce :: LExpr -> LExpr
15. Implement normal-order evaluation.
16. Implement applicative (strict) evaluation.