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


Travaux dirigés n° 5





Exercice 1 (Applications) Typez soigneusement les expressions suivantes dans un environnement de typage Env0. Vous indiquerez les contraintes que doit vérifier Env0 pour pouvoir typer chacune de ces phrases.


1.

 4 < 3;;
 "debut " ^ "fin";;
 string_of_int 34;;
 x = false;;

Exercice 2 (Fonctions) Typer les phrases suivantes. L'environnement initial de typage est Env0.

1.
let f = function x -> 3*x+1;; 

2.
let h = function par -> par & (par < 1);; 

3.

 let g = function x -> function y -> x*y+1;;
 g (f 1) 2;;
 let k = g (f 1);;

4.
 let a = 3 and b = 1;;
 let g = function x -> a*x+b;;
 g 1;;
 let a = 0 and b = true;;
 g 1;;
 let f2 = function x -> let a = 3 and b = 1 in a*x+b;;
 f2 1;;
 let f3 = let a = 3 and b = 1 in function x -> a*x+b;;
 f3 1;;
 let h = function x -> (fst x,x);;
Qu'en concluez-vous sur le type de la fonction h?


Exercice 3 (Typage) Typez les phrases suivantes. Celles-ci sont numérotées pour faciliter la rédaction. La session débute dans l'environnement Env0.

(1) let code = 1900;; 
(2) let g = let code = 10 
              in  function y -> y + code;;
(3) g 25;;
(4) code;;
(5) let k = function (f,x) -> f (g (x-1)) + 2;;
(6) k (function z -> z + code, 3) ;;
 

Exercice 4 (Typage) Soit la déclaration :

  let double_applic = function (f,x) -> f(f (x+1)) ;;

1. Typez cette déclaration.
2. Que calcule (double_applic (succ,25))?
3. Typez cette application.


Exercice 5 (Typage) Typez la session suivante :
let x = 1 and y = 2;;
let x = 0 and y = x-1;;
let h = function f -> function g -> function z -> f ((g (x+z))+y);;
h 10;;
let x = 1 and y = x+1;;
h 10;;
  

Exercice 6 (Typage) Soit le programme suivant:

let a = 1;;
let k = function y -> y - a;;
let h = function u -> u + k(u);;
let f = function v -> h(v) + v;;
Typez la déclaration:
f 25;;

Exercice 7 (Années bissextiles) Sachant que le 1er janvier 1900 était un lundi, que toutes les années multiples de 4 sont bissextiles sauf 1900, écrire une fonction donne_jour qui prend en argument une date entre 1900 et l'an 2000 (exclus) et qui retourne le jour correspondant.

L'argument de la fonction est supposé être un triplet (jour,mois,année), où jour et année sont des entiers et mois appartient à l'ensemble {janvier, février, mars, avril, mai, juin, juillet, aout, septembre, octobre, novembre}. La fonction donne_jour lèvera en outre une exception grâce à l'instruction failwith "date non valide" lorsque la date est incorrecte.
Ce document a été traduit de LATEX par HEVEA.