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