TP 2 : Automates
Ce TP est à effectuer en OCaml, sous Visual Code. Vous pouvez utiliser le Codespace GitHub ou votre ordinateur personnel.
Si vous avez une boucle infinie (le terminal qui ne répond pas) : Ctrl + C
On pourra créer un fichier tp2.ml. Pour exécuter : sélectionner les lignes OCaml et appuyer sur Shift + Entrée. Ceci envoie le code sélectionné dans le terminal (utop). Vous pouvez aussi utiliser utop en mode interactif.
On utilisera ;; à la fin de chaque fonction pour envoyer correctement le code sur utop.
Automate déterministe
On utilisera le type suivant d'automate déterministe complet (AFDC), où les états sont entre et et les lettres sont des entiers ( est représenté par , par ...) :
type afdc = {
initial : int;
finaux : int list;
delta : int array array
}
Si a est de type afdc, a.delta.(i).(j) est l'état atteint en lisant la lettre à partir de l'état (c'est-à-dire ). Le nombre d'états de a est donc Array.length a.delta.
- Définir en OCaml les automates
a1eta2suivants :

- Définir une fonction
delta_etoile : afdc -> int -> int list -> inttelle quedelta_etoile a q urenvoie l'état atteint en lisant le mot à partir de l'état (c'est-à-dire ). Vérifier aveca1.
- Définir une fonction
accepte : afdc -> int list -> booltelle queaccepte a udétermine si est reconnu para. Vérifier aveca1. Quelle est la complexité deaccepte?
- Définir une fonction
complementaire : afdc -> afdctelle quecomplementaire arenvoie un automate reconnaissant le complémentaire du langage reconnu para. Vérifier aveca1.
Rappel : on a besoin que l'automate soit déterministe complet, ce qui est supposé dans ce TP.
- Définir une fonction
accessibles : afdc -> int listtelle queaccessibles arenvoie la liste des états accessibles depuis l'état initial dea. Pour cela, on pourra utiliser un parcours en profondeur. Vérifier sur des exemples.
Indice
let accessibles a =
let vus = ... in (* vus.(i) = true si l'état i a été visité *)
let rec aux q = (* parcours en profondeur depuis l'état q *)
...
aux a.initial; (* on commence le parcours en profondeur depuis l'état initial *)
...
- En déduire une fonction
vide : afdc -> booldéterminant si un automate reconnaît le langage vide.
Automate produit
- Écrire une fonction
inter : afdc -> afdc -> afdctelle queinter a brenvoie un automate reconnaissant l'intersection des langages reconnus paraetb. On suppose queaetbont le même alphabet.
Pour cela, on construira l'automate produit deaetb, qui possède états (où est le nombre d'états deaet le nombre d'états deb), et dont l'état sera numéroté .
Vérifier aveca1eta2.
- En déduire une fonction
inclus a bdéterminant si le langage reconnu par l'automateaest inclus dans celui reconnu parb. On pourra utiliser les fonctions précédentes.
- En déduire une fonction
equivalent a bdéterminant si les langages reconnus par les automatesaetbsont égaux.