Escolar Documentos
Profissional Documentos
Cultura Documentos
1 Introdução
conjunto de palavras
(linguagem)
...
... a*(b U ba)*ab*
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.
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
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:
2
Essa observação permite obter imediatamente o nosso primeiro resultado a respeito de operações
sobre linguagens:
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:
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 .
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 )
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:
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:
6
b) Construa um autômato que reconhece a linguagem L2 · L1 .
Por outro lado, não se pode dizer a mesma coisa com relação aos autômatos.
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 a a
b b a b
b
7
Exercı́cios
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
a
b
b
a a b b
b a
a
a a b b
a,b a,b
a) L1 ∩ L2
b) L1 ∪ L2
c) L1 · L2
a) o complemento de b∗ (aaa∗ b∗ )∗
b) a interseção de (b∗ ab∗ ab∗ )∗ e (ab ∪ aba)∗