Teoria da Computação Primeiro Semestre, 25 Aula 3: Autômatos Finitos DAINF-UTFPR Prof. Ricardo Dutra da Silva Um procedimento ue determina se uma string de entrada pertence à uma linguagem é um reconhecedor desta linguagem. Vamos definir uma classe de máuinas ue determinam se uma string deve ser aceita ou não. A entrada de uma máuina será uma string sobre um alfabeto e a saída da computação seu aceite (reconhecimento) ou não dentro de uma linguagem. Em uma máuina bastante simples para venda de café, a entrada consiste em uma seuência de moedas de 5, e 25 centavos. Quando 3 centavos ou mais são inseridos, a máuina chega ao estado de aceite e o café é entregue. Se mais de 3 centavos são inseridos na máuina ela aceita de bom grado e não retorna troco. A máuina tem conhecimento de uanto dinheiro foi inserido. Esse conhecimento é obtido através dos estados internos da máuina. Quando uma entrada é recebida e processada, a máuina atualiza o conhecimento, possivelmente, mudando de estado. Cada estado da máuina representa um determinado estado da computação. Na nossa máuina teríamos 7 estados representado uantos centavos faltam para ue o café possa ser entregue. Cada estado, portanto, representaria uma das seguintes informações: ˆ faltam 3 centavos para o café ser entregue; ˆ faltam 25 centavos para o café ser entregue; ˆ faltam 2 centavos para o café ser entregue; ˆ faltam 5 centavos para o café ser entregue; ˆ faltam centavos para o café ser entregue; ˆ faltam 5 centavos para o café ser entregue; ˆ faltam centavos para o café ser entregue.
2 Aula 3: Autômatos Finitos Uma diagrama de estados é comumente usado para representar os estados e as transições de uma máuina. O diagrama é um grafo em ue cada nó representa um dos estados. As arestas do grafo, rotuladas, representam a entrada processada e ual a transição entre estados ue ela produz. O diagrama de estados para a máuina de café é mostrado na Figura 3.. 5 5 5 5 5 5 start 3 25 2 5 5 5,, Figura 3.: Máuina de estados para uma máuina de vender café. O estado faltam 3 centavos é chamado de estado inicial. O estado inicial deve ser diferenciado no diagrama. Usaremos para esse propósito uma seta rotulada start (ver Figura 3.). O estado faltam centavos é chamado de estado final, indicando ue a entrada fornecida para a máuina foi aceita, ou seja, ue a seuência de moedas fornecida compra um café. O estado final, ou estado de aceite, será indicado no diagrama por duas circunferências (ver Figura 3.). A máuina de café aceita moedas de 5, e 25 centavos. Seu alfabeto é, portanto, Σ = { 5,, }. As entradas para a máuina são strings do conjunto Σ = { 5,, }. As strings aceitas são auelas ue terminam no estado final. Um autômato finito é uma máuina abstrata ue pode ser usada para determinar se strings fornecidas como entrada são aceitas. Cada símbolo da string é processado em seuência e o processamento determina as mudanças de estado ue ocorrem na máuina. Isso é feito percorrendo a aresta com rótulo igual ao do símbolo processado. A string 5 5 é aceita pela máuina de café, pois o caminho induzido pela string termina em um estado final. A Figura 3. mostra, em destaue, o caminho induzido pela string 5 5. A string 5 5 5 não é aceita pela máuina pois o caminho induzido pela string não
3.. AUTÔMATOS FINITOS DETERMINÍSTICOS 3 5 5 5 5 5 5 start 3 25 2 5 5 5,, Figura 3.2: Caminho induzido pela string 5 5 na máuina de estados da máuina de vender café. termina em um estado final (Figura 3.3). 5 5 5 5 5 5 start 3 25 2 5 5 5,, Figura 3.3: Caminho induzido pela string 5 5 5 na máuina de estados da máuina de vender café. Na seuência iremos formalizar as noções vistas nesta introdução. Com isso poderemos estudar, em máuinas abstratas, capacidades e limitações de computação. 3. Autômatos Finitos Determinísticos Definição 3.. Um autômato finito determinístico (DFA, do inglês Finite Deterministic Automata) é uma 5-tupla M = (Q, Σ, δ,, F ), onde
4 Aula 3: Autômatos Finitos ˆ Q é um conjunto finito de estados; ˆ Σ é o alfabeto; ˆ Q é o estado inicial; ˆ F é o subconjunto de estados finais de Q; ˆ δ é uma função δ : Q Σ Q, chamada de função de transição. Definição 3.2. O diagrama de estados de um DFA M = (Q, Σ, δ,, F ) é um grafo G, direcionado e rotulado, definido como: ˆ os vértices de G são os elementos de Q; ˆ os rótulos das arestas são elementos de Σ; ˆ é o estado inicial, indicado pela palavra start ; ˆ F é o subconjunto de nós finais, indicados por círculos concêntricos; ˆ existe um arco entre os nós i e j com o rótulo a se δ( i, a) = j ; ˆ para cada nodo i Q e símbolo a Σ há exatamente uma aresta rotulada como a partindo de i. Exemplo 3. Podemos descrever formalmente o autômato da máuina de café (Figura 3.) como uma 5-tupla M = (Q, Σ, δ,, F ), onde: ˆ Q = {3, 25, 2, 5,, 5, }; ˆ Σ = { 5,, }; ˆ = 3; ˆ F = {}; ˆ δ é a função de transição ue pode ser resumida pela tabela abaixo. Dado um estado i (linha l) e um símbolo a Σ (coluna c), a posição (l, c) da tabela contém
3.. AUTÔMATOS FINITOS DETERMINÍSTICOS 5 o estado j resultante da transição δ( i, a). Por exemplo, se i = 3 e a =, a posição respectiva da tabela corresponde à δ(3, ) = 2. δ 5 3 25 2 5 25 2 5 2 5 5 5 5 5 Exemplo 3.2 O diagrama de estados do DFA M = ({p,, r}, {, }, δ, p, {r}), com função de transição δ(p, ) = δ(p, ) = p δ(, ) = δ(, ) = r δ(r, ) = r δ(r, ) = r é dado abaixo., start p r Um autômato pode ser visto como um máuina ue contém cinco componentes. ˆ Um registrador ue armazena o estado atual em ue a máuina se encontra. ˆ Um conjunto de estados para o registrador, ue é o conjunto de estados Q.
6 Aula 3: Autômatos Finitos ˆ Uma fita seccionada ue armazena seuencialmente, em posições contíguas, símbolos a Σ da string de entrada; ˆ Um leitor de fita ue lê o símbolo de uma secção da fita; ˆ Um conjunto de instruções, relacionado com a função de transição, ue informa a ação da máuina. Dado o estado i atual e o símbolo a Σ lido, a máuina redefine o estado do registrador para δ( i, a) e move o leitor uma posição à frente. O leitor é inicialmente posicionado na posição mais à esuerda da string na fita e o registrador começa com o estado inicial. A máuina então computa a transição de estado conforme a função δ. O processo é repetido até a cabeça de leitura encontrar uma posição vazia. Uma string é aceita pela máuina se a computação termina em um estado final. Exemplo 3.3 Dado o DFA M = ({p,, r}, {, }, δ, p, {r}), com δ(p, ) = δ(p, ) = p δ(, ) = δ(, ) = r δ(r, ) = r δ(r, ) = r e a string. A computação da máuina é mostrada abaixo. O processo termina em um estado final e a string é aceita.... p......
3.. AUTÔMATOS FINITOS DETERMINÍSTICOS 7... A string, por sua vez, não é aceita pela máuina, pois o processo termina em um estado ue não é final. r... p... p...... Pelo ue vimos no exemplo anterior, podemos definir strings ue são aceitas por um DFA. Definição 3.3. Seja M = (Q, Σ, δ,, F ) um DFA. Uma string w Σ é aceita se o processamento de w por M termina em um estado final. Uma DFA M aceita um conjunto de strings e esse conjunto define a linguagem de M. Definição 3.4. Seja M = (Q, Σ, δ,, F ) um DFA. A linguagem de M, denotada L(M), é o conjunto de strings em Σ aceitas por M. Exemplo 3.4 O DFA M = ({p, }, {, }, δ, p, {}), com função de transição δ p p p e diagrama de estados
8 Aula 3: Autômatos Finitos start p define a linguagem L(M) = {w w termina em } sobre o alfabeto Σ = {, }. Definição 3.5. A função de transição estendida ˆδ de um DFA com função de transição δ é uma função ˆδ : Q Σ Q definida recursivamente no tamanho da string de entrada: i) Base: Se w =, então w = λ e ˆδ( i, λ) = i. Se w =, então w = a, para a Σ, e ˆδ( i, a) = δ( i, a). ii) Passo recursivo: Se w é uma string de tamanho n >, então w = ua e ˆδ( i, ua) = δ(ˆδ( i, u), a). A função de transição estendida representa a aplicação repetida da função de transição. Exemplo 3.5 Seja DFA M = ({p, }, {, }, δ, p, {}), com função de transição δ p p p Dada a string, então a computação da string pode ser vista como
3.. AUTÔMATOS FINITOS DETERMINÍSTICOS 9 ˆδ(p, ) = δ(ˆδ(p, ), ) = δ(δ(ˆδ(p, ), ), ) = δ(δ(δ(ˆδ(p, ), ), ), ) = δ(δ(δ(δ(p, ), ), ), ) = δ(δ(δ(, ), ), ) = δ(δ(p, ), ) = δ(p, ) =. Dada a string, então a computação da string pode ser vista como ˆδ(p, ) = δ(ˆδ(p, ), ) = δ(δ(ˆδ(p, ), ), ) = δ(δ(δ(ˆδ(p, ), ), ), ) = δ(δ(δ(δ(p, ), ), ), ) = δ(δ(δ(p, ), ), ) = δ(δ(, ), ) = δ(, ) = p. i. A função de transição estendida ˆδ( i, w) computa ual o estado alcançado a partir de Podemos usar esse fato para definir (redefinir) as strings aceitas por um DFA (veja Definition 3.3) bem como a linguagem de uma DFA M (veja Definição 3.4). Definição 3.6. Seja M = (Q, Σ, δ,, F ) um DFA. Uma string w Σ é aceita se ˆδ(, w) F. Definição 3.7. Seja M = (Q, Σ, δ,, F ) um DFA. A linguagem de M é o conjunto
Aula 3: Autômatos Finitos L(M) = {w w Σ, ˆδ(, w) F }. Definição 3.8. Uma linguagem é chamada de linguagem regular se ela é aceita por um autômato finito determinístico. Exemplo 3.6 Vamos construir o autômato ue aceita L = {w w {, } e contém a substring }. Não existe um método para construir autômatos para uma linguagem. A tarefa é basicamente criativa. Uma dica é tentar simular o ue ocorre para cada entrada e tomar decisões sobre o ue o autômato precisa lembrar. Para a linguagem L, o autômato pode aceitar uma string se ele lembra ue processou dois s justapostos. Lembrar tal fato significa criar um estado como o significado foi lida a string. Tal estado deve ser um estado final. Mas antes de lembrar ue leu, o autômato precisa saber ue leu o primeiro. Para isso basta um estado ue signifiue a lembrança acabei de ler um e se eu ler mais um eu posso aceitar a string. O estado inicial do autômato seria o estado ainda não li a substring. Poderíamos então definir tais estados: ˆ : nenhuma substring foi lida. ˆ : acabei de ler um, estou no meio do caminho. ˆ 2 : já li a string e portanto posso aceitar a string de entrada. Nosso diagrama de estados parcial seria start 2 Agora, para cada estado, precisamos saber ual transição realizar para cada um dos símbolos do alfabeto. Se estivermos no estado e lermos um, nada ajuda no reconhecimento de. Podemos simplesmente criar uma transição de para ele mesmo e continuar lendo a entrada. Se lermos um, no entanto, podemos mudar para o estado pois estamos no meio do caminho. start 2
3.2. OPERAÇÕES REGULARES No estado, ler um significa ue não há mais possibilidade de ler. Portanto precisamos recomeçar, por exemplo, voltando ao estado inicial. Por outro lado, se lermos um significa ue acabamos de ler a seuência e podemos entrar o estado final 2. start 2 Ainda não terminamos, em um DFA todo estado possui transições para todos os símbolos do alfabeto. Aui basta criar transições de 2 para ele mesmo independentemente do símbolo do alfabeto. A string já foi aceita e tudo o ue precisamo e lê-la até o final., start 2 Formalmente, o DFA é descrito por M = ({,, 2 }, {, }, δ,, { 2 }), com função de transição δ 2 2 2 2 3.2 Operações Regulares Definimos ue DFA s aceitam linguagens regulares. Agora iremos estudar operações ue podem ser usada para construir linguagens regulares mais complexas a partir de linguagens regulares mais simples. Tais operações são chamadas de operações regulares. Definição 3.9. Dadas linguagens regulares L e L 2, as operações regulares união, concatenação e estrela de Kleene são definidas como:
2 Aula 3: Autômatos Finitos ˆ União: L L 2 = {w w L ou w L 2 } ˆ Concatenação: L L 2 = {vw v L e w L 2 } ˆ Estrela de Kleene: L = {w w 2 w 3... w k k e w k L } A concatenação de uma linguagem L com ela mesma k vezes será denotada por L k. Note ue k = na definição da estrela de Kleene significa ue λ pertence à estrela de Kleene de ualuer linguagem. Alternativamente, poderíamos pensar na definição da estrela de Kleene, para uma linguagem L, como: L = {λ} e para k L k = L k L. Portanto, L k é a concatenação de L k e L. A estrela de Kleene é, por sua vez: L = L k. Uma variação da estrela ue omite a string vazia é definida como L + = L k. k= k= Exemplo 3.7 Sejam as linguagens L = {, } e L 2 = {, }. Então L L 2 = {,,, }, L L 2 = {,,, } L = {λ} L = L L = {, } L 2 = L L = {,,, } L 3 = L 2 L = {,,,,,,, } L = L L L 2... = {λ,,,,,,,...} L + = L L 2... = {,,,,,,...}.
3.2. OPERAÇÕES REGULARES 3 Essas operações podem ser usadas para produzir descrições não ambíguas de linguagens. Exemplo 3.8 A linguagem L = {w w {, } e contém a substring }, vista anteriormente, pode ser construída por operações regulares de linguagens mais simples. Vamos considerar as linguagens L = {} e L 2 = {}, ue são regulares.. Concatenando L 2 com ela mesma obtemos a linguagem {}. 2. Realizando a união de L com L 2 obtemos {, }. 3. Aplicando a estrela de Kleene sobre a linguagem do passo dois obtemos {, }. 4. Concatenamos a linguagem do passo 3 com linguagem do passo para obter {, }. 5. Por fim, concatenamos a linguagem do passo 4 com linguagem do passo 3 para obter {, } {, }. A linguagem L pode então ser descrita como L = {, } {, } e consiste justamente em strings sobre {, } ue contêm a substring. Essa é uma forma simplificada de descrever linguagens. A primeira parte da definição, {, }, informa ue uma string pertencente a L pode conter inicialmente ualuer uantidade de s e s, inclusive pode ser a string vazia. A segunda parte,, obriga ue exista a substring. A terceira parte funciona exatamente como a primeira. Podemos pensar na definição L = {, } {, } como: Uma string ue pertence a L tem necessariamente a substring e esta pode ter como prefixo e/ou sufixo ualuer uantidade de s e s. Exemplo 3.9 Seja L a linguagem sobre {a, b} ue consiste em todas as strings ue iniciam com aa ou terminam com bb. Podemos descrevê-la como L = aa{a, b} {a, b} bb. As operações regulares definem linguagens regulares. Vimos anteriormente ue linguagens regulares são auelas ue são reconhecidas por um DFA. No entanto, construir DFA s mais
4 Aula 3: Autômatos Finitos complicados a partir de DFA s mais simples nem sempre é uma tarefa tão fácil uanto a das linguagens.