✖

Simulation d’un AFN

Si nous avons un automate non déterministe et que nous voulons savoir s’il accepte un mot donné, nous pouvons transformer l’automate en automate déterministe, nous pouvons essayer d’une manière ou d’une autre, ou bien utiliser un algorithme qui simule le fonctionnement de l’AFN.

Principe de l’algorithme

Montrons le principe sur un exemple bien choisi. Prenons cet automate :

C’est un automate fini non déterministe qui accepte un certain langage. Peu importe lequel pour le moment. Voyons à quoi peut ressembler le calcul d’un tel automate pour le mot d’entrée 11001. L’idée est la suivante : nous traitons un symbole du mot et nous regardons où nous pouvons aller grâce aux transitions multiples pour le même symbole. Nous mémorisons tous ces états et, à l’étape suivante, nous supposons que nous sommes « dans tous ces états en même temps » ; ce qui nous intéresse alors, c’est de savoir où nous pouvons aller ensuite à partir de ces états.

Nous allons donc mémoriser l’ensemble des états dans lesquels nous pouvons nous trouver, ainsi que la partie non lue du mot. Au début, nous avons donc le couple ({q0} ; 11001). Nous commençons dans l’état q0 (l’état initial) et le mot en entrée est 11001. L’automate ressemble à ceci ; l’état dans lequel nous sommes est surligné en rouge et en gras :

Le premier symbole est 1 ; de l’état q0, il n’y a qu’une seule transition pour le symbole 1, donc nous arrivons dans l’état q1. Nous mémorisons le couple ({q1} ; 1001). L’automate ressemble à ceci :

Continuons. La partie non lue du mot est 1001, donc nous cherchons de nouveau les transitions pour 1. Il y en a maintenant deux : vers l’état q0 et vers l’état q3. Nous allons maintenant dans les deux états à la fois. Nous mémorisons donc le couple ({q0 ; q3} ; 001).

Quelle est la logique ? Nous savons qu’il existe un chemin pour aller de l’état initial à l’état q3 avec le mot 11, et aussi à l’état q0. Nous ne savons pas encore quelle branche nous sera utile, alors nous mémorisons simplement les deux. Continuons. Nous avons en entrée le symbole 0. Nous devons maintenant regarder à la fois les transitions partant de q0 et celles partant de q3. De l’état q0 partent des transitions vers les états q1 et q2, de l’état q3 part une transition vers q1. Nous prenons en compte tous ces états, ce qui donne le couple ({q1 ; q2} ; 01) :

Mais nous n’en avons pas fini avec cette étape. Nous voyons que de l’état q2 part une ε-transition vers l’état q4. Nous savons qu’après une ε-transition, nous pouvons « aller n’importe quand », sans lire de caractère supplémentaire. Autrement dit, sans lire un autre symbole du mot d’entrée, nous pouvons encore passer dans l’état q4. Nous ajoutons donc l’état q4 aux états dans lesquels nous pouvons nous trouver : ({q1 ; q2 ; q4} ; 01). Nous colorierions l’automate ainsi :

Ensuite, le symbole en entrée est 0. Regardons où nous pouvons aller à partir des trois états dans lesquels nous sommes. De q1, nous ne pouvons aller nulle part, car il manque une transition pour 0. Le calcul s’arrête dans cette branche. De l’état q4, nous n’allons nulle part non plus. De l’état q2, nous retournons dans l’état q2. Mais comme de l’état q2 part de nouveau une ε-transition vers l’état q4, nous pouvons aussi arriver dans l’état q4. À partir de l’ensemble d’états {q1 ; q2 ; q4}, pour le symbole 0, nous pouvons donc arriver à l’ensemble d’états {q2 ; q4}, ce qui donne le couple ({q2 ; q4} ; 1) :

Enfin, nous avons en entrée le symbole 1. De l’état q2, nous n’allons nulle part, le calcul s’arrête dans cette branche. Mais de l’état q4, nous arrivons dans les états q3 et q5. Nous obtenons le couple ({q3 ; q5} ; ε) :

L’automate a maintenant lu tout le mot et « se trouve » dans deux états : q3, q5. Comme au moins l’un d’eux est un état final, l’automate accepte le mot 11001.

Algorithme

Nous avons d’abord besoin d’une fonction qui prend en paramètre un ensemble d’états et calcule les états que l’on peut encore atteindre à l’aide des ε-transitions. L’entrée est donc un automate (Q ; Σ ; δ ; q0 ; F) et un ensemble d’états States ; la sortie est un sur-ensemble de ces états, qui comprend les états atteignables par des ε-transitions. Nous appellerons cette opération l’ε-fermeture de l’ensemble States.

FunctionEpsilonClosure((Q;Σ;δ;q0;F),States)NextStates←∅ForEachq∈StatesDoNextStates←NextStates∪{q}∪δ(q,ε)EndForIfNextStates∖States=∅DoReturnStatesElseReturnEpsilonClosure((Q;Σ;δ;q0;F),NextStates)EndIfEndFunction

Nous utilisons cette fonction dans la fonction qui simule le fonctionnement de l’automate non déterministe. L’entrée est l’automate, le mot d’entrée w = w1w2… wn et l’ensemble d’états dans lesquels l’automate se trouve actuellement. La sortie est soit la réponse Oui, soit la réponse Non, selon que l’automate accepte ou non le mot donné.

FunctionComputeNFA((Q;Σ;δ;q0;F),w,States)Ifw=ϵDoIfStates∩F≠∅DoReturnOUIElseReturnNONEndIfEndIfNextStates←∅ForEachq∈StatesDoNextStates←NextStates∪δ(q,w1)EndForNextStates←EpsilonClosure((Q;Σ;δ;q0;F),NextStates)ReturnComputeNFA((Q;Σ;δ;q0;F),w2w3…wn,NextStates)EndFunction

Si nous voulons vérifier que l’automate accepte le mot w, nous appelons la fonction ainsi : ComputeNFA((Q ; Σ ; δ ; q0 ; F), w, EpsilonClosure((Q ; Σ ; δ ; q0 ; F), {q0})).

Sources

Chapitres: Automate fini, Automate complet, Automate fini non déterministe, Simulation d’un AFN, Déterminisation d’un AFN