Gramáticas Livres de Contexto 25 de novembro de 2011 Definição 1 Uma Regra (ou produção) é um elemento do conjunto V (V Σ). Sendo que V é um conjunto finito de elementos chamados de variáveis e Σ um conjunto disjunto chamado de Al fabeto. Uma regra [A, w] normalmente é escrita como A w. Definição 2 Uma Gramática Livre de Contexto é uma quádrupla (V, Σ, P, S), onde V é um conjunto finito de variáveis, Σ (ou o Alfafeto) é um conjunto finito de símbolos terminais, P é um conjunto finito de regras, e S é um elemento de V chamado de símbolo inicial. Os conjuntos V e Σ são disjuntos. Definição 3 Uma Árvore de Derivação de uma palavra pertencente à uma lingüagem gerada por uma gramática livre de contexto, é uma árvore construída iterativamente da seguinte forma: 1. Inicialize a árvore com a raíz S. 2. Se A x 1 x 2...x n com x i (V Σ) é a regra de derivação aplicada à palavra uav, então adicione x 1,x 2,...,x n como filhos de A na árvore. 3. Se A λ é a única regra de derivação aplicada à palavra uav, então adicione λ como o único filho de A na árvore. Definição 4 Uma Gramática Regular é uma gramática livre de contexto na qual toda regra de derivação tem uma das seguintes formas: 1. A a 2. A ab 3. A λ Exercícios da Seção 0 Exercício 1 - Seja G a gramática S absc A A cad cd. 1
a) Dê uma derivação de ababccddcc. S absc ababscc ababacc ababcadcc ababccddcc b) Construa a árvore de derivação da derivação do exercício anterior. c) Use a notação de conjuntos para definir L(G). L(G) = {(ab) m c n d n c m m,n 0} Exercício 2 - Seja G a gramática S ASB λ A aab λ B bba ba a) Dê uma derivação à esquerda de aabbba. S ASB aabsb aaabbsb aabbsb aabbb aabbba b) Dê uma derivação à direita de abaabbbabbaa. 2
S ASB ASbBa ASbbaa AASBbbaa AASbabbaa AAbabbaa AaAbbabbaa AaaAbbbabbaa Aaabbbabbaa aabaabbbabbaa abaabbbabbaa c) Construa a árvore de derivação para as duas derivações anteriores. d) Use a notação de conjuntos para definir L(G). L(G) = {A n B n,n 0} A = {a n b n,n }0 B = {b n a n,n > 0} Exercício 3 - Seja G a gramática S SAB λ A aa a B bb λ a) Dê uma derivação à esquerda de abbaab. S SAB SABAB ABAB abab 3
abbab abbbab abbab abbaab abbaab abbaabb abbaab b) Dê duas derivações à esquerda de aa. S SAB AB aab aab aa S SAB SABAB ABAB abab aab aab aa c) Construa a árvore de derivação das duas derivações da questão anterior. d) Dê uma expressão regular para L(G). (aa b ) Exercício 4 - Seja DT a árvore de derivação a) Dê uma derivação à esquerda que gera a árvore DT. S AB 4
aab aab aaab aaab aaab b) Dê uma derivação à direita que gera a árvore DT. S AB AAB AAb Aab aaab aaab c) Quantas derivações diferentes podem gerar DT? Existem ao todo 17 diferentes derivações que resultam nesta árvore. Exercício 5 - Dê uma derivação à direita e à esquerda correspondente à cada árvore de derivação abaixo. 5
S AA aa aaaa abaaa abaaa ababaa ababaa ababaa S AA AAAA AAAa AAbAa AAbaa AbAbaa Ababaa ababaa S AA AAAA aaaa abaaa abaaa ababaa ababaa ababaa S AA Aa AAAa AAbAa AAbaa AbAbaa Ababaa ababaa A quarta árvore é igüal à primeira e a terceira é igüal à segunda. Ou ao menos deveria ser, há um erro na imagem apresentada no livro. A segunda árvore está errada e não pode ser gerada pela gramátida dada como exemplo. Exercício 6 - Para cada uma das seguintes gramáticas livres de contexto, use a notação de conjuntos para definir a lingüagem gerada pela gramática. a) S aasb λ B bb b L(G) = {a 2n b m m n 0} b) S asbb A A ca c L(G) = {a i c n b 2i n,i 0} c) S absdc A A cdaba λ L(G) = {(ab) m (cd) n (ba) n (dc) m m > 0,n 0} d) S as ba λ A aa bs L(G) = {(A B) n n 0} 6
A = {a n n 0} B = {b n n > 0} Exercício 7 - Construa uma gramática sobre {a,b,c} cuja lingüagem é {a n b 2n c m n,m > 0}. S AC A aabb λ C cc λ Exercício 8 - Construa uma gramática sobre {a,b,c} cuja lingüagem é {a n b m c 2n+m n,m > 0}. S ascc bac λ A bac λ Exercício 9 - Construa uma gramática sobre {a,b,c} cuja lingüagem é {a n b m c i 0 n+m i}. S ascc bacc C λ A bacc λ C cc λ Exercício 10 - Construa uma gramática sobre {a, b} cuja lingüagem é {a m b n 0 n m 3n}. S asb aasb aaasb λ Exercício 11 - Construa uma gramática sobre {a, b} cuja lingüagem é {a m b i a n i = m+n}. S AB λ A aab λ B bba λ 7
Exercício 12 - Construa uma gramática sobre {a,b} cuja lingüagem é o conjunto de palavras com o mesmo número de as e bs. S asb bsa abs bas λ Exercício 13 - Para cada uma das seguintes gramáticas regulares, dê uma expressão regular para a lingüagem gerada pela gramática. a) S aa A aa ba b a(a b) b b) S aa A aa bb B bb λ aa b b c) S as ba A bb B ab λ a bba d) S as ba λ A aa bs (a ba ba ) Exercício 14 - Construa uma gramática sobre {a,b} cuja lingüagem é o conjunto de palavras de tamanho ímpar e que contém o mesmo símbolo no começo e na posição do meio. 8
S A B A aa a aa b a B bb a bb b a A aa a aa b ba a ba b a B ab a ab b bb a bb b b Exercício 15 - Dê uma gramática regular para o conjunto das palavras sobre {a,b,c} nas quais todos os as precedem bs, que por sua vez precedem cs, sendo possível que não hajam as, bs ou cs. S λ as ab bb cc B bb bc λ C cc λ Exercício 16 - Dê uma gramática regular para a mesma lingüagem do exercício anterior, mas sem a palavra vazia. S as ab bb cc B bb bc λ C cc λ Exercício 17 - Dê uma gramática regular para o conjunto de palavras de tamanho dois ou mais sobre {a,b} nos quais todos os as precedem os bs. S aa bb A aa bb A aa λ B bb B bb λ Exercício 18 - Dê uma gramática regular para o conjunto de palavras sobre {a,b} que contém a subpalavra aa e bb. 9
S aq bq aa bb Q aq bq aa bb A aq B bq Q aq bq bb Q aq bq aa A aq B bq Q aq bq λ Exercício 19 - Dê uma gramática regular para o conjunto de palavras sobre {a,b} nas quais a subpalavra aa aparece ao menos duas vezes. S aq bq aa Q aq bq aa A aq Q aq bq aa A aq Q aq bq λ Exercício 20 - Dê uma gramática regular para o conjunto de palavras sobre {a,b,c} que não contém aa. S an bs cs λ N bs cs λ Exercício 21 - Dê uma gramática regular para o conjunto de palavras sobre {a,b} que não começa com aaa. S aa bs λ S aa bs λ A bs aa λ A bs λ 10
Exercício 22 - Dê uma gramática regular para o conjunto de palavras sobre {a,b} que não contém aaa. S aa bs λ A bs aa λ A bs λ Exercício 23 - Dê uma gramática regular para o conjunto de palavras sobre {a,b} que não contém aba. S aa bs λ A as ba λ A bs λ Exercício 24 - Dê uma gramática regular para o conjunto de palavras sobre {a,b} que contém a subpalavra aa exatamente uma vez. S aq bq aa Q aq bq aa A aq Q aq bq λ Exercício 25 - Dê uma gramática regular para o conjunto de palavras sobre {a,b,c} que começa com a, contém exatamente dois bs e termina com cc. S aq Q aq bq cq Q aq bq cq Q aq cq cc C c Exercício 26 - Dê uma gramática regular para o conjunto de palavras sobre {a,b,c} que contém ab e contém ba. 11
S as bs cs aa bb A as cs bq B aq cs bs Q aq bq bb cq Q aq bq cq aa A bq aq cq B Q bq aq cq aq bq cq λ Exercício 27 - Dê uma gramática regular para o conjunto de palavras sobre {a,b,c} que contém aa, bb e cc. S as bs cs aa bb cc A ad cs bs B as cs be C as cf bs D ad bd cd bb cc E ae be ce aa cc F af bf cf aa bb A ac ce be A ab cf bf B ad cd bc B af cf ba C ad bd cb C ae be ca A aa ba ca aa f B ab bb cb bb f C ac bc cc cc f A f aq ba ca B f ab bq cb C f ac bc cq Q aq bq cq λ Exercício 28 - Dê uma gramática regular para o conjunto de palavras sobre {a,b,c} nas quais todo b é seguido por pelo menos um c. S as cs bb B cs Exercício 29 - Dê uma gramática regular para o conjunto de palavras sobre {a,b,c} com tamanho três. 12
S aa ba ca A ab bb cb B a b c Exercício 30 - Dê uma gramática regular para o conjunto de palavras sobre {a,b,c} com tamanho menor que três. S aa ba ca λ A a b c λ Exercício 31 - Dê uma gramática regular para o conjunto de palavras sobre {a,b,c} com tamanho maior que três. S aa ba ca A ab bb cb B ac bc cc C ad bd cd D ad bd cd λ Exercício 32 - Dê uma gramática regular para o conjunto de palavras sobre {a,b} nas quais o número de as é divisível por três. S aa bs λ A ab ba B as bb Exercício 33 - Dê uma gramática regular para o conjunto de palavras sobre {a,b,c} nas quais o número total de bs e cs é três. S as ba ca A aa bb cb B ab bc cc C ac λ 13
Exercício 34 - Dê uma gramática regular para o conjunto de palavras sobre {a,b} nas quais todo a é seguido ou precedido por b. S ab ba λ A as ba λ B ba Exercício 35 - Dê uma gramática regular para o conjunto de palavras sobre {a,b} de tamanho ímpar e que contém bb. S ai bi bb I as bs bb B bi B bp I af bf F ai bi λ P ax bx λ X ap bp Exercício 36 - Dê uma gramática regular para o conjunto de palavras sobre {a,b,c} de tamanho par e que contém exatamente um a. S ap bi ci I ai bs cs P bx cx λ X bp cp I bf cf F bi ci λ Exercício 37 - Dê uma gramática regular para o conjunto de palavras sobre {a,b,c} com um número ímpar de ocorrências de ab. S aa bs cs A bi bs cs I aa bi ci λ A bs bi ci λ 14
Exercício 38 - Dê uma gramática regular para o conjunto de palavras sobre {a,b} com tamanho ímpar e exatamente dois bs. S ai bb i I as bb p B i B p P I P f ap bp f ai bi f ai bi f ap bp f ax λ X ap f I f af F ai f λ Exercício 39 - Dê uma gramática regular para o conjunto de palavras sobre {a,b} com um número par de as ou ímpar de bs. S ab ba λ A ac bs λ B as bc C aa bb λ Exercício 40 - A gramática abaixo gera (b ab ab 8 ) +, o conjunto de todas as palavras com um número par e positivo de as. Prove. S AA A AAA ba Ab a À medida que fazemos qualquer derivação nesta gramática, o número total de variáveis As e terminais as que conseguimos é sempre par. Quando temos somente S, temos zero As, e portanto um número par. Derivando S AA, passamos a ter dois As, e portanto, um número par. A derivação A AAA remove um A existente e coloca mais três. Logo, somam-se dois As quando fazemos isso e se o número de As era par, ele continua par. A mesma propriedade se mantém para A ba e A Ab, pois o valor total é o mesmo. E por fim, A a somente troca a variável A pelo terminal a, mantendo o número par do total de variáveis A e terminais a. Logo após a primeira derivação, a única variável que podemos encontrar é A, portanto, só precisamos levar em conta ela ao analizar as derivações possíveis. Qualquer A pode gerar qualquer quantidade de bs à sua esquerda ou direita de modo recursivo. Mas a recursão só encerra quando o A gera um a por meio de A a. Portanto, 15
confirmamos a propriedade de que esta gramática sempre gerará uma quantidade par de as. E que podemos ter qualquer quantidade e bs intercalando os as. Resta demonstrar que o número de as não pode ser nulo. Para que isso ocorrêsse, precisaríamos ter uma derivação na qual não geramos nenhum A. Mas isso é impossível, pois a única derivação inicial possível é S AA. Portanto, encerramos a demonstração de tais propriedades das palavras geradas por essa gramática. Exercício 41 - Prove que a gramática abaixo gera a lingüagem {a n b m c m d 2n n 0,m > 0}. S asdd A A bac bc Primeiro demonstraremos que quando todos os símbolos aparecem em uma palavra, eles sempre aparecem na ordem especificada. A derivação S asdd é a única na qual a variável inicial aparece à direita. Portanto, isso garante que quando temos todos os símbolos, os as aparecem primeiro e os ds por último. Como S A e A bac e A bc, não existindo outras derivações de A, garantimos que entre os as e os ds sempre encontramos um ou mais bs e cs nesta ordem. Verifica-se que geramos sempre o dobro de ds que de as pela derivação S asdd, a única que gera tais terminais. Verifica-se que temos sempre um número igüal de bs e cs pela derivação A bac e A bc, as únicas que geram tais terminais. Portanto, para cada b gerado, sempre geramos um c e vice-versa. Podemos ter um número nulo de as e ds. Basta optarmos como derivação inicial S A. Fazendo isso, acabamos com as variáveis S e isso faz com que nenhum a ou d possa ser derivado. Entretanto, sempre temos ao menos um b e c. Para que a recursividade das derivações se encerrem, é preciso que em algum momento façamos S A, pois é a única forma de encerrar a recursão de S. Uma vez tendo derivado A, a única derivação não-recursiva possível é A bc. Não há outra. Portanto, sempre teremos ao menos um b e c. Demonstramos assim todas as propriedades pedidas da lingüagem gerada pela gramática. Exercício 42 - Seja G a gramática abaixo, prove que L(G) = {a n b m 0 n < m}. S asb B B bb b Todo B gera um ou mais bs, não sendo capaz de gerar outros terminais. Isso ocorre por que todo B é derivado como B bb, que pode gerar potencialmente infinitos bs graças à recursão ou é derivado como B b, que gera um b e é também a única opção de encerrar a recursão da primeira derivação. Como S asb, temos que as palavras geradas pela lingüagem podem sempre começar com as e terminar com bs. A outra derivação possível para S é S B, que é uma derivação obrigatória para toda palavra, pois é a única forma de encerrar a recursão de S. Quando ela é usada, ou não temos qualquer terminal gerado, ou temos um número igüal de as e bs, com os bs depois dos as. Como B pode gerar qualquer número positivo de bs (é equivalente à b +, temos que quando finalmente usamos S B, que o número de bs será sempre maior que o de as, pois B gerará 16
no mínimo um b quando tínhamos um número igüal dos dois símbolos. E depois disso nenhum a poderá ser gerado. Por fim, o número de as pode ser nulo, bastando aplicar como derivação inicial S B. Mas o número de bs nunca é nulo, pois é obrigatório derivarmos um B para qualquer palavra e isso sempre nos trás ao menos um b. Exercício 43 - Seja G a gramática S asaa B B bbbdd C C bd. a) O que é L(G)? L(G) = {a n b m d m a 2n n 0,m > 0,m é ímpar} b) Prove. A ordem dos símbolos é garantida, pois a única forma de gerar as é por meio de S asaa, o que faz com que se existirem as, eles sempre estarão no começo e no fim. Por sua vez, a única outra derivação possível de S é S B, e B só pode gerar bs e ds nesta ordem por meio de B bbbdd e B C bd. Podem existir zero ou mais as. Nenhum a é derivado se a derivação inicial for S B. O número de as no fim é sempre o dobro do número do começo. Isso é válido quando não temos as, que é o caso inicial (0 = 0 2), e permanece válido para toda derivação S asaa, que faz com que para cada a derivado no começo, derivemos o dobro no fim. O menor número possível de bs e ds é um, pois a única derivação que não gera variáveis, somente terminais é C bd. O que significa que obrigadoriamente um de cada um destes terminais deve ser gerado. A menor palavra gerada então, é obtida por meio de S B C bd. O número de bs e ds é sempre igüal, pois as únicas derivações que os geram é B bbbdd e C bd. As duas geram sempre o mesmo número de bs e ds. Por fim, este número é sempre ímpar, pois uma vez que derivamos um único B (o que sempre ocorre em toda palavra), teremos sempre um número par de bs e ds enqüanto usamos a derivação B bbbdd recursivamente. Mas uma vez que formos encerrar a recursão, acabaremos usando B C bd, adicionando um de cada símbolo. Como até este ponto tínhamos um número par de cada um dos símbolos, quando enfim adicionamos mais um, passamos a ter uma quantidade ímpar. Exercício 44 - Seja G a gramática S asbs as λ. Prove que todo prefixo de um palavra em L(G) tem ao menos tantos as como bs. Isso equivale a demonstrar que o número de as nunca será menor que o de bs. A derivação S asbs gera o mesmo número de as e bs. A derivação S as gera um número maior de as que de bs. E a derivação S λ não altera o número de as e bs. Portanto, nunca teremos menos as que bs. 17
Exercício 45 - Usando a definição de Pascal do Apêndice III do livro, construa uma derivação de xly à partir de < variavel >. < variavel > < variavel inteira > < identificador variavel > < identificador > < letra > {< letra ou digito >} < letra >< letra > {< letra ou digito >} < letra >< letra >< letra > x < letra >< letra > xl < letra > xly Exercício 46 - Usando a definição de Pascal do Apêndice III do livro, construa uma derivação de (xly) à partir de < expressao >. < expressao > < expressao simples > < termo > < fator > (< expressao >) (< termo >) (< fator >) (< variavel >) (< variavel inteira >) (< identificador variavel) > (< identificador >) (< letra > {< letra ou digito >}) (< letra >< letra > {< letra ou digito >}) (< letra >< letra >< letra >) (x < letra >< letra >) (xl < letra >) (xly) Exercício 47 - Usando a definição de Pascal do Apêndice III do livro, construa uma derivação de (x y 5) à partir de < expressao >. < expressao > < expressao simples > < termo > 18
< fator > (< expressao >) (< expressao simples >) (< termo >) (< termo >< operador multiplicacao >< fator >) (< termo >< operador multiplicacao >< fator >< operador multiplicacao >< fator >) (< fator >< operador multiplicacao >< fator >< operador multiplicacao >< fator >) (< fator > < fator >< operador multiplicacao >< fator >) (< fator > < fator > < fator >) (< variavel > < fator > < fator >) (< variavel > < variavel > < fator >) (< variavel > < variavel > < unsigned constant >) (< variavel inteira > < variavel > < unsigned constant >) (< identificador variavel > < variavel > < unsigned constant >) (< identificador > < variavel > < unsigned constant >) (< letra > < variavel > < unsigned constant >) (x < variavel > < unsigned constant >) (x < variavel inteira > < unsigned constant >) (x < identificador variavel > < unsigned constant >) (x < identificador > < unsigned constant >) (x < letra > < unsigned constant >) (x y < unsigned number >) (x y < unsigned number >) (x y < unsigned integer >) (x y < digito >) (x y 5) Exercício 48 - Usando a definição de Pascal do Apêndice III do livro, construa uma derivação de (x+y (12+z)) à partir de < expressao >. < expressao > < expressao simples > < termo > < fator > (< expressao >) (< expressao simples >) (< expressao simples >< operador soma >< termo >) (< termo >< operador soma >< termo >) (< fator >< operador soma >< termo >) (< variavel >< operador soma >< termo >) (< variavel inteira >< operador soma >< termo >) (< identificador variavel >< operador soma >< termo >) (< identificador >< operador soma >< termo >) 19
(< letra >< operador soma >< termo >) (x < operador soma >< termo >) (x+ < termo >) (x+ < termo >< operador multiplicacao >< fator >) (x+ < fator >< operador multiplicacao >< fator >) (x+ < variavel >< operador multiplicacao >< fator >) (x+ < variavel inteira >< operador multiplicacao >< fator >) (x+ < identificador variavel >< operador multiplicacao >< fator >) (x+ < identificador >< operador multiplicacao >< fator >) (x+ < letra >< operador multiplicacao >< fator >) (x+y < operador multiplicacao >< fator >) (x+y < fator >) (x+y (< expressao >)) (x+y (< expressao simples >)) (x+y (< expressao simples >< operador soma >< termo >)) (x+y (< termo >< operador soma >< termo >)) (x+y (< fator >< operador soma >< termo >)) (x+y (< unsigned constant >< operador soma >< termo >)) (x+y (< unsigned constant >< operador soma >< termo >)) (x+y (< unsigned number >< operador soma >< termo >)) (x+y (< unsigned integer >< operador soma >< termo >)) (x+y (< digito >< digitos >< operador soma >< termo >)) (x+y (< digito >< digito >< operador soma >< termo >)) (x+y (1 < digito >< operador soma >< termo >)) (x+y (12 < operador soma >< termo >)) (x+y (12+ < termo >)) (x+y (12+ < fator >)) (x+y (12+ < variavel >)) (x+y (12+ < variavel inteira >)) (x+y (12+ < identificador >)) (x+y (12+ < letra >)) (x+y (12+z)) Exercício 49 - Seja G 1 e G 2 as seguintes gramáticas: G 1 : S aabb A aa a B bb b G 2 : S A A B B A A A a B B B b a) Para cada variável X, mostre que o lado direito de cada regra de G 1 é derivável de sua variável correspondente X usando as regras de G 2. Use isso para concluir que L(G 1 ) L(G 2 ). 20
Pela definição b é derivável de B. A outra derivação de B é B bb. Mas bb pode ser derivável de B fazendo B B B bb. Como para a outra derivação de B, já demonstramos ser equivalente à uma derivação de B, temos então que bb é equivalente à bb. Portanto, tudo que pode ser derivado de B, pode ser derivado de B. O mesmo raciocínio demonstra que A e A são equivalentes. Portanto, S A A B B é equivalente à S AABB. Basta continuar derivando AABB aabb aabb, que verificamos que a última regra que faltava analizar das duas gramáticas são equivalentes. Sendo assim, L(G 1 ) = L(G 2 ), e portanto, L(G 1 ) L(G 2 ). b) Prove que L(G 1 ) = L(G 2 ). Vide resposta anterior. Exercício 50 - Uma gramática linear direita é uma gramática livre de contexto cujas regras tem uma das seguintes formas: 1. A w 2. A wb 3. A λ, onde w Σ. Prove que uma lingüagem L é gerada por uma gramática linear direita se, e somente se, L é gerada por uma gramática regular. Se w = 0, o primeiro tipo de regra vira igüal ao terceiro e ambos são regras de gramáticas regulares. Já a regra A B pode ser substituída por A x, para todo x tal que B x. Portanto, se as outras regras forem compatíveis com a de uma gramática regular, esta regra também será. Se w = 1, então não há diferença alguma entre a regra de uma gramática linear direita e uma gramática livre de contexto. Se w > 1, assumindo que para w = aw,a Σ,w Σ e que as regras do tipo A w, A w B temos algo equivalente às regras de uma gramática regular, podeos escrever A w e A wb de modo que também seja equivalente à uma gramática regular. Para A w, basta reescrever como A w A e A a. Para A wb, basta reescrever como A w B, B ab. Com isso, demonstramos que toda gramática linear direita pode ser reduzida à uma gramática regular. Temos também que toda gramática regular é também uma gramática linear direita. Com isso, demonstramos que os dois tipos de gramática são equivalentes. Exercício 51 - Tente construir uma gramática regular que gere a lingüagem {a n b n n 0}. Explique por que nenhuma das suas tentativas foi bem-sucedida. Nem vou tentar. Essa não é uma lingüagem regular. É preciso memorizar de alguma forma o número de as escrito para poder escrever a quantidade de bs. Isso não é possível com gramáticas regulares, pois não há como memorizar isso de forma alguma. Exercício 52 - Tente construir uma gramática livre de contexto que gere a lingüagem {a n b n c n n 0}. Explique por que nenhuma das suas tentativas foi bem-sucedida. Nem vou tentar. Não é possível, pois tendo somente um símbolo do lado esquerdo de uma regra, não é possível garantir uma quantia igüal de três símbolos diferentes em uma lingüagem. A lingüagem especificada não é livre de contexto. 21