Departamento de Ciência de Computadores FCUP Modelos de Computação CC1004 2014/2015 Folha Prática 10 Uma gramática independente de contexto (GIC) é um quarteto G = (V, Σ, P, S), onde V e Σ são conjuntos de sı́mbolos, tais que V ∩ Σ = ∅, sendo ambos finitos e não vazios, S ∈ V , e P é um conjunto finito de regras da forma X → w com X ∈ V e w ∈ (V ∪ Σ)? . De facto, P é definido como uma relação binária de V em (V ∪ Σ)? , constituı́da pelos pares (X, w) referidos. É usada a seguinte terminologia: • V é o conjunto das variáveis ou sı́mbolos não terminais; • S é o sı́mbolo inicial; • Σ é o alfabeto ou conjunto dos sı́mbolos terminais; • P é o conjunto de produções ou regras (ou regras de produção) e escreve-se X → w se (X, w) ∈ P . Podemos referir as regras que definem X como X-produções, para X ∈ V . Por vezes, usamos X → w1 | w2 | . . . | wk para representar um conjunto de X-produções de forma abreviada. Neste caso, teriamos as regras X → wi , com 1 ≤ i ≤ k. Sendo x e y sequências de (V ∪ Σ)? tais que x tem pelo menos um sı́mbolo não terminal, diz-se que y se pode derivar de x por aplicação de uma regra X → w de G se e só se x = x1 Xx2 e y = x1 wx2 , com X ∈ V e x1 , w, x2 ∈ (V ∪ Σ)? . Numa derivação, a aplicação da regra X → w para substituição de X em x1 Xx2 , substitui essa ocorrência de X por w independentemente do contexto em que X está. É por essa razão que a gramática se diz independente de contexto. Escrevemos: • x ⇒G y se se derivar y de x por aplicação de alguma regra de G (derivação num passo); • x ⇒nG y se se derivar y de x por aplicação de n regras de G, não necessariamente distintas (derivação em n passos); • x ⇒?G y se se derivar y de x por aplicação de um número finito de regras de G, possivelmente zero (derivação em zero ou mais passos). A derivação num passo ⇒G pode ser definida como uma relação binária em (V ∪ Σ)? , sendo ⇒?G o seu fecho reflexivo e transitivo, e ⇒nG a relação obtida por composição de ⇒G com si própria, n vezes. Mais n−1 formalmente, (⇒1G ) = (⇒G ) e (⇒nG ) = (⇒n−1 G ⇒G ) = (⇒G ⇒G ), para n ≥ 2. Se estivermos a considerar apenas uma gramática, podemos omitir G em ⇒G , ⇒nG , e ⇒?G . Num passo de derivação, podemos substituir uma qualquer variável (desde que tal nos permita obter a palavra pretendida, no fim da derivação). Uma derivação pela esquerda é uma derivação em que a variável que se substitui em cada passo é sempre a que estiver mais à esquerda. Uma derivação pela direita é uma derivação em que a variável que se substitui em cada passo é sempre a que estiver mais à direita. Numa derivação podemos optar por não seguir nenhum desses dois critérios. A linguagem gerada pela gramática G é o conjunto das palavras de Σ? que se podem derivar num número finito de passos a partir do sı́mbolo inicial de G. Denota-se por L(G), e sendo S o sı́mbolo inicial, tem-se: L(G) = {x | x ∈ Σ? , S ⇒?G x}. Uma linguagem é independente de contexto (LIC) é, por definição, qualquer linguagem que possa ser gerada por uma gramática independente de contexto. 1 A derivação de uma palavra pode ser representada esquematicamente por uma árvore de derivação (ou árvore sintática) que é uma árvore orientada, com raı́z S, em que os descendentes diretos de um nó interno X correspondem ao lado direito da regra aplicada para substituição desse X na derivação. Assim, se a regra aplicada para substituir esse X for X → β1 β2 . . . βm , com βi ∈ V ∪ Σ ∪ {ε}, para 1 ≤ i ≤ m, o nó X será ligado aos m novos nós, criados para β1 , β2 , . . . , βm , ficando os ramos ordenados. O ramo de X para β1 será o filho de X mais à esquerda e o ramo de X para βm será o filho de X mais à direita. Cada folha da árvore contém um sı́mbolo terminal ou ε. A palavra que deu origem a essa árvore de derivação é dada pela concatenação das folhas da árvore. Uma gramática independente de contexto é ambı́gua se existir alguma palavra x ∈ L(G) que admita mais do que uma derivação pela esquerda (ou, equivalentemente, que admita mais do que uma derivação pela direita) em G. É conhecido que cada derivação pela esquerda (ou pela direita) determina uma e uma só árvore de derivação, e vice-versa. Assim, uma gramática G é ambı́gua se existir alguma palavra x ∈ L(G) que admita duas ou mais árvores de derivação em G. Uma linguagem independente de contexto é (inerentemente) ambı́gua se todas as gramáticas independentes de contexto que a geram são ambı́guas. Existem linguagens independentes de contexto que são ambı́guas mas está fora do âmbito da disciplina provar que uma linguagem é ambı́gua. No entanto, sempre que for simples perceber que uma linguagem não é ambı́gua, faremos um esforço por a definir por uma gramática não ambı́gua. Exemplo Considere a gramática G = ({E, N }, {0, 1, +}, P, E), onde P é constituı́do pelas regras E → E+E | 0 | 1N N → 1N | 0N | ε A palavra 11+0+1 pertence a L(G), como mostra a seguinte derivação pela esquerda: E ⇒G E+E ⇒G E+E+E ⇒G 1N +E+E ⇒G 11N +E+E ⇒G 11ε+E+E ⇒G 11+0+E ⇒G 11+0+1N ⇒G 11+0+1ε A gramática é ambı́gua. Por exemplo, para a mesma palavra, existe uma outra derivação pela esquerda: E ⇒G E+E ⇒G 1N +E ⇒G 11N +E ⇒G 11ε+E ⇒G 11+E+E ⇒G 11+0+E ⇒G 11+0+1N ⇒G 11+0+1ε As árvores de derivação correspondentes a estas derivações são: pp E MMM E 1 1 N p ppp xppp E <<< << + E 0 + MMM MMM & 1 E E N 1 ε 1 N N N ε E NNN NNN NNN & + E< E 0 << << + E == 1 == = N ε ε As palavras de L(G) representam números em binário sem 0’s não significativos ou somas de números desse tipo, sendo L(G) = ({0} ∪ {1}{0, 1}? )({+0} ∪ {+1}{0, 1}? )? . A ambiguidade de G resulta da regra E → E+E. Se a substituirmos convenientemente, podemos obter uma gramática não ambı́gua equivalente (i.e., que gera a mesma linguagem). Por exemplo, a gramática G1 = ({E, N }, {0, 1, +}, P1 , E), onde P1 é constituı́do pelas regras: E → N +E | 0 | 1N N → 1N | 0N | ε Assim, L(G) = L(G1 ) não é uma linguagem ambı́gua. 2 Exercı́cios 1. Para cada uma das linguagens indicadas, defina uma gramática independente de contexto que a gere (poderá ser uma gramática ambı́gua). As sete primeiras são linguagens de alfabeto {0, 1} e as restantes de alfabeto {a, b, c}. Justifique sucintamente a correção da gramática que escreveu. a) {0n | n ≥ 0}{12n | n ≥ 1} b) {0n 12n | n ≤ 2} c) {0n 12n | n ≥ 2} d) {0n 1m | m ≥ n ≥ 0} e) {0n 1m | m ≥ n ≥ 0}? f) L(00? 11 + (0 + 101)? 1) g) {wtwR | w ∈ {0, 1}? , t ∈ {0, 1, ε}} h) {palavras que terminam em abc ou têm exatamente dois a’s} i) L(a? abbb? ) j) {an ban | n > 1} k) {ai bi+j cj | i ≥ 0, j ≥ 0} l) {ai bj ak ci | i, j, k ∈ N e k > 0 se j > 0} m) ({c}{c}? {a2n bn | n ≥ 1})? {c}{c}? n) {palavras cujo número de a’s é primo e não excede seis} o) {palavras que não terminam em c se tiverem dois b’s consecutivos} 2. Seja L a linguagem das expressões regulares sobre Σ = {a, b}, a qual pode ser definida indutivamente, como uma linguagem de alfabeto {), (, +, ? , ε , ∅} ∪ Σ, por: • ε ∈ L, a ∈ L, b ∈ L, ∅ ∈ L • (r? ) ∈ L, (rs) ∈ L, e (r+s) ∈ L, quaisquer que sejam r, s ∈ L. Para não confundir a palavra vazia com expressão ε, usámos ε como sı́mbolo em vez de ε. Determine uma gramática independente de contexto (não ambı́gua) que gere L. Apresente as árvores de derivação das palavras (((a+b)? ) + (∅ ε )) e (((aa) + (((a+b)? ) + (∅ ε )))? ). 3. Seja L a linguagem de alfabeto Σ = {f, x, (, ), ,} definida indutivamente por: (i) a palavra x pertence a L; (ii) quaisquer que sejam α, β ∈ L, a palavra f(α,β) pertence a L. Indique uma gramática independente de contexto (não ambı́gua) que gere L. 4. Mostre que a linguagem {0n 12n | n ≥ 0} ∪ {0}? não é regular mas é independente de contexto. 3 5. Considere a gramática G = ({S, A, B}, {a, b, c}, P, S), em que P é dado por: S → ASA | B B → BA | c A → a | b a) Determine as palavras w ∈ {S, A, B, a, b, c}? que se podem derivar a partir de S em n passos sem usar A-produções, para 1 ≤ n ≤ 3, considerando: (i) (ii) (iii) qualquer tipo de derivação (sem substituir a variável A); apenas derivações pela esquerda (passando à frente a variável A); apenas derivações pela direita (passando à frente a variável A) Que sequências de terminais são geradas a partir dessas sequências se se continuar as derivações, aplicando apenas A-produções? b) Justifique que a palavra aacbabbb pertence a L(G), dando exemplo de (i) uma derivação pela esquerda, (ii) uma derivação pela direita e (iii) uma derivação que não seja nem pela esquerda nem pela direita, para essa palavra. Para cada uma dessas derivações, apresente a árvore de derivação correspondente. c) Justifique que as sequências que se derivam de S em n passos, pela esquerda, sem usar B-produções nem A-produções, são da forma An SAn ou An−1 BAn−1 , para n ≥ 1. d) Justifique que as sequências que se derivam de B em m passos, pela esquerda e sem usar A-produções, são da forma BAm ou cAm−1 , para m ≥ 1. Tendo em conta a forma das A-produções, conclua que {x | x ∈ {a, b, c}? e B ⇒?G x} = {c}{a, b}? . e) Justifique que L(G) = {xcy | x, y ∈ {a, b}? e 0 ≤ |x| ≤ |y|}, ou seja, L(G) é o conjunto das palavras de {a, b, c}? que têm um único c e em que o número total de a’s e b’s à esquerda do c é menor o igual ao numero total de a’s e b’s à sua direita. f) Justifique que qualquer sequência da forma An cAm+n , com m ≥ 0 e n ≥ 0 admite uma única derivação pela esquerda. Considerando a forma das A-produções, conclua que qualquer palavra da linguagem L(G) só tem uma árvore de derivação e, consequentemente, G não é ambı́gua. g) Partindo da definição da linguagem, determine um autómato de pilha que reconheça a linguagem {xcy | x, y ∈ {a, b}? e 0 ≤ |x| ≤ |y|}, com aceitação por pilha vazia. Indique a interpretação que cada estado tem para que se possa aferir a correção do autómato. 6. Seja G = ({S}, {a, b, c}, {S → aaS, S → ccS, S → bSaa, S → b}, S) uma gramática independente de contexto. Denote por V e Σ os conjuntos de variáveis e terminais de G, respetivamente. a) Justifique que {aab, aaccbbaa, aabccaabbaaaa, aabccbaabaaaa, aaccccaaccbaabaa} ⊂ L(G). b) Determine árvores de derivação para aaccbbaa e aabccbaabaaaa. c) Justifique que abaac ∈ / L(G) e aaccbaa ∈ / L(G). d) Qual a forma geral das palavras w ∈ (V ∪ Σ)? que podem ser derivadas a partir de S e (i) têm um e um só b? (ii) têm exatamente dois b’s? (iii) têm exatamente n b’s, para um n ∈ N qualquer (fixo)? e) Descreva informalmente a linguagem gerada pela gramática. f) Justifique que a linguagem L(G) é independente de contexto mas não é regular. g) Partindo da descrição que apresentou em 6e), defina um autómato de pilha que reconheça L(G). h) Averigue se a gramática G é ambı́gua. 4