Adloun

Corrigé X-ENS 2026 Informatique C MPI — Partie II (Q7 à Q12) : Ultime invariance, parcours en profondeur imbriqués

Sujet officiel du concours X-ENS, session 2026, épreuve Informatique C MPI. Corrigé rédigé par Ibrahim Alame.

Sujet officiel (PDF, site du concours)

Énoncé

Pour , (eventually always). Figure 2 du sujet, sur :

Q7. Figure 2, : pour quels a-t-on ? ?
Q8. si et seulement si un état accessible depuis fait un cycle sur lui-même (exécution de longueur non nulle de à ).

Algorithme des parcours imbriqués (figure 3 du sujet) ; le tableau marked est partagé par tous les parcours internes :


(** Parcours externe: [outer_iter t s0 f] appelle la fonction [f] sur
    tous les états [s] accessibles à partir de [s0]. *)
let outer_iter (t:trans_sys) (s0:state) (f:state->unit) : unit =
  ... (* Implémentation à réaliser en question 10. *)

exception Found

let verify (t:trans_sys) (phi:state->bool) (s0:state) : bool =
  (* Parcours internes: détection de cycle *)
  let marked = Array.make t.size false in
  let cycle_check start =
    let rec inner_visit s =
      if not marked.(s) then begin
        marked.(s) <- true;
        List.iter
          (fun (_,s') ->
             if s' = start then raise Found;
             inner_visit s')
          (t.next s)
      end
    in
    inner_visit start
  in
  (* Parcours externe: états accessibles *)
  try
    outer_iter t s0
      (fun s' -> if not (phi s') then cycle_check s');
    true
  with Found -> false

Q9. Un parcours en profondeur depuis induit un arbre couvrant les états accessibles ; on l'énumère (a) en ordre postfixe, (b) les frères (et leurs descendants) dans l'ordre de visite. Si précède et est accessible depuis , montrer que fait un cycle sur lui-même.
Q10. Implémenter outer_iter selon un tel ordre.
Q11. Spécifier cycle_check (pré- et postconditions sur marked, cas où Found est levée), prouver cette spécification, puis la correction de verify (terminaison non demandée).
Q12. verify reste-t-elle correcte avec un ordre préfixe ? (argument ou contre-exemple à moins de quatre états)

Corrigé

Q7. Lecture de la figure : , , , , , , , , , , , . Aucun état n'est terminal, donc toute exécution finie se prolonge en une exécution infinie : si et seulement si tous les états accessibles depuis (lui compris) sont dans .

C'est conforme à Q8 : le seul état hors de qui fait un cycle est ( n'a pas d'arc entrant, ne revient jamais sur lui-même), accessible depuis et seulement. Exécuté : verify (avec l'outer_iter de Q10) rend true exactement pour .

Q8. () Soit et avec et . L'exécution infinie passe par à une infinité de positions : pour tout , il existe avec . Sa trace n'est pas dans , donc .

() Si , une exécution infinie issue de a une trace : pour tout il existe avec . L'ensemble est donc infini. Comme est fini, par le principe des tiroirs, deux positions de portent le même état . Le préfixe de jusqu'à la position est une exécution de à ; le morceau entre et est une exécution de à , de longueur .

Q9. L'énumération est l'ordre de fin de visite. Pour chaque état de l'arbre, notons et les instants de début et de fin de sa visite (appel récursif sur ). La visite de contient celles de ses fils, lancées l'une après l'autre dans l'ordre de visite : les intervalles sont emboîtés ou disjoints, emboîtés exactement quand l'un est ancêtre de l'autre (propriété des parenthèses). L'ordre des place chaque nœud après ses descendants (a) et le sous-arbre d'un frère visité plus tôt avant celui d'un frère visité plus tard (b) ; comme (a) et (b) déterminent entièrement l'énumération, « précède » équivaut à .

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 →