Como converter um NFA com ciclos sobrepostos em uma expressão regular?


11

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:

insira a descrição da imagem aqui
[ fonte ]

Os ciclos sobrepostos dificultam a visualização do que esse autômato aceita (em termos de expressões regulares). Existe algum truque?


2
Seria bom se você pudesse indicar no diagrama quais são os estados inicial e final: uma pequena seta para o estado inicial e um círculo duplo como o estado final. Além disso, é difícil saber onde você está errando se não der nenhuma indicação do que tentou.
23412 Dave Clarke

Talvez este documento possa ajudá-lo: ele explica claramente como converter um NFA em um ER.
Vor

1
Por que isso é difícil? Você já tentou um dos algoritmos canônicos? Qual é a melhor ansatz que você pode fazer?
Raphael

3
Eu editei para tornar a pergunta (imho) interessante e boa para este site. Veja o histórico de revisões para formar uma opinião.
Raphael

1
Tenho uma resposta pronta que transforma seu NFA em uma expressão regular, mas a apaguei: a resposta de Raphael fornece o método necessário para você fazer você mesmo (também fornece um link para um exemplo), para que você possa praticar se quiser. quer. Se você ainda quer a minha solução, eu cancelarei minha resposta.
Alex-Brink

Respostas:


5

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

QEu=qEuumaqjumaQj{{ε}, qEuF, outro

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.FqEuumaqjqEuqjuma+

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.QEuqEuQ0 0q0 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.


1
Veja esta pergunta de referência para outros métodos gerais.
Raphael

3

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.

q2q1fq2gq3q4q2q5q4jq5gq3

q3,q4,q5q3q3(hjg)

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.


3

Dividir q_1


E isso responde à pergunta como?
Raphael

1
Se você reescrever a máquina de estados dessa maneira, agora é trivial ler a expressão regular equivalente.
Jukka Suomela 23/03

1
Talvez você deva incluir isso no texto da resposta. Isso sempre funciona?
Raphael

@Raphael: Funciona neste caso. :) A idéia geral por trás desse truque é a seguinte: fizemos os ciclos "adequadamente aninhados". Ou seja, não temos a estrutura do ciclo, [(])mas [()].
Jukka Suomela 23/03
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.