✖

Concatenação de linguagens regulares

Considere duas linguagens regulares L1, L2. Vamos demonstrar que a concatenação delas, L = L1 ∘ L2, também é uma linguagem regular.

O que é a concatenação

Concatenando as duas palavras “010” e “1111”, obtemos a palavra “0101111”. A concatenação de linguagens produz, assim, uma nova linguagem, que construímos concatenando cada palavra de uma linguagem com cada palavra da outra linguagem. A concatenação de duas palavras e de duas linguagens será representada por uma bolinha: ∘. Podemos, então, definir a concatenação das linguagens L1 e L2 assim:

L1∘L2={a∘b|a∈L1,b∈L2}

Ideia da demonstração

Temos duas linguagens regulares L1, L2 e dois autômatos que aceitam essas linguagens:

A1=⟨Q1,Σ1,δ1,q0,F1⟩A2=⟨Q2,Σ2,δ2,p0,F2⟩

Construímos um autômato não determinístico A = ⟨Q, Σ, δ, q, F⟩ que “contém em si” os dois autômatos A1 e A2. A ideia básica é que começamos a aceitar a palavra com o autômato A1 e, quando o autômato A1 chega a um estado final, tentamos ainda aceitar a parte restante da palavra com o autômato A2. Se esse autômato também aceita a parte da palavra, então o autômato A aceita a palavra.

Exemplo

Considere este autômato A1, que aceita as palavras não vazias compostas apenas de zeros e as palavras compostas de um 1 seguido apenas de zeros (1, 10, 100, …):

e considere também este autômato A2, que aceita as palavras que terminam em 01:

Unimos os autômatos assim: de todos os estados finais do autômato A1, acrescentamos transições ε para o estado inicial do autômato A2 e, em seguida, transformamos os estados finais de A1 em estados comuns. O estado inicial do novo autômato inteiro será o estado inicial do autômato A1:

Como o autômato vai funcionar? Começamos simulando o funcionamento do autômato A1. Se passarmos para um ex-estado final q1 ou q2, sabemos que o autômato A1 aceita uma parte dessa palavra. Para que a palavra inteira faça parte da linguagem L1 ∘ L2, a parte restante da palavra deve ainda ser aceita pelo segundo autômato A2 — por isso, de todos os ex-estados finais saem transições ε para o estado inicial original do autômato A2.

Como exemplo, tome a palavra 0001. Ela pertence à concatenação das duas linguagens, porque a palavra pode surgir da concatenação das palavras 00 ∘ 01. Mas também pode surgir da concatenação das palavras 0 ∘ 001. No nosso autômato podemos simular os dois procedimentos. O autômato pode seguir por este caminho:

q0→0q1→0q1→εp0→0p1→1p2

Por esse caminho, o autômato primeiro “aceitaria” a parte 00 da palavra e depois a parte 01. Ou pode seguir por este caminho:

q0→0q1→εp0→0p0→0p1→1p2

e o autômato “aceitaria”, então, primeiro a parte 0 da palavra e depois a parte 001. Nos dois casos, é claro, chegamos ao estado final p2.

Procedimento formal

Mais uma vez: temos duas linguagens regulares L1, L2 e dois autômatos que aceitam essas linguagens:

A1=⟨Q1,Σ1,δ1,q0,F1⟩A2=⟨Q2,Σ2,δ2,p0,F2⟩

Construímos o autômato não determinístico A = ⟨Q, Σ, δ, q, F⟩, para o qual vale:

  • Q = Q1 ∪ Q2 (supomos, ao mesmo tempo, que Q1 ∩ Q2 = ∅)
  • Σ= Σ1 ∪ Σ2
  • q = q0
  • F = F2

Construímos a função de transição δ aos poucos:

δ(q,a)={δ1(q,a)seq∈Q1∧q∉F1δ1(q,a)seq∈F1∧a≠εδ1(q,a)∪{p0}seq∈F1∧a=εδ2(q,a)seq∈Q2

Fontes

Capítulos: Fechamento das linguagens regulares, União de linguagens regulares, Interseção de linguagens regulares, Diferença de linguagens regulares, Complemento de uma linguagem regular, Concatenação de linguagens regulares, Fecho de uma linguagem regular