Université Joseph Fourier UFR IMA Département Licence Sciences et Technologie LICENCE SCIENCES & TECHNOLOGIES 1 re année INF121 ALGORITHMIQUE ET PROGRAMMATION FONCTIONNELLE Devoir maison 1 & 2 (à faire avant le TP2) Exercice 1 Moyenne olympique La moyenne olympique de n nombres est la moyenne des n 2 nombres restant après avoir enlevé deux nombres : le nombre qui a la valeur maximale et celui de valeur minimale. On demande de dénir une fonction calcule la moyenne olympique d'un vecteur de quatre entiers strictement positifs. Exemple La moyenne olympique des quatre nombres (10, 8, 12, 24) est 11 ; celle des nombres (12, 12, 12, 12) est 12. SPÉCIFICATION MATHÉMATIQUE moyenne olympique Prol moyol : N N N N R + Sémantique : moyol(a, b, c, d) est la moyenne olympique des nombres a, b, c, d Prol min4 : Z Z Z Z Z Sémantique : min4(a, b, c, d) est le minimum des nombres a, b, c, d Prol max4 : Z Z Z Z Z Sémantique : max4(a, b, c, d) est le maximum des nombres a, b, c, d Prol max2 : Z Z Z Sémantique : max2(x, y) est le maximum des 2 nombres x, y Prol min2 : Z Z Z Sémantique : min2(x, y) est le minimum des 2 nombres x, y 1
DÉFINITION MATHÉMATIQUE D'ENSEMBLES déf N = {............ x > 0} déf R + = {x R........... } DÉFINITION INFORMATIQUE DE TYPES type natpos = int... type reelpos =... (* >=0 *) RÉALISATION INFORMATIQUE moyenne olympique Algorithme : max2(x, y) = le milieu de x et y + la moitié de la distance entre x et y =........... 2 +............. min2(x, y) = si (x < y) alors x sinon y ou bien = max2( x, y) max4(a, b, c, d) = max2(...........(a, b),........... (c, d)) Implantation min4(i, j, k, l) =.......... (i, min2(j, min2(k, l))) moyol(u, v, w, x) = u + v + w + x min4(u, v, w, x) max4(u, v, w, x) 2 let (max2 : int.. int... int) = function (x, y) -> (... + abs(...) )/2 let (... : int * int * int * int...) = function (a, b, c, d) -> max2 (max2 (...),... (c,d)) let (... :... -> int) = function (x, y) -> if (...) then x else.. let (... :... *... *... *... -> int) = function (i, j, k, l) -> min2 (i,... (j,... (k,l))) (* /! conditions d'utilisation de moyol (u,v,w,x) : u>0, v>0, w>0, x>0 *) let (moyol :... *... *... *... ->...) = function (u, v, w, x) -> (u+v+w+x - min4 (u,v,w,x) - max4 (u,v,w,x)) /. 2.0 2
Exercice 2 Maximum de trois entiers (à préparer pour le TP2) Spéciez et réalisez une fonction qui détermine le maximum de trois entiers distincts deux à deux. Étudiez diverses solutions selon la manière de conduire l'analyse par cas et de la formuler. SPÉCIFICATION MATHÉMATIQUE maximum de 3 entiers Prol max3 : Z Z Z... Sémantique : max3(a, b, c) est le maximum des 3 nombres a, b, c distincts deux à deux Il existe plusieurs réalisations de cette fonction, on en présente quatre diérentes. 2.1 Réalisation basée sur une analyse en fonction du résultat (3 cas) RÉALISATION INFORMATIQUE maximum de 3 entiers (version 1) a si a b et a c Algorithme 1 : max3(a, b, c) = Implantation 1 b si........... et.......... c si........... et.......... let (max3 :... *... ->...) = function (a, b, c) -> if (...) then a else (if (b>=a && b>=c) then.. else ) (if (...) then.. else c (* cas impossible donc on rend ce qu'on veut *) ) 2.2 Réalisation basée sur des analyses par cas imbriquées RÉALISATION INFORMATIQUE maximum de 3 entiers (version 2) si (a > b) Algorithme 2 : max3(a, b, c) = si (b a) si a > c rendre a si........... rendre c si b > c rendre.. si.......... rendre.. Remarque Cet algorithme par étude de cas imbriquée correspond à une implantation au moyen de (if.. then.. else..) imbriqués. 3
Implantation 2 let (max3 : int.. int.. int... int) = function (a, b, c) -> if (a>b) then (if (...) then.. else c) else (if (...) then b else c) 2.3 Réalisation par composition de fonctions RÉALISATION INFORMATIQUE maximum de 3 entiers (version 3) Algorithme 3 : max3 (a, b, c) =........... (a,........... (b,c)) L'analyse par cas de l'algorithme 2 est eectuée dans la fonction max2. Implantation 3 let (max3 : int * int * int -> int) = function (a, b, c) ->... (a,... (b,c)) 2.4 Réalisation en nommant un calcul intermédiare On utilise la construction Ocaml (let.. in..) an de donner un nom au calcul du maximum des entiers a et b. Ce procédé correspond à ce que font les mathématiciens lorsqu'ils écrivent : Posons m = le maximum de a et b et nous pourrons utiliser m dans la suite... RÉALISATION INFORMATIQUE maximum de 3 entiers (version 4) Algorithme 4 : Soit m le maximum de a et b. Le maximum des nombres (a, b, c) est le maxi- mum de m et de c. Cet algorithme peut aussi s'écrire : max3(a, b, c) = La construction (posons var = expr dans une expression utilisant var) existe en Ocaml mais s'écrit en anglais : (let var = expr in une expression utilisant var) posons m = max2(a, b) dans max2(m, c) Remarque importante : Ne pas confondre les expressions suivantes L'expression posons m = max2 (a,b) dans max2 (m,c) est une définition-utilisation. Elle dénit m puis l'utilise dans un calcul. L'expression si m = max2 (a,b) alors max2 (m,c) est un branchement conditionnel. Elle utilise un m déjà déni et teste si la valeur de ce m est égal au maximum de a et b 4
Implantation 4 let (max3 : int * int * int -> int) = function (a, b, c) -> let m =... in max2 (m,c) Implantation 4' (même idée mais sans utiliser la fonction max2) let (max3 : int * int * int -> int) = function (a, b, c) -> let m = (if (...) then.. else..) in (if (m>c)...) Exercice 3 Typage d'une expression 3.1 Détermination du type d'une expression Complétez les pointillés avec le type de chacune expression soulignée ainsi que le type des fonctions g :........................ et f :............................. let expression1... = (let a = "aeiouy"... in (let b = g(a)... in (if ( b... ) then f(a)... else 0... ))) ; ; a :.................................., b :.................................., g :..........................................................................., longueur :..................................................................... expression1 :.................................................................. 3.2 Exemple d'expression non-typable Complétez les pointillés avec le type de chacune expression soulignée (dans l'ordre indiqué par les numéros) ainsi que les types des fonctions numéro :...................... et f :.......................... Montrez qu'on aboutit à un conit de type qui justie que l'expression e n'est pas typable (donc elle n'a pas de sens). 5
let e = (let y = (6)... {}}{ f(0) and z = in (let x = (if ( y = 'a') then f(2) else z + 1 ) (1)... (7)... {}}{ f(1) (3)... (2)... in x < numéro(y) (5)... )) (4)... x :....................., y :....................., z :....................., numero :...................................................................... f :............................................................................ e :............................................................................ 6