Se bem entendi, a NFA tem o mesmo poder expressivo que as expressões regulares. Freqüentemente, é fácil ler expressões regulares equivalentes do NFA: você traduz ciclos para estrelas, junções como alternativas e assim por diante. Mas o que fazer neste caso:
[ fonte ]
Os ciclos sobrepostos dificultam a visualização do que esse autômato aceita (em termos de expressões regulares). Existe algum truque?
Respostas:
Em vez de "ler", você deve empregar um dos vários métodos canônicos para fazer isso. De longe, o mais bonito que já vi é aquele que expressa o autômato como sistema de equações de linguagens (regulares) que podem ser resolvidas. É particularmente agradável, pois parece produzir expressões mais concisas do que outros métodos.
Eu escrevi este documento explicando o método para os alunos no verão passado. Está diretamente relacionado a uma palestra específica; a referência mencionada é uma definição típica de expressões regulares. Uma prova do lema de Arden (um resultado necessário) está contida; está faltando um para correção do método. Como soube disso na palestra, infelizmente não tenho uma referência.
Resumindo: para cada estado , crie a equaçãoqEu
onde é o conjunto de estados finais e q i a → q j significa que há uma transição de q i para q j rotulado com a . Se você ler ∪ como + ou ∣ (dependendo da sua definição de expressão regular), verá que esta é uma equação de expressões regulares.F qEu→umaqj qEu qj uma ∪ + ∣
Resolvê-lo (usando o Lema de Arden ) produz uma expressão regular para cada estado que descreve exatamente essas palavras que podem ser aceites a partir de q i ; portanto, Q 0 (se q 0 é o estado inicial) é a expressão desejada.QEu qEu Q0 0 q0 0
A aplicação ao autômato fornecido é deixada como um exercício; um exemplo completo está incluído no documento vinculado acima .
Veja também aqui onde eu postei uma resposta semelhante.
fonte
Se houvesse apenas uma cadeia de estados sem loop, você saberia o que fazer?
Se houvesse um loop simples sem essa ramificação sobreposta, você saberia o que fazer?
(Se a resposta for "não", pense nesses casos primeiro.)
Agora, a idéia é transformar o autômato progressivamente para colocá-lo em uma forma em que você possa identificar esses padrões: cadeias, loops e caminhos divergentes que reconvertem no final (levando à alternância). Em cada etapa da transformação, verifique se o autômato transformado ainda reconhece o mesmo idioma.
Lembre-se de que este é um autômato não determinístico. O que você postou é determinístico, mas não precisa ficar assim quando você o transforma.
Tome cuidado para verificar quais estados são finais. Pode ajudar a não se preocupar com isso a princípio e criar um loop grande e, em seguida, duplicar as partes que terminam parcialmente no loop.
Esta não é necessariamente a técnica mais eficiente ou a que gera a expressão regular mais simples, mas é simples.
fonte
fonte
[(])
mas[()]
.