Converter expressões e autómatos

Construção de Thompson, eliminação de estados e equivalência entre descrições regulares.

TLDR

Perguntar sobre esta página

ChatGPTClaudePerplexityGrokGeminiCopiar e abrirDeepSeekCopiar e abrir

A expressão (a+b)∗a(a+b)^*a descreve palavras terminadas em aa. Uma máquina equivalente tem de aceitar aa e baba, mas rejeitar ε\varepsilon e abab. A construção de Thompson permite obter essa máquina seguindo a estrutura da expressão.

No sentido inverso, a eliminação de estados resume percursos por expressões, usando a precedência das expressões e o fecho-ε.

Expressão para ε-NFA: Thompson

A construção de Thompson associa a cada expressão um fragmento com uma entrada e uma saída. A entrada não tem arestas a chegar de dentro do fragmento e a saída não tem arestas a sair dentro dele. A saída será o único estado final quando o fragmento estiver completo.

Os casos básicos são:

  • aa: dois estados ligados por uma aresta aa;
  • ε\varepsilon: dois estados ligados por uma aresta vazia;
  • ∅\emptyset: dois estados sem ligação, porque não há palavra que deva passar entre eles.

As composições ligam esses fragmentos. Em cada caso, um percurso completo lê primeiro uma palavra de L(E)L(E) e depois uma de L(F)L(F), ou escolhe um dos ramos, ou repete o fragmento:

  • Para EFEF, liga a saída de EE à entrada de FF por ε\varepsilon.
  • Para E+FE+F, acrescenta entrada e saída novas. Da entrada saem duas arestas vazias para as entradas dos fragmentos. As duas saídas chegam à saída nova por arestas vazias.
  • Para E∗E^*, acrescenta entrada e saída novas e quatro arestas vazias: da entrada nova para o fragmento e para a saída nova; da saída do fragmento para a sua entrada e para a saída nova. O caminho direto aceita zero repetições.

Fragmentos separados de Thompson

Para a∗a^*: entrada ss, saída ff, fragmento interior p→aqp \xrightarrow{a} q, com s→εps \xrightarrow{\varepsilon} p, s→εfs \xrightarrow{\varepsilon} f, q→εpq \xrightarrow{\varepsilon} p e q→εfq \xrightarrow{\varepsilon} f. O caminho direto s→fs \to f aceita ε\varepsilon; o ciclo aceita aa, aaaa e continua.

Para abab: fragmento de aa com p→aqp \xrightarrow{a} q, fragmento de bb com r→btr \xrightarrow{b} t, mais q→εrq \xrightarrow{\varepsilon} r. Um percurso completo lê primeiro aa e depois bb. Sem essa aresta intermédia, nenhum percurso vai da entrada do primeiro fragmento à saída do segundo. A concatenação não aceita palavra alguma.

Para a+ba+b: entrada nova ss com s→εps \xrightarrow{\varepsilon} p e s→εrs \xrightarrow{\varepsilon} r; saídas q,tq,t com q→εfq \xrightarrow{\varepsilon} f e t→εft \xrightarrow{\varepsilon} f. Cada percurso escolhe um ramo e só um.

Exemplo com união, estrela e concatenação

Para (a+b)∗a(a+b)^*a, constrói primeiro a+ba+b, depois aplica estrela, depois concatena o último aa. A construção, sem simplificações, fica:

Para aceitar baba, atravessa o ramo bb uma vez, sai da estrela e lê o aa final. Para aceitar aa, salta a estrela. A palavra vazia é rejeitada porque a última aresta aa é obrigatória.

O desenho não precisa de ser o menor autómato. A vantagem é o procedimento sistemático e a prova por indução estrutural: os casos básicos reconhecem as linguagens certas e cada composição preserva a operação pretendida. A determinização pode vir depois.

Derivadas de expressões

Depois de ler o primeiro aa de uma palavra que deve terminar em abab, o que ainda falta ler? A expressão pode guardar esse conjunto de continuações. A derivada Da(E)D_a(E) descreve

L(Da(E))={w∣aw∈L(E)}.L(D_a(E))=\{w\mid aw\in L(E)\}.

Não remove um aa em qualquer posição: trata a letra que acabou de ser lida no início. Dizemos que EE é anulável quando ε∈L(E)\varepsilon\in L(E); uma expressão anulável pode aceitar sem ler outra letra.

As bases são Da(∅)=Da(ε)=∅D_a(\emptyset)=D_a(\varepsilon)=\emptyset. Para uma expressão que é só um símbolo, a derivada dá ε\varepsilon se esse símbolo for aa, e ∅\emptyset caso contrário. As operações seguem a origem da primeira letra:

Da(E+F)=Da(E)+Da(F),Da(E∗)=Da(E)E∗.D_a(E+F)=D_a(E)+D_a(F),\qquad D_a(E^*)=D_a(E)E^*.

Na concatenação, há duas possibilidades. A letra pode vir de uma palavra não vazia de EE. Se EE aceitar ε\varepsilon, pode também vir diretamente de FF:

Da(EF)={Da(E)F+Da(F),ε∈L(E),Da(E)F,ε∉L(E).D_a(EF)= \begin{cases} D_a(E)F+D_a(F),&\varepsilon\in L(E),\\ D_a(E)F,&\varepsilon\notin L(E). \end{cases}

Esta segunda parcela é necessária. Em E=a∗E=a^* e F=bF=b, ler bb pode saltar a estrela e consumir a letra de FF; a derivada tem de aceitar ε\varepsilon.

Um DFA cujos estados são expressões

Usa R=(a+b)∗abR=(a+b)^*ab. Como a estrela é anulável, Da(R)=R+bD_a(R)=R+b e Db(R)=RD_b(R)=R. Em R+bR+b, a letra bb pode concluir o sufixo: Db(R+b)=R+εD_b(R+b)=R+\varepsilon.

Os três estados alcançáveis são as expressões seguintes, simplificadas pelas leis de união. Um estado é final exatamente quando a sua expressão é anulável:

Estado e expressãoaabbFinal?
A=RA=R, inicialBBAANão
B=R+bB=R+bBBCCNão
C=R+εC=R+\varepsilonBBAASim

Para abab, a leitura passa por RR, R+bR+b, R+εR+\varepsilon e aceita. Para abaaba, a última letra deixa R+bR+b, que não é anulável, e rejeita. Não se apaga a parcela RR: ela permite que o prefixo continue enquanto tentamos completar o sufixo.

Depois de qualquer prefixo xx, o estado descreve exatamente {w∣xw∈L(R)}\{w\mid xw\in L(R)\}. Cada derivada preserva esse significado ao ler a próxima letra. No fim, aceitar ε\varepsilon na expressão restante equivale a a palavra lida pertencer à linguagem original. Esta é a construção por derivadas de Brzozowski, uma alternativa a Thompson seguido de determinização. Expressões com textos diferentes podem representar o mesmo estado por linguagem; não as distingas apenas pela escrita.

Autómato para expressão: eliminação de estados

Permite agora que uma aresta tenha uma expressão regular, não apenas uma letra; chama autómato generalizado a esta representação. Uma aresta ausente tem rótulo ∅\emptyset, e várias arestas paralelas juntam-se por união.

Prepara a máquina acrescentando uma entrada nova ss e uma saída nova ff. Liga ss ao antigo início por ε\varepsilon e cada antigo final a ff por ε\varepsilon. Só ff fica final, o que resolve também o caso em que o estado inicial era final.

Quando eliminas o estado kk, atualiza cada ligação entre estados que ficam:

Rij′=Rij+Rik(Rkk)∗Rkj.R'_{ij}=R_{ij}+R_{ik}(R_{kk})^*R_{kj}.

A primeira parte conserva os caminhos que não passam por kk. A segunda entra em kk, repete o ciclo zero ou mais vezes e sai para jj. Usa os rótulos anteriores à eliminação em toda essa ronda, antes de remover kk.

Exemplo com um ciclo

Considera um estado inicial pp com ciclo aa, uma aresta p→bqp\xrightarrow{b}q e um estado final qq com ciclo cc:

Depois de acrescentar s,fs,f, elimina pp. A nova aresta de ss para qq tem rótulo

∅+εa∗b≡a∗b.\emptyset+\varepsilon a^*b\equiv a^*b.

Elimina qq e obténs

Rsf=∅+(a∗b)c∗ε≡a∗bc∗.R_{sf}=\emptyset+(a^*b)c^*\varepsilon\equiv a^*bc^*.

Há exatamente um bb, antes dele só aa e depois só cc. A ordem de eliminação pode produzir expressões diferentes, mas equivalentes. Eliminar primeiro estados com poucas ligações evita expressões grandes; não altera a linguagem.

Eliminação completa com retorno e dois finais

Considera estados pp inicial e q,rq,r finais, com p→app \xrightarrow{a} p, p→bqp \xrightarrow{b} q, q→apq \xrightarrow{a} p, q→brq \xrightarrow{b} r e r→a,brr \xrightarrow{a,b} r. Acrescenta entrada s→εps \xrightarrow{\varepsilon} p e saída ff, com q→εfq \xrightarrow{\varepsilon} f e r→εfr \xrightarrow{\varepsilon} f. Há um ciclo com retorno p↔qp \leftrightarrow q e um final rr que absorve tudo.

Elimina por rondas, usando sempre os rótulos anteriores à ronda. Começa por rr, que só tem saídas para ff além dos seus ciclos:

RondaEstado retiradoRótulos novos
1rrRqfR_{qf} ganha b(a+b)∗b(a+b)^*: sair de qq para rr e ficar lá um tempo arbitrário antes de terminar. As restantes arestas mantêm-se.
2ppRsq=a∗bR_{sq}=a^*b e Rqq=aa∗bR_{qq}=aa^*b: chegar pela primeira vez a qq, ou regressar a qq através de pp.
3qqRsf=a∗b(aa∗b)∗(ε+b(a+b)∗)R_{sf}=a^*b(aa^*b)^*(\varepsilon+b(a+b)^*).

Depois de retirar rr, temos Rqf=ε+b(a+b)∗R_{qf}=\varepsilon+b(a+b)^*. O ε\varepsilon conserva a possibilidade de terminar em qq, sem passar por rr.

A primeira parte da expressão final chega pela primeira vez a qq. A estrela permite regressar a qq através de pp; o último fator permite terminar ali ou entrar no final absorvente rr. bb, bbbb e babbab são aceites. ε\varepsilon, aa e abaaba são rejeitadas, pois nenhuma termina num final. Estes testes conferem a conta; a fórmula de eliminação justifica a equivalência para todas as palavras.

Caminhos com estados intermédios limitados

Ver a recorrência alternativa com estados limitados

Uma alternativa calcula Rij(k)R_{ij}^{(k)}, a expressão dos caminhos de ii para jj cujos estados intermédios estão entre os primeiros kk estados. A recorrência é:

Rij(k)=Rij(k−1)+Rik(k−1)(Rkk(k−1))∗Rkj(k−1).R_{ij}^{(k)}=R_{ij}^{(k-1)}+ R_{ik}^{(k-1)}(R_{kk}^{(k-1)})^*R_{kj}^{(k-1)}.

Na base k=0k=0, junta as arestas diretas de ii para jj e inclui ε\varepsilon quando i=ji=j, porque existe um caminho com zero passos de um estado para si mesmo. No fim, junta Rq0f(n)R_{q_0f}^{(n)} para todos os finais ff. O mesmo raciocínio de entrar, repetir e sair justifica a recorrência.

Equivalência de representações

Uma linguagem é regular se pode ser descrita por uma expressão regular, um DFA, um NFA ou um ε-NFA. As construções anteriores, com a construção de subconjuntos, provam a equivalência.

Para complementar uma expressão EE, não há uma regra que troque cada operador por outro e resolva todos os casos. Converte EE para um autómato, determiniza, completa, troca os finais e converte novamente para expressão. Para provar que duas expressões são equivalentes, podes comparar os DFA em vez de tentar simplificações algébricas à mão.

Exercícios

Os problemas são originais, salvo as adaptações identificadas no enunciado.

Calcular o novo rótulo

Ao eliminar k, os rótulos existentes são Rij=dR_{ij}=d, Rik=aR_{ik}=a, Rkk=bR_{kk}=b e Rkj=cR_{kj}=c. Qual fica o rótulo de i para j? Descreve a linguagem desse rótulo.

Pista

Há caminhos que não passam por k e caminhos que passam.

Mais uma pista

Os que passam por k leem a, repetem o ciclo b e leem c.

Solução

O novo rótulo é d+ab∗cd+ab^*c. Aceita a palavra d ou uma palavra que começa em a, segue com zero ou mais b e termina em c. Inclui ac, abc e abbc.

Confere a tua resposta:

  • Conserva a aresta direta d.
  • Inclui uma entrada por a, zero ou mais b e saída por c.
  • Junta os dois caminhos por união, não concatenação.

Erros frequentes

Não percas a ligação direta d. Não exijas pelo menos um b: a estrela permite atravessar k sem dar uma volta ao ciclo.

Voltar à explicação
Escolher o caminho de conversão

Queres uma expressão regular para o complemento de (ab)∗(ab)^* sobre {a,b}\{a,b\}. Descreve um procedimento que termina e explica o que acontece a ε\varepsilon e a abaaba.

Pista

Usa a equivalência entre expressões e máquinas, em vez de trocar operadores à mão.

Mais uma pista

No DFA, cada palavra tem um só estado final da computação.

Solução

Constrói o ε-NFA por Thompson, determiniza por subconjuntos, inclui o poço para ter transições totais e troca finais com não finais. Converte o DFA resultante em expressão por eliminação de estados. Como ε∈(ab)∗\varepsilon\in(ab)^*, é rejeitada pelo complemento. Como aba não consiste em blocos completos ab, é aceite pelo complemento.

Confere a tua resposta:

  • Converte a expressão num ε-NFA e calcula o DFA completo.
  • Troca os finais apenas no DFA.
  • Usa eliminação de estados se for exigida uma expressão para o complemento.

Erros frequentes

Não tomes (a+b)∗−(ab)∗(a+b)^*-(ab)^* como expressão construída pelos operadores básicos: a diferença tem de ser realizada por uma construção.

Voltar à explicação
Construir os fragmentos

Aplica Thompson a a∗+ba^*+b. Dá a lista de arestas, o início e o único final, sem simplificar os fragmentos. Justifica ε\varepsilon, aaaa, bb e abab.

Pista

Faz primeiro os dois ramos a estrela e b; só depois liga a união.

Mais uma pista

Usa a0→aa1a_0\xrightarrow{a}a_1 e b0→bb1b_0\xrightarrow{b}b_1. A estrela precisa de dois estados novos.

Solução

Começa pelas arestas a0→aa1a_0\xrightarrow{a}a_1 e b0→bb1b_0\xrightarrow{b}b_1. Para a estrela, acrescenta u,vu,v e as arestas vazias u→a0u\to a_0, u→vu\to v, a1→a0a_1\to a_0, a1→va_1\to v. Para a união, acrescenta início ss, final ff e as arestas vazias s→us\to u, s→b0s\to b_0, v→fv\to f, b1→fb_1\to f. São oito estados e só ff é final.

ε\varepsilon passa por s,u,v,fs,u,v,f sem ler letras. aaaa percorre a aresta de aa duas vezes, repetindo pelo ciclo vazio. bb escolhe o outro ramo. abab não é aceite: nenhum percurso pode ler parte no ramo a∗a^* e depois mudar para o ramo bb.

Confere a tua resposta:

  • Constrói o fragmento de a e as quatro arestas vazias da estrela.
  • Acrescenta entradas e saídas novas para a união.
  • Mostra que cada percurso da união escolhe um ramo, sem os concatenar.

Erros frequentes

Não ligues a saída da estrela à entrada de b: isso construiria concatenação. Não marques as saídas internas como finais da união.

Voltar à explicação
Eliminação com retorno

Sobre {a,b}\{a,b\}, um DFA tem início pp, finais q,rq,r e transições p→app\xrightarrow{a}p, p→bqp\xrightarrow{b}q, q→apq\xrightarrow{a}p, q→brq\xrightarrow{b}r, r→a,brr\xrightarrow{a,b}r. Converte-o numa expressão regular, eliminando pela ordem r,p,qr,p,q. Mostra os rótulos novos de cada ronda e testa b,bb,bab,abab,bb,bab,aba.

Pista

Depois de retirar p, pergunta que palavra faz uma volta de q até q.

Solução

Acrescenta início s→εps\xrightarrow{\varepsilon}p e saída ff, com q,r→εfq,r\xrightarrow{\varepsilon}f. Só ff fica final. Ao retirar rr, Rqf=ε+b(a+b)∗R_{qf}=\varepsilon+b(a+b)^*. Ao retirar pp, Rsq=a∗bR_{sq}=a^*b e Rqq=aa∗bR_{qq}=aa^*b; RqfR_{qf} mantém-se. Retirar qq dá

a∗b(aa∗b)∗(ε+b(a+b)∗).a^*b(aa^*b)^*(\varepsilon+b(a+b)^*).

bb chega a qq e termina; bbbb chega a rr; babbab regressa de qq a pp e volta a qq. Todas são aceites pela expressão e pelo DFA. abaaba termina em pp e é rejeitada. Os rótulos de uma ronda usam todos os valores anteriores à eliminação do estado dessa ronda.

Confere a tua resposta:

  • Preparei início e final novos.
  • Mantive ε na saída de q e calculei o ciclo aa*b.
  • Obtive a expressão e conferi as quatro palavras.
Voltar à explicação
Uma continuação que pode terminar agora

Usa derivadas para construir um DFA completo equivalente a R=(a+b)∗abaR=(a+b)^*aba. Dá as expressões dos estados alcançáveis, a tabela e os finais. Segue abaaba, ababaababa e abababab. Explica por que não podes omitir a derivada do fator abaaba ao calcular Da(R)D_a(R). Este problema próprio usa o método de conversão pedido na questão 3 do teste de 24/3/2023, com outra expressão.

Pista

A estrela pode gerar ε. Depois de ler a, também existe uma tentativa de completar o sufixo ba.

Solução

A primeira derivada é Da(R)=R+baD_a(R)=R+ba, porque (a+b)∗(a+b)^* pode ler o aa ou desaparecer antes do fator abaaba. Por bb, fica Db(R)=RD_b(R)=R. Repetindo a derivação, surgem quatro expressões:

EstadoaabbFinal?
A=RA=R, inicialBBAANão
B=R+baB=R+baBBCCNão
C=R+aC=R+aDDAANão
D=R+ba+εD=R+ba+\varepsilonBBCCSim

Só DD aceita ε. abaaba segue A,B,C,DA,B,C,D; ababaababa segue A,B,C,D,C,DA,B,C,D,C,D. Ambas aceitam. abababab segue A,B,C,D,CA,B,C,D,C e rejeita, embora tenha passado por um final.

Depois do prefixo lido, cada expressão descreve todas as continuações que completam uma palavra terminada em aba. A parcela R conserva as tentativas que ainda começam mais à frente. Se ignorássemos a anulabilidade da estrela, a derivação deixaria sempre R, nunca apareceria ε e até aba seria rejeitada.

Confere a tua resposta:

  • Mantive a parcela R nas derivadas e a continuação ba depois de a.
  • Obtive quatro estados alcançáveis e marquei só R+ba+ε como final.
  • Aceitei aba e ababa e rejeitei abab, conferindo o invariante de continuações.
Voltar à explicação

À tua maneira

Aparência

Modo de cor
Tema
Cor de destaque

Leitura

Fonte de leitura

Álgebra, lógica e uma ideia de cada vez.

Código

Fonte do código

Navegação

Cursor de leitura, sem edição. h, j, k, l movem; / pesquisa nesta página. v seleciona caracteres; V seleciona linhas; y copia. Tab permite destacar ou comentar. Espaço ou Enter abre blocos recolhíveis. Nos cartões, h, j, k, l mudam o foco.

CSS personalizado

Ativa uma sugestão ou guarda o teu CSS. Só muda este navegador.

Usa --page, --text e --accent para acompanhar o tema.

Seletores e recuperação

.site-header, .prose, .course-card, [data-reading-history], [data-playground] e .page-actions.

Abre a aparência com a tecla vírgula ou no rodapé. Se o CSS esconder os controlos, abre esta página sem CSS personalizado.

Pesquisar

Escreve para pesquisar em todo o site.

para escolher · Enter para abrir · Esc para fechar

Copiar fórmula

A cópia automática não está disponível. Copia o LaTeX abaixo.

Pesquisar nesta página

Enter procura · n / N repetem · Esc cancela. Ctrl / Cmd K pesquisa todo o site.

Atalhos de teclado

Clica numa tecla para a mudar. Esc cancela. Backspace desativa.

PesquisarCtrl / Cmd K

Os atalhos não interferem enquanto escreves. Tab e Enter funcionam sempre.