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