Académique Documents
Professionnel Documents
Culture Documents
=
=
0
*
i
i
L L
e o fecho positivo da linguagem L, denotado por L
+
, o conjunto:
=
+
=
1 i
i
L L
Em outras palavras, L
*
denota as cadeias construdas pela concatenao de qualquer
nmero de cadeias tomadas de L. O conjunto L
+
semelhante, mas neste caso, as
cadeias de zero palavras, cuja concatenao definida como c, so excludas. Note-se,
porm que L
+
contm c se e somente se L a contm. Esta definio difere da definio
do fechamento de alfabetos, onde A
+
era definido como A
*
- {c}. Note-se que no caso de
linguagens podem ocorrer dois casos:
a) Se ceL, ento L
+
= L
*
b) Se ceL, ento L
+
= L
*
- {c}
Exemplo 1:
Se L
1
= {10,1} e L
2
= {0011,11}. Ento L
1
L
2
= {100011,1011,10011,111}
Exemplo 2:
Se L
1
= {10,11} e L
2
= {0011,11}. Ento L
1
L
2
= {100011,1011,110011,1111}
2.3 Expresses Regulares
Uma expresso regular (ER) sobre um alfabeto E indutivamente definida como se
segue:
a) C uma ER que denota a linguagem vazia.
b) c uma ER que denota a linguagem contendo exclusivamente a cadeia vazia, ou seja
{c}.
c) Qualquer smbolo x pertencente ao alfabeto E uma ER e denota a linguagem
contendo a cadeia unitria x, ou seja {x}.
d) Se r e s so ERs e denotam respectivamente as linguagens R e S, respectivamente,
ento:
i) (r+s) ER e denota a linguagem R S
ii) (rs) ER e denota a linguagem {uv | ue R e v e S}
iii) (r*) ER e denota a linguagem R*
19
Observaes:
1. Os parnteses podem ser omitidos, respeitando-se as seguintes prioridades de
operaes:
- A concatenao sucessiva tem precedncia sobre a concatenao e a unio, e
- A concatenao tem precedncia sobre a unio.
2. Uma linguagem gerada por um expresso regular r representada por L(r) ou
GERA(r).
Exemplos:
Expresso Regular Linguagem Representada
aa Somente a cadeia aa.
ba* Todas as cadeias que iniciam por b, seguido de zero ou mais a.
(a+b)* Todas as cadeias sobre o alfabeto {a, b}
(a+b)*aa(a+b)* Todas as cadeias contendo aa como subpalavra.
a*ba*ba* Todas as cadeias contendo exatamente dois b
(a+b)*(aa+bb) Todas as cadeias que terminam com aa ou bb.
(a+c)(b+ba)* Todas as cadeias que no possuem dois a consecutivos
0*1*2* Todas as cadeias de 0 seguidas de 1s seguidas d 2s
Exerccios:
Desenvolva expresses regulares que gerem as seguintes linguagens sobre E = {a, b}:
1. {w | w tem no mximo um par de a como subcadeia e no mximo um par de b
como subcadeia}.
2. {w | qualquer par de a antecede qualquer par de b}
3. {w | w no possui aba como subpalavra}
2.4 Equivalncia entre AFs e ERs
Pode-se facilmente construir um AF com c-transies a partir de qualquer expresso
regular. O mtodo deve ser aplicado para a base (casos (a), (b) e (c)) e indutivamente
para cada tipo de construo das ERs.
a) Para expresso C, construa o seguinte AF:
b)
e
f
e
0
c) Para ER c, construa o seguinte AF:
d)
e
f
c) Para ER a (para algum aeE), construa o seguinte AF:
d)
e
f
e
0
a
d) Para ER (A + B), construa a seguinte estrutura:
20
d
2
e
2
d
1
e
1
e
f
e
0
A
B
c
c
c
c
onde e
1
e d
1
so, respectivamente, os estados inicial e final da ER A, e e
2
e d
2
so, respectivamente, os estados inicial e final da ER B.
e) Para ER AB, construa a seguinte estrutura:
d
2
d
1
A
B
c
e
1 e
2
onde e
1
e d
1
so, respectivamente, os estados inicial e final da ER A, e e
2
e d
2
so,respectivamente, os estados inicial e final da ER B.
f) Para ER A*, construa a seguinte estrutura:
e
2
e
1
d
2
e
0
A
c
c
c
c
onde e
1
e e
2
so, respectivamente, os estados inicial e final da ER A.
2.5 Transformao de GR em AF
Para transformar uma gramtica regular G = (N, T, P, S) em um autmato finito
M=(E,A,t,e
0
,F), proceda como segue:
Algoritmo: Transformao de GR em AF
Entrada: Uma Gramtica Regular G = (N, T, P, S)
Sada: Um Autmato Finito M=(E, A, t, e
0
, F)
E:= N {e
novo
, S}, onde e
novo
um smbolo que no pertence a N;
A := T;
e
0
:= S;
se S ::= c e P ento
F := { e
novo
, S}
seno
F := { e
novo
};
21
fimSe;
Construa t de acordo com as seguintes regras:
a) Para cada produo da forma B::=aeP c/ ae{T{c}}, crie uma transio
t(B,a) = e
novo
;
b) Para cada produo da forma B::=aC e P, crie uma transio t(B,a) = C;
c) Para todo ae T, deixe t(e
novo
,a) indefinida (ou use o estado ERRO).
2.6 Transformao de AF em GR
Para transformar um AF em uma gramtica regular equivalente, proceda como segue:
Algoritmo: Transformao de AF em GR
Entrada: Um Autmato Finito M=(E, A, t, e
0
, F)
Sada: Uma Gramtica Regular G = (N, T, P, S)
N := E;
T := A;
S := e
0
;
Defina P de acordo com as seguintes regras:
a) Se t(B, a) = C ento adicione B::=aC em P;
b) Se t(B, a) = C e CeF, ento adicione B::=a em P;
c) Se e
0
eF, ento adicione S::= c em P.
2.7 Determinizao de AFND
Por definio, todo AFD um caso especial de AFND no qual a relao de transio
uma funo. Assim, a classe de linguagens reconhecidas por um AFND inclui as
linguagens regulares (aquelas que so reconhecidas por AFDs). Entretanto, pode-se
provar que as linguagens regulares so as nicas linguagens reconhecidas por um
AFND. Para isto, basta mostrar que para qualquer AFND pode-se construir um AFD
que reconhece a mesma linguagem. Um mtodo de transformao dado a seguir.
Algoritmo: Determinizao de Autmato Finito
Entrada: Um AFND MN = (E, A, t, e
0
, F)
Sada: Um AFD MD = (E, A, t, e
0
, F)
1. Rotule a primeira linha da tabela de transies t para MD com um conjunto unitrio
contendo apenas o estado inicial e
0
de MN. Aplique o passo (2) a este conjunto.
2. Dado um conjunto de estados S, rotulando uma linha da tabela t para MD, para a
qual as transies ainda no foram computadas, encontre os estados de MN que podem
ser alcanados a partir dos estados contidos em S para cada smbolo de entrada; coloque
estes estados na coluna correspondente ao smbolo de entrada na tabela para MD.
3. Para cada novo conjunto gerado pelas transies do passo (2), determine se ele j
usado como rtulo para alguma linha de MD. Se o conjunto ainda no foi usado, ento
crie uma nova linha com o conjunto como rtulo. Se o conjunto j foi usado, no
necessrio fazer nada com ele.
22
4. Se existe alguma linha em MD para a qual as transies no forma computadas, volte
e aplique o passo (2) quela linha. Se todas as transies j forma computadas, v pra o
passo (5).
5. Para todas as linhas de MD rotuladas com conjuntos que contenham pelo menos um
estado final de MN, marque esta linha como estado final de MD. Fim.
Exemplo: Construo de um AFD a partir do AFND M6.
Determinizar o AFND M6 = ({a,b}, {q
0
, q
1
, q
2
, q
f
}, t, q
0
, {q
f
}), dado na Figura 2-11 e
repetido a seguir.
q0 q2
qf
q1
a a
a,b
a
Tabela de t para o autmato M6 mostrado acima.
t a b
*
q
0
q
1
q
2
q
f
q
0
, q
1
q
2
q
f
-
q
0
-
-
-
Executando o algoritmo:
t' a b
q
0
q
01
q
01
q
01
, q
2
q
0
q
0
t' a b
q
0
q
01
q
012
q
01
q
012
q
012
, q
f
q
0
q
0
q
0
t' a b
q
0
q
01
q
012
q
012f
q
01
q
012
q
012f
q
012f
q
0
q
0
q
0
q
0
Adicionando os estados restantes e determinando os estados finais, tem-se a tabela do
autmato M6 determinizado (M6D):
23
t' a b
*
*
q
0
q
01
q
012
q
012f
q
1
q
2
q
f
q
01
q
012
q
012f
q
012f
q
2
q
f
-
q
0
q
0
q
0
q
0
-
-
-
O AFD M6D = ({a, b}, Q, t, q
0
, F), construdo conforme o algoritmo dado :
a a
b
a
q
012f
q
f
q
012
q
01
q
0
b
b
b
a
q
1
q
2
a a
onde:
Q = {q
0
, q
1
, q
2
, q
f
, q
01
, q
012
, q
012f
}
F = {q
f
, q
012f
}.
t = Exibida acima.
2.8 Equivalncia entre AFs com e sem c-transies
Para um autmato finito com c-transies (ou com movimento vazio) define-se o
c-fechamento de um estado e como o conjunto de estados alcanveis a partir de e
utilizando-se somente c-transies. Para o exemplo a seguir tem-se o seguinte:
0 1 2
c
e
0
e
0
C C
e
1
e
1
C
e
1
C
e
2
* e
2
C C
e
2
C
c-fecho(e
0
) = {e
0
, e
1
, e
2
}
c-fecho(e
1
) = {e
1
, e
2
}
c-fecho(e
2
) = {e
2
}
Seja M = (E, A, t, e
0
, F), um AF com c-transies, pode-se construir M = (E, A, t, e
0
,
F) sem as c-transies da seguinte maneira:
Algoritmo: Eliminao de c-transies
Entrada: Um AFND M = (E, A, t, e
0
, F)
Sada: Um AFND sem c-transies M = (E, A, t, e
0
, F)
1. F ser definido por F{e | eeE e c-fecho(e) contm um estado de F};
24
2. t deve conter todas as transies de t que no so c-transies e mais aquelas que
so obtidas pela composio de transies de t com as c-transies de t, da seguinte
maneira:
a) se (e
1
, a, e
2
)et e e
3
ec-fecho(e
2
) ento coloque (e
1
, a, e
3
)et;
a) se (e
1
, a, e
2
)et e e
1
ec-fecho(e
3
) ento coloque (e
3
, a, e
2
)et;
2.9 Minimizao de Autmatos Finitos
Diz-se que um AF mnimo se ele no possui estados inatingveis ou mortos e se no
existem estados equivalentes entre si. Se um AF no mnimo, ento um AF
equivalente com menos estados pode ser obtido pela eliminao dos estados inatingveis
e mortos e pela combinao dos estados equivalentes. Este processo de reduo pode ser
repetido at que um AF mnimo seja encontrado. Assim, todo AF tem um AF mnimo
correspondente.
Realizando estas redues por caminhos diferentes, ou iniciando com mquinas
equivalentes, mas diferentes, pode-se obter mquinas mnimas que paream ser
diferentes. Entretanto, estas mquinas sero, de fato, idnticas em tudo, com exceo
dos nomes usados para os estados.
Pode-se concluir que, exceto pelos nomes dos estados, existe apenas uma mquina
mnima para um dado problema de reconhecimento. Isto significa que no importa a
forma do AF inicialmente encontrado para reconhecer uma determinada linguagem e
no importa a forma com que as redues so feitas: existe apenas uma mquina
mnima que pode ser encontrada pra este problema.
2.9.1 Estados Inatingveis
Pode haver alguns estados no AF que nunca sero atingidos com nenhuma seqncia de
smbolos a partir do estado inicial.
Tais estados so chamados de estados inatingveis. As linhas que correspondem a
estados inatingveis podem ser simplesmente removidas da tabela de transio para
deixar a mquina com menos estados.
Algoritmo: Eliminao de Estados Inatingveis
Entrada: Um Autmato Finito M = (E, A, t, e
0
, F)
Sada: Um Autmato Finito sem estados Inatingveis M = (E, A, t, e
0
, F)
1. Inicialize o conjunto de estados atingveis E com o estado inicial e
0
.
2. Adicione, em E, para cada estado e, presente no conjunto E, todos os estados d que
podem ser alcanados por uma transio a partir de e, ou seja, todos os estados d tal
que t(e,x) = d para algum xeA.
3. Se nenhum novo estado pode ser adicionado ao conjunto E com o uso destas regras,
j foi obtido o conjunto de estados atingveis.
4. Coloque em t todas as transies t(x,y)=z tal que x,zeE e yeA. Coloque em F
todos os estados que pertencem simultaneamente a F e a E.
25
2.9.2 Estados Mortos
Um estado e de um AF morto se ele no final e se a partir dele no se pode atingir
nenhum estado final. Para eliminar os estados mortos de um AF M proceda como segue:
Algoritmo: Eliminao de Estados Mortos
Entrada: Um AF M = (E, A, t, e
0
, F)
Sada: Um AF sem estados mortos M = (E, A, t, e
0
, F)
1. Inicialize o conjunto de estados no-mortos E com os estados finais F de M.
2. Para cada estado e em E, adicione os estados de E que levam para e com uma
transio de t para algum smbolo de entrada. Ou seja, adicione em E o conjunto
{x| t(x,a) = e, eeE e aeA}
3. Repita o passo (2) at que mais nenhum estado possa ser adicionado ao conjunto E.
4. Coloque em t todas as transies t(x,y) = z tal que x, zeE e yeA. Se e
0
eE ento
faa e
0
= e
0
; caso contrrio, e
0
um novo smbolo de estado e a linguagem
reconhecida pelo autmato vazia, uma vez que o estado inicial morto.
2.9.3 Estados Equivalentes
Dois estados e e d so equivalentes se e somente se as duas condies seguintes forem
satisfeitas:
a) Condio de compatibilidade: os estados e e d devem ser ambos finais ou ambos
no-finais.
b) Condio de propagao: para qualquer smbolo de entrada, os estados e e d devem
levar a estados equivalentes.
As condies (a) e (b) podem ser incorporadas em um teste geral de equivalncia entre
estados. O mtodo chamado mtodo da separao, uma vez que seu objetivo separar,
ou particionar, o conjunto de estados em subconjuntos disjuntos, ou blocos, tal que
estados no-equivalentes fiquem em blocos separados. O mtodo ilustrado por sua
aplicao no AF da tabela seguinte:
t a b
e
1
e
6
e
3
e
2
e
7
e
3
e
3
e
1
e
5
e
4
e
4
e
6
* e
5
e
7
e
3
* e
6
e
4
e
1
* e
7
e
4
e
2
Os estados so inicialmente separados em dois blocos; um contendo os estados finais e
outro contendo os estados no-finais. Para o exemplo, a partio inicial L
0
dada pela
seguinte lista:
L
0
= [{e
1
, e
2
, e
3
, e
4
},{e
5
, e
6
, e
7
}]
j que e
1
, e
2
, e
3
e e
4
so estados no finais e e
5
, e
6
e e
7
so estados finais. Nenhum dos
estados no primeiro bloco equivalente a nenhum dos estados no segundo bloco,
porque tal para violaria a condio de compatibilidade.
26
Agora, observe o que acontece aos estados no bloco {e
1
, e
2
, e
3
, e
4
} com entrada a. Os
estados e
3
e e
4
vo para estados contidos no primeiro bloco (e
1
e e
4
respectivamente),
enquanto os estados e
1
e e
2
vo para estados no segundo bloco (e
6
e e
7
respectivamente).
Isto significa que para qualquer estado no conjunto {e
1
, e
2
} e qualquer estado em
{e
3
, e
4
} os estados seguintes correspondendo a entrada a no sero equivalentes. Isto
uma violao da condio de propagao, e assim se pode concluir que nenhum estado
em {e
1
, e
2
} ser equivalente a nenhum estado em {e
3
, e
4
}. Isto habilita a construo de
uma nova partio:
L
1
= [{e
1
, e
2
},{e
3
, e
4
},{e
5
, e
6
, e
7
}]
Com a propriedade de que estados tomados de blocos diferentes sero sempre no
equivalentes.
Agora se tentar encontrar um bloco em L
1
e uma entrada tal que o bloco possa ser
separado com respeito a entrada e uma nova partio seja assim obtida. Esta nova
partio tambm ter a propriedade de que os estados tomados de diferentes blocos
sero garantidamente no-equivalentes. Este processo deve ser repetido at que
nenhuma nova separao seja possvel. No exemplo, a continuao seria a seguinte:
Separando {e
3
, e
4
} de L
1
com respeito a a:
L
2
= [{e
1
, e
2
},{e
3
},{e
4
},{e
5
, e
6
, e
7
}]
Separando {e
5
, e
6
, e
7
} de L
2
com respeito a a (ou b):
L
3
= [{e
1
, e
2
},{e
3
},{e
4
},{e
5
},{e
6
, e
7
}]
A partio L
3
no pode ser mais separada. Para verificar isto, observe que todos os
estados no bloco {e
1
, e
2
} vo para estados no bloco{e
6
, e
7
} com entrada a, e para o
bloco {e
3
} com entrada b. Similarmente {e
6
, e
7
} vo para os blocos {e
4
} e {e
1
, e
2
} com
entrada a e b, respectivamente. Os outros blocos tm apenas um elemento, e assim no
podem mais ser separados.
Quando o procedimento termina, os estados dentro de um mesmo bloco so
equivalentes. No exemplo, os estados e
1
e e
2
so equivalentes e os estados e
6
e e
7
tambm so equivalentes.
Os blocos da partio final podem ser usados para construir uma nova mquina, a qual
equivalente original, porm sem possuir estados equivalentes. Para o exemplo a
mquina mnima resultante seria:
t a b t a b
{e
1
, e
2
} {e
6
, e
7
} {e
3
}
e
1
e
5
e
2
{e
3
} {e
1
, e
2
} {e
5
} e
2
e
1
e
4
{e
4
} {e
4
} {e
6
, e
7
} ou e
3
e
3
e
5
* {e
5
} {e
6
, e
7
} {e
3
} * e
4
e
5
e
2
* {e
6
, e
7
} {e
4
} {e
1
, e
2
} * e
5
e
3
e
1
ou em forma de diagrama de transio (com os estados renomeados):
27
e
1
a
e2
e5
b
a
b
e4
e3
a
b
a
a
b
b
O conjunto de estados da nova mquina o conjunto de blocos da partio final. As
transies para a nova mquina so obtidas a partir da antiga observando quais blocos
seguem quais para cada entrada. Assim, na tabela acima, a transio do estado {e
1
, e
2
}
com entrada a definida para o estado {e
6
, e
7
}, porque os estados contidos no primeiro
bloco vo para os estados do segundo bloco com entrada a. O estado inicial da nova
mquina simplesmente o bloco que contm o estado inicial da mquina original e os
estados finais so aqueles blocos que contm estados finais da mquina original.
Algoritmo: Eliminao de Estados Equivalentes
Entrada: Um Autmato finito M = (E, A, t, e
0
, F)
Sada: Um Autmato finito sem estados equivalentes M = (E, A, t, e
0
, F)
Crie uma lista de parties L
0
= [E F, F].
i :=0;
Repita:
L
i+1
:= [];
Para cada elemento p de L
i
faa:
Se | p | = 1 ento:
Coloque p em L
i+1
Seno
p' := C;
e := um estado qualquer de p;
coloque e em p;
para todo smbolo dep-{e} faa:
se d e e so equivalentes ento:
adicione d em p
fim se;
fim para;
coloque p em L
i+1
;
se p = p ento
coloque p p em L
i+1
fim se;
fim se;
fim para;
i := i + 1;
at L
i
= L
i+1
;
Crie um smbolo de estado e
j
para cada elemento p
j
da partio L
i
;
Coloque estes estados e
j
no conjunto E;
Para cada transio t(e, a) = d faa
Crie a transio t(e
j
, a) = e
l
onde ee p
j
e dep
l
, sendo e
l
smbolo de p
j
e e de p.
28
Fim para.
Coloque em F todos os estados e
j
de E originados a partir de algum p
j
tal que xep
j
e
xeF.
e
0
= e
j
, tal que e
j
se originou de p
j
e e
0
de p
j
.
2.9.4 Estado de Erro
Para no deixar transies indefinidas em M, pode-se substituir todas as indefinies
por um estado de erro ERRO e adicionar este estado tabela. Para cada smbolo de
entrada o estado ERRO tem transio para si prprio. O estado de erro no deve
jamais ser definido como estado final.
2.9.5 Autmato Finito Mnimo
Para encontrar um AF mnimo a partir de um AF qualquer preceda como segue:
Algoritmo: Minimizao de Autmato Finito
Entrada: um Autmato Finito M = (E, A, t, e
0
, F).
Sada: um AF mnimo M = (E, A, t, e
0
, F).
1. Elimine os estados inatingveis (ou inalcanveis);
2. Elimine os estados mortos;
3. Adicione o estado de erro;
4. Elimine os estados redundantes
1
3. Linguagens Livres de Contexto
A importncia das LLCs reside no fato de que praticamente todas as linguagens de
programao podem ser descritas por este formalismo, e que um conjunto bastante
significativo destas linguagens pode ser analisado por algoritmos muito eficientes. A
maioria das linguagens de programao pertence a um subconjunto das LLCs que pode
ser analisado por algoritmos que executam n.log(n) passos para cada smbolo da
sentena de entrada. Outro subconjunto, que corresponde s linguagens no ambguas
pode ser analisado em tempo n
2
. No pior caso, uma LLC ambgua pode ser analisada em
tempo n
3
. O que ainda bastante eficiente, se comparado s linguagens sensveis ao
contexto que pode requerer complexidade exponencial (2
n
), sendo, portanto,
computacionalmente intratveis, e as linguagens de tipo 0, que podem ser inclusive
indecidveis, isto , o algoritmo de anlise pode no parar nunca.
Relembrando, uma gramtica livre de contexto (GLC) denotada por G = (N, T, P, S),
onde N e T so conjuntos disjuntos de variveis e terminais, respectivamente, P um
conjunto finito de produes, cada uma da forma A ::= o, onde A uma varivel do
conjunto N e o uma cadeia de smbolos de (T N)
*
. Finalmente, S uma varivel
especial denominada smbolo inicial.
3.1 rvore de Derivao e Ambigidade
Muitas vezes til mostrar as derivaes de uma GLC atravs de rvores. Estas figuras,
chamadas rvores de derivao ou rvores sintticas, impem certas estruturas teis s
cadeias das linguagens geradas, principalmente as de programao.
Os vrtices de uma rvore de derivao so rotulados com terminais ou variveis, ou
mesmo com a cadeia vazia. Se um vrtice n rotulado com A, e os filhos de n so
rotulados com X
1
, X
2
,..., X
k
, da esquerda para a direita, ento A ::= X
1
X
2
...X
k
deve ser
uma produo. Considere, como exemplo, a gramtica:
E ::= E+E | E*E|(E)|id
Uma rvore de derivao para a sentena (id+id)*id gerada por esta gramtica poderia
ser:
E
E E
E
E
E E
id
*
id id
+
) (
2
Mais formalmente, seja G = (N, T, P, S) uma GLC. Ento uma rvore uma rvore de
derivao para G, se:
a) Cada vrtice tem um rtulo, que um smbolo de N T {c}.
b) O rtulo da raiz o smbolo S.
c) Os vrtices interiores so rotulados apenas com smbolos de N.
d) Se o vrtice n tem rtulo A, e os vrtices n
1
, n
2
,..., n
k
so filhos de n, da esquerda
para a direita, com rtulos X
1
, X
2
,..., X
k
, respectivamente, ento:
A ::= X
1
X
2
...X
k
deve ser uma produo em P.
e) Se o vrtice n tem rtulo c, ento n uma folha e c o nico filho de seu pai.
Exemplo
Considere a gramtica G = ({S, A}, {a, b}, P, S), onde P consiste de
S ::= aAS | a
A ::= SbA | SS | ba
A figura seguinte uma rvore de derivao para uma sentena desta gramtica, na qual
os nodos foram numerados para facilitar a explicao:
1
2
3 4
5 6 7 8
9 10 11
S
S A
A S
a
b a
a
b a
Os vrtices interiores so 1, 3, 4, 5 e 7. O vrtice 1 tem rtulo S, e seus filhos, da
esquerda para a direita tm rtulos a, A e S. Note que S ::= aAS uma produo. Da
mesma forma, o vrtice 3 tem rtulo A, e os rtulos de seus filhos so S, b e A, da
esquerda para a direita; A :: SbA tambm uma produo. Os vrtices 4 e 5 tm ambos
o rtulo S. O nico filho deles tem rtulo a; e S ::= a uma produo. Finalmente, o
vrtice 7 tem rtulo A, e seus filhos, da esquerda para a direita, tem rtulos b e a; e
A ::= ba tambm uma produo. Assim as condies para que esta rvore seja uma
rvore de derivao para G foram cumpridas.
Pode-se estender a ordem da esquerda para a direita dos filhos para produzir uma
ordem da esquerda para a direita de todas as folhas. No exemplo acima, o
caminhamento da esquerda para a direita nas folhas da rvore produziria a seguinte
seqncia: 2, 9, 6, 10, 11 e 8.
3
Pode-se ver que a rvore de derivao uma descrio natural para a derivao de uma
forma sentencial particular da gramtica G.
Uma sub-rvore de uma rvore de derivao composta por um vrtice particular da
rvore, juntamente com seus descendentes.
Se uma gramtica G tem mais de uma rvore de derivao para uma mesma cadeia,
ento G chamada de gramtica ambgua. Uma linguagem livre de contexto para a
qual toda gramtica livre de contexto ambgua denominada linguagem livre de
contexto inerentemente ambgua.
3.2 Derivao mais Esquerda e mais Direita
Se cada passo na produo de uma derivao aplicado na varivel mais esquerda,
ento a derivao chamada derivao mais esquerda. Similarmente, uma derivao
onde a cada passo a varivel direita substituda, chamada de derivao mais
direita.
Se w est em L(G), ento w tem ao menos uma rvore de derivao. Alm disso, em
relao a uma rvore de derivao particular, w tem uma nica derivao mais
esquerda e uma nica derivao mais direita.
Evidentemente, w pode ter vrias derivaes mais esquerda e vrias derivaes mais
direita, j que pode haver mais de uma rvore de derivao para w. Entretanto, fcil
mostrar que para cada rvore de derivao apenas uma derivao mais esquerda e
uma derivao mais direita pode ser obtida.
Exemplo:
derivao mais esquerda correspondendo
rvore do exemplo anterior
derivao mais direita
correspondente
S aAS
aSbAS
aabAS
aabbaS
aabbaa
S aAS
aAa
aSbAa
aSbbaa
aabbaa
3.3 Simplificaes de Gramticas Livres de Contexto
Existem vrias maneiras de restringir as produes de uma gramtica livre de contexto
sem reduzir seu poder expressivo. Se L uma linguagem livre de contexto no vazia,
ento L pode ser gerada por uma gramtica livre de contexto G com as seguintes
propriedades:
a) Cada varivel e cada terminal de G aparecem na derivao de alguma palavra de
L.
b) No h produes da forma A::=B, onde A e B so variveis.
c) Se c no est em L, ento no h necessidade de produes da forma A::=c.
4
No caso de (a) estes smbolos (variveis ou terminais) so conhecidos como smbolos
inteis (smbolos improdutivos e smbolos inalcanveis). Em (b) as produes A::=B
so conhecidas como produes unitrias. As produes da forma A::=c (item c) so
conhecidas como c-produes. Existem algoritmos que podem ser aplicados nos casos
(a), (b) e (c) que produzem uma nova gramtica equivalente gramtica original.
Veremos apenas o algoritmo para eliminar as c-produes.
3.3.1 Eliminao das c-produes
Conforme vimos uma GLC pode ter produes do tipo ::=c. Mas toda GLC pode ser
transformada em uma GLC equivalente sem estes tipos de produes (chamadas c-
produes), com exceo da produo S::=c (S o smbolo inicial), se esta existir.
Assim procedendo, possvel mostrar que toda GLC pode obedecer restrio das GSC
(tipo 1).
O mtodo de eliminao das c-produes consiste em determinar, para cada varivel A
em N, se A
*
c. Se isso ocorrer diz-se que a varivel A anulvel. Pode-se, assim,
substituir cada produo da forma B::=X
1
X
2
X
3
...X
n
por todas as produes formadas
pela retirada de uma ou mais variveis X
i
anulveis.
Exemplo:
Dada a gramtica
A ::= BCDe
B ::= c | e
C ::= c | a
D ::= b | cC
Neste caso as variveis anulveis so B e C, assim, a gramtica
pode ser transformada na seguinte gramtica:
A ::= BCDe | CDe | BDe | De
B ::= e
C ::= a
D ::= b | c | cC
Os no-terminais que derivam a cadeia c so chamados c-no-teminais. Um no-
terminal (varivel) A um c-no-terminal se existir uma derivao A
*
c em G. Note
que c est em L(G) se e somente se S um c-no-terminal. Se G no tem c-no-
terminal, ela dita c-livre.
Se G tem c-produes, ento em uma derivao sentencial da forma:
S o
1
o
2
... o
n
Os tamanhos das sentenas iro variar no-monotonicamente um em relao ao outro,
isto , ora aumentam, ora diminui. Entretanto, se G no tem c-produes, ento:
|S| s |o
1
| s |o
2
| s ... s |o
n
|
Isto , os tamanhos das sentenas so monotonicamente crescentes. Esta propriedade
til quando se quer testar se uma dada palavra ou no gerada por uma GLC.
Antes de apresentar um algoritmo para eliminar as c-produes, ser apresentado um
algoritmo para encontrar os c-no-terminais.
5
Algoritmo: Encontrar o Conjunto dos c-no-terminais
Entrada: Uma GLC G = (N, T, P, S)
Sada: O conjunto E de c-no-terminais
E := {A | AeN e A ::= c};
Repita
Q := {X | XeN e XeE e existe pelo menos uma produo da forma X ::= Y
1
Y
2
...Y
n
tal que Y
1
eE, Y
2
eE, ...,Y
n
eE};
E := EQ;
At Q = C;
Exemplo: Seja G a seguinte gramtica:
S ::= aS | SS | bA
A ::= BB
B ::= CC | ab | aAbC
C ::= c
Inicialmente temos E = {C} e se obtem:
B ::= CC | aAbC
C ::= c
Quando o lao executado pela primeira vez deixa Q = {B} e
A ::= BB
B ::= CC | ab | aAbC
C ::= c
obtendo E = {B, C}
Como Q no vazio, uma segunda iterao deixa Q = {A}
S ::= bA
A ::= BB
B ::= CC | ab | aAbC
C ::= c
obtendo E = {A, B, C}.
Mais uma vez, Q no-vazio, mas uma iterao subseqente no acrescenta novos
smbolos, assim o algoritmo termina. A, B e C so os nicos c-no-terminais em G.
Para eliminar os c-no-terminais de uma GLC, pode-se usar o seguinte algoritmo, que
elimina c-no-terminais sem introduzir novos. A estratgia baseada na seguinte idia.
Seja A um c-no-terminal em G. Ento ele dividido conceitualmente em dois no-
terminais A e A, tal que A gera todas as cadeias no vazias e A apenas gera c.
Agora, o lado direito de cada produo onde A aparece uma vez, por exemplo,
B::=oA|, trocado por duas produes B::=oA| e B::=oA|. J que A s gera c,
6
ele pode ser trocado por c, deixando B::=o|. Depois disso, pode-se usar A em lugar de
A. A produo final fica: B::=o| | B::=oA|, onde A no mais um c-no-terminal. Se
B::=oA|A, ento so obtidas as quatro combinaes possveis pelas trocas de A por c,
e assim por diante.
Algoritmo:Eliminao de todos os c-no-terminais
Entrada: Uma GLC G = (N, T, P, S)
Sada: Uma GLC G = (N, T, P, S) c-livre
Construa o conjunto E;
P := {p | peP e p no c-produo}
Repita
Se P tem uma produo da forma A::= oB|, tal que BeE, o|e(NT)
*
e o| = c,
ento inclua a produo A::= o| em P;
at que nenhuma nova produo possa ser adicionada a P;
se SeE ento
Adicione a P as produes S::=S | c
N := N {S};
seno
S := S;
N = N;
Fim-se;
3.3.2 Fatorao de GLC
Uma GLC est fatorada se ela determinstica, ou seja, se ela no possui produes
para um mesmo no terminal no lado esquerdo cujo lado direito inicie com a mesma
cadeia de smbolos ou com smbolos que derivam seqncias que iniciem com a mesma
cadeia de smbolos. De acordo com esta definio, a seguinte gramtica no
determinstica:
S ::= aSB | aSa
A ::= a
B ::= b
Fonte de no
determinismo.
Para fatorar uma GLC (retirar o no determinismo) deve-se alterar as produes
envolvidas no no determinismo da seguinte maneira:
a) As produes com no determinismo direto da forma:
A ::= o| | o sero substitudas por:
A :: oA
A ::= | |
b) O no determinismo indireto retirado atravs de sua transformao em
determinismo direto (atravs de substituies sucessivas) e posterior eliminao
segundo o item (a).
7
Exemplo: Fatorar a gramtica
S ::= aSB | aSa
A ::= b
B ::= a
Eliminando o no
determinismo direto
S ::= aSS
S::=B | a
A ::= b
B ::= a
Veja que na produo
S ::= B | a
tem um no-determinismo indireto, pois o lado direito da varivel B comea com um a.
Para fatorar esta gramtica tem-se que tornar este no determinismo indireto em direto
substituindo o lado direito de B ::= a na varivel B da produo S ::= B. Assim
procedendo tem-se:
S ::= aSS
S::= a | a
A ::= b
B ::= a
Eliminando o no
determinismo direto
S ::= aSS
S::= aS
S ::= c
A ::= b
B ::= a
3.3.3 Eliminao da Recurso Esquerda
Um no-terminal A, em uma GLC G = (N, T, P, S) recursivo se A
+
oA|, para o e |
e(NT)
*
.
Se o = c, ento A recursivo esquerda; se | = c, ento A recursivo direita. Esta
recursividade pode ser direta ou indireta.
Uma gramtica com pelo menos um no-terminal recursivo esquerda ou direita
uma gramtica recursiva esquerda ou direita, respectivamente.
Uma GLC G = (N, T, P, S) possui recurso esquerda direta, se P contm pelo menos
uma produo da forma A ::= Ao.
Uma GLC G = (N, T, P, S) possui recurso esquerda indireta, se existe em G uma
derivao da forma: A
n
A|, para algum n > 2.
Para eliminar as recurses diretas esquerda de um no terminal A, com produes
A ::= Ao
1
| Ao
2
| ... |Ao
m
| |
1
| |
2
| ... | |
n
onde nenhum |
i
comea por A, deve-se substituir estas produes-A pelas seguintes:
A ::= |
1
A | |
2
A | ... | |
n
A
A ::= o
1
A | o
2
A | ... |o
m
A| c
8
Algoritmo: Eliminao da recurso esquerda
Entrada: Uma GLC G = (N, T, P, S);
Sada: Uma GLC G = (N, T, P, S) sem recurso esquerda;
Ordene os no-terminais em uma ordem qualquer (ex: A
1
, A
2
, ...,A
n
);
Para i de 1 a n faa
Para j de 1 a i-1 faa
Substitua as produes A
i
::=A
j
por A
i
::=o
1
| o
2
|...| o
k
, onde A
j
::=o
1
| o
2
|...| o
k
so todas as produes-A
j
correntes;
fim_para;
Elimine as recurses diretas esquerda entre as produes A
i
;
fim_para;
3.4 Tipos Especiais de GLCs
A seguir sero identificados alguns tipos especiais de GLC.
a) Gramtica prpria: Uma GLC prpria se:
a.1) No possui produes cclicas; (ver definio a seguir)
a.2) c-livre; e
a.3) No possui smbolos inteis.
b) Gramtica sem ciclos: G = (N, T, P, S) uma GLC sem ciclos (ou livre de ciclos) se
no existe em G nenhuma derivao da forma A
+
A, para todo AeN.
c) Gramtica reduzida: Uma GLC G = (N, T, P, S) uma GLC reduzida se
c.1) L(G) no vazia;
c.2) Se A ::= oeP ento A=o
c.3) G no possui smbolos inteis.
d) Gramtica de operadores: Uma GLC G = (N, T, P, S) de operadores se ela no
possui produes cujo lado direito contenha no terminais consecutivos.
e) Gramtica unicamente inversvel: Uma GLC reduzida unicamente inversvel se
ela no possui produes com lados direitos iguais.
f) Gramtica linear: Uma GLC G = (N, T, P, S) linear se todas as suas produes
forem da forma A ::= xBw | x, onde A e B pertencem a N, e x e w pertencem a T
*
.
g) Forma normal de Chomsky: Uma GLC est na forma normal de Chomsky se ela c-
livre e todas as suas produes (exceto, possivelmente, S ::= c) so da forma:
g.1) A ::= BC, com a, b e percencentes a N, ou
g.2) A ::= a, com AeN e aeT.
h) Forma normal de Greibach: Uma GLC est na forma normal de Greibach se ela c-
livre e todas as suas produes (exceto, possivelmente, S ::= c) so da forma A ::= ao
tal que aeT, oeN
*
e AeN.
9
3.5 Principais Notaes de GLC
A BNF (Backus Naur Form) uma notao utilizada na especificao formal de sintaxe
de linguagens de programao. Esta a forma de especificao de gramticas que tem
sido utilizada nesse texto. A gramtica a seguir um exemplo de gramtica descrita na
notao BNF:
1. <S> ::= a<S> | c
2. <E> ::= <E>+id | id
A BNFE (BNF Extended) equivalente BNF, mas permite uma especificao mais
compacta da sintaxe de uma linguagem de programao. Os smbolos entre chaves
abreviam os fechos das cadeias que eles representam. A mesma gramtica descrita
acima em BNF pode ser representada em BNFE da seguinte forma:
1. <S> ::= {a}
2. <E> ::= id {+id}
10
4. Autmato de Pilha
4.1 Introduo
Tipos de linguagens
Tipo 0 Linguagens Irrestritas
Tipo 1 Linguagens Sensveis ao Contexto
Tipo 2 Linguagens Livres de Contexto
Tipo 3 Linguagens Regulares
Hierarquia de Chomsky
LR LSC LLC LI
Reconhecedores decidem se uma cadeia w pertence ou no a uma dada linguagem L(G).
= e
no
sim
G L w ? ) (
Exemplo: L= {a
i
b
i
| i>0}
ab e L?, aabb e L?, aaabbb e L?, aaab e L?
Reconhecedores x Linguagens:
Linguagem Reconhecedor
Irrestrita
Sensvel ao Contexto
Mquina de Turing
Livre de contexto Autmato de Pilha
Regular Autmato finito
4.2 Conceito Intuitivo
Suponha L uma LLC sobre o alfabeto E. Verificar se uma cadeia w pertence a L.
Uso de Pinos e Discos
Cadeias com nmeros iguais de as e
bs e os as e b so consecutivos
11
Exemplo: L= {vcv
R
| v e (a,b)
*
, v
R
a cadeia reversa de v}
Assim E = {a, b, c}. Queremos saber: abaacaaba e L? , abaca e L?
Usaremos uma pilha e dois discos: preto e branco. Para cada smbolo de entrada
procederemos da seguinte forma:
- Etapa 1: Se achar a empilhe um disco preto, e se achar b, um disco branco.
- Etapa 2: Se achar c mude de atitude, e prepare-se para desempilhar discos.
- Etapa 3: Compare o smbolo de entrada com o que est no topo da pilha:
- Se for a e o topo da pilha ocupado por um disco preto desempilhe o
disco; ou
- Se for b e o topo da pilha ocupado por um disco branco, desempilhe o
disco.
Se em alguma situao nenhuma das etapas acima puder ser aplicada, ento pare: weL.
Verificar se w = abcba pertence a L? Sim
Smbolo
de entrada
Faz Pilha Resta na
entrada
a Empilha disco preto bcba
b Empilha disco branco cba
c Muda de atitude ba
b Compara e desempilha a
a Compara e desempilha
Verificar se w = cab pertence a L? No
Smbolo
de entrada
Faz Pilha Resta na
entrada
c Muda de atitude ab
a Compara e desempilha
ab
Verificar se w = aabcba pertence a L? No
12
Smbolo
de entrada
Faz Pilha Resta na
entrada
a Empilha disco preto abcba
a Empilha disco preto
bcba
b Empilha disco branco cba
c Muda de atitude ba
b Compara e desempilha a
a Compara e desempilha
4.3 Definio Formal
Um autmato de pilha no determinstico M definido como:
( ) o , , , , ,
1
F q Q M I E =
onde:
E : Alfabeto de entrada
I: Alfabeto da pilha
Q: Conjunto de estados: (q
1
, q
2
,.., q
n
}
q
1
: Estado inicial: q
1
e Q
F: Conjunto de estados finais: F_Q
o: Funo de transio: { } ( ) { } ( ) ( )
*
I I E = Q P Q
f
c c o
Entendendo a funo de transio:
Seja M um AP e suponha que: qeQ, o e E{c} e e I{c}
Dados peQ e u e I
*
, a transio (q, o, ) (p,u) significa que:
- M muda para o estado p.
- M troca por u no topo da pilha.
Casos onde aparecem o c
Casos Interpretao
o = c, (q, c, ) (p,u) A entrada no consultada
= c, (q, o, c) (p,u) A topo da pilha no consultado
o= = c, (q, c, c) (p,u) Nem a entrada, nem o topo da pilha
so consultados.
= c e u = c, (q, o, ) (p, c) Remove da pilha
= c e u = c, (q, o, c) (p, u) Empilha u
= c e u = c, (q, o, c) (p, c) No altera a pilha
Exemplo1: Criar um Autmato de Pilha M
1
para
L
1
= {vcv
R
| v e (a,b)
*
, v
R
a cadeia reversa de v}
E : {a, b, c}
I: {a, b}
Concluso: A entrada dever se aceita se, e somente se, ao final da execuo
do processamento ela foi totalmente consumida e a pilha est vazia
13
o: funo de transio:
( ) { }
( ) { }
( ) { }
( ) { }
( ) { }
Desempilha
q b b q
q a a q
inalterada permanece Pilha q c q
Empilha
b q b q
a q a q
, ) , , (
, ) , , (
, ) , , (
, ) , , (
, ) , , (
2 2
2 2
2 1
1 1
1 1
c o
c o
c c o
c o
c o
=
=
=
=
=
Q = {q
1
, q
2
}, q
1
= q
1
e F = {q
2
}
A funo de transio pode ser colocada em forma de tabela.
Estado Entrada Topo da pilha Transies
a
o
(p
1
, u
1
)
...
(p
s
, u
s
)
Para o autmato M
1
acima
Estado Entrada Topo da
pilha
Transies Descrio
q
1
a
c
(q
1
, a) Acha a e o empilha.
q
1
b
c
(q
1
, b) Acha b e o empilha.
q
1
c
c (q
2
, c) Acha c e muda de estado.
q
2
a a (q
2
, c) Acha a na entrada e na pilha e o
desempilha
q
2
b b (q
2
, c) Acha b na entrada e na pilha e o
desempilha
Forma grfica de uma transio
Exemplo2: Criar um Autmato de Pilha M
2
para
14
L
2
= {vv
R
| v e (a,b)
*
, v
R
a cadeia reversa de v}
E : {a, b}
I: {a, b}
o: funo de transio:
Estado Entrada Topo da
pilha
Transies Descrio
q
1
a
c
(q
1
, a) Acha a e o empilha.
q
1
b
c
(q
1
, b) Acha b e o empilha.
q
1
c c (q
2
, c) Muda de estado.
q
2
a a (q
2
, c) Acha a na entrada e no topo e o desempilha
q
2
b b (q
2
, c) Acha b na entrada e no topo e o
desempilha
Q = {q
1
, q
2
}, q
1
= q
1
e F = {q
2
}
4.4 Exemplos e construes de AP
Exemplo 1: L = {a
i
b
i
| i > 0}
Procedimento com um disco:
- Etapa 1: Se achar um a na entrada, ponha um disco na pilha
- Etapa 2: Se achar um b mude de atitude e passe a comparar a entrada com a
pilha, removendo um disco da pilha para cada b que achar na entrada (incluindo
o primeiro!)
M = ( {a,b}, {a}, {q
1
, q
2
}, q
1
, {q
1
, q
2
}, o)
Onde o est na tabela
Estado Entrada Topo da
pilha
Transies Descrio
q
1
a
c
(q
1
, a) Empilha a.
q
1
b a (q
2
, c) Desempilha a e muda de estado.
q
2
b a (q
2
, c) Desempilha a.
Exemplo 2: L = {w e {a, b} | o nmero de as igual ao nmero de bs}
Procedimento:
- Etapa 1: Empilhar a para cada a encontrado e b para cada b encontrado na
entrada.
- Etapa 2: Empilhar um b sobre um a tem o efeito de desempilhar o b da pilha
e vice-versa.
15
Tabela para o
Estado Entrada Topo da
pilha
Transies Descrio
q
1
a a (q
1
, aa) Acha a e o empilha.
q
1
b b (q
1
, bb) Acha b e o empilha.
q
1
a b (q
1
, c) Desempilha um b.
q
1
b a (q
1
, c) Desempilha um a.
Veja que esta tabela no est bem especificada, pois em qualquer entrada (linha) da
mesma a pilha tem que possuir um smbolo. E, inicialmente, no h smbolo na pilha.
Se apenas adicionarmos as entradas:
q
1
a
c
(q
1
, a) Empilha a.
q
1
b
c
(q
1
, b) Empilha b
o autmato ficar errado.
A sada inventar um novo smbolo | para o alfabeto da pilha. Este smbolo
acrescentado pilha ainda vazia, no incio da computao. Da em diante, o autmato
opera apenas com as e bs na pilha. Assim, ao avistar um | no topo da pilha o autmato
sabe que a pilha no contm mais nenhum a ou b. Para garantir que | s vai ser usado
uma vez, convm reservar ao estado inicial apenas a ao de marcar o fundo da pilha.
Portanto, se q
1
for o estado inicial teremos
o(q
1
, c, c) = {(q
2
, |)}
Com isto se, ao final da computao, a pilha contm apenas o marcador | ento a
palavra est em L e aceita; do contrrio a palavra rejeitada. Entretanto, pela
definio formal o autmato s pode aceitar a palavra se a pilha estiver completamente
vazia. Isto sugere que precisamos de mais uma transio para remover | do fundo da
pilha.
Assim surge um novo problema. Se a palavra est em L, ento ser totalmente
consumida deixando na pilha apenas |. Portanto, a transio que remove | ao final
desta computao, e esvazia completamente a pilha, no tem nenhuma entrada para
consultar. O problema que se permitimos ao autmato remover sem consultar a
entrada, ele pode realizar este movimento no momento errado, antes que a entrada tenha
sido consumida. Como os nossos autmatos so no determinsticos, isto no apresenta
nenhum problema conceitual.
Infelizmente o fato de ainda haver smbolos na entrada abre a possibilidade do
autmato continuar a computao depois de ter retirado o marcador do fundo. Para
evitar isto, o autmato deve, ao remover |, passar a um novo estado q
3
a partir do qual
no h transies. Assim, se o autmato decidir remover o marcador antes da entrada
ser totalmente consumida ele ser obrigado a parar, e no poder aceitar a entrada nesta
computao. Como a pilha s vai poder se esvaziar em q
3
, claro que este ser o nico
estado final deste autmato.
16
Resumindo, temos um autmato que tem {a, b} como alfabeto de entrada; {a, b, |}
como alfabeto da pilha; estados q
1
, q
2
e q
3
; estado inicial q
1
; estado final q
3
; e cuja
funo de transio definida na tabela abaixo.
Estado Entrada Topo da
pilha
Transies Descrio
q
1 c c (q
2
, |) Marca o fundo da pilha
q
2
a
| (q
2
, a|) Acha a e empilha um a
q
2
b
| (q
2
, b|) Acha b e empilha um b
q
2
a a (q
2
, aa) Acha a e empilha um a
q
2
b b (q
2
, bb) Acha b e empilha um b
q
2
b a (q
2
, c) Desempilha um a
q
2
a b (q
2
, c) Desempilha um b
q
2
c | (q
3
, c) Esvazia a pilha
4.5 Exerccios
1) Considere o autmato de pilha no determinstico M com alfabeto E = {a, b} e I =
{a}, estados q
1
e q
2
, estado inicial q
1
e final q
2
e transies dadas pela tabela:
Estrado Entrada Topo da pilha transies
q
1
a
c
(q
1
, a)
(q
2
, c)
q
1
b
c
(q
1
, a)
q
2
a a (q
2
, c)
q
2
b a (q
2
, c)
a) Descreva todas as possveis seqncias de transies de M na entrada aba.
b) Mostre que aba, aa e abb no pertencem a L(M) e que baa, bab e baaaa
pertencem a L(M).
2) Ache um autmato de pilha no determinstico cuja linguagem aceita L onde:
a) L={a
n
b
n+1
| n > 0};
b) L={a
n
b
2n
| n > 0};
c) L={a
n
b
m
c
n
| m,n >1};
d) L={a
n
b
m
a
n+m
| m,n >1};
3) Considere a linguagem dos parnteses balanceados.
a) D exemplo de uma gramtica livre de contexto que gere esta linguagem.
b) D exemplo de um autmato de pilha no determinstico que aceita esta
linguagem.
17
4.6 Gramticas Livres de Contexto e Autmatos de Pilha
Nosso objetivo nesta seo a demonstrao do seguinte resultado fundamental: Uma
linguagem livre de contexto se, e somente se, aceita por algum autmato de pilha
no determinstico. Como uma linguagem livre de contexto se for gerada por uma
gramtica livre de contexto, o que precisamos fazer estabelecer um elo entre
gramticas livres de contexto e autmatos de pilha. Neste caso, iremos elaborar uma
receita que, dada uma gramtica livre de contexto G = (N, T, P, S), construiremos um
autmato de pilha no determinstico M que aceita L(G). No desenvolveremos a
recproca, isto , dado M um autmato de pilha no determinstico, construir G a partir
de M.
Seja G uma gramtica livre de contexto. Nosso objetivo consiste em construir um
autmato de pilha cujas computaes simulem as derivaes mais esquerda em G .
claro que a pilha tem que desempenhar um papel fundamental nesta simulao. O que
de fato acontece que o papel dos estados secundrio, e a simulao se d na pilha.
Seja G = (N, T, P, S) uma gramtica livre de contexto e ( ) o , , , , ,
1
F q Q M I E = o
autmato de pilha a ser construdo a partir de G . Como M deve aceitar L(G), isto
GERA(G)=ACEITA(M), claro que seu alfabeto de entrada E tem que ser igual a T.
Continuando, temos:
E = T (alfabeto de entrada igual conjunto de terminais de G)
q
1
= i (estado inicial i)
I = TN (alfabeto de pilha a unio de terminasi e no terminais de G)
Cada derivao de G corresponde a uma transio de M. Entretanto, como a derivao
de palavras de L(G) feita a partir do smbolo inicial S, o autmato deve comear
pondo este smbolo no fundo da pilha. Observe que o autmato no pode consumir
entrada ao marcar o fundo da pilha, j que precisamos da entrada para gui-lo na busca
da derivao correta. Nem adianta consultar a pilha, j que ainda est totalmente vazia.
Entretanto, uma transio que no consulta a entrada nem a pilha pode ser executada em
qualquer momento da computao. Por isso foramos o autmato a mudar de estado
depois desta transio, impedindo assim que volte a ser executada. Temos ento que
o(i, c, c) = {(f, S)},
onde f, diferente de i, um estado do autmato.
Da em diante toda a ao vai se processar na pilha, e podemos simular a derivao sem
nenhuma mudana de estado adicional. Portanto, f ser o estado final de M . Assim,
regra X ::= o de G fazemos corresponder a transio
(1) (f, c, X) e (f, o)
de M . Contudo, a construo do autmato ainda no est completa. O problema que
M s pode aplicar uma transio como (1) se a varivel X estiver no topo da pilha.
Infelizmente isto nem sempre acontece, como ilustra o exemplo a seguir.
18
Exemplo
Suponhamos G1 = (N, T, P, S) com
T = {a, b, c}
N = { S }
S = S
P = { S ::= Sc | aSb | c}.
Logo, de acordo com as discusses acima, ( ) o , , , , , 1
1
F q Q M I E = , deve ter
E = {a, b, c}
I = {a, b, c, S}
Q = {i, f}
q
1
= i
F = {f}
E o est representado na tabela abaixo
Estado Entrada Topo da pilha Transio
i
c c
(f, S)
f
c
S (f, Sc)
(f, aSb)
(f, c)
A palavra abc
2
tem derivao mais esquerda
S Sc Sc
2
aSbc
2
abc
2
em G1
Agora, deve-se fazer uma computao de M1 que copie na pilha esta derivao abc
2
. A
computao deve comear marcando o fundo da pilha com S e deve prosseguir, a partir
da, executando, uma a uma, as transies de M1 que correspondem s regras aplicadas
na derivao acima. Isto nos d
(2) (i, abc
2
, c) (f, abc
2
, S) (f, abc
2
, Sc) (f, abc
2
, Sc
2
) (f, abc
2
, aSbc
2
).
At aqui tudo bem, mas a transio seguinte deveria substituir S por c. S que para isto
ser possvel a varivel S tem que estar no topo da pilha, o que no acontece neste caso.
Observe, contudo, que o a que apareceu na pilha acima do S na ltima configurao de
(2) corresponde ao primeiro smbolo da palavra de entrada. Alm disso, como se trata
de uma derivao mais esquerda, este smbolo no ser mais alterado. Conclumos
que, como o primeiro smbolo da palavra j foi corretamente derivado, podemos
esquec-lo e partir para o smbolo seguinte. Para implementar isto no autmato basta
apagar da pilha os terminais que precedem a varivel mais esquerda da pilha e que j
foram corretamente construdos. Isto significa acrescentar tabela acima transies que
permitam apagar terminais que apaream simultaneamente na entrada e na pilha:
Estado Entrada Topo da pilha Transio
f a a (f, c)
f b b (f, c)
f c c (f, c)
Levando isto em conta a computao acima continua, a partir da ltima configurao de
(2) da seguinte maneira
19
(3) (f, abc
2
, aSbc
2
) (f, bc
2
, Sbc
2
) (f, bc
2
, bc
2
) (f, c
2
, c
2
) (f, c, c) (f, c, c).
Observe que a passagem da segunda para a terceira configurao em (3) corresponde
regra S ::= c. Todas as outras etapas so aplicadas das transies da segunda tabela.
4.7 Construo de AP Atravs de GLC
Podemos agora descrever de maneira sistemtica a receita usada para construir um
autmato de pilha no determinstico M cuja linguagem aceita L(G). Se a gramtica
livre de contexto G tem por elementos (N, T, P, S), ento o autmato ficar
completamente determinado pelos seguintes os elementos
- o alfabeto de entrada T;
- o alfabeto da pilha TN;
- o conjunto de estados {i, f};
- o estado inicial i;
- o conjunto de estados finais {f};
- a funo de transio
{ } { } ( ) { } ( ) { } ( )
*
, , : N T f i N T T f i c c o
que definida por
( ) ( )
( ) ( ) ( )
( ) ( )
e =
e e =
=
=
T a f a a f
a
T N N X f X f
X
S f i
onde , , ,
: fazer G de terminal todo Para
e onde , , ,
: fazer G de :: regra toda Para
, , ,
*
c o
o o c o
o
c c o
Este autmato executa dois tipos diferentes de transio a partir do estado final f.
- Transies de substituies: substituem uma varivel X no topo da pilha por o
(pertence a TN
*
) quando X ::= o uma regra de G.
- Transies de remoo: removem terminais que aparecem casados na pilha e na
entrada.
Exemplo
Considere a gramtica G2 cujas regras so
E ::= E + T | T
T ::= T * F | F
E ::= (E) | id
Assim, ( ) o , , , , , 2
1
F q Q M I E = , deve ter
E = {id, +, *, (, )}
I = { id, +, *, (, ), E, T, F}
Q = {i, f}
20
q
1
= i
F = {f}
E a funo de transio definida pela tabela
Estado Entrada Topo da pilha Transio
i
c c
(f, E)
f
c
E (f, E+T)
(f, T)
f
c
T (f, T*F)
(f, F)
f
c
F (f,(E))
(f, id)
f ( ( (f, c)
f ) ) (f, c)
f + + (f, c)
f * * (f, c)
f id id (f, c)
Uma computao para a cadeia id + id * id
(i, id+id*id, c) (f, id+id*id, E) (f, id+id*id, E+T) (f, id+id*id, T+T)
(f, id+id*id, F+T) (f, id+id*id, id+T) (f, +id*id, +T) (f, id*id, T) (f, id*id, T*F)
(f, id*id, F*F) (f, id*id, id*F) (f, *id, *F) (f, id, F) (f, id, id) (f, c, c).
5. Mquina de Turing
A mquina de Turing, proposta por Alan Turing em 1936, universalmente conhecida e
aceita como formalizao de algoritmo. Trata-se de um mecanismo simples que
formaliza a idia de uma pessoa que realiza clculos. Lembra, em muito, os
computadores atuais, embora tenha sido proposta anos antes do primeiro computador
digital. Apesar de sua simplicidade, o modelo Mquina de Turing possui, no mnimo, o
mesmo poder computacional de qualquer computador geral.
A mquina de Turing pode ser vista como uma mquina constituda de trs partes, como
segue:
a) Fita. Usada simultaneamente como dispositivo de entrada, de sada e de memria de
trabalho.
b) Unidade de controle. Reflete o estado corrente da mquina. Possui uma unidade de
leitura e gravao (cabea da fita), a qual acessa uma clula da fita de cada vez e
movimenta-se para a esquerda ou para a direita.
c) Programa ou funo de transio. Funo que define o estado da mquina e
comanda as leituras, as gravaes e o sentido de movimento da cabea.
A fita finita esquerda e infinita (to grande quanto necessrio) direita, sendo
dividida em clulas, cada uma armazenando um smbolo. Os smbolos podem pertencer
ao alfabeto de entrada, ao alfabeto auxiliar ou ainda ser branco ou marcador de incio
de fita. Inicialmente, a palavra a ser processada (ou seja, a informao de entrada para
a mquina) ocupa as clulas mais esquerda aps o marcador de incio de fita, ficando
21
as demais com branco, como ilustrado na figura abaixo, onde | e representam
branco e marcador de incio de fita, respectivamente.
a b b c a | | ...
entrada
fita
marcador de
incio de fita
branco
controle
cabea da fita
unidade de
controle
A unidade de controle possui um nmero finito e predefinido de estados. A cabea da
fita l o smbolo de uma clula de cada vez e grava um novo smbolo. Aps a
leitura/gravao (a gravao realizada na mesma clula de leitura), a cabea move
uma clula para a direita ou para a esquerda. O smbolo gravado e o sentido do
movimento so definidos pelo programa.
O programa uma funo que, dependendo do estado corrente da mquina e do smbolo
lido, determina o smbolo a ser gravado, o sentido do movimento da cabea e o novo
estado.
5.1 Modelo Formal
Uma mquina de Turing uma 8-upla:
M = (E, Q, o, q
0
, F, V, |, )
Onde:
E: alfabeto de smbolos de entrada;
Q: conjunto de estados possveis da mquina, o qual finito;
o: programa ou funo de transio:
{ } ( ) { } ( ) { } D E V Q V Q , , , : E E | | o
q
0
: estado inicial da mquina, tal que q
0
eQ;
F: conjunto de estados finais, tal que FcQ;
V: alfabeto auxiliar;
|: smbolo especial branco
: smbolo especial marcador de incio ou smbolo de incio da fita.
O smbolo de incio da fita ocorre exatamente uma vez e sempre na clula mais
esquerda da fita, auxiliando na identificao de que a cabea da fita se encontra na
clula mais esquerda da fita. A funo programa:
22
Considera Para determinar
- estado corrente - novo estado
- smbolo lido da fita - smbolo a ser gravado
- sentido de movimento da cabea, onde esquerda
e direita so representados por E e D,
respectivamente.
Assim, tem-se que:
o(estadoCorrente, smboloLido) = (novoEstado, smboloGravado,sentidoDeMovimento)
ou seja, suponha que p, q e Q, a
u
, a
v
e(EV{|,}) e me{E, D}):
o(p, a
u
) = (q, a
v
, m)
A funo programa pode ser interpretada em um diagrama de transio como
mostrado na figura abaixo.
p q
(a
u
, a
v
, m)
estado corrente
smbolo lido
smbolo gravado
sentido do movimento
estado novo
Neste caso, os estados iniciais e finais so representados como:
q
0
q
f
A funo programa pode ser representada na forma de tabela, veja a seguir. A tabela
ilustra o caso para o(p, a
u
) = (q, a
v
, m):
o ... a
u
... a
v
... |
p
q
...
(q, a
v
, m)
O processamento de uma mquina de Turing M = (E, Q, o, q
0
, F, V, |, ) para uma
palavra de entrada w consiste na sucessiva aplicao da funo programa a partir do
estado inicial q
0
e da cabea posicionada na clula mais esquerda da fita, at ocorrer
uma condio de parada. O processamento de M para a entrada w pode parar ou ficar
23
em loop infinito. A parada pode ser de duas maneiras: aceitando ou rejeitando a entrada
w. As condies de parada so as seguintes:
a) Estado final. A mquina assume um estado final: a mquina pra e a
palavra de entrada aceita.
b) Funo indefinida. A funo programa indefinida para o argumento
(smbolo lido e estado corrente): a mquina pra e a palavra de entrada
rejeitada.
c) Movimento invlido. O argumento corrente da funo programa define
um movimento esquerda e a cabea da fita j se encontra na clula mais
esquerda: a mquina pra e a palavra de entrada rejeitada.
Exemplo: Mquina de Turing M1 para reconhecer a linguagem
L = {a
n
b
n
| n > 0}
A mquina de Turing M1 = ({a,b}, {q
0
, q
1
, q
2
, q
3
, q
4
}, o, q
0
, {q
4
}, {A, B}, |,)
ilustrada abaixo:
TABELA
o a b
A B
|
q
0
(q
0
, , D) (q
1
, A, D) (q
3
, B, D) (q
4
, |, D)
q
1
(q
1
, a, D) (q
2
, B, E) (q
1
, B, D)
q
2
(q
2
, a, E) (q
2
, A, D) (q
2
, B, E)
q
3
(q
3
, B, D) (q
4
, |, E)
q
4
DIAGRAMA DE TRANSIES
(b, B, E)
(a, a, E)
(B, B, E)
(a, a, D)
(B, B, D)
(|, |, E)
(|, |, D)
(B, B, D)
(B, B, D)
(,, D)
(A, A, D)
(a, A, D)
q
0
q
1
q
2
q
3
q
4
O algoritmo apresentado reconhece o primeiro smbolo a, o qual marcado como A, e
movimenta a cabea da fita para a direita, procurando o b correspondente, o qual
marcado como B. Este ciclo repetido sucessivamente at identificar para cada a o seu
correspondente b. Adicionalmente, o algoritmo garante que qualquer outra palavra que
24
no esteja na forma nab
n
rejeitada. Note-se que o smbolo de incio de fita no tem
influncia na souo proposta.
A seguir apresentada uma computao da mquina de Turing M1 para a entrada
w=aabb.
COMPUTAO para a cadeia aabb.
q
0
a a b b | ... a a b b | ... A a b b | ...
q
0
q
0
q
1
A a b b | ... A a b b | ... A a B b | ...
q
2
q
2
q
0
A a B b | ... A A B b | ... A A B b | ...
q
1
q
1
q
2
A A B B | ... A A B B | ... A A B B | ...
q
2
q
0
q
3
A A B B | ... A A B B | ... A A B B | ...
q
3
q
4