Adloun

Corrigé Mines-Ponts 2026 Informatique option MP — Partie 5 (Q23 à Q30) : Des formules de Presburger aux automates : décidabilité

Sujet officiel du concours Mines-Ponts, session 2026, épreuve Informatique option MP. Corrigé rédigé par Ibrahim Alame.

Sujet officiel (PDF, site du concours)

Énoncé

On reprend le type automate et les fonctions des parties 1 et 2 (pow2, decompose, union, determinise, complementaire, intersection). On note la lettre de dont toutes les lignes valent . Pour et ,

(les mots de dont on a oublié la ligne ). On dispose de automate_somme n i j k, qui reconnaît (pour ), et de automate_egalite n i j, qui reconnaît . Pour une formule sous forme simple sur les variables , est l'assignation qui donne à chaque variable libre la valeur , et . Types du sujet (les variables sont des entiers) :


type terme = V of int | Plus of int*int

type formule =
    |Existe of int * formule
    |Et of formule * formule
    |Non of formule
    |Egale of terme * terme

Q23. Écrire sans_zero : automate -> automate : même automate, dont les états finaux sont les états permettant d'atteindre un état final par une suite de transitions étiquetées .
Q24. Pour , donner .
Q25. Écrire automate_existe : automate -> int -> automate reconnaissant .
Q26. Expliquer le principe d'un algorithme qui, pour sous forme simple et l'indice de sa plus grande variable, renvoie un automate reconnaissant .
Q27. Le faire tourner à la main, automates intermédiaires compris, sur .
Q28. Écrire automate_formule : formule -> int -> automate.
Q29. Démontrer la correction de cet algorithme.
Q30. En déduire est_vraie : formule -> int -> bool qui décide si une formule sous forme simple sans variable libre est vraie.

Corrigé

Q23. Un état doit devenir final s'il existe un chemin (de longueur éventuellement nulle) vers un état final . On construit le graphe des transitions par renversé, puis on le parcourt en profondeur depuis les états finaux :


let sans_zero a =
  let zero = Array.make a.n 0 in
  (* pred.(q') : les états q tels que q --0--> q' *)
  let pred = Array.make a.k [] in
  for q = 0 to a.k - 1 do
    List.iter (fun q' -> pred.(q') <- q :: pred.(q')) (a.delta q zero)
  done;
  let finaux = Array.copy a.finaux in
  let rec remonte q' =
    List.iter (fun q -> if not finaux.(q) then begin
                          finaux.(q) <- true; remonte q end) pred.(q')
  in
  for q = 0 to a.k - 1 do
    if a.finaux.(q) then remonte q
  done;
  { a with finaux = finaux }

Correction. Un état marqué l'est parce qu'il est final ou parce qu'il a une transition par vers un état marqué : par récurrence sur l'ordre de marquage, il atteint un état final par des . Réciproquement, si avec final, on montre par récurrence descendante sur que est marqué : l'est au départ, et quand est marqué, remonte est appelée sur lui (au départ s'il est final, au moment de son marquage sinon) et marque pred.($q_{j+1}'$). Terminaison et coût : remonte n'est appelée qu'une fois par état (un état n'est marqué qu'une fois), d'où un coût , où est le nombre de transitions par , plus appels à delta. L'automate d'entrée n'est pas modifié (copie de finaux).

Conséquence, utilisée plus loin : , car un calcul sur finit dans un état désormais final si et seulement s'il se prolonge par jusqu'à un état final de . (Exécutée : sur l'automate à quatre états , final, les quatre états deviennent finaux ; sur un automate de (lettres écrites comme des bits) reconnaissant le seul mot , les mots acceptés de longueur deviennent , et .)

Q24. On garde les lignes 1 et 3 de chaque mot de et l'on laisse la ligne 2 libre, avec la même longueur. Le mot vide donne ; la lettre donne deux mots ; le mot de longueur en donne :

Soit mots. (Confirmé en appliquant automate_existe de Q25 à un automate reconnaissant et en énumérant les mots acceptés de longueur .) Ce que le correcteur attend : l'énumération des mots, pas une paraphrase de la définition (rapport du jury MPI sur le sujet jumeau).

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 →