Escolar Documentos
Profissional Documentos
Cultura Documentos
Os exemplos apresentados são bastante simples, visando fins didáticos. Portanto, esta
apostila NÃO substitui os livros-textos, sendo apenas um material auxiliar.
Agradecemos antecipadamente.
2
Teoria da Computação. A Teoria da Computação abrange o estudo de modelos de
computadores ou máquinas e o respectivo poder computacional destes modelos. Isto
é, que classes de problemas podem ser resolvidas em cada modelo e como
representá-los.
Linguagens Formais. Para diminuir este distanciamento entre a língua humana (por
exemplo: o português, o inglês, etc.) e a programação de computadores foram
criadas as linguagens de programação. Estas são linguagens formais, isto é,
procuram eliminar toda ambigüidade possível, garantindo assim que um comando e
palavras reservadas tenham sempre o mesmo significado independentemente de
onde apareçam no programa.
A língua portuguesa é uma linguagem natural, sendo que sua representação escrita
possui uma gramática. Esta indica onde se deve usar preposição ou não; a
concordância verbal e nominal, entre outras regras.
Uma gramática define a estrutura geral de formação de uma sentença válida para
uma linguagem. Suponha o seguinte exemplo simplificado para a Língua Portuguesa:
Assim, a gramática anterior estabelece que uma frase é formada por um sujeito
seguido de um predicado, sendo que este por sua vez é formado por um verbo
seguido de um complemento. E portanto, a frase “o livro abre a mente” é uma frase
válida segundo a gramática acima.
Em uma linguagem de programação teríamos, por exemplo, uma regra que define um
comando de atribuição válido:
Usamos a letra grega epsilon minúscula ( ) para representar a palavra vazia, isto é,
tem comprimento 0 (zero).
4
O símbolo * indica o conjunto de todas as palavras possíveis de serem formadas a
partir do alfabeto , de qualquer comprimento incluindo a palavra vazia ( ).
! #
Uma linguagem formal pode ser representada de 3 maneiras:
• Enumeração das cadeias que fazem parte dela.
• Gramática, isto é, um conjunto de regras que especifica a formação das
cadeias.
• Dispositivo reconhecedor (máquina), que possui embutido um conjunto de
regras de aceitação de cadeias.
A primeira só pode ser utilizada para linguagens finitas. As duas últimas são capazes
de representar linguagens com número infinito de cadeias.
5
O símbolo . pode ser usado quando há mais de uma regra para um mesmo não
terminal, como o não-terminal $ do exemplo.
(1) - $%
(2) $%
(3) $%
(4) %
(5)
Na linha (1) foi usada a única regra disponível para o símbolo -. Na linha (2) foi usada
a regra $ $. Na linha (3) foi usada novamente a regra $ $. Na linha (4) foi
usada a regra $ . Na linha (5) foi usada a regra % .
-
$ %
Figura 1
6
Efetuando-se todas as possíveis derivações a partir do símbolo inicial -, obtêm-se
todas as palavras que compõem a linguagem formal descrita pela gramática,
podendo ser infinito o número de palavras.
Gramáticas equivalentes. Uma mesma linguagem pode ser gerada por diferentes
gramáticas. Por exemplo, a gramática:
- $
$ $.
gera a mesma linguagem descrita pela gramática vista anteriormente. Assim, quando
duas gramáticas geram a mesma linguagem, elas são ditas gramáticas equivalentes.
Formalmente: G1 é equivalente a G2 se e somente se L(G1) = L(G2).
LR
LLC
LSC
LRE
Figura 2
As linguagens regulares (LR) são aquelas onde se impõem mais restrições às regras
de produção.
7
Hierarquia de Chomsky. As linguagens livres de contexto (LLC) são menos
restritivas que as linguagens regulares (LR). As linguagens sensíveis ao contexto
(LSC) são menos restritivas que linguagens livres de contexto (LLC) e assim por
diante. A hierarquia assim gerada é chamada de Hierarquia de Chomsky.
Devido ao fato que um tipo de linguagem com mais restrições é um caso particular de
um tipo de linguagem com menos restrições, então toda LR é uma LLC. Toda LLC é
uma LSC, e toda LSC é uma LRE.
Gramática Regular (GR). Uma gramática G é regular se todas suas produções são
tais que podem ser colocada em alguma das seguintes formas:
• A a
• A aB
• A
Ás vezes, inicialmente a gramática não possui todas suas regras em alguma das
formas segundo a definição de gramática regular. No entanto, fazendo-se pequenas
alterações é possível obter uma gramática equivalente onde todas as regras estejam
de acordo com a definição de gramática regular. Exemplo: seja G1 a gramática a
seguir:
- $%
$ $.
%
G1 é regular. Para ver isto, basta observar que ela é equivalente a G2, definida por:
- $
$ $.
Linguagem Regular (LR). Uma linguagem é regular se ela pode ser descrita usando
uma gramática regular (GR).
' / / 0
8
Cada tipo de linguagem da Hierarquia de Chomsky possui um reconhecer distinto.
Linguagem Reconhecedor
Linguagens Regulares (LR) Autômatos Finitos
Linguagens Livres de Contexto (LLC) Autômatos com Pilha
Linguagens Sensíveis ao Contexto Máquina de Turing com memória
(LSC) limitada
Linguagens Recursivamente Máquina de Turing
Enumeráveis (LRE)
( $ 1 & 2 3$ &4
a a b a b … fita de entrada
cabeça de leitura
q0
q1
qn
… q2
controle finito
Figura 3
Finito. O autômato é dito finito porque o conjunto de estados possíveis (Q) é finito.
9
Estado Inicial. O estado inicial q0 indica que ao “ligarmos” o AFD, o marcador
automaticamente se posiciona no estado q0, antes de ler qualquer símbolo da fita de
entrada. Só pode existir um único estado inicial.
Aceitação. Uma palavra é reconhecida (ou aceita) quando o AFD após ler todos os
símbolos contidos na fita de entrada, o marcador se encontrar em um estado final. Ao
contrário do estado inicial, podem existir vários estados finais.
Rejeição. Uma palavra é rejeitada quando após ler todos os símbolos da fita de
entrada, o marcador não se encontrar em um estado final ou quando não existe uma
transição definida para um símbolo a ser lido, estando o autômato num determinado
estado.
Seja M = ( ,Q, ,q0,F) tal que = {a,b}, Q = {q0, q1, q2}, F = {q2} e a função transição
(ou função programa) definida segunda a tabela a seguir:
a b
q0 q1 ---
q1 q1 q2
q2 --- ---
a a b
q0 q1 q2
Figura 4
10
O destino da seta indica o próximo estado após a leitura do símbolo. O estado inicial é
indicado através de uma seta sem origem e com destino no estado inicial. Os estados
finais são indicados através de dois círculos concêntricos.
Observando o grafo do AFD temos os estados q0, q1 e q2, sendo q0 o estado inicial e q2
o estado final. O estado q1 pode ser traduzido como “estado onde se lê um ou mais a’s.
O estado q2 pode ser expresso por: “estado que indica a leitura de exatamente um b”.
- $%
$ $.
%
b c
a c
q0 q1 q2
Figura 5
M = ( , Q, , q0, F) onde = {a, b, c}, Q = {q0, q1, q2}, está representada pelo grafo da
Figura 5, q0 é o estado inicial e F = {q1, q2}. Exemplos de palavras ou cadeias
reconhecidas pelo AFD : , , , , , , , , , , , etc.
Exemplos de cadeias não reconhecidas: , , , , , etc.
) 5 $ & # 3 #4
É possível escrever uma gramática regular para todo AFD. Para tal basta seguir o
algoritmo a seguir:
• a cada estado é associado um não-terminal da gramática, sendo o estado
inicial q0 associado ao símbolo inicial (-)
• para cada transição de estado representada no grafo cria-se uma regra de
produção na gramática, tal que o estado de origem torna-se o não-terminal à
esquerda da regra e o estado destino torna-se um não-terminal do lado direita
da regra após o terminal lido na transição.
• cria-se uma regra para cada não-terminal associado a um estado final onde o
lado direito da regra é formado apenas pela palavra vazia ( ).
11
Como exemplo considere o AFD da Figura 5. Fazendo-se q0 = -, q1 = $ e q2 = %, a
gramática equivalente ao AFD é:
- $
$ $. %.
% %.
* 5 # 3 #4 $ &
O algoritmo a seguir mostra como encontrar um AFD equivalente a uma dada gramática
regular. Todas as regras da gramática devem ser do tipo $ % (não-terminal levando
a um terminal seguido de um único não-terminal) ou $ (não-terminhal levando a
um terminal sozinho) ou $ (não-terminal levando à palavra vazia).
• Para cada não-terminal crie um estado para o AFD, sendo que o símbolo inicial
seja o estado inicial ( - = q0 ).
• Para cada regra do tipo $ % crie uma transição que parta do estado $ com
destino ao estado % através da leitura do terminal .
• Para cada regra do tipo $ crie uma transição que parta do estado $ com
destino a um estado $x, através da leitura do terminal . Além disso, marque o
estado como final
• Para cada regra do tipo $ , faça do estado associado ao não-terminal $
um estado final.
- $. %
$ $. %. .
% %.
b
a a b
A B
S c
A1
12
+ 67 8 # 36#4
As linguagens regulares podem ser representadas usando uma notação denominada
expressão regular. Uma expressão regular utiliza apenas símbolos terminais e alguns
caracteres especiais (metacaracteres), sendo que estes têm a função de especificar a
quantidade de vezes que um terminal ou grupo de símbolos terminais se repetem dentro
da formação de uma palavra pertencente à linguagem.
Definição. A definição formal de uma expressão regular pode ser feita recursivamente da
seguinte maneira:
• Se x é um terminal, x é expressão regular.
• Se r e s são expressões regulares, então r+s é expressão regular. O sinal +
indica que tanto r ou s formam palavras válidas
• Se r e s são expressões regulares, então rs é expressão regular, onde as
palavras são formadas pela concatenação de r e s.
*
• Se r é expressão regular, r denota a expressão regular onde r é repetida zero
ou mais vezes
• Se r é expressão regular, r+ denota a expressão regular onde r é repetida uma
ou mais vezes. Portanto r+ = rr*
• Utilizam-se parêntesis para agrupar símbolos que se repetem conjuntamente.
Exemplos:
• 001(0+1) denota L = {0010, 0011}
• 01(10+11) denota L = { 0110, 0111}
• (0 + 01)1 denota L = { 01, 011}
*
• ab a denota L = {aa, aba, abba, abbba, ...}, isto é, L = { w | w inicia com um
a seguido de zero ou mais b’s e termina com um a}
• a(bc)*a denota L = {aa, abca, abcbca, abcbcbca, ...}, isto é, L = { w | w
inicia-se com um a seguido de zero ou mais seqüências de bc e termina
com a}
• ab+a denota L = {aba, abba, abbba, ...}, isto é, L = { w | w inicia-se com um
a seguido de um ou mais b’s e termina com a}
• (ab + bc)a denota L = {aba, bca}
• (a+b)* denota L = {a,b}*, isto é todas as palavras possíveis de serem
formadas a partir do símbolos a e b, inclusive a palavra vazia.
• (a+b)*c(a+b)* denota L = { w | w possui exatamente um c sobre = {a,b,c}* }
Exemplos:
• grep “Mar*” arq: listará todas as linhas do arquivo arq que contêm
palavras contendo a string Mar.
• grep Maria arq* : listará todas as linhas de arquivos cujo nome
comece com arq e que contenha a string Maria.
• grep –i maria arq : listará todas as linhas do arquivo arq que
contenham a string maria (ignorando maiúsculas e minúsculas).
• grep –v maria arq : listará todas as linhas do arquivo arq que não
contenham a string maria.
13
• grep “[a-z]” arq: listará todas as linhas do arquivo arq que comecem
com as letras minúsculas de a a z.
, $ 1 9 : 2 3$ 9&4
c
a b
q0 q1 q2
a
Figura 7
Exemplos de cadeias aceitas pelo AFND da figura 7: a, ac, ab, abcc, ...
Rejeição. Uma cadeia é rejeita por um AFND se nenhum caminho de transições leva o
autômato a um estado final após ler toda a cadeia.
Exemplos de cadeias rejeitadas pelo AFND da figura 7: b, bc, abb, aca, ...
" $ 1 8 3$ 4
Uma transição a partir da palavra vazia indica que o autômato pode alterar seu estado
sem ler nenhum símbolo da fita.
AFND. A existência de apenas uma transição usando a palavra vazia é suficiente para
que o autômato seja considerado não-derterminístico (AFND), pois existe uma situação
o autômato pode efetuar uma transição sem ler qualquer símbolo da fita.
14
c
b
q0 q1 q2
Figura 8
5 67 8 # $
15
x
r=x
ε q0r1
M
qfr1 ε
r = r1 + r2
ε M ε
q0r qfr2
M ε M
q0r1 qfr1 q0r qfr2 r = r1r2
ε M ε
q0r1 qfr1 r = r1*
ε
Figura 9
a ε b
ε ε
Figura 10
16
*
Para montar o autômato para a segunda subexpressão (bc) , primeiro montamos o
autômato para bc somente, e sobre o seu resultado aplicamos a regra que permite
repeti-lo zero ou mais vezes, obtendo assim:
ε b ε c ε
ε
Figura 11
Agora, uma vez obtidos os autômatos para (a +ab) e (bc)* basta colocá-los em
seqüência usando uma transição para que representem a concatenação das duas
subexpressões, e definir o estado que não possui transições a partir dele como
*
estado final, representando assim o autômato para (a + ab)(bc) , conforme a Figura
12.
a ε
a ε b
ε ε
ε
ε
ε b ε c ε
ε
Figura 12
5 $ & 7 8
Conforme visto anteriormente, todo AFD possui um expressão regular equivalente.
Segue um algoritmo para converter um AFD em expressão regular.
• 1º passo: dado autômato M, constrói-se M’ equivalente a M, tal que o estado
inicial de M’ liga-se ao estado inicial de M por transição , e todos os estados
finais de M ligam-se ao único estado final de M’ por transição . Além disso,
os estados finais de M não são finais em M’, conforme o esquema da Figura
13.
17
M’:
M ε
qf1
q0’
ε . .
q0 qf’
. .
. .
qfn
ε
Figura 13
M
a a q2
c
b
q0 q1
b
q3
Figura 14
c
M’
a a q2
c
ε
ε q0
b
q1 qf
q0’
b ε
q3
Figura 15
18
Observe que o autômato da Figura 15 é equivalente ao autômato da Figura 14, pois
apenas foram acrescentados dois estados (um novo estado inicial e um final) ligados
aos respectivos estados inicial e finais usando transições .
Agora procedemos à eliminação dos estados intermediários entre q0’ e qf. Assim,
eliminado o estado q0 obtém-se o autômato da Figura 16.
a q2
c
ε
a*b qf
q0’ q1
b ε
q3
Figura 16
A expressão regular colocada na transição de q0’ para q1 representa que saindo de q0’
até chegar em q1 foram lidos zero ou mais a’s e necessariamente um b. Isto
corresponde exatamente ao estado eliminado (q0).
a*ba*c
q2
ε
q0’ qf
ε
* *
a ba b q3
Figura 17
Observe que o estado q1 possui transição para dois estados distintos (q2 e q3).
Portanto ao efetuar sua eliminação é necessário representar como que saindo de q0’
* *
se chega a q2 (representado por a ba c), e como se chega a q3 (representado por
* *
a ba b).
19
a*ba*cc*
q0’ qf
ε
* *
a ba b q3
Figura 18
* * * * *
a ba cc + a ba b qf
q0’
Figura 19
! / ; 1
Algoritmo. Dado um autômato qualquer, ele pode ser minimizado através do seguinte
algoritmo de minimização:
• 1º passo: transformar o AFN ou AF em AFD
• 2º passo: eliminar estados inúteis (aqueles a partir dos quais não é possível
atingir um estado final)
• 3º passo: eliminar estados inacessíveis e suas transições (aqueles que não
podem ser atingidos a partir do estado inicial)
• 4º passo: particionar inicialmente os estados em 2 subconjuntos: estados
finais (F) e estados não-finais (Q – F)
• 5º passo: calcular classes de equivalência (blocos) recursivamente a partir
dos subconjuntos iniciais tal que: ∀p ∈ Ei e ∀a ∈ Σ , δ ( p, a ) ∈ E j onde Ei e E j
são classes de equivalência.
20
Exemplo: seja o autômato da Figura 20. Esse autômato já é determinístico. Portanto
inicia-se eliminando estados inúteis. O estado q5 é um estado inútil porque não é estado
final e não possui transições a partir dele, logo pode ser eliminado juntamente com suas
transições, resultando no AFD apresentado na Figura 21.
q0 q1
a
b b
q2 q3
b
a b
b
q4 q5
a
a
Figura 20
q0 q1
a
b b
q2 q3
a
a
q4
a
Figura 21
O AFD obtido não possui estados inacessíveis. Então passa-se à construção das
classes de equivalência, iniciando com os conjunto Q – F = {q0,q1} e F = {q2,q3,q4}. É
possível observar que δ (q 0 , a ) = q1 e δ (q1 , a ) = q 0 . Isto é, lendo o símbolo a a partir dos
21
estados que formam o conjunto Q – F, o AFD permanece em um estado do próprio
conjunto Q – F. Já a leitura do símbolo b a partir dos estados do conjunto Q – F leva a
estados do conjunto F. Além disso, a leitura do símbolo a a partir de estados do
conjunto F, o AFD permanece no conjunto F. Assim, podemos agrupar os estados q0 e
q1 em único estado (q01) e também os estados q2, q3 e q4 em um único estado (q234),
gerando o AFD apresentado na Figura 22.
a a
b
q01 q234
Figura 22
' < # 3 #4
Algumas observações sobre linguagens regulares (LR), autômatos finitos
determinísticos (AFD), gramáticas regulares (GR) e expressões regulares (ER):
• Toda LR possui GR equivalente
• Toda LR possui AFD que a reconhece.
• Toda ER possui AFD equivalente
• Toda GR possui AFD equivalente
22
( 8 $ & = 7
Conforme visto anteriormente, toda LR possui um AFD que a reconheça. Portanto, uma
forma de saber se uma linguagem é regular, é construindo um AFD que a reconheça.
) % 5
MENEZES, Paulo Blauth. Linguagens formais e autômatos. 2.ed. Porto Alegre, Sagra
Luzzatto, 1998. 165p.
23
HOPCROFT, John E.; ULLMAN, Jeffrey D.; MOTWANI, Rajeev. Introdução à Teoria de
Autômatos, Linguagens e Computação; Rio de Janeiro; Ed. Campus, 2002.
24