Modifier le type expr pour prendre en compte ce nouveau genre d’expression.
Question 7
Quelle est la valeur de type expr qui code l’expression let x=y+1 in x+2 ? On l’appellera ex1 dans la
suite.
On dit qu’une variable est libre si elle n’est pas introduite par un let. Par exemple, dans l’expression
let x=y+1 in x+2, la variable yest dite libre. Dans l’expression, let x=x+1 in x+2, la variable xdans
l’expression x+1 est libre. Mais la variable xdans la sous-expression x+2 n’est pas libre, elle est introduite
par le let.
Question 8
´
Ecrire une fonction libres qui prend en param`etre une expression et retourne la liste des noms des
variables qui ont au moins une occurrence libre dans l’expression. Par exemple libres ex1 retourne la liste
["y"] alors que le r´esultat pour l’expression letx=x+yinx+1sera la liste ["x"; "y"].
Question 9
´
Ecrire une fonction evalue qui prend en param`etre une expression et un environnement (une liste de
couples de la forme (nom de variable, valeur enti`ere)) et retourne la valeur de l’expression. Si une variable libre
n’a pas de valeur alors la fonction ´echouera. Par exemple la valeur de l’expression ex1 dans l’environnement
[("y", 5)] est l’entier 8. On rappelle que le calcul de la valeur d’une expression let x = e1 in e2 se fait
en ´evaluant d’abord l’expression e1 (soit vsa valeur) puis en ´evaluant l’expression e2 en consid´erant que x
d´esigne la valeur v.
Exercice 4 (Graphes)
On d´esire repr´esenter et manipuler un graphe orient´e en Caml. Pour simplifier on suppose dans la suite
que les sommets sont repr´esent´es par des entiers mais ils pourraient ˆetre de n’importe quel type.
Partie 1
Dans cette partie un graphe orient´e est repr´esent´e par la liste de ses arcs. Un arc de xvers yest repr´esent´e par
le couple (x, y). On dit dans ce cas que yest un successeur de x. Un graphe est donc de type (int ∗int)list.
On d´esignera ce type par graphe dans la suite.
Soit gtest le graphe [(1,2); (1,4); (2,1); (2,3)].
Question 10
´
Ecrire une fonction estsucc dont l’interface est donn´ee ci dessous :
(*interface estsucc
type : graphe * int * int -> bool
arguments : g x y
pre : true
post : retourne true si x est un successeur de y dans le graphe g, false sinon.
tests : estsucc (gtest,4,1) (* true*), estsucc (gtest,4,2) (* false*), estsucc (gtest,5,1) (* false*)
*)
Question 11
´
Ecrire une fonction successeurs qui prend deux param`etres : un graphe get un sommet s, et retourne
la liste des successeurs de sdans g. Elle retourne la liste vide si le sommet ne figure pas dans le graphe.
Question 12
R´e´ecrire la fonction pr´ec´edente en utilisant la fonctionnelle f old lef t ou fold right.
Question 13
´
Ecrire une fonction qui retourne la liste des sommets d’un graphe (on suppose que le graphe ne contient
pas de sommets isol´es, i.e non reli´es `a un autre). On veut obtenir le r´esultat sous la forme d’un liste
2