La première astuce consiste à considérer la table de multiplication comme la table de transition d'un automate chaque état représentant une lettre dans votre table de multiplication, mais sans se soucier encore de l'acceptation. Ainsi, les lettres à gauche et dans le corps du tableau sont en fait des états - il serait plus précis de les écrire commeA , mais je ne le ferai pas. Les lettres en haut sont des entrées.qa,qb,qc
Construisez ensuite l'automate ("AT " pour la transposition) pourla multiplication inverseen transposant A :TA
ATabcaaacbcabcbca
Donc vous amène à l'état c , et de même A T ( c b aA(abc)c passe à l'état a de A T , comme vous le constatez.AT(cba)aAT
Cependant, suppose que vous allez de droite à gauche, et nous voulons toujours aller de gauche à droite. Donc, la deuxième astuce consiste à inverser l'automate (pas la multiplication, qui nous ramènerait juste si nous avions commencé), en inversant toutes les flèches, ce qui conduit à un automate A T R non déterministe donné par le tableau de transition ci-dessous, avec sous-ensembles indiqués par des lettres concaténées pour empêcher le poulet de se gratter, donc un c est vraiment { a , c } . (j'espère que j'ai bien compris - semble fonctionner).ATATRac{a,c}
ATRabcabbcacabc∅aab∅cabcabcabc∅bbcabcacababc∅ccabacabcbcabc∅
Vous pouvez l'interpréter comme un automate non déterministe avec seulement les trois lignes au-dessus de la ligne ou une version déterminée avec les 8 lignes.
Enfin, la machine pour résoudre le problème est l'automate produit croisé des et A T R d'origine , c'est-à-dire A × A T R pour effectuer le comportement d'intersection des deux automates (nous n'avons plus besoin de A T ) . A × A T R possède des états qui sont des paires comme ⟨ un , un c ⟩ . La fonction de transition exécute A et A T R indépendamment. Un état de départ unique ⟨ 1 , 1 ⟩AATRA×ATRATA×ATR⟨a,ac⟩AATR⟨1,1⟩ passe en sous entrée⟨a,a⟩ , en ⟨a en entrée b , etc. ⟨b,b⟩b
Accepter les états dans la version non-déterministe sont etc. Dans la version déterministe, acceptant états sont des paires , dans lequel le premier composant est ∈ du second ensemble des composants, tels que ⟨ un , un ⟩ ou ⟨ b , b c ⟩ .⟨a,a⟩∈⟨a,a⟩⟨b,bc⟩
augmenté et déterminé comme indiqué a 25 = 3 ⋅ 8 + 1 états, alors pardonnez-moi si je ne l'écris pas en détail. Mais la version non déterministe n'a que 10 = 3 ⋅ 3 + 1 états.A×ATR25=3⋅8+110=3⋅3+1
Si L est une langue régulière, alors L R , la langue constituée de l'inversede tous les mots de L , est également régulière. Prenez cela comme un exercice.(∗) L LR L
Comment cela nous aide-t-il à résoudre le problème? Soit les langages constitués de toutes les chaînes évaluées en a , b , c lors de l'évaluation de gauche à droite. La langue qui vous intéresse est ( L a ∩ L R a ) ∪ ( L b ∩ L R b ) ∪ ( L c ∩ L R c ) . Cela montre que si vous savez prouver (La,Lb,Lc a,b,c
En fait, si vous utilisez l' idée de la preuve de , vous pouvez probablement continuer et construire l'automate. Examinons donc cela. En particulier, essayons de construire un NFA pour L R a , le langage de toutes les chaînes qui évaluent à(∗) LRa lorsqu'il est évalué de droite à gauche.a
L'idée est la suivante. Supposons que la première lettre que vous voyez soit . Ensuite, le reste de la chaîne doit être évalué à b (puisque b x = a implique x = b ). Un raisonnement similaire s'applique lorsque la première lettre est c . Cependant, lorsque la première lettre est un , le reste peut être évalué à a ou b , ou être nul. Avec un NFA, nous pouvons deviner (et vérifier plus tard notre supposition).b b bx=a x=b c a a b
Cet indice devrait vous donner suffisamment de matière à réflexion et, espérons-le, résoudre le problème.
la source
Mignonne.
Tout d'abord, construisez un automate qui calcule le produit de gauche à droite. Facile! Mettez une transition chaque fois quex⋅y=z. Il y a trois états{ → a , → b , → c }représentant les trois produits possibles. Commencez dans un quatrième état → 1 avec → 1x→−→yz→ x⋅y=z {a→,b→,c→} 1→ pour toutx. L'état final est → x si et seulement si le produit du mot saisi de gauche à droite estx1→−→−xx→ x x→ x .
Construisons maintenant un automate qui calcule le produit de droite à gauche. Celui-ci sera non déterministe. Comment fait-on cela? Simple… Pour aller dans l'autre sens, il suffit de tout inverser : les flèches et le sens du produit.
Ajouter un nœud déconnecté1← pour le mot vide. Tous les nœuds sont initiaux.
la source
It seems that your main problem is utilising nondeterminism, so let me elaborate on that.
Let us consider your small exampleabc and Gilles' construction idea. The automaton "computing" the right-to-left product guesses the result in the beginning and verifies it. So there are three possibilities:
As you can see, the NFA is able to guess and check every possible computation bottom-up. Because the accepted language is defined as the set of strings that is accepted by at least one run, all non-accepting runs on the input are ignored; the NFA "always guesses right".
Now it is easy for this NFA to remember its first choice until the end. If it accepts, it can compare the remembered symbol to the lr-product (deterministically) obtained in parallel (how language intersection relates to NFA is surely covered in Ullman/Hopcroft, and any other basic textbook).
la source