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


Contrôle continu - 3 décembre 1999



Les seuls documents autorisés sont les documents manuscrits et les documents distribués en cours, TDs et TPs. La durée de l'épreuve est de 2h.



Exercice 1(10 points)

Vous pouvez utiliser toutes les fonctions vues en cours ou appartenant aux bibliothèques décrites dans le manuel de référence de Caml.
Un permis de conduire français contient, entre autres informations, l'identité de son possesseur et la liste des catégories de permis de cette personne.

Les catégories de permis considérés ici sont A (permis moto) et B (voiture).

Une personne est identifiée par son nom et sa ville donnée par son code postal.


Question 1-1 Définir les types catégorie_permis, identité et permis.

Par la suite, nous considérerons qu'une personne qui n'a pas de permis de conduire dispose d'un élément de type permis, mais que la liste des catégories de permis qu'il possède est vide.


Question 1-2 Écrire la fonction permis_voiture qui détermine si la personne détentrice d'un permis p peut conduire une voiture.

Écrire la fonction nouveau_permis qui met à jour le permis p d'une personne qui vient d'être reçue à l'examen du permis de conduire pour la catégorie c.


Question 1-3 Sachant que le département se déduit du code postal en divisant ce dernier par 1000, écrire la fonction département_of_ville qui indique le département associé à la ville v.


Question 1-4 À la suite d'un contrôle routier, un policier a relevé une liste de permis de contrevenants, il souhaite classer ces permis selon l'ordre alphabétique des noms de ces personnes. Écrire la fonction tri_alph_nom qui trie une liste de permis selon l'ordre alphabétique des noms de leurs détenteurs. Vous pourrez pour cela utiliser la fonction tri_insertion vue en cours ou bien la fonction sort du module sort qui fait partie de la bibliothèque standard de Caml.


Question 1-5 Devant la variété d'origine de ces détenteurs de permis, ce policier décide de les classer d'abord par ordre de département et pour chaque département en ordonnant les noms des contrevenants. Écrire la fonction tri_plus_complexe associée.


Question 1-6 Écrire une fonction détenteurs_permis_voiture qui extrait d'une liste de permis ceux qui permettent de conduire une voiture. On écrira cette fonction de deux façons différentes, tout d'abord directement récursivement, puis en utilisant l'itérateur filter vu en cours.


Exercice 2 (7 points)


Question 2-1 Typez complètement les déclarations suivantes. Une réponse ne comportant que le type de la fonction ne sera pas considérée comme une réponse correcte.

La session débute dans l'environnement de typage global E0. Les environnements seront ensuite nommés E1, E2,...
let x = 1;;
let f1 = function y -> y + x;;
let f2 =
  function x -> function y ->
    if x > y then x+y else f1(x-y);;
let deriv f dx x = (f(x +. dx) -. f(x)) /. dx;;
let partielle = deriv (function x -> x *. x) 0.001;;

Question 2-2 Donnez, sans détailler, le type de cette fonction et de son application:
let rec iter f n =
  if n = 0 then 1 else f (iter f (n-1));;
iter f1 1000;;

Exercice 3 (7 points)


Question 3-1 Typez complètement chacune de ces déclarations en montrant également l'évolution de l'environnement. On supposera que fst : 'a * 'b -> 'a et snd : 'a * 'b -> 'b.
let copie x = (x,x);;
let f (g,x) = g(snd x),g(fst x);;
let h x = f (copie,x);;
let m x = h (x+1,x-1);;

Question 3-2 Expliquez la différence (du point de vue du typage) entre les deux expressions suivantes:
let id = function x -> x;;
if id true then id 1 else id 2;;
et:
let id = function x -> x;;
(function f -> if f true then f 1 else f 2) id;;

Ce document a été traduit de LATEX par HEVEA.