Université Paris 6
Licence d'informatique
Module de Programmation
Année 1999-2000


Travaux dirigés n° 5






Exercice 1

Typez les expressions définies dans la session Caml suivante. L'environnement initial est noté Env-Init:
1.
let a = 3 and b = 1;;
let g = function x -> a*x+b;;
g 1;;
let a = true and b = false;;
g 1;;

2.
let f2 = function x -> let a = 3 and b = 1 in a*x+b;;
f2 1;;

3.
let f3 = let a = 3 and b = 1 in function x -> a*x+b;;
f3 1;;

4.
let h = function x -> (fst x,x);;
Qu'en concluez-vous sur le type de cette fonction ?
Exercice 2

Dans le but d'écrire une fonction reste : (int*int) -> int qui permette de traiter le cas d'une division par 0, nous effectuons les déclarations suivantes :
exception Divise_par_zero of int ;;
let rec reste = 
    function (a,b) ->
      if (b = 0)  then  raise Divise_par_zero(a)
      else if ( b < 0 )  then  reste (a,-b) 
      else if (a < 0)  then  reste (-a,b)
      else if (a < b)  then  a 
      else  reste (a-b,b);;

1. Écrivez reste de manière un peu plus élégante en utilisant une fonction récursive utilitaire qui suppose ses deux arguments positifs.


2. Déduisez en une implémentation de pgcd : int*int -> int qui ne fasse pas de test à 0 mais qui rattrape l'exception Divise_par_zero.
Exercice 3

Nous allons nous familiariser ici avec le type des listes. On pourra revenir à cet exercice après avoir vu le polymorphisme.
1. Définissez le type des listes d'entiers.
2. Écrivez (définir, typer et évaluer) les fonctions suivantes : Dans la suite on donnera les solutions pour ce type en définissant ses propres fonctions puis pour le type prédéfini des listes en s'appuyant sur la bibliothèque disponible en Caml.
3. Écrivez une fonction qui recherche, par dichotomie, si un élément est ou non présent dans une liste triée.
4. Écrivez la fonction merge qui fusionne deux listes triées. En déduire une fonction de tri par dichotomie.
Exercice 4

Typez et évaluez la déclaration suivante :
exception ArgumentNegatif
let fact = 
    let rec fac2 = function(v,n) -> if (n = 0) then v else fac2(v*n,n-1)
    in
      function n -> if (n < 0) then raise ArgumentNegatif else fac2(1,n) ;;

Exercice 5 (Les listes d'associations, épisode I)

Une association est un couple composé d'une clé et d'une valeur. Notre objectif est de définir une fonction assoc recherchant la valeur associée à une clé dans une liste d'associations.


1. Définir le type paramétré list_assoc. Écrire une valeur de ce type.


2. Écrire la fonction assoc prenant une clé et une liste d'associations et retournant « une » valeur associée à la clé dans la liste. La fonction lèvera l'exception prédéfinie Not_found si la clé est absente.


3. Écrire la fonction assoc_all retournant toutes les valeurs associées à une clé donnée. En cas d'absence, on continuera à lever l'exception Not_found.

                                      to be continued...
Ce document a été traduit de LATEX par HEVEA.