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
© Copyright 2024 ExpyDoc