Vous êtes sur la page 1sur 8

Universit Pierre et Marie Curie e Formation permanente Prise en Main dObjective Caml Travaux encadrs sur machines - J1 e

Emmanuel Chailloux Pascal Manoury Fvrier 2006 e Bruno Pagano Michel Mauny

Boucle dinteraction
Lancer la boucle dinteraction (le toplevel) en tapant la commande ocaml A lcran doit sacher e Objective Caml version 3.0x # On quitte la boucle dinteraction par la commande ocaml : # quit ;; On peut charger, typer et compiler un chier le source myfile.ml par la commande #use "myfile.ml";; On peut galement valuer directement des expressions : celles-ci sont compiles, types puis e e e e values. e e # let x = 25 in x*x;; La boucle ache alors le type et la valeur de lexpression - : int = 625 # Il en va de mme pour les dclarations. Voici, par exemple une fonction qui calcule la sous liste des e e lments infrieurs ` un lment donn ee e a ee e # let rec get_inf x0 xs = match xs with [] -> [] |x::xs -> if x < x0 then x::(get_inf x0 xs) else get_inf x0 xs ;; val get_inf : a -> a list -> a list = <fun> # 1

On peut alors eectuer quelques tests # # # # # get_inf 3 [4; 6; 1; 0; 7; 8; 2; 4; 3; 5];; : int list = [1; 0; 2] get_inf 25 [4; 6; 1; 0; 7; 8; 2; 4; 3; 5];; : int list = [4; 6; 1; 0; 7; 8; 2; 4; 3; 5] get_inf (-1) [4; 6; 1; 0; 7; 8; 2; 4; 3; 5];; : int list = [] get_inf d [a; z; e; b; q; c; o];; : char list = [a; b; c] get_inf a [a; z; e; b; q; c; o];; : char list = []

1
1.1

Premier jour : noyau fonctionnel


Rcurrence numrique e e
b0 = 1 n+1 = b.bn b

Exercice 1.1 Llvation de b ` la puissance n se dnit rcursivement par itration du produit ee a e e e

Question 1.1 Dnir la fonction slow exp : int -> int -> int telle que (slow exp b n) e calcule bn en utilisant les galits ci-dessus. e e Question 1.2 Dnir une version rcursive terminale de cette fonction en utilisant une fonction e e auxiliaire slow exp loop : int -> int -> int -> int telle que (slow exp loop b n a) calcule a.bn . Exercice 1.2 On va calculer bn en utilisant les galits suivantes : e e bn = (bn/2 )2 si n est pair bn = b.bn1 sinon

Question 2.1 Dnir la fonction even : int -> bool telle que (even n) vaut true si n est e pair et false sinon. Question 2.2 Dnir la fonction fast exp : int -> int -> int telle que (fast exp b n) e calcule bn en utilisant les galits ci-dessus. e e Exercice 1.3 Calcul du plus grand diviseur commun (gcd) de deux entiers selon lagorithme dEuclide. On utilise gcd(n, m) = gcd(m, r) avec r = n mod m. Question 3.1 Dnir la fonction gcd : int -> int -> int telle que (gcd n m) calcule le plus e grand diviseur commun de n et m selon lalgorithme dEuclide.

1.2

Rationnels

Lensembles des nombres rationnels est lensemble des nombres que lon peut crire sous la forme e dune fraction n o` n et p sont des entiers. u p Exercice 1.4 On peut donc reprsenter un nombre rationnel comme un couple de deux entiers ou un enregistree ment encapsulant deux entiers et dnir les oprations arithmtiques sur une telle donne. e e e e Question 4.1 Dclarer le type rat comme un enregistrement contenant un champ num et un e champ den reprsentant respectivement le numrateur et le dnominateur dune fraction. e e e

Question 4.2 Dnir une valeur de type rat reprsentant le rationnel 1.75. Cette reprsentation e e e est-elle unique ? Donnez un contre-exemple. Question 4.3 Dnir une fonction rat reduce : rat -> rat telle que si r = e
n/a p/a . n p

et si a =

gcd(n, p) alors (rat reduce r1) =

Question 4.4 Dnir les fonctions rat plus : rat -> rat -> rat et rat mul : rat -> rat e -> rat calculant respectivement la somme et le produit de deux rationnels. Question 4.5 Comprenez pourquoi loprateur prdni = nest pas ce quil faut pour tester e e e lgalit de deux rationnels. Dnir la fonction rat equal : rat -> rat -> bool qui teste cette e e e galit. e e

1.3

Rcurrence, fonctionnelles ditration e e

Exercice 1.5 La cl`bre suite de Fibonacci est dnie par les quations rcursives ee e e e F0 = 1 On consid`re la suite de couples e C0 = (F0 , 0) C1 = (F1 , F0 ) C2 = (F2 , F1 ) ... Cn = (Cn , Cn1 ... F1 = 1 Fn+2 = Fn+1 + Fn

On remarque que, comme Cn = (Fn , Fn1 ), on a : Cn+1 = (Fn + Fn1 , Fn ) = (Fn+1 , Fn ). Soit alors la fonction telle que (x, y) = (x + y, x), on a n+1 (C0 ) = (F n + 1, Fn ). Question 5.1 Ecrire litrateur iter de type a -> (a -> a) -> int -> a tel que iter a e n (a). f n f Question 5.2 Utiliser cet itrateur pour crire une fonction qui calcule le n-i`me terme de la e e e suite de Fibonacci. Question 5.3 1.1 ? Exercice 1.6 Litrateur que nous avons vu fait toujours dcro e e tre lentier ditration de 1. On peut passer en e argument de litrateur une fonction de dcrment. Si f est la fonction ` itrer, a la valeur en 0 et e e e a e I(, f, a, 0) = a le dcrment, on dnit litrateur I par les quations e e e e e I(, f, a, n + 1) = f (n, I(, f, a, (n))) On peut utiliser cet itrateur pour calculer, par dichotomie, la n-i`me puissance dun entier e (voir e e exercice 1.1). (n, r) = r r si n est pair Soit telle que (n, r) = e r sinon On a que en = (n, ((n), (2 (n), . . . , (1, 1) . . .))) 4 Comment utiliser litrateur iter pour (re)dnir la focntion slow exp de lexercice e e

Question 6.1 obtenu.

Ecrire une fonction gen rec de type qui implante litrateur I. Notez le type e

Question 6.2 Ecrire une fonction phi qui implante la fonction avec e = 2. Question 6.3 En dduire une fonction puiss2, de type int -> int, qui calcule la n-i`me puise e sance de 2 (pour n > 1). Question 6.4 Utiliser litrateur gen rec pour (re) dnir la fonction dexponentiation fast exp. e e

1.4

Les listes

Exercice 1.7 Mise en jambe. Question 7.1 Ecrire une fonction supprime qui, tant donns une liste l et un entier n, renvoie e e la liste l prive de ses n premiers lments et qui signale une erreur lorsque la liste l comporte e ee moins de n lments o` n est strictement ngatif. ee u e ee Question 7.2 Dnir une fonction long prefixe qui rend le nombre dlments identiques e conscutivement au dbut dune liste l. e e Exercice 1.8 Exercice acadmique : les membres dune universit peuvent tre : soit des tudiants, soit des e e e e administratifs, soit des enseignants-chercheurs. Un tudiant est caractris par son nom et son e e e numro dinscription. Un administratif est caractris par son nom et sa catgorie administrative, e e e e qui peut tre A, B ou C. Un enseignant-chercheur est caractris par son nom et le numro de e e e e lUFR ` laquelle il est rattach. On souhaite tablir un chier des membres dune universit an a e e e de pouvoir, par exemple, envoyer des courriers bien adapts ` chaque catgorie de personnel. e a e Question 8.1 En dnissant ventuellement des types intermdiaires, dnissez un type univ e e e e pour reprsenter une universit. e e Question 8.2 Ecrivez une fonction separe qui prend une valeur de type univ en argument et rend un triplet dont la premi`re composante est la liste des tudiants de luniversit, la seconde la e e e liste des administratifs, la troisi`me la liste des enseignants-chercheurs. e Exercice 1.9 Soit une pi`ce de monnaie dont on ne sait comment elle est truque. En la lanant un certain e e c nombre de fois, on obtient une liste de symboles Pile ou Face. On va calculer une liste de boolens e alatoires quiprobables ` partir dune telle donne. e e a e Question 9.1 Dnir un type piece qui donne les symboles Pile et Face. e 5

Question 9.2 Soit une piece list. On se propose den extraire une liste de boolens selon le e principe suivant : on consid`re les symboles deux par deux ; si la paire considre est Pile Face e ee alors on produit true ; si la paire considre est Face Pile alors on produit false ; sinon on ne ee produit rien. Ecrire la dnition de la fonction alea1 : piece list -> bool list qui implante ce principe. e Pensez ` utiliser les ressources du ltrage. a Question 9.3 On va maintenant calculer le reste dune piece list en ne retenant que les paires rptes. Par exemple, de [Pile ; Face ; Pile ; Pile ; Face ; Face ; Face ; Pile ; Face ; e ee Pile] on retient la liste [Pile ; Face]. Le Pile du rsultat vient des 3-i`me et 4-i`me Pile de la e e e liste originale et le Face du rsultat vient des 3-i`me et 4-i`me face de la liste originale. e e e Donner la dnition de la fonction reste alea1 : piece list -> piece list qui met en uvre e ce calcul du reste. Question 9.4 On va renforcer le calcul de la fonction alea1 en utilisant le reste obtenu apr`s un e premier passage. Dnir le fonction alea : piece list -> bool list qui utilise alea1 pour calculer un dbut de e e liste de boolens puis de la complte par itration (delle mme) sur le reste obtenu. e e e e Exercice 1.10 Listes et fonctionnelles ditration. e Question 10.1 Quel fonctionnelle utiliser pour rednir la fonction get inf donne en introduce e tion (voir ) ? Faites le. Question 10.2 Mme question avec la fonction separe de lexercice prcdent. e e e Exercice 1.11 On veut raliser une fonction de tri par insertion pour les listes. Si lon a une fonction dinsertion e ins, de type a -> a list -> a list telle que ins x [x1 ; ... ; xi ; xi+1 ; ... ; xn ] [x1 ; ... ; xi ; x ; xi+1 ; ... ; xn ] avec x1 dots xi x et x < xi+1 , alors une fonction de tri sort sera telle que sort [x1 ; x2 ; ... ; xn ] ins x1 (ins x2 ( ...(ins xn [])...)) Question 11.1 Ecrire la fonction ins. Question 11.2 En dduire, en utilisant un itrateur sur les listes, la fonction de tri sort. e e Question 11.3 Donnez une seconde version de sort, en utilisant lautre itrateur. e

1.5

Tris par arbres

Exercice 1.12 On peut donner une version fonctionnelle du tri rapide en passant par une structure intermdiaire e darbre binaire de recherche (un abr). Un arbre binaire de recherche est un arbre dont les nuds sont tiquets et qui ont la proprit que ltiquette de la racine est plus grande que les tiquettes e e ee e e contenues dans le sous-arbre gauche et plus petite que celles contenues dans le sous-arbre droit. Cette proprit tant rcursivement satisfaite par les deux sous-arbres. eee e Lide de la fonction de tri applique a une liste est de construire la structure darbre binaire de e e ` recherche pour les lments de cette liste puis dextraire de larbre obtenu la liste trie. ee e Question 12.1 Dnir un type a bin tree pour reprsenter les arbres binaires dont les nuds e e sont tiquets par une valeur de type a. e e Question 12.2 Ecrire la dnition de la fonction ins abr : (a -> a -> bool) -> a -> a e bin tree -> a bin tree telle que (ins abr r x t) calcule larbre binaire de recherche obtenu en insrant x ` sa place dans t selon la relation r. e a Notez que le rsultat donne un arbre binaire de recherche seulement si t en est dj` un. e ea Question 12.3 Ecrire la dnition de la fonction abr of list : (a -> a -> bool) -> a e list -> a bin tree telle que (abr of list r xs) soit un arbre binaire de recherche selon r, qui contient les lments de xs. ee Question 12.4 Ecrire le dnition de la fonction list of abr : a bin tree -> a list telle e e e que (list of abr t) renvoie la liste trie, selon une relation r quelconque, des tiquettes de t si t est un arbre binaire de recherche selon r. Question 12.5 En dduire une fonction de tri pour les listes. e

1.6

Expressions et calculs symboliques

Les types somme et le ltrage facilitent grandement lcriture de fonctions de manipulation syme bolique. On se propose dillustrer cela sur un petit programme de drivation formelle dexpressions e algbriques. e Exercice 1.13 On consid`re un petit langage dexpression pour les polynmes ` puissance et coecients entiers. e o a Plus prcisment lensemble des expressions est rcursivement dni par : e e e e les constantes sont des expressions ; les variables sont des expressions ; sit e est une expression et n un entier alors en est une expression ; si e1 et e2 sont des expressions alors e1 e2 et e1 + e2 sont des expressions.

Les r`gles de drivation formelles en x sont : e e


dc dx dx dx dy dx den dx d(e1 +e2 ) dx d(e1 e2 ) dx

= 0 = 1 = 0 = n en1 =
de1 dx de dx

si c est une constante

si y est une variable dirente de x e

de2 dx de2 dx ) +

= (e1

(e2

de1 dx )

Question 13.1 Dnir un type exp pour nos expressions. e Question 13.2 une variable, Dnir la fonction deriv qui calcule la drive formelle dune expression pour e e e