Partiel

Transcription

Partiel
Licence STS mention Informatique, semestre 5
Programmation fonctionnelle (Info 311)
2011–2012
Durée : 2h
4 pages
Examen du 26 octobre 2011
Les notes de TD manuscrites ainsi que les fiches de cours et le polycopié de cette année
sont les seuls documents autorisés. Veuillez lire attentivement les questions. Veuillez rédiger
proprement, clairement et de manière concise et rigoureuse.
Les types et l’utilisation des itérateurs sur les listes pouvant être utiles dans les questions suivantes sont donnés à la fin de ce document.
1
Syntaxe
Entourer toutes les sous-expressions dans les déclarations suivantes, puis relier par un
trait les occurrences de chaque variable au lieur qui lui correspond.
let x = 10
let f x = x +. 12.
let x =
let x =
let y =
let x = f 10. in let x = int_of_float x in x + x in y = x in not x
2
Typage
Les fonctions suivantes sont-elles bien typées ? Si oui, donner leur type, sinon préciser
pourquoi.
let
let
let
let
3
f1
f2
f3
f4
x
x
x
x
y
y
=
y
= let z = x + 1 in y || z > 10
z = if x < y then z else y
let z = ref x in z + 1
= for i = x to 10 do y := x::!y done; !y
Évaluation
Question 3.1 Étant donnée la fonction mystere suivante :
let mystere l =
let rec mystere_rec h l =
match l with
| [] -> !h
| x :: r -> h:=()::!h; mystere_rec h r
in
mystere_rec (ref []) l
Donner (en le justifiant) le résultat renvoyé par l’expression mystere [1 ; 2 ; 3 ; 4 ; 5].
1
Question 3.2 Étant donnée la fonction mystere suivante :
let rec mystere l =
match l with
| [] -> []
| x::r ->
let r’ = mystere r in
match r’ with
| [] -> [x]
| y::_ -> (x+y)::r’
Donner (en le justifiant) le résultat renvoyé par l’expression mystere [1 ; 2 ; 3].
4
Programmation : manipulation de fichiers HTML
Le but de cette partie est de réaliser une petite bibliothèque de manipulation de fichiers
HTML. Les fichiers (très simples) qui nous intéressent sont constitués de phrases encadrées
par des balises ouvrantes et fermantes. Chaque balise contient le nom d’un tag et une liste
d’attributs. Les attributs, qui sont constitués d’une clé et d’une valeur, ne sont pas spécifiés.
Par contre, on suppose que les balises sont formées à partir des quatre tags suivants :
•
•
•
•
H1 pour un titre ;
P pour un paragraphe ;
B pour une phrase en caractères gras ;
Font pour une phrase avec une fonte particulière.
Pour simplifier, nous supposons que les balises ne sont pas imbriquées. On va représenter
ces fichiers HTML à l’aide des types ocaml suivants :
type tag = H1 | B | P | Font
type balise = { tag : tag; attributs : (string * string) list }
type phrase =
{ balise : balise;
mots : string list }
type document = phrase list
Le type énuméré tag représente les quatre tags H1, B, P et Font. Les balises sont
représentées par des valeurs de type balise qui, en plus d’un tag, contiennent une liste de
paires de chaı̂nes de caractères pour représenter les attributs. Le type phrase est celui des
phrases encadrées par des balises. Il contient un champ balise contenant la balise ainsi
qu’un champ mots contenant la liste des mots de la phrase. Enfin, le type document permet
de modéliser un fichier comme une liste de phrases. Par exemple, la liste f suivante :
let f = [
{ balise
mots =
{ balise
mots =
{ balise
mots =
= { tag = H1; attributs = ["align","center"]};
["Partiel"; "de"; "programmation"; "fonctionnelle"] };
= { tag = B; attributs = []};
["Le"; "partiel"; "d’octobre"] };
= { tag = P; attributs = []};
[] };
2
{ balise = { tag = Font; attributs = ["color","blue"]};
mots = ["C’est"; "très"; "facile!"] };
]
représente un fichier HTML avec un titre (Partiel de programmation fonctionnelle),
une phrase en caractères gras (Le partiel d’octobre), un paragraphe vide et une phrase
de couleur bleue (C’est très facile !).
Le but des cinq premières questions de cette section est de convertir des valeurs de type
document en fichiers textes dans le format HTML. Par exemple, la valeur f précédente
sera convertie en un fichier texte dont le contenu sera :
<H1 align=center > Partiel de programmation fonctionnelle </H1>
<B> Le partiel d’octobre </B>
<P> </P>
<Font color=blue> C’est très facile </Font>
Pour cela, on suppose que l’on dispose d’une fonction print : string -> unit permettant d’écrire une chaı̂ne de caractères à la fin d’un fichier HTML prédéfini (il n’est
donc pas nécessaire de le passer en argument à cette fonction). Par exemple, les deux
appels successifs suivants :
print "<H1>Bonjour</H1>";
print "<B>à tous</B>"
permettent d’écrire <H1>Bonjour</H1><B>à tous</B> dans le fichier HTML.
Question 4.1 Écrire une fonction string of tag de type tag -> string qui renvoie
la chaı̂ne de caractères correspondante à un tag. Par exemple, string of tag H1 doit
renvoyer la chaı̂ne de caractères "H1".
Question 4.2 À l’aide de la fonction print, écrire une fonction ecrire attributs de
type (string * string) list -> unit qui écrit dans le fichier une liste d’attributs au
format HTML en les séparant par un caractère espace. Par exemple, ecrire attributs
[("a1","v1") ; ("a2","v2")] doit écrire a1=v1 a2=v2 dans le fichier HTML.
Question 4.3 À l’aide des fonctions précédentes, écrire deux fonctions
ecrire balise ouvrante et ecrire balise fermante, de type balise -> unit,
qui écrivent respectivement la balise ouvrante et la balise fermante d’une valeur de type
balise au format HTML. Par exemple, si b est la balise { tag = Font ; attributs =
[("color", "blue")]}, alors ecrire balise ouvrante b et ecrire balise fermante
b doivent écrire respectivement <Font color=blue> et </Font> dans le fichier HTML.
Question 4.4 Écrire une fonction ecrire mots de type string list -> unit qui écrit
dans le fichier HTML une liste de chaı̂nes de caractères en séparant chaque chaı̂ne par
un espace. Par exemple, ecrire mots ["C’est" ; "tres" ; "facile"] doit écrire C’est
très facile dans le fichier HTML.
Question 4.5 À l’aide de l’itérateur List.iter et des fonctions précédentes, écrire
une fonction ecrire document de type document -> unit qui écrit une valeur de type
document dans un fichier texte au format HTML.
3
On va maintenant s’intéresser à l’écriture de deux fonctions particulières : la première
permet de changer le tag de certaines balises dans un document et la seconde de renverser
l’ordre des phrases et des mots dans un document.
Question 4.6 Écrire une fonction change tag de type tag -> tag -> phrase ->
phrase telle que change tag t1 t2 p change le tag de la balise de la phrase p par t2 si
son tag est égal à t1.
Question 4.7 En utilisant la fonction précédente et l’itérateur List.map, écrire une fonction change B en P de type document -> document qui change toutes les balises B d’un
document par des balises P.
Question 4.8 En utilisant List.rev et List.fold left, écrire une fonction renverse :
document -> document qui renverse un document. Par exemple, pour le document f décrit
au début de cette section, renverse f produit le document suivant :
[ {balise
mots =
{balise
mots =
{balise
mots =
{balise
mots =
= {tag = Font; attributs = [("color", "blue")]};
["facile!"; "tres"; "C’est"]};
= {tag = P; attributs = []};
[]};
= {tag = B; attributs = []};
["d’octobre"; "partiel"; "Le"]};
= {tag = H1; attributs = [("align", "center")]};
["fonctionnelle"; "programmation"; "de"; "Partiel"]}]
Rappels sur les itérateurs des listes
List.iter : (’a -> unit) -> ’a list -> unit
List.iter f [a1 ; ... ; an] = f a1 ; ... ; f an
List.rev : ’a list -> ’a list
List.rev [a1 ; ... ; an] = [an ; ... ; a1]
List.map : (’a -> ’b) -> ’a list -> ’b list
List.map f [a1 ; ..., an] = [f a1 ; ... ; f an]
List.fold left : (’a -> ’b -> ’a) -> ’a -> ’b list -> ’a
List.fold left f a [b1 ; ... ; bn] = f (... (f (f a b1) b2) ...) bn
4