• Aucun résultat trouvé

Option Informatique MP/MP*, TP 2 Judicaël Courant 26 novembre 2015 (2015-W48-4)

N/A
N/A
Protected

Academic year: 2022

Partager "Option Informatique MP/MP*, TP 2 Judicaël Courant 26 novembre 2015 (2015-W48-4)"

Copied!
3
0
0

Texte intégral

(1)

1

Option Informatique MP/MP*, TP 2

Judicaël Courant

26 novembre 2015 (2015-W48-4)

Le but de ce problème est d’implanter la procédure de Berry-Sethi de construction d’un auto- mate (automate de Glushkov) reconnaissant une expression rationnelle donnée. Un fichierafnd.ml contenant les définitions de type données ci-dessous est disponible sur le site.

On commence par définir un type des ensembles finis. Il s’agit en fait juste d’une abréviation :

⟨afnd.ml⟩≡

(* type des ensembles finis *) type 'a ensf == 'a list;;

Cependant, par la suite, lorsqu’on utilisera le type'a ensf, ce sera toujours pour désigner une liste triée par ordre croissant, sans répétition : lorsqu’on demandera une fonction prenant un argument de type 'a ensf, on pourra toujours supposer que cet argument est bien une liste triée sans répétition ; lorsqu’on demandera une fonction retournant un résultat de type'a ensf, il faudra s’assurer que le résultat est bien trié et sans répétition.

Q1 Définir une fonctioninter : 'a ensf -> 'a ensf -> 'a ensfretournant l’intersection des deux ensembles qui lui sont passées en argument. On utilisera le fait que les listes passées en argument sont bien triées pour faire en sorte que l’appel(inter u v) s’exécute en temps 𝑂(𝑛)où 𝑛est le maximum des cardinaux deuet v.

Q2 Définir une fonctionunion : 'a ensf -> 'a ensf -> 'a ensf retournant l’union des deux en- sembles qui lui sont passées en argument. On utilisera le fait que les listes passées en argument sont bien triées pour faire en sorte que l’appel(union u v) s’exécute en temps 𝑂(𝑛)où 𝑛est le maximum des cardinaux deuet v.

Q3 Définir une fonction union_liste : 'a ensf list -> 'a ensf retournant l’union d’une liste d’ensembles. Indication : il peut être malin d’écrire cette fonction de façon récursive. En effet, les cas où la liste est vide ou ne contient qu’un élément sont triviaux, et le cas où est contient au moins deux éléments peut se faire en prenant l’union deux à deux des éléments de la liste ; il ne reste alors plus qu’à calculer l’union d’une liste deux fois plus courte.

Q4 Définir une fonction union_fun : 'a ensf -> ('a -> 'b ensf) -> 'b ensf qui étant donné un ensemble𝐼 et une fonction𝑓 calcule⋃u�∈u�𝑓(𝑖).

Q5 En déduire une fonctionensemble : 'a list -> 'a ensfprenant en argument une liste et re- tournant l’ensemble de ses éléments, c’est-à-dire la triant et expurgeant les doublons. On fera en sorte que cette fonction s’exécute en temps𝑂(𝑛 log 𝑛)où𝑛est la longueur de la liste. Indication : cette fonction peut s’écrire en une ligne.

Q6 Écrire une fonctionajoute : 'a -> 'a ensf -> 'a ensfajoutant un élément à un ensemble.

Q7 Définir une fonctionparties : 'a ensf -> 'a ensf ensfcalculant l’ensemble des parties d’un ensemble.

(2)

2

On représentera les automates finis (déterministes ou non) par le type suivant :

⟨afnd.ml⟩+≡

type ('a, 'b) automate = { alphabet: 'a ensf;

etats: 'b ensf;

initiaux: 'b ensf;

finaux: 'b ensf;

transitions: ('b * 'a * 'b) ensf;

};;

type 'a mot = 'a list;;

Lorsque l’automate sera déterministe, l’ensemble des états initiaux sera un singleton et l’ensemble des transitions sera tel que pour tout état couple(𝑞, 𝑥) d’un état𝑞 et d’une lettre 𝑥il existe au plus une transition(𝑞, 𝑥, 𝑞′).

Q8 Écrire une fonctionexecute_lettre : ('a, 'b) automate -> 'b -> 'a -> 'b ensfqui, à par- tir d’un automate𝒜, d’un état𝑞 et d’une lettre 𝑥calcule l’ensemble, noté 𝛿(𝑞, 𝑥), constitué des états sur lesquels arrive une transition venant de l’état𝑞étiquetée par𝑥.

Q9 Écrire une fonctionexecute : ('a, 'b) automate -> 'b ensf -> 'a mot -> 'b ensf qui, à partir d’un automate𝒜, d’un ensemble d’états𝐸 et d’un mot𝑢calcule l’ensemble, noté𝛿(𝐸, 𝑢), constitué des états pouvant être atteints dans l’automate𝒜à partir d’un état de𝐸 en exécutant le mot𝑢.

Q10 Écrire une fonction est_reconnu : ('a, 'b) automate -> 'a mot -> bool disant si le mot donné est reconnu par l’automate donné.

Q11 Écrire une fonctiondeterminise : ('a, 'b) automate -> ('a, 'b set) automateretournant l’automate déterministe associé à un automate donné.

On définit le type des expressions rationnelles comme suit :

⟨afnd.ml⟩+≡

type 'a expr =

| Zero

| Un

| Lettre of 'a

| Conc of 'a expr * 'a expr

| Etoile of 'a expr

| Plus of 'a expr * 'a expr

;;

(3)

3

Q12 Écrire une fonctionalphabet : 'a expr -> 'a setretournant l’alphabet employé dans une ex- pression rationnelle, c’est-à-dire l’ensemble desxpour lesquels(Lettre x)apparaît dans l’expres- sion.

Q13 Écrire une fonctioncontient_epsilon : 'a expr -> bool disant si une expression rationnelle contient le mot vide (cf cours).

Q14 Écrire une fonctionpref1 : 'a expr -> 'a setretournant l’ensemble des préfixes de longueur1 d’une expression rationnelle. Écrire de même une fonctionsuf1 : 'a expr -> 'a sufretournant l’ensemble des suffixes de longueur1.

Q15 Écrire une fonctionsucc : 'a expr -> 'a -> 'a set telle que(𝚜𝚞𝚌𝚌 𝑒 𝑥) retourne l’ensemble des lettres𝑦 telles que𝑥𝑦soit un facteur du langage associé à𝑒.

Q16 Écrire une fonctionaut_local : 'a expr -> ('a, 'a option) automatetelle que(aut_local e), où le langage associé àeest supposé être local, retourne l’automate local associé à ce langage.

L’ensemble des états sera représenté par le type Caml'a option: l’état initial sera représenté par Noneet pour tout lettrea, les transitions étiquetées paraarriveront sur l’étatSome a.

Q17 Écrire une fonction linearise : 'a expr -> ('a * int) expr telle que (linearise e) re- tourne une expression rationnelle linéaire obtenue en remplaçant chaque lettre 𝑥 de 𝑒 par une lettre(𝑥, 𝑖)où𝑖est un entier, de façon à ce que les entiers soient tous distincts.

Q18 Écrire une fonction applique_morphisme : ('a, 'b) automate -> ('a -> 'c) -> ('c, 'b) automatetelle que(applique_morphisme a f)retourne l’automate ayant les mêmes états que a mais dans lequel chaque transition étiquetée par une lettrex a été remplacée par une transition étiquetée par(f x).

Q19 Écrire une fonction glushkov : 'a expr -> ('a, ('a * int) option) automate retournant l’automate de Glushkov associé à une expression rationnelle.

Q20 Écrire une fonctionafd : 'a expr -> ('a, ('a * int) option set) automatetelle que(afd e)retourne le déterminisé de l’automate de Glushkov associé à l’expression rationnellee.

Références

Documents relatifs

(ii) ⇒ (i) Si G est connexe d’ensemble d’arêtes minimal, alors il ne peut posséder de cycle : sinon en enlevant une arête d’un cycle, on obtient un graphe avec un

Écrire une fonction coaccessibles : afd -> int list retournant la liste des états coaccessibles de l’automate qui lui est passé en argument. Q14 On dit qu’un automate est

Écrire une fonction inverse(s) prenant en argument la représentation d’une

Écrire une fonction fusion(t1, t2) prenant en argument deux tableaux t1 et t2 de nombres supposés triés 1 de longueurs

Vous trouverez dans le fichier lance_tests.py les commandes permettant de générer les douze combinaisons possibles (quatre méthodes pour générer un tableau, trois fonctions de

Vous aurez besoin pour cela d’une structure de données pour garder la liste de tous les fichiers et réper- toires qu’il reste à explorer.. Vous utiliserez une pile à

Étant continue sur son support et ce dernier étant compact, on déduit du théorème de Weierstrass que f est bornée sur son support et donc sur R puisqu’elle est nulle en dehors de

On convient de ranger ses valeurs propres (comptées avec leurs ordres de multiplicité) dans l’ordre décroissant... On revient au cas