1 I I N NF F1 16 62 26 6 L Li i n ng gu ua ag ge en ns s F Fo or r m ma ai i s s e e A Au ut tô ôm ma at to os s ( ( 2 20 01 13 3- - 2 2) ) Informática PUC-Rio 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, aacbb (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)
20
Embed
Exercícios preparatórios para a Prova 2 - inf.puc-rio.brinf1626/...Prova-2-Guia-Respostas-2013-12-09.pdf · PUC-Rio Exercícios preparatórios para a Prova 2 Estes exercícios foram
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
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 }
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, aacbb
(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)
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.
• 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 GRDrev, 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.
Uma abordagem poderia ser inverter a expressão regular obtida no item anterior, para obter a expressão referente a Lrev: ((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 Arev, para ao final gerar a gramática GDRrev.
5. (ex.21) Considere Σ = {a,b,c} e Li, 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) L1: 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) L2: 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) L3: 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)+ :
δ(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 é:
11. (ex.84) Sejam M1, M2 e M3 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 M4, 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
(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:
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
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} Delta: q0,a,q1 q1,a,q2 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}, {S�aSbb | aaSb | ε}, S ) :
(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 apbq 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 xyiz ∉ L. Portanto, seja w = anb2n . 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 xyiz 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 = an/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 xyiz ∈ 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 = ({q0,q1,q2}, { a,b,c}, {(q 0,a) �q0, (q0,b) �q1, (q1,c) �q2,
(q2,c) �q2, (q2,a) �q0}, q0, {q0,q2}) 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 xyiz, 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).
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.