folha 10 - Departamento de Ciência de Computadores

Propaganda
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
Download