Mines Informatique optionnelle MP 2025

Thème de l'épreuve Construction d'un automate à partir d'un langage régulier
Principaux outils utilisés automates, programmation OCaml, arbres
Mots clefs inséparabilité, langage, séparation, mots, automate, minimal, Glushkov, apprentissage

Corrigé

 :
👈 gratuite pour tous les corrigés si tu crées un compte
👈 l'accès aux indications de tous les corrigés ne coûte que 1 € ⬅ clique ici
👈 gratuite pour tous les corrigés si tu crées un compte
- - - - - - - - - - - -
👈 gratuite pour ce corrigé si tu crées un compte
- - - - - - - - - - - - - -

Énoncé complet

(télécharger le PDF)
                                

Énoncé obtenu par reconnaissance optique des caractères


A2025 ­ INFO MP

ÉCOLE NATIONALE DES PONTS et CHAUSSÉES,
ISAE-SUPAERO, ENSTA PARIS,
TÉLÉCOM PARIS, MINES PARIS,
MINES SAINT-ÉTIENNE, MINES NANCY,
IMT ATLANTIQUE, ENSAE PARIS,
CHIMIE PARISTECH - PSL.
Concours Mines-Télécom,
Concours Centrale-Supélec (Cycle International).

CONCOURS 2025

ÉPREUVE D'INFORMATIQUE MP
Durée de l'épreuve : 3 heures
L'usage de la calculatrice ou de tout dispositif électronique est interdit.

Les candidats sont priés de mentionner de façon apparente
sur la première page de la copie :
INFORMATIQUE - MP
Cette épreuve concerne uniquement les candidats de la filière MP.

L'énoncé de cette épreuve comporte 10 pages de texte.

Si, au cours de l'épreuve, un candidat repère ce qui lui semble être une erreur 
d'énoncé, il le
signale sur sa copie et poursuit sa composition en expliquant les raisons des 
initiatives qu'il est
amené à prendre.

.
Les sujets sont la propriété du GIP CCMP. Ils sont publiés sous les termes de 
la licence
Creative Commons Attribution - Pas d'Utilisation Commerciale - Pas de 
Modification 3.0 France.
Tout autre usage est soumis à une autorisation préalable du Concours commun 
Mines Ponts.

Épreuve d'informatique d'option MP 2025

Préliminaires

L'épreuve est formée d'un problème unique, constitué de 28 questions, et porte 
sur l'apprentissage automatique (ou machine learning) d'un langage régulier que 
l'on souhaite déterminer
à partir de requêtes d'appartenance et de requêtes d'équivalence.
Les applications de l'apprentissage automatique d'un langage sont étendues. En 
analysant
le modèle appris, il est possible de détecter les divergences entre une 
spécification et sa mise en
oeuvre ou entre différentes mises en oeuvre tant pour des systèmes matériels 
que logiciels : par
exemple, protocoles de cartes à puce, réseaux de zombies sur internet (ou 
botnets), logiciels
patrimoniaux (ou legacy software) pour ne citer que quelques illustrations.
Le problème est divisé en quatre sections reliées entre elles. Une question 
peut être traitée
à condition d'avoir lu les définitions introduites jusque là. Dans la première 
section (page 2),
nous établissons quelques prolégomènes. Dans la deuxième section (page 4), nous 
nous
intéressons à une relation d'équivalence induite par le langage à apprendre. 
Dans la troisième
section (page 6), nous étudions un certain type d'arbre de décision. Dans la 
quatrième section
(page 8), nous construisons un automate reconnaissant le langage à apprendre.
Dans tout l'énoncé, un même identificateur écrit dans deux polices de 
caractères différentes
désigne la même entité mais du point de vue mathématique pour la police en 
italique (par
exemple n, T , ) et du point de vue informatique pour celle en romain avec 
espacement fixe
(par exemple n, t, delta).
Des rappels des extraits du manuel de documentation de OCaml portant sur le 
module
List sont reproduits en annexe (page 10).

Travail attendu

Pour répondre à une question, il est permis de réutiliser le résultat d'une 
question antérieure,
même sans avoir réussi à établir ce résultat.
Il faudra coder des fonctions à l'aide du langage de programmation OCaml 
exclusivement,
en reprenant l'en-tête de fonctions fourni par le sujet, sans s'obliger à 
recopier la déclaration
des types. Il est permis d'utiliser la totalité du langage OCaml sauf 
indication contraire. Il
est recommandé de s'en tenir aux fonctions les plus courantes afin de rester 
compréhensible.
Quand l'énoncé demande de coder une fonction, sauf demande explicite, il n'est 
pas nécessaire
de justifier que celle-ci est correcte ou de tester que des préconditions sont 
satisfaites.
Le barème tient compte de la clarté et de la concision des programmes : il est 
attendu que
l'on choisisse des noms de variables intelligibles ou encore que l'on structure 
de longs codes
par des blocs ou par des fonctions auxiliaires dont on décrit le rôle.

Page 1 sur 10

Épreuve d'informatique d'option MP 2025

1. Alphabets, mots et automates
Dans l'ensemble du sujet, nous fixons un alphabet binaire  = {a, b} muni de 
l'ordre
alphabétique ; la notation  désigne le mot vide ; la notation  désigne 
l'ensemble des mots
sur l'alphabet  muni de l'ordre lexicographique induit. La concaténation de 
deux mots
u   et v   est notée uv.
Indication OCaml : Nous adoptons les types suivants :
1.
2.

type letter = A | B
type word = letter list

1 ­ Écrire une fonction OCaml cmp_letter (x1:letter) (x2:letter) : int dont la 
valeur de retour est nulle si les lettres x1 et x2 sont égales, est strictement 
négative si la lettre x1
précède strictement la lettre x2 dans l'ordre alphabétique et est strictement 
positive sinon.
2 ­ Écrire une fonction OCaml cmp_word (w1:word) (w2:word) : int dont la valeur 
de
retour est nulle si les mots w1 et w2 sont égaux, est strictement négative si 
le mot w1 précède
strictement le mot w2 dans l'ordre lexicographique et est strictement positive 
sinon. On
s'interdira l'usage de la fonction compare du module List et toute autre 
approche similaire.
3 ­ Décrire une structure de données immuables qui implémente un dictionnaire 
dont les
clés sont des mots de  et dont les valeurs sont d'un type quelconque. Il est 
attendu un nom
de structure classique, un type OCaml, une condition concernant l'ensemble des 
clés et un
invariant de bonne constitution.
Indication OCaml : Dans la suite du sujet, nous nous munissons d'un module OCaml
WordMap et d'un type 'a wordmap qui implémentent des dictionnaires de clés de 
type word et
de valeurs d'un type quelconque 'a. Nous disposons de la constante et des deux 
fonctions
suivantes :
-- WordMap.empty, de type 'a wordmap, qui désigne le dictionnaire vide.
-- WordMap.add, de type word -> 'a -> 'a wordmap -> 'a wordmap, telle que la 
valeur
de retour de WordMap.add w v d est un dictionnaire contenant les associations du
dictionnaire d ainsi qu'une association supplémentaire entre la clé w et la 
valeur v.
-- WordMap.find, de type word -> 'a wordmap -> 'a, telle que la valeur de 
retour de
WordMap.find w d est la valeur associée à la clé w dans le dictionnaire d.
4 ­ À titre d'exemple, déclarer deux valeurs OCaml delta_a et delta_b, de type
word wordmap, et une valeur OCaml un_a, de type bool wordmap, égales aux 
dictionnaires
respectifs
a :

a

7

a
7 

;

b :

a

7

7

a

Page 2 sur 10

et

1{a} :

a

 {faux, vrai}
7

faux
.
7

vrai

Épreuve d'informatique d'option MP 2025
Définition : Le terme automate s'entend systématiquement dans le sens d'un 
automate fini
déterministe complet, c'est-à-dire un quadruplet (Q, q0 , , 1F ) où
-- l'ensemble Q est un ensemble fini d'états,
-- l'état q0 est un élément particulier de Q appelé l'état initial,
-- l'application  est une application Q ×   Q appelée fonction de transition,
-- et l'application 1F : Q  {faux, vrai} est la fonction indicatrice d'une 
partie F de Q
appelée ensemble des états finals.
5 ­ À titre d'exemple, décrire en langue française le langage reconnu par 
l'automate
figuré ci-dessous puis énoncer une expression régulière qui le dénote. On ne 
demande pas de
justification.
b

b
a

a
a

6 ­ Dire s'il existe une expression régulière admettant l'automate figuré à la 
question 5
comme automate de Glushkov associé.
Indication OCaml : Dans ce sujet, l'ensemble des états des automates est 
systématiquement
choisi parmi les mots de  . Typographiquement, nous convenons de souligner les 
mots
servant d'état dans ce sujet et adoptons les types OCaml suivants
3.
4.
5.
6.

type state = word
type automaton = { initial : state ;
transitions : state -> letter -> state ;
finals : state -> bool }

7 ­ À titre d'exemple, définir une valeur OCaml automaton_example, de type 
automaton,
égale à l'automate figuré à la question 5.
On copiera et on complètera le code suivant :
1.
2.
3.
4.
5.
6.

let automaton_example =
{initial = .... ;
transitions = ( fun q x -> WordMap.find q
);
finals = .....
}

Page 3 sur 10

(.....)

Épreuve d'informatique d'option MP 2025
Définition : Pour tout automate A = (Q, q0 , , 1F ), pour tout état q de Q et 
pour tout
mot w de  , nous notons   (q, w) l'état d'arrivée dans l'automate A au terme du 
parcours
démarrant en l'état q et suivant les transitions de A étiquetées par les 
lettres successives du
mot w. Ainsi, la fonction   est une application Q ×   Q qui étend l'application 
.
8 ­ Écrire une fonction OCaml delta_star (a:automaton) (q:state) (w:word) : 
state
dont la valeur de retour est   (q, w).

9 ­ Écrire une fonction OCaml accepts (a:automaton) (w:word) : bool dont la 
valeur
de retour est le booléen vrai si le mot w est reconnu par l'automate A et le 
booléen faux sinon.
Il est demandé d'utiliser la fonction de la question précédente.

2. Relation de séparabilité par rapport à un langage
Il a été fixé, jusqu'à la fin de ce sujet, un certain langage régulier L   , 
que nous ne
connaissons pas mais que nous souhaitons apprendre. Autrement dit, notre 
objectif est de
produire en temps fini et efficacement un automate qui reconnait le langage L. 
Nous accédons
au langage L par l'intermédiaire d'un oracle qui répond à deux types de 
requêtes :

-- des requêtes d'appartenance, prenant la forme de la question « le mot w   
appartientil au langage fixé L ? »
-- et des requêtes d'équivalence, prenant la forme de la question : « 
l'automate A reconnait-il
le langage fixé L ? ».

En cas de réponse négative à une requête d'équivalence, l'oracle nous pourvoit 
d'un contreexemple c   pour lequel l'automate A se trompe. Autrement dit, soit 
le mot c appartient
au langage à apprendre L mais n'est pas reconnu par l'automate A, soit le mot c 
n'appartient
pas au langage à apprendre L mais est reconnu par l'automate A.
Indication OCaml : L'oracle est empaqueté dans un module Oracle ainsi signé :
7.
8.
9.
10.

type answer = Yes | Counterexample of word
val mem : word -> bool
val equiv : automaton -> answer

et s'utilise avec la syntaxe Oracle.mem w pour une requête d'appartenance ou 
Oracle.equiv a
pour une requête d'équivalence.

Définition : Nous notons 1 :   {faux, vrai} la fonction indicatrice de tout 
langage
   . Pour tout mot u   , 1 (u) prend la valeur vrai si et seulement si le mot u
appartient au langage .

Page 4 sur 10

Épreuve d'informatique d'option MP 2025
Définition : Deux mots quelconques u1   et u2   sont dits séparés par le mot v 
par
rapport à un langage    si l'on a
1 (u1 v) = 1 (u2 v),
autrement dit, si concaténation u1 v appartient au langage  tandis que la 
concaténation u2 v
n'appartient pas au langage  ou si la concaténation u1 v n'appartient pas au 
langage 
tandis que la concaténation u2 v appartient au langage . Nous disons alors que 
le mot v est
un discriminant.
Indication OCaml : Typographiquement, nous convenons de surligner les mots 
servant de
discriminant dans ce sujet et marquons le rôle de discriminant en adoptant 
l'alias de type
11.

type disc = word

10 ­ Écrire une fonction OCaml separated_by (u1:word) (u2:word) (v:disc) : bool
qui teste si les deux mots u1 et u2 sont séparés par rapport au langage à 
apprendre L par le
mot discriminant v .
Définitions : Deux mots quelconques u1   et u2   sont dits séparables par 
rapport à
un langage    , ou simplement séparables, s'il existe un discriminant qui les 
sépare. Ils
sont dits inséparables sinon. Nous notons u1  u2 la relation d'inséparabilité 
par rapport au
langage .
11 ­ Montrer que la relation d'inséparabilité par rapport à un langage 
quelconque est une
relation d'équivalence sur l'ensemble des mots  .
12 ­ Soient A = (Q, q0 , , 1F ) un automate quelconque, LA   le langage reconnu 
par
l'automate A et (u1 , u2 )  ( )2 deux mots tels que   (q0 , u1 ) =   (q0 , u2 
). Montrer que les
mots u1 et u2 sont inséparables par rapport au langage LA .
13 ­ Citer un théorème liant langages réguliers d'une part et langages reconnus 
par un
automate d'autre part. Déduire de la question 12 que le nombre de classes 
d'équivalences de
la relation d'inséparabilité par rapport au langage à apprendre L est fini.

Page 5 sur 10

Épreuve d'informatique d'option MP 2025

3. Arbre discriminant
Définition : Un arbre discriminant est un arbre de décision binaire, dont les 
sommets
internes sont étiquetés par des discriminants et dont les feuilles sont 
étiquetées par des états
distincts deux à deux.
12.
13.

type disctree =

Node of disctree * disc * disctree
| Leaf of state

La figure 1 présente un exemple d'arbre discriminant T0 , dans lequel les trois 
sommets internes
sont figurés par des cercles et les quatre feuilles par des rectangles.

aa

bbbba
a

aba

b

Figure 1 ­ Un exemple d'arbre discriminant : l'arbre T0
14 ­ Écrire une fonction OCaml states_of_disctree (t:disctree) : state list dont
la valeur de retour est une liste des étiquettes des feuilles de l'arbre 
discriminant T . Il est
attendu que la complexité en temps de states_of_disctree soit linéaire en le 
nombre de
feuilles et qu'on le justifie.
Par exemple, avec l'arbre discriminant T0 de la figure 1, la valeur 
states_of_disctree t0
peut égaler la liste [aa, a, , b], la liste [, a, aa, b] ou encore toute autre 
permutation.
Définition : Cribler un mot u   à travers un arbre discriminant T pour un 
langage L
consiste à construire l'unique chemin s0 - s1 - · · · - sk dans l'arbre T où :
-- le sommet s0 est la racine de T ,
-- pour tout indice i compris entre 0 et k - 1, le
sommet si est un sommet interne et, en notant vi
l'étiquette du sommet interne si , si le mot concaténé uvi appartient au 
langage à apprendre L, alors
le sommet si+1 est le fils gauche de si , sinon, le
sommet si+1 est le fils droit de si ,
-- le sommet sk est une feuille de l'arbre T .
et renvoyer l'état q porté par la feuille sk . L'état q
s'appelle le criblat du mot u et est noté u.

Page 6 sur 10

v0
uv0  L

v1
uv1 
/L

v2
uv2  L

q

u = q

Épreuve d'informatique d'option MP 2025

Par exemple, en supposant que le langage à apprendre L est dénoté par 
l'expression
régulière ab a, le criblat du mot abbba par l'arbre discriminant T0 (figure 1) 
est l'état
abbba = aa, qui est l'extrémité du chemin  - aa obtenu en observant que abbba 
appartient
à L. En revanche, le criblat du mot abb est l'état abb = a, qui est l'extrémité 
du chemin
 - bbbba - a obtenu en observant que abb appartient à L mais abbbbbba 
n'appartient pas à L.
15 ­ Donner le criblat du mot ba pour l'exemple précédent.
16 ­ Écrire une fonction OCaml sift (t:disctree) (u:word) : state dont la 
valeur de
retour est le criblat u du mot u à travers l'arbre discriminant T pour le 
langage L.
17 ­ Déterminer la complexité en temps dans le pire des cas de la fonction sift 
t u en
fonction de tout ou partie des grandeurs suivantes : la longueur |u| du mot u, 
le nombre n de
sommets de l'arbre T , la hauteur h de l'arbre T , le maximum M = maxvT |v| des 
longueurs
des mots discriminants de l'arbre T , le coût µ(|w|) d'un appel Oracle.mem w, 
le coût (|A|)
d'un appel Oracle.equiv a.
18 ­ Démontrer, en exhibant un discriminant, que deux mots de criblats 
distincts sont
toujours séparables.
19 ­ Démontrer que deux mots inséparables ont les mêmes criblats.

Définition : Nous disons qu'un arbre discriminant est accessible si, pour tout 
état w   ,
apparaissant dans la liste des étiquettes des feuilles, le criblat w du mot w 
est l'état w.
20 ­ Démontrer qu'il existe une constante dépendant uniquement du langage à 
apprendre
L, qui majore le nombre de feuilles d'un arbre discriminant accessible.
Définition : Nous disons qu'un arbre discriminant est démêlant s'il comporte au 
moins un
sommet interne et si l'étiquette de la racine est le discriminant mot vide .
21 ­ Démontrer que si deux mots u1 et u2   ont le même criblat par rapport à un
arbre discriminant démêlant, alors on a l'égalité 1L (u1 ) = 1L (u2 ).

Page 7 sur 10

Épreuve d'informatique d'option MP 2025

4. Automate tiré d'un arbre discriminant
Définitions : Nous disons qu'un arbre discriminant T est un crible s'il est 
accessible,
démêlant et si le mot vide  est un état qui apparait dans la liste des 
étiquettes des feuilles.
L'automate associé à un crible T pour un langage L est l'automate A ainsi 
défini :
-- l'ensemble des états de A est l'ensemble des étiquettes des feuilles de T ;
-- l'état initial de A est l'état  ;
-- la fonction de transition associe l'état w et la lettre x à l'état wx obtenu 
en criblant
le mot wx à travers l'arbre discriminant T pour le langage L ;
-- l'ensemble des états finals est l'ensemble des mots w où w est une étiquette 
d'une feuille
du sous-arbre gauche de T .
Par exemple, l'automate associé au crible T0 de la figure 1 pour le langage 
dénoté par ab a
est l'automate ainsi figuré
b

a

a

b

a

aa

a, b
b
a, b

22 ­ Écrire une fonction OCaml automaton_of_disctree (t:disctree) : automaton 
dont
la valeur de retour est l'automate associé au crible T .
On recopiera et on complètera le code suivant :
7.
8.
9.
10.
11.

let automaton_of_disctree (t:disctree) : automaton =
{ initial = .... ;
transitions = .... ;
finals = ....
}

23 ­ En supposant que le langage à apprendre L n'est ni le langage vide, ni le 
langage
plein  , décrire une construction, à l'aide des fonctions Oracle.mem et 
Oracle.equiv, d'un
premier crible formé d'un seul sommet interne et de deux feuilles.

Dans les questions 24, 25 et 26, nous notons A = (Q, , , 1F ) l'automate 
associé à un certain
crible T déjà construit. Nous supposons que Oracle.equiv a renvoie 
Oracle.Counterexample c,
où c est le mot non vide c = c0 c1 · · · c-1   . Nous nous proposons de 
construire un nouveau
crible T  ayant un état de plus que le crible T .

Page 8 sur 10

Épreuve d'informatique d'option MP 2025
Pour tout indice i compris entre 0 et , nous appelons i = c0 c1 · · · ci-1 le 
préfixe de c de
longueur i et i = ci+1 c1 · · · c-1 le suffixe de longueur  - i - 1 de sorte 
que le mot c admette
la factorisation c = i ci i . Nous notons les états
pi = i   

pi =   (q , i )  

et

et posons encore
i = pi ci i  

i = pi ci i   .

et

24 ­ Démontrer que l'on a 1L ( ) = 1L ( ).
On admet qu'il existe un indice i compris entre 0 et  -1 tel que les états pi 
et pi sont égaux, les
états pi+1 et pi+1 sont distincts et, alors, les mots pi ci et pi+1 sont 
séparés par le discriminant i .

25 ­ Écrire une fonction OCaml split (t:disctree) (c:word) : state * state * 
disc
dont la valeur de retour est le triplet (pj cj , pj+1 , j ) où l'entier j est 
le plus petit des indices i
compris entre 0 et  - 1 obtenu par la question 24.
On admet de la question 24 que l'arbre discriminant T  obtenu en substituant un 
arbre
constitué d'un sommet interne d'étiquette j , d'une feuille d'étiquette 
l'ancien état pj+1 et
d'une feuille d'étiquette un nouvel état pj cj à la place de la feuille 
d'étiquette pj+1 dans
l'arbre discriminant T jouit encore des propriétés de crible. Schématiquement,

devient

T

pj+1

T

ou

T

j

j

pj+1 pj cj

pj cj pj+1

26 ­ Écrire une fonction OCaml substitute (t:disctree) ((pp,p,s):state * state *
disc) : disctree ainsi spécifiée :
Précondition : Le triplet (pp, p, s) est la valeur de retour de la fonction 
split écrite à la
question 25.
Valeur de retour : Crible T  décrit ci-dessus.
27 ­ Concevoir un algorithme complet qui apprend un langage régulier à base de 
requêtes
d'appartenance et de requêtes d'équivalence en renvoyant un automate. Justifier 
sa terminaison
à l'aide d'un variant de boucle.
28 ­ Démontrer que l'automate construit à la question 27 possède un nombre 
d'état
minimal parmi l'ensemble des automates qui reconnaissent le langage à apprendre.

Page 9 sur 10

Épreuve d'informatique d'option MP 2025

A. Annexe : aide à la programmation en OCaml
Nous reproduisons des extraits de la documentation OCaml.

Opérations sur les listes : Le module List offre les fonctions suivantes :
-- length : 'a list -> int
Return the length (number of elements) of the given list.
-- append : 'a list -> 'a list -> 'a list
append l0 l1 appends l1 to l0. Same function as the infix operator @.
-- iter : ('a -> unit) -> 'a list -> unit
iter f [a1; ...; an] applies function f in turn to [a1; ...; an]. It is 
equivalent to
f a1; f a2; ...; f an.
-- map : ('a -> 'b) -> 'a list -> 'b list
map f [a1; ...; an] applies function f to a1, . . ., an, and builds the list [f 
a1; ...; f an]
with the results returned by f.
-- fold_left : ('acc -> 'a -> 'acc) -> 'acc -> 'a list -> 'acc
fold_left f init [b1; ...; bn] is f (... (f (f init b1) b2) ...) bn.
-- for_all : ('a -> bool) -> 'a list -> bool
for_all f [a1; ...; an] checks if all elements of the list satisfy the 
predicate f. That
is, it returns (f a1) && (f a2) && ... && (f an) for a non-empty list and true 
if the
list is empty.
-- exists : ('a -> bool) -> 'a list -> bool
exists f [a1; ...; an] checks if at least one element of the list satisfies the 
predicate
f. That is, it returns (f a1) || (f a2) || ... || (f an) for a non-empty list 
and
false if the list is empty.
-- mem : 'a -> 'a list -> bool
mem a set is true if and only if a is equal to an element of set.
-- filter : ('a -> bool) -> 'a list -> 'a list
filter f l returns all the elements of the list l that satisfy the predicate f. 
The order
of the elements in the input list is preserved.
D'après https://ocaml.org/manual/5.1/api/List.html
Fin de l'épreuve

Page 10 sur 10