dst21 Sol
dst21 Sol
dst21 Sol
L’épreuve durera 1 heure. Le sujet vaut 25 points plus 2 points de bonus. Si vous obtenez n points, votre note
sera égale à (min n 20).
On suppose dans tout cet exercice que l’on ne travaille qu’avec des entiers positifs ou nuls.
Q2 – (2pts) On considère encore une population dont la taille double chaque année.
Q3 – (3pts) On considère maintenant un modèle de croissance plus complexe. Chaque année la population croît de la
moitié: tn+1 = tn + t2n . Mais lorsque la population dépasse (strictement) une taille limite alors elle est divisée par 2. On
fixe cette taille limite à 128.
t0 = 42
Si on considère une taille initiale de 42, l’évolution de la population est donnée par la suite tn+1 = t2n si tn + t2n > 128
= tn + 2 sinon
tn
Indication: en utilisant des définitions locales (avec let in) vous pouvez éviter de calculer plusieurs fois la même chose.
Solution Exercice I
Q1
1
let rec taille (t:int) (n:int) : int =
if (n > 0) then (taille (2*t) (n-1))
else t
Q2
let rec duree (t:int) (m:int) : int =
if (t < m) then 1+(duree (2*t) m)
else 0
Q3
let rec taille2 (n:int) : int =
if (n=0) then 42
else let m = (taille2 (n-1)) in
if (m+m/2 > 128) then m/2
else m+m/2
Fin Solution
2
Exercice II : Listes bien balisées
Dans beaucoup de langages informatiques on utilise des symboles «ouvrants» et «fermants» pour structurer du texte. On
utilise les parenthèses dans les expressions en Ocaml; on utilise des balises dans les langages XML ou HTML (par exemple
les balises notées <p> et </p> délimitent un paragraphe).
Pour simplifier, on utilise les caractères ’<’ et ’>’ pour indiquer les balises (ou parenthèses) ouvrantes et fermantes.
Pour simplifier encore, on considère des listes de caractères plutôt que des textes. Et pour simplifier complètement, on ne
considère que des listes qui ne contiennent que les caractères ’<’ et ’>’.
Une liste ℓ ne contenant que les caractères ’<’ (balise ouvrante) et ’>’ (balise fermante) est dite bien balisée si et seulement
si elle vérifie les deux conditions suivantes :
Rappel: Une liste l1 est un préfixe d’une liste l2 s’il existe une liste l3 telle que l1 @ l3 = l2. Par exemple la liste
[’b’;’a’] est un préfixe de la liste [’b’;’a’;’t’;’e’;’a’;’u’]. La liste vide est un préfixe de toutes les listes. Une
liste est préfixe d’elle même.
• [’<’;’>’;’<’;’>’;’<’] est mal balisée : tout préfixe de cette liste contient bien un nombre de balises ouvrantes
supérieur ou égal au nombre de balises fermantes, mais la liste ne contient pas autant de balises ouvrantes que de
balises fermantes.
À la fin de cet exercice, nous allons définir une fonction qui teste le bon balisage d’une liste.
Préfixes
3
- : ’a list list = [ []; [’x’] ]
# (prefixes [’h’;’o’;’u’;’x’]);;
- : char list list = [ []; [’h’]; [’h’; ’o’]; [’h’; ’o’; ’u’]; [’h’; ’o’; ’u’; ’x’] ]
# (prefixes [’c’;’h’;’o’;’u’;’x’]);;
- : char list list = [ []; [’c’]; [’c’; ’h’]; [’c’; ’h’; ’o’]; [’c’; ’h’; ’o’; ’u’]; [’c’; ’h’;
’o’; ’u’; ’x’] ]
Vous utiliserez la fonction map_cons. Notez que le résultat de prefixes n’est jamais une liste vide et que le résultat de
prefixes a toujours pour premier élément une liste vide.
Nombre de balises
telles que (add_fst (n1,n2)) = (n1+1, n2) et (add_snd (n1,n2)) = (n1, n2+1).
Bon balisage
4
# (all_o_sup_f [[’<’;’<’;’>’;’>’]; [’<’;’>’;’<’;’>’;’>’]; [’<’;’<’;’>’;’<’;’>’;’>’;’<’]]);;
- : bool = false
Solution Exercice II
Q1
let rec map_cons (e:’a) (l:’a list list) : (’a list list) =
match l with
[] -> []
| h::t -> (e::h) :: (map_cons e t);;
Q2
let rec prefixes (l:’a list) : ((’a list) list) =
match l with
[] -> [[]]
| h::t -> ([] :: (map_cons h (prefixes t)));
Q3
let add_fst (c:int*int) : (int * int) =
match c with
(a,b) -> (a+1,b)
Q4
let rec nb_of (l : char list) : int * int =
match l with
[] -> (0,0)
| x::xxs -> if (x = ’<’) then (add_fst (nb_of xxs)) else (add_snd (nb_of xxs))
Q5
let o_sup_f (l : char list) : bool =
let (bo,bf) = (nb_of l) in bo >= bf
5
Q6
let rec all_o_sup_f (l:(char list) list) : bool =
match l with
[] -> true
| h::t -> (o_sup_f h) && (all_o_sup_f t);;
Q7
let dyck (l:char list) : bool =
let (no,nf) = (nb_of l) in
(no=nf) && (all_o_sup_f (prefixes l));;
Fin Solution