Adloun

Corrigé Centrale 2026 Informatique MPI — Partie C, I et II (Q16 à Q25) : Formules déontiques en C, univers de Kripke

Sujet officiel du concours Centrale, session 2026, épreuve Informatique MPI. Corrigé rédigé par Ibrahim Alame.

Sujet officiel (PDF, site du concours)

Énoncé

Formules déontiques sur des variables : variables, , , , , (« est obligatoire ») et (« est autorisée »). Représentation en C (pour un opérateur unaire, droite vaut NULL ; pour une variable, les deux fils valent NULL ; hors variable, variable est arbitraire, par exemple ) :


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;

struct formule_s {
  int op;
  struct formule_s *gauche;
  struct formule_s *droite;
  int variable;
};

typedef struct formule_s formule ;

La formule :

Q16. formule *cree_formule(int op, int variable, formule *fg, formule *fd), allocation sur le tas.
Q17. int compter_peut(formule *f) : nombre de ( sur l'exemple).
Q18. void free_formule(formule *f) : libère toutes les sous-formules ( structures sur l'exemple).
Q19. formule *retirer_implications(formule *f) : renvoie où chaque devient , sans modifier ni partager de mémoire avec .

II. Un monde est une valuation des variables ; en C, valuation[i] est la valeur de pour taille.


struct monde_s {
  int taille;
  bool *valuation;
};

typedef struct monde_s monde ;

Q20. bool satisfaction(monde *m, formule *f) pour une formule faite de variables, de et de .

Un univers est un graphe fini non vide de mondes où tout monde a au moins un successeur ; se lit « est idéal pour ». On définit par induction : une variable est satisfaite en si elle y est vraie ; , , s'interprètent au monde et comme ; si pour tout tel que , et s'il existe un tel avec . Univers (un monde est noté par ses littéraux vrais) :

Q21. A-t-on ?
Q22. A-t-on ?

est satisfiable s'il existe , un modèle de , tel que ; est conséquence logique de si tout modèle de est modèle de . est prioritaire sur ; et .
Q23. et sont satisfiables.
Q24. et sont satisfiables.
Q25. est conséquence logique de , mais pas l'inverse.

Corrigé

Toutes les fonctions C ci-dessous ont été compilées (gcc -std=c11 -Wall -Wextra, sans avertissement, avec -fsanitize=undefined) et exécutées sur la formule du sujet et sur une formule à trois implications ; les réponses de Q21 à Q25 ont été vérifiées par un évaluateur de formules écrit en Python. Les en-têtes nécessaires sont <stdlib.h>, <stdbool.h> et <assert.h>.

Ce que le correcteur attend : les constantes du sujet sont des const int, qui ne sont pas des expressions constantes au sens du C : elles ne peuvent pas servir d'étiquettes case d'un switch. On teste donc f->op par une suite de if.

Q16.


formule *cree_formule(int op, int variable, formule *fg, formule *fd) {
  formule *f = malloc(sizeof(formule));
  assert(f != NULL);                 /* malloc peut échouer */
  f->op = op;
  f->variable = variable;
  f->gauche = fg;
  f->droite = fd;
  return f;
}

La structure est allouée sur le tas, donc survit à l'appel (une variable locale serait détruite au retour et le pointeur renvoyé serait invalide). Coût .

Q17. Une formule est un arbre binaire dont les fils absents valent NULL ; on compte récursivement, en traitant NULL comme la formule vide.


int compter_peut(formule *f) {
  if (f == NULL) return 0;
  int ici = (f->op == PEUT) ? 1 : 0;
  return ici + compter_peut(f->gauche) + compter_peut(f->droite);
}

Par induction structurelle : le nombre de d'une formule est celui de sa racine ( ou ) plus ceux de ses sous-formules, et il est nul pour l'arbre vide. Un appel par nœud et un par fils NULL, soit au plus appels en : coût . Exécuté : sur .

Q18. On libère les deux sous-formules avant la racine : après free(f), lire f->gauche serait un accès à une mémoire libérée.


void free_formule(formule *f) {
  if (f == NULL) return;
  free_formule(f->gauche);
  free_formule(f->droite);
  free(f);
}

Parcours postfixe : chaque nœud est libéré exactement une fois, à condition que la formule soit un arbre (aucune sous-formule partagée, sinon on la libérerait deux fois — c'est la raison de la troisième exigence de Q19). Exécuté avec un compteur d'appels à free : libérations sur .

100 % gratuit

La suite du corrigé est sur Adloun

Le corrigé rédigé en entier, question par question, et le tuteur pour poser des questions sur ce sujet.

Voir le corrigé complet, gratuitement

Inscription gratuite en 30 secondes (e-mail, nom d'utilisateur, mot de passe, classe ou profil), sans carte bancaire : arrivée directe sur le corrigé.

Toutes les parties de l'épreuve

Corrigé complet gratuit →