Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                

DM 02

Télécharger au format pdf ou txt
Télécharger au format pdf ou txt
Vous êtes sur la page 1sur 2

DM02 Automates

Ce DM a pour objectif de vous faire implémenter en OCaml certains points du cours sur les langages
réguliers et les automates.

1 Fonctions utilitaires
Q1. Écrire une fonction union : ’a list -> ’a list -> ’a list prenant en entrée deux listes sans dou-
blons et renvoyant une liste sans doublons contenant l’union de ces deux listes.
Q2. Écrire une fonction intersection : ’a list -> ’a list -> ’a list prenant en entrée deux listes sans
doublons et renvoyant une liste sans doublons contenant l’intersection de ces deux listes.
Q3. Écrire une fonction product : ’a list -> ’b list -> (’a * ’b) list prenant en entrée deux listes
et renvoyant une liste contenant tous les couples possibles dont la première composante est dans la
première liste et la seconde composante est dans la seconde liste.
Q4. Écrire une fonction sort : ’a list -> ’a list qui trie une liste.
On pourra utiliser List.sort pour gagner du temps.

2 Langages locaux/linéaires
Comme le langage vide n’est pas particulièrement intéressant, on va travailler sur des expressions régu-
lières ne contenant pas le symbole ∅. On définit donc le type suivant pour les expressions régulières :
type ’a regexp =
| Eps
| Letter o f ’a
| Union o f ’a regexp * ’a regexp
| Concat o f ’a regexp * ’a regexp
| Star o f ’a regexp

Q5. Écrire une fonction get_PSF : ’a regexp -> ’a list * ’a list * (’a * ’a) list * bool qui, étant
donné une expression régulière e, détermine les ensembles P1 (e), S1 (e) et F2 (e) (vu comme un ensemble
de couples) et un booléen indiquant si ε ∈ L(e).
Quel est l’intérêt de calculer toutes ces valeurs en même temps ?
Q6. Écrire une fonction linearise : ’a regexp -> (’a * int) regexp qui linéarise une expression régulière
passée en argument.

3 Automates
On utilise le type suivant pour représenter les automates, qu’ils soient déterministes ou non :
type ( ’a , ’b ) automaton =
{ initial : ’a list ; accepting : ’a list ; delta : (( ’ a * ’b ) * ’a ) list }

1
Le type ’a représente celui des états, et le type ’b celui des lettres. On choisit de travailler avec des listes,
même si l’usage d’un dictionnaire pour la fonction de transition serait plus efficace.
Q7. Écrire une fonction multiple_automaton : int -> (int, int) automaton qui prend un entier n ∈ N∗ en
argument et produit un automate reconnaissant le langage des mots binaires représentant un multiple
de n.
Q8. Écrire une fonction delta_set : (’a, ’b) automaton -> ’a list -> ’b -> ’a list qui calcule l’image
d’un ensemble d’états par la fonction de transition lors de la lecture d’une lettre.
On veillera à renvoyer une liste sans doublons et triée.
Q9. En déduire une fonction is_accepted : (’a, ’b) automaton -> ’b list -> bool qui détermine si un
mot est accepté par un automate donné.
Q10. Écrire une fonction alphabet : (’a, ’b) automaton -> ’b list qui détermine l’alphabet d’un auto-
mate.
On veillera à renvoyer une liste sans doublons.
Q11. Écrire une fonction delta_set_alphabet : (’a, ’b) automaton -> ’a list -> ’b list -> ((’a list
* ’b) * ’a list) list qui détermine les transitions depuis un ensemble d’états dans un automate
pour un alphabet donné.
Q12. En déduire une fonction powerset_construction : (’a, ’b) automaton -> (’a list, ’b) automaton
qui implémente l’algorithme de déterminisation accessible.

4 Automate de Glushkov
Q13. Écrire une fonction local_automaton : ’a list -> ’a list -> (’a * ’a) list -> bool -> (int, ’a
) automaton qui détermine l’automate local associé à un langage local donné par ses ensembles P1 , S1
et F2 et par le booléen indiquant si ε appartient au langage.
Q14. En déduire une fonction berry_sethi : ’a regexp -> (int, ’a) automaton qui applique l’algorithme
de Berry-Sethi pour déterminer l’automate de Glushkov associé à une expression régulière.

Vous aimerez peut-être aussi