Centrale Option Informatique MP 2014Sujet, corrigé et rapport du jury
- Logique propositionnelle (formes normales conjonctives)
- Structures de listes et récursivité
- Complexité algorithmique
- Programmation en Caml ou Pascal
Téléchargements
Présentation du sujet
Difficulté moyenneRésolution du jeu de sudoku par codage en formules logiques et programmationAfficher ou masquer la section
Présentation du sujet
Difficulté moyenneLe sujet d'option informatique de la filière MP au concours Centrale-Supélec 2014 propose de résoudre une grille de sudoku en traduisant les règles du jeu en formules logiques sous forme normale conjonctive, puis en programmant des algorithmes de résolution (propagation unitaire et règle du littéral infructueux). Le sujet, de difficulté variée mais sans progression stricte, laisse le temps de programmer explicitement les fonctions demandées, en Caml ou en Pascal.
- 1I. Présentation du jeu de sudokuPrésentation des règles du sudoku et de sa représentation en tableau, puis écriture de fonctions préliminaires de manipulation de listes.
- 2II. Codage de la formule initialeTraduction des règles du jeu et de la grille initiale en une formule logique sous forme normale conjonctive, représentée comme une liste de listes de littéraux.
- 3III. Résolution d'une grille de sudokuProgrammation de la règle de propagation unitaire puis de la règle du littéral infructueux pour résoudre effectivement une grille de sudoku.
Difficulté moyenne. Le rapport indique que le sujet a été globalement correctement traité et que le niveau global des candidats est satisfaisant, même si plusieurs confusions récurrentes (listes/vecteurs, clause/littéral, signature des fonctions) ont pénalisé de nombreuses copies.
Ce qu'a observé le jury
5 erreurs relevéesSignature des fonctions Caml non précisée · Confusion entre listes et vecteurs · Signature confondue avec le caractère itératif ou récursifAfficher ou masquer la section
Ce qu'a observé le jury
5 erreurs relevéesLe jury constate que le sujet a été globalement correctement traité, avec des questions de tous niveaux sans réelle progression de difficulté. Il relève cependant des lacunes fréquentes dans la manipulation des structures de listes et dans la traduction rigoureuse des formules logiques attendues, ainsi qu'un manque de soin dans la présentation du code, notamment en fin d'épreuve.
Les erreurs les plus sanctionnées
- 1Signature des fonctions Caml non précisée
Contrairement à la demande explicite du sujet, beaucoup de candidats composant en Caml oublient de préciser la signature de leurs fonctions ou en donnent une fantaisiste.
« beau- coup de candidats composant en Caml oublient de préciser la signature des fonctions ou mettent des signatures fantaisistes. »
- 2Confusion entre listes et vecteurs
Certains candidats confondent les listes et les vecteurs, ou convertissent inutilement les listes en vecteurs pour rechercher des éléments.
« certains candidats confondent les listes et les vecteurs, ou convertissent les listes en vecteurs pour chercher des élé- ments. »
- 3Signature confondue avec le caractère itératif ou récursif
Certains candidats confondent la signature d'une fonction avec son caractère itératif ou récursif, ce qui révèle une incompréhension des types utilisés.
« Certains confondent la signature avec le caractère itératif ou récursif de la fonction. »
- 4Distinction clause / littéral mal maîtrisée
De nombreux candidats se révèlent incapables de distinguer clairement clauses et littéraux ou d'utiliser correctement les constructeurs de types prévus dans l'énoncé.
« De nombreux candidats se sont révélés incapables de faire cette distinction ou d’utiliser correctement les constructeurs des types X(i, j, k) et NonX(i, j, k) »
- 5Clause vide et formule vide confondues
En partie III, plusieurs candidats ont des difficultés à différencier la clause du littéral, le littéral de la variable, et la formule vide (satisfiable) de la clause vide (non satisfiable).
« des difficultés pour différencier la clause du littéral, le littéral de la variable, et la formule vide, satisfiable, d’une formule contenant la clause vide »
Ce qui a été bien réussi
- Les meilleurs candidats ont traité correctement le problème, avec une bonne rédaction.
- Le niveau global des candidats est jugé satisfaisant, avec certaines copies tout à fait excellentes, claires et précises, ce qui est une vraie performance sans machine.
- La plupart des candidats ont correctement constaté que la table de vérité de la formule complète n'est pas exploitable en temps et en espace raisonnables, justifiant le recours à la propagation unitaire.
Conseils du jury
- Se souvenir que le code informatique est souvent un travail collectif : il doit être correct, mais aussi clair ou au moins commenté.
- Préciser systématiquement la signature de chaque fonction écrite en Caml, comme demandé explicitement dans le sujet.
- Éviter de multiplier les fonctions auxiliaires au sein d'une même fonction élémentaire, au détriment de la lisibilité.
- Mettre au moins quelques explications sur le code produit en fin d'épreuve, même en cas de manque de temps.
Synthèse rédigée par WikiPrépa à partir du rapport officiel du jury (à télécharger en PDF). Les citations sont extraites du rapport.
Ces sujets peuvent vous intéresser
Lecture du sujet en ligne
L'énoncé complet, avec les formules et les figures, sans ouvrir le PDF.Afficher ou masquer la section
Lecture du sujet en ligne
Le sujet comporte trois parties: la partie I est essentiellement consacrée à présenter le problème étudié ; la partie III nécessite d'avoir compris le principe de l'encodage décrit et étudié dans la partie II, mais il n'est pas besoin d'avoir répondu aux questions de la partie II pour l'aborder.
I Présentation du jeu de sudoku
Règles du jeu
| 9 | 2 | 6 | 5 | ||||
| 3 | 2 | 7 | |||||
| 7 | 9 | 5 | 8 | ||||
| 1 | |||||||
| 7 | 9 | ||||||
| 6 | 4 | ||||||
| 8 | 7 | ||||||
| 3 | 4 | 9 | 1 | 5 | |||
| 3 |
| 0 | 1 | 2 | 3 | 4 | 5 | ||
| 0 | 0 | 9 | 0 | 2 | 0 | 0 | 6 |
| 1 | 3 | 2 | 0 | 0 | 0 | 7 | 0 |
| 2 | 0 | 7 | 0 | 9 | 0 | 5 | 0 |
| 3 | 0 | 1 | 0 | 0 | 0 | 0 | 0 |
| 4 | 0 | 0 | 7 | 0 | 0 | 0 | 0 |
| 5 | 6 | 0 | 0 | 0 | 0 | 0 | 0 |
| 6 | 0 | 0 | 8 | 0 | 0 | 0 | 0 |
| 7 | 0 | 3 | 0 | 4 | 9 | 0 | 0 |
| 8 | 0 | 0 | 0 | 0 | 0 | 3 | 0 |
| 0 | 0 | ||||||
La figure 1 à gauche représente une grille initiale (dont 24 cases sont remplies). Les blocs sont matérialisés par un trait plus épais.
L'objet du problème est d'étudier un algorithme de résolution des grilles de sudoku fondé sur la manipulation de formules logiques. En effet, le principe de la résolution d'une grille de sudoku peut s'énoncer facilement par les cinq règles logiques ci-dessous.
Construire à partir d'une grille initiale
(K) toute case de
(L) toute ligne de
(C) toute colonne de
(B) tout bloc de
(I) toute case de
Représentation d'une grille de sudoku
La figure 1 à droite représente le tableau correspondant à la grille initiale donnée à gauche, dans laquelle le bloc numéro 3 est grisé. Les éléments du bloc grisé de numéros
Caml
Pascal
Préliminaires
I.
I.
I.
Caml
indice : int * int -> int * int = < fun >
On rappelle que pour deux entiers
Pascal
procedure indice(b, r: integer ; var i, j : integer) ;
et modifiera la valeur des entiers
On rappelle que pour deux entiers
II Codage de la formule initiale
Représentation des formules logiques
Un littéral est une formule logique réduite à
Dans tout le problème, les variables propositionnelles sont indexées par un triplet d'entiers (
À titre d'exemples :
- la clause
x_((0, 0))^5 ∨ x_((0, 8))^5 ∨ x_((8, 0))^5 ∨ x_((8, 8))^5 exprime qu'une au moins des quatre cases situées aux coins de la grille est occupée par un 5 ; - la formule sous forme normale conjonctive
⋀_(i = 0)^8(⋁_(k = 1)^9 x_((i, 7))^k) exprime que chacune des valeurs de la colonne 7 est constituée de chiffres compris entre 1 et 9 ; - la clause
⋁_(j = 0)^8 x_(indice (3, j))^6 exprime que l'une des cases du bloc numéro 3 de la grille contient le chiffre 6 (où indice est la fonction/procédure de la question I.D).
Pour la programmation, les clauses sont des listes de littéraux et les formules logiques (qui seront écrites exclusivement en forme normale conjonctive) des listes de clauses.
Ainsi, en notant les listes entre⟨⟩_– , la formulex_((1, 8))^7 ∧ (x_((0, 4))^3 ∨ ¬x_((2, 7))^5) est représentée formellement par la liste de listes⟨⟨(1, 8, 7)⟩; ⟨(0, 4, 3); (2, 7, 5)^–⟩⟩ (où un triplet surligné désigne un littéral négatif). Plus précisément:
Caml
type litteral
Dans un triplet d'entiers de type int * int * int, le premier élément correspond au numéro de ligne, le second au numéro de colonne et le troisième à la valeur comprise entre 1 et 9 . Une clause est de type litteral list et une formule logique (en forme normale conjonctive) de type litteral list list.
Pascal
type litteral
On dispose d'une fonction
litt(signe: boolean; i: integer ; j: integer ; k: integer) : litteral
qui permet de créer des littéraux. Par exemple litt(true, 0, 0, 9) renvoie le littéral
- Nil qui est la liste vide ; on peut tester si une liste 1 est vide avec l'expression
1 = Nil ; - tete(c: clause) : litteral et tete(f : formule) : clause qui permettent d'obtenir le premier élement d'une liste ;
- queue(c: clause) : clause et queue(f : formule) : formule qui permettent d'obtenir la queue d'une liste ;
- ajout_en_tete(l : litteral ; c : clause) : clause et ajout_en_tete(c : clause ; f : formule) : formule qui permettent d'ajouter un élément en tête d'une liste ;
- concatener(f1: formule ; f2: formule) : formule qui permet de concaténer deux listes, cette fonction a un coût linéaire en la taille de la première liste.
On suppose que l'on peut tester l'égalité de deux littéraux 11 et 12 à l'aide de l'expression11 = 12 . Cette opération n'est pas disponible pour les clauses et les formules.
II.A - Formule logique décrivant la règle du jeu
Chacune des quatre règles logiques
(K1) toute case de
(L1) toute ligne de
(C1) toute colonne de
(B1) tout bloc de
(K2) toute case de
(L2) toute ligne de
(C2) toute colonne de
(B2) tout bloc de
II.A.1)
b) Traduire la condition (K1) par une phrase mathématique.
c) En déduire une formule
d) Déterminer le nombre de clauses que contient
e) Écrire une fonction case1 qui ne prend pas d'argument et renvoie la liste qui représente la formule logique
II.A.2) Traduire la condition (L1) par une phrase mathématique et en déduire une formule
II.A.3)
b) Écrire une fonction bloc1 qui renvoie la liste qui représente la formule logique
II.A.4)
b) En déduire une phrase mathématique qui traduit la condition (L2) et une formule
c) Déterminer le nombre de clauses que contient L2.
d) Écrire une fonction lig2 qui renvoie la liste qui représente la formule logique
II.A.5) Obtenir de même des formules logiques
On pose alors
II.B - Formule logique décrivant la grille initiale
On pourrait pour cela se contenter de considérer une formule logique
Mais, pour accélérer la phase d'inférences logiques qui sera menée dans la partie III, on n'hésite pas à introduire à nouveau de la redondance en déduisant d'emblée un certain nombre de faits que l'on ajoute à la formule
- si dans la grille initiale, la case d'indice
(i, j) est déjà remplie par la valeurk ∈ [ [1, 9] ] , on peut considérer d'emblée, en plus de la clause unitaire positivex_((i, j))^k (déjà prise en compte par la formuleF ci-dessus), les 8 clauses unitaires négatives¬x_((i, j))^l avecl ∈ [ [1, 9] ]∖{k} ; on enrichit ainsi la formuleF en une formuleF_1
en forme normale conjonctive constituée der clauses unitaires positives (celles deF ) et8r négatives (oùr est le nombre de cases remplies dans la grille initiale) ; - si, dans une grille initiale, une case d'indice (
i, j ) n'est pas remplie (c'est-à-dire est occupée par la valeur 0 ), alors on sait que cette case ne peut être remplie par aucune valeurk ∈ [ [1, 9] ] apparaissant déjà dans la lignei , ou dans la colonnej , ou dans le bloc auquel appartient la case d'indice (i, j ); puisqu'une telle valeurk est interdite pour la case d'indice (i, j ), on peut donc considérer la clause unitaire négative¬x_((i, j))^k ; ainsi, pour la case d'indice ( 1,3 ) de l'exemple de la figure 1 à droite, il n'est pas question de remplacer la valeur 0 par aucune des valeurs appartenant à{2, 3, 4, 5, 7, 9} : on peut donc ajouter les clauses¬x_((1, 3))^2, ¬x_((1, 3))^3 ,¬x_((1, 3))^4, ¬x_((1, 3))^5, ¬x_((1, 3))^7 et¬x_((1, 3))^9 ; on note alorsF_2 la formule en forme normale conjonctive constituée de la conjonction de toutes ces clauses unitaires négatives obtenues en parcourant toutes les cases non remplies de la grille initiale.
La formule décrivant la grille initiale est doncF_(grille) = F_1 ∧ F_2 .
II.B.1) Écrire une fonction donnees qui, à partir d'une grille de sudoku initiale (donnée sous la forme d'un tableau), renvoie la formuleF_1 , toujours sous la forme d'une liste de listes de littéraux.
II.B.2)
b) Écrire une fonction interdites_ij qui, étant données une grille de sudoku initiale et une case d'indice (
c) Écrire une fonction interdites qui, à partir d'une grille de sudoku initiale, renvoie la formule
II.B.3) Montrer que le nombre de clauses de la formule
Formule initiale complète
On supposera dans la partie III avoir écrit une fonction formule_initiale qui, à partir d'une grille initiale, renvoie la formule
Caml
formule_initiale : int vect vect -> litteral list list = < fun >
Pascal
III Résolution d'une grille de sudoku
III.A - Règle de propagation unitaire
III.A.1) Combien existe-t-il de valuations satisfaisant
III.A.2) Déterminer le nombre de lignes de la table de vérité de
- en supprimant toutes clauses de
F qui contiennentl ; - en supprimant
¬l de toutes les clauses deF (ainsi si une clause ne contient que¬l elle est remplacée par la clause vide⊥ )
Par exemple la formuleF = (¬x_((0, 2))^3) ∧ (¬x_((0, 2))^3 ∨ x_((2, 5))^6) ∧ (x_((0, 2))^3 ∨ ¬x_((1, 4))^7) contient un unique littéral isolé¬x_((0, 2))^3 . En simplifiantF par ce littéral, on obtient la formuleF^′ = ¬x_((1, 4))^7 .
III.A.3) On justifie formellement cette simplification. SoitF une formule en forme normale conjonctive contenant un littéral isolél (associé à la variable propositionnellep : on a doncl = p oul = ¬p ). F peut s'écrire alors sous la formeF = l ∧ F_1 ∧ F_2 ∧ F_3 , où : -
F_1 est une formule constituée de clauses contenant chacune le littérall ; -
F_2 est une formule constituée de clauses contenant chacune le littéral¬l et ne contenant pas le littérall ; -
F_3 est une formule constituée de clauses ne contenant chacune ni le littérall , ni le littéral¬l .
La formule simplifiée de
Soit
L'algorithme de résolution du sudoku que nous proposons est appelé algorithme de propagation unitaire et consiste à appliquer la simplification présentée ci-dessus de manière répétée tant que l'on peut déduire de nouveaux littéraux isolés.
III.A.4) Appliquer l'algorithme de propagation unitaire à la formule
III.A.5)
b) Retrouver le résultat
III.A.6) Écrire une fonction nouveau_lit_isole qui, à partir d'une formule
III.A.7) Écrire une fonction simplification qui, à partir d'un littéral
III.A.8) Écrire une fonction propagation qui, à partir d'un tableau
III.A.9) Que peut-on dire sur le tableau modifié
III.A.10) On appelle taille d'une formule
III.B - Règle du littéral infructueux
Étant donné une formule
- si l'algorithme de propagation unitaire appliqué à la formule
F ∧ ¬x permet de déduire la clause vide alors on ajoute la clausex àF ; - si l'algorithme de propagation unitaire appliqué à la formule
F ∧ x permet de déduire la clause vide alors on ajoute la clause¬x àF .
III.B.1) Justifier formellement que si l'on peut déduire la clause vide à partir de la formuleF ∧ ¬x alorsF ≡ F ∧ x 。
III.B.2) Écrire une fonction variables qui, à partir d'une formule, renvoie la liste de ses variables sans doublons.
On supposera qu'on dispose d'une fonction flatten qui à partir d'une formulef renvoie la clause formée de tous les éléments des sous-listes def . Par exemple flatten appliqué à⟨⟨(1, 8, 7)⟩; ⟨(2, 7, 5)^–; (1, 8, 7)⟩⟩ renvoie⟨(1, 8, 7); (2, 7, 5)^–; (1, 8, 7)⟩ .
III.B.3) Écrire une fonction deduction qui, à partir d'un tableau, d'une variablex et d'une formuleF , renvoie 1 si la règle du littéral infructueux permet d'ajouter la clausex àF, − 1 si elle permet d'ajouter la clause¬x àF et 0 sinon.
On supposera qu'on dispose d'une fonction copier_matrice qui à partir d'un tableau renvoie un autre tableau distinct contenant les mêmes valeurs.
III.B.4) Nous proposons un deuxième algorithme de propagation basé sur la règle du littéral infructueux. Celui-ci consiste à appliquer la propagation unitaire et, quand celle-ci ne permet plus de déduire de nouvelles clauses, à appliquer la règle du littéral infructueux pour obtenir une nouvelle clause unitaire de la formex ou¬x . Dès lors on peut reprendre la propagation unitaire. Le processus s'arrête lorsque ni la propagation unitaire ni la règle du littéral infructueux ne permettent de déduire de nouvelles clauses.
Écrire une fonction propagation2 qui, à partir d'un tableaut représentant le sudoku et d'une formuleF représentant les contraintes du sudoku, met en œuvre cet algorithme. Cette fonction modifiera le tableaut selon la valeur des cases pouvant être déduites.
III.B.5) Écrire une fonction sudoku qui, à partir d'un sudoku donné sous forme d'un tableaut , modifiet et renvoie la grille complétée au maximum en utilisant les techniques précédentes.
Expérimentalement, la règle de propagation unitaire permet de résoudre les sudokus les plus faciles et environ la moitié des sudokus les plus difficiles. À notre connaissance, il n'existe pas de sudoku ne pouvant être résolu intégralement à l'aide de la règle du littéral infructueux.
Questions fréquentes
4 questionsSur quels chapitres porte le sujet d'informatique MP Centrale 2014 ?Afficher ou masquer la section
Questions fréquentes
4 questionsSur quels chapitres porte le sujet d'informatique MP Centrale 2014 ?
Le sujet porte sur la résolution du sudoku par la logique propositionnelle : traduction des règles du jeu en formes normales conjonctives, manipulation de listes, puis programmation d'algorithmes de propagation unitaire et de règle du littéral infructueux.
Quelles erreurs le jury a-t-il le plus relevées à ce sujet d'informatique MP 2014 ?
Le jury relève des signatures de fonctions Caml non précisées ou fantaisistes, des confusions entre listes et vecteurs, entre signature et caractère itératif ou récursif, et entre clause, littéral et formule vide.
Ce sujet d'informatique MP 2014 est-il difficile ?
Le rapport le juge globalement correctement traité, avec un niveau satisfaisant, même si des confusions récurrentes sur les structures de listes et la logique propositionnelle ont pénalisé de nombreuses copies.
Le sujet d'informatique MP 2014 peut-il être traité en Pascal ?
Oui, le sujet permet de composer en Caml ou en Pascal ; l'énoncé fournit dans les deux cas les signatures de fonctions et types attendus.
Pas de description pour le moment
