Escolar Documentos
Profissional Documentos
Cultura Documentos
Formais - 0-1
Captulo 0: Conjuntos, funes, relaes
Notao. Usaremos Nat para representar o conjunto dos nmeros naturais; Int para
representar o conjunto dos nmeros inteiros. Para cada n Nat, [n] representa o
conjunto dos naturais menores ou iguais a n:
[n] = { i Nat | 0 < i n }.
Este conjunto [n] s vezes representado por {1, 2, , n}, convencionando-se
que nos casos especiais n = 0 e n = 1, essa notao indica, respectivamente, o conjunto
vazio e o conjunto unitrio {1}.
Produto Cartesiano. O produto cartesiano de dois conjuntos A e B o conjunto A B
de pares ordenados de elementos de A e B:
A B = { (x, y) | x A e y B }.
Esse conceito pode ser estendido, usando n-tuplas, para definir o produto cartesiano de n
conjuntos:
A
1
A
2
A
n
= { (x
1
, x
2
, x
n
) | para cada i [n], x
i
A
i
}
Podemos definir potncias de um conjunto, a partir da definio de produto
Cartesiano:
A
n
= A A A (n vezes) = { (x
1
, x
2
, x
n
) | para i [n], x
i
A}.
Naturalmente, A
1
= A.
Exemplo: Sejam A = { a, b, c }, B = { d, e }. Ento,
A B = { (a, d), (a, e), (b, d), (b, e), (c, d), (c, e) }
B A = { (d, a), (d, b), (d, c), (e, a), (e, b), (e, c) }
A
1
= A = { a, b, c }
A
2
= A A = { a, b, c } { a, b, c } =
= { (a, a), (a, b), (a, c), (b, a), (b, b), (b, c), (c, a), (c, b), (c, c) }
o
Relaes. Podemos agora definir relao: dados n conjuntos A
1
, A
2
, , A
n
, uma
relao em A
1
, A
2
, , A
n
um conjunto qualquer de tuplas de elementos de A
1
, A
2
, ,
A
n
. Portanto, usando a definio acima, R uma relao em A
1
, A
2
, , A
n
se
R A
1
A
2
A
n
.
Um caso especial que ser muito importante no que se segue o caso n=2, com
A
1
=A
2
=A. R uma relao binria em um conjunto A, se R A A.
1/113
J.L.Rangel - Ling. Formais - 0-2
Funes. Outro caso especial o das funes: uma relao f em A B, ou seja, um
conjunto f A B, uma funo, com domnio A e codomnio B, se para cada x A
existe em f um nico y B tal que (x, y) f. Essa unicidade pode tambm ser expressa
por
(x, y) f e (x, z) f implicam em y = z.
Naturalmente, esse valor nico de y que f faz corresponder a x indicado pela
notao habitual f(x), e podemos escrever tambm f: x a y. Escrevemos f: A B, para
indicar que f uma funo com domnio A e codomnio B.
Definimos o contradomnio de f: A B como sendo o conjunto
{ y B | ( x A) (f(x) = y) }.
Exemplo: Se considerarmos o conjunto Int dos nmeros inteiros, e a funo suc:
Int Int que a cada valor em Int associa seu sucessor, poderemos escrever
para cada i Int, suc(i) = i + 1,
ou
suc: i a i + 1
ou ainda
suc = { , (-2, -1), (-1, 0), (0, 1), (1, 2), }
o
I njeo, sobrejeo, bijeo. Dizemos que uma funo f: AB uma injeo se para
cada b B existe no mximo um a A tal que f(a) = b; dizemos que f: AB uma
sobrejeo se para cada b B existe no mnimo um a A tal que f(a) = b; dizemos que
f uma bijeo se f ao mesmo tempo, uma injeo e uma sobrejeo.
No caso de sobrejees (e bijees), codomnio e contradomnio so iguais.
Alternativamente, podemos falar em funes injetoras, sobrejetoras ou "sobre",
e bijetoras.
Conjuntos enumerveis. Um conjunto A enumervel se vazio, ou se existe uma
funo sobrejetora f: Nat .
O nome enumervel se deve ao fato de que, se A no vazio, a sequncia
f(0), f(1), f(2), f(3), uma lista infinita da qual fazem parte todos os elementos de A,
ou seja, uma enumerao de A. Em particular, como no esto proibidas repeties em
uma enumerao, temos:
Fato: Todos os conjunto finitos so enumerveis.
Dem.: Exerccio.
o
2/113
J.L.Rangel - Ling. Formais - 0-3
No que se segue, estaremos interessados principalmente em conjuntos
enumerveis infinitos. Neste caso, podemos usar uma numerao, em vez de uma
enumerao. Por numerao entendemos aqui uma funo como a funo g mencionada
na propriedade abaixo, que associa a cada elemento de A um nmero natural distinto.
Fato: Um conjunto infinito enumervel, se e somente se existe uma funo injetora
g: A Nat.
Dem. () Seja A um conjunto enumervel infinito. Pela definio, existe uma funo
sobrejetora f: Nat A. Podemos definir a injeo g:A Nat fazendo, para cada
a A, g(a) ser igual ao menor valor de i tal que f(i) = a. Assim, a funo g definida
para qualquer valor de a, porque f sobrejetora. Alm disso, g injetora, porque, pela
prpria definio, g(a) = g(b) implica em f(g(a)) = f(g(b)).
() Seja A um conjunto tal que existe uma injeo g:A Nat. Uma vez que A
no vazio, seja q um elemento qualquer de A. Defina agora a sobrejeo f: Nat A
por
f(i)
a, g(a) i
q,
=
=
S A C, a composio
de R e S, por
R
S se reduz exatamente
composio de funes: se (x, y) R e (y, z) S, temos y = R(x), z = S(y) = S(R(x)), e
portanto (R
S = { (1, 1), (1, 2), (1, 3), (2, 2), (2, 3), (3, 3) }
S
R = { (2, 2), (2, 3), (2, 4), (3, 3), (3, 4), (4, 4) }
o
1
Alguns autores preferem a ordem inversa: (R
R, para i Nat
Fato:
1. A relao I
A
a identidade para a composio de relaes, associada ao conjunto
A, ou seja, para qualquer R A
2
, R
I
A
= I
A
R = R.
2. Para qualquer R A
2
, R
1
= R.
3. Para quaisquer R A
2
, i, j Nat, R
i
R
j
= R
j
R
i
, ou seja, potncias da mesma
relao sempre comutam.
Dem.: Exerccio.
o
Exemplo: Sejam A = { 1, 2, 3, 4 } e R = { (1,2), (1,3), (1,4), (2,3), (2,4), (3,4) }.As
potncias de R so:
R
0
= I = { (1,1), (2,2), (3,3), (4,4) }.
R
1
= R = { (1,2), (1,3), (1,4), (2,3), (2,4), (3,4) }
R
2
= R
1
R = R
R = { (1,4) }
R
4
= R
5
= = .
No caso do exemplo, podemos provar que (x, y) R se y-x 1. Assim, em
geral, (x, y) R
i
se y-x i. Naturalmente, no conjunto A, a maior diferena possvel 3,
e todas as potncias alm da terceira so relaes vazias: nunca podem ser satisfeitas.
o
Fechamento. Definimos o fechamento reflexivo-transitivo R* de uma relao binria R
em um conjunto A atravs de
x R* y se e somente se para algum i Nat, x R
i
y,
ou, equivalentemente,
R R R R R R
* i
i
= =
=
0
0 1 2 3
U
U U U UL
Exemplo: Seja a relao R, no conjunto Nat definida por
x R y se e somente se y = x + 1.
Temos x R
i
y se e somente se y = x + i, de forma que x R* y se e somente y x.
o
7/113
J.L.Rangel - Ling. Formais - 0-8
O nome de fechamento reflexivo-transitivo de R dado relao R* se deve ao
fato de que R* a menor relao (no sentido da incluso de conjuntos) que contm R e
reflexiva e transitiva. Ou seja, qualquer relao S
(1) que satisfaa x R y implica x S y (isto , S R) e
(2) que seja reflexiva e transitiva
satisfaz tambm S R*.
De forma semelhante, a notao R
+
frequentemente utilizada para descrever o
fechamento transitivo da relao R:
R R R R R
i
i
+
=
= =
1
1 2 3
U
U U UL
ou seja, x R
+
y se e somente se para algum i>0, x R
i
y.
Exemplo: Seja a mesma relao R do exemplo anterior. Neste caso, temos
x R
+
y se e somente se y > x.
o
Parties. Dado um conjunto A, definimos uma partio de A como sendo uma famlia
de conjuntos (chamados de blocos da partio) = { B
i
| i I } com as seguintes
propriedades:
(1) para cada i I, B
i
. nenhum bloco vazio
(2) U
U
= =
i
i I
B
A a unio dos blocos A
(3) se ij, B
i
I B
j
= . blocos so disjuntos dois a dois
Dessa maneira, cada elemento a de A pertence a exatamente um bloco da partio P.
Observao: Na maioria das vezes o conjunto I usado para indexar os elementos da
famlia ser um conjunto enumervel, um subconjunto dos naturais.
Exemplo: Seja o conjunto A = { a, b, c, d, e }. Temos a seguir alguns exemplos de
parties de A:
{ { a, b, c, d, e } }
{ { a }, { b }, { c }, { d }, { e } }
{ { a, b }, { c, d, e } }
{ { a, e }, { b, c, d } }
o
Exerccio: Escreva todas as parties de { a, b, c, d, e }.
o
Classes de equivalncia. Seja R uma equivalncia em um conjunto A. Definimos a classe
de equivalncia [a] de a A da seguinte maneira:
[a] = { x A | x R a },
8/113
J.L.Rangel - Ling. Formais - 0-9
ou seja, a classe de equivalncia de aA o conjunto dos elementos de A que so
equivalentes a a. Note que como R uma equivalncia, a [a], para qualquer a.
Exemplo: Seja a equivalncia R em A = {a, b, c, d, e, f}, dada pelas seguintes
propriedades:
(1) R uma equivalncia
(2) a R b, b R c, d R e.
(3) x R y somente se isto decorre de (1) e (2).
Temos ento, examinando todos os casos possveis:
a R a, b R b, c R c, d R d, e R e, f R f (reflexividade)
b R a, c R b, e R d (simetria)
a R c, c R a (transitividade)
e R composta dos pares: (a, a), (a, b), (a, c), (b, a), (b, b), (b, c), (c, a), (c, b), (c, c),
(d, d), (d, e), (e, d), (e, e), (f, f).
Assim podemos ver diretamente que [a] = [b] = [c] = { a, b, c }, que [d] = [e] = { d, e }
e que [f] = { f }.
o
Conjunto quociente. Definimos o conjunto quociente A/R de A por uma equivalncia R
em A, atravs de
A/R = { [x] | x A },
ou seja, A/R o conjunto das classes de equivalncia de R em A.
Exemplo: Sejam A e R como no exemplo anterior. As classes de equivalncia de R
formam uma partio de A, que exatamente o conjunto quociente A/R:
A/R = { { a, b, c }, { d, e }, { f } }
o
Fato: Seja R uma equivalncia em um conjunto A. Ento A/R uma partio de A.
Dem.:
(1) note que as classes de equivalncia no so vazias: classe [a] pertence pelo
menos o elemento a;
(2) a unio das classes de equivalncia A, porque cada elemento a de A pertence a
pelo menos uma classe de equivalncia: a [a].
(3) Classes de equivalncia diferentes so disjuntas. Com efeito, suponha que duas
classes [a] e [b] tem sua interseo no vazia, com um elemento c em comum:
c [a] e c [b]. Neste caso, usando o fato de que R simtrica e transitiva,
temos c R a, c R b, e, portanto, a R b. Assim, pela propriedade transitiva, x R a
se e somente se x R b, e [a] = [b]. Consequentemente, as classes de equivalncia
so disjuntas duas a duas, e formam uma partio de A.
o
9/113
J.L.Rangel - Ling. Formais - 0-10
Fato: Dada uma partio P de um conjunto A, a relao R definida por
x R y se e somente se x e y fazem parte do mesmo bloco de P
uma relao de equivalncia em A, e A/R = P.
Dem.: Exerccio.
o
I nduo finita. Muitas das demonstraes que veremos nas sees seguintes utilizam
uma tcnica conhecida por induo finita. A idia fundamental simples: suponha que
desejamos provar que a propriedade P vale para todos os elementos de Nat, isto , que
queremos provar que, para todo x Nat, P(x).
Uma propriedade fundamental de Nat que Nat composto por um elemento
especial, 0, e por seus sucessores. Dito de outra forma, Nat o menor conjunto que
contm 0 e fechado para a funo sucessor s. Esquematicamente,
Nat = { 0, s(0), s(s(0)), s(s(s(0))), s(s(s(s(0)))) }.
Assim, se provarmos
I. (base da induo)
P(0)
II. (passo de induo)
Para qualquer i Nat, P(i) implica P(s(i)).
estaremos provando P para todos os naturais, pois teremos
(0) P(0) (I)
(1) P(0) P(1) (II)
(2) P(1) P(2) (II)
(3) P(2) P(3) (II)
=
10/113
J.L.Rangel - Ling. Formais - 0-11
Para provar o passo de induo, devemos assumir a hiptese de induo S
i
= f(i) e provar
a tese de induo S
i+1
= f(i+1). Temos a
i+1
= a
i
q, e S
i+1
= S
i
+ a
i+1
.
Portanto,
S S a f (i) a
(a q a )
(q 1)
a
(a a )
(q 1)
a
i 1 i i 1 i 1
i 0
i 1
i 1 0
i 1 + + + +
+
+
= + = + =
+ =
+ =
=
+
= +
+ + + +
(a a a q a )
(q 1)
(a q a )
(q 1)
f (i 1).
i 1 0 i 1 i 1 i 1 0
o
Uma forma alternativa de induo, que pode facilitar as demonstraes, em vez
de usar apenas o ltimo resultado anterior P(i) para provar P(i+1), usa todos os
resultados anteriores, ou seja, P(0), P(1), , P(i).
Assim, para mostrar P(i) para todos os naturais i, mostramos
I. P(0)
II. ji P(j) P(i+1).
I nduo em estrutura. Quando trabalhamos com estruturas que apresentam uma lei de
formao bem definida, tais como cadeias, rvores, expresses, podemos usar para a
induo um nmero natural, como, por exemplo, o tamanho da estrutura considerada;
muitas vezes, entretanto, isso no necessrio, ou no conveniente, e podemos fazer a
induo de outra forma, baseada na prpria estrutura.
Por exemplo, dados um conjunto I e uma propriedade Q, suponha um conjunto X
definido como o menor conjunto, no sentido da incluso, que satisfaz 1 e 2 a seguir:
1. todo x I pertence a X, ou seja, I X.
2. se x X e Q(x,y), ento y X.
Ou seja, um elemento x de X ou pertence a um conjunto inicial I, ou satisfaz a
propriedade Q, que liga x a um (outro) elemento y de X. Para provarmos uma
propriedade P(x) para todos os elementos de X, basta provar:
I. (base da induo)
se x I, P(x)
II. (passo de induo)
se x X, P(x) e Q(x,y), ento P(y).
Este esquema pode ser generalizado para permitir vrias propriedades Q, e para
incluir a possibilidade que essas propriedades relacionem vrios elementos de X a um
(novo) elemento. Este caso mais geral de induo em estrutura est ilustrado a seguir.
Exemplo: Suponha que definimos uma expresso da seguinte maneira:
1. a, b, c so expresses.
2. Se e so expresses, ento + uma expresso.
3. Se e so expresses, ento * uma expresso.
4. Se uma expresso, [] uma expresso.
11/113
J.L.Rangel - Ling. Formais - 0-12
Suponha adicionalmente que queremos provar a propriedade: "toda expresso tem
comprimento (nmero de smbolos) mpar". Vamos indicar " tem comprimento mpar"
por P(). Devemos ento, para provar "para qualquer expresso , P()", provar:
1. P(a), P(b), P(c).
2. Se P() e P(), ento P(+).
3. Se P() e P(), ento P(*).
4. Se P(), ento P([]).
Neste caso, (1) a base da induo; (2)..(4) so passos de induo. Naturalmente, para
mostrar (1), basta observar que
|a| = |b| = |c| = 1;
para mostrar os demais, basta observar que
|+| = || + || + 1,
|*| = || + || + 1, e
|[]| = || + 2.
o
(reviso de 27fev97)
12/113
J.L.Rangel - Ling. Formais - 1-1
Captulo 1: Alfabetos, cadeias, linguagens
Smbolos e alfabetos. Um alfabeto , para os nossos fins, um conjunto finito no vazio
cujos elementos so chamados de smbolos. Dessa maneira, os conceitos de smbolo e
alfabeto so introduzidos de forma interdependente: um alfabeto um conjunto de
smbolos, e um smbolo um elemento qualquer de um alfabeto.
Note que consideramos aqui apenas alfabetos finitos: isso feito por
simplicidade, naturalmente, e tambm porque so raros os casos em que a considerao
de um alfabeto infinito seria desejvel.
1
Qual o alfabeto que devemos considerar, ou seja, quais so os smbolos do
alfabeto considerado depende do contexto em que pretendemos trabalhar. Como
exemplos de alfabetos, citamos {0, 1} ou {a, b}, o alfabeto da lngua portuguesa { a, b,
c, , z}, o conjunto de caracteres ASCII, etc.
At certo ponto, podemos arbitrar os smbolos que nos interessam, e incluir
apenas esses smbolos no alfabeto. Para cada aplicao especfica, o usurio deve
escolher o alfabeto que pretende utilizar: para exemplos no quadro negro, alfabetos
como {0, 1}, e {a, b} so boas escolhas; para ensinar a linguagem Pascal, o alfabeto
escolhido dever conter smbolos como program, begin, end, if, then, else; para
implementar a linguagem Pascal, provavelmente o alfabeto adequado no conter
smbolos como os vistos acima, mas sim caracteres como os do conjunto ASCII (letras,
dgitos, +, *, etc.), uma vez que so estes os componentes bsicos de um arquivo fonte.
Cadeias. Formalmente, uma cadeia de smbolos em um alfabeto pode ser definida
como uma funo: uma sequncia s de comprimento n no alfabeto , uma funo
s:[n] , com domnio [n], e com contradomnio . O nmero natural n o
comprimento de s, e representado por |s|.
Por exemplo, se o alfabeto considerado for = {a, b, c}, a sequncia de
comprimento 4 (composta por quatro ocorrncias de smbolos) s = cbba pode ser vista
como a funo s:[4] , definida por s(1) = c, s(2) = b, s(3) = b, s(4) = a.
Concatenao. A principal operao sobre sequncias a operao de concatenao.
Informalmente, o resultado da concatenao das sequncias x e y a sequncia xy, ou
x
y:[m+n] , de
comprimento m+n, por
x y i
x i i m
y i m i m
o ( )
( ),
( ),
=
>
se
se
1
Em geral, possvel usar alguma forma de codificao, e representar cada smbolo de um alfabeto
infinito enumervel atravs de uma sequncia de smbolos de um alfabeto finito.
13/113
J.L.Rangel - Ling. Formais - 1-2
Assim, se tivermos = {a, b, c}, x = cbba, e y = ac, teremos x
y = cbbaac.
Representando as funes atravs de tabelas, temos:
i x(i) i y(i) i x
y(i)
1 c 1 a 1 c
2 b 2 c 2 b
3 b 3 b
4 a 4 a
5 a
6 c
Naturalmente, |x
y| = |x| + |y|.
No que se segue, em geral no faremos referncia ao fato de que sequncias so
funes. Se considerarmos smbolos x
1
, x
2
, x
n
, de um alfabeto , representaremos a
sequncia formada por ocorrncias desses smbolos, nessa ordem, por x
1
x
2
x
n
. Note
que no caso especial n = 1, a notao acima confunde a sequncia a de comprimento 1
com o smbolo a. Esta ambiguidade no causa maiores problemas.
Um outro caso especial importante o caso n = 0, em que falamos da sequncia
vazia, indicada por . Usamos um nome "" para a sequncia vazia simplesmente porque
no possvel usar a mesma notao das outras sequncias. Afinal, se escrevermos zero
smbolos, como convencer algum de que alguma coisa foi escrita? A sequncia vazia
o elemento neutro (identidade) da concatenao: qualquer que seja a sequncia x,
temos
x
x = x
Linguagens. Dado um alfabeto , uma linguagem em um conjunto de sequncias de
smbolos de .
O conjunto de todas as sequncias de smbolos de um alfabeto uma
linguagem, indicada por *. A linguagem * inclui todas as sequncias de smbolos de ,
incluindo tambm a sequncia vazia . Com essa notao, uma linguagem L em um
subconjunto de *, ou seja, L *.
Note que todas essas sequncias satisfazem a definio anterior, e tem como
comprimento um nmero natural finito. Podemos assim ter linguagens infinitas, mesmo
sem considerar sequncias infinitas.
Exemplo: Os conjuntos a seguir so linguagens em = {a, b}.
{}
{a, aa, aaa}
{a, b}*
{x | |x| par}
{a, b} notao ambgua
14/113
J.L.Rangel - Ling. Formais - 1-3
Nota: J observamos que a notao aqui usada ambgua; essa ambiguidade se torna
aparente neste ltimo exemplo: {a, b} pode ser uma linguagem (conjunto de sequncias)
ou um alfabeto (conjunto de smbolos). Isto vale para qualquer alfabeto . Se isso fosse
necessrio, a ambiguidade poderia ser evitada usando-se uma notao apropriada: em
uma das notaes possveis, representamos sequncias entre aspas, e smbolos entre
plicas, de forma que "a" fica sendo a sequncia, 'a' o smbolo, {"a", "b"} a linguagem e
{'a', 'b'} o alfabeto. Para ns, entretanto, tais distines no sero necessrias.
Operaes com linguagens. Linguagens so conjuntos, de forma que as operaes de
conjuntos podem ser diretamente usadas com linguagens. Assim, no h necessidade de
definir unio, interseo ou diferena de linguagens; no caso do complemento, podemos
usar como universo o conjunto * de todas as sequncias no alfabeto considerado .
Se L e M so linguagens em , temos:
unio: L M = { x | x L ou x M }
interseo: L M = { x | x L e x M }
diferena: L - M = { x | x L e x M }
complemento: L = * - L = { x * | x L }
Exemplo: Seja o alfabeto = {a, b, c} , e sejam as linguagens L = {a, bc, cb} e
M = {aa, bb, cc, bc, cb} , em . Temos:
L M = {a, bc, cb, aa, bb, cc}
L M = {bc, cb}
L - M = {a}
M - L = {aa, bb, cc}
L = { x * | x a, x bc e x cb } =
= {, b, aa, ab, ac, ba, bb, ca, cb, cc, aaa, }
o
Concatenao de linguagens. A operao de concatenao, que foi definida para
sequncias, pode ser estendida a linguagens:
L
M = { x
y | x L e y M } .
Exemplo: Sendo L e M como no exemplo anterior,
L
L
i
, para qualquer iNat.
Exemplo: Seja L = {0, 11}. Ento temos:
L
0
= { }
L
1
= L
L
0
= { }
L
1
= {0, 11}
L
2
= {0, 11}
L
j
= L
i+j
, para i e j quaisquer.
Dem.: Exerccio.
o
Fechamento. Podemos definir, para uma linguagem L qualquer, o seu fechamento L*
como sendo a unio de todas as potncias de L:
L* = L
0
i
i =
U
= L
0
L
1
L
2
L
3
Outra notao frequentemente utilizada L
+
, que indica a unio de todas as
potncias de L, excluda a potncia 0:
L
+
= L
=1
i
i
U
= L
1
L
2
L
3
Exemplo: Para a linguagem L do exemplo anterior, temos:
L* = { , 0, 11, 00, 011, 110, 1111, 000, 0011, 0110,
01111, 1100, 11011, 11110, 111111, }
L
+
= { 0, 11, 00, 011, 110, 1111, 000, 0011, 0110,
01111, 1100, 11011, 11110, 111111, }
Exerccio: Caracterize a classe das linguagens L para as quais L* = L
+
.
o
Fato: Para qualquer alfabeto , o conjunto * de todas as sequncias de smbolos de
enumervel. (Note que pode ser considerado um alfabeto ou uma linguagem, sem que
isso altere o valor de *.)
Dem. Considere (por exemplo) a seguinte enumerao:
1. Escolha uma ordem qualquer (ordem alfabtica) para os elementos do alfabeto .
2. Enumere as sequncias por ordem crescente de comprimento, e, dentro de cada
comprimento, por ordem alfabtica. Por exemplo, se = {a, b, c}, a enumerao
pode ser
, a, b, c, aa, ab, ac, ba, bb, bc, ca, cb, cc, aaa, aab,
16/113
J.L.Rangel - Ling. Formais - 1-5
Observamos que a ordem alfabtica simples no seria adequada para as cadeias, uma vez
que teramos, neste caso,
, a, aa, aaa, aaaa, aaaaa, .
excluindo, portanto, da enumerao, todas as sequncias que no pertencessem a {a}
*
Assim, a cadeia b, por exemplo, nunca seria atingida.
O esquema apresentado se baseia no fato de que, para cada comprimento, o nmero de
sequncias de comprimento n finito. Assim, se pudesse ser infinito, a enumerao
no seria possvel, como descrita, uma vez que no teramos um nmero finito de
sequncias para cada comprimento.
o
No que se segue, usaremos a notao x
i
para representar a i-sima sequncia
numa enumerao de *, para um alfabeto fixo, supondo uma ordenao fixada para
*.
Fato: Qualquer linguagem enumervel.
Dem.: Toda linguagem em um subconjunto de *.
o
Fato: A classe de todas as linguagens em um alfabeto no enumervel.
Dem.: A classe de todas as linguagens em P(*), e j vimos que o conjunto formado
por todos os subconjuntos de um conjunto enumervel infinito no enumervel.
o
Exerccio: Aplique a tcnica da diagonalizao diretamente, para mostrar que a classe
P(*) de todas as linguagens no alfabeto no enumervel.
o
Exerccio: Suponha = { a, b, c }.
(a) Escreva um programa que, quando recebe como entrada o natural i, determina a
cadeia x
i
*.
(b) Escreva um programa que, quando recebe como entrada uma cadeia x *,
determina o natural i tal que x = x
i
.
rev. 17/6/96
17/113
J.L.Rangel - Ling. Formais - 2-1
Captulo 2: Procedimentos e algoritmos
Para estudar o processo de computao de um ponto de vista terico, com a
finalidade de caracterizar o que ou no computvel, necessrio introduzir um
modelo matemtico que represente o que se entende por computao. Entretanto, cada
estudioso do assunto tem seu modelo matemtico favorito, e por isso h diversas
definies essencialmente distintas. (Por exemplo, um programador FORTRAN tenderia
certamente a afirmar que computvel exatamente aquilo que pode ser feito por um
programa FORTRAN).
Diversos modelos foram apresentados, e podem ser estudados na literatura (veja,
por exemplo, [BrLa74]
1
). Neste curso veremos apenas dois destes modelos: as funes
recursivas parciais e as mquinas de Turing. O modelo das funes recursivas parciais se
baseia em idias semelhantes s da programao funcional, enquanto o modelo das
mquinas de Turing procura introduzir um computador elementar, com repertrio de
instrues e estrutura de memria com a maior simplicidade possvel. Outros modelos,
que no veremos aqui, so baseados em algoritmos de Markov (com algumas
semelhanas com a linguagem SNOBOL), em linguagens de programao mais
convencionais (como o FORTRAN citado acima), ou em outras arquiteturas de
computadores ideais ou linguagens de programao.
O fato surpreendente a respeito disso que (at hoje) todos os modelos usados
(se no so completamente absurdos) concordam na definio do que quer dizer
"computvel". Uma conjectura, enunciada por Alonzo Church, diz que todos os modelos
razoveis do processo de computao, definidos e por definir, so equivalentes. Essa
conjectura conhecida como a tese de Church. Por sua prpria natureza, a tese de
Church no admite nenhuma prova formal, mas at hoje todos os modelos propostos se
mostraram equivalentes.
Neste captulo, entretanto, no queremos ainda definir modelos matemticos
precisos, mas queremos apenas trabalhar com a idia intuitiva do que quer dizer
computvel. Para isso, vamos introduzir, mais abaixo, informalmente, dois conceitos
relacionados: o conceito de procedimento, e o conceito de algoritmo.
Codificao: Na discusso que se segue, levaremos em considerao apenas conjuntos
enumerveis. A razo para isto que nenhum modelo "razovel" proposto para o
processo de computao admite o tratamento de conjuntos no enumerveis. Precisamos
ter alguma garantia de que podemos representar de forma finita todos os elementos do
conjunto considerado, e isso no seria possvel no caso de conjuntos no enumerveis.
Por exemplo, o conjunto dos nmeros reais no enumervel, mas o conjunto dos
nmeros racionais enumervel, e, por essa razo, o tratamento computacional de
nmeros reais feito atravs de aproximaes racionais.
Adicionalmente, sem perda de generalidade, conveniente considerar que todos
os conjuntos considerados ou so conjuntos de nmeros naturais (subconjuntos de Nat)
ou so linguagens em algum alfabeto conhecido (subconjuntos de *). Sabemos que
*, Nat e seus subconjuntos so enumerveis, e que existe uma bijeo entre quaisquer
1
Walter S. Brainerd, Lawrence H. Landweber, Theory of Computation, John Wiley, 1974
18/113
J.L.Rangel - Ling. Formais - 2-2
dois conjuntos enumerveis infinitos. Isso significa que podemos, usando essa bijeo
como codificao, usar valores em um conjunto enumervel qualquer para substituir
valores em outro. Em particular, a codificao atravs de nmeros naturais (numerao),
e a descrio atravs de cadeias de smbolos (muitas vezes conhecidos como
identificadores) so idias familiares.
Procedimentos. Vamos definir um procedimento como sendo uma sequncia finita de
instrues, e definir instruo como uma operao claramente descrita, que pode ser
executada mecanicamente, em tempo finito.
"mecanicamente" quer dizer que no h dvidas sobre o que deve ser feito;
"em tempo finito" quer dizer que no h dvidas de que a tarefa correspondente
instruo pode, em qualquer caso, ser levada at sua concluso.
Para descrever um procedimento podemos usar uma linguagem natural, uma
linguagem de programao, ou a linguagem normalmente usada em matemtica.
Frequentemente, usamos uma mistura de todas estas. Sobre a forma de descrever
instrues e procedimentos, suporemos apenas que existe uma linguagem, comum a
todos os interessados, em que instrues e procedimentos podem ser descritos sem
ambiguidades.
Como exemplos, citamos:
o algoritmo de Euclides para clculo do mximo divisor comum de dois nmeros
naturais;
um programa em FORTRAN que calcula a soma de dois nmeros;
a frmula que calcula as razes da equao do segundo grau.
Exemplo: O procedimento a seguir pra e diz "sim" se o nmero inteiro i, dado como
entrada, for par e no negativo.
1. se i = 0, pare e diga "sim".
2. diminua o valor de i de duas unidades.
3. v para 1.
Note que se i for originalmente mpar ou negativo, o procedimento no pra. Na
definio de procedimento, dada acima, exigimos que cada instruo possa ser executada
em tempo finito, mas no exigimos nada de semelhante para os procedimentos. Isso
significa, em particular, que no poderamos usar como instruo em algum outro
procedimento uma chamada do procedimento do exemplo acima, uma vez que no
podemos garantir sua parada em tempo finito, para qualquer valor da entrada.
Exemplo: O procedimento a seguir pra e diz "sim" se o nmero inteiro i for par e no
negativo; pra e diz "no" nos demais casos.
19/113
J.L.Rangel - Ling. Formais - 2-3
1. se i = 0, pare e diga "sim".
2. se i < 0, pare e diga "no".
3. diminua o valor de i de duas unidades
4. v para 1.
6
001Z0ZUZ'
5
0010ZZUZ'
9 a 12: regras usadas para converter os smbolos da segunda metade. O smbolo
Z' (ou U') indica o ltimo smbolo ainda no convertido.
0010ZZUZ'
11
0010ZZU'0
10
0010ZZ'10
9
0010Z'010
13 a 14: regras usadas para converter o primeiro smbolo da segunda metade
0010Z'010
13
00100010
Pela definio de linguagem de uma gramtica, s nos interessam as sequncias
de terminais que so obtidas a partir do smbolo inicial S, usando as regras de produo
da gramtica. Por essa razo, a ordem em que as regras so aplicadas no importante.
Uma outra derivao possvel para 00100010, em que as mesmas regras so usadas em
uma ordem diferente
S
1
0ZS
1
0Z0ZS
5
00ZZS
2
00ZZ1US
6
00Z1ZUS
6
001ZZUS
3
001ZZU0Z'
7
001ZZ0UZ'
5
001Z0ZUZ'
5
0010ZZUZ'
11
0010ZZU'0
10
0010ZZ'10
9
0010Z'010
13
00100010
Outro fato sem importncia a existncia de "becos sem sada", isto ,
sequncias derivveis de S que no levam a nenhuma sequncia de terminais, no
contribuindo, portanto, para a linguagem. Por exemplo, considere a derivao:
S
1
0ZS
1
0Z0ZS
2
0Z0Z1US
3
0Z0Z1U0Z'
13
0Z0Z1U00
Note que a regra 13 foi aplicada "precocemente", de forma que as ocorrncias restantes
dos smbolos Z e U no podem mais ser convertidas em ocorrncias de 0 e 1.
Entretanto, como nenhuma sequncia de terminais pode ser obtida a partir de
0Z0Z1U00, o fato de que 0Z0Z1U00 pode ser derivada a partir de S no introduz na
linguagem nenhum elemento indevido. (0Z0Z1U00 apenas uma forma sentencial
intil da gramtica.)
A linguagem L no livre de contexto, mas ainda no dispomos dos mecanismos
para provar este fato.
o
Uma das principais motivaes da definio de gsc vem do teorema abaixo: a
restrio nos comprimentos dos lados esquerdo e direito das regras tem exatamente a
finalidade de garantir a recursividade das linguagens sensveis ao contexto. Entretanto,
observamos que a recproca do teorema no verdadeira, ou seja existem linguagens
recursivas que no so sensveis ao contexto. Este ltimo fato ser demonstrado
posteriormente.
Teorema: Toda lsc um conjunto recursivo.
Dem.: Sejam G = <N, , P, S> uma gsc, e L = L(G). Devemos, pela definio de
conjunto recursivo, mostrar que existe um algoritmo que, quando recebe como entrada
30/113
J.L.Rangel - Ling. Formais - 3-7
uma cadeia arbitrria x *, indica se ou no verdade que x L, parando e emitindo
respectivamente "sim" ou "no".
Sabemos que uma gsc pode ter uma regra S , se S no aparecer direita em
nenhuma regra. Para cada uma das outras regras, o comprimento do lado esquerdo no
pode ser maior que o do lado direito, e cada aplicao da regra pode manter ou aumentar
o comprimento, mas nunca diminu-lo. Portanto, para considerar todas as derivaes que
podem levar a uma sequncia x, basta considerar as formas sentenciais de comprimento
menor ou igual ao de x: se x , S * * x implica que 1 | | | x |. Esta idia est
aplicada no algoritmo a seguir:
1. Se x , v para 4.
2. Se P contm uma regra S , pare e diga "sim".
3. Pare e diga "no".
4. Faa X = { S }, e Y = .
5. Se x X, pare e diga "sim"
6. Se X = , pare e diga "no"
7. Escolha uma cadeia qualquer em X, retire de X, e acrescente a Y
8. Para cada tal que , se Y, e se | | | x |, acrescente a X.
9. v para 5
O tratamento da entrada x = se resume a verificar se existe a regra correspondente
S; para as demais entradas, todas as possibilidades so consideradas, e uma forma
sentencial s eliminada se j foi considerada antes (pertence a Y), ou se longa demais
(comprimento maior que o de x). Durante a execuo do algoritmo, X guarda as formas
sentenciais que ainda devem ser consideradas. Note que se trata de um algoritmo: em
cada execuo do passo 7, escolhida uma cadeia de comprimento menor ou igual ao
de x, e no so permitidas repeties.
o
Exemplo: Considere a gsc G com noterminais S e T, terminais a, b e c, smbolo inicial
S e regras
S aSa | bSb | T
T cT | c
(Note que G tambm uma glc.) Seja x = aabbb. Para determinar se x L(G), so
consideradas as formas sentenciais abaixo, que compem o conjunto Y, ao final da
execuo:
{ S, aSa, bSb, T, aaSaa, abSba, aTa, baSab, bbSbb, bTb, cT, c, aaTaa, abTba,
acTa, aca, baTab, bbTbb, bcTb, bcb, ccT, cc, aacaa, abcba, accTa, acca,
bacab, bbcbb, bccTb, bccb, cccT, ccc, accca, bcccb, ccccT, cccc, ccccc }
Fica como exerccio a execuo passo a passo do algoritmo, mostrando que x L(G).
o
Teorema: Toda linguagem tipo 0 um conjunto recursivamente enumervel.
Dem.: Seja G = <N, , P, S> uma gramtica (tipo 0). O procedimento abaixo enumera
os elementos de L(G).
31/113
J.L.Rangel - Ling. Formais - 3-8
1. Faa X = { S }
2. Emita todos os elementos X *.
3. Faa Y = { | X e }
4. Faa X = Y
5. v para 2.
A cada iterao do procedimento acima, X contm todas as sequncias derivveis de S
em um passo adicional. Assim, se S * x em n passos, em n passos o procedimento
emitir x.
o
Outros resultados sobre as classes de linguagens ainda dependem de resultados
que sero apresentados posteriormente. Em particular, mostraremos posteriormente que
todo conjunto r. e. uma linguagem tipo 0, e apresentaremos os exemplos que mostram
que as demais incluses entre as classes de linguagens so prprias.
Gramticas livres de contexto, gramticas sensveis ao contexto, e regras com lado
direito vazio. Retomamos aqui o problema das regras com lado direito vazio em glc's e
gsc's. Como j vimos anteriormente, a definio de glc permite indiscriminadamente a
presena de regras A, onde A um noterminal; essas regras podem violar a restrio
da definio de gsc, uma vez que a nica regra permitida com lado direito vazio uma
regra S, desde que o smbolo inicial S no aparea direita em nenhuma regra.
Dessa maneira, no imediato que toda llc uma lsc, uma vez que uma glc pode
no satisfazer a definio de gsc.
Esta seo tem como principal finalidade mostrar que cada glc pode ser
transformada em outra glc equivalente, que satisfaz a definio de gsc. Como corolrio
desse fato, temos que toda llc tambm uma lsc.
Noterminais anulveis. Dizemos que um noterminal A de uma glc G anulvel se
possvel derivar a cadeia vazia a partir de A, ou seja, se A * .
Lema: Dada uma gramtica livre de contexto G = <N, , P, S>, o algoritmo a seguir
determina quais so os noterminais anulveis de G, isto , quais so os noterminais A a
partir dos quais pode ser derivada a cadeia vazia .
Dem.: Considere o algoritmo:
1. Faa X = { A N | A P }
2. Repita o passo 3 at que nenhum elemento novo possa ser acrescentado a X:
3. Para cada regra BX
1
X
2
X
n
, se todos os smbolos X
1
, X
2
, X
n
pertencem a X, acrescente B a X.
Claramente, ao final da execuo do algoritmo, X contm exatamente os noterminais
anulveis da gramtica considerada.
o
Teorema: Para qualquer gramtica livre de contexto G existe uma gramtica livre de
contexto G', equivalente a G, que satisfaz a definio de gramtica sensvel ao contexto.
32/113
J.L.Rangel - Ling. Formais - 3-9
Dem.: Seja G = <N, , P, S>. Execute o algoritmo anterior para determinar quais os
noterminais anulveis de G. Seja S' um smbolo novo, no pertencente a N ou a .
Defina a gramtica G' = <N {S'}, , P', S'>, sendo P' como obtido como
descrito a seguir:
1. Inicialmente, faa P' = P.
2. Repita o passo 3 enquanto for possvel acrescentar regras novas a P'.
3. Para cada regra A B de P', se B anulvel, acrescente A a P'.
4. Retire de P' todas as regras com lado direito vazio.
5. Acrescente a P' a regra S' S.
6. Se S anulvel, acrescente a P', alm da regra acima, a regra S' .
(Se acrescentada, esta ser a nica regra com lado direito vazio.)
Claramente, a gramtica G' satisfaz as definies vistas de glc e de gsc. Note que,
como S' um smbolo novo, no ocorre direita em nenhuma das regras de G'.
Resta assim provar que G e G' so equivalentes. Para isto, observamos que o uso
das regras- em G corresponde ao uso de regras mais curtas em G': em vez de usar uma
regra de G, que introduz (ocorrncias de) noterminais anulveis, e depois usar as regras
necessrias para a transformao desses noterminais anulveis em , usamos de sada
uma regra mais curta de G', em que as correspondentes ocorrncias desses noterminais
anulveis no aparecem (ver passo 3 do algoritmo acima). Na outra direo,
similarmente, o uso de uma regra mais curta pode ser substitudo pelo uso da regra mais
longa de que se originou, seguida pelo uso das regras necessrias para transformar os
noterminais que se deseja anular na sequncia vazia.
o
Exemplo: Considere a gramtica G, com o conjunto de regras P a seguir:
S ABC | ABD
A aA |
B Bb | AC
C CC | c |
D d
Para a aplicao do algoritmo acima, temos sucessivamente os seguintes valores para o
conjunto X:
{ A, C } regras A e C
{ A, B, C } regra B AC
{ A, B, C, S } regra S ABC
at que X atinge seu valor final: X = { S, A, B, C }.
Na construo do conjunto P' de regras da gramtica G', temos inicialmente P' = P:
S ABC | ABD
A aA |
B Bb | AC
C CC | c |
D d
33/113
J.L.Rangel - Ling. Formais - 3-10
Retirando as ocorrncias de noterminais anulveis, as seguintes regras so
acrescentadas:
S BC | AC | AB | BD | AD | C | B | A | D |
A a
B b
B A | C |
C C
As regras com lado direito vazio so ento retiradas, as regras S'S, e S' so
acrescentadas, j que S X. Ao final, temos as seguintes regras em P':
S' S |
S ABC | ABD | BC | AC | AB | BD | AD | C | B | A | D
A aA | a
B Bb | AC | b | A | C
C CC | c | C
D d
(A regra C C obviamente intil.)
Podemos agora comparar uma derivao em G com a correspondente derivao
em G'. Considere a seguinte derivao em G:
S ABD aABD aBD aACD aCD aD ad
A aplicao de S ABD introduz uma ocorrncia de B que depois anulada; o
mesmo acontece com a aplicao da regra A aA. As regras correspondentes em G'
so, portanto, S AD e A a. As duas derivaes correspondentes, em G e G',
podem ser representadas pelas rvores de derivao a seguir.
S S
A B D A D
a A A C d a d
rvore de derivao em G rvore de derivao em G'
o
Corolrio: Toda glc cuja linguagem no contm a sequncia vazia pode ser
transformada em uma glc equivalente que no tem regras com lado direito vazio.
Dem.: Se o smbolo inicial da gramtica no anulvel, a construo vista na
demonstrao do teorema acima nos leva a uma gramtica sem nenhuma regra-.
o
34/113
J.L.Rangel - Ling. Formais - 3-11
Exemplo: Seja a gramtica G com regras
E T E'
T F T'
F ( E ) | a
E' + T E' |
T'
*
F T' |
De acordo com o algoritmo visto na demonstrao do teorema anterior, o conjunto dos
noterminais anulveis X = {E', T'}. Assim, a nova gramtica G' tem regras
S' E
E T E' | T
T F T' | F
F ( E ) | a
E' + T E' | + T
T'
*
F T' |
*
F
A converso de gramticas livres de contexto em gramticas sem regras vazias
perdeu parte de sua importncia, porque os algoritmos de anlise sinttica usados em
compiladores modernos (ao contrrio de algoritmos mais antigos) no fazem restries
ao uso de regras com lado direito vazio. Portanto, regras com lado direito vazio podem
ser usadas sem problemas nas gramticas de linguagens de programao, usadas para
projeto e implementao de compiladores.
(reviso de 27fev97)
35/113
J. L. Rangel, L. C. Guedes - Ling. Formais - 4-1
Linguagens Formais
Captulo 4: Autmatos finitos e expresses regulares
com Luiz Carlos Castro Guedes
4.1 - Introduo
Neste captulo estudaremos uma mquina (um procedimento aceitador, ou
reconhecedor), chamada autmato finito (af). A palavra finito includa no nome para
ressaltar que um af s pode conter uma quantidade finita e limitada de informao, a
qualquer momento. Essa informao representada por um estado da mquina, e s
existe um nmero finito de estados.
Essa restrio faz com que o af seja severamente limitado na classe de linguagens
que pode reconhecer, composta apenas pelas linguagens regulares, como mostraremos
neste captulo.
Duas verses do af so estudadas aqui: o af determinstico (afd) e o af no
determinstico (afnd). Este captulo mostra que uma linguagem regular pode ser definida
de quatro formas:
atravs de uma gramtica regular (definio);
atravs de um afd que reconhece a linguagem;
idem, atravs de um afnd;
atravs de uma expresso regular, um mecanismo a ser introduzido com essa
expressa finalidade.
4.2 - Autmato finito determinstico
Como observado acima, a informao que um af guarda sobre a entrada (mais
precisamente sobre a parte da entrada j lida) representada por um estado, escolhido
em um conjunto finito de estados. A definio formal de automato finito, na sua verso
determinstica dada a seguir.
Definio. Um Autmato Finito Determinstico (afd) M, sobre um alfabeto um
sistema (K, , , i, F), onde
K um conjunto de estados finito, no vazio;
um alfabeto de entrada (finito)
: K K a funo de transio
iK o estado inicial
FK o conjunto de estados finais.
O nome determinstico faz referncia ao fato de que uma funo (tambm
chamada funo prximo-estado), que determina precisamente o prximo estado a ser
assumido quando a mquina M se encontra no estado q e l da entrada o smbolo a: o
estado (q, a).
36/113
J. L. Rangel, L. C. Guedes - Ling. Formais - 4-2
De forma simplificada, podemos dizer que um afd aceita uma cadeia se, partindo
do estado inicial, e mudando de estado de acordo com a funo de transio, o afd
atinge um estado final ao terminar de ler a cadeia. Uma das maneiras de visualizar o
funcionamento de um afd atravs de um controle finito que l smbolos de uma fita de
entrada (onde se encontra a cadeia de entrada), sequencialmente, da esquerda para a
direita. Os elementos do conjunto de estados K representam os estados possveis do
controle finito. A operao se inicia no estado inicial i, lendo o primeiro smbolo da fita
de entrada. Por convenincia, considera-se que a cabea de leitura se move sobre a fita,
ao contrrio do que seria de se esperar.
A Figura 4.1 representa um afd cujo controle est no estado q, e que est lendo o
quarto smbolo da cadeia de entrada, um b.
Fig. 4.1 - Autmato Finito
Exemplo 1: Considere o afd M = (K, , , i, F), onde temos
K = { q0, q1, q2, q3 }
= { a, b }
i = q0
F = { q3 }
e onde a funo de transio : { q0, q1, q2, q3 } { a, b } { q0, q1, q2, q3 } dada
pela tabela abaixo
a b
q0 q1 q2
q1 q0 q3
q2 q3 q0
q3 q2 q1
Alternativamente, podemos representar o afd M por um diagrama de transies,
ou diagrama de estados, como o da Fig. 4.2. Note que o diagrama de transies
determina completamente o automato M, atravs de algumas convenes:
os estados so os ns do grafo, ou seja, K = { q0, q1, q2, q3 };
o estado inicial indicado pela seta, ou seja, i = q0;
os estado finais so indicados pelo crculo duplo: q3 o nico estado final, ou
seja, F = { q3 };
37/113
J. L. Rangel, L. C. Guedes - Ling. Formais - 4-3
as transies so as indicadas pelas arestas: (q0, a) = q1, (q0, b) = q2,
(q1, a) = q0, etc, ou seja, a mesma funo representada pela tabela acima.
Cada estado de um af corresponde a uma determinada informao sobre a parte da
cadeia de entrada j lida. No caso do exemplo, a informao pode ser descrita em frases
curtas, mas isso nem sempre acontece. Para o estado q2, por exemplo, podemos dizer
"se o estado atingido q2,
o nmero de smbolos a j lidos par, e
o nmero de smbolos b j lidos mpar".
(Note que 0 par.)
Fig. 4.2 - afd para o Exemplo 1
Em resumo, temos:
nmero de a's nmero de b's
q0 par par
q1 mpar par
q2 par mpar
q3 mpar mpar
A linguagem aceita ou reconhecida por M (ver definio abaixo) a linguagem formada
pelas cadeias em que os nmeros de a's e de b's so ambos mpares. Isso se deve ao fato
de que o nico estado final q3.
Por exemplo, a cadeia abaa da linguagem de M, porque, com essa cadeia, os seguintes
estados so atingidos: q0, q1, q3, q2, q3. Como o ltimo estado final, a cadeia aceita.
A linguagem de um afd. Para definir a linguagem L(M), a linguagem das cadeias aceitas
ou reconhecidas pelo afd M, podemos definir inicialmente uma configurao de M como
sendo um par (q, x) K
*
, composto pelo estado corrente (o estado atual da
mquina) e pela cadeia x, a parte da entrada que ainda no foi lida. Como observado, o
38/113
J. L. Rangel, L. C. Guedes - Ling. Formais - 4-4
estado representa a parte j lida da cadeia de entrada. A configurao (i, x) a
configurao inicial de M para a cadeia x; qualquer configurao (q, ) uma
configurao final se q F. A mudana de configurao caracterizada pela relao
|, definida abaixo:
(q, ax) | (p, x) se e somente se (q, a) = p
ou seja, se tivermos (q, a) = p, e se M estiver no estado q, lendo um smbolo a da cadeia
de entrada, M mover a cabea de leitura uma posio para a direita e ir para o estado
p. O smbolo a, depois de lido, no precisa mais aparecer na configurao. Podemos
agora definir a linguagem L(M) por
L(M) = { x
*
| (i, x) |
*
(f, ), com f F }
Como em casos anteriores, |
*
indica o fechamento reflexivo-transitivo da
relao, no caso a relao | de mudana de configurao, indicando que a
configurao final pode ser atingida em zero ou mais passos.
Exemplo 1: (continuao) Para mostrar que abaa L(M), basta observar que
(q0, abaa) | (q1, baa) | (q3, aa) | (q2, a) | (q3, ),
porque q3 final. Por outro lado, como
(q0, abab) | (q1,bab) | (q3, ab) | (q2, b) | (q0, ),
abab no pertence a L(M).
Lema 1: Toda linguagem reconhecida por um afnd reconhecida por um afnd que no
tem transies com .
Demonstrao: Seja M = (K, , , i, F) um afnd qualquer. Vamos construir um afnd
M' = (K, , ', i, F') equivalente a M, isto L(M') = L(M). Para isso vamos "simular" o
efeito das transies com de duas maneiras:
se tivermos a , (p
1
, ) = p
2
, e (p
2
, a) = q, acrescentaremos a ' uma
transio de p
1
para q com a, ou seja, acrescentaremos q ao conjunto '(p
1
, a);
se tivermos (p
1
, ) = p
2
, e p
2
F, acrescentaremos p
1
a F.
(ver figura abaixo)
Isso deve ser feito repetidamente enquanto novas transies forem acrescentadas a ', e
enquanto novos estados forem acrescentados a F. Aps isso, retiramos de as transies
com , e chamamos os resultados de ' e F'.
(Q, a) (q, a)
q Q
U
para cada a . A aceitao nas duas mquinas se d de forma paralela:
M aceita x, e temos em M (i, x) |* (f, ), com f F
M' aceita x, e temos em M' (i', x) |* (Q, ), com Q F
A ligao entre as duas sequncias de configuraes feita pelo estado f Q.
O restante da demonstrao consiste na prova de que dada uma das sequncias de
configuraes, possvel construir a outra, e vice-versa.
Observamos que em geral no necessrio levar em considerao todos os estados de
M', bastando apenas considerar aqueles que so acessveis a partir de i'. Se M tem n
estados, M' tem um mximo terico de 2
n
estados, mas em geral apenas uma frao
desses estados acessvel a partir do estado inicial i'.
Exemplo 4 (continuao): Podemos construir um afd M'' a partir de M', como descrito
na demonstrao do Lema 2. M'' ser equivalente a M (Exemplo 3) e a M'.
Temos: i'' = { A }. A tabela abaixo mostra a funo ''. Note que os 251 estados no
acessveis a partir de { A } foram ignorados. O afd pode ser visto tambm na Fig. 4.7.
'' a b
{ A } { C } { G }
{ C } { C, D } { C }
{ G } { G } { G, H }
{ C, D } { C, D } { C }
{ G, H } { G } { G, H }
Os estados finais de M'' que precisam ser considerados so, portanto, {C, D} e {G, H},
que contm os estados finais D e H de M'. Para comparao, a tabela abaixo apresenta as
configuraes assumidas por M, M' e M'' na aceitao de ababa.
46/113
J. L. Rangel, L. C. Guedes - Ling. Formais - 4-12
Fig. 4.7 - afd para o Exemplo 4
M M' M''
(A, ababa) (A, ababa) ({A}, ababa)
(B, ababa) --- ---
(C, baba) (C, baba) ({C}, baba)
(C, aba) (C, aba) ({C}, aba)
(C, ba) (C, ba) ({C, D}, ba)
(C, a) (C, a) ({C}, a)
(D, ) (D, ) ({C, D}, )
(I, ) --- ---
Exerccio 8: Construa um afd mnimo que aceite a linguagem L no alfabeto = {a, b},
com L ={ cdxcd | c, d , x * }
53/113
J. L. Rangel, L. C. Guedes - Ling. Formais - 4-19
4.6 - Equivalncia entre autmatos finitos e gramticas regulares
Um dos resultados que devemos estabelecer neste captulo que a classe de
linguagens reconhecidas por automatos finitos a classe das linguagens regulares. J
sabemos, da seo anterior, que a classe das linguagens aceitas por af determinsticos
exatamente a mesma classe das linguagens aceitas por af no determinsticos. Trata-se,
portanto de estabelecer dois resultados simples, expressos atravs dos Teoremas 4.6 e
4.7, a seguir.
Teorema 4.6: Toda linguagem regular aceita por um afnd.
Demonstrao: Seja L uma linguagem regular. Portanto, L = L(G), para alguma
gramtica regular G = ( N, , P, S ). Vamos construir um afnd M = ( K, , , i, F ) que
aceita a linguagem L(G). Temos: K = N U { f }, i = S, F = { f }. Ou seja, os estados de
M sero os no terminais de M, mais um estado f criado para ser o nico estado final. O
estado inicial o smbolo inicial de G. (Note que f deve ser um smbolo novo, para no
causar confuso.)
As transies de M so dadas pelas regras de G:
Inicialmente, faa (A, a)= , para todos os noterminais A e para todos os smbolos a,
e para a = . A seguir, para todas as regras de G,
se G tem uma regra A a B, acrescente uma transio de A para B com o
smbolo a, ou seja, acrescente B a (A, a).
se G tem uma regra A a, acrescente uma transio de A para f com o smbolo
a, ou seja, acrescente f a (A, a).
se G tem uma regra A , acrescente uma transio de A para f com , ou seja,
acrescente f a (A, ).
Devemos mostrar que, para qualquer x *, M aceita x sse x L(G). A demonstrao
se completa pela verificao de que a sequncia de configuraes (S, x) |* (f, ) em M
corresponde exatamente sequncia de passos da derivao S * x em G.
) uma er.
ER6. Se uma er, ento (*) uma er.
Naturalmente, uma er se e somente se isso pode ser provado a partir de ER1 ER6.
Usualmente, so omitidos os parenteses de er's, de acordo com a ordem de precedncia
*
e considerando os operadores como associativos esquerda. Alm disso, o smbolo
frequentemente omitido.
Exemplo 10: Seja = {a, b} e seja a expresso regular = (ab)* a b b, ou seja, com
todos os parnteses, = (((((ab)*)
a)
b)
a de 4, 1 e ER5
6. (ab)*
b de 5, 2 e ER5
7. (ab)*
b de 6, 2 e ER5.
Definio. A linguagem L[] associada a uma er (ou denotada pela er) definida de
forma recursiva, seguindo a definio de er:
ER1. L[] = ;
ER2. L[] = {};
ER3. para cada a , L[a] = {a};
ER4. L[()] = L[] L[];
ER5. L[(
)] = L[]
L[];
ER6. L[(*)] = (L[])*.
Exemplo 11: Seja = (ab)*
a] = L[(ab)*]
L[a] = {a, b}*
{a} de 4, 1 e ER5
6. L[(ab)*
b] = L[(ab)*
a]
L[b] =
= {a, b}*
{a}
{ab} de 5, 2 e ER5
7. L[(ab)*
b] = L[(ab)*
b]
L[b] =
= {a, b}*
{ab}
{abb} de 6, 2 e ER5
Assim, L[] a linguagem das cadeias que terminam em abb.
L*).
Exemplo 12: Suponhamos que desejamos provar que x = abaabb L[], para a er
=(ab)*
a] de 8 e 1
10. abaab L[(ab)*
b] de 9 e 3
11. abaabb L[(ab)*
b] de 10 e 3
Note que cada ocorrncia de um smbolo (a ou b) em x fica associada a uma ocorrncia
do mesmo smbolo em . No fundo a construo da prova de que x L[] consiste
exatamente na descoberta de uma associao adequada. No exemplo acima, a nica
associao possvel est indicada abaixo, pela numerao das ocorrncias de smbolos, na
er e na cadeia considerada:
= (a
1
b
2
)* a
3
b
4
b
5
, x = a
1
b
2
a
1
a
3
b
4
b
5
Em outros casos, podem ser possveis vrias associaes. Por exemplo, considere o
alfabeto = {a, b, c}, a er = (ab)*
(bvc)* e a cadeia y = bb. Neste caso, temos
= (a
1
b
2
)*
(b
3
c
4
)*
e podemos ter y = b
2
b
2
, ou y =b
2
b
3
, ou ainda, y =b
3
b
3
.
Exerccio 12: Mostre que, dada uma er , sempre possvel construir uma er
equivalente a , de forma que ou = , ou = , e no contm o smbolo .
Sugesto: considere as equivalncias
( )* *
( )
)
( ) ( )
Exerccio 13: Suponha a seguinte definio: uma er ambgua se para algum xL[],
existe mais de uma associao possvel entre as ocorrncias de smbolos em x e em .
Sejam as expresses
= (a b)*
(b c)*
= (a b)*
(a
a b
b)
(a b)*
58/113
J. L. Rangel, L. C. Guedes - Ling. Formais - 4-24
- Mostre que e so ambguas, de acordo com a definio dada.
- Construa er's equivalentes a e que no sejam ambguas.
Teorema 4.8: Toda linguagem denotada por uma expresso regular regular.
Demonstrao. Seja uma er qualquer. Vamos mostrar que L() regular construindo
um afnd M() que aceita L(), preparando para uma demonstrao por induo na
estrutura de .
Por simplicidade, vamos construir todos os afnd M() considerados nesta demonstrao
com exatamente um estado final, distinto do estado inicial. Para uma er no elementar,
o afnd M() ser construdo a partir dos afnd's das er's componentes. Para evitar a
necessidade de nomear cada estado de cada uma dessas mquinas, vamos indicar a forma
de composio graficamente. Por conveno, sempre representaremos o estado inicial
esquerda, e o estado final direita.
ER1. O afnd M() que aceita
ER2. O afnd M() que aceita L[]
ER3. O afnd M(a) que aceita L[a], a
ER4. Se e so er's, podemos supor (pela Hiptese de Induo) que j esto
construdos M() e M(). O afnd M( ) que aceita L[ ] obtido acrescentando
um estado inicial e um final novos a M() e M(). As novas transies so transies
com entrada do estado inicial novo para os antigos estados iniciais de M() e de M(),
e dos antigos estados finais de M() e de M() para o novo estado final. O resultado
59/113
J. L. Rangel, L. C. Guedes - Ling. Formais - 4-25
ER5. Se e so er's, podemos supor (pela Hiptese de Induo) que j esto
construdos M() e M(). O afnd M(
) que aceita L[
] obtido acrescentando
um estado inicial e um final novos a M() e M(). As novas transies so transies
com entrada do estado inicial novo para o antigo estado inicial de M(), do antigo
estado final de M() para o antigo estado inicial de M(), e do antigo estado final de
M() para o novo estado final. O resultado
ER6. Se uma er, podemos supor (pela Hiptese de Induo) que j est construdo
M(). O afnd M(*) que aceita * obtido acrescentando um estado inicial e um final
novos a M(). As novas transies so transies com entrada do estado inicial novo
para o antigo estado inicial de M() e para o novo estado final e do antigo estado final
de M() para o novo estado inicial.
60/113
J. L. Rangel, L. C. Guedes - Ling. Formais - 4-26
O restante da demonstrao deixado como exerccio.
Exemplo 13: Seja a er = (a b)* a. Vamos construir um afnd que aceita L(),
seguindo a construo indicada na demonstrao acima. Os passos intermedirios e os
resultados esto indicados nas tabelas a seguir
M(a) a b
inicial: A {B}
final: B
M(b) a b
inicial: C {D}
final: D
M(a b) a b
inicial: E {A, C}
A {B}
B {F}
C {D}
D {F}
final: F
61/113
J. L. Rangel, L. C. Guedes - Ling. Formais - 4-27
M((a b)*) a b
inicial: G {E, H}
E {A, C}
A {B}
B {F}
C {D}
D {F}
F {G}
final: H
M((a b)*
a) a b
inicial: I {G}
G {E, H}
E {A, C}
A {B}
B {F}
C {D}
D {F}
F {G}
H {A'}
A' {B'}
B' {J}
final: J
Note que a sub-expresso a ocorre duas vezes em M(), e porisso foi necessrio incluir
duas vezes M(a); para a segunda vez renomeamos os estados, que passaram a ser A' e B'.
Exerccio 14: Construa um afd mnimo para a linguagem denotada pela er do Exemplo
13, a partir do afnd M() construdo no exemplo.
Exerccio 15: Construa afd's mnimos que aceitem as linguagens denotadas pelas
expresses regulares do Exerccio 13,
= (a b)*
(b c)*
= (a b)*
(a
a b
b)
(a b)*
Teorema 4.9: Toda linguagem regular denotada por uma expresso regular.
Demonstrao: ver referncia citada.
para
tratar caminhos de comprimento maior que 1, e o operador * para tratar laos. Embora a
construo seja interessante, na prtica o uso normalmente feito de er's para
62/113
J. L. Rangel, L. C. Guedes - Ling. Formais - 4-28
especificao de linguagens regulares, e muito mais frequente a construo de afd's a
partir de er's, do que a construo inversa.
4.8 - O Lema do Bombeamento para linguagens regulares
Como mencionado anteriormente, precisamos de um resultado que nos permita
demonstrar que algumas linguagens no so regulares. Este resultado o "Lema do
Bombeamento", ou "Pumping Lemma", que nos diz que qualquer cadeia suficientemente
longa z de uma linguagem regular pode ser decomposta em trs partes: z = uvw, de
maneira que podemos construir outras cadeias da linguagem pela repetio da parte
central v: todas as cadeias da forma u v
i
w so tambm da linguagem. Ou seja, podemos
acionar a bomba quantas vezes quisermos, para criar quantas sentenas novas da
linguagem desejarmos: uw, uvvw, uvvvw, ... .
Para mostrar que uma linguagem no regular, mostramos que no h como
decompor uma cadeia (qualquer, arbitrariamente longa) da linguagem de forma que seja
possvel bombear e continuar na linguagem.
Teorema 4.10: (Lema do Bombeamento) Seja L uma linguagem regular. Ento, existe
um natural n tal que qualquer cadeia z de L com comprimento maior ou igual a n pode
ser decomposta em trs cadeias u, v e w (z = uvw) de forma que
|uv| n
v
para qualquer i 0, u v
i
w L
Demonstrao: A demonstrao se baseia no fato de que para as cadeias longas z
necessrio usar pelo menos um loop de estados num afd que aceite a linguagem. Assim,
os smbolos de u so usados para chegarmos a um estado q do loop; os smbolos de v
so usados para dar a volta no loop, de volta ao estado q; os smbolos de w so usados
para ir de q at um estado final. Portanto, podemos dar quantas voltas no loop
quisermos, e repetir v um nmero qualquer i de vezes: u v
i
w.
As cadeias curtas (comprimento < n) devem ser excludas porque podem ser
aceitas sem passar por nenhum loop.
A demonstrao completa pode ser encontrada em [HopUll79].
Exemplo 14: Seja a linguagem regular L = L[] = L[], com = 1(01)* e = (10)*1.
Considere a cadeia z=10101, pertencente a L. Podemos decompor a cadeia, da forma
descrita no teorema acima, de diversas formas. Por exemplo:
u = 1 v = 01 w = 01
u = 10 v = 10 w = 1
u = v = 1010 w = 1
Note que todas as cadeias das formas 1(01)
i
01, 10(10)
i
1, (1010)
i
1 pertencem a L.
63/113
J. L. Rangel, L. C. Guedes - Ling. Formais - 4-29
Exerccio 16: (baseado no Exemplo 14)
Mostre que e so equivalentes.
Estime o valor de n (Teorema 4.10) para L.
Mostre todas as formas de decomposio de z que satisfazem o Teorema.
L
2
regular. Sejam e er's tais
que L()=L
1
e L() = L
2
. Portanto, L
1
L
2
= L(
) tambm regular.
(e) Vamos mostrar que se L regular, o fechamento L* tambm regular. Seja a uma er
tal que L() = L. Ento L(*)* = (L())* = L* tambm regular.
Exerccio 19: Mostre que, na construo usada na demonstrao do Teor. 4.11 parte
(c), no pode ser usado um afnd.
Sugesto: Considere o afnd
(reviso de 27fev97)
65/113
J. L. Rangel Linguagens Formais 5-1
Linguagens Formais
Captulo 5: Linguagens e gramticas livres de contexto
Jos Lucas Rangel, maio 1999
5.1 - Introduo
Vimos no captulo 3 a definio de gramtica livre de contexto (glc) e de
linguagem livre de contexto (llc). As regras de uma glc so da forma A , onde
uma cadeia qualquer de terminais e noterminais, possivelmente vazia. Como vimos,
o que caracteriza a gramtica livre de contexto a propriedade de que o smbolo no
terminal A pode ser substitudo pela cadeia do lado direito da regra, onde quer que
A ocorra, independentemente do contexto, isto , do resto da cadeia que est sendo
derivada. Por essa razo, possvel representar derivaes em glc's atravs de rvores
de derivao: para usar a regra A , acrescentamos rvore, como filhos de A, ns
correspondentes aos smbolos de .
5.2 - rvores de derivao
Uma rvore de derivao uma rvore composta da seguinte maneira:
a raiz tem como rtulo o smbolo inicial S da gramtica.
a cada n rotulado por um noterminal A corresponde uma regra de A. Se a
regra for A X
1
X
2
... X
m
, os filhos do n so rotulados, da esquerda para a
direita, por X
1
, X
2
, ..., X
m
. (cada um dos X
i
pode ser um terminal ou um
noterminal.)
um n rotulado por um terminal sempre uma folha da rvore, e no tem
filhos.
Os ns interiores da rvore so sempre (rotulados por) noterminais. Se a um n
rotulado pelo noterminal A for aplicada a regra A , considera-se o n como
interior, embora ele tenha zero filhos. Na representao grfica da rvore, costume
indicar, neste caso, os zero filhos atravs de um n , que no contribui para o
resultado da rvore.
Uma sub-rvore de uma rvore de derivao um n da rvore com todos seus
descendentes, as arestas que os conectam e seus rtulos. Uma sub-rvore sempre
corresponde a uma derivao parcial, a partir do smbolo que rotula a raiz da sub-
rvore. O resultado de uma rvore de derivao a cadeia formada pelos terminais
(que aparecem como folhas da rvore), lidos da esquerda para a direita. Note que a
ordenao dos filhos de cada n fundamental para que se possa definir a ordenao
das folhas da rvore.
Exemplo 5.1: Seja a gramtica G, dada por suas regras:
S AB
A aaA |
B Bbb |
A rvore de derivao para a sequncia aaaabb est representada na Fig. 1. O
resultado da rvore aaaabb, sendo as regras escolhidas de acordo com a derivao
S B aaAB aaaaAB aaaaB aaaaBbb aaaabb.
66/113
J. L. Rangel Linguagens Formais 5-2
S
a a A B b b
A
B
a a A
a
Fig. 1 - rvore de derivao de aaaabb
Teorema 5.1: Seja G = (N, , P, S) uma glc. Ento, para qualquer cadeia x *,
x L(G) se e somente se existe uma rvore de derivao A na gramtica G, cujo
resultado x.
Demonstrao: Basta observar a correspondncia entre a substituio de noterminais
pelos lados direitos de suas regras na derivao e a criao dos filhos correspondentes
na rvore. Usando essa correspondncia possvel construir uma rvore de derivao
cujo resultado x a partir de uma derivao S * x; possvel tambm construir uma
derivao S * x a partir de uma rvore de derivao cujo resultado x. Os detalhes
da demonstrao so deixados como exerccio.
Observao. A partir de uma derivao. s possvel construir uma rvore; entretanto,
na direo oposta, possvel construir vrias derivaes, dependendo da ordem em
que os ns so considerados. O Exemplo 5.2 mostra algumas das vrias derivaes
que correspondem mesma rvore.
Derivaes esquerdas e direitas.
Diz-se que uma derivao uma derivao esquerda (leftmost derivation) se a cada
passo da derivao o noterminal A escolhido para aplicao de uma regra A for
sempre aquele que fica mais esquerda. Simetricamente, fala-se em derivao direita
(rightmost derivation) se o noterminal escolhido sempre o que estiver mais
direita.
Exemplo 5.2: Seja a gramtica G
0
abaixo, dada por suas regras. (Esta gramtica ser
usada em vrios exemplos, no que se segue.
E E + T | T
T T * F | F
F ( E ) | a
Considere a cadeia x = a*(a+a)+a. Temos abaixo trs derivaes de:
E E+T T+T T*F+T F*F+T a*F+T a*(E)+T
a*(E+T)+T a*(T+T)+T a*(F+T)+T a*(a+T)+T
a*(a+F)+T a*(a+a)+T a*(a+a)+F a*(a+a)+a
E E+T E+F E+a T+a T*F+a T*(E)+a
T*(E+T)+a T*(E+F)+a T*(E+a)+a T*(T+a)+a
T*(F+a)+a T*(a+a)+a F*(a+a)+a a*(a+a)+a
E E+T T+T T+F T*F+F T*F+a F*F+a
F*(E)+a a*(E)+a a*(E+T)+a a*(T+T)+a
a*(T+F)+a a*(F+F)+a a*(a+F)+a a*(a+a)+a
67/113
J. L. Rangel Linguagens Formais 5-3
Note que a primeira derivao uma derivao esquerda, e a segunda uma
derivao direita. Todas as trs derivaes correspondem mesma rvore de
derivao, apresentada na Figura 2. Como se pode observar, em todas elas aparecem
as mesmas regras, aplicadas nos mesmos lugares, variando apenas a ordem em que as
regras so aplicadas.
E
F
F
F
F
T
T
E
T
*
+
E
T
E
(
F
T
)
a
a
a
a
+
Fig. 2- rvore de derivao de a*(a+a)+a
Como todas as derivaes correspondentes mesma rvore de derivao
descrevem a mesma forma de construo da cadeia derivada - as mesmas regras
aplicadas nos mesmos lugares - consideramos que a forma de construo da cadeia
pode ser representada pela rvore ou por uma derivao esquerda, ou por uma
derivao direita. Entretanto, se existem duas ou mais rvores de derivao (duas ou
mais derivaes esquerdas, duas ou mais derivaes direitas), para a mesma cadeia,
consideramos que a gramtica no define de forma nica a maneira pela qual a cadeia
derivada, e dizemos que a gramtica ambgua.
Exemplo 5.3: Seja a gramtica G
1
, dada por suas regras:
E E + E | E * E | ( E ) | a
Pode-se verificar que G
1
equivalente a G
0
, vista no exemplo 5.2 acima. Entretanto,
diferentemente de G
0
, G
1
uma gramtica ambgua. Considere, por exemplo a cadeia
a+a*a. As duas derivaes (esquerdas) abaixo correspondem a duas rvores de
derivao distintas.
E E+E a+E a+E*E a+a*E a+a*a
E E*E E+E*E a+E*E a+a*E a+a*a
A construo das duas rvores fica como exerccio.
Uma linguagem livre de contexto cujas gramticas so todas ambguas
chamada uma gramtica inerentemente ambgua.
Exemplo 5.4: Sejam L
1
= {a
i
b
j
c
k
| i=j } e L
2
= {a
i
b
j
c
k
| j=k }. A linguagem L
definida por L = L
1
L
2
inerentemente ambgua. As linguagens L
1
e L
2
no so
inerentemente ambguas, como se pode ver pelas suas respectivas gramticas G
1
e G
2
.
68/113
J. L. Rangel Linguagens Formais 5-4
G
1
: S
1
T C
T a T b |
C c C |
G
2
: S
2
A V
A a A |
V b V c |
fcil construir um exemplo G de gramtica ambgua para L, a partir de G
1
e G
2
:
G: S S
1
| S
2
S
1
T C
T a T b |
C c C |
S
2
A V
A a A |
V b V c |
Para verificar que G ambgua, basta observar que todas as cadeias pertencentes
interseo M = L
1
L
2
= {a
i
b
j
c
k
| i=j=k } podem ser derivadas de duas formas
distintas, dependendo da regra inicial escolhida para a derivao. Por exemplo,
aabbcc pode ser obtida por uma das duas derivaes esquerdas abaixo:
S S
1
TC aTbC aaTbbC aabbC aabbcC
aabbccC aabbcc
S S
2
AV aAV aaAV aaV aabVc aabbVcc
aabbcc
Naturalmente, isto prova apenas que G ambgua, e no que todas as gramticas de L
so ambguas. Esta demonstrao no ser includa aqui.
Observamos tambm que M no uma llc. Isto ser visto no Exemplo 5.7.
5.3 - Simplificao de gramticas livres de contexto
No existe a possibilidade de simplificao de gramticas livres de contexto,
no mesmo sentido da minimizao de automatos finitos vista anteriormente. ,
entretanto possvel fazer uma simplificao que elimina todos os smbolos e regras
inteis da gramtica. Podemos dizer que um smbolo terminal intil quando no
aparece em alguma cadeia da linguagem; podemos dizer que um smbolo no terminal
intil quando no aparece em alguma derivao de alguma cadeia da linguagem.
Uma regra intil contm algum smbolo intil.
Em alguns casos, a gramtica ambgua, e algumas regras podem ser
removidas sem que a linguagem se altere, mas pode no ficar claro qual regra deve ser
considerada intil. Por exemplo, se tivermos
1, 2. S A X | Y C
3. X B C
4. Y A B
h duas maneiras de gerar ABC a partir de S. Quais as regras que devem ser retiradas?
1 e 3 ou 2 e 4? Tanto faz.
Todas as simplificaes que podem ser feitas, entretanto, no alteram a
essncia de uma gramtica: apenas a tornam mais limpa. Algumas transformaes de
gramticas visam obter uma gramtica equivalente inicial que tem alguma forma
particular, por exemplo, que simplifique a demonstrao de algum teorema. Para ver
alguns algoritmos para simplificao ou transformao de gramticas sugerimos a
mesma referncia citada anteriormente.
69/113
J. L. Rangel Linguagens Formais 5-5
O exemplo a seguir procura esclarecer alguns dos conceitos mencionados.
Exemplo 5.5: Uma gramtica com regras e smbolos inteis. Seja a gramtica
1, 2, 3: S A B | A C | B D
4, 5: A a A | a
6, 7: B b B | b
8, 9: C c D | d C
10, 11: Y y | z Z
12, 13: Z z | y Y
Smbolos no terminais acessveis:
Em derivaes a partir de S podem aparecer S A B C D (regras 1, 2, 3).
Smbolos no terminais produtivos:
Derivaes que levam a cadeias de terminais: A (regra 5), B (regra 7), Y (regra
10), Z (regra 11), S (regra 1, j que A e B so produtivos.)
Logo, todos os noterminais, exceto S A B so inteis. Retirando todas as regras que
fazem referncia a noterminais inteis, temos:
1: S A B
4, 5: A a A | a
6, 7: B b B | b
Os smbolos restantes podem ser considerados inteis: C D Y Z c d y z.
5.4 - O lema do bombeamento para linguagens livres de contexto.
Vamos examinar agora um resultado que nos permitir provar que algumas
linguagens no so livres de contexto. O resultado conhecido como Lema do
Bombeamento, ou Pumping Lemma, e semelhante ao resultado correspondente visto
para linguagens regulares.
Teorema 5.2: Lema do Bombeamento. Seja L uma llc. Ento, existe um nmero n,
que s depende de L, tal que qualquer cadeia z de L com comprimento maior ou igual
a n pode ser decomposta de maneira que z = uvwxy e
|vx| 1
|vwx| n
para todo i 0, uv
i
wx
i
y pertence a L.
Demonstrao (simplificada). Se L uma llc, existe uma glc G tal que L(G)=L. Se z
tem um comprimento suficientemente longo, no ser possvel gerar z sem que na
derivao de z ocorra um no terminal A repetido, de forma que a partir de A
derivada uma cadeia que contm outra ocorrncia de A. Para que isto ocorra, as duas
ocorrncias de A devem estar num mesmo caminho da raiz da rvore de derivao at
as folhas. (Cadeias mais curtas podem ser geradas sem que essa repetio acontea.)
Atravs (possivelmente) de uma rearrumao dos passos da derivao, temos
S * uAy * uvAxy * uvwxy
ou seja,
70/113
J. L. Rangel Linguagens Formais 5-6
S * uAy,
A * vAx,
A * w
Portanto, podemos derivar
i=0: uwy S * uAy * uwy
i=1: uvwxy S * uAy * uvAxy * uvAxy * uvwxy
i=2: uvvwxxy S * uAy * uvAxy * uvvAxxy * uvvwxxy
i=3: uvvvwxxxy S * uAy * uvAxy * uvvAxxy
* uvvvAxxxy* uvvvwxxxy
a
-1
a
-2
a
-3
a
-4
ou seja, por
(a
0
, a
-1
) (a
1
, a
-2
) (a
2
,a
-3
) (a
3
, a
-4
)
6. Vrias fitas. Podemos considerar uma mT com vrias fitas, a que podem ser
atribudas funes diferentes, caso desejado. Por exemplo, podemos considerar
que a mquina tem uma fita de entrada, uma fita de sada, e uma ou mais fitas de
memria. A simulao de uma mT com n fitas pode ser feita em uma mT com um
fita s, cujos smbolos so tuplas, que contm todos os smbolos de todas as fitas,
e marcas com as posies de todas as cabeas.
7. Mquinas de Turing no determinsticas. Para definir uma mquina no
determinstica, devemos considerar uma funo que pode oferecer mais de uma
possibilidade de transio, a partir de cada configurao. Uma mT no
determinstica pode ser simulada por uma mt determinstica. Isto ser descrito a
seguir.
Definio. Uma mquina de Turing no determinstica M pode ser definida por uma
tupla M = < K, , , , i, F >, onde K um conjunto (finito, no vazio) de estados,
95/113
Linguagens Formais - J. L. Rangel 7-12
o alfabeto (finito) de smbolos da fita, o alfabeto de smbolos de entrada, a
funo de transio, i K o estado inicial, e F K o conjunto de estados finais.
A funo de transio um mapeamento : K P(K {L, R}). Todos os
valores de so conjunto finitos.
Configurao. Da mesma maneira que para uma mT determinstica, uma
configurao de uma mT uma cadeia xqy, em que xy * o contedo da fita, sem
incluir nenhum dos brancos que existem direita, e qK o estado corrente.
Semelhantemente, a configurao inicial para a entrada x ix, e uma configurao xfy
final se o estado f final.
Mudana de configurao. A definio da relao mudana de configurao, |,
no oferece surpresas:
movimento para a direita:
se (p, b, R)(q, a), ento xqay | xbpy
caso particular: se (p, b, R)(q, ), ento xq | xbp
movimento para a esquerda:
se (p, b, L)(q, a), ento xcqay | xpcby
caso particular: se (p, b, L)(q, ), ento xcq | xpcb
Naturalmente, se (q, a)=, nenhuma configurao pode ser alcanada a partir
de uma configurao xqay, e a mquina pra. Caso particular: se a configurao for
xq, a mquina pra quando (q, )=.
Linguagem reconhecida por uma mT no determinstica. A linguagem aceita, ou
reconhecida por uma mT M definida por
L(M) = { x * | ix |* yfz, onde f F }
A aceitao se d quando o estado final atingido, no interessando em que
ponto da fita est a cabea, se h possibilidade de continuar a partir desse ponto, ou se
h outras configuraes no finais atingveis com a mesma entrada. Como nos outros
casos em que definimos mquinas no determinsticas, s nos interessa saber se existe
ou no a possibilidade de atingir um estado final.
Exemplo 7.6. A mT a seguir no determinstica. A linguagem aceita por essa
mquina { xx | x{0,1}* }.
A0BxR A1CxR AKxR
B0B0R B0DyL B1B1R
C0C0R C1C1R C1DyL
D0D0L D1D1L DxExR DyDyL
E0FxR E1GxR EyJyR
F0F0R F1F1R FyHyR
G0G0R G1G1R GyIyR
H0DyL HyHyR
I1DyL IyIyR
JyJyR JKxR
A escolha no determinstica feita em dois estados, B e C. Em ambos os casos, trata-
se de adivinhar qual o primeiro smbolo da segunda metade da cadeia xx. No caso do
96/113
Linguagens Formais - J. L. Rangel 7-13
estado B este smbolo um 0; no caso do estado C, trata-se de um 1. Os demais
smbolos so apenas conferidos nos estados H e I. Abaixo, um exemplo de
computao:
A11011101 xC1011101 x1C011101 x10C11101 x101C1101
x10D1y101 x1D01y101 xD101y101 Dx101y101 xE101y101
xxG01y101 xx0G1y101 xx01Gy101 xx01yI101 xx01Dyy01
xx0D1yy01 xxD01yy01 xDx01yy01 xxE01yy01 xxxF1yy01
xxx1Fyy01 xxx1yHy01 xxx1yyH01 xxx1yDyy1 xxx1Dyyy1
xxxD1yyy1 xxDx1yyy1 xxxE1yyy1 xxxxGyyy1 xxxxyIyy1
xxxxyyIy1 xxxxyyyI1 xxxxyyDyy xxxxyDyyy xxxxDyyyy
xxxDxyyyy xxxxEyyyy xxxxyJyyy xxxxyyJyy xxxxyyyJy
xxxxyyyyJ xxxxyyyyxK
Teorema 7.1. Os modelos determinstico e no determinstico da mquina de Turing
so equivalentes.
Dem. Basta mostrar como simular uma mT no determinstica M em uma mT
determinstica M. A fita de M conter diversas configuraes de M. Se alguma delas
for final, M aceitar sua entrada. O smbolo $ ser usado como separador de
configuraes.
1. Inicialmente, M encontra na sua fita a entrada x de M. Acrescentando marcas e o
estado inicial i de M, M' escreve na fita a configurao inicial de M para x, C
0
=ix, de
forma que a fita de M contm $C
0
$.
2. Para cada configurao C no considerada na fita, M' constri no fim da fita, as
configuraes atingveis a partir de C, separadas por $. Se M tem m opes de
escolha, e as configuraes atingveis so C
1
, C
2
, ... C
m
, neste passo a cadeia
$C
1
$C
2
$$C
m
$ acrescentada no final da fita.
3. Se alguma das configuraes de M construdas por M' for final, M' pra e aceita a
entrada.
Para construir as configuraes, observamos que no mximo trs smbolos so
alterados, quando se passa de uma configurao C para uma configurao C' em um
passo. Ou seja, boa parte do trabalho de construo de C' simplesmente um trabalho
de cpia.
Exerccio 7.5. Construa uma mquina determinstica que aceite a linguagem do
Exemplo 7.6, sem usar a construo sugerida no Teorema 7.1.
7.5 - Linguagens tipo 0 e conjuntos recursivamente enumerveis
Vamos agora caracterizar a classe de linguagens aceitas por mT's, mostrando
que se trata da mesma classe de linguagens geradas por gramticas (tipo 0), ou seja,
via tese de Church, que a classe dos conjuntos recursivamente enumerveis idntica
classe das linguagens tipo 0. Este resultado ser objeto dos dois teoremas a seguir.
Teorema 7.2: Toda linguagem tipo 0 recursivamente enumervel.
Demonstrao. Seja L uma linguagem tipo 0. Seja G uma gramtica tal que L = L(G).
Vamos descrever a construo de uma mt M, no determinstica, que aceita L(G).
97/113
Linguagens Formais - J. L. Rangel 7-14
M ignora sua entrada, e escreve $S$ no fim da fita. Em seguida, M simula uma
derivao em G escolhendo e aplicando no-deterministicamente uma regra em cada
passo. Para isso, escolhida a regra , M encontra (no-deterministicamente) uma
ocorrncia de e substitui esta ocorrncia por . Quando esta derivao tiver como
resultado a cadeia x, M ter em sua fita duas cpias de x que devem ser comparadas.
Neste ponto M passa para um estado final.
Uma outra possibilidade de construo de M atravs de uma mT determinstica, que
em vez de "adivinhar" as regras a serem usadas, testa todas, sucessivamente.
O prximo resultado a recproca do teorema acima.
Teorema 7.3. Toda linguagem recursivamente enumervel tipo 0.
Demonstrao. Seja L uma linguagem r.e. Portanto, L aceita por alguma mT
(determinstica) M. Vamos mostrar que L tipo 0, construindo uma gramtica (tipo 0)
G que aceita L. Uma derivao em G simula uma computao de M, e tem o seguinte
aspecto:
S * ix$x * yfz$x * x
A partir do smbolo inicial S, derivamos uma cadeia da forma ix$x, onde i o estado
inicial de M, de forma que ix a configurao inicial de M com entrada x. A
simulao da computao de M ser feita a partir dessa configurao inicial. A
segunda cpia de x fica inalterada at o final. A cadeia x contm apenas smbolos do
alfabeto de entrada de M, que so os terminais de M; o separador $ e os smbolos de
estados de M so noterminais de G. Para esta fase as regras de G podem ser obtidas
adaptando as regras de uma gramtica sensvel ao contexto de { xx | x*},
acrescentando os smbolos noterminais i e $.
A segunda parte,
ix$x * yfz$x
simula a computao de M com entrada x. Para isto, as regras de G so construdas a
partir das transies de M. Para cada valor (q, a), G tem uma ou mais regras que
simulam a mudana de configurao. Se (q, a) = (p, b, R), basta uma regra qabp.
Se (q, a) = (p, b, L), h necessidade de uma regra cqa pcb para cada smbolo c do
alfabeto da fita. O fim da fita de M identificado pela presena do separador $.
Portanto, quando M l um branco, o separador $ alcanado, e transies em que um
envolvido tem regras correspondentes das formas q$ pb$ e cq$ pcb$.
Supondo que x pertence a L(M), uma configurao final yfz ser eventualmente
alcanada, com ix |* yfz. Portanto, em G, ser possvel a derivao ix$x * yfz$x,
onde f um estado final.
Na ltima fase, os restos da computao de M so removidos, restando apenas a cpia
no usada da cadeia x. Para obter yfz$x * x, G tem regras fX para cada estado
final f. O noterminal X pode ser visto como um apagador usando regras cX X e
Xc X para cada smbolo c do alfabeto da fita, e X$ , podemos eliminar todos
os vestgios da simulao, e ficar apenas com a cadeia x.
Por construo, G gera x se e somente se M aceita x. Para a construo da primeira
parte de G, veja o exerccio abaixo.
98/113
Linguagens Formais - J. L. Rangel 7-15
Exerccio 7.6: Seja um alfabeto qualquer, e seja ' = { i, $ }. Considere a
linguagem L' no alfabeto ', dada por L' = { ix$x | x * }. Mostre que L' sensvel
ao contexto, construindo uma gsc para L'.
Nota: na demonstrao do teorema anterior, i e $ so noterminais.
Este captulo foi escrito a partir de uma verso inicial escrita com a colaborao de Luiz Carlos
Castro Guedes
2jul99
99/113
Linguagens Formais J.L.Rangel 8-1
Captulo 8: O problema da parada.
Decidibilidade e computabilidade.
Jos Lucas Rangel
8.1 - Introduo.
Como observado no captulo anterior, podemos substituir a definio informal
de procedimento pela definio formal de mquina de Turing (mT). J vimos que,
dependendo da forma como a mT construda, ela pode ser um procedimento gerador
ou um procedimento reconhecedor; por outro lado, uma mT que sempre pra,
qualquer que seja a sua entrada, um algoritmo. Portanto, um conjunto
recursivamente enumervel (r.e.) uma linguagem reconhecida por uma mT; e um
conjunto recursivo uma linguagem aceita por uma mT que sempre pra.
Devemos, neste captulo, apresentar exemplos de linguagens que mostrem que
as definies de conjunto recursivamente enumervel e de conjunto recursivo so no
triviais. Uma vez que j foi provada a incluso da segunda classe na primeira, basta
apresentar exemplos de conjuntos r.e. que no so recursivos, e de conjuntos
enumerveis que no so r.e. Efetivamente, o reconhecimento de um conjunto no
recursivamente enumervel , ento, uma tarefa que no pode ser realizada por
nenhuma mquina de Turing, por nenhum procedimento, ou seja, uma tarefa
incomputvel.
Para que esses exemplos sejam apresentados, precisamos de alguns conceitos
auxiliares.
8.2 - Enumerao de Mquinas de Turing.
Para definir uma enumerao (e uma numerao) de todas as mquinas de
Turing (mT) vamos introduzir uma codificao, que vai representar cada mT
M = <K, , , , i, F> atravs de uma cadeia em um alfabeto adequado ; a
enumerao das mT, determinsticas e no determinsticas, ser baseada em uma
enumerao de *. Para isso conveniente fazer algumas suposies:
Os estados de K esto ordenados: q
0
, q
1
, q
2
, , de tal forma que i = q
0
.
De forma semelhante, os smbolos de , s
0
, s
1
, s
2
, esto ordenados, de
forma que s
0
o smbolo especial branco .
Assim, para representar M, usaremos um alfabeto = {q, s, |, #, L, R} de
forma que o estado q
i
representado por q|
i
, e o smbolo s
i
representado por s|
i
. A
representao ento usa as cadeias q, q|, q||, q|||, , s, s|, s||, s|||, para os estados e
smbolos; note, em particular, que q o estado inicial, e s o smbolo branco.
Os smbolos #, L, e R de so usados respectivamente como separador e
como indicadores de movimento para a esquerda, e para a direita.
Para representar a funo , devemos representar todos os valores de (q, s).
Isso pode ser feito atravs de uma sequncia de quntuplas (q
i
, s
j
, q
k
, s
l
, r), com r{L,
R}, que indicam que (qk, sl, r) (qi, sj).
100/113
Linguagens Formais J.L.Rangel 8-2
A cadeia correspondente tupla (qi, sj, qk, sl, r) em * q|i s|j q|k s|l r. Se M
uma mT no determinstica, podemos ter vrias tuplas com os mesmos valores nos
dois primeiros elementos.
Por exemplo, se tivermos a tupla (q
1
, s
2
, q
3
, s
4
, L), indicando que (q
3
, s
4
, L)
(q
1
, s
2
), a cadeia correspondente em * ser q|s||q|||s||||L. Para representar a funo ,
concatenamos as representaes das quntuplas correspondentes a , separadas por #.
Para representar F, basta concatenar, sem separao, as cadeias que
representam os estados. Por exemplo, F = {q1, q3, q5 } representado por q|q|||q|||||. A
representao de M se reduz apenas representao de F e de , que podem ser
separadas por ##.
Exemplo: Seja M = <K, , , , i, F>, onde
K = { p, q, r }
= { a, b }
= { , a, b, X }
i = q
F = { r },
sendo dada por
(p, a) = {(q, a, R)}
(q, a) = {(q, X, R)}
(q, b) = {(r, a, L)}
(q, ) = {(r, X, L)}
Fazendo q
0
= q, q
1
= p, q
2
= r, s
0
= , s
1
= a, s
2
= b, s
3
= X, temos a seguinte
representao de M:
q||##q|s|qs|R#qs|qs|||R#qs||q||s|L#qsq||s|||L
Uma entrada aaab de M ser codificada em * como s|s|s|s||.
Com essa codificao (ou alguma outra codificao semelhante), possvel
representar as mT's e suas entradas atravs de cadeias em *, onde um alfabeto
apropriado. Sabemos que * enumervel, e que podemos atribuir um natural a cada
cadeia de *, e fazer referncia s cadeias de * como x
0
, x
1
, x
2
, . Assim, podemos
atribuir mT representada por x
i
o nmero i, e fazer a referncia a ela como a i-sima
mquina de Turing M
i
.
Entretanto, para que a notao M
i
sempre represente uma mT, uma conveno
adicional necessria. Observe que nem todas as cadeias x
i
de * correspondem a
mT's. Por exemplo, a cadeia LLL no descreve nenhuma mT. Para que a cada natural
i corresponda uma mT M
i
, vamos associar a cada i tal que x
i
no descreve nenhuma
mquina a mquina vazia ##, que no tem nenhum estado final, e nenhuma transio
possvel. Incidentalmente, ## aceita a linguagem vazia .
Assim, podemos falar em M
i
, para qualquer i: ou M a mquina representada por x
i
,
ou x
i
no representa nenhuma mquina, e Mi a mquina representada por ##. Note
que fcil distinguir as cadeias de * que representam mT's das demais, uma vez que
elas formam um conjunto regular.
Semelhantemente, podemos enumerar as cadeias que representam entradas:
x
0
, x
1
, x
2
...,
101/113
Linguagens Formais J.L.Rangel 8-3
de forma que poderemos falar na i-sima cadeia de entrada x
i
.
Exerccio: Escolha uma enumerao de *. Para essa enumerao, descreva
algoritmos que permitam
dado um natural i, determinar a cadeia x
i
de * correspondente.
dada uma cadeia x em ?*, determinar o natural i tal que x = x
i
.
dada uma cadeia x
i
em *, determinar se x
i
ou no a representao de uma
mT.
Exerccio: Para uma enumerao determinada de *,
(a) determine o nmero da sequncia ##.
(b) determine qual a mquina M23.
Suporemos daqui para a frente que est fixada uma enumerao de todas as
mquinas de Turing, em algum alfabeto fixo.
M
0
, M
1
, M
2
, M
3
,
e de suas entradas,
x
0
, x
1
, x
2
, x
3
,
Codificao e decodificao. Podemos sempre supor que existem algoritmos com as
seguintes finalidades:
dado um natural i, determinar a cadeia xi.
dado um natural i, determinar a representao de Mi.
dada uma cadeia x, determinar i tal que x = xi.
dada uma mT M, determinar i tal que M = Mi.
Faremos referncia a esses algoritmos como algoritmos de codificao ou de
decodificao. Como se trata de algoritmos, podemos supor que podem ser simulados
por uma mT, ou usados por mT's como subrotinas.
8.3 - Mquina de Turing Universal.
Vamos agora mostrar como pode ser construda uma mT universal U, que tem
a propriedade de poder simular qualquer outra mT. Por simplicidade, vamos descrever
uma mT universal U no determinstica. Para simular a computao de uma mT M
qualquer, quando recebe como entrada a cadeia x, a idia a seguinte:
U recebe uma entrada $, onde e so as representaes de M e x em
algum alfabeto ;
U simula M com entrada x;
U aceita $ se M aceita x.
Para a simulao, U constri uma representao de uma configurao de M
em sua fita, e faz a simulao alterando essa configurao. A simulao parte da
configurao inicial q Para cada mudana de configurao C
i
| C
i+1
, U deve
identificar o estado e o smbolo lido em C
i
, escolher uma entre as diversas transies
previstas na funo de transio que faz parte de e construir a nova configurao
C
i+1
.
Como U no determinstica, pode decidir "no-deterministicamente" quando
uma configurao final C
f
de M foi atingida, e apenas verificar que o estado contido
em C
f
um dos estados finais listados em .
102/113
Linguagens Formais J.L.Rangel 8-4
Todas as operaes envolvidas so operaes de cpia e de comparao de
cadeias, e no oferecem nenhum problema maior. Naturalmente, a simulao de um
passo da mquina M corresponde a um nmero considervel de passos de U, mas isto
no um problema.
Assim, a construo de U possvel. Frequentemente, conveniente supor que
a mT U recebe como entrada i$j, para indicar que deve simular Mi com entrada xj,
sendo i e j representados em alguma base adequada. Os passos adicionais necessrios
so de codificao e decodificao, e podem, como j vimos, ser realizados por uma
mT.
A mT U frequentemente usada como uma subrotina, na construo de outras
mT's, em geral atravs de frases como
"ento, M simula M
i
com entrada x
j
e se M parar, ...".
Uma comparao que se faz frequentemente a da mquina de Turing
universal U com o modelo de von Neumann, em que se baseiam os computadores
comuns. O modelo de von Neumann se caracteriza justamente por ter o programa
armazenado na memria, juntamente com os dados, durante a execuo.
Note que U uma mquina de Turing, e, portanto, faz parte da enumerao M
0
, M
1
,
M
2
, M
3
, sendo, para algum natural u, a mquina M
u
.
8.4 - Uma linguagem no recursivamente enumervel.
Vamos agora apresentar um exemplo de linguagem no recursivamente
enumervel. Considere a linguagem L abaixo:
L = { x
i
| x
i
no aceita por M
i
}
Fato: L no recursivamente enumervel.
Dem.: Vamos mostrar, por contradio, que L no aceita por nenhuma mquina de
Turing. Para isso, suponha que L aceita pela mT M.
Como toda mT, M faz parte da enumerao das mT's, ou seja, para algum i, M = M
i
,
de forma que L = L(M
i
). Vamos verificar se x
i
L.
se tivermos x
i
L, como L = L(M
i
), temos que M
i
aceita x, e portanto
x
i
L.
se, alternativamente, tivermos x
i
L, ou seja, x
i
L(Mi), naturalmente, M
no aceita x
i
, e portanto x
i
L.
Estabelecida a contradio, conclumos que L no aceita por nenhuma mT M, e que
L no recursivamente enumervel.
Para a linguagem L, portanto, no existem
um procedimento reconhecedor de L
um procedimento enumerador de L
uma gramtica, tipo 0 ou no, que gere L.
Fato: , o complemento de L, uma linguagem recursivamente enumervel.
Dem.: Temos = { x
i
| x
i
aceita por M
i
}. Podemos descrever uma mT M que aceita
L, da seguinte forma:
a partir de xi, M obtm a representao de Mi.
como foi descrito para a mquina universal U, M simula Mi com entrada xi.
103/113
Linguagens Formais J.L.Rangel 8-5
se Mi parar e aceitar xi, M tambm pra e aceita xi.
Note que se M
i
no pra, com entrada x
i
, ento M tambm no pra, com a mesma
entrada
Fato: A linguagem L no recursiva.
Dem.: J vimos anteriormente que o complemento de uma linguagem recursiva
tambm uma linguagem recursiva. Como o complemento de L L, que no r.e., e
portanto, tambm no recursiva, L no pode ser recursiva.
A linguagem L , portanto, tem uma gramtica tipo 0, mas no sendo recursiva,
tambm no pode ser sensvel ao contexto, e no pode ter nenhuma gramtica tipo 1.
8.5 - Problemas decidveis e indecidveis.
Para qualquer conjunto X no recursivo, a pergunta "x X?" no admite
soluo atravs de um algoritmo que aceite x como entrada e responda SIM ou NO
corretamente pergunta. Mas, do ponto de vista prtico, a diferena entre um
conjunto no recursivamente enumervel, e um conjunto recursivamente enumervel
que no recursivo pode ser considerada pequena. Com efeito, suponha que um
conjunto L recursivamente enumervel mas no recursivo, e que dispomos de uma
mT M que reconhece L, mas, no pra quando sua entrada no pertence a L. Suponha
que, com entrada x, M foi executada por, digamos, mil passos, e que no parou. Nada
podemos responder pergunta "x L ?". Ser que M vai parar nos prximos mil
passos?
Uma das maneiras de dizer que uma linguagem L no recursiva dizer que o
problema "x L ?" no decidvel. De uma forma geral, um problema indecidvel
um conjunto de questes que pode ser reduzido por codificao ao problema da
pertinncia em uma linguagem no recursiva, e, assim, no pode ser respondido por
uma mT que sempre pra; se um problema pode ser reduzido por codificao ao
problema de pertinncia em uma linguagem recursiva, dizemos que decidvel.
Um ponto importante que um problema indecidvel sempre envolve uma famlia de
questes, ou questes em que aparece um parmetro. O problema P(i) - "M
i
aceita
x
i
?" pode ser indecidvel, mas o problema P(23) - "M
23
aceita x
23
?" decidvel. Como
prova disso, oferecemos duas mTs: M
sim
e M
no
. M
sim
sempre pra e aceita qualquer
entrada (sempre responde SIM); M
no
sempre pra, mas nunca aceita qualquer de suas
entradas (sempre responde NO). irrelevante o fato de ser difcil ou trabalhoso
descobrir qual das duas mquinas corresponde resposta correta da pergunta "M
23
aceita x
23
?", mas certamente uma das duas resolve corretamente o problema. De fato,
o que indecidvel em "M
i
aceita x
i
?" exatamente qual das duas respostas
corresponde a um valor de i arbitrrio, ou seja, qual das duas mquinas consideradas
deve ser usada em cada caso.
Reduo. Uma das tcnicas mais comuns de estabelecer se um problema decidvel
ou indecidvel atravs de reduo desse problema a outro problema cuja resposta
conhecida.
Dizemos que P
1
se reduz a P
2
se a resposta a qualquer consulta a P
1
pode ser
deduzida da resposta a uma consulta apropriada a P
2
.
Se P
1
se reduz a P
2
, podemos dizer que, de certa forma, P
2
mais geral que P
1
.
104/113
Linguagens Formais J.L.Rangel 8-6
Supondo que P
2
indecidvel, e que P
2
se reduz a P
1
, podemos concluir que P
1
tambm indecidvel; por outro lado, se P
1
decidvel, e P
2
se reduz a P
1
, podemos
concluir que P
2
tambm decidvel.
O problema da parada. Como exemplo da tcnica de reduo, vamos mostrar que o
problema da parada das mquinas de Turing (halting problem) indecidvel. Este
problema pode ser formulado como "M
i
pra com entrada x
j
?", embora algumas vezes
seja confundido o problema da aceitao "M
i
aceita x
j
?".
Como fcil reduzir qualquer um dos problemas ao outro, os dois problemas
podem ser considerados equivalentes, e a confuso de certa forma justificada. Para
verificar a equivalncia, basta verificar que sempre possvel alterar uma mT M,
construindo outra mT M que aceita a mesma linguagem, de maneira tal que M tem
as propriedades de parar sempre que atinge um estado final, e de nunca parar em um
estado que no seja final. Isso quer dizer que M pra se e somente se aceita sua
entrada. Vamos representar o problema da parada por Q(i,j) = M
i
aceita x
j
?
Como sabemos que P(i) = "Mi aceita xi?" indecidvel (veja a linguagem L
acima), e sabemos que podemos reduzir P a Q, porque P(i) equivalente a Q(i, i),
conclumos que o problema da parada Q indecidvel.
Usualmente, a demonstrao de que um problema indecidvel , feita atravs
de reduo, a partir do problema da parada, diretamente, ou ento, de forma indireta, a
partir de problemas cuja indecidibilidade j foi provada anteriormente.
(junho 99)
105/113
Jos Lucas Rangel Linguagens Formais 9-1
Captulo 9: Linguagens sensveis ao contexto e autmatos
linearmente limitados.
Jos Lucas Rangel
9.1 - Introduo.
Como j vimos anteriormente, a classe das linguagens sensveis ao contexto
(lsc) uma classe intermediria entre a classe das linguagens recursivas e a classe das
linguagens livres de contexto (llc). J vimos anteriormente que a classe das llc est
propriamente contida na classe das lsc's: como aplicao do Lema do Bombeamento,
provamos que alguns exemplos de linguagens geradas por gramticas sensveis ao
contexto no so llc's.
Neste captulo, queremos apresentar os autmatos linearmente limitados, uma
classe de mquinas de Turing cuja operao restringida, de forma a aceitar apenas as
lsc's. Adicionalmente, queremos mostrar que a incluso da classe das lsc's na classe
das linguagens recursivas prpria, atravs de um exemplo de linguagem recursiva
que no uma lsc.
9.2 - Autmatos linearmente limitados.
Um autmato linearmente limitado (all) uma mquina de Turing no
determinstica A = <K, , , , i, F>, que satisfaz certas restries:
dois smbolos especiais, um marcador esquerdo [ e um marcador direito ],
so includos em ;
quando [ lido, a mquina no pode se mover para a esquerda, nem
escrever um smbolo distinto de [;
quando ] lido, a mquina no pode se mover para a direita, nem escrever
um smbolo distinto de ].
[ e ] no podem ser escritos em nenhuma outra situao.
Supondo que a fita de um all contm inicialmente uma sequncia da forma
[ x ], estas restries fazem com que o all no possa abandonar a regio entre os dois
marcadores [ e ], nem apag-los ou mov-los. Portanto, todas as computaes de um
all devem ser feitas no espao que originalmente contm sua entrada x.
Como j vimos anteriormente, possvel definir uma fita com k trilhas, e, num
trecho da fita de comprimento n, podemos armazenar kn smbolos. Esta a origem do
nome "linearmente limitado": o all pode manipular em sua fita informao com
tamanho limitado por uma funo linear do tamanho de sua entrada.
Definimos configuraes e transies para um all da mesma forma que para
uma mT. Entretanto, a configurao inicial associada entrada x * i [ x ].
Definimos a linguagem de um all A, por
L(A) = { x* | i [ x ] |* [ f ], com fF }
Exemplo: Vamos descrever informalmente um all A que aceita a lsc { x x | x* },
sendo = { a, b }.
Inicialmente, a fita de A contm [ y ]. Em seguida, A marca o primeiro
smbolo de y, e o primeiro smbolo da segunda metade de y, que verifica ser igual ao
106/113
Jos Lucas Rangel Linguagens Formais 9-2
primeiro. (A posio inicial da segunda metade escolhida de forma no
determinstica.) A seguir, o processo se repete com os demais smbolos das duas
metades, marcando o primeiro smbolo no marcado da primeira metade e o primeiro
smbolo no marcado (igual) da segunda metade, at que nenhum smbolo no
marcado reste na fita.
Atingido este ponto, A verificou que o ponto escolhido como incio da
segunda metade era o correto, porque havia um nmero igual de smbolos nas duas
metades, e alm disso, que os smbolos correspondentes das duas metades eram iguais
em todos os casos. Portanto, a cadeia de entrada y pertence linguagem, e pode ser
aceita por A, que passa para um estado final, onde pra.
Exerccio: Construa um all que aceite a linguagem {x x | x*}, onde = {a, b}, em
todos os detalhes.
9.3 - All's e lsc's
Vamos agora provar dois teoremas que mostram que a classe das linguagens
aceitas por all's no determinsticos e a classe das linguagens sensveis ao contexto
(lsc's) so idnticas.
Teorema 9.1: Toda lsc reconhecida por um all no determinstico.
Dem.: Seja L uma lsc, e G uma gsc que gera L. Vamos mostrar como construir um all
A, que aceita L(G). Para verificar que xL(G), A simula uma derivao S*x em
sua fita.
Primeiro, observamos que, se G tem uma regra S , A deve aceitar a entrada vazia,
identificada pelo contedo de fita []. Este caso deve ser tratado especialmente, porque
a derivao S no pode ser simulada sem um espao de comprimento pelo menos
|S| = 1.
Para considerar as demais entradas x = x
1
x
2
x
n
, A inicialmente divide sua fita em
duas trilhas, copiando x na primeira trilha, e preparando a segunda para simular uma
derivao de x. Para representar as duas trilhas, vamos usar pares de smbolos, de
forma que
(a
1
, b
1
) (a
2
, b
2
) (a
n
, b
n
)
representa uma fita com duas trilhas, que contm, respectivamente, a
1
a
2
a
n
e
b
1
b
2
b
n
.
Inicialmente, a fita de A contm
[ x
1
x
2
x
n
].
Dividindo a fita em duas trilhas, temos
[ (x
1
, S) (x
2
, ) (x
n
, ) ]
Na segunda trilha, que contm inicialmente S, A simula uma derivao em G,
sem alterar o contedo da primeira trilha, escolhendo as regras de forma no
determinstica. Supondo-se, naturalmente, que xL, uma derivao de x pode ser
simulada, e ao final da simulao, a fita conter duas cpias de x, uma em cada trilha:
[ (x
1
, x
1
) (x
2
, x
2
) (x
n
, x
n
) ]
Neste ponto, A verifica que o contedo da primeira trilha idntico ao da segunda, e
passa para um estado final.
107/113
Jos Lucas Rangel Linguagens Formais 9-3
A idia central da demonstrao a de que, como G uma gsc, as formas sentenciais
intermedirias entre S e x, na derivao S * x, tem todas comprimento menor ou
igual ao de x, e podem portanto ser escritas na segunda trilha.
Nota: a demonstrao acima usa o fato de que o all A no-determinstico de forma
essencial, e essa hiptese no pode ser retirada, pelo menos de forma simples. Na
demonstrao, apenas uma forma sentencial construda a cada vez, sendo a escolha
da regra e da maneira de sua aplicao feita de forma no-determinstica. A
verificao final de que a cadeia x foi obtida, verifica a correo da escolha. (Escolhas
erradas no poderiam derivar x, e portanto no levariam aceitao.)
No caso de um all determinstico, entretanto, isto no seria possvel, e seria
necessrio, em princpio, examinar todas as formas sentenciais possveis, at o
comprimento n da entrada, como foi feito no algoritmo usado para demonstrar que
todas as linguagens sensveis ao contexto so conjuntos recursivos. No possvel,
entretanto, considerar todas as formas sentenciais simultaneamente por causa da
restrio de espao, porque o nmero de formas sentenciais de comprimento menor
ou igual a n pode ser exponencial em n. Uma outra alternativa seria tratar uma forma
sentencial por vez, e anotar apenas o caminho percorrido durante a derivao da
forma sentencial corrente (que regras foram aplicadas em que pontos, por exemplo),
de forma a recuar (backtrack) posteriormente, se a cadeia x no for atingida, para
voltar e considerar as alternativas restantes. Isto tambm no possvel, pois o
comprimento do caminho tambm pode ser exponencial em n.
Como esta demonstrao no pode ser adaptada para o caso determinstico,
pelo menos de forma simples, e nenhuma outra demonstrao alternativa foi
descoberta, o problema da equivalncia das classes das linguagens aceitas por all's
determinsticos e all's no determinsticos um problema ainda em aberto.
Teorema 9.2: Toda linguagem aceita por um all uma lsc.
Dem.: Seja A um all (no determinstico). Para aceitar uma entrada x, A realiza uma
computao
i [ x ] |* f
onde i o estado inicial, e f um dos estado finais de A. Vamos construir uma gsc G
que simula esta computao em cada derivao. Note, entretanto, que uma derivao
de x em G deve partir do smbolo inicial S, e terminar com x, e que a computao
acima s pode ser iniciada aps a definio de x. Usando smbolos no terminais da
forma (a, b, c, d), podemos simular quatro "trilhas":
a primeira trilha guarda uma cpia de x, que no ser alterada;
a segunda guarda outra cpia, que ser usada na simulao;
a terceira guarda o estado corrente e a posio da cabea, durante a
simulao;
a quarta tem as marcas que indicam as extremidades da fita.
A derivao se d em vrias fases:
fase 1: S * (x
1
, x
1
, i, [) (x
2
, x
2
, , ) ... (x
n
, x
n
, , ])
Nesta primeira fase, so geradas as duas cpias de x=x
1
x
2
x
n
, e preparada a
configurao inicial, com o estado i na primeira posio.
108/113
Jos Lucas Rangel Linguagens Formais 9-4
fase 2: (x
1
, x
1
, i, [) (x
2
, x
2
, , ) ... (x
n
, x
n
, , ])
* (x
1
, z
1
, , [) (x
2
, z
2
, , ) (x
m
, z
m
, f, ) (x
n
, z
n
, , ])
Na segunda fase, feita a simulao de A at que uma configurao final f seja
obtida, com = z
1
z
2
z
m-1
e = z
m
z
m+1
z
n
.
fase 3: (x
1
, z
1
, , [) (x
2
, z
2
, , ) (x
m
, z
m
, f, ) (x
n
, z
n
, , ]) * x
1
x
2
x
n
Na ltima fase, a partir dos smbolos em que o estado (a terceira componente) final,
feita a substituio, de forma a deixar apenas os smbolos da primeira "trilha".
Os detalhes da construo da gramtica ficam como exerccio para o leitor.
9.4 - Uma linguagem recursiva que no sensvel ao contexto.
Vamos agora apresentar uma linguagem L, definida a seguir, que recursiva,
mas no uma lsc. Para definir L, vamos inicialmente supor uma enumerao das
gsc's, G
0
, G
1
, G
2
, , limitadas ao caso em que o alfabeto dos terminais contm
apenas 0 e 1. Como feito anteriormente com mquinas de Turing, essa enumerao
pode ser baseada na codificao das gramticas em cadeias em um alfabeto adequado.
Apenas para fixar as idias, podemos supor que os smbolos noterminais so
codificados como n, n|, n||, , sendo o noterminal inicial indicado apenas por n.
Dessa forma, para codificar uma gramtica G = < N, , P, S >, no h necessidade de
incluir na codificao de uma gramtica o conjunto de seus terminais (0 e 1 podem
ser representados simplesmente por 0 e 1), o conjunto de noterminais N (sempre
representados por n, n|, n||, , ou o smbolo inicial S (codificado como n). Basta
assim apenas codificar as regras da gramtica, que podem ser separadas por #.
Com isso, o alfabeto pode ser = {0, 1, n, |, , #}. Como fizemos na
enumerao das mquinas de Turing, a enumerao deve eliminar as cadeias de *
que no correspondem a gsc's, e substitu-las por alguma gsc, por exemplo , que
representa a gsc "vazia", que no tem nenhuma regra, e que gera a linguagem vazia
.
Para cada gramtica G
i
, possvel construir uma mT que sempre pra e que
reconhece a linguagem de G
i
. Seja M
i
a mT construda a partir de G
i
. Portanto, a
enumerao M
0
, M
1
, M
2
, inclui mT's que aceitam todas as lsc's.
Defina a linguagem L por
L = { x
i
| M
i
no aceita x
i
}
Fato: L recursiva.
Dem.: Note que, por construo, todas as mquinas M
i
aceitam conjuntos recursivos,
e param para todas suas entradas. L aceita por uma mT M que
a partir de sua entrada x, M determina i tal que x=x
i
, e constri uma
representao de M
i
.
simula M
i
com entrada x
i
.
M aceita x=x
i
se e somente se M
i
no aceita x
i
, ou seja, se M
i
, com entrada
x
i
, pra em um estado que no final.
Fato: L no uma lsc.
Dem.: Por contradio. Suponha que L uma lsc. Neste caso, L tem uma gsc G=G
i
, e
aceita pela mquina M
i
: L = L(G
i
) = L(M
i
). Mas ento
109/113
Jos Lucas Rangel Linguagens Formais 9-5
x
i
L M
i
no aceita x
i
x
i
L(M
i
) x
i
L,
estabelecendo uma contradio. Conclumos, portanto, que L no uma lsc.
As duas propriedades acima estabelecem que a classe das linguagens sensveis
ao contexto est propriamente contida na classe das linguagens recursivas.
(julho 99)
110/113
Linguagens Formais Jos Lucas Rangel 10-1
Captulo 10: Linguagens determinsticas e seus aceitadores
Jos Lucas Rangel
10.1 - Introduo.
Nos captulos relativos s linguagens livres de contexto, observamos que as
classes de linguagens aceitas por autmatos de pilha determinsticos (apd) e no
determinsticos (apnd) no so as mesmas, ao contrrio do que acontece, por exemplo,
com os autmatos finitos. Neste captulo, vamos apresentar exemplos e algumas
propriedades das linguagens determinsticas, isto , das linguagens aceitas por apd's.
10.2 - Autmatos de pilha determinsticos.
Como observado anteriormente, um apd um caso particular de apnd, em que,
a partir de qualquer configurao existe, no mximo, uma configurao acessvel. Em
termos da definio de um apd A = <K, , , , i, I, F>, isto significa:
para quaisquer qK, a{}, Z, (q, a, Z) tem, no mximo, um
elemento;
se, para algum qK e algum Z, (q, , Z) no vazio, ento para todos
os smbolos a, (q, a, Z) deve ser vazio.
A primeira condio impede a possibilidade de escolha entre duas transies com um
smbolo; a segunda condio evita a possibilidade de escolha entre a leitura de um
smbolo de , e a leitura de um , ou seja, a escolha entre ler e no ler um smbolo da
entrada.
Note, entretanto, que, ao contrrio do que acontece com os autmatos finitos
determinsticos, pode no existir nenhuma configurao alcanvel a partir de uma
dada configurao, mesmo que a entrada ainda no tenha sido completamente lida.
Por exemplo, a pilha pode ficar vazia. Assim, uma entrada x pode ser deixar de ser
aceita por um apd sem ter sido completamente lida.
Definimos uma linguagem determinstica como sendo uma linguagem aceita
por estado final por um apd. A razo para essa escolha est nas propriedades a seguir,
que limitam o interesse das linguagens aceitas por apd's por pilha vazia.
Dizemos que uma cadeia y um prefixo de outra cadeia x se x = y z para
algum z; dizemos que y um prefixo prprio de x se y um prefixo de x, e y x.
Dizemos que uma linguagem L tem a propriedade dos prefixos se nenhuma
cadeia de L tem um prefixo prprio que tambm pertence a L, ou seja, se dadas duas
cadeias x, y pertencentes a L,
x = yz implica z = .
Fato: Se L = L
pv
(M), para algum apd M, ento L tem a propriedade dos prefixos.
Dem.: Suponha que xL. Isto significa que a partir da configurao inicial [i, x, I],
correspondente a x, pode ser alcanada uma configurao final (para aceitao por
pilha vazia) [q, , ]. Considere uma cadeia y=xz, com z. A partir da configurao
inicial correspondente a y, [i, y, I] = [i, xz, I] pode ser alcanada a configurao
[q, z, ], sem que a parte z da entrada seja lida. Como a partir desta ltima
111/113
Linguagens Formais Jos Lucas Rangel 10-2
configurao nenhuma outra pode ser atingida, nenhum smbolo de z ser lido, e a
cadeia y no ser aceita.
Exerccio: Seja L uma linguagem qualquer num alfabeto , e seja $ um smbolo novo,
no pertencente a .
(a) Mostre que a linguagem L{$} = { x$ | x(L} tem a propriedade dos prefixos;
(b) Mostre tambm que se L uma linguagem determinstica, ou seja, se L aceita
por estado final por um apd, L{$} aceita por um apd por pilha vazia.
Exerccio: Mostre que as linguagens { a
i
b
j
| i=j }, { a
i
b
j
| i>j }, { a
i
b
j
| i<j } e
{ a
i
b
j
| ij }, so determinsticas.
10.3 Propriedades de fechamento da classe das linguagens
determinsticas
Para as linguagens determinsticas, no existe um correspondente do Lema do
Bombeamento (pumping lemma), de forma que a principal maneira de provar que
uma linguagem livre de contexto no determinstica atravs do uso de
propriedades de fechamento. Por exemplo, veremos posteriormente que a classe das
linguagens determinsticas fechada para a operao de complemento. Assim, uma
llc cujo complemento no uma llc no pode ser determinstica.
Vamos comear pela propriedade do fechamento com o complemento.
Teorema: A classe das linguagens determinsticas fechada para o complemento.
Dem.: Seja M um apd que aceita uma linguagem L, por estado final.
Vamos mostrar como construir um apd M' que aceita o complemento de L. A idia
central semelhante da prova do fechamento da classe das linguagens regulares
para o complemento: vamos trocar os estados finais pelos no finais. Assim, pelo
menos em princpio, se L a linguagem aceita por M = < K, , , , i, I, F>, o apd
M' = < K, , , , i, I, K-F> deve aceitar o complemento de L.
Entretanto, algumas possibilidades devem ser consideradas:
1. M no aceita uma entrada x porque M pra sem que a entrada x tenha sido toda
lida. Se construirmos M' apenas pela troca dos estados finais e no finais de M, x
continuaria no sendo aceita, o que seria incorreto.
2. M l toda a entrada x, mas aps isso, M executa uma infinidade de passos com
entrada , sem retirar smbolos da pilha, e, nessa fase, passa por estados finais e
no finais. Note que M aceita x, mas se construirmos M' apenas pela troca dos
estados finais e no finais, x continuaria sendo aceita, o que seria incorreto.
Para resolver esses problemas, necessrio fazer vrias transformaes em M antes
de trocar os estados finais e no finais. Os detalhes da efetiva construo de M' a
partir de M podem ser vistos no livro de Hopcroft e Ullman.
A partir deste resultado, podemos mostrar que a classe das linguagens
determinsticas contida propriamente na classe das llc.
Fato: A llc L = { a
i
b
j
c
k
| ou ij ou jk } no determinstica.
Dem. Basta mostrar que o complemento no uma livre de contexto.
112/113
Linguagens Formais Jos Lucas Rangel 10-3
Intuitivamente, L "no pode" ser determinstica porque comparar i e j envolve
um tratamento da pilha (empilhar i smbolos, desempilhar j smbolos) completamente
diferente do necessrio para comparar j e k (empilhar j smbolos, desempilhar k
smbolos).
Fato: A classe das linguagens determinsticas no fechada para as operaes de
unio e interseo.
Dem.: Para a unio, note que a linguagem L do exemplo anterior pode ser vista como
a unio de duas llc determinsticas:
L = { a
i
b
j
c
k
| ou ij ou jk } = L
1
L
2
,
sendo
L
1
= { a
i
b
j
c
k
| ij }
L
2
= { a
i
b
j
c
k
| jk }
Para mostrar que a classe das linguagens determinsticas no fechada para a
interseo, podemos usar os fatos de que a classe no fechada para a unio, mas
fechada para o complemento. Uma das relaes de de Morgan
2 1 2 1
L L L L =
Assim, se a classe das linguagens determinsticas fosse fechada para a interseo,
tambm seria fechada para a unio. Pela contradio, vemos que a classe no pode ser
fechada para interseo.
Exercicio: Mostrar que L = { a
i
b
j
| i=j ou i=2j } uma linguagem no determinstica,
que pode ser escrita como a unio de duas linguagens determinsticas.
10.4 Concluso
Com os exemplos e as propriedades estabelecidas neste captulo e nos
anteriores, a hierarquia das classes de linguagens definidas aqui pode ser representada
pela figura abaixo, em que todas as incluses indicadas so prprias.
linguagens
linguagens recursivas
linguagens determinsticas