Você está na página 1de 8

Autômatos e Teoria da Computação

aula 06: Raciocinando sobre linguagens

1 Introdução

A figura abaixo ilustra o tópico da aula de hoje:

conjunto de palavras
(linguagem)

...
... a*(b U ba)*ab*

diagrama de propriedades expressoes


estados e padroes regulares

Na parte de baixo da figura nós temos os três pontos de vista que foram utilizados até o momento
na nossa investigação dos autômatos finitos: digramas de estado, propriedades e padrões, e
expressões regulares.
A questão que ficou implı́cita nas aulas anteriores é se esses três pontos de vista são equivalentes.
Por exemplo, nós vimos na aula 04 que é relativamente fácil construir uma expressão regular
a partir do diagrama de estados de um autômato – mas nós não provamos que isso é sempre
possı́vel. Por outro lado, nós vimos na aula 05 que a construção de um diagrama de estados
a partir de uma expressão regular pode ser uma tarefa difı́cil – mas nós não provamos que
existem casos em que isso é impossı́vel. Finalmente, os exemplos de propriedades e padrões
que nós vimos até o momento são todos relativamente simples, e é razoável imaginar que os
autômatos não são capazes de reconhecer padrões muito complicados – por exemplo, padrões
que envolvem algum tipo de recursividade.
Na aula de hoje, nós vamos apresentar um novo ponto de vista: a ideia um pouco mais abstrata
de que a linguagem reconhecida pelo autômato é um conjunto de palavras. Utilizando o formal-
ismo dos conjunto, nós podemos considerar novas possibilidades como a união ou interseção de
duas linguagens L1 e L2 , ou o complemento de uma linguagem L. Ao fazer essa investigação,
nós vamos descobrir que os pontos de vista anteriores são compatı́veis com algumas dessas
operações mas não com outras, o que nos dará um melhor entendimento da situação geral.

2 Operações sobre linguagens

Nós vamos começar a nossa investigação examinando a ideia de que qualquer conjunto pode ser
particionado ou decomposto como a união de dois ou mais subconjuntos disjuntos (possivelmente
vazios).

L L1 L2

A observação interessante é que essa ideia pode ser traduzida imediatamente para o formalismo
dos autômatos finitos utilizando o ponto de vista dos diagramas de estados.

1
Por exemplo, considere o autômato ilustrado na figura abaixo.

a
q0 q1 b q2 q3 q4
a b b

a
a
b a b

qr
a,b

Esse autômato é relativamente complicado e, nesse momento, não nos interessa saber exatamente
o que ele faz. A única observação que queremos fazer é que ele aceita qualquer palavra que
faça a computação terminar nos estados finais q0 , q2 e q3 . Essa observação já é suficiente para
concluir que a linguagem L que ele reconhece pode ser decomposta como:

L = L0 ∪ L2 ∪ L4

onde L0 , L2 e L4 são, respectivamente, os conjuntos de palavras que levam o autômato do


estado inicial q0 para cada um dos estados finais q0 , q2 e q4 .
A seguir, nós fazemos duas observações chave:

Observação 1: Cada estado qi do autômato está associado a uma pequena linguagem Li


(mesmo o estado de rejeição), que consiste no subconjunto das palavras que levam o autômato
do estado inicial até o estado qi :

a
L0 L1 b L2 L3 L4
a b b

a
a
b a b

Lr
a,b

Observação 2: Qualquer palavra leva o autômato do estado inicial para algum lugar. Isso
significa que a união de todos as pequenas linguagens associadas aos estados do autômato
corresponde ao universo de todas as palavras
[
Li = {a, b}∗
i

Logo, a construção de um autômato pode ser vista como um processo de duas etapas:

1. a construção do diagrama de estados particiona o universo {a, b}∗ em diversas pequenas


linguagens
2. a marcação de estados finais seleciona algumas dessas pequenas linguagens para definir a
linguagem reconhecida pelo autômato

A figura abaixo ilustra essa ideia.

2
Essa observação permite obter imediatamente o nosso primeiro resultado a respeito de operações
sobre linguagens:

Corolário 1: Suponha que o autômato M reconhece a linguagem L. Então, para obter um


autômato que reconhece o complemento L̄ da linguagem L, basta inverter os estados finais
e não finais de M .

Esse resultado mostra que o ponto de vista dos diagramas de estado suporta a operação de
complemento – isto é, existe uma operação simples que pode ser aplicada a um diagrama de
estados que produz um outro diagrama que corresponde ao complemento da linguagem associada
ao diagrama original.
Nesse momento, é natural perguntar se a mesma coisa vale para as expressões regulares – isto é,
será que existe uma transformação relativamente simples que pode ser aplicada a uma expressão
regular E que corresponde à operação de complemento? Infelizmente, a resposta aqui parece
ser negativa. Considere o exemplo abaixo:
∗
L = a baab ∪ ba ba∗ ⇒ L̄ = ?

Por outro lado, a situação se inverte quando nõs consideramos operações de união irrestritas.
Considere, por exemplo, as seguintes linguagens:

L1 = palavras com um número ı́mpar de b’s


L2 = concatenações não-vazias de blocos ab e aba

Abaixo nós temos autômatos M1 , M2 que reconhecem essas duas linguagens:

e expressões regulares E1 , E2 que descrevem essas linguagens


∗ ∗
E1 = a∗ ba∗ ba∗ E2 = ab ∪ aba

Não parece haver nenhuma operação relativamente simples que pode ser aplicada aos autômatos
M1 e M2 que produz um autômato que reconhece a linguagem L1 ∪ L2 . A figura abaixo ilustra
a ideia de conectar os autômatos M1 e M2 fazendo com que eles compartilhem o mesmo estado
inicial (note que o autômato M1 foi invertido):
A ideia aqui é que as palavras de L1 seriam aceitas se seguissem para o lado esquerdo, e as
palavras de L2 seriam aceitas se seguissem para o lado direito. Mas, como existe duas transições
com os sı́mbolos a, b saindo do estado q0 s0 , isso não é um autômato válido.
No entanto, é fácil ver que E1 ∪ E2 é uma expressão regular válida que descreve a linguagem
L1 ∪ L2 . Ou seja, o ponto de vista das expressões regulares suporta a operação de união.
Essas observações permitem obter o nosso segundo resultado a respeito de operações sobre
linguagens.

3
Corolário 2: Suponha que as expressões regulares E1 , E2 descrevem as linguagens L1 , L2 .
Então, E1 ∪ E2 é uma expressão regular que descreve a linguagem L1 ∪ L2 .

2.1 A operação de interseção

Considere novamente as linguagens

L1 = palavras com um número ı́mpar de b’s


L2 = concatenações não-vazias de blocos ab e aba

e os autômatos M1 e M2 que reconhecem essas linguagens

Suponha que nós estamos interessados em obter um autômato que reconhece a linguagem L1 ∩
L2 . Como esse é o conjunto que contém as palavras que pertencem tanto a L1 como L2 ,
nós poderı́amos pensar em construir o seguinte mecanismo: dada uma palavra de entrada w,
primeiro o mecanismo executa o autômato M1 sobre w, e em seguida executa o autômato M2
sobre w; se ambas as computações terminam em um estado final o mecanismo aceita a palavra
w; caso contrário, a palavra é rejeitada.
Não é difı́cil ver que esse mecanismo de fato reconhece a linguagem L1 ∩ L2 . O único problema
é que ele não é um autômato. Em particular, note que a palavra w é lida duas vezes. Isso
significa que a cabeça de leitura é movida para a esquerda ao final da computação de M1 , para
retornar ao inı́cio da palavra. Mas, isso não é uma operação que os autômatos podem realizar.
Essa observação, no entanto, nos leva a uma outra ideia: ao invés de executar os autômatos
M1 e M2 em série, o mecanismo pode executá-los em paralelo. A ideia é que cada sı́mbolo
da palavra de entrada é passado para os dois autômatos, e cada um realiza a sua respectiva
transição. Por exemplo, considere a palavra de entrada abababa. O esquema abaixo apresenta
o comportamento dos autômatos M1 e M2 a medida que os sı́mbolos são lidos
M1 M2
inı́cio q0 s0
a q0 s1
b q1 s2
a q1 s3
b q0 s2
a q0 s3
b q1 s2
a q1 s3

Como os dois autômatos terminam em um estado final, a palavra seria aceita pelo mecanismo.

4
Novamente, não é difı́cil ver que esse mecanismo reconhece a linguagem L1 ∩ L2 . Mas, nesse
ponto, alguém pode apresentar a seguinte objeção: isso não é um autômato, pois um autômato
não pode estar em dois estados ao mesmo tempo.
A boa notı́cia é que um autômato pode sim estar em dois estados ao mesmo tempo! (Ou, ao
menos, ele pode simular esse comportamento.)
Abaixo, nós temos uma pequena variação do esquema anterior, onde os nomes dos estados de
M1 e M2 foram concatenados
M1 -M2
inı́cio q0 -s0
a q0 -s1
b q1 -s2
a q1 -s3
b q0 -s2
a q0 -s3
b q1 -s2
a q1 -s3
Esse esquema pode ser interpretado como a execução de um autômato M1 -M2 cujos estados
tem a forma geral qi -sj . De fato, para cada combinação de estados qi , sj é possı́vel determinar
qual a combinação no passo seguinte quando o sı́mbolo lido é a ou b. Abaixo nós temos alguns
exemplos
a a
q0 -s0 −→ q0 -s1 q0 -s1 −→ q0 -sr
b b
q0 -s0 −→ q1 -sr q0 -s1 −→ q1 -s2

Essa ideia permite que um autômato simule a execução de outros dois autômatos em paralelo,
e é conhecida como o produto cartesiano de autômatos.
Para definir a operação de produto cartesiano com precisão, é conveniente utilizar a definição
formal dos autômatos. Lembre que formalmente os autômatos M1 e M2 são quádruplas da
forma:  
M1 = K1 , δ1 , q0 , F1 M2 = K2 , δ2 , s0 , F2
onde Ki , δi , Fi são, respectivamente, o conjunto de estados, a função de transição, e o subcon-
junto de estados finais dos autômatos M1 e M2 .
Agora, nós podemos definir o produto cartesiano M1 ⊗ M2 dos autômatos M1 e M2 como

- conjunto de estados: K1 ⊗ K2
- estado inicial: (q0 , s0 )
 
- função de transição: δ1⊗2 (qi , sj ) = δ1 (qi ), δ(sj )

Como nós queremos que o autômato M1 ⊗ M2 reconheça a linguagem L1 ∩ L2 , nós marcamos


como estados finais os pares (qi , sj ) onde qi é um estado final de M1 e sj é um estado final de
M2 .
A figura na página seguinte apresenta o produto cartesiano dos autômatos M1 e M2 do exemplo
acima.
Essas observações permitem obter mais um resultado a respeito de operação sobre linguagens

Corolário 3: Suponha que os autômatos M1 , M2 reconhecem as linguagens L1 , L2 . Então,


para obter um autômato que reconhece L1 ∩ L2 , basta construir o produto cartesiano de M1
e M2 , e marcar como estados finais os pares (qi , sj ) onde qi e sj são ambos estados finais em
seus respectivos autômatos.

5
Ou seja, o ponto de vista dos diagramas de estado suporta a operação de interseção.
Uma consequência imediata desse resultado é que os diagramas de estado também suportam a
operação de união, por meio da lei de Morgan:
 
L1 ∪ L2 = L̄1 ∩ L̄2

De fato, esse resultado segue de maneira mais direta pela técnica do produto cartesiano:

Corolário 4: Suponha que os autômatos M1 , M2 reconhecem as linguagens L1 , L2 . Então,


para obter um autômato que reconhece L1 ∪ L2 , basta construir o produto cartesiano de M1
e M2 , e marcar como estados finais os pares (qi , sj ) onde qi ou sj é um estado final em seu
respectivoa utômato.

3 Concatenação de linguagens

Uma operação especı́fica para conjuntos de palavras é a operação de concatenaçao entre duas
linguagens sobre o mesmo alfabeto. A concatenação de L1 e L2 é definida da seguinte maneira

L1 · L2 = {w ∈ Σ∗ | w = xy onde x ∈ L1 e y ∈ L2 }

Isto é, para formar uma palavra da linguagem L1 · L2 basta selecionar uma palavra x de L1
e uma palavra y de L2 e concatená-las. Por outro lado, dada uma palavra w qualquer, para
determinar se ela pertence ou não a L1 · L2 , é preciso verificar se existe alguma maneira de
quebrá-la em duas partes x e y de modo que x ∈ L1 e y ∈ L2 .
Por exemplo, se L1 é a linguagem formada pelas palavras que contém apenas o sı́mbolo a, e
L2 é a linguagem formada pelas palavras que contém apenas o sı́mbolo b, então L1 · L2 é a
linguagem que consiste em todas as palavras da forma a...ab...b.
Um exemplo mais interessante é dado pelas seguintes linguagens:

L1 = palavras que possuem um número par de a’s e um número ı́mpar de b’s


L2 = palavras que contém o padrão aaba

Não é difı́cil verificar se uma palavra w pertence ou não a L1 · L2 : ao encontrar o primeiro


segmento inicial de w com um número par de a’s e um número ı́mpar de b’s, nós passamos a
procurar pelo padrão aaba; se o padrão é encontrado, então a palavra pertence a L1 · L2 , caso
contrário ela não pertence.

Exercı́cio: a) Construa um autômato que reconhece a linguagem L1 · L2 .

6
b) Construa um autômato que reconhece a linguagem L2 · L1 .

O seguinte fato é trivial.

Fato 3: Se a expressão regular α1 descreve a linguagem L1 e a expressão α2 descreve a lin-


guagem L2 , então a expressão regular (α1 α2 ) descreve a linguagem L1 · L2 .

Por outro lado, não se pode dizer a mesma coisa com relação aos autômatos.

Questão 4: Suponha que M1 e M2 são autômatos que reconhecem as linguagens L1 e L2 .


Será que sempre existe um autômato que reconhece a linguagem L1 · L2 ?

De fato, em alguns casos é possı́vel concatenar dois autômatos M1 e M2 , sobrepondo ou identifi-


cando o(s) estado(s) de aceitação de M1 e o estado inicial de M2 . Por exemplo, a Figura abaixo
ilustra à esquerda o autômato que reconhece as palavras que possuem ao menos uma ocorrência
do padrão bbab, e à direita o autômato que reconhece as palavras não-vazias formadas pela
concatenação de blocos da forma ab e abb.

q0 q1 q2 q3 q4 p0 p1 p2 a p3
b b a b a b b

a a
b b a a
a,b
b b

pr
a,b

A ideia é que a computação começa no autômato M1 . No momento em que esse autômato


alcança o seu estado de aceitação q4 , nós já temos uma palavra da linguagem L1 . Nesse ponto,
a computação passa para o autômato M2 , e espera-se que ela termine em um dos estados de
aceitação p2 ou p3 . A observação interessante, no entanto, é que se em algum ponto dessa
computação o autômato alcança o estado de rejeição pr , a computação pode voltar ao estado
inicial p0 e nós podemos assumir que toda a porção da palavra de entrada lida até o momento
é uma palavra de L1 (o que é certamente o caso).
A Figura abaixo ilustra o resultado da concatenação dos autômatos M1 e M2 que nós acabamos
de descrever.
q0 q1 q2 q3 p1 a
p0 p2 p3
b b a b a b b

a a a
b b a b
b

7
Exercı́cios

1. Construa autômatos para as seguintes linguagens

a) palavras que NÃO podem ser formadas pela concatenação dos blocos ab, baa, bab
b) palavras que não possuem 3 sı́mbolos consecutivos iguais E possuem um número par
de a’s
c) palavras que podem ser formadas pela concatenação dos blocos ab, aa, ba E que não
possuem blocos de a’s de tamanho ı́mpar
d) palavras onde todo a é precedido por ao menos um b OU possuem um número par de
b’s

2. Sejam L1 , L2 as linguagens reconhecidas pelos autômatos abaixo

a
b
b
a a b b
b a
a
a a b b

a,b a,b

Construa autômatos para as seguintes linguagens

a) L1 ∩ L2
b) L1 ∪ L2
c) L1 · L2

3. Apresente expressões regulares para as seguintes linguagens

a) o complemento de b∗ (aaa∗ b∗ )∗
b) a interseção de (b∗ ab∗ ab∗ )∗ e (ab ∪ aba)∗

Você também pode gostar