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


Travaux dirigés n° 2






Exercice 1

Évaluez les expressions ci-dessous. On supposera qu'à chaque question correspond une nouvelle session camllight interactive.
1.
let l = 3::[];;
[]@l@[4];;
l::[1];;
l@["34"; "2"];;

2.
let xxx = (3,"45",true) and yyy = (1.2, "xxx", false);;
let f (x,y,z) = (x, string_of_int x ^ y, not z);;
f xxx;;
f yyy;;
let zzz = (3, ("45", true)) and ttt = ((3, "45"), true);;
xxx = zzz or xxx = ttt;;

3.
type t = {x : int; y : int; z : string list};;
let rec1 = {x = 3; z = ["2"]; y = 1};;
let rec2 = {x = 3; y = 1; z = ["2"]};;
rec1 = rec2;;
type t' = {xxx : int; yyy : t};;
let rec3 = {xxx = 1; yyy = {x = 4; y = 5; z = []}};;
rec3.yyy.z;;
type t'' = {x : int};;
let rec4 = {x = 6};;
rec2.x + rec4.x;;

4.
type C = C1 | C2 | C3 of int * float * string list;;
let x = C3(1, 1.2, ["aaa"; "bbb"]);;
let f = function 
   | C1 -> 1
   | C3(x,y,z) -> x
   | C2 -> 0;;
f x;;
type C' = C1 | C3 of int * float * string list;;
f x;;
let g = function
   | C1 -> 1
   | C3(x,y,z) -> x;;
g x;;

Exercice 2

Quel est le type de la fonction suivante et que fait elle :
let inconnue l =
   let rec inconnue_rec = function
      | [] -> l
      | x::reste -> (inconnue_rec reste) @ [x]
   in
      if l = [0] then []
      else inconnue_rec l;;

Exercice 3 (Représentation d'un jeu de cartes)

Dans le présent exercice ainsi que dans les suivants, vous allez progressivement programmer les premisses d'un arbitre pour jouer à la belote. Pour l'instant, votre but est de modéliser en camllight le jeu de 32 cartes servant à la belote.


1. Une carte est définie par sa couleur (carreau, coeur, pique, trèfle) et sa hauteur (as, roi, dame, valet, dix, neuf, huit, sept). Définissez les types énumérés couleur et hauteur à cet effet.


2. Définissez le type carte comme un enregistrement contenant les informations de couleur et de hauteur.


3. Définissez les valeurs représentant l'as de trèfle, la dame de coeur et le 8 de carreau.


4. En utilisant le type list prédéfini en camllight, définissez le type main représentant un ensemble (une liste) de cartes.


5. En quoi le type main ne répond t-il pas entièrement à la question ? Donnez un contre-exemple.


Exercice 4 (Le comptage des points)

En fin de partie, les cartes sont évaluées de la façon suivante : quelle que soit la couleur de l'atout, l'as vaut 11 points, le roi vaut 4 points, la dame vaut 3 points, le dix vaut 10 points, le huit et le sept ne valent aucun point. Dans la couleur de l'atout, le valet vaut 20 points et le 9 vaut 14 points, mais dans les autres couleurs, le valet ne vaut que 2 points et le 9 ne vaut rien du tout.


1. Écrivez une fonction valeur donnant la valeur d'une carte. Commencez par réfléchir au type que devra posséder cette fonction.


2. Utilisez la fonction précédente pour définir une fonction valeur_main donnant la valeur d'une liste de cartes.


Exercice 5 (Le rangement des cartes)

Dans cet exercice, on souhaite ranger une main par couleur et par valeur (on rappelle que la valeur d'une carte dépend de sa couleur). L'ordre souhaité pour les couleurs est celui du bridge (Trèfle, Carreau, Coeur, Pique).


1. Écrivez un prédicat inf qui retourne le booléen true si son premier argument est une carte devant être placée avant la carte donnée en second argument.


2. Écrivez une fonction insere qui introduit une carte à l'endroit souhaité dans une main déjà convenablement rangée.


3. Écrivez une fonction range qui classe une main.


Exercice 6 (Le tirage des cartes)

Par définition, l'ensemble des cartes d'un jeu est en bijection avec l'intervalle [0,31] des entiers.


1. Définissez formellement une telle bijection (il y a bien entendu plus d'une réponse possible). Définissez alors en camllight au moyen de deux fonctions cartes_of_int et int_of_cartes cette bijection.


2. Que fait la fonction foo suivante :
let foo () = 
   let rec foo_rec i =
      if i = 32 then []
      else i::(foo_rec (i+1))
   and foo_rec2 i l =
      if i = 32 then l
      else
         let n = random__int (32-i) in
         let l' = map (function x -> if x = n then i
                                     else if x = i then n
                                     else x) l in
         foo_rec2 (i+1) l'
   in let l = foo_rec 0 in
      foo_rec2 0 l;;

3. Écrivez la fonction tirage qui génère une distribution du jeu de 32 cartes sous la forme d'une liste de cartes.


Exercice 7 (La représentation d'un jeu)

La belote est un jeu qui se joue à quatre joueurs usuellement désignés sous les noms de Nord, Sud, Est et Ouest. Les joueurs opposés géographiquement sont dans la même équipe. En début de partie, chaque joueur reçoit 8 cartes et une couleur est désignée comme celle de l'atout. Dans un tour, chacun joue une carte et l'équipe qui remporte le pli, le place dans son talon afin que les points soient comptés en fin de partie.


1. En tenant compte des informations précédentes, définissez le type de données jeu représentant l'état d'une partie à la fin d'un pli.


2. Écrivez la fonction initialise créant une situation de début de partie.


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