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))