Exercice 1 : portée des variables
Dans la suite d'expressions suivantes, indiquer pour chaque occurence de variable si elle est libre ou liée, dans le second cas, indiquer à quelle définition elle est liée. Il est conseillé de mettre chaque expression sous forme d'arbre syntaxique.
let a a = a * let a = 3 in a in a (let a = 4 in a);;
let a = let a = let a = 1 in a+1 in let a = 2 in a*2 in a+3;;
let a =
let b = 2 in
let c = 3 in
a + b + (let d = 5 in b * c * d);;
let a =
let f = fun a -> a + 1 in
let g = fun a -> a * 2 in
let a = 2 * a in
f (g ((fun a -> a+3) 5));;
Exercice 2 : renommage de variables
Dans les expressions suivantes, renommer la variable $x$ indiquée par un commentaire en $y$, sans changer la sémantique de l'expression.
let x =
let x = 42 in
let f x = x+3 in
x + ((fun x -> 2 * x) (3 * x))
let x =
let x = 21 in
let x = 32 in
let g x = (fun x -> x+3) x in
g (x+x)
let x =
(fun x -> x + (fun x -> x + 2) (x+3)) ((fun x -> x*2) (let x = 12 in x + 5 * x))
Exercice 3 : Évaluation d'applications par $\beta$-réduction
Évaluer chacune des expressions suivantes, d'abord avec une stratégie d'évaluation stricte, puis une stratégie d'évaluation paresseuse.
(fun x -> x + x) ((fun y -> y + y) 2);;
(fun f g x -> let y = g x in f y) (fun x -> x+2) (fun x -> x * 3) ((fun x -> x-1) 5);;
(fun x -> x * x + 2 * x + 1) ((fun x -> x * 3) ((fun x -> x * 5) 2));;