Вы находитесь на странице: 1из 9

Autômatos e Linguagens Formais

aula 01: Autômatos finitos determinı́sticos

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:

- palavras que não possuem dois a’s consecutivos


- palavras que possuem uma quantidade par de b’s
- palavras onde todo sı́mbolo do alfabeto aparece ao menos uma vez

Mas, será que existem conjuntos de palavras que não podem ser reconhecidos desse modo?
O que voĉe acha dos seguintes exemplos:

- palavras que possuem mais a’s do que b’s


- palavras cuja quantidade de b’s é um número primo

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.

2 Autômatos finitos determinı́sticos

A Figura abaixo ilustra os componentes de um autômato finito determinı́stico:

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

O outro caso é análogo, e nós temos a regra

(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

Exercı́cio: a) Simule a execução do autômato sobre as palavras abab, aab, aba.


b) Construa um autômato para a variante da linguagem que não possui a restrição dos
sı́mbolos inicial e final.

2.1 Definição formal

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

(. . . )

2.2 Diagrama de estados

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.

Exemplo 2: Um autômato que reconhece as palavras que possuem o padrão abaa.


A primeira tarefa do autômato é encontrar um sı́mbolo a, que pode corresponder ao inı́cio
do padrão procurado. Isso pode ser feito por meio de um estado inicial q0 que ignora os
sı́mbolos b, e um estado qa que indica que um a foi encontrado

Quando o autômato se encontra no estado qa , ele espera ler um b em seguida. Se isso


acontece, ele pode passar para o estado qab , que indica que o fragmento ab acabou de ser
lido. Caso contrário, se o autômato lê um sı́mbolo a, ele pode permanecer no estado qa , pois
esse a pode ser o inı́cio do padrão procurado.

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 seguir, nós vamos ver outros exemplos de autômatos finitos determinı́sticos.

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

Qual a linguagem reconhecida por esse autômato?


Examinando o diagrama, nós vemos que ao ler um segmento inicial de a’s o autômato
permanece no estado inicial q0 . Mas, como apenas q1 e q2 são estados de aceitação, a
palavra deve conter ao menos um b.
A seguir, nós observamos que após esse b, a leitura de qualquer número de a’s (inclusive
zero) mantém o autômato nos estados q1 e q2 .
Por outro lado, a leitura de outro sı́mbolo b leva o autômato para o estado q3 , que é efetiva-
mente um estado de rejeição.
Portanto, esse autômato reconhece as palavras que contém exatamente um sı́mbolo b.

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.

Qual a linguagem reconhecida por esse autômato?


Examinando o diagrama, nós vemos que ao ler um segmento inicial de b’s o autômato
permanece no estado q0 . Como q0 é um estado de aceitação, isso é uma palavra válida da
linguagem.
A seguir, nós observamos que, ao ler um sı́mbolo a, o autômato passa para o estado q1 ,
e só alcança novamente um estado de aceitação (no caso, o estado q3 ) se ele lê dois b’s
consecutivos.
Quando o autômato se encontra no estado q3 , ele pode ler qualquer quantidade de b’s e
permanecer no mesmo estado. Mas, se o autômato lê um sı́mbolo a, ele volta para o estado
q1 , o que faz com que ele precise ler novamente ao menos dois b’s consecutivos.
Portanto, esse autômato reconhece a linguagem das palavras em que todo sı́mbolo a é seguido
por ao menos dois b’s consecutivos.
Exercı́cio: Você consegue construir um autômato para essa linguagem com menos do que
5 estados?

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:

Agora, nós podemos resolver o problema original utilizando a seguinte ideia


- se o primeiro sı́mbolo da paravra é a, a “execução é desviada” para o autômato M1
- se o primeiro sı́mbolo da paravra é b, a “execução é desviada” para o autômato M2
O único detalhe que requer algum cuidado é o fato de que as palavras “a” e “b” são palavras
da linguagem, uma veq que nesse caso o primeiro e o último sı́mbolos da palavra são certa-
mente iguais.

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

1. Faça o exercı́cio indicado no exemplo da Seção 2.

2. Construa autômatos finitos determinı́sticos para as seguintes linguagens:


a) palavras que contém exatamente dois b’s
b) palavras em que todo a é precedido por ao menos um b
c) palavras em que todo a é precedido por ao menos dois b’s
d) palavras que não possuem sı́mbolos isolados (i.e., todo sı́mbolo da palavra está adjacente
a um sı́mbolo igual a ele)
e) palavras que não possuem ocorrências consecutivas do sı́mbolo inicial
f) palavras que possuem ao menos uma ocorrência de aa e de bb
g) palavras que terminam com a sequência de sı́mbolos bba

3. Descreva a linguagem reconhecida pelos autômatos abaixo:

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

Вам также может понравиться