Ybadoo - Soluções em Software Livre
Tutoriais
Linguagens Formais e Autômatos

Desenvolva uma expressão regular sobre o alfabeto Σ = {a, b, c} que produza a linguagem L = {w | w possui acb ou cac como prefixo, baa ou cba como subpalavra e acb ou bac como sufixo}.

 

Para a classe de problemas abordado no enunciado do exercício, a elaboração da expressão regular que produza a linguagem L, segue o esquema composto por quatro casos, como segue:

ER = (((prefixos)(alfabeto)(subpalavras)(alfabeto)(sufixos)) +
((sobreposições prefixos/subpalavras)(alfabeto)(sufixos)) +
((prefixos)(alfabeto)(sobreposições subpalavras/sufixos)) +
(sobreposições prefixos/subpalavras/sufixos))

O primeiro caso considera que não existem sobreposições entre os elementos que definem os prefixos e as subpalavras e nem entre os elementos que definem as subpalavras e os sufixos da linguagem L, como segue:

ER = ((prefixos)(alfabeto)(subpalavras)(alfabeto)(sufixos))
ER = ((acb + cac) (a + b + c)* (baa + cba) (a + b + c)* (acb + bac))

O segundo caso considera a existência de sobreposições entre os elementos que definem os prefixos e as subpalavras da linguagem L, como segue:

ER = ((sobreposições prefixos/subpalavras)(alfabeto)(sufixos))

1. A sobreposição do prefixo acb com a subpalavra baa resulta na palavra acbaa:

ER = (acbaa (a + b + c)* (acb + bac))

2. A sobreposição do prefixo acb com a subpalavra cba resulta na palavra acba:

ER = (acba (a + b + c)* (acb + bac))

3. A sobreposição do prefixo cac com a subpalavra cba resulta na palavra cacba:

ER = (cacba (a + b + c)* (acb + bac))

O terceiro caso considera a existência de sobreposições entre os elementos que definem as subpalavras e os sufixos da linguagem L, como segue:

ER = ((prefixos)(alfabeto)(sobreposições subpalavras/sufixos))

1. A sobreposição da subpalavra baa com o sufixo acb resulta na palavra baacb:

ER = ((acb + cac) (a + b + c)* baacb)

2. A sobreposição da subpalavra cba com o sufixo acb resulta na palavra cbacb:

ER = ((acb + cac) (a + b + c)* cbacb)

3. A sobreposição da subpalavra cba com o sufixo bac resulta na palavra cbac:

ER = ((acb + cac) (a + b + c)* cbac)

O quarto e último caso considera a existência de sobreposições entre os elementos que definem os prefixos, as subpalavras e os sufixos da linguagem L, como segue:

ER = (sobreposições prefixos/subpalavras/sufixos)

1. A sobreposição do prefixo/subpalavra acba com a sobreposição da subpalavra/sufixo cbac resulta na palavra acbac:

ER = (acbac)

2. A sobreposição do prefixo/subpalavra acba com a sobreposição da subpalavra/sufixo cbacb resulta na palavra acbacb:

ER = (acbacb)

3. A sobreposição do prefixo/subpalavra acbaa com a sobreposição da subpalavra/sufixo baacb resulta na palavra acbaacb:

ER = (acbaacb)

4. A sobreposição do prefixo/subpalavra cacba com a sobreposição da subpalavra/sufixo cbac resulta na palavra cacbac:

ER = (cacbac)

5. A sobreposição do prefixo/subpalavra cacba com a sobreposição da subpalavra/sufixo cbacb resulta na palavra cacbacb:

ER = (cacbacb)

Desta forma, a expressão regular que produza a linguagem L é:

ER = (((acb + cac) (a + b + c)* (baa + cba) (a + b + c)* (acb + bac)) +
(acba (a + b + c)* (acb + bac)) +
(acbaa (a + b + c)* (acb + bac)) +
(cacba (a + b + c)* (acb + bac)) +
((acb + cac) (a + b + c)* baacb) +
((acb + cac) (a + b + c)* cbac) +
((acb + cac) (a + b + c)* cbacb) +
(acbaacb) +
(acbac) +
(acbacb) +
(cacbac) +
(cacbacb))

É possível apresentar uma expressão regular mais concisa que produza a linguagem L, agrupando as ocorrências dos casos idênticos numa única expressão, como segue:

ER = (((acb + cac) (a + b + c)* (baa + cba) (a + b + c)* (acb + bac)) +
((acba + acbaa + cacba) (a + b + c)* (acb + bac)) +
((acb + cac) (a + b + c)* (baacb + cbac + cbacb)) +
(acbaacb + acbac + acbacb + cacbac + cacbacb))