Université Paris 6
Licence d'informatique
Module de Programmation
Année 1999-2000


Examen du 7 septembre 2000






Le barême n'est donné qu'à titre indicatif. Les documents autorisés sont les notes de cours et de TD ainsi que les documents distribués en cours.





Exercice 1 (3 pts)

Soit la déclaration suivante, effectuée dans un environnement Env :

let f = function m -> function n ->
  let res = g (m * n) in 
    (((h res) = res), res);;
On cherche quelles sont les hypothèses minimales à faire sur Env pour que cette déclaration soit acceptable par le système CAML, en donnant à f le type le plus général (autrement dit, le plus polymorphe) possible. Donner votre réponse en la justifiant. Pour cela, vous construirez l'arbre de typage.


Exercice 2 (3 pts)

Soit la fonction :
let f = function (x,z,y)  ->
  let r = ref (!z) in 
    r := !r + 1;
    y := !y + 1 ; 
    if x then z := !r else failwith " erreur";;
Donnez le type de f et justifiez le. Soient les phrases suivantes:

let k = ref 1;;
let l = ref 2;;
f (true, k, l);;
Donnez la valeur de k et l.


Exercice 3 (3pts)

Soit les définitions suivantes.
let rec comp f n x = if n=0 then x else (f (comp f (pred n) x));;         

comp (function x -> x + 1) 3 ;;

let foo = comp (function x -> x + 1) 3 ;;

foo(3);;
Donnez, sans explication, le type de comp et de foo.

Détaillez la valeur des identificateurs f et x lors de l'évaluation de l'expression if n=0 then x else (f (comp f (pred n) x)) produite au premier appel récursif de l'évaluation de (comp succ 3 5).

11 pts



On définit le type lterm des -termes par :
type lterm = I of int | V of string | Fonc of string * lterm | App of lterm * lterm;;
Une constante est un -terme construit avec I. Une variable est un -terme construit avec V et le nom de la variable (V s) est s. Une fonction est un -terme de la forme Fonc (s, lt), s est le nom de la variable. Une l-appli est un -terme construit avec App.
1. (1 pt) Donner un exemple de -terme de chacune des catégories.
2. (1 pt) Écrire une fonction qui compte le nombre de variables (libres) dans un -terme.
3. (1,5 pt) La hauteur d'une constante et d'une variable est 1. La hauteur d'une fonction Fonc (s,lt) est celle du -terme lt ayant servi à la construire augmentée de 1. La hauteur d'une l-appli est la plus grande des hauteurs des deux -termes ayant servi à la construire, augmentée de 1. Écrire une fonction hauteur qui donne la hauteur d'un -terme. On rappelle que la fonction max fournit le plus grand de deux nombres.
4. (1,5 pt) Écrire une fonction sous_une_fun, qui prend une chaîne de caractères ch et un -terme lt en entrée et qui vaut true si ch est un nom abstrait dans lt.
5. (2 pts) Les -termes sont des sortes d'arbres. Un chemin dans un -terme est un mot sur l'alphabet {F, L, G, D}. On associe à tout -terme une liste de chemins construite par la fonction liste_chemins donnée ci-dessous :
let rec liste_chemins = function 
  | I _ -> ["F"]
  | V _ -> ["F"]
  | Fonc (_, lt) -> map (function ch -> "L" ^ ch) (liste_chemins lt)
  | App (lt_1, lt_2) -> 
     let sous_liste_droite = map (function ch -> "D"^ch) (liste_chemins lt_2)
     and sous_liste_gauche = map (function ch -> "G"^ch) (liste_chemins lt_1) in
       sous_liste_gauche @ sous_liste_droite;;

let un_l_terme = 
  let delta = Fonc ("x", App (V "x", V"x")) in
    App (delta,delta);;

let resultat = liste_chemins un_l_terme;;
Donner la valeur de resultat.

Démontrer que la hauteur d'un -terme un_lt est égale à la plus grande des longueurs des chaînes de caractères figurant dans liste_chemins un_lt.
6. (2 pts) On veut mettre en place un mécanisme de simplification des -termes. Pour cela, Un -terme de la forme App ((Fonc (s, t1)), t2) est remplacé par un nouveau -terme, construit à partir de t1, comme suit. On remplace dans t1 chaque variable (V s), ayant donc pour nom celui qui est abstrait, par le -terme t2. Par exemple, (App ((Fonc ("x", V "x")), I n)) se simplifie sur (I n) et (App ((Fonc ("x", V "y")), I n)) se simplifie sur (V "y").

Écrire d'abord une fonction remplace, qui prend en arguments une chaîne de caractères s (le nom de la variable à remplacer), un premier -terme t1 (le -terme où faire le remplacement) un second -terme t2 (le -terme qui remplace) et effectue le remplacement.
7. (2 pts) On veut écrire une fonction simplifie qui effectue, si possible, la simplification d'un -terme quelconque, en remplaçant un sous-terme de la forme App ((Fonc (s, t1)), t2) (s'il en existe) par sa version simplifiée. Donner votre solution en justifiant les choix que vous serez amenés à faire pendant la conception de cette fonction.
Ce document a été traduit de LATEX par HEVEA.