durée : 2h00 Lisez entièrement le sujet avant de commencer

Transcription

durée : 2h00 Lisez entièrement le sujet avant de commencer
Devoir surveillé d'informatique
UE INF121
durée : 2h00
Aucun document n'est autorisé. Les appareils électroniques sont interdits.
Les barèmes sont donnés à titre indicatif.
Les questions sont indépendantes et peuvent être traitées séparément. Vous avez le droit d'utiliser
les fonctions des questions précédentes même si vous ne les avez pas écrites.
N'oubliez pas d'indiquer votre nom, votre prénom et votre groupe.
Avant de commencer à répondre aux questions, lisez tout le sujet et repérez les questions faciles.
Lisez entièrement le sujet avant de commencer Nom :
.............................................................................................
Prénom :
.........................................................................................
Groupe :
..........................................................................................
1
Calcul rapide du PGCD (6 pt)
Le but de l'exercice est d'écrire un algorithme de calcul rapide du pgcd (plus grand diviseur commun)
de deux entiers.
définition
(
PGCD)
L'entier positif p est le pgcd des entiers a et b si il satisfait les 3 conditions :
1. p divise a
2. p divise b
3. tout autre diviseur q de a et b est inférieur à p
On donne ci-dessous des dénitions de fonctions qui seront utiles pour dénir ensuite la
fonction pgcd. On suppose que la fonction pair est déjà implantée. Complétez les dénitions ci-dessous.
Q1.
(1 pt)
SPÉCIFICATION MATHÉMATIQUE
Prol
pair : Z → Bool Sémantique : pair (n) vaut vrai si n est divisible par 2
SPÉCIFICATION MATHÉMATIQUE
Prol
impair : Z → Bool Sémantique : impair (n) vaut vrai si n n'est pas divisible par 2
1
RÉALISATION INFORMATIQUE
Implantation
let (impair : int -> bool) =
function n -> not (pair(n))
SPÉCIFICATION MATHÉMATIQUE
Prol
dist : Z × Z → N Sémantique : dist (a, b) est la distance qui sépare les nombres a et b
Exemples
1. dist (5, 8) = 3
2. dist (15, 12) = 3
3. dist (0, −1) = 1
4. dist (−2, 0) = 2
5. dist (−2, 3) = 5
6. dist (−7, −5) = 2
Propriétés
Z
2. ∀a, b ∈ Z. a − b = −dist(a, b)
1. ∀a, b ∈ . a − b = dist(a, b) si a≥ b
si a < b RÉALISATION INFORMATIQUE
Implantation
let (dist : int * int -> int) =
function (a,b) ->
let d = a-b
in if d>0 then d else ~-d
1.1 L'algorithme du pgcd rapide
SPÉCIFICATION MATHÉMATIQUE
Prol
pgcdr : N∗ × N∗ → N∗
Sémantique : pgcdr (a, b) est le plus grand des nombres qui divise à la fois a et b.
Exemples
1. pgcdr (5, 12) = 1 en eet 5 et 12 n'ont pas de diviseur commun non nul autre que 1
2. pgcdr (8, 6) = 2 en eet 8 = 2 × 4 et 6 = 2 × 3
3. pgcdr (24, 16) = 8 en eet 24 = 3 × 8 et 16 = 2 × 8 donc 8 est le plus grand diviseur
commun de 24 et 16
L'exercice consiste à traduire chacune des remarques ci-dessous sous la forme d'une équation qui dénit
l'algorithme de calcul rapide du pgcd d'un couple d'entiers (a, b).
2
Q2.
(1.5 pt)
Complétez les pointillés dans les remarques suivantes :
RÉALISATION INFORMATIQUE
Algorithme :
Dans le cas où l'un des deux nombres a, b vaut 1 alors le pgcd vaut 1 .
Dans le cas où les nombres sont consécutifs (soit a = n et b = n + 1 ou bien b = n et
a = n + 1), le pgcd de a et b vaut 1.
Si les deux nombres a et b sont égaux alors le pgcd est ce nombre .
Si a est pair et b est impair alors le pgcd(a, b) est égal au pgcd de b et de a/2. Réciproquement, si a est impair et b pair alors le pgcd(a, b) est égal au pgcd de b/2 et
de a .
Si les deux nombres sont pairs, ils sont donc chacun divisibles par deux. Que peut-on
alors dire du pgcd de a et b ?
Si les deux nombres
impairs et a > b, les diviseurs communs à a et b sont forcément
sont
des diviseurs de a − b ; donc le pgcd de a et b est égal au pgcd de a − b et de b.
Si les deux nombres sont impairs et si a < b, les diviseurs communs àa et bsont forcément
des diviseurs de b − a ; donc le pgcd de a et b est égal au pgcd de b − a et de a .
Q3.
(1.5 pt)
À partir des remarques précédentes, complétez les équations de l'algorithme.
RÉALISATION INFORMATIQUE
Algorithme : dénition récursive de la fonction par des équations
(1) pgcdr (a, b) = 1 si a = 1 ∨ b = 1 ∨
dist(a,
b)
=
1
(2) pgcdr (a, b) = a
(3) pgcdr (a, b) = pgcdr (a , b/2 )
(4) pgcdr (a, b) =
pgcdr (a/2, b)
si a = b si impair(a) ∧ pair(b) si pair(a) ∧ impair(b) (5) pgcdr (a, b) = 2× pgcdr ( a/2 , b/2 ) si pair(a) ∧ pair(b)
(6) pgcdr (a, b) = pgcdr (a − b , b )
si impair(a) ∧ impair(b) ∧ a > b (7) pgcdr (a, b) = pgcdr (a , b − a )
si impair(a) ∧ impair(b) ∧ a < b 1.2 Exemple d'exécution
Complétez les appels récursifs engendrés par l'appel pgcdr (44, 37) en indiquant à chaque
étape l'équation utilisée. Ensuite, donnez une fonction Mesure à valeur dans qui décroit strictement à
chaque appel récursif et vériez qu'elle décroît eectivement sur la séquence d'appels récursifs engendrés
par pgcdr (44, 37).
Q4.
(2 pt)
N
def
Mesure (a, b) = a + b 3
pgcdr (44, 37)
Mesure (44 , 37 ) = 81 > Mesure (22 , 37 ) = 59 > Mesure (11 , 37 ) = 48 > Mesure (11 , 26 ) = 37 > Mesure (11 , 13 ) = 24 > d'après (4 ) =
pgcdr (22 , 37 )
d'après (4 ) =
pgcdr (11 , 37 )
d'après (7 ) =
pgcdr (11 , 26 )
d'après (3 ) =
pgcdr (11 , 13 )
d'après (7 ) =
pgcdr (11 , 2 )
Mesure (11 , 2 )
Mesure (11 , 1 )
d'après (3 ) =
pgcdr (11 , 1 )
d'après (1 ) =
1 4
= 13 > = 12 2
Fonctionnement des feux de circulation (14 pt)
La sécurité routière fait appel à votre société pour concevoir un système révolutionnaire de pilotage de
feux à 4 lampes pour un carrefour à trois branches.
f2
f1
f3
La sécurité routière a déjà eu des ennuis avec des systèmes informatiques défaillants qui ont causé des
accidents. Elle exige donc que le système soit sans faille. En cas de panne ou d'accident, votre société
sera considérée comme responsable, pourra être attaquée en justice et devra payer les dommages et
intérêts aux plaignants.
Pour s'assurer que le système est correct nous allons programmer le système ainsi que des fonctions de
vérication du bon fonctionnement du système.
2.1 Principe de fonctionnement d'un feu quadricolore
possède 4 lampes : jaune, verte, orange et rouge qu'il allume alternativement dans
l'ordre suivant :
Chaque feu
3
Rouge
2
1
Orange
Vert
Jaune
1. le jaune indique aux conducteurs de se préparer car le feu va bientôt passer au vert. Il est interdit
de traverser le carrefour quand le feu est jaune.
2. le vert indique qu'on peut traverser le carrefour.
3. l'orange indique qu'il faut ralentir et se préparer à s'arrêter car le feu va bientôt passer au rouge ;
mais on peut encore traverser le carrefour quand le feu est orange.
4. le rouge indique qu'il est interdit de passer. Le feu reste rouge pendant un nombre de minutes
qui est réglable et qui s'ache sur la lampe rouge.
Dans la suite du problème on décide que
de 3 à 1 comme sur le schéma ci-dessus.
chaque feu reste rouge pendant 3 minutes
5
décomptées
Dénissez un type Signal qui permet de représenter les 4 lampes des feux et qui associe
à la lampe rouge le nombre (strictement positif) de minutes à acher
(1 pt)
Q5.
DÉFINITION MATHÉMATIQUE D'UN ENSEMBLE
déf Signal = {Jaune , Vert , Orange }
∪ {
Rouge(n)
|n∈
N∗}
DÉFINITION INFORMATIQUE D'UN TYPE
type natpos = int (* entiers positifs *)
type signal = Jaune | Vert | Orange
| Rouge of natpos
Donnez la représentation dans ce type de la séquence des signaux qui correspond au
cycle d'un feu (de Jaune à Jaune) avec un feu rouge qui indique les minutes restantes de 3 jusqu'à 1.
(0.5 pt)
Q6.
[ Jaune ; Vert ; Orange ; Rouge (3 ) ; Rouge (2 ) ; Rouge (1 ) ; Jaune ]
Q7. (1.5 pt) Complétez la dénition de la fonction signal-suivant qui est utilisée pour modier le
signal aché par un feu.
SPÉCIFICATION MATHÉMATIQUE
Prol
signal-suivant : Signal → Signal
Sémantique : signal-suivant (s) est le signal qui suit le signal s dans le cycle d'un feu. La
fonction signal-suivant doit faire évoluer soit les couleurs soit les minutes pour respecter le
cycle d'un feu décrit dans l'introduction par le schéma.
Exemples
1. signal-suivant (Rouge(1) ) = Jaune
2. signal-suivant (Rouge(n)) = Rouge(n − 1) si n≥ 1 3. signal-suivant (Orange) = Rouge(3) RÉALISATION INFORMATIQUE
let (signal_suivant : signal -> signal) =
function (m,c) ->
match c with
| Rouge(1) -> Jaune
| Jaune -> Vert
| Vert -> Orange
| Orange -> Rouge (3)
| Rouge(n) -> Rouge(n-1)
Q8.
(1.5 pt) On souhaite écrire un prédicat qui prend en paramètres un couple de signaux (par
exemple celui du feu f1 et celui du feu f2) et qui indique si les signaux de 2 feux sont compatibles,
c'est-à-dire que les feux peuvent acher ces signaux simultanément sans qu'il y ait un risque d'accident.
SPÉCIFICATION MATHÉMATIQUE
du prédicat signaux-compatibles
Prol
signaux-compatibles : Signal × Signal → Bool Sémantique : Les seuls cas incompatibles sont les signaux qui indiquent tous les deux aux
conducteurs qu'ils peuvent passer (relire la partie 2.1). Il y a quatre cas incompatibles.
6
Exemples
1. (Vert, Vert) sont incompatibles et (Vert, Jaune) sont compatibles.
2. (Orange , Rouge(2)) sont compatibles
3. (Orange, Orange) sont incompatibles Propriétés
1. ∀s ∈ Signal. ∀n ∈
N. (
Rouge(n)
, s) sont compatibles
RÉALISATION INFORMATIQUE
let (signaux_compatibles : signal * signal -> bool ) =
function
| (Vert,Vert)->false
| (Orange,Orange)->false
| (Vert,Orange)->false
| (Orange,Vert)->false
| _ , _ -> true
2.2 Vérication des congurations du carrefour à 3 branches
La conguration, à un instant donné, des feux f1, f2, f3 est représentée par un triplet de signaux.
Exemple
La conguration (Vert, Orange, Jaune) indique que le feu f1 est
Orange et le feu f3 est Jaune.
Q9.
(0.5 pt)
Vert
, le feu f2 est
Complétez la dénition d'une conguration.
Conguration
DÉFINITION MATHÉMATIQUE DE L'ENSEMBLE
déf Conguration =
Signal × Signal × Signal DÉFINITION INFORMATIQUE DU TYPE
type configuration = signal*signal*signal
Complétez la dénition du prédicat conguration-sans-danger
SPÉCIFICATION MATHÉMATIQUE
du prédicat conguration-sans-danger
Q10.
(1.5 pt)
Prol
conguration-sans-danger : Conguration → Bool Sémantique : Une conguration est sans danger pour les conducteurs si les signaux des
trois feux sont compatibles.
Exemples
1. conguration-sans-danger (Vert, Vert, Rouge(1)) = faux 2. conguration-sans-danger (Vert, Rouge(2), Vert) = faux
3. conguration-sans-danger (Vert, Rouge(3), Orange) = faux
4.
conguration-sans-danger (Jaune, Rouge(1), Orange) = vrai 7
RÉALISATION INFORMATIQUE
let (configuration_sans_danger : configuration -> bool) =
function (f1,f2,f3) ->
signaux_compatibles(f1,f2)
&& signaux_compatibles(f2,f3)
&& signaux_compatibles(f3,f1)
Q11.
(1.5 pt)
SPÉCIFICATION MATHÉMATIQUE
du prédicat
séquence-sans-danger
Prol
séquence-sans-danger : Séq(Conguration) → Bool
Sémantique : séquence-sans-danger ([cfg1 ; . . . ; cfgn ]) vaut vrai à condition que toutes les
congurations de cfg1 à cfgn soient sans danger.
RÉALISATION INFORMATIQUE
Algorithme : dénition récursive
de la fonction par des équations
séquence-sans-danger ( [ ] ) = vrai (1)
(2) séquence-sans-danger (cfg :: s) =
conguration-sans-danger (cfg)
∧séquence-sans-danger (s)
Terminaison : On dénit Mesure (seq) def
= |seq|
preuve :
N: |seq| ∈ N (i)
Justions que la mesure choisie retourne des valeurs dans
(ii)
Montrons que la mesure décroit strictement à chaque appel récursif.
Pour (ii), on repère les équations qui comportent des appels récursifs et on prouve la décroissance de la mesure pour chaque appel récursif.
(2 )
appel
donc
séquence-sans-danger (cfg :: s) appelle séquence-sans-danger (s)
|
{z
}
|
{z
}
Mesure (cfg :: s )
>
=
>
..............
= 1 + |s|
Mesure (cfg :: s )
appel engendré
?
Mesure (s )
?
ok
>
=
...
=
...
ok
Mesure (s )
>
2.3 Vérication des changements de conguration
Pour vérier le bon fonctionnement du carrefour à trois feux, on veut s'assurer que les feux respectent
les contraintes suivantes lorqu'ils changent de conguration.
Contrainte 1 : Au moins un feu est passé au signal suivant (par un changement de couleur ou bien
par un changement de minute),
Contrainte 2 : Chaque feu a soit conservé le même signal, soit il est passé au signal suivant.
Autrement dit ce qu'on veut éviter ce sont des feux qui ne changent jamais (contrainte 1) et des feux
qui changent de signaux sans respecter le cycle décrit dans l'introduction (contrainte 2).
8
Complétez la dénition du prédicat un-enchaînement-correct qui prend en paramètre
un couple de congurations (cfg1 , cfg2 ).
SPÉCIFICATION MATHÉMATIQUE
du prédicat un-enchaînement-correct
Q12.
(2.5 pt)
Prol
un-enchaînement-correct :
Conguration × Conguration → Bool Sémantique : un-enchaînement-correct (cfg1 , cfg2 ) indique si le passage de la conguration
cfg1 à la conguration cfg2 respecte les contraintes.
Exemples
1. un
correct
(
Jaune, Vert, Rouge(1)) , (Jaune, Vert, Rouge(1))
-enchaînement
= faux car aucun feu n'a été modié 2. un-enchaînement
correct
(
Jaune, Vert, Rouge(2)) , (Jaune, Vert, Rouge(1))
= vrai car le 3ème feu est passé au signal suivant
3. un-enchaînement
correct
(
Jaune
,
Vert
,
Rouge
(2))
,
(
Vert, Orange, Rouge(1))
= vrai car tous les feux sont passés au signal suivant
4. un
enchaînement
correct
(
Jaune
,
Vert
,
Rouge
(1))
, (Jaune, Orange, Vert)
= faux car le 3ème feu est passé directement
de Rouge(1) à Vert sans passer par Jaune RÉALISATION INFORMATIQUE
let (un_enchainement_correct :
configuration * configuration -> bool)
function ( (f1,f2,f3) , (f1s,f2s,f3s)
not (f1s=f1 && f2s=f2 && f3s=f3)
&&
(f1s = f1 or f1s = couleur_suivante
&&
(f2s = f2 or f2s = couleur_suivante
&&
(f3s = f3 or f3s = couleur_suivante
=
) ->
(3,f1))
(3,f2))
(3,f3))
Complétez la dénition de la fonction séquence-correcte qui prend en paramètre une
séquence de conguration.
Q13.
(1.5 pt)
SPÉCIFICATION MATHÉMATIQUE
d'un prédicat
Prol
séquence-correcte : SéqConguration → Bool Sémantique : La fonction séquence-correcte indique si tous les enchaînements entre les
congurations successives de la séquence sont corrects.
Exemples
1. séquence-correcte [ (Jaune, Vert, Rouge(2)) ] = vrai 2. séquence
-correcte [ (Jaune, Vert, Rouge(2)) ; (Jaune, Vert, Rouge(1)) ] =
vrai 9
RÉALISATION INFORMATIQUE
Algorithme : dénition récursive de lafonction par des équations
(1)
séquence-correcte ( [ ] ) = vrai (2)
séquence-correcte ( [cfg] ) = vrai (3) séquence-correcte ( cfg1 :: cfg2 :: s ) =
un enchaînement-correct (cfg1 , cfg2 )
∧séquence-correcte (cfg2 :: s)
2.4 Enregistrement et vérication du fonctionnement des feux
Tout au long de la journée les changements de congurations sont enregistrés les uns à la suite de
autres dans une séquence. L'enregistrement est régulièrement téléchargé et contrôlé par un ordinateur
pour vérier que le boîtier électronique de commandes des feux fonctionne correctement.
Q14.
(0.5 pt)
Complétez la dénition d'un enregistrement.
DÉFINITION MATHÉMATIQUE D'UN ENSEMBLE
déf Enregistrement =
Séq(Conguration)
DÉFINITION INFORMATIQUE D'UN TYPE
type enregistrement = configuration list
Q15. (1.5 pt) L'ordinateur chargé de contrôler l'enregistrement doit vérier d'une part que chaque
conguration de l'enregistrement est sans danger et d'autre part que tous les changements de conguration sont des enchaînements corrects. Complétez la dénition de la fonction vérication qui prend
en paramètre un enregistrement.
SPÉCIFICATION MATHÉMATIQUE
du prédicat
vérication
Prol
vérication : Enregistrement → Bool Sémantique : La fonction vérication (e) indique si l'enregistrement e correspond à un
fonctionnement correct des feux.
RÉALISATION INFORMATIQUE
let (verification : enregistrement -> bool) =
function e ->
sequence_sans_danger(e)
&& sequence_correcte(e)
10
Si vous acez ni en avance...
(0 pt)
2.5 Choix de la conguration suivante
Question optionnelle (0 pt)
On souhaite maintenant programmer le boîtier électronique qui choisit
la conguration suivante des feux en fonction de la conguration actuelle. Proposez une dénition de
la fonction conguration-suivante qui correspondent à un fonctionnement correct des feux c'est-à-dire
sans danger et avec des enchaînements corrects de conguration, sachant que la durée d'un feu rouge
doit être d'au moins 2 minutes.
SPÉCIFICATION MATHÉMATIQUE
Prol
conguration-suivante : Conguration → Conguration Sémantique : conguration-suivante (cfg) est la conguration suivante des feux du carrefour. La fonction conguration-suivante doit toujours donner une conguration qui correspond à un fonctionnement correct des feux.
let (configuration_suivante : configuration -> configuration) =
function (c1,c2,c3) ->
(couleur_suivante (3,c1),
couleur_suivante (3,c2),
couleur_suivante (3,c3))
Indiquez dans quelle conguration doivent commencer les feux lors
de l'inauguration du carrefour et construisez la séquence des 10 premières congurations produites
par votre fonction conguration-suivante et vériez que les congurations sont sans danger et que les
enchaînements sont corrects !
Question optionnelle (0 pt)
[ (Couleur , Couleur
, Couleur
(Couleur , Couleur
(Couleur , Couleur
(Couleur , Couleur
(Couleur , Couleur
(Couleur (Couleur , Couleur
, Couleur
(Couleur (Couleur , Couleur
(Couleur , Couleur
, Couleur );
);
, Couleur , Couleur
, Couleur
);
);
, Couleur
, Couleur
);
);
, Couleur
, Couleur
, Couleur
, Couleur
);
);
);
) ]
11