Escolar Documentos
Profissional Documentos
Cultura Documentos
1 Introdução
Suponha que os sı́mbolos de uma palavra serão mostrados a você um a um, digamos em uma
tela. Suponha além disso que você não possui papel ou caneta para fazer anotações, mas pode,
por exemplo, utilizar seus dedos para lembrar, mais tarde, de alguma caracterı́stica que você
viu no meio da palavra.
Ao final desse processo você deve decidir se a palavra possui ou não uma certa propriedade.
Ou, de maneira mais geral, você deve decidir se a palavra pertence ou não a um certo conjunto
pré-definido L.
Não é difı́cil ver que você pode realizar essa tarefa com sucesso para alguns conjuntos simples
como:
Mas, será que existem conjuntos de palavras que não podem ser reconhecidos desse modo?
O que voĉe acha dos seguintes exemplos:
O autômato finito determinı́stico (AFD) é o modelo de computação mais simples que existe. O
seu funcionamento corresponde quase que exatamente à situação que acabamos de descrever:
ele lê os sı́mbolos de uma palavra um a um, e ao final responde SIM ou NÃO
w Sim
M
Nao
Na aula de hoje, nós vamos apresentar uma definição precisa dos AFDs e estudar diversos ex-
emplos. Nas aulas seguintes, nós vamos ver que, devido à sua simplicidade, é possı́vel responder
praticamente qualquer pergunta a seu respeito: o que ele é capaz de fazer, o que ele não é capaz
de fazer, qual é a sua principal limitação, etc.
a b b b a b a ... a
q1
q2 ... qk
O AFD possui uma fita, onde ele recebe uma palavra como entrada. A palavra é inspecionada
sı́mbolo a sı́mbolo por meio de uma cabeça de leitura, que se move sempre para a direita.
1
O AFD também possui um conjunto finito de estados, ilustrados na figura por q1 , q2 , . . . , qk . A
cada instante da computação, o autômato tem um desses estados como o seu estado atual —
na figura, esse é o estado q2 indicado pelo ponteiro. A medida que os sı́mbolos da palavra de
entrada vão sendo lidos, o AFD pode mudar de estado de acordo com regras da forma
(q, s) → p
onde o par (q, s) indica o estado atual e o sı́mbolo que está sendo lido no momento, e p é o
estado em que o autômato vai estar no próximo passo. Por exemplo, na computação ilustrada
na figura acima, o autômato vai utilizar em seguida a regra que se inicia com o par (q2 , b); e se
essa regra for (q2 , b) → q1 , o ponteiro estará apontando para o estado q1 no passo seguinte.
A computação de um AFD sempre começa em um estado designado como estado inicial. Além
disso, existe um subconjunto de estados designados como estados finais ou terminais. Quando a
computação termina em um estado final, nós assumimos que o AFD aceitou a palavra de entrada
– isto é, essa é a maneira que o AFD tem de responder Sim. Caso contrário, nós assumimos que
a palavra foi rejeitada.
O conjunto de todas as palavras que o autômato aceita é chamado de linguagem reconhecida
pelo AFD.
A seguir, nós vamos programar o nosso primeiro autômato finito.
Exemplo 1: Considere a tarefa de reconhecer as palavras que possuem a’s e b’s alternados, e
que começam e terminam com o sı́mbolo a. (Em nossos exemplos, nós vamos assumir que as
palavras de entrada são formadas apenas pelos sı́mbolos a e b.) Ou seja, a autômato deve
aceitar as palavras
a, aba, ababa, etc
Para resolver essa tarefa o autômato precisa lembrar a cada passo qual foi o sı́mbolo que
ele acabou de ler. E, são os estados que fazem o papel de memório no AFD. Portanto, nós
vamos utilizar os seguintes estados para construir o nosso autômato:
qa : indica que o último simbolo lido foi um a
qb : indica que o último simbolo lido foi um b
A seguir, observe que se o autômato acabou de ler um sı́mbolo a, então ele espera encontrar
um b em seguida. Quando isso acontece, o autômato deve passar para o estado qb . Essa
observação corresponde à seguinte regra:
(qa , b) → qb
(qb , a) → qa
Mas, nós também precisamos levar em conta os casos em que a palavra de entrada viola o
padrão da linguagem. Isso ocorre basicamente quando o autômato espera encontrar um a
mas lê o sı́mbolo b, e vice-versa. Mesmo que a violação seja encontrada no inı́cio da palavra
de entrada, a rejeição só pode ocorrer ao final da computação, quando todos os sı́mbolos
já foram lidos. Portanto, nós precisamos de mais um estado para lembrar que a violação
ocorreu:
qr : estado de rejeição
e nós definimos as seguintes regras
(qa , a) → qr e (qb , b) → qr
2
Quando o autômato alcança o estado de rejeição qr , o resultado da computação já está
decidido, mas a palavra de entrada ainda precisa ser lida até o final. Para isso, nós utilizamos
as regras:
(qr , a) → qr
(qr , b) → qr
Ou seja, quando o autômato alcança o estado qr ele não sai mais desse estado.
Finalmente, como o primeiro sı́mbolo da palavra de entrada deve ser um a, nós definimos
o estado qb como o estado inicial, pois esse é o estado em que o autômato espera ler um a
em seguida. E, como o último sı́mbolo da palavra de entrada também deve ser um a, nós
definimos o estado qa como o único estado final do autômato, pois esse é o estado em que o
autômato se encontra após a leitura de um sı́mbolo a (a menos que tenha ocorrido alguma
violação no meio do caminho).
Abaixo, nós temos uma descrição completa e sucinta do autômato.
estados: qa, qb, qr
estado inicial: qb
estado tipo SIM: qa
regras: (qa,a) -> qr (qb,a) -> qa (qr,a) -> qr
(qa,b) -> qb (qb,b) -> qr (qr,b) -> qr
Definição: Um autômato finito determinı́stico (AFD) é definido formalmente como uma quı́ntupla
M = (Σ, K, s, F, δ), onde
Σ: conjunto de sı́mbolos que podem aparecer na fita (alfabeto)
K: conjunto que indica os estados do autômato
s: estado inicial
F : subconjunto de estados de aceitação
δ: função da forma δ : K × Σ → K que codifica o conjunto de regras do autômato
(. . . )
Em geral, nós utilizamos uma notação mais simples e direta para descrever os autômatos: um
diagrama de estados e transições. A Figura abaixo apresenta o diagrama do autômato do
exemplo anterior.
qb a qa
b
qr
a,b
Como se pode ver na Figura, os estados do autômato correspondem aos nós ou vértices do
diagrama, e as regras correspondem às setas. Existe uma pequena seta indicando o estado
inicial do autômato, e os estados de aceitação são destacados com um pequeno cı́rculo.
3
A seguir, nós vamos ver um outro exemplo simples.
Raciocinando dessa maneira, não é difı́cil concluir a construção da parte do autômato que
identifica o padrão:
Finalmente, uma vez que o padrão foi encontrado, basta ler o restante da palavra e aceitar
a entrada
3 Outros exemplos
a. Um autômato que reconhece palavras que não possuem dois sı́mbolos consecutivos iguais.
A ideia é que se o autômato acabou de ler um sı́mbolo a, então o próximo sı́mbolo deve ser
um b, caso contrário a palavra deve ser rejeitada. Da mesma maneira, se o autômato acabou
de ler um sı́mbolo b, então o próximo sı́mbolo dever ser um a, caso contrário a palavra deve
ser rejeitada.
Para implementar essa ideia, nós vamos utilizar os seguintes estados:
q0 : estado inicial
qa : o autômato acabou de ler um a
qb : o autômato acabou de ler um b
qr : estado de rejeição
⋄
4
b. Um autômato que reconhece palavras que não possuem três sı́mbolos consecutivos iguais.
A ideia é que o autômato deve contar quantos sı́mbolos consecutivos iguais foram lidos até
o momento. Por exemplo, se o autômato acabou de ler um a (e esse é o primeiro sı́mbolo
da palavra ou o sı́mbolo anterior era um b), então o próximo sı́mbolo pode ser a ou b.
No entanto, se o próximo sı́mbolo for um a, então o sı́mbolo seguinte deve ser um b, caso
contrário a palavra deve ser rejeitada.
Para implementar essa ideia, nós vamos utilizar os seguintes estados:
q0 : estado inicial
qa : o autômato acabou de ler um a
qaa : o autômato acabou de ler aa
qb : o autômato acabou de ler um b
qbb : o autômato acabou de ler bb
qr : estado de rejeição
⋄
c. Considere o autômato ilustrado na Figura abaixo
5
Versão simplificada do autômato:
⋄
d. Um autômato que reconhece as palavras que contém uma quantidade par de b’s.
A ideia aqui é que os sı́mbolos a podem ser ignorados (no sentido de que eles não alteram
o estado atual do autômato), enquanto que os sı́mbolos b fazem o autômato alternar en-
tre dois estados que indicam que o número de b’s lidos até o momento são par e ı́mpar,
respectivamente.
Como no inı́cio da computação ainda não foi lido nenhum b e zero é um número par, nós só
precisamos de dois estados:
qp : o autômato leu um número par de b’s até o momento
qi : o autômato leu um número ı́mpar de b’s até o momento
⋄
e. Considere o autômato ilustrado na Figura abaixo.
6
f. Um autômato que reconhece as palavras que contém um número par de a’s e um número
ı́mpar de b’s.
A ideia aqui é que, durante a leitura da palavra, o autômato precisa manter duas informações
diferentes:
- se a quantidade de a’s lida até o momento é par ou ı́mpar
- se a quantidade de b’s lida até o momento é par ou ı́mpar
Como existem basicamente quatro possibilidades, o problema pode ser resolvido com 4
estados:
qpp : as quantidades de a’s e b’s até o momento são par e par, respectivamente
qpi : as quantidades de a’s e b’s até o momento são par e ı́mpar, respectivamente
qip : as quantidades de a’s e b’s até o momento são ı́mpar e par, respectivamente
qii : as quantidades de a’s e b’s até o momento são ı́mpar e ı́mpar, respectivamente
Como no inı́cio da computação foram lidos zero a’s e zero b’s, e zero é um número par, o
estado inicial do autômato é qpp .
Além disso, pela definição da linguage, o único estado de aceitação é qpi .
⋄
g. Um autômato que aceita as palavras que começam e terminam com o mesmo sı́mbolo.
Desta vez, nós vamos utilizar uma estratégia diferente para construir o autômato.
Considere primeiramente a tarefa de reconhecer as palavras que terminam com o sı́mbolo a.
Não é preciso pensar muito para chegar ao seguinte autômato que realiza essa tarefa:
De maneira análoga, nós temos o seguinte autômato que reconhece as palavras que terminam
com o sı́mbolo b:
7
Para garantir que essas palavras sejam aceitas, nós devemos desviar a execução para os
estados de aceitação dos autômatos M1 e M2 , como é feito no diagrama abaixo
8
Exercı́cios
b b a,b
a a
q1 q2 q3
q1 q2 q3 q4
a b a
b
b a b a
a,b
b a b a b a,b
a b a b a
q1 q2 q3 q4 q5 q6
4. Agora que você já tem um entendimento preciso sobre como os autômatos funcionam, con-
sidere a seguinte variante da pergunta que foi feita na Introdução: é possı́vel construir um
autômato finito determinı́stico que reconheça a linguagem:
- palavras que possuem a mesma quantidade de a’s e b’s