Mathematics">
I21 Partiel 21-22 Ens-2x1
I21 Partiel 21-22 Ens-2x1
I21 Partiel 21-22 Ens-2x1
UE INF201
ALGORITHMIQUE ET PROGRAMMATION FONCTIONNELLE
2021-2022
• Le sujet comporte un QCM et trois exercices. Le QCM n’est pas nécessairement plus facile.
L’ensemble est noté sur 100 points. Le barème est donné à titre indicatif.
• Si vous êtes bloqué par une question, passez à la suivante qui peut être moins difficile. Il vous
est demandé de RÉPONDRE AUX QUESTIONS DANS L’ORDRE DE L’ÉNONCÉ.
Dans toute question, il est possible d’utiliser une fonction d’une question précédente sans
l’avoir définie. En revanche, l’utilisation d’une fonction auxiliaire de votre invention n’est
possible qu’après l’avoir spécifiée et réalisée.
2 Exercise : kuple 6
INF 201 algo. et prog. fonctionnelle 1/15 2/15 INF 201 algo. et prog. fonctionnelle
[git] • Branche master @ 621a931 • Version v1.4.1-polys-I-II ( 14/03/2022 ) par François Puitg [git] • Branche master @ 621a931 • Version v1.4.1-polys-I-II ( 14/03/2022 ) par François Puitg
y
VERSION ENSEIGNANTS – NE PAS DIFFUSER +1/1/60+ y y +1/2/59+ y
A s'évalue a true B s'évalue a false C renvoie une erreur de type Question 11 ♣ La valeur de l'expression let x = 10 in let x = 3 and y = x+4 in x+y est
A ne peut pas se simplier B not a C a Question 12 ♣ La valeur de l'expression let x = 10 in let x = 3 in let y = x+4 in x+y
est
Question 5 ♣ L'expression if a then b else false est équivalente à
A 10 B 17 C 24
A a && b E (not a) && b
Question 13 ♣ On veut implémenter une fonction f qui convertit les float sans décimale après
B not (a || b) le point (comme 2.) en int (par ex. (f 2.) = 2) et qui renvoie -1 sinon (par ex. (f 2.1) = -1).
F a || b
C (not a) || b Cocher les implémentations correctes:
D ne peut pas se simplier G not (a && b)
A aucune des autres réponses n'est correcte.
Question 6 ♣ La fonction f dénie par let f a x = if a then x = 2 else x = 3 est de type B let f (x:float):int = let y = int_of_float x in if x = y then y else -1
C let f (x:float):int = if x = int_of_float x then x else -1
A bool*int→int F bool→int→ bool
D let f (x:float):int = let y = (int_of_float x) in
B bool→int→ int G bool
if x = (float_of_int y) then y else -1
C bool→bool→ bool H bool*int→bool
D bool→bool→ bool I bool→int Question 14 ♣ On veut dénir une fonction sum : int → int telle que sum n est la somme des
entiers de 0 à n. Parmi les implémentations suivantes lesquelles sont correctes:
E int J ne peut pas être typé correctement
A let sum n = (n*(n+1))/2
Question 7 ♣ La fonction f dénie par let rec f (n: int):int = n*f (n-1)
B let rec sum n = if n>0
A renvoie la valeur n! (factorielle n) B ne termine jamais, quelque soit l'entrée n then n+(sum (n-1)) else 0
C est récursive C let rec sum n = match n with
|0-> 0
Question 8 ♣ Le type t déni par type t = Empty | Node of t*t est |n->n+(sum (n-1))
D aucune des autres réponses ne sont correctes.
A un type somme D un type énuméré
E let rec sum n = match n with
B un brave type |n->n+(sum (n-1))
C un type produit E un type récursif |0-> 0
y [git] • Branche master @ 621a931 • Version v1.4.1-polys-I-II ( 14/03/2022 ) par François Puitg y y [git] • Branche master @ 621a931 • Version v1.4.1-polys-I-II ( 14/03/2022 ) par François Puitg y
y
VERSION ENSEIGNANTS – NE PAS DIFFUSER +1/3/58+ y
B (f true 4.) vaut 4. Rappelons que les naturels de Peano sont une façon de représenter l’ensemble des entiers ⩾ 0,
C b est de type bool E z est de type unit N
noté en mathématiques. On définit le type correspondant ainsi :
type natP = Z | S of natP 1
Question 16 ♣ On dénit
let rec u n = if n< = 1 then 1 else (u (n-1))+(v (n-1)) and v n = u (n-1) L’objectif de cet exercice est d’explorer la notion de multiple dans natP, sans utiliser la multipli-
A quoi est égale (u 4): cation. Dans les implémentations demandées, l’utilisation des opérateurs arithmétiques + et ∗ est
interdite.
A 1 C 3 E 8
Le double d’un naturel est défini comme suit :
B (u 3)+(v 3) D 5 F (v 5)
spécification 1
Question 17 ♣ Soient f et g dénies par let f x = 2*x and let g y = y+6 . Quelle est la valeur
profil 𝑑𝑜𝑢𝑏𝑙𝑒 : 𝑛𝑎𝑡𝑃 → 𝑛𝑎𝑡𝑃
de g (g (f (g 9)))
sémantique 𝑑𝑜𝑢𝑏𝑙𝑒(𝑛) est le naturel de Peano correspondant à 2 × 𝑛.
A 64 B 201 C 1024 D 42 E 2019 F 32 ex. et prop. (i) 𝑑𝑜𝑢𝑏𝑙𝑒 𝑆(𝑆 𝑍) = 𝑆(𝑆(𝑆(𝑆 𝑍)))
Correction
(1) = 0.5 ; (2) = 1.5
Correction
let rec double (n:natP) : natP = 1
match n with 2
| Z -> Z 3
Q3. (2pt) Que doit-on modifier dans l’implémentation précédente pour obtenir une
fonction qui retourne le triple de son paramètre (un naturel de Peano) ?
Correction
Son nom, et on ajoute un S autour de l’appel réc.
y [git] • Branche master @ 621a931 • Version v1.4.1-polys-I-II ( 14/03/2022 ) par François Puitg y [git] • Branche master @ 621a931 • Version v1.4.1-polys-I-II ( 14/03/2022 ) par François Puitg
VERSION ENSEIGNANTS – NE PAS DIFFUSER 3.1 The type 𝑐𝑎𝑟𝑡𝑒
S(plusk (k-1) n) 5
type honneur = tete * enseigne 4
Correction Correction
Par ordre d’apparition : 0.25, 0.5, 0.5, 0.75, 0.5, 0.5, 1, 1
let rec kuple (k:int (* ⩾ 0 *)) (n:natP) : natP = 1
match n with 2
Q8. (2pt)
| Z -> Z 3
kuple 3 2
Correction
On met bien sûr les points si ça n’est pas à l’odre supérieur.
0.5 pt chaque
1. type somme
3 Exercice : bataille Normande
25 pts 2. type énuméré (c’est aussi un type somme)
INF 201 algo. et prog. fonctionnelle 7/15 8/15 INF 201 algo. et prog. fonctionnelle
[git] • Branche master @ 621a931 • Version v1.4.1-polys-I-II ( 14/03/2022 ) par François Puitg [git] • Branche master @ 621a931 • Version v1.4.1-polys-I-II ( 14/03/2022 ) par François Puitg
VERSION ENSEIGNANTS – NE PAS DIFFUSER 3.2 Rank and color of a carte 3.3 The Normandy Battle
| P(-,e) | H(-,e) -> (match e with
(ii) 𝑟𝑎𝑛𝑔( 𝐽 - )=9 3
| J(cl) -> cl 6
Correction
profil = 0.5 ; ex = 0.25 chaque
3.3 La bataille
Q10. (4.5pt) Compléter la réalisation de 𝑟𝑎𝑛𝑔 : Dans le jeu de la bataille Normande, on applique les règles suivantes pour comparer les cartes
des deux joueurs et savoir ainsi qui remporte le pli. Soit 𝑐1 la carte du joueur 1 et 𝑐2 la carte du
réalisation 1
joueur 2 :
algorithme analyse par cas par filtrage
implément. • si 𝑐1 est strictement supérieure à 𝑐2 alors 𝑐1 remporte le pli
⋮
• si 𝑐1 est strictement inférieure à 𝑐2 alors 𝑐1 perd le pli
Correction
• sinon, les cartes sont égales et il y a bataille.
profil = 0.5 ; 2 pour chaque match
let rang (c:carte) : int (* restreint à 1 ,…, 9 *) = 1
L’ordre utilisé pour comparer deux cartes est le suivant :
match c with 2
| P(p,-) -> p - 6 3
1. On compare d’abord les cartes selon leur rang (au sens de l’ordre décrit au paragraphe
| H(h,-) -> (match h with 4
précedent) ;
| Valet -> 5 5
| Dame -> 6 6
| Roi -> 7 7
2. à rang égal, les cartes de couleur noire sont inférieures aux cartes de couleur rouge ;
| As -> 8) 8
| J - -> 9 9 3. si les cartes ont même rang et même couleur, elle sont dites égales.
La couleur d’une carte est spécifiée ainsi : Pour représenter les trois résultats possibles d’une bataille entre deux cartes, on définit le type
énuméré suivant :
INF 201 algo. et prog. fonctionnelle 9/15 10/15 INF 201 algo. et prog. fonctionnelle
[git] • Branche master @ 621a931 • Version v1.4.1-polys-I-II ( 14/03/2022 ) par François Puitg [git] • Branche master @ 621a931 • Version v1.4.1-polys-I-II ( 14/03/2022 ) par François Puitg
VERSION ENSEIGNANTS – NE PAS DIFFUSER
Correction partielle
profil = 0.75 ; sémant = 1 ; ex = 0.75 ; implem = 4.5
let jouer (c1:carte) (c2:carte) : resultat = 1
if r1 > r2 then 3
Gagne 4 La modélisation précédente est assez grossière ; par exemple, elle ne permet pas de représenter
else if r1 < r2 then 5 la longueur « trois toises, six pieds et quinze pouces ».
Perdu 6
else (* r1 = r2 *) 7
Q15. (2pt) En définissant les types 𝑡𝑜𝑖𝑠𝑒, 𝑝𝑖𝑒𝑑 et 𝑝𝑜𝑢𝑐𝑒 comme des types synonymes,
implémenter le type 𝑙𝑜𝑛𝑔𝑢𝑒𝑢𝑟𝐷 .
4 Exercice : toise, pied et pouce
25 pts
Correction
Exo_et_Pb/Types_somme/Toise_pied_pouce/ 0.25 pour chaque synonyme, 1.25 pour longueurD
type toise = nat 1
Dans un ancien système de mesure de longueurs, une toise1 vaut 6 pieds et un pied vaut 12 pouces. type pied = nat 2
On étudie l’information associée à une mesure de longueur au moyen de cet ancien système d’unités. type pouce = nat 3
Dans un premier temps, on modélise une longueur à l’aide de constructeurs faisant référence à
une unité – soit la toise, soit le pied, soit le pouce – chaque constructeur comportant un paramètre
N
entier naturel ( ) exprimant la longueur dans l’unité correspondante. Par exemple :
Q16. (1pt) Définir les constantes 𝑡𝑟𝑜𝑖𝑠𝑇𝑠𝐷 (trois toises) et 𝑑𝑜𝑢𝑧𝑒𝑃𝑐𝐷 (douze pouces) de
(i) trois toises : Toise(3) type 𝑙𝑜𝑛𝑔𝑢𝑒𝑢𝑟𝐷 .
Correction
0.5 pour chaque constructeur, 0.5 pour contrainte
type nat = int (* ⩾ 0 *) 1
INF 201 algo. et prog. fonctionnelle 11/15 12/15 INF 201 algo. et prog. fonctionnelle
[git] • Branche master @ 621a931 • Version v1.4.1-polys-I-II ( 14/03/2022 ) par François Puitg [git] • Branche master @ 621a931 • Version v1.4.1-polys-I-II ( 14/03/2022 ) par François Puitg
VERSION ENSEIGNANTS – NE PAS DIFFUSER
Correction
On ne sanctionne pas l’abscence de profil si ligne 1 correcte
let longVlongD (x:longueur) : longueurD = 1
match x with 2
| Toise y -> (y,0,0) 3 Soit (-, 𝑝𝑑, 𝑝𝑐) ∈ 𝑙𝑜𝑛𝑔𝑢𝑒𝑢𝑟𝐷 ; (-, 𝑝𝑑, 𝑝𝑐) est canonique si et seulement si 0 ⩽ 𝑝𝑑 ⩽ 5 et
| Pied y -> (0,y,0) 4 0 ⩽ 𝑝𝑐 ⩽ 11.
| Pouce y -> (0,0,y) 5
On définit la notion de rang d’une unité de cet ancien système de mesure : la toise est d’un rang
supérieur au pied ; le pied est d’un rang supérieur au pouce.
Q18. (1.5pt) Implémenter la fonction 𝑙𝑜𝑛𝑔𝐷 𝑉𝑙𝑜𝑛𝑔 qui, étant donnée une 𝑙𝑜𝑛𝑔𝑢𝑒𝑢𝑟𝐷 , re-
tourne la 𝑙𝑜𝑛𝑔𝑢𝑒𝑢𝑟 correspondant à l’unité de plus haut rang. Par exemple, on devra
pouvoir vérifier que les assertions suivantes sont vraies :
Toise t 3
Correction
(3, 6, 10), (4, 0, 10) ; 0.5 chaque
La question précédente montre qu’une longueur donnée peut avoir plusieurs représentations Finalement, pour que tout cela soit lisible par un opérateur humain :
INF 201 algo. et prog. fonctionnelle 13/15 14/15 INF 201 algo. et prog. fonctionnelle
[git] • Branche master @ 621a931 • Version v1.4.1-polys-I-II ( 14/03/2022 ) par François Puitg [git] • Branche master @ 621a931 • Version v1.4.1-polys-I-II ( 14/03/2022 ) par François Puitg
VERSION ENSEIGNANTS – NE PAS DIFFUSER
Q21. (8pt) conclure en implémentant la fonction 𝑙𝑜𝑛𝑔𝐷 𝑉𝑠𝑡𝑟 qui génère une chaîne de
caractères décrivant textuellement la valeur d’une longueur détaillée, et ce sous un format
de représentation unique ; par exemple, « 3 toise 2 pied » (on ignorera les ‘s’ du pluriel).
On devra notamment pouvoir vérifier que les assertions suivantes sont vraies :
Correction
profil = 0.5 ; appel à reprCan et décomposition du triplet = 1.5 ; le reste = 6
On ne sanctionne pas l’abscence d’iVs qui n’est là que pour la lisibilité.
let longDVstr (x:longueurD) : string = 1
[git] • Branche master @ 621a931 • Version v1.4.1-polys-I-II ( 14/03/2022 ) par François Puitg