TP2 -- L3 -- Langage et Compilation

Automate fini

Dans ce TP, on utilisera JFLAP (Java Formal Languages and Automata Package), un logiciel qui permet de manipuler les notions de base de la théorie des automates et des langages formels.

Un premier automate déterministe

On considère l'AFD A défini par ({a,b}, {0,1,2}, δ, 0, {2})δ, la fonction de transition, est donnée par la table

ab
0 1 0
1 2 1
2   2

Pour définir un automate avec JFLAP, il faut :

Construire le graphe de transition de l'AFD A.
Effectuer le calcul de l'automate sur l'entrée babab (sélectionner dans le menu Input l'option Step by State).
Trouver trois mots acceptés par l'automate et trois mots rejetés (sélectionner dans le menu Input l'option Multiple Run).
Décrire en français le langage reconnu par cet automate. En donner une expression régulière.

Un premier automate non déterministe

Récupérer le fichier afn1.jff qui décrit un AFN A. L'ouvrir avec JFLAP.

Pourquoi l'automate A n'est pas déterministe ?
Effectuer le calcul de l'automate sur l'entrée aabb. Donner la trace des deux calculs acceptant de l'automate A sur cette entrée.
Donner tous les mots de longueur 2 qui sont rejetés par A.

Déterminisation de l'automate

À partir du graphe de transition de l'automate non déterministe

Construire un automate fini déterministe équivalent à l'automate A.

D'automate fini vers expression régulière

Récupérer le fichier er1.jff qui définit un AFD A.

Donner les six mots de longueur 8 qui sont acceptés par A.

On veut expliciter une expression régulière qui décrit le langage reconnu par l'automate A.

À partir du graphe de transition de l'automate

Puis

Donner une expression régulière qui décrit le langage reconnu par l'automate A.

D'expression régulière vers automate fini

JFLAP permet de construire un automate avec ε-transitions qui reconnaît le langage associé à une expression rationnelle donnée (c'est l'algorithme de Thompson qui est appliqué) :

Donner une expression régulière qui décrit l'ensemble des mots qui ont pour suffixes : a ou ab
Construire un automate avec ε-transitions qui reconnaît le langage associé.
Le déterminiser. Pour chacun des états de cet automate, caractériser les mots qui étiquettent les chemins menant à cet état.

Propriété de clôture

Clôture par union

On considère sur l'alphabet {a,b}, le langage L1 formé de tous les mots contenant exactement deux a et le langage L2 formé de tous les mots contenant exactement trois b.

Construire un AFD A1 qui reconnaît le langage L1 et un AFD A2 qui reconnaît le langage L2 .
Combiner les deux automates A1 et A2 pour construire un automate A avec ε-transitions qui reconnaît le langage L1 ∪ L2 .
Déterminiser l'automate A . Que mémorise chacun des états de cet automate ? Pouvez vous trouver un automate déterministe reconnaissant le même langage avec moins d'états ?

Clôture par étoile

Construire un AFD A (à 6 états) qui reconnaît le langage décrit par 101+001*.
À partir de l'automate A construire sans ajouter d'états un automate avec ε-transitions qui reconnaît le langage décrit par (101+001*)*.
Vérifier que les mots suivants sont bien reconnus : 00100, 1010011, λ . Et enregistrer votre automate dans le fichier automateEtoile.jff.

On souhaite vérifier que l'automate construit reconnaît bien le langage décrit par (101+001*)*. L'idée est de construire un deuxième automate avec ε-transitions à partir de l'expression rationnelle (101+001*)* comme vu précédemment. Puis de déterminer l'équivalence entre ces deux automates (sélection de l'option Compare Equivalence dans le menu Test).

Tester si l'automate automateEtoile reconnaît effectivement le langage décrit par (101+001*)*.

Clôture par concaténation

Construire un AFD A1 (à 3 états) qui reconnaît le langage décrit par 01(11)* et un AFD A2 (à 2 états) qui reconnaît le langage décrit par (00+10)*.
À partir de A1 et A2, construire un automate A avec ε-transitions qui reconnaît le langage L1 ⋅ L2 .
Déterminiser l'automate A .

Pump up the jam

JFLAP permet de jouer au lemme de la pompe (cliquez sur regular pumping lemma dans le menu principal). Vous pouvez en particulier jouer au lemme de la pompe pour des exemples qu'on a vu au premier TD.
Pompez avec JFLAP.

1 La commande jflap est un simple script shell qui fait :

#!/bin/sh
exec java -jar /usr/local/jflap/JFLAP.jar "$@"
Vous pouvez facilement disposer de cette commande en téléchargeant JFLAP.jar.