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

Desenvolva uma expressão regular sobre o alfabeto Σ = {a, b, c, d} que produza a linguagem L = {w | w possui ba ou bab ou dac como prefixo, abb ou acbc ou cac como subpalavra e acd ou bca ou cda 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 = ((ba + bab + dac) (a + b + c + d)* (abb + acbc + cac) (a + b + c + d)* (acd + bca + cda))

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 ba com a subpalavra abb resulta na palavra babb:

ER = (babb (a + b + c + d)* (acd + bca + cda))

2. A sobreposição do prefixo ba com a subpalavra acbc resulta na palavra bacbc:

ER = (bacbc (a + b + c + d)* (acd + bca + cda))

3. A sobreposição do prefixo bab com a subpalavra abb resulta na palavra babb:

ER = (babb (a + b + c + d)* (acd + bca + cda))

4. A sobreposição do prefixo dac com a subpalavra acbc resulta na palavra dacbc:

ER = (dacbc (a + b + c + d)* (acd + bca + cda))

5. A sobreposição do prefixo dac com a subpalavra cac resulta na palavra dacac:

ER = (dacac (a + b + c + d)* (acd + bca + cda))

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 abb com o sufixo bca resulta na palavra abbca:

ER = ((ba + bab + dac) (a + b + c + d)* abbca)

2. A sobreposição da subpalavra acbc com o sufixo bca resulta na palavra acbca:

ER = ((ba + bab + dac) (a + b + c + d)* acbca)

3. A sobreposição da subpalavra acbc com o sufixo cda resulta na palavra acbcda:

ER = ((ba + bab + dac) (a + b + c + d)* acbcda)

4. A sobreposição da subpalavra cac com o sufixo acd resulta na palavra cacd:

ER = ((ba + bab + dac) (a + b + c + d)* cacd)

5. A sobreposição da subpalavra cac com o sufixo cda resulta na palavra cacda:

ER = ((ba + bab + dac) (a + b + c + d)* cacda)

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 babb com a sobreposição da subpalavra/sufixo abbca resulta na palavra babbca:

ER = (babbca)

2. A sobreposição do prefixo/subpalavra bacbc com a sobreposição da subpalavra/sufixo acbca resulta na palavra bacbca:

ER = (bacbca)

3. A sobreposição do prefixo/subpalavra bacbc com a sobreposição da subpalavra/sufixo acbcda resulta na palavra bacbcda:

ER = (bacbcda)

4. A sobreposição do prefixo/subpalavra dacac com a sobreposição da subpalavra/sufixo cacd resulta na palavra dacacd:

ER = (dacacd)

5. A sobreposição do prefixo/subpalavra dacac com a sobreposição da subpalavra/sufixo cacda resulta na palavra dacacda:

ER = (dacacda)

6. A sobreposição do prefixo/subpalavra dacbc com a sobreposição da subpalavra/sufixo acbca resulta na palavra dacbca:

ER = (dacbca)

7. A sobreposição do prefixo/subpalavra dacbc com a sobreposição da subpalavra/sufixo acbcda resulta na palavra dacbcda:

ER = (dacbcda)

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

ER = (((ba + bab + dac) (a + b + c + d)* (abb + acbc + cac) (a + b + c + d)* (acd + bca + cda)) +
(babb (a + b + c + d)* (acd + bca + cda)) +
(bacbc (a + b + c + d)* (acd + bca + cda)) +
(dacac (a + b + c + d)* (acd + bca + cda)) +
(dacbc (a + b + c + d)* (acd + bca + cda)) +
((ba + bab + dac) (a + b + c + d)* abbca) +
((ba + bab + dac) (a + b + c + d)* acbca) +
((ba + bab + dac) (a + b + c + d)* acbcda) +
((ba + bab + dac) (a + b + c + d)* cacd) +
((ba + bab + dac) (a + b + c + d)* cacda) +
(babbca) +
(bacbca) +
(bacbcda) +
(dacacd) +
(dacacda) +
(dacbca) +
(dacbcda))

É 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 = (((ba + bab + dac) (a + b + c + d)* (abb + acbc + cac) (a + b + c + d)* (acd + bca + cda)) +
((babb + bacbc + dacac + dacbc) (a + b + c + d)* (acd + bca + cda)) +
((ba + bab + dac) (a + b + c + d)* (abbca + acbca + acbcda + cacd + cacda)) +
(babbca + bacbca + bacbcda + dacacd + dacacda + dacbca + dacbcda))