Travaux Pratiques : introduction `a OCaml Exercice 1

MASTER ISIC
ISC 642 : Projet de Synth`ese de la filli`ere transport
Ann´ee 2007-2008
Travaux Pratiques : introduction `
a OCaml
Exercice 1 : Variables, types et fonctions
1. D´efinir une variable x dont la valeur est 1.
2. Evaluer l’expression 2*x dans laquelle x est d´efinie comme une variable
locale et dont la valeur est 0.
3. Que vaut x ?
4. D´efinir une variable y dont la valeur est 2*x et o`
u x est une variable locale
dont la valeur est 3.
5. D´efinir une fonction f `a un param`etre x qui renvoie 2*x. L’appliquer `a la
valeur 3.
6. D´efinir une fonction f2 `a deux param`etres x et y et qui renvoie x*y. En
donner une version non curryfi´ee f2 noncurryfiee `a un param`etre. Quel
est son type ?
7. D´efinir, `
a partir de f2, une fonction f3 prenant un argument x et renvoyant
x*2.
8. D´efinir une fonction f4 `a deux arguments x et y qui renvoie x*x - y si
x*x - y est positif et y sinon (penser `a ´eviter de dupliquer les calculs).
9. D´efinir une fonction f5 `a un argument x qui renvoie 9-x si 9-x est positif
et x sinon.
10. D´efinir f6 la version non curryfi´ee de f4.
11. D´efinir la fonction identit´e id et donner son type. Donner le type et la
valeur de l’expression id 0 ainsi que de id ‘‘ch’’.
Exercice 2 : Fonctions d’ordre sup´
erieur
1. D´efinir une fonction prod qui prend en param`etre une fonction f et un
argument x et qui renvoie 2*f(x). Quel est son type ?
2. D´efinir une fonction prod2 qui prend en param`etre deux fonctions f et g
et un argument x, et qui renvoie f(x) * g(x). Quel est son type ?
3. Donner une version non curryfi´ee prod noncurryfiee de prod et son type.
1
4. Red´efinir la fonction f de l’exercice 1 (question 5) `a partir de prod et de
la fonction id (exercice 1 question 11).
5. D´efinir une fonction curry qui curryfie une fonction f prenant en argumant
un triplet. Quel est son type ? D´efinir la fonction inverse uncurry qui
d´ecurryfie une fonction `a trois arguments. Quel est son type ?
Exercice 3 : R´
ecursivit´
e et filtrage de motif
1. D´efinir une fonction size qui renvoie la taille de la liste qui lui est pass´ee
en argument.
2. D´efinir une fonction iterate n f x qui calcule f n c’est-`a-dire l’application
n fois de la fonction f .
3. D´efinir une fonction equal qui teste si le contenu de deux listes d’entiers
est identique.
4. D´efinir une fonction map qui calcule la liste r´esultant de l’application d’une
fonction f `
a tous les ´el´ements d’une liste l pass´ees en argument.
5. D´efinir une fonction intersection qui renvoie la liste des ´el´ements communs aux deux listes prises en param`etre.
Exercice 4 : Type somme et filtrage
1. D´efinir un type binop `a 5 constructeurs PlusI, MinusI, MultI, DivI,
Mod.
2. D´efinir un type cte `
a 3 constructeurs : Nil constructeur constant ; CInt64
a un argument de type Int64.t ; CFloat `a deux arguments float et
`
string.
3. D´efinir un type exp `
a 3 constructeurs : Const `a un argument de type cte
; Lval `
a un argument de type string ; BinOp `a trois arguments de type
binop, exp et exp.
4. D´efinir une fonction string of binop qui renvoie la chaˆıne de caract`eres
repr´esentant l’´el´ement de type binop pass´e en argument.
5. D´efinir la fonction string of cte.
6. A partir de ces deux fonctions, d´efinir string of exp.
2
Exercice 5 : Modules et foncteurs
Le but de l’exercice est de construire un foncteur fabriquant un module implantant les polynˆ
omes.
On choisit de repr´esenter les polynˆomes de fa¸con creuse : un polynˆome
est une liste de couples, chaque couple repr´esentant un monˆome, c’est-`a-dire
un degr´e et un coefficient non nul. La liste est par ailleurs tri´ee dans le sens
croissant des degr´es. Par exemple, le polynˆome 2X 5 + 3X 2 + 1 est repr´esent´e
par la liste [(0,1); (2,3); (5,2)].
On se propose d’implanter l’addition des polynˆomes. La premi`ere partie de
l’exercice consiste `
a r´ealiser le travail sur les polynˆomes `a coefficients entiers,
tandis que la seconde se focalise sur l’´ecriture d’un foncteur prenant en argument
le type des coefficients (dans l’esprit du foncteur des intervalles donn´e en cours).
1. D´efinir un type poly pour les polynˆomes `a coefficients entiers.
2. D´efinir la fonction somme, qui calcule la somme de deux polynˆomes. Attention `
a ce que la fonction renvoie bien une listes tri´ee selon les degr´es,
et que les coefficients associ´es soient tous non nuls.
3. Ajouter `
a la signature du module Numerique donn´ee en cours une fonction
est nul de comparaison `a 0. Modifier les modules Entier et Flottant
en cons´equence.
4. A partir des deux premi`eres questions, implanter un foncteur Poly prenant
en argument un module de signature Numerique, et fabriquant un module
pourvu du type et de l’addition des polynˆomes.
5. Construire deux modules de polynˆomes, Poly entier et Poly flottant
a l’aide du foncteur Poly. Testez-les diff´erentes op´erations.
`
3