Exercícios preparatórios para a Prova 2 Estes exercícios foram selecionados do Cap. 3 do livro-texto da disciplina (Ramos, 2009), e têm como objetivo auxiliar na preparação para a Prova 2, programada para o dia 09/10/2013. 1. (ex.3) Considere o alfabeto Σ e uma partição A, B, C de Σ. Utilizando exclusivamente esses conjuntos, e operações sobre os mesmos, defina formalmente a linguagem: { w Σ* w = α, (α A*C ou α C*A) e α 4, ou w = β, (β BB e β ε), ou w = γ, (γ A e γ C, γ = 1), ou w = δ, δ > 3 } L = L α L β L γ L δ, onde: L α = (A * C C * A) (Σ 0 Σ 1 Σ 2 Σ 3 Σ 4 ) L β = Σ + BB L γ = Σ 1 (A C) L δ = Σ + (Σ 1 Σ 2 Σ 3 ) 2. (ex.4) Considere a expressão (a b)*(c ε)(a b)* sobre o alfabeto {a,b,c}. (a) Ela é regular? Justifique sua resposta. Ela é regular pois, por definição, temos: ε é uma expressão regular cada símbolo do alfabeto {a,b,c} é uma ER se x e y são ER, então x y também é uma ER se x e y são ER, então xy também é uma ER se x é uma ER, então (x) também é uma ER se x é uma ER, então x* também é uma ER Portanto, como a expressão acima é uma composição desses elementos, ela é uma expressão regular bem formada. (b) Dê cinco exemplos de cadeias geradas por essa expressão. c, ε, ac, cb, abab (c) Caso seja regular, apresente uma gramática linear à direita que gere essa linguagem. S as bs ε cx ax bx X ε ax bx Padrão de cadeias: (a b)*(c ε)(a b)* prefixo (a b)* é uma cadeia tão longa quanto se queira (inclusive nula) contendo a s e b s em qualquer ordem (regras para a presença do prefixo: S as bs) parte principal é uma cadeia nula ou que contenha uma única instância de c (regras para a parte principal: S ε cx e X ε; estas regras dão conta da ausência de prefixo e de sufixo) 1
sufixo (a b)* é uma cadeia tão longa quanto se queira (inclusive nula) contendo a s e b s em qualquer ordem (regras para a presença do sufixo: S ax bx e X ε ax bx) 3. (ex.5) Construa expressões regulares sobre o alfabeto {a,b,c,d} que representem as seguintes linguagens: (a) Todas as cadeias que contenham entre dois (inclusive) e quatro (inclusive) símbolos a, e somente essas cadeias; (b c d) * a (b c d) * a (b c d) * (a ε) (b c d) * (a ε) (b c d) * (b) Todas as cadeias que contenham uma quantidade ímpar, porém maior ou igual a três, de símbolos a, e somente essas cadeias. (b c d) * a ( (b c d) * a (b c d) * a (b c d) * ) + 4. (ex.18) Construa, para a gramática linear à direita apresentada a seguir: S ax by cz X bs cx d Y bz ay cs Z cy az ε (a) As expressões regulares que representam a linguagem definida por cada um de seus símbolos não-terminais; Para converter a GRD acima para uma expressão regular, vamos convertê-la primeiro para um autômato equivalente: Em seguida, podemos aplicar o utilitário de conversão do JFLAP para nos auxiliar nessa tarefa de converter o autômato na expressão regular equivalente. O algoritmo iterativo consiste, basicamente, nos seguintes passos: selecionar um estado qk que não seja inicial ou final para ser eliminado para cada dupla de estados (qi,qj), i,j k, avaliar todas as possibilidades de transições entre i e j diretas ou que passam por qk, e construir a expressão regular equivalente a essas possibilidades. 2
reconstruir o autômato sem o estado qk, e completar com as novas transições que têm como rótulo as expressões regulares criadas no passo anterior. repetir esses passos até que todos os estados não iniciais e não finais tenham sido eliminados. Para o autômato em questão, na primeira iteração poderíamos eliminar q1, analisando todas as transições possíveis entre os demais estados que passariam por q1, ou diretas entre eles: De Para Expressão q0 q0 ba*c q0 q2 a q0 q3 c ba*b q0 q4 q2 q0 b q2 q2 c q2 q3 q2 q4 d q3 q0 ca*c......... Ao final, devem sobrar apenas os estados q0 e q4 (inicial e final), com a seguinte configuração: Os rótulos da configuração final podem ser traduzidos na expressão abaixo: (ba*c+ac*b+(c+ba*b)(a+ca*b)*ca*c)*(ac*d+(c+ba*b)(a+ca*b)*) ou, substituindo o + por na notação: (ba*c ac*b (c ba*b)(a ca*b)*ca*c)*(ac*d (c ba*b)(a ca*b)*) (b) Uma gramática linear à esquerda equivalente. Neste item, o objetivo é encontrar a GRD rev, ou seja, a gramática linear à direita que gera a linguagem reversa da linguagem em questão. A partir dela, podemos aplicar as regras de transformação de uma GRD em GRE para, ao final, obter a GRE da linguagem da questão. 3
Uma abordagem poderia ser inverter a expressão regular obtida no item anterior, para obter a expressão referente a L rev : ((ba*c+a)*(ba*b+c)+dc*a)(ca*c(ba*c+a)*(ba*b+c)+bc*a+ca*b)* A partir dela, construir o autômato A rev, para ao final gerar a gramática GDR rev. 5. (ex.21) Considere Σ = {a,b,c} e L i, i=1,2,3, as linguagens formadas por todas as cadeias passíveis de serem construídas sobre Σ, de tal forma que as seguintes regras sejam observadas respectivamente: (a) L 1 : as sentenças começam com a, terminam com dois c's consecutivos e apresentam um número par de símbolos b; a ((a c) * b (a c) * b (a c) * ) * cc (b) L 2 : as sentenças começam com b e apresentam um número total de símbolos que é ímpar; b ((a b c) (a b c)) * (c) L 3 : as sentenças apresentam qualquer quantidade de símbolos, mas não contêm dois (ou mais) símbolos c adjacentes. ((a b) (c ε) (a b)) * Construa expressões regulares que representem cada uma dessas linguagens. 6. (ex.37) Considere as linguagens definidas pelas expressões regulares abaixo: (a) (ab*c*)* (a*b*c)+ (b) aaa(b c)* (b c)*aaa (c) a*b ab* Para cada uma dessas linguagens, obtenha: (a) Um autômato finito qualquer que a reconheça; (b) Um autômato finito que a reconheça e que não contenha não-determinismos, transições em vazio, estados inacessíveis nem estados inúteis. (a) (ab*c*)* (a*b*c)+ Vamos construir o autômato finito para a primeira parte da expressão - (ab*c*)* : Agora, para a segunda parte da expressão - (a*b*c)+ : 4
Juntando as duas partes num só autômato, temos: Eliminando transições vazias: Eliminando o não-determinismo: Q = {q0,qa1,qa2,qa3,qb0,qb1qb2} 5
F = {q0,qa1,qa2,qa3,qb2} q0,a,{qa1,qb0} q0,b,qb1 q0,c,qb2 qa1,a,qa1 qa1,b,qa2 qa1,c,qa3 qa2,a,qa1 qa2,b,qa2 qa3,a,qa1 qa3,c,qa3 qb0,a,qb0 qb0,b,qb1 qb0,c,qb2 qb1,b,qb1 qb1,c,qb2 qb2,a,qb0 qb2,b,qb1 qb2,c,qb2 Fazendo qn1 = {qa1,qb0}, substituímos suas ocorrências e atualizamos as transições: Q = {q0,qa1,qa2,qa3,qb0,qb1qb2,qn1} F = {q0,qa1,qa2,qa3,qb2,qn1} q0,b,qb1 q0,c,qb2 qa1,a,qa1 qa1,b,qa2 qa1,c,qa3 qa2,a,qa1 qa2,b,qa2 qa3,a,qa1 qa3,c,qa3 qb0,a,qb0 qb0,b,qb1 qb0,c,qb2 qb1,b,qb1 qb1,c,qb2 qb2,a,qb0 qb2,b,qb1 qb2,c,qb2 qn1,a,qn1 qn1,b,{qa2 qb1} qn1,c,{qa3 qb2} 6
Fazendo qn2 = {qa2 qb1}, substituímos suas ocorrências e atualizamos as transições: Q = {q0,qa1,qa2,qa3,qb0,qb1qb2,qn1} F = {q0,qa1,qa2,qa3,qb2,qn1,qn2} q0,b,qb1 q0,c,qb2 qa1,a,qa1 qa1,b,qa2 qa1,c,qa3 qa2,a,qa1 qa2,b,qa2 qa3,a,qa1 qa3,c,qa3 qb0,a,qb0 qb0,b,qb1 qb0,c,qb2 qb1,b,qb1 qb1,c,qb2 qb2,a,qb0 qb2,b,qb1 qb2,c,qb2 qn1,a,qn1 qn1,b,qn2 qn1,c,{qa3 qb2} qn2,a,qa1 qn2,b,qn2 qn2,c, qb2 Fazendo qn3 = {qa3 qb2}, substituímos suas ocorrências e atualizamos as transições: Q = {q0,qa1,qa2,qa3,qb0,qb1qb2,qn1,qn2,qn3} F = {q0,qa1,qa2,qa3,qb2,qn1,qn2,qn3} q0,b,qb1 q0,c,qb2 qa1,a,qa1 qa1,b,qa2 qa1,c,qa3 qa2,a,qa1 qa2,b,qa2 qa3,a,qa1 qa3,c,qa3 qb0,a,qb0 7
qb0,b,qb1 qb0,c,qb2 qb1,b,qb1 qb1,c,qb2 qb2,a,qb0 qb2,b,qb1 qb2,c,qb2 qn1,a,qn1 qn1,b,qn2 qn1,c,qn3 qn2,a,qa1 qn2,b,qn2 qn2,c, qb2 qn3,a,qn1 qn3,b,qb1 qn3,c,qn3 Representação do DFA: 7. (ex.38) Construa um autômato finito determinístico equivalente ao autômato cuja função de transição é: 8
δ(q0,a) = {q1,q2}, δ(q1,b) = {q1q3}, δ(q2,b) = {q1}, δ(q2,c) = {q3}, δ(q3,d) = {q3}, com F = {q3}. Passo 1: copiar as transições originais q0, a, [q1 q2] -> novo estado qn1 = [q1 q2] q1, b, [q1 q3] q2, b, q1 q2, c, q3 q3, d, q3 Passo 2: substituir as ocorrências de [q1 q2] por qn1 e, para cada estado de qn1, calculando as novas transições: q0, a, qn1 q1, b, [q1 q3] q2, b, q1 q2, c, q3 q3, d, q3 qn1, b, [q1 q3] qn1, c, q3 (não há transições com a ou d, pois não havia nenhuma a partir de q1 ou q2) Passo 3: é possível eliminar q2, pois não é destino de nenhuma transição q0, a, qn1 q1, b, [q1 q3] q3, d, q3 qn1, b, [q1 q3] qn1, c, q3 Passo 4: substituir [q1 q3] por qn2, e incluir as transições correspondentes a q1 e q3. Como q3 é final, qn2 também deve ser final. Além disso, posso eliminar q1: q0, a, qn1 q1, b, qn2 q3, d, q3 qn1, b, qn2 qn1, c, q3 qn2, b, qn2 qn2, d, q3 Configuração final do autômato: 8. (ex.39) Construa um autômato finito determinístico e sem transições em vazio que seja equivalente ao autômato cuja função de transição é: 9
δ(q0,a) = {q0}, δ(q0, ε) = {q1}, δ(q1, b) = {q1}, δ(q1, ε) = {q2}, δ(q2, a) = {q2}, δ(q2, b) = {q2}, δ(q2, ε) = {q3}, com F={q3}. Autômato inicial: Eliminação de transições-ε: Eliminação de não-determinismo: Q = {q0, q1, q2} F = {q0,q1,q2} q0,a,[q0 q2] q0,b,[q1 q2] q1,b,q1 q2,q,q2 q2,b,q2 Fazendo qn1=[q0 q2]: F={q0,q1,q2,qn1} q0,b,[q1 q2] q1,b,q1 q2,a,q2 q2,b,q2 qn1,a,qn1 qn1,b,[q1 q2] Fazendo qn2=[q1 q2]: F={q0,q1,q2,qn1,qn2} q0,b,qn2 10
q1,b,q1 q2,a,q2 q2,b,q2 qn1,a,qn1 qn1,b,qn2 qn2,a,q2 qn2,b,qn2 q1 pode ser eliminado: F={q0,q1,q2,qn1,qn2} q0,b,qn2 q2,a,q2 q2,b,q2 qn1,a,qn1 qn1,b,qn2 qn2,a,q2 an2,b,qn2 Resultado para o DFA: 9. (ex.41) Obtenha autômatos finitos determinísticos e isentos de transições em vazio que reconheçam cada uma das seguintes linguagens: (a) (a*b*(a ac*))* Exemplo de autômato: 11
Eliminação de transições-ε: Eliminação de transições não-determinísticas: q0,a,[q0q2] q0,b,q1 q1,b,q1 q2,a,[q0q2] q2,b,q1 q2,c,q2 Fazendo qn1=[q0q2] q0,b,q1, q1,b,q1 q2,a,qn1 q2,b,q1 q2,c,q2 qn1,a,qn1 qn1,b,q1 qn1,c,q2 F={q0,q2,qn1} DFA: 12
(b) a*b* b*a* 10. (ex.56) Considere a linguagem (0*11*(2 3))+, sobre o alfabeto Σ = {0,1,2,3}: (a) Construa um autômato finito qualquer que reconheça essa linguagem. Exemplo de autômato: (b) Mostre a sequência de movimentações que conduzem esse autômato finito à aceitação da cadeia 01200113. (q0,01200113) (q0, 1200113) (q1, 200113) (q2, 00113) (q0, 00113) (q0, 0113) (q0, 113) (q1, 13) (q1, 3) (q2, ) 11. (ex.84) Sejam M 1, M 2 e M 3 autômatos finitos que reconhecem, respectivamente, os conjuntos regulares α, β e γ. Indique, cuidadosamente, todos os passos que devem ser seguidos a fim de se obter um novo autômato M 4, que reconheça o conjunto (α βγ)*. Criar um estado inicial q0 para M4 Copiar todos os estados e transições de M1, M2 e M3 para M4 Todos os estados copiados dos 3 autômatos perdem seu status de iniciais ou finais Criar uma transição com ε de q0 para o estado inicial de M1 e outra análoga para o estado inicial de M2 Criar uma transição com ε de todos os estados que eram finais em M2 para o antigo estado inicial de M3 Criar um estado final qf para M4 Criar uma transição com ε para qf a partir de todos os estados que eram finais de M1 e M3 Criar uma transição com ε de qf para q0 12. (ex.87) Considere a linguagem L {a,b,c}* tal que w L se e somente se w contém as subcadeias aaa e bbb: 13
(a) Obtenha uma gramática que gere essa linguagem; (b) Obtenha uma expressão regular que gere essa linguagem; (c) Obtenha um autômato finito que reconheça essa linguagem. Invertendo um pouco a ordem do exercício para facilitar a sua elaboração : (b) Devemos considerar dois caso: o caso em que aaa vem antes de bbb, e vice-versa. (a b c) * ((aaa (a b c) * bbb) (bbb (a b c) * aaa)) (a b c) * (c) autômato finito: (a) Supondo que os não terminais da gramática sejam Qx, para ficar fácil de associarmos as regras abaixo com o desenho do autômato: Q 0 aq 1 bq 7 cq 0 Q 1 aq 2 bq 7 cq 0 Q 2 aq 3 bq 7 cq 0 Q 3 aq 3 bq 4 cq 3... 13. (ex.89) Construa um autômato finito mínimo que aceite a linguagem gerada pela expressão regular ab*abb*abbb* (a* b*a)bbb*, definida sobre o alfabeto {a,b}. 14. (ex.105) Existe algum autômato finito com 3 estados que aceite a linguagem (aa)*a(aaa)*? Prove a sua resposta. Possível autômato para a linguagem: 14
Eliminação de não-determinismo: Q = {q0,q1,q2,q3,q4,q5,q6} F = {q3,q6} q0,a,[q1q3] q2,a,[q1q3] q3,a,q4 q4,a,q5 q5,a,q6 q6,a,q4 Criando estado qn1=[q1q3] para eliminar o não determinismo: Q = {q0,q1,q2,q3,q4,q5,q6,qn1} F = {q3,q6,qn1} q2,a, qn1 q3,a,q4 q4,a,q5 q5,a,q6 q6,a,q4 qn1,a,[q2 q4] Fazendo qn2=[q2 q4]: Q = {q0,q1,q2,q3,q4,q5,q6,qn1,qn2} F = {q3,q6,qn1} q2,a,qn1 q3,a,q4 q4,a,q5 q5,a,q6 q6,a,q4 qn1,a,qn2 qn2,a,[q1 q3 q5] (expandir qn1 para seus componentes) Fazendo qn3=[q1 q3 q5]: Q = {q0,q1,q2,q3,q4,q5,q6,qn1,qn2,qn3} F = {q3,q6,qn1,qn3} 15
q2,a,qn1 q3,a,q4 q4,a,q5 q5,a,q6 q6,a,q4 qn1,a,qn2 qn2,a,qn3 qn3,a,[q2 q4 q6] Fazendo qn4=[q2 q4 q6]: Q = {q0,q1,q2,q3,q4,q5,q6,qn1,qn2,qn3,qn4} F = {q3,q6,qn1,qn3,qn4} q2,a,qn1 q3,a,q4 q4,a,q5 q5,a,q6 q6,a,q4 qn1,a,qn2 qn2,a,qn3 qn3,a,qn4 qn4,a,[q1 q3 q4 q5] Fazendo qn5=[q1 q3 q4 q5]: Q = {q0,q1,q2,q3,q4,q5,q6,qn1,qn2,qn3,qn4,qn5} F = {q3,q6,qn1,qn3,qn4,qn5} q2,a,qn1 q3,a,q4 q4,a,q5 q5,a,q6 q6,a,q4 qn1,a,qn2 qn2,a,qn3 qn3,a,qn4 qn4,a,qn5 qn5,a,[q2 q4 q5 q6] Fazendo qn6=[q2 q4 q5 q6]: Q = {q0,q1,q2,q3,q4,q5,q6,qn1,qn2,qn3,qn4,qn5,qn6} F = {q3,q6,qn1,qn3, qn4,qn5,qn6} 16
q2,a,qn1 q3,a,q4 q4,a,q5 q5,a,q6 q6,a,q4 qn1,a,qn2 qn2,a,qn3 qn3,a,qn4 qn4,a,qn5 qn5,a,qn6 qn6,a,[q1 q3 q4 q5 q6] Fazendo qn7=[q1 q3 q4 q5 q6]: Q = {q0,q1,q2,q3,q4,q5,q6,qn1,qn2,qn3,qn4,qn5,qn6,qn7} F = {q3,q6,qn1,qn3, qn4,qn5,qn6,qn7} q2,a,qn1 q3,a,q4 q4,a,q5 q5,a,q6 q6,a,q4 qn1,a,qn2 qn2,a,qn3 qn3,a,qn4 qn4,a,qn5 qn5,a,qn6 qn6,a,qn7 qn7,a,[q2 q4 q5 q6] = qn6 Analisando a função de transição final, podemos facilmente verificar que os estados q1,q2,q3,q4,q5 e q6 não são acessíveis a partir de q0. Portanto, podem ser eliminados: Q = {q0, qn1,qn2,qn3,qn4,qn5,qn6,qn7} F = {qn1,qn3, qn4,qn5,qn6,qn7} qn1,a,qn2 qn2,a,qn3 qn3,a,qn4 qn4,a,qn5 qn5,a,qn6 qn6,a,qn7 17
qn7,a, qn6 Minimizando o autômato: Estados não-finais Finais (0,2) (1,3,4,5,6,7) Expandindo (0,2) com o terminal a, o grupo se mantém o mesmo, sem divisões. Expandindo o grupo (1,3,4,5,6,7), temos a subdivisão em dois grupos (1) (3,4,5,6,7). Agora, o grupo (0,2) pode ser dividido em (0)(2). Portanto, renomeando os estados temos: q0 = (0) q1 = (1) q2 = (2) q3 = (3,4,5,6,7) Q = {q0,q1,q2,q3} F = {q1,q3} q0,a,q1 q2,a,q3 q3,a,q3 Autômato final minimizado: Portanto, a resposta é: NÃO existe um autômato de 3 estados que aceite a linguagem. 15. (ex.128) Por que o "Pumping Lemma" das linguagens regulares não é necessariamente válido para cadeias de comprimento menor que n, onde n é o número de estados do autômato finito mínimo que aceita essa linguagem? Seja L uma linguagem regular, e w uma cadeia L tal que w n (n = número de estados do autômato que reconhece L). Para as cadeias w com tamanho menor que n, não é possível afirmar que a cadeia está associada a um ciclo no autômato, pois é possível que o reconhecimento de w ocorra sem ciclos (pois não usou todos os estados do autômato). Com isso, o lema do bombeamento não vale para este tipo de cadeia. 16. (ex.135) Considere a linguagem gerada pela gramática ( {S,a,b}, {a,b}, {SaSbb aasb ε}, S ) : 18
(a) Descreva de maneira informal, porém clara e precisa, a linguagem gerada por essa gramática; Seja L a linguagem gerada por essa gramática. L é composta pela cadeia vazia e cadeias do tipo a p b q onde p/2 <= q <= 2p, com (p+q) múltiplo de 3. (b) Prove que essa linguagem não é regular. Supondo que L seja regular, seja n o número de estados do autômato hipotético que a reconhece. Para provar que o lema do bombeamento não vale para L, temos que mostrar que existe pelo menos uma cadeia w (w L, w n) tal que, para toda maneira de dividir w em 3 subcadeias xyz, xy n, e y 1, existe pelo menos um i 0 tal que xy i z L. Portanto, seja w = a n b 2n. Temos que w L (3n é multiplo de 3, e q=2p), e w n. Ao dividir w em xyz de forma que xy n e y 1, temos que xy é formada apenas por a's. Para qualquer tamanho de y entre 1 e n, sempre será possível escolher um i tal que xy i z forme uma cadeia com uma quantidade de a's muito superior a 2q, o que contraria a regra descrita no item a. Portanto, L não é regular. 17. (ex.136) Prove que a linguagem {w {a,b,c,d}*, tais que w a + w b = w c + w d } não é regular. Supondo que essa linguagem L seja regular, seja n o número de estados do AFD que a reconhece. Seja a cadeia w = a n/2 b n/2 c n/2 d n/2. Pela definição da linguagem, w L. Além disso, w > n. Para dividirmos w em três partes xyz de modo que xy n e y 1, xy irá conter apenas a's e b's. Dessa forma, para qualquer escolha de xyz que atenda a esses requisitos, o bombeamento da subcadeia y irá alterar a quantidade de a's e b's na cadeia resultante, enquanto a quantidade de c's e d's se mantém constante. Com isso, a igualdade do enunciado não poderá ser mantida. Assim, não vale xy i z L, para todo i 0. Portanto, a cadeia escolhida é um contra-exemplo que demonstra que o lema do bombeamento não se aplica e, portanto, L não é regular. 18. (ex.140) O autômato M = ({q 0,q 1,q 2 }, {a,b,c}, {(q 0,a) q 0, (q 0,b) q 1, (q 1,c) q 2, (q 2,c) q 2, (q 2,a) q 0 }, q 0, {q 0,q 2 }) reconhece uma linguagem infinita e é tal que a L(M). Essa sentença pode ser dividida em três partes x=ε, y=a, z=ε, de forma que as cadeias xy i z, i 0, também pertencem a L. Justifique esse fato, uma vez que a sentença escolhida possui comprimento ( a =1) inferior ao mínimo exigido pelo Pumping Lemma para as linguagens regulares (no caso do autômato apresentado, n=3). Autômato do enunciado: 19
Esse fato ocorre porque o loop que permite o bombeamento ocorre logo no estado inicial, que também é final. Portanto, como a* L, a cadeia 'a' pode ser bombeada, mesmo tendo um comprimento menor que a quantidade de estados do autômato. 20