Centrale Informatique MPI 2026Sujet
- Bases de données relationnelles et SQL
- Programmation fonctionnelle en OCaml
- Analyse lexicale et syntaxique
- Structures de données et allocation dynamique en C
- Graphes
- Logique propositionnelle et déduction naturelle
- Complexité et NP-complétude
Téléchargements
- Corrigé : pas encore disponible
- Rapport du jury : pas encore publié
Présentation du sujet
Logique déontique : bases de données, analyse lexicale et syntaxique, univers de Kripke et déduction naturelleAfficher ou masquer la section
Présentation du sujet
Le sujet introduit la logique déontique, qui distingue ce qui est vrai de ce qui devrait être vrai à l'aide de mondes idéaux, puis la décline en quatre parties : une base de données SQL sur des découpages administratifs fictifs, l'analyse lexicale et syntaxique en OCaml de formules déontiques, une modélisation en C par univers de Kripke avec étude de la décidabilité et de la NP-complétude, et enfin un système de déduction naturelle étendu à l'opérateur d'obligation.
- 1Partie A : base de données (SQL)Écrire des requêtes SQL portant sur une base de données de communes et de départements proposés par différents conseillers, pour distinguer ce qui est vrai dans le monde réel de ce qui est obligatoire ou possible.
- 2Partie B : analyse lexicale et syntaxique d'une formule déontique (en OCaml)Écrire en OCaml les fonctions de découpage en lexèmes puis d'analyse syntaxique transformant une formule déontique textuelle en arbre de syntaxe abstraite.
- 3Partie C : univers de Kripke (en C)Représenter en C des formules déontiques et des univers de mondes reliés par une relation d'accessibilité, puis étudier la décidabilité et la NP-complétude du problème de satisfiabilité.
- 4Partie D : déduction naturelle pour la logique déontiqueÉtendre un système de déduction naturelle classique par des règles spécifiques à l'opérateur d'obligation et prouver des séquents logiques.
L'épreuve en chiffres
Moyenne 9,41 / 20 · écart-type 3,89 · 764 présents · où vous situez-vous ?Afficher ou masquer la section
L'épreuve en chiffres
- Moyenne
- 9,41/ 20
- Écart-type
- 3,89
- Présents
- 764
- Coefficient
- 16
- Durée
- 4 h
- 1er quartile
- 6,5
- Médiane
- 9,5
- 3e quartile
- 12
Votre note sur 20 à ce sujet, en conditions de concours.
Source : document officiel du concours, épreuve du 5 mai 2026. Notes publiées par le concours (après harmonisation le cas échéant). Courbe : estimation par une loi normale.
Ces sujets peuvent vous intéresser
Pas encore de corrigé pour ce sujet : voici des sujets proches corrigés.
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
Informatique
Une propriété qui n'a pas le devoir d'être fausse, est dite autorisée. Ainsi, si l'affirmation « Mon pull est jaune » est vraie dans au moins un monde idéal, alors elle est autorisée. On dira que l'affirmation est possible ou qu'elle peut être vraie. Une affirmation autorisée peut éventuellement être fausse dans un monde idéal, l'essentiel est qu'elle soit vraie dans au moins l'un d'entre eux.
Partie A - Base de données (SQL)
Elle demande à chaque conseiller quel département doit être conservé, quels nouveaux départements devraient être créés et quelle commune devrait être rattachée à quel département. Chaque conseiller va décrire son monde idéal, et expliciter, dans son monde idéal, quels départements existent, et quelle commune appartient à quel département.
Le monde réel sera le monde numéro zéro, et le monde idéal du
| Nom | INSEE |
| Beauregard | 1030 |
| Malicorne-sur-Sarthe | 72179 |
| Marvejols | 48092 |
- -La colonne INSEE représente le numéro INSEE de la commune.
- -La colonne Département indique à quel département est rattachée la commune.
- -La colonne Monde indique dans quel monde l'information de cette ligne est vraie.
| Monde | INSEE | Département |
| 0 | 72179 | Sarthe |
| 0 | 48092 | Lozère |
| 5 | 48092 | Gévaudan |
Q2. Déterminer les numéros des conseillers qui proposent que la commune du « Mont-Saint-Michel » soit rattachée au département d'Ille-et-Vilaine.
On pourra utiliser le fait qu'une seule commune porte ce nom.
Q3. Déterminer les communes (numéro INSEE) qui peuvent faire partie de la Sarthe, c'est-à-dire les communes qui, dans au moins un monde idéal, font partie de la Sarthe.
On attend une table avec le numéro INSEE de la commune et le nom du département.
On rappelle qu'une affirmation est obligatoire dès lors qu'elle est vraie dans tous les mondes idéaux, peu importe qu'elle soit vraie dans le monde réel.
Partie B - Analyse lexicale et syntaxique d'une formule déontique (en OCaml)
- « ( Grand_mere_a_prepare_des_crepes et doit je_mange_les_crepes ) »

I - Analyse lexicale
- -les opérateurs logiques décrits en texte : « non », « et », « doit »;
- -les deux symboles de parenthèses : « ( », « ) »;
- -les variables propositionnelles, par exemple « Grand_mere_a_prepare_des_crepes », décrites avec du texte sans aucun espace. On s'autorise les 26 lettres de l'alphabet (en majuscule ou minuscule) ainsi que le caractère spécial _. On impose que ce caractère spécial ne soit pas le premier caractère.
type lexeme =
Lex_var of string
| Lex_et
| Lex_non
| Lex_doit
| Lex_PO (* parenthèse ouvrante *)
| Lex_PF (* parenthèse fermante *)
- -
E l'ensemble des caractères d'espacement : l'espace simple, la tabulation (\t) et le saut de ligne (\n); - -
A l'ensemble des 26 lettres de l'alphabet (sans accent ni cédille) en majuscule ou en minuscule (soit 52 caractères au total); - -
P l'ensemble contenant deux symboles, la parenthèse ouvrante et la parenthèse fermante.
let alphabet = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
let espaces = " \t\n"
Par exemple, sous_chaine "abracadabra" 34 doit renvoyer "acad" et sous_chaine "abc" 13 est un appel qui lève une exception.

L'état initial est l'état 0 . N'importe quel symbole de
- -la sous chaîne de chaine, du caractère d'indice debut inclus au caractère d'indice fin_lexeme exclu est reconnue par l'automate;
- -il n'existe pas de plus grande sous-chaîne commençant en debut qui soit reconnue;
- -debut_lexeme est l'indice du premier caractère après l'indice debut qui n'est pas dans
E .
On définit la fonction produit_lexeme comme suit :
let produit_lexeme chaine debut fin =
match sous_chaine chaine debut (fin-debut) with
| "et" -> Lex_et
| "non" -> Lex_non
| "doit" -> Lex_doit
| "(" -> Lex_PO
| ")" -> Lex_PF
| x -> Lex_var x
- Q9.Écrire une fonction analyse_lexicale : string -> lexeme list qui prend en entrée une chaîne de caractères et qui renvoie en sortie sa décomposition en suite de lexèmes.
Cette fonction doit lever l'exception Erreur_Lexicale s'il n'est pas possible de convertir la chaîne de caractères en suite de lexèmes.
Par exemple, analyse_lexicale "non doit manger_crepe" doit renvoyer : [Lex_non; Lex_doit; Lex_var "manger_crepe"].
II - Grammaire non contextuelle
Les symboles terminaux considérés sont les mots-clés « et », « non », « doit », ainsi que les parenthèses « ( » et « ) ». Les variables propositionnelles, par exemple « manger_crepes », sont représentées dans la grammaire par le symbole terminal générique
Les symboles
On définit une première grammaire,
- (i)
A → (E)|E - (ii)
E → n|A etA| nonA| doitA
- (i)
E → n|(B)|C - (ii)
B → E etE - (iii)
C → nonE| doitE - Q10.Considérons les mots
m_1:=≪x doit ( y et z ) 》 etm_2:=≪x et doit ( non y et z ) ». Pour chacun de ces mots, indiquez s'il dérive :
-de la grammaireG ;
-de la grammaireH .
- Q12.La grammaire
G est-elle ambiguë? La grammaireH est-elle ambiguë? Justifiez votre réponse (on ne demande pas de preuve formelle dans le cas d'une non-ambiguïté, mais une brève justification).
III - Analyse syntaxique
Cet arbre syntaxique abstrait est représenté en OCaml par le type formule défini ci-après :
type formule =
Var of string
| Et of formule * formule
| Non of formule
| Doit of formule
- -f est un arbre syntaxique correspondant à un préfixe prefixe de la liste lexemes.
- -reste est une liste telle que prefixe @ reste = lexemes; ainsi reste est la liste lexemes à laquelle on a retiré la partie prefixe qui a servi à générer f.
exception Erreur_Syntaxique (* ceci définit une nouvelle exception *)
let rec derive_E lexemes = match lexemes with
| Lex_var x :: q -> (Var x, q); (* E -> n *)
| Lex_PO :: q -> (* E-> ( B ) *)
begin
match derive_B q with
| f , Lex_PF :: q2 -> (f, q2)
| _ -> raise Erreur_Syntaxique
end
| _ -> derive_C lexemes (* E -> C *)
and derive_B lexemes = match derive_E lexemes with
| f1, Lex_et : : q -> (* B -> E et E *)
begin
(* bloc de code 1 *)
end
| _ -> raise Erreur_Syntaxique
and derive_C lexemes = match lexemes with
(* bloc de code 2 *)
(Non (Var "manger_crepe"), [Lex_et; Lex_doit; Lex_var "remercier_mamie"; Lex_PF]).
- Q13.Compléter le « bloc de code 1 » situé à la ligne 16 du code ci-dessus.
Q15. Écrire une fonction analyse_syntaxique : lexeme list -> formule qui prend en entrée une liste de lexèmes et qui renvoie, si possible, l'arbre syntaxique qui permet de générer cette liste de lexèmes et lève l'exception Erreur_Syntaxique sinon.
Partie C - Univers de Kripke (en C)
I - Formules déontiques
- (i)Si
P est une variable propositionnelle, alorsP est une formule déontique. - (ii)Si
φ etψ sont des formules déontiques alors(φ ∧ ψ) et(φ ∨ ψ) et(φ → ψ) sont des formules déontiques. - (iii)Si
φ est une formule déontique alors¬φ ,◻φ et⋄φ sont des formules déontiques.
Ces formules sont une variante des formules définies dans la partie précédente.
Pour représenter une formule en C, nous introduisons des constantes pour les opérateurs.
const int ET = 0;
const int OU = 1;
const int NON = 2;
const int VARIABLE = 3;
const int DOIT = 4;
const int PEUT = 5;
const int IMPLIQUE = 6;
Une formule sera représentée par le type formule défini ci-dessous :
struct formule_s {
int op;
struct formule_s *gauche;
struct formule_s *droite;
int variable;
};
typedef struct formule_s formule ;
Si c'est un opérateur binaire
Si c'est un opérateur unaire, le champ gauche indique la sous-formule, le champ droite vaut NULL et le champ variable est affecté d'une valeur entière arbitraire (par exemple -1).
Si c'est une variable, gauche et droite valent NULL, et variable indique le numéro de la variable. Par exemple, si ce champ vaut 42, alors la variable est
Par exemple, la formule

- Q16.Écrire une fonction formule *cree_formule(int op, int variable, formule *fg, formule *fd) qui alloue sur le tas et renvoie une valeur du type formule avec les valeurs spécifiées pour ses champs.
- Q17.Écrire une fonction int compter_peut (formule *f) qui prend en entrée une formule f et qui renvoie le nombre d'occurrences de l'opérateur ◇ dans cette formule.
Par exemple, sur la formuleX_1 ∨ ⋄X_2 décrite précédemment, cette fonction doit renvoyer 1. - Q18.Écrire une fonction void free_formule(formule *f) qui prend en entrée une forme f et qui libère la mémoire occupée par cette formule. La fonction free_formule doit libérer la mémoire de toutes les sous-formules.
- -g est obtenue en remplaçant toutes les implications → de f ;
- -la formule f n'a pas été modifiée ;
- -aucune des sous-formules de f et de g ne partagent un même emplacement en mémoire.
II - Modèles d'une formule déontique
Pour représenter un monde en C, nous utiliserons le type monde suivant :
struct monde_s {
int taille;
bool *valuation;
};
typedef struct monde_s monde ;
taille indique le nombre de variables représentées.
valuation est un pointeur vers un tableau de booléens tel que valuation[i] soit le booléen associé à la valeur de vérité, Vrai ou Faux, de
Nous avons donc besoin d'avoir des mondes qui sont idéaux pour chaque monde idéal. Autrement dit, nous avons besoin d'une relation entre les mondes qui dise « le monde
Plus formellement, on appelle univers un graphe de mondes. Plus précisément, un univers
- -
S_𝕌 est un ensemble fini non vide de mondes, c'est l'ensemble des sommets du graphe. - -
R_𝕌 est une relation binaire.R_𝕌(m_1, m_2) signifie que dans l'univers𝕌 il existe un arc du mondem_1 vers le mondem_2 . On impose que, pour tout mondem_1 ∈ S_𝕌 , il existe un mondem_2 ∈ S_𝕌 tel queR_𝕌(m_1, m_2) .
- -
𝕌⊨_i A siA est une variable propositionnelle associée à la valeur de vérité vraie dans le mondei . - -
𝕌⊨_i φ ∧ ψ si𝕌⊨_i φ et𝕌⊨_i ψ .
- -
𝕌⊨_i φ ∨ ψ si𝕌⊨_i φ ou𝕌⊨_i ψ . -
− 𝕌⊨_i φ → ψ si𝕌⊨_i¬φ ∨ ψ . - -
𝕌⊨_i¬φ si𝕌⊨_i φ est faux. - -
𝕌⊨_i◻φ si pour tout mondej ∈ S_𝕌 tel queR_𝕌(i, j) on a𝕌⊨_j φ . - -
𝕌⊨_i⋄φ s'il existe un mondej ∈ S_𝕌 tel queR_𝕌(i, j) on a𝕌⊨_j φ .

Q22. Cet univers est-il un modèle de la formule
On dit qu'une formule
On dit qu'une formule
On considère que □ est prioritaire sur → , ainsi
On définit les formules
Q23. Montrer que la formule
Q24. Montrer que
Q25. Montrer que
On dit que deux formules sont logiquement équivalentes si elles ont exactement les mêmes modèles.
III - Formules réduites
- (i)Si
P est une variable propositionnelle alorsP et¬P sont des formules réduites. - (ii)Si
φ etψ sont des formules réduites alors(φ ∧ ψ) et(φ ∨ ψ) sont des formules réduites. - (iii)Si
φ est une formule réduite alors◻φ et⋄φ sont des formules réduites.
On remarque que
Q26. Rappeler les règles de De Morgan.
Q27. Montrer que toute formule déontique est logiquement équivalente à une formule réduite.
Q28. Écrire une fonction bool est_reduite(formule *f) qui prend en entrée une formule f et qui renvoie un booléen indiquant si la formule est réduite.
struct univers_s {
int nb_mondes;
bool **matrice;
monde *mondes;
};
typedef struct univers_s univers;
IV - Décidabilité de la satisfiabilité d'une formule déontique
On définit par récurrence un univers arborescent de profondeur
- -Un univers arborescent de profondeur 0 est constitué d'un unique monde, et d'un unique arc de ce monde vers lui-même. Ce monde est la racine.
- -Si
𝕌_1, …, 𝕌_k sont des univers arborescents deux à deux disjoints de profondeurn , de racines respectivesr_1, …, r_k et quer est un monde qui n'appartient à aucun de ces univers, alors l'univers𝕌 défini comme suit est un univers arborescent de profondeurn + 1 :- -les sommets de
𝕌 sont la réunion des sommets de𝕌_1, …, 𝕌_k à laquelle on ajoute le sommetr ; - -les arcs de
𝕌 est la réunion des arcs de𝕌_1, …, 𝕌_k à laquelle on ajoute lesarcs(r, r_1), (r, r_2), …, (r, r_k) .
- -les sommets de
L'algorithme suivant crée un univers arborescent
- -arborescent(U, 0, i) :
- -Créer une nouvelle copie nommée
r dei . - -Créer un arc de
r versr . - -Renvoyer le graphe ainsi obtenu.
- -Créer une nouvelle copie nommée
- -
arborescent(U, N, i) :- -Créer une nouvelle copie nommée
r dei . - -Pour chaque arc sortant
(i, j) dei , créerA_j = arborescent(U, N − 1, j) . - -Faire l'union des
A_j puis rajouter le monder puis, pour chaque raciner_j desA_j , créer un arc(r, r_j) .
- -Créer une nouvelle copie nommée
- Q30.Écrire une fonction int taille(univers *u, int i, int N) qui prend en entrée un univers u, un numéro de monde i dans cet univers ainsi qu'un entier N et qui renvoie la taille, en nombre de mondes, qu'aurait un univers arborescent créé par l'algorithme précédent.
- Q31.Écrire une fonction univers *arborescent(univers *u, int i, int N) qui implémente l'algorithme précédent. La racine du résultat doit être le monde numéro zéro.
- Q32.Soient
φ une formule réduite,N est le nombre de symboles⋄ et◻ de la formuleφ, 𝕌 un univers,i un monde de𝕌 et𝔸 l'univers arborescent de raciner créé par l'algorithme précédent (autrement dit𝔸 = arborescent(𝕌, N, i) ). Montrer que si𝕌⊨_i φ alors𝔸⊨_r φ . - Q33.Montrer que la proposition précédente reste vraie si on modifie l'algorithme et qu'on ne garde pas dans les
𝕌_i deux univers identiques lors de la construction. - Q34.Montrer que le problème de la satisfiabilité d'une formule déontique est décidable.
V - NP-complétude
On note DSAT le problème de la satisfiabilité d'une formule déontique.
Q35. Montrer que DSAT est NP-complet si et seulement si DSAT est dans NP.
Dans la mesure où il a été prouvé que DSAT est complet pour une classe de complexité plus grande, on conjecture qu'il n'est pas dans NP. On s'intéresse alors à un sous-problème nommé TOTAL-DSAT.
On définit un univers total comme étant un univers dans lequel tout monde est idéal pour tout autre monde. Autrement dit, un univers
On dit qu'une formule
Q36. Montrer qu'il existe une formule déontique satisfiable qui n'est satisfiable dans aucun univers total.
Q37. Soit
- -
𝕋 est un sous-graphe de𝕌 ; - -
𝕋 est total; - -pour toute sous-formule
⋄ψ deφ , s'il existe un ou plusieurs mondesk tels que𝕌⊨_k ψ , alors au moins un de ces mondes est dans𝕋 .
Partie D - Déduction naturelle pour la logique déontique
Q40. Donner un arbre de preuve pour le séquent
Pour modéliser l'obligation, on étend les règles de la figure 1 en ajoutant trois nouvelles règles spécifiques à l'opérateur □. Ce système étendu est noté

Questions fréquentes
4 questionsSur quels chapitres porte le sujet d'informatique MPI Centrale 2026 ?Afficher ou masquer la section
Questions fréquentes
4 questionsSur quels chapitres porte le sujet d'informatique MPI Centrale 2026 ?
Il porte sur les bases de données SQL, la programmation en OCaml pour l'analyse lexicale et syntaxique, la programmation en C pour manipuler des structures de graphes, et la logique propositionnelle avec la déduction naturelle.
Quelles parties du sujet sont indépendantes ?
Les quatre parties portent sur des aspects différents de la logique déontique et utilisent des langages différents (SQL, OCaml, C, logique formelle), ce qui permet de les aborder de façon largement autonome après avoir lu l'introduction commune.
Faut-il maîtriser plusieurs langages de programmation pour ce sujet ?
Oui, le sujet mobilise successivement le SQL pour les bases de données, OCaml pour l'analyse lexicale et syntaxique, et le C pour la manipulation de structures représentant des formules et des univers de mondes.
Le sujet aborde-t-il la complexité algorithmique ?
Oui, la partie C étudie la décidabilité du problème de satisfiabilité d'une formule déontique puis démontre la NP-complétude d'un sous-problème appelé TOTAL-DSAT.
Pas de description pour le moment
