Ausberto S. Castro Vera Ciência da Computação [email protected] Linguagens Formais e Autômatos São Paulo, Janeiro, 2011 c 2008-2011 por Ausberto S. Castro Vera. Todos os direitos reservados. Copyright Nenhuma parte deste livro pode ser usada ou reproduzida por quaisquer meios sem a permissão por escrito do autor Autor Ausberto S. Castro V., fez o bacharelado em Ciências Fı́sicas e Matemáticas na Universidad Nacional de Trujillo (UNT), Perú, e tem o mestrado e doutorado em Ciência da Computação pela Universidade Federal do Rio Grande do Sul (UFRGS), Porto Alegre. Foi Professor a Tempo Integral na Universidad Nacional de Ingenierı́a (UNI), Lima, Professor Principal Experto na Universidad Nacional de Trujillo(UNT), Professor a tempo parcial da Universidad ”César Vallejo”, Trujillo, Professor a Tempo Integral na Universidade Regional Integrada do Alto Uruguai e das Missões (URI), Campus de Frederico Westphalen, Professor do Curso de Mestrado em Modelagem Matemática da Universidade Regional do Noroeste do Estado do Rio Grande do Sul (UNIJUI), Professor Visitante da Universidade Federal do Rio Grande do Sul, na Coordenação do Programa de Mestrado Interinstitucional URI-UFRGS em Matemática Aplicada,Professor a Dedicação Exclusiva do Centro Universitário Adventista de São Paulo (UNASP). Atualmente é Professor a tempo parcial da Universidade Nove de Julho (UNINOVE), Consultor integrante do BASis (Avaliador Institucional e de Cursos) do INEP/MEC (Ministério da Educação) e do Conselho Estadual de Educação de São Paulo (CEE-SP). Membro da Sociedade Brasileira de Computação (SBC), Association for Computing Machinery (ACM) e da IEEE Computer Society. ii Sumário Sumário v 1 Fundamentos Matemáticos 1 1.1 Introdução . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1.2 Conjuntos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1.3 Representação Gráfica de Conjuntos . . . . . . . . . . . . . . . . . . . 3 1.4 Especificação de Conjuntos . . . . . . . . . . . . . . . . . . . . . . . . 5 1.5 Conjuntos Especiais . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 1.6 Cardinalidade . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 1.7 Álgebra de Conjuntos . . . . . . . . . . . . . . . . . . . . . . . . . . 11 1.7.1 Operações Básicas entre Conjuntos . . . . . . . . . . . . . . . 11 1.7.2 Álgebra de Conjuntos . . . . . . . . . . . . . . . . . . . . . . . 13 1.8 Definições Recursivas . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 1.9 Seqüências . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 1.10 Relações . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 1.11 Funções . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 1.12 Indução Matemática . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 1.13 Grafos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 1.14 Árvores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 1.14.1 Propriedades e definições . . . . . . . . . . . . . . . . . . . . . 30 1.15 Exercı́cios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 2 Linguagens 2.1 33 Palavras . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 iii 2.1.1 2.2 Operações com palavras . . . . . . . . . . . . . . . . . . . . . 36 Linguagens . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 2.2.1 Especificação de Linguagens . . . . . . . . . . . . . . . . . . . 39 2.2.2 Operações sobre Linguagens . . . . . . . . . . . . . . . . . . . 40 2.3 Conjuntos Regulares . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 2.4 Expressões Regulares . . . . . . . . . . . . . . . . . . . . . . . . . . 42 2.5 Linguagens Regulares . . . . . . . . . . . . . . . . . . . . . . . . . . 44 2.6 Exercı́cios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45 3 Autômatos Finitos 49 3.1 Uma ferramenta: JFLAP . . . . . . . . . . . . . . . . . . . . . . . . . 50 3.2 Autômatos Finitos Determinı́sticos . . . . . . . . . . . . . . . . . . . 52 3.3 Autômatos Finitos Não-Determinı́sticos . . . . . . . . . . . . . . . . . 59 3.4 Autômatos Finitos e Expressões Regulares . . . . . . . . . . . . . . . 61 3.5 Transições Lambda . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62 3.6 Equivalência de autômatos . . . . . . . . . . . . . . . . . . . . . . . . 63 3.7 Exercı́cios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63 4 Gramáticas Livre de Contexto 69 4.1 Gramáticas e Linguagens . . . . . . . . . . . . . . . . . . . . . . . . . 72 4.2 Exemplos de Gramáticas e Linguagens . . . . . . . . . . . . . . . . . 74 4.3 Tipos de Gramáticas . . . . . . . . . . . . . . . . . . . . . . . . . . . 75 4.4 Gramáticas e Linguagens Regulares . . . . . . . . . . . . . . . . . . . 76 4.5 Gramáticas Regulares e Autômatos . . . . . . . . . . . . . . . . . . . 78 4.6 Exercı́cios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80 5 Autômatos de Pilha 5.1 83 Autômatos de Pilha e Linguagens . . . . . . . . . . . . . . . . . . . . 83 5.1.1 Funcionamento de un Autômato de Pilha . . . . . . . . . . . . 85 5.2 Variações de um Autômato de Pilha . . . . . . . . . . . . . . . . . . . 89 5.3 Autômatos de Pilha e Linguagens Livre de Contexto . . . . . . . . . 90 iv v 5.3.1 Construção de gramáticas livres de contexto a partir de autômatos de pilha . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91 5.4 Formas Normais de Chomsky e Greibach . . . . . . . . . . . . . . . . 93 5.5 Exercı́cios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94 6 Máquinas de Turing 97 6.1 Decidibilidade, Computabilidade e Computadores . . . . . . . . . . . 97 6.2 Máquina de Turing Padrão . . . . . . . . . . . . . . . . . . . . . . . . 99 6.2.1 Funcionamento da Máquina de Turing . . . . . . . . . . . . . 100 6.3 Máquina de Turing como Aceitantes de Linguagens . . . . . . . . . . 102 6.4 Critérios de Aceitação alternativos . . . . . . . . . . . . . . . . . . . 104 Referências Bibliográficas 104 Capı́tulo 1 Fundamentos Matemáticos 1.1 Introdução Neste capı́tulo apresentamos un conjunto de fundamentos matemáticos básicos e necessários para entender as Linguagens Formais e os Autômatos. Assumimos que o leitor está familiarizado com a Teoria dos Conjuntos, relações e funções. Neste texto são apresentados apenas as definições e exemplos, de maneira muito superficial, porém, formal. Um bom pré-requisito para esta matéria é a disciplina de Matemática Discreta. 1.2 Conjuntos Definição 1.1 Conjunto Conjunto é uma coleção bem definida de zero ou mais objetos distintos, que possuem uma propriedade comum. Da definição devemos destacar três aspectos: • A coleção de objetos: deve ser bem definida, isto é, sem ambigüidades, dúvidas, incertezas. Coleções bem definidas permitem facilmente decidir se um objeto faz parte ou não de um conjunto. A coleção de objetos: a, b, *, &, gato, ♣, ./, impressora, F, quadrado, árvore, m, n, P, S, Z, não poderia ser considerada como conjunto, pois não é fácil identificar que objeto faz parte e que objeto não faz parte da coleção. • Os objetos: são entidades reais (concretas, que existem no mundo real, tais como, livros, canetas, disquetes, frutas, etc.) ou abstratas (entidades intangı́veis, que existem no mundo abstrato ou imaginário, tais como, números, letras, vogais, arquivos, programas, comandos, etc.) 1 2 Linguagens Formais e Autômatos - Prof. Ausberto S. Castro V. • A propriedade comum: é a caracterı́stica que distingue aos objetos de um conjunto com os objetos de outro conjunto, que caracteriza os objetos que estão “dentro” do conjunto dos objetos que estão “fora” do conjunto. Exemplo 1.1 Conjunto de letras: a, b, c, d, . . . , x, y, z Exemplo 1.2 Conjunto de números inteiros . . . , −2, −1, 0, 1, 2, 3, 4, 5, . . . Exemplo 1.3 Conjunto Famı́lia: pai, mãe, filho, filha Exemplo 1.4 Conjunto Casa: sala, dormitório, banheiro, cozinha, copa, garagem Exemplo 1.5 Conjunto time-futebol: goleiro, defesa, lateral, meio-campo, atacante Exemplo 1.6 Conjuntos concretos: conjunto de computadores, conjunto de monitores, conjunto de placas de rede, conjunto de folhas de impressão, conjunto de CD’s de programas gráficos, conjunto de alunos de Computação, etc. Exemplo 1.7 Conjunto abstratos: conjunto de gatos sem cabeça, conjunto de lâmpadas digitais, conjunto de livros sem folhas, conjunto de alfabetos sem letras, conjunto de árvores sem raiz, conjunto de programas em linguagem Fortran, conjunto de programas Delphi, etc. Definição 1.2 Elemento Os objetos de um conjunto são chamados de elementos do conjunto. Um elemento ou membro de um conjunto, é uma entidade básica a qual não é definida formalmente e que possui a propriedade comum que caracteriza todos os objetos do conjunto.♦ Exemplo 1.8 Suponha que o conjunto Computador esta formado pelos objetos processador, placa-mae, monitor, teclado, mouse, dispositivos E/S. Então podemos dizer que, processador é um elemento do conjunto Computador. Definição 1.3 Relação de Pertinência O relacionamento entre um elemento e um conjunto é dado pela relação de pertinência. Este relacionamento, denotado pelo sı́mbolo ∈, indica quando um elemento é membro ou não de um determinado conjunto. Assim, se um elemento a é membro de um conjunto X, dizemos que o elemento a pertence ao conjunto X e podemos escrever: a∈X Similarmente, se um elemento b não é membro de um determinado conjunto Y (não possui a propriedade comum que caracteriza o conjunto Y), dizemos que b não pertence ao conjunto Y, e escrevemos: b 6∈ Y 3 1.3. REPRESENTAÇÃO GRÁFICA DE CONJUNTOS Quando dois elementos p e q ambos pertencem a um conjunto X, então escrevemos p, q ∈X. Similarmente, no caso contrário, escrevemos p, q 6∈X Definição 1.4 Notação de Conjuntos Um conjunto qualquer A é denotado por duas chaves { e } junto com os elementos dentro das chaves. A = {elementos do conjunto} Por comodidade e facilidade de leitura, o nome do conjunto, sempre se escreve com letras maiúsculas (pelo menos a primeira letra do nome) e os nomes dos elementos com letras minúsculas. Exemplo 1.9 A = {a} é o conjunto unitário formado por um único elemento a X = {P edro, Laura} é o conjunto composto de dois elementos P edro e Laura. N6 = {1, 2, 3, 4, 5, 6} é o conjunto de números inteiros positivos menores que 7 Z5 = {. . . , −20, −15, −10, −5, 0, 5, 10, 15, 20, . . .} é conjunto de números inteiros que são múltiplos de 5 Exemplo 1.10 A = {a, b, c, d} X = {2, 5, 8} F igGeom = {4, , } a ∈ A, b, c, d ∈ A 2 ∈ X, a 6∈ X ∈ F igGeom Exemplo 1.11 Conjuntos Numéricos N = conjunto de todos os números inteiros não negativos Z = conjunto de todos os números inteiros Q = conjunto de todos os números racionais R = conjunto de todos os números reais C = conjunto de todos os números complexos Definição 1.5 Ordem dos elementos Em um conjunto qualquer, a ordem dos elementos não tem importância, isto é, não existe o conceito de primeiro elemento, segundo elemento ou último elemento do conjunto. A = {a, b, c} = {b, c, a} = {c, a, b} = {a, c, b} 1.3 Representação Gráfica de Conjuntos Para identificar graficamente quais elementos pertencem a um conjunto (e quais não pertencem), utiliza-se esquemas gráficos construı́dos com curvas fechadas (cı́rculos, 4 Linguagens Formais e Autômatos - Prof. Ausberto S. Castro V. elipses, etc.)junto com os elementos do conjunto dentro da curva fechada. Estes gráficos são chamados de Diagramas de Venn. John Venn (1834-1923) foi um matemático inglês que publicou seu trabalho em 1880, em um artigo titulado “Sobre representação diagramática e mecânica de proposições e raciocı́nios”. Venn propôs a idéia de representar as relações entre conjuntos através de configurações de figuras no plano. O objetivo dele, claramente formulado naquele artigo: ...antes de mais nada os diagramas servem para auxiliar o olho e a mente graças a natureza intuitiva do seu testemunho... foi plenamente alcançado, já que 125 anos mais tarde todos os livros elementares de matemática usam este dispositivo gráfico para introduzir nos alunos o conhecimento da Teoria de Conjuntos. A .13 .a .x .2 .7 .1 .b .5 B Figura 1.1: Diagramas de Venn para os conjuntos A e B Inicialmente, Venn utilizou cı́rculos para representar conjuntos e relacionamentos entre conjuntos (Fig. 1.2) e logo depois utilizou elipses (Fig. 1.3). Y A X B Z Figura 1.2: Diagramas de Venn para 2 e 3 conjuntos 5 1.4. ESPECIFICAÇÃO DE CONJUNTOS Figura 1.3: Diagramas de Venn para 4 e 5 conjuntos 1.4 Especificação de Conjuntos Indicar a caracterı́stica de todos os elementos de um conjunto, isto é, descrever a propriedade comum que caracteriza cada elemento de um conjunto, significa especificar o conjunto. Conjuntos podem ser especificados(descritos) de duas formas: • Por Extensão: quando é possı́vel listar (enumerar) todos os elementos do conjunto. Exemplo 1.12 A = {a, b, c, d, e} Exemplo 1.13 B = {1, 2, 3, 5, 7, 11, 13, 19, 23, 29} Exemplo 1.14 Linguagens = {Pascal, C++, Fortran, Basic, Lisp, Matlab} Exemplo 1.15 Empresas = {IBM, Oracle, Sun, Dell, Intel, Brasoftware} • Por Compreensão: indicando, estabelecendo a propriedade que caracteriza todos os elementos do conjunto. O conjunto A de todos os elementos a que satisfazem a propriedade ρ é denotado por: {a ∈ A/ρ(a)} ρ(a) significa: “o elemento a satisfaz a propriedade ρ”, ou “ρ(a) é verdadeiro”. Exemplo 1.16 jetos } LinguagensObjeto = {L/L é uma linguagem Orientad a Ob- 6 Linguagens Formais e Autômatos - Prof. Ausberto S. Castro V. Exemplo 1.17 Compiladores = {c/c é um compilador} Obviamente, outros objetos tais como Eiffel, Smalltalk e C++ também são elementos de LinguagensObjeto. Também, MS Visual C, C++ Builder, Compaq Fortran são elementos do conjunto Compiladores. Outras formas de especificar um conjunto por compreensão: {a ∈ A|ρ(a)} utilizando o separador | (barra vertical) {a ∈ A : ρ(a)} utilizando o separador : (dois pontos) Exemplo 1.18 N = {x : x ∈ N, x < 5} P = {y : y ∈ Z, y é par } L = {z|z ∈ H, z é divisı́vel por 7} Definição 1.6 Conjunto Finito, Conjunto Infinito Um conjunto qualquer A é dito ser finito se é possı́vel especificar o conjunto por extensão, o seja, listar todos os seus elementos. Caso contrário, isto é, quando somente é possı́vel especificar tal conjunto por compreensão e não por extensão, dizemos que o conjunto é infinito. Exemplo 1.19 Conjuntos finitos: A = { 2, 4, 5, 9, 23} B = { a, b, c, d } V = { a, e, i, o, u} S = {a ∈ Z / 9 ≤ a ≤ 14} = {10, 12, 14} Exemplo 1.20 Conjuntos infinitos: Números Naturais N Intervalo de números reais: 8 ≤ x < 15, onde x ∈ R Conjunto de estrelas do céu. Zp = {x ∈ Z / x é um número primo} Definição 1.7 Conjunto Universal Em qualquer aplicação da teoria dos conjuntos, os membros do conjunto de todos os conjuntos de uma determinada área de aplicação, as vezes formam um conjunto muito grande chamado Conjunto Universal ou Universo do discurso. É comum denotar o conjunto universal de n conjuntos especı́ficos como a coleção de todos os objetos desses n conjuntos. Este conjunto é denotado pela letra U. O conjunto universal define o contexto ou ambiente dos objetos em discussão. Exemplo 1.21 U = conjunto de todos os computadores A = conj. computadores pessoais B = conj. supercomputadores 7 1.5. CONJUNTOS ESPECIAIS U= U= U= U= C = conj. computadores portáteis conjunto de todas as linguagens de programação X = conj. linguagens orientadas a objetos Y = conj. de linguagens para Banco de Dados V = conj. de linguagens visuais LIA = conjunto de linguagens para Inteligência Artificial conjunto de todos livros de Computação conjunto de todas as letras do alfabeto conjunto de todos os números inteiros Exemplo 1.22 Se A={1, 5, 7}, B={3, 6, 15} e C={8, 25}, então U = Z Definição 1.8 Conjunto vazio ou Nulo O conjunto sem elementos, é chamado conjunto vazio, e é denotado pelo sı́mbolo ∅ ou por {}. Este conjunto é único. Exemplo 1.23 - o conjunto de - o conjunto de - o conjunto de - o conjunto de - etc. todas as linguagens de programação sem nome livros lı́quidos teclados sem caracteres satélites da Lua Definição 1.9 Elementos repetidos Um elemento repetido mais de uma vez na especificação por extensão de um conjunto representa um único elemento. X = {a, b, a, c, b, a, a, c, d, b, c, a, b} = {a, b, c, d} 1.5 Conjuntos Especiais Definição 1.10 Subconjunto, inclusão Se cada elemento de um conjunto B é também um elemento de um conjunto A (ver Fig. 1.4 esquerda), então afirma-se que B é um subconjunto de A, ou também diz-se que o conjunto B esta contido ou incluı́do no conjunto A, ou que o conjunto A contém ou inclui o conjunto B. Este relacionamento1 (de inclusão), é escrito como: B ⊆ A or A ⊇ B Exemplo 1.24 1 B = {2, 45, 168} e A = {1, 2, 3, 45, 120, 168, 200}. Logo B ⊆ A. O relacionamento entre elementos e seu conjunto é indicado através da relação de pertinência ∈. Por exemplo, x ∈A. O relacionamento entre um subconjunto e seu conjunto, é indicado pela relação de continência ⊆. Por exemplo, X⊆A 8 Linguagens Formais e Autômatos - Prof. Ausberto S. Castro V. Exemplo 1.25 Se X ={a, b} e Y = {a, b, c, d} então X ⊆ Y Exemplo 1.26 Se M = {x ∈ R/3 < x ≤ 7} e N = {y ∈ R/−1 ≤ y < 20} então M⊆N. Definição 1.11 Subconjunto próprio Um subconjunto N é dito ser um subconjunto próprio de M (ver Fig. 1.4 direita), e denotamos por N⊂M, se: • N é subconjunto de M, isto é, N⊆M • Existe pelo menos um elemento x de M que não é elemento de N Exemplo 1.27 Se P = {m, n} e Q = {m, n, t, u} então P⊂Q A .a B .c .b M .p .u .y N .x Figura 1.4: Subconjunto e Subconjunto próprio Definição 1.12 Conjuntos Iguais Os conjuntos A e B são iguais, e denotamos por A = B, se e somente se eles tem os mesmos elementos, ou seja, A = B se e somente se A ⊆ B e B ⊆ A Exemplo 1.28 Seja A ={a, b, c} e B = {a, c, b, a, b, b, c}, então A = B Observação.- O fato de dois conjuntos ter o mesmo número de elementos não significa que eles sejam iguais, pois um conjunto é definido qualitativamente (propriedade comum) e não quantitativamente (número de elementos). Definição 1.13 Conjunto Complemento Seja A um subconjunto próprio de S, como mostrado na Fig.1.5, então S consiste de todos os elementos de A junto com outros elementos que não estão em A. O conjunto destes últimos elementos: {x/x ∈ S, x 6∈ A} constituem outro subconjunto próprio de S chamado o complemento de A em S. O complemento de A é denotado por Ac 9 1.5. CONJUNTOS ESPECIAIS Complemento de A em S S A S .p .y .u A .x Figura 1.5: Complemento de um conjunto Exemplo 1.29 Seja S = {a, b, c, d} então {a}c = {b, c, d} em S {a, b}c = {c, d} em S {a, b, c}c = {d} em S {a, b, c, d}c = S c = ∅ em S. Definição 1.14 Conjunto Potência Dado um conjunto A qualquer, definimos o conjunto potência ou conjunto de partes de A, e denotamos por P(A) ou 2A , como sendo o conjunto de todos os sub-conjuntos de A. Exemplo 1.30 A = { 2, 3, 7} P(A) = 2A = {∅, {2}, {3}, {7}, {2, 3}, {2, 7}, {3, 7}, A} Exemplo 1.31 B = {a, b} P(B) = 2B = {∅, {a}, {b}, {a, b}} Observação 1.- Os conjuntos ∅ (conjunto vazio) e A, sempre são elementos do conjunto potência P(A) Observação 2.- O número de elementos do conjunto potência de um conjunto A, é dada pela fórmula: n P(A) = n(2A ) = 2n(A) onde n(A) é número de elementos do conjunto A Exemplo 1.32 Exemplo 1.33 Se M = {a, b, c}, n(M )=3 então n P(M ) = 2n(M ) = 23 = 8 Se X = {3, 6, 7, 9, 15}, n(X)=5 e n P(X) = 2n(X) = 25 = 32 10 Linguagens Formais e Autômatos - Prof. Ausberto S. Castro V. 1.6 Cardinalidade Definição 1.15 Cardinalidade de um conjunto A cardinalidade de um conjunto A, denotada por #A ou n(A), é definida como sendo o número de elementos do conjunto. Aparentemente, somente conjuntos finitos poderiam ter cardinalidade, pois só deles poderiam-se verificar o seu número de elementos. Porém, conjuntos infinitos também tem cardinalidade. Além de #A ou n(A), em alguns textos de Matemática, também pode-se encontrar a cardinalidade de um conjunto denotada como card(A) ou |A|. Exemplo 1.34 Se A={4, 7, 26} então #A = n(A) = card(A) = |A| = 3, pois o número de elementos de A é 3. Definição 1.16 Conjuntos Equipotentes Dois conjuntos A e B são ditos equipotentes ou terem o mesmo número de elementos ou a mesma cardinalidade, se existe uma correspondência um-a-um (injetiva)2 se entre os elementos do conjunto A e os elementos do conjunto B. • Um conjunto A é finito ou tem cardinalidade finita se A é vazio ou se A tem a mesma cardinalidade do conjunto {1, 2, 3, ..., m} para algum inteiro positivo m. Neste caso, #A = m. • Um conjunto A é infinito se existe uma bijeção entre A e um subconjunto próprio de A, isto é, se A tem um subconjunto próprio com a mesma cardinalidade. • Um conjunto que tem a mesma cardinalidade que o conjunto de números naturais N é dito ser contável ou contavelmente infinito. O termo contável refere-se quase sempre a conjuntos finitos ou contavelmente infinitos. Exemplo 1.35 O conjunto de números naturais ı́mpares NI é contavelmente infinito. A função f (n) = 2n + 1 estabelece a correspondência injetiva entre N e NI. Exemplo 1.36 Os pontos de uma grade infinita bidimensional pode ser usada para mostrar que o produto cartesiano N × N é contável. A correspondência pode ser a seguinte g(i, j) = ((i + j)(i + j + 1)/2) + i e mostrada como: 0 l [0, 0] 2 1 l [0, 1] 2 l [1,0] 3 l [0,2] 4 l [[1,1] 5 l [2,0] 6 l [0,3] 7 l [1,2] ... ... O termo “correspondência injetiva”, “injeção”, “bijeção”, serão estudados na seção de Funções, no final deste capı́tulo 1.7. ÁLGEBRA DE CONJUNTOS 11 Teorema 1.1. • A união de dois conjuntos contáveis é contável. • O produto cartesiano de dois conjuntos contáveis é contável. • O conjunto de sub-conjuntos finitos de um conjunto contável é contável. • O conjunto de seqüências de tamanho finito de elementos de um conjunto contável não vazio, é contavelmente infinito. 1.7 Álgebra de Conjuntos Informalmente uma Álgebra é uma dupla < Ob, Op > formada por uma coleção de objetos e um conjunto de operações definidas sobre estes objetos. Definição 1.17 Álgebra de Conjuntos É uma coleção de conjuntos com operações definidas sobre conjuntos 1.7.1 Operações Básicas entre Conjuntos A seguir apresenta-se as operações básicas sobre conjuntos considerando sempre que, em cada operação, temos um ou dois conjuntos A e B que pertencem ao mesmo conjunto universal U, isto é, estão no mesmo contexto. • Definição 1.18 União de Conjuntos A união dos conjuntos A e B, denotada por A∪B, é definida por: A ∪ B = {x/x ∈ A ou x ∈ B} • Definição 1.19 Intersecção de Conjuntos A intersecção (ou interseção) dos conjuntos A e B, denotada por A∩B, é definida por: A ∩ B = {x/x ∈ A e x ∈ B} • Definição 1.20 Complemento de um conjunto O complemento de um conjunto A⊆U, denotado por A0 , Ac , ∼A ou C(A), é definido por: A0 = Ac = {x/x ∈ U e x 6∈ A} 12 Linguagens Formais e Autômatos - Prof. Ausberto S. Castro V. • Definição 1.21 Diferença de Conjuntos A diferença dos conjuntos A e B, denotado por A-B, é definido por: A − B = {x/x ∈ A e x 6∈ B} B A A∩B A∪B B A B A A-B Conjunto Universal Ac U A Figura 1.6: Operações básicas entre conjuntos Exemplo 1.37 Seja A = {a, b, c, d}, B = {c, d, , e, f, g}, e C = {b, c, e, g}, então A∪B = {a, b, c, d, e, f, g} A∩B = {c, d} A∪C = {a, b, c, d, e, g} A∩C = {b, c} A-B = {a, b} A-C = {a, d} Exemplo 1.38 Se M = {3, 4, 6, 8} e N = {4, 8}, logo M∪N = {3, 4, 6, 8}, M∩N = {4, 8}, e M-N = {3, 6} O conjunto potência pode ser considerado como uma operação unária sobre um conjunto qualquer A: 2A = {S|S ⊆ A} Similarmente, o produto cartesiano (será visto no próximo capı́tulo), pode ser considerado como uma operação entre dois conjuntos: A × B = {(a, b)/a ∈ A e b ∈ B} Definição 1.22 Conjuntos Disjuntos Dois conjuntos A e B são disjuntos se eles não tem nenhum elemento comum, isto é, se A∩B = ∅. Exemplo 1.39 A = {a, b, c} e B = {d, ef } são disjuntos pois A∩B = ∅ Exemplo 1.40 G = {2, 5, 7} e H = {3.1, 4.8, 9.99} são disjuntos, pois G∩H = ∅ 1.7. 13 ÁLGEBRA DE CONJUNTOS Tabela 1.1: Álgebra de Conjuntos Lei Equivalência Idempotência A ∪ A = A A∩A=A Associativa A ∪ (B ∪ C) = (A ∪ B) ∪ C A ∩ (B ∩ C) = (A ∩ B) ∩ C Comutativa A ∪ B = B ∪ A A∩B =B∩A Distributiva A ∩ (B ∪ C) = (A ∩ B) ∪ (A ∩ C) A ∪ (B ∩ C) = (A ∪ B) ∩ (A ∪ C) Identidade A ∪ ∅ = A A∪U =U A∩U =A A∩∅=∅ Complemento A ∪ Ac = U A ∩ Ac = ∅ Uc = ∅ ∅c = U Involução (Ac )c = A Absorção A ∪ (A ∩ B) = A A ∩ (A ∪ B) = A De Morgan (A ∪ B)c = Ac ∩ B c (A ∩ B)c = Ac ∪ B c Diferença A − B = A ∩ B c Diferença Simétrica A ⊕ B = (A ∪ B) − (A ∩ B) 1.7.2 Álgebra de Conjuntos Conjuntos sob as operações básicas de união, intersecção e complemento satisfazem várias leis ou identidades (na forma de igualdades). Estas identidades são utilizadas para facilitar e justificar a prova de outras operações mais complexas com conjuntos. Desta forma, cada vez que for necessário fazer uma prova em operações com conjuntos, será necessário indicar qual identidade foi utilizada. Na Tabela 1.1, apresenta-se uma lista básica de identidades L1 = L2 que são utilizadas na Álgebra de Conjuntos: Exemplo 1.41 Provar que (A ∪ B) ∩ (A ∪ B c ) = A. (A ∪ B) ∩ (A ∪ B c ) Prova = A ∪ (B ∩ B c ) = A∪∅ =A Lei distributiva L2=L1 Lei do Complemento ∩ Lei de identidade 14 Linguagens Formais e Autômatos - Prof. Ausberto S. Castro V. Exemplo 1.42 Provar que A ∪ (A ∩ B) = A. A ∪ (A ∩ B) Exemplo 1.43 = = = = Prova (A ∪ A) ∩ (A ∪ B) A ∩ (A ∪ B) A∩U A Lei distributiva L1=L2 Lei de Idempotência ∪ Def. de Universo A∪B = U Lei de Identidade Provar que [C ∩ (A ∪ B)] ∪ [(A ∪ B) ∩ C c ] = A ∪ B. [C ∩ (A ∪ B)] ∪ [(A ∪ B) ∩ C c ] Prova = = = = [(A ∪ B) ∩ C] ∪ [(A ∪ B) ∩ C c ] (A ∪ B) ∩ (C ∪ C c ) (A ∪ B)∩U A∪B (comutativa) (distributiva) (complemento) (identidade) Existem dois métodos para provar equações L1 = L2 sobre conjuntos utilizando Álgebra de Conjuntos: • Fixando um elemento x que satisfaz, primeiro o lado esquerdo L1, e logo aplicando as identidades da Álgebra de Conjuntos, mostrar que também satisfaz o lado direito L2. Aqui usamos a definição de igualdade de conjuntos: A = B se e somente se A⊆B e B⊆A. O seja mostrar que L1⊆L2 e logo L2⊆L1 • Utilizando Diagramas de Venn (com uma cor diferente para cada conjunto) Definição 1.23 Dualidade de Expressões Seja E uma expressão formada por operações sobre conjuntos. Então o dual E∗ de E, é outra expressão obtida ao substituir cada ocorrência de ∪, ∩, U e ∅ em E, por ∩, ∪, ∅ e U, respectivamente. Exemplo 1.44 1.8 O dual de (A ∩ U ) ∩ (∅ ∪ Ac ) é a expressão (A ∪ ∅) ∪ (U ∩ Ac ) Definições Recursivas Definição 1.24 Definição Recursiva Uma definição recursiva de um conjunto X especifica um método para a construção do conjunto. Esta definição utiliza duas componentes: a base e o conjunto de operações. • A base consiste de um conjunto finito de elementos que são explicitamente designados como elementos do conjunto X. 15 1.9. SEQÜÊNCIAS • As operações são utilizadas para construir novos elementos do conjunto, a partir dos elementos previamente definidos. Então, o conjunto X definido recursivamente é o conjunto de todos os elementos que podem ser gerados a partir dos elementos da base por um número finito de aplicações das operações. Exemplo 1.45 A definição recursiva de N, o conjunto de números naturais, é construı́da usando a função sucessor succ. • Base: 0 ∈N • Passo Recursivo: Se n ∈ N, então succ(n) ∈ N • Fecho: n ∈N somente se este pode ser obtido a partir de 0 por um número finito de aplicações da operação succ. Exemplo 1.46 Definição recursiva da Soma (adição): • Base: Se n = 0, então m + n = m • Passo recursivo: m + succ(n) = succ(m + n) • Fecho: m + n = k somente se a igualdade pode ser obtida de m + 0 = m usando um número finito de aplicações do passo recursivo. 1.9 Seqüências Uma coleção de objetos pode ser agrupada utilizando algumas estruturas matemáticas. A maneira mais simples vista até agora é sob o conceito de conjunto. Outras estruturas são: matrizes, álgebras, seqüências, etc. Definição 1.25 Seqüência Seqüência é uma lista indexada (ordenada) de objetos chamados termos ou componentes e é denotada listando os objetos entre parênteses: (o1 , o2 , . . . , on ) Em uma seqüência, a cada termo está associado um ı́ndice (número natural) Outra definição: Uma seqüência é uma estrutura discreta usada para representar uma lista ordenada de objetos. Exemplo 1.47 (a, b, c, d) é uma seqüência de quatro termos 16 Linguagens Formais e Autômatos - Prof. Ausberto S. Castro V. Exemplo 1.48 Consideremos a seqüência (bm ), onde bm = 1/n. A lista de termos da seqüência (b1 , b2 , . . .) é 1 1 1 (1, , , , . . .) 2 3 4 Conjuntos e seqüências na Matemática desempenham roles de reunião, ajuntamento, coleção de objetos. Porém existem algumas diferenças entre as duas estruturas: • Todos os elementos de um conjunto são diferentes (elementos especificados como repetidos representam o mesmo elemento). Termos em uma seqüência podem ser especificados como repetidos representando termos diferentes. Por exemplo, (a, b, a) é uma seqüência válida de três termos, porém, {a, b, a, b, a} é um conjunto de dois elementos {a, b} • Os termos de uma seqüência tem um ordem especificado (ı́ndice). os elementos de um conjunto não tem ordem. Por exemplo, as seqüências (x, y, z) e (z, y, x) são diferentes, enquanto que, os conjuntos {x, y, z} e {z, y, x} são iguais. • O conjunto vazio é denotado pelo sı́mbolo ∅, enquanto que a seqüência vazia é denotado pelo sı́mbolo λ Uma generalização e formalização de seqüências de elementos será descrita no seção ?? Um problema muito comum em Matemática Discreta é encontrar uma fórmula matemática ou regra geral que permita construir o conjunto de termos de uma seqüência. Assim por exemplo, n2 : regra para produzir o quadrado dos naturais (1, 4, 9, 16, 25, . . .) 2n : regra para produzir a seqüência (2, 4, 8, 16, 32, 64, 128, 256, 512, . . .) n(n + 1)/2 : regra para produzir a seqüência (1, 3, 6, 10, 15, . . .) 1.10 Relações Definição 1.26 Relação Sejam A e B dois conjuntos qualquer. Uma relação binária R é uma subconjunto do produto cartesiano A×B. Em outras palavras, uma relação binária R, é um conjunto de pares ordenados, onde cada primeiro elemento pertence ao conjunto A e cada segundo elemento pertence ao conjunto B. R = {(a, b)|a ∈ A, b ∈ B} Se R ⊆ A × B, então: 17 1.10. RELAÇÕES • A é chamado o domı́nio da relação • B é chamado o contra-domı́nio (ou codomı́nio) da relação Visualização de Relações Binárias Quando o conjunto B é o mesmo conjunto A, isto é, quando R ⊆ A × A, é dita uma relação sobre A. Uma relação pode ser ”visualizada” através de quatro formas gráficas, como mostra a Fig. 1.7: • Tabelas: pares com interseção 1 são elementos da relação • Diagramas de Venn: conjuntos e setas relacionando elementos • Grafos direcionados: vértices são os elementos e, arestas (arcos) são os relacionamentos. • Conjuntos: de pares ordenados B A x 1 0 2 0 3 0 y 1 0 1 A z 1 0 0 .1 1= relacionado 0 = não relacionado R Tabelas 3 R .x .2 .y .3 .z Diagrama de Venn 1 Grafo direcionado B R 2 Lista (conjunto) 4 R= { (a1 , b1 ), (a1 , b3 ), (a3 , b3 ) } Figura 1.7: Visualização gráfica de uma relação Tipos (Propriedades) de Relações.- Dados dois conjuntos A e B, então, temos três tipos de relações: Relação Reflexiva , se para todo a ∈ A, temos (a, a) ∈ R Relação Simétrica , se (a, b) ∈ R, então (b, a) ∈ R. Relação Antissimétrica , se (a, b) ∈ R e (b, a) ∈ R então a = b Relação Transitiva , se (a, b) ∈ R e (b, c) ∈ R, então (a, c) ∈ R 18 Linguagens Formais e Autômatos - Prof. Ausberto S. Castro V. Relação de Ordem.- Seja A um conjunto qualquer e R uma relação em A. Então R é uma: Relação de Ordem , se é transitiva. Relação de Ordem Parcial , se é reflexiva, antissimétrica e transitiva. Relação de Ordem Total , se é uma relação de ordem parcial e, para todo par a, b ∈ A, ou (a, b) ∈ R ou (b, a) ∈ R Exemplo 1.49 • A relação ⊆ (inclusão de conjuntos) é uma relação de ordem parcial sobre qualquer coleção de conjuntos. • A relação ≤ sobre o conjunto R de números reais, é reflexiva, antisimétrica e transitiva (ordem parcial) • R = {(a, b)|b = ar para algum inteiro positivo r} é de ordem parcial sobre Z Relação de Equivalência.- Sejam A um conjunto qualquer e R uma relação em A. Então R é uma relação de equivalência se for reflexiva, simétrica e transitiva. Exemplo 1.50 A classificação de animais por espécies, isto é, a relação ”é da mesma espécie como”, é uma relação de equivalência sobre o conjunto dos animais. Exemplo 1.51 Seja m um inteiro positivo fixo. Dois inteiros a e b diz-se ser congruentes modulo m, escrito a ≡ b (mod m), se m divide a − b. Uma relação de equivalência R sobre um conjunto A, induz um particionamento do conjunto A em subconjuntos disjuntos e não vazios denominados classes de equivalência [a] = {x|(a, x) ∈ R} Qualquer b ∈ [a] é chamado um representante da classe de equivalência. Exemplo 1.52 Seja R sobre S = {1, 2, 3}. R = {(1, 1), (1, 2), (2, 1), (2, 2), (3, 3)} então [1] = {1, 2} [2] = {1, 2} [3] = {3} Fecho de uma relação.- Considere um conjunto qualquer A e a coleção de todas as relações sobre A. Seja P uma propriedade de tais relações. • Uma relação com a propriedade P será chamada uma P-relação. Então o Fecho de R respeito da propriedade P, ou P-fecho, é a menor relação que contém R e que satisfaz a propriedade P R ⊆ P(R) ⊆ S para cada relação S que contém R 19 1.10. RELAÇÕES • R+: O fecho de R em relação ao conjunto de propriedades {transitiva}, denominado Fecho transitivo de R e denotado por R+, é definido como segue: – Se (a, b) ∈ R, então (a, b) ∈ R+ – Se (a, b) ∈ R+ e (b, c) ∈ R+, então (a, c) ∈ R+ – os únicos elementos de R+ são os construı́dos como acima; • R*: O fecho de R em relação ao conjunto de propriedades {transitiva, reflexiva}, denominado Fecho Transitivo e Reflexivo de R e denotado por R*, é tal que: R∗ = R+ ∪ {(a, a)|a ∈ A} 1 1 5 5 2 2 Grafo 6 3 6 3 Fecho 4 4 Figura 1.8: Grafo e respectivo fecho Exemplo 1.53 Fecho de um Grafo visto como uma Relação. Um grafo pode ser definido como uma relação A de arestas em um conjunto de V de vértices: A = {((1, 2), (2, 3), (3, 4), (1, 5), (5, 6)} é um grafo em V = {1, 2, 3, 4, 5, 6} como ilustrado na Fig. 1.8 (esquerda), onde o par ordenado que define uma aresta é representado por uma seta na qual as circunferências de origem e de destino representam a primeira e a segunda componente do par, respectivamente. O fecho transitivo e reflexivo: A∗ = {(1, 1), (1, 2), (1, 3), (1, 3), (1, 4), (1, 5), (1, 6), ...} onde as arestas adicionadas pelo fecho são representadas por um traço diferente. 20 Linguagens Formais e Autômatos - Prof. Ausberto S. Castro V. 1.11 Funções Definição 1.27 Função, Função Parcial Uma função parcial f ou simplesmente função f , e denotada por f : A −→ B é uma relação f ⊆ A × B tal que se (a, b) ∈ f e (a, c) ∈ f , então b = c. Em outras palavras, uma função parcial é uma relação onde cada elemento do domı́nio está relacionado com um único elemento do contradomı́nio. Se (x, y) pertence à função então escrevemos f (x) = y Se (x, y) ∈ f então dizemos que y é a imagem de x sob f , e dizemos também que f esta definida em x. Em Computação costuma-se dizer que f (x) é o valor da função f no parâmetro x • A é conjunto de partida e B é o conjunto de chegada da função f • O conjunto {a ∈ A/ existe b ∈ B com f (a) = b} é denominado domı́nio de f e é denotado por Dom(f ). • O conjunto {b ∈ B/ existe a ∈ A com f (a) = b} é denominado conjunto imagem de f e é denotado por f (A) ou Img(f ). Figura 1.9: Função entre dois conjuntos A e B Exemplo 1.54 Sejam A = {1, 2, 3, 4} e B = {1, 3, 5, 7, 9} e f : A −→ B f = {(1, 3), (2, 1), (4, 5)} 21 1.11. FUNÇÕES Dom(f ) = {1, 2, 4} ⊆ A Img(f ) = {1, 3, 5} ⊆ B Exemplo 1.55 Sejam M = {a, b, c, d} e N = {2, 3, 4, 7, 8} e g : M −→ N g = {(a, 3), (c, 2), (a, 7), (b, 3)} então g não é função, devido a que o elemento a de M está relacionado com mais de um elemento (3 e 7) de N : (a, 3) e (a, 7) Definição 1.28 Função Total ou Aplicação Uma função total é uma função parcial f : A −→ B onde para todo elemento a ∈ A existe um b ∈ B tal que f (a) = b. Em outras palavras, uma função total é uma função parcial definida para todos os elementos do conjunto de partida de f . Exemplo 1.56 então Seja d = {3, 4, 7} −→ {7, 9, 10, 15, 19} definida por d(x) = 2x + 1, d = {(3, 7), (4, 9), (7, 15)} é total. Definição 1.29 Composição de Funções Sejam duas funções f : A −→ B e g : B −→ C (Fig.1.10), então definimos a função composta de de f e g do conjunto A para o conjunto C, e denotamos por g ◦ f . como (g ◦ f )(a) = g(f (a)) Figura 1.10: Composição de funções Exemplo 1.57 Seja A = {2, 3, 5}, B = {a, b, c, d}, C = {3, 4, 5, 9} f = {(2, b), (3, a), (5, d)} g = {(a, 3), (b, 4), (c, 5)} então: g ◦ f = {(2, 4), (3, 3)} Exemplo 1.58 Sejam h e k funções definidas sobre o conjunto dos números inteiros Z da seguinte forma: h(x) = x2 + x, e k(y) = y + 5, então: (k ◦ h)(x) = k(h(x)) = k(x2 + x) = (x2 + x) + 5 22 Linguagens Formais e Autômatos - Prof. Ausberto S. Castro V. Definição 1.30 Função Inversa Seja f : A −→ B uma função, então • Dom(f ) ⊆ A • Img(f ) ⊆ B • f −1 (Img(f )) denota o conjunto de elementos a de A tal que a sua imagem pertence a Img(f ), como mostrada na Fig.1.11. O conjunto f −1 (Img(f )) ⊆A é chamada de imagem inversa ou pre-imagem de f (Dom(f )). f −1 é chamada de função inversa de f Se f : A −→ B é definida por f = {x, y)/x ∈ A, y ∈ B e f (x) = y} então f −1 = {y, x)/y ∈ B, x ∈ A, e f −1 (y) = x} Figura 1.11: Função inversa f −1 : B −→ A Definição 1.31 Função Identidade A função identidade sobre um conjunto A, denotada por IA , é uma função IA : A −→ A onde cada elemento a ∈A esta relacionado consigo mesmo IA (a) = a Definição 1.32 Função Invertı́vel Uma função f : A −→ B, é chamada de invertı́vel, se existe a função inversa f −1 : B −→ A, talque f −1 ◦ f = IA e f ◦ f −1 = IB 23 1.12. INDUÇÃO MATEMÁTICA Definição 1.33 Restrição Se f : A −→ B e A1 ⊆ A então f |A1 : A1 −→ B é chamada a restrição de f a A1 , se f |A1 (a) = f (a) para todo a ∈ A1 Definição 1.34 Extensão Seja A1 subseteqA e seja f : A1 −→ B. Se g : A −→ B tal que g(a) = f (a) para todo a ∈ A1 então a função g é chamada de extensão de f a A. Definição 1.35 Tipos de Funções Uma função f : A −→ B é chamada: • Função Injetiva (um-a-um): se para todo b ∈ B, existe no máximo um a ∈ A tal que f (a) = b • Função Sobrejetiva: se, para todo b ∈ B, existe pelo menos um a ∈ A tal que f (a) = b. • Função Bijetiva ou Isomorfismo: se é injetora e sobrejetiva Exemplo 1.59 Injetiva: Para cada aluno da Universidade existe um número de matrı́cula. Para cada aluno matriculado, existe um único número de matrı́cula. Neste caso, existe uma relação injetiva (um-a-um) entre o conjunto de alunos e o conjunto de números de matrı́cula Exemplo 1.60 sobrejetiva: f : R → R definida por f (x) = 2x − 3. Para cada y = f (x) existe um x ∈ R da forma (y + 3)/2 1.12 Indução Matemática Definição 1.36 Princı́pio de Indução Matemática I Seja P uma proposição definida sobre o conjunto dos números inteiros N, isto é, P (n) ou é falso ou é verdadeiro para cada n ∈ N. Suponha-se que P tem as seguintes propriedades: 1. P (n) é verdadeiro 2. P (n + 1) é verdadeiro quando P (n) é verdadeiro Então, P é verdadeiro para cada inteiro positivo Definição 1.37 Princı́pio de Indução Matemática II Seja P uma proposição definida sobre os inteiros positivos N tal que: 24 Linguagens Formais e Autômatos - Prof. Ausberto S. Castro V. 1. P (1) é verdadeiro 2. P (n) é verdadeiro quando P (k) é verdadeiro para todo 1 ≤ k < n Então, P é verdadeiro para cada inteiro positivo Uma prova indutiva consiste de três etapas distintas: • Provar que a propriedade P vale para cada elemento de um Conjunto Base X0 . • Estabelecer uma hipótese indutiva: a suposição que a propriedade P vale para cada elemento nos conjuntos X0 , X1 , ...,Xn • Passo Indutivo: usando a hipótese indutiva, provar que a propriedade P vale para cada elemento do conjunto Xn+1 Exemplo 1.61 Provar que n X i= i=0 Base: n = 0 0 X n(n + 1) 2 i = 0 = 0(0 + 1)/2 i=0 Hipótese indutiva: Assumimos que para k = 1, 2, ..., n vale k X i= i=0 k(k + 1) 2 Passo indutivo: Temos que provar que n+1 X i=0 i= (n + 1)(n + 1 + 1) 2 Em efeito: n+1 X i=o i= n X i=0 Exemplo 1.62 isto é, ! i + (n + 1) = n(n + 1) n (n + 1)(n + 2) + (n + 1) = (n + 1)( + 1) = 2 2 2 Provar que a soma dos n primeiros números ı́mpares é igual a n2 , 1 + 3 + 5 + · · · + (2n − 1) = n2 Base: n = 3 1 + 3 + (2 ∗ 3 − 1) = 1 + 3 + 5 = 9 = 32 25 1.13. GRAFOS Hipótese indutiva: Assumimos que para k = 1, 2, ..., n vale 1 + 3 + 5 + · · · + (2k − 1) = k 2 Passo indutivo: Temos que provar que 1 + 3 + · · · + (2k − 1) + (2(k + 1) − 1) = (k + 1)2 Em efeito, 1 + 3 + · · · + (2k − 1) + (2(k + 1) − 1) = = = = = 1.13 1 + 3 + · · · + (2k − 1) + (2(k + 1) − 1) [k 2 ] + (2(k + 1) − 1) k 2 + (2k + 2 − 1) k 2 + 2k + 1 (k + 1)2 Grafos Informalmente, podemos dizer que um grafo é um conjunto não vazio de nós (vértices) e um conjunto de arcos (arestas), de modo que, cada arco conecta dois nós Definição 1.38 grafo, grafo não-direcionado Um grafo não direcionado ou simplesmente grafo, é uma tripla ordenada G = (N, A, g) onde, N é um conjunto não vazio de nós (vértices), A é um conjunto de arcos (arestas) e, g é uma função que associa cada arco a a um par não ordenado x, y de nós, chamados extremidades de a. Figura 1.12: Grafo Definição 1.39 grau de um vértice O grau de um vértice é o número de arcos (arestas) que incidem neste vértice. 26 Linguagens Formais e Autômatos - Prof. Ausberto S. Castro V. No exemplo da Fig.1.12, o grau do vértice e é 3, o grau do vértice c é 4, e o grau do vértice f é 0 (nenhuma aresta incide neste vértice). Definição 1.40 grafo direcionado Um grafo direcionado (digrafo) é uma tripla ordenada G = (N, A, g) onde, N é um conjunto não vazio de nós, A é um conjunto de arcos, g é uma função que associa cada arco a a um par ordenado (x, y) de nós, onde x é o ponto inicial de a, e y é o ponto final de a Figura 1.13: Grafos direcionados Grafo Rotulado e grafo com pesos q Grafo rotulado Definição 1.41 grafo rotulado, grafo com pesos Um grafo rotulado é um grafo que contém identificadoras ou rótulos ou É um grafo informações que contém informações identificadoras nos vértices e/ou nas arestas. Um grafo com pesos é o grafo onde cada arco rótulos nos vértices e/ou nas arestas (aresta) tem um valor numérico (peso) associado. q Grafo com pesos É o grafo onde cada arco (aresta) tem um valor numérico (peso) associado Brasilia 614 870 1614 Belo Horizonte 434 586 429 Porto Alegre 1109 Rio de Janeiro São Paulo UNASP – Matemática Discreta - GRAFOS - Prof. Dr. Ausberto S. Castro Vera Figura 1.14: Grafo rotulado e com pesos Definição 1.42 subgrafo Dizemos que o grafo A é um subgrafo do grafo B, se: 1. os vértices de A formam um subconjunto dos vértices de B 10 27 1.13. GRAFOS 2. as arestas de A também são arestas de B sobre os vértices correspondentes, i.e., se a função g(a, e) é uma aresta do grafo A, então g(a, e) também é uma aresta do grafo B Figura 1.15: Subgrafo Exemplo 1.63 Na Fig.1.15, o grafo A é subgrafo de B. Definição 1.43 Caminho, comprimento Um caminho em um grafo, é uma seqüência alternada de vértices e arestas v0 , a0 , v1 , a1 , v2 , a2 , . . . , vn−1 , an−1 , vn onde cada aresta ai contém os vértices vi e vi+1 . O comprimento ou tamanho de um caminho é o número de arestas que ele contém. Definição 1.44 grafo conexo Um grafo conexo é aquele onde existe um caminho entre qualquer par de seus vértices, isto é, existe um caminho de um vértice dado para qualquer outro vértice do grafo. Figura 1.16: Grafos conexo e não-conexo O grafo G da Fig.1.16 (esquerdo) é conexo, enquanto que o grafo H (direita) não é conexo, pois não existe nenhum caminho entre o vértice x e os vértices y ou z. Definição 1.45 ciclo, grafo acı́clico Um ciclo em um grafo é um caminho de um vértice vi para ele mesmo, tal que 28 Linguagens Formais e Autômatos - Prof. Ausberto S. Castro V. nenhum arco ou vértice aparece mais de uma vez, exceto vi , isto é, um ciclo é um caminho que começa e termina no mesmo vértice vi . Um grafo acı́clico é um grafo sem ciclos. Definição 1.46 grafo atravessável, grafo euleriano Um grafo atravessável é aquele onde existe um caminho que inclua todos os vértices e utilize cada aresta exatamente uma vez. Um grafo é euleriano se existe uma trilha (caminho) atravessável fechada. Definição 1.47 grafo hamiltoniano Um grafo hamiltoniano é aquele que admite um caminho fechado que visita todos os vértices exatamente uma vez cada um. Em um grafo euleriano podem-se repetir os vértices e num grafo hamiltoniano podem-se repetir as arestas. (a) (b) Ponto de partida-chegada Figura 1.17: (a) Grafo Euleriano. (b) Grafo Hamiltoniano 1.14 Árvores Informalmente, definimos uma árvore como sendo um grafo conexo acı́clico direcionado com um vértice especial denominado raiz. 29 1.14. ÁRVORES raiz raiz raiz Figura 1.18: Exemplos de árvores Geralmente em computação, costuma-se desenhar uma árvore com o vértice raiz no topo do grafo Definição 1.48 Árvore Uma árvore é uma estrutura (N,A,r), onde N é o conjunto de nós, A é o conjunto de arestas (relação de adjacência entre nós) e r ∈ N é a raiz da árvore. Definição 1.49 Definição recursiva de árvore • Um único nó é uma árvore. Esse nó é a raiz da arvore. • Se A1 , A2 , . . . , An são árvores com raı́zes r1 , r2 , . . . , rn respectivamente, e r é uma raı́z qualquer, então A1 A2 . . . An r é uma árvore, onde r esta ligado a r1 , r2 , . . . rn • Os nós r1 , r2 , . . . , rn são chamados de filhos de r, e o nó r é chamado de pai de r1 , r2 , . . . , rn . Um filho de uma raı́z é chamdo também de sub-árvore r r2 r1 A1 A2 Figura 1.19: Definição recursiva de árvore r 30 Linguagens Formais e Autômatos - Prof. Ausberto S. Castro V. 1.14.1 r1 Propriedades e definições • Considerando que uma árvore é um grafo conexo acı́clico, existe um caminho da raiz para qualquer nó e esse caminho é único. • A profundidade (altura) de uma árvore é o comprimento do caminho mais comprido da raiz até um dos nós. A profundidade pode ser dado em A1 termos de nós ou arestas. Equivalentemente, o nı́vel de um vértice (nó) v é o comprimento de um caminho simples da raiz até o vértice v. A raiz tem profundidade zero. • Um nó sem filhos é chamado de folha ou nó terminal da árvore. As folhas são vértices de grau 1. Excepcionalmente, a raiz também pode ser um vértice de grau 1. Todos os nós que não são folhas são chamados de nós internos ou nós não-terminais. • Uma árvore binária é aquela que tem unicamente dois filhos: esquerdo e direito raiz 1 nó interno 2 3 folhas Figura 1.20: Folhas, nós internos e profundidade 1.15 Exercı́cios 1. Apresentar uma lista de cinco conjuntos especificados por extensão e cinco conjunto especificados por compreensão. 2. Listar os elementos dos seguintes conjuntos • A = {x ∈ N/x divide a 48} • B = {y ∈ N/4 + y = 3} 3. Quais destes conjuntos são iguais: {r, s, t}, {s, t, r, s}, {t, s, t, r}, {s, r, s, t}? A2 31 1.15. EXERCı́CIOS 4. Ilustrar com os Diagramas de Venn a lei distributiva A ∩ (B ∪ C) = (A ∩ B) ∪ (A ∩ C) 5. Seja X = {a, b, c} e Y = {0, 1}. Listar todos os elementos de X × Y e todos os subconjuntos de X × Y. 6. Dar um exemplo de uma relação sobre N × N que seja reflexiva e simétrica, porém, não transitiva. 7. Considere a relação R = {(1, 1), (1, 3), (2, 4), (3, 1), (3, 3), (4, 3)} sobre A = {1, 2, 3, 4} (a) Indicar se R é reflexiva, simétrica ou transitiva. (b) Que é necessário pra que R seja reflexiva? Simétrica? (c) Faça um gráfico da relação R 8. Para cada uma das seguintes relações binárias em N, escrever cinco pares ordenados: (a) xRy se e somente se x + y < 7. (b) xRy se e somente se x = y + 2. (c) xRy se e somente se 2x + 3y = 10. 9. Dados os conjuntos A = {1, 2, 3, 4}, B = {x, y, z} e a relação entre A e B: R = {(1, y), (1, z), (3, y), (4, x), (4, z)} (a) Determinar a matriz (tabela) da relação R de A para B (b) Desenhar o grafo da relação R (c) Indicar o domı́nio e o contradomı́nio da relação R 10. Seja P o conjunto de pessoas que moram em São Paulo. Teste se as relações binárias em P são reflexivas, simétricas, transitivas ou anti-simétricas (a) xRy se e somente se x é, pelo menos, tão alto quanto y (b) xRy se e somente se x é filho ou filha de y (c) xRy se e somente se x tem os mesmos pais que y (d) xRy se e somente se x é marido de y (e) xRy se e somente se x tem a mesma altura que y 11. Seja A={1, 2, 3, ..., 8, 9} y seja R uma relação sobre o produto cartesiano A×A definido por: (a, b)R(c, d) se a + d = b + c 32 Linguagens Formais e Autômatos - Prof. Ausberto S. Castro V. (a) Provar que R é uma relação de equivalência (b) Encontrar a classe de equivalência de (2,5) ou seja [(2, 5)] 12. Determinar se cada função é injetora: (a) A cada pessoa é atribuı́do um número que corresponde a sua idade (b) A cada paı́s é atribuı́do uma latitude e uma altitude correspondente a sua capital (c) A cada livro escrito por um único autor é atribuı́do o nome do autor (d) A cada pais que tem primeiro ministro é atribuı́do o sobrenome do primeiro ministro (e) A cada pessoa que tem conta no banco é atribuı́do o número de CPF 13. Seja f = {(1, 3), (2, 1), (3, 4), (4, 3)} e g = {(1, 2), (2, 3), (3, 1), (4, 1)} (a) Determinar Dom(f ) e Img(g) (b) Determinar as funções compostas: (f ◦ g), (g ◦ f ) e (f ◦ f ) 14. Dar uma definição recursiva da operação de multiplicação de números naturais usando as operações succ e adição. 15. Dar uma definição recursiva para o conjunto de pontos (x, y) sobre a linha y = 5x + 1 em N × N. Utilize a operação succ. 16. Dar uma definição recursiva da operação 0 se n = 0 pred(n) = n − 1 em outro caso utilizando o operador succ. 17. Provar que 1 + 2 + 22 + ... + 2n = 2n+1 − 1 para todo n ≥ 0. 18. Provar por indução que 3 é fator de n3 − n + 3 para todo n ≥ 0. 19. Dar cinco exemplos de grafos rotulados 20. Qual é a diferença entre um grafo euleriano e um grafo hamiltoniano?. Dar dois exemplos gráficos. Capı́tulo 2 Linguagens Em um contexto bem genérico, o termo linguagens significa considerar um conjunto de categorias de linguagens: linguagens naturais (Português, Espanhol, Inglês, etc.), linguagens de programação (Pascal, C++, Fortran, Java, Matlab, etc.), linguagens matemáticos (lógica, λ-cálculo, conjuntos, álgebras, categorias), etc. Uma definição geral deve ser considerada para qualquer tipo de linguagem. Neste capı́tulo, estamos interessados em definir e utilizar as linguagens formais utilizadas na implementação de autômatos e compiladores, para isto apresentamos uma definição de linguagem baseada na teoria de conjuntos: uma linguagem é um conjunto de strings (cadeias de caracteres) construı́das a partir de um conjunto de sı́mbolos de um alfabeto. Linguagens que servem para nosso interesse computacional não são construı́dos a partir de strings arbitrários, e sim a partir daqueles que satisfazem determinadas propriedades. Estas propriedades constituem a sintaxe da linguagem. 2.1 Palavras Definição 2.1 sı́mbolo Um sı́mbolo é uma entidade abstrata que representa uma única idéia ou conceito, e utilizada na Matemática e na Computação, na forma de objetos, para construir determinados conjuntos. Após a definição do conjunto, os sı́mbolos são os elementos de tal conjunto. Exemplo 2.1 a, b, c, d, 0, 1, 2, 3, 4, α, β, δ, ∆, λ, ω, Ω, π, , ‡, , , , F Exemplo 2.2 begin, end, for while, :=, if (utilizados na linguagem Pascal) Exemplo 2.3 Os sı́mbolos: {, }, main, (, ), if, =, for, +, *, /, -, else, case, switch, <, >, == são utilizados para construir a sintaxe da linguagem C, C++ e C#. 33 34 Linguagens Formais e Autômatos - Prof. Ausberto S. Castro V. Definição 2.2 Alfabeto Um alfabeto é um conjunto finito e não vazio de elementos chamados de sı́mbolos. Convencionalmente, é utilizado a letra grega Sigma Σ para denotar um alfabeto. Exemplo 2.4 Σ = {0, 1} é o chamado alfabeto binário. Exemplo 2.5 português. Σ = {a, b, c, . . . , x, y, z}, denota o conjunto de letras minúsculas do Exemplo 2.6 Σ = {α, β, γ, δ, , ζ, η, θ, ι, λ, µ, π, ρ, σ, φ, ϕ, ψ, ...∆, Γ, Θ, Ψ, Ω, Σ, Υ}, representa o alfabeto grego. Exemplo 2.7 Σ = {char, int, long, float, return, break, switch, if, else, <, ≤, =, ...} é o alfabeto da linguagem de programação C. Exemplo 2.8 Σ = { character, integer, real, do, while, for, continue, .ge., .le., ...} é o alfabeto da linguagem de programação FORTRAN. Definição 2.3 Palavra, string, cadeia Uma palavra (cadeia ou string) sobre um conjunto (alfabeto) X é uma seqüência finita de elementos de X.1 Exemplo 2.9 Com o conjunto: X = {a, b, c} podemos construir as seguintes palavras: s1 = aabc s2 = ababcc s3 = aabbcc s4 = cabaab Exemplo 2.10 Dado o conjunto: Y = {1, 2, ∗} podemos construir os seguintes strings: s1 = 112 ∗ 1 s2 = 2 ∗ 2 ∗ 1 s3 = ∗111 s4 = 1 ∗ ∗ ∗ 2 ∗ 1 ∗ ∗ ∗ 11 O alfabeto de uma linguagem natural (Português, Inglês, Espanhol, etc.) é formado por palavras consideradas como objetos indivisı́veis e qualquer palavra da linguagem corresponde a um sı́mbolo do alfabeto definido acima. Por exemplo, a palavra computador é um objeto que não pode ser dividida em comput e ador, por exemplo. Em contextos diferentes, podemos considerar dois alfabetos para a lingua portuguesa: um, formado pelos caracteres P1 = {a, A, b, B, c, C, d, D, ..., z, Z} e, outro P2, formado por todas as palavras encontradas em qualquer dicionário de português, a partir das quais formaremos as ”palavras”ou frases em português. Os strings leche, libro, cuaderno, mesmo sendo construı́dos a partir do alfabeto P1, não fazem parte do Português. Analogamente, o alfabeto de uma linguagem de programação é formada por um conjunto de palavras-chave, variáveis e sı́mbolos da linguagem. Uma string desta linguagem é uma seqüência de código-fonte. Assim, cada palavra-chave de uma linguagem de programação qualquer é um sı́mbolo do respectivo alfabeto. Por exemplo, o segmento de programa Pascal: 1 Observação. Neste texto utilizaremos os termos string ou palavra indistintamente para indicar o mesmo conceito. 35 2.1. PALAVRAS Begin x := 4 ; End ou Begin x:=4; End é uma palavra formada por seis sı́mbolos, Begin, x, := , 4, ; (ponto e vı́rgula) e End. Os sı́mbolos B, e, g, i, n (do termo Begin) não são elementos do alfabeto da linguagem de programação Pascal. Convencionalmente e considerando a indivisibilidade dos elementos do alfabeto de uma linguagem, os sı́mbolos são denotados por simples caracteres do inı́cio do alfabeto português: a, b, c, d, e, ..., enquanto que, as palavras ou strings sobre um alfabeto são representados pelos caracteres do final do alfabeto português: ..., p, q, r, s, t, u, v, w, x, y, z, porém, nada impede que um sı́mbolo seja representado pelo caractere x e uma palavra pelo caractere a. Exemplo 2.11 alfabeto: Σ = {a, b, d} strings: x = abaa u = bbdd w = dada Neste texto usaremos um string especial que não tem sı́mbolos, chamado de string nulo (cadeia vazia, palavra nula ou palavra vazia) e denotado pelo sı́mbolo λ (lambda minúsculo). Definição 2.4 Conjunto de palavras Seja Σ um alfabeto. O conjunto de palavras ou strings sobre o alfabeto Σ, e denotado por Σ∗ , é definido recursivamente como segue: • Base: λ ∈ Σ∗ • Passo Recursivo: Se w ∈ Σ∗ e a ∈ Σ, então wa ∈ Σ∗ • Fecho: w ∈ Σ∗ somente se pode ser obtido a partir de λ por um número finito de aplicações do passo recursivo. Para qualquer alfabeto não vazio Σ, o conjunto Σ∗ contém infinitos elementos. Exemplo 2.12 Se Σ = {a}, então Σ∗ contém as palavras λ, a, aa, aaa, aaaa, .... Exemplo 2.13 Σ = {a, b}, Σ∗ = {λ, a, b, aa, bb, ab, ba, aaa, bbb, aba, bab, ...}. Exemplo 2.14 Σ = {0, 1}, Σ∗ = {λ, 0, 1, 00, 11, 01, 10, 0001, 101110, ...} Exemplo 2.15 Se Σ = {a, b, c}, então {a, b, c}∗ = {λ, a, b, c, ab, ac, bc, ba, ca, abc, ...} Exemplo 2.16 Se A = {♣, ♠} então A∗ = {λ, ♣, ♠, ♣♠, ♣♣, ♠♠, ♣♠♣, ...} Resumindo: • Se a ∈ Σ ⇒ a é um sı́mbolo • Se w ∈ Σ∗ ⇒ w é uma palavra 36 Linguagens Formais e Autômatos - Prof. Ausberto S. Castro V. 2.1.1 Operações com palavras Sejam w, u e v palavras sobre um determinado alfabeto Σ, então as seguintes operações são realizadas com palavras w, u e v: • Concatenação: Se u = a1 a2 a3 . . . an e v = b1 b2 b3 . . . bm então u e v podem ser concatenados para formar a palavra w da forma w = uv = a1 a2 a3 . . . an b1 b2 b3 . . . bm . A palavra vazia λ é a identidade sob a concatenação, isto é, λw = wλ = w, para qualquer palavra w Exemplo 2.17 Se Σ = {a, b} e u = abb, v = aab então w = uv = abbaab e z = vu = aababb (Definiç~ ao recursiva) Seja u, v ∈ Σ∗ . A concatenação de u e v, escrito como uv, é uma operação binária sobre Σ∗ , definido como segue: ◦ Base: Se |v = 0, então v = λ e uv = u ◦ Passo Recursivo: Seja v uma palavra com |v| = n > 0. Então v = wa, para alguma palavra w com comprimento n − 1 e a ∈ Σ, e uv = (uw)a. Exemplo 2.18 Seja u = ab, v = ca, e w = bb, então: uv = abca vw = cabb (uv)w = abcabb u(vw) = abcabb Observações: - a concatenação de palavras é uma operação binária associativa - a concatenação de palavras não é comutativa uw 6= wu - se u é uma palavra, então uu pode ser escrito como u2 , uuu = u3 , e também u0 = λ • Reverso: Se w = a1 a2 a3 . . . an então a palavra reversa ou o reverso de w é definido por wR = an . . . a3 a2 a1 Exemplo 2.19 Se Σ = {0, 1} e w = 001011 então wR = 110100 (Definiç~ ao recursiva) Seja u uma palavra em Σ∗ . O reverso de u, denotado por uR , é definido como segue: ◦ Base: |u| = 0. Então u = λ e λR = λ ◦ Passo Recursivo: Se |u| = n > 0, então u = wa para alguma palavra w com tamanho n − 1 e algum a ∈ Σ, e uR = awR . Exemplo 2.20 u = 01121, |u| = 5 > 0, então u = wa para w = 0112 com |w| = 4, wR = 2110 e a = 1. Agora, uR = awR = 12110 Propriedades 37 2.1. PALAVRAS ◦ (wR )R = w para qualquer palavra w ◦ Se u, v ∈ Σ∗ , então (uv)R = v R uR ◦ Se v é uma subpalavra de w, então v R é uma subpalavra de wR ◦ (wn )R = (wR )n para qualquer palavra w e n ≥ 0. ◦ Um palı́ndromo sobre um alfabeto Σ é uma palavra em Σ∗ que têm a mesma leitura da esquerda para direita e vice-versa. O conjunto de palı́ndromos é o conjunto {w ∈ Σ∗ /w = wR } Exemplo 2.21 Sem considerar os espaços em branco: ’socorra me em marrocos’, ’subi no onibus’ Exemplo 2.22 Outros palı́ndromos: ana, arara, ovo, reviver, radar, asa, 123321, a1*1a • Comprimento: O comprimento ou tamanho de uma palavra w, denotada por length(w) ou |w| é o número de elementos (sı́mbolos) da palavra, ou formalmente, é o número de aplicações do passo recursivo para construir a palavra a partir dos elementos do alfabeto. ◦ O comprimento da palavra λ é zero, i.é., |λ| = 0 ◦ |a| = 1 se a ∈ Σ ◦ |wa| = |w| + 1 ◦ |uv| = |u| + |v| Exemplo 2.23 palavras: comprimento comprimento comprimento comprimento Seja Σ = {a, b, c}. Os elementos de Σ∗ incluem as seguintes 0: 1: 2: 3: λ a b c aa ab ac ba aaa aab aac baa bab bac caa cab cac bb bc ca cb cc aba abb abc aca acb acc bba bbb bbc bca bcb bcc cba cbc cca ccb ccc Definição 2.5 Subpalavra u ∈ Σ∗ é uma subpalavra ou substring de v, se existem palavras x, y ∈ Σ∗ tal que v = xuy. Definição 2.6 prefixo, sufixo Sejam w, u e v palavras sobre um determinado alfabeto Σ. Se w = uv então a palavra u é chamada de prefixo de w, e a palavra v é chamada de sufixo da palavra w. 38 Linguagens Formais e Autômatos - Prof. Ausberto S. Castro V. Exemplo 2.24 Caso Trivial : a palavra nula λ é prefixo e sufixo de qualquer palavra w, pois, w = λw e também w = wλ. Exemplo 2.25 Se Σ = {0, 1} e w = 100101011 então u = 1001 é um prefixo de w e também v = 011 é um sufixo de w. Exemplo 2.26 Se Σ = {a, b} e w = aababb então todos os prefixos de w são: λ, a, aa, aab, aaba, aabab e aababb. Da mesma forma, todos os sufixos de w são: b, bb, abb, babb, ababb e aababb 2.2 Linguagens Definição 2.7 Linguagem formal Uma linguagem formal L, ou simplesmente linguagem L, sobre um alfabeto Σ é um sub-conjunto de Σ∗ . Se Σ é um alfabeto e L ⊆ Σ∗ , então dizemos que L é uma linguagem sobre Σ. Figura 2.1: Linguagens como subconjunto de palavras Exemplo 2.27 Se Σ = {0, 1} então os conjuntos A= {00, 11} e B= {0, 1, 00, 11, 01, 10} são duas linguagens, pois A⊆ Σ e B⊆ Σ. Exemplo 2.28 Os casos triviais: Σ, ∅, Σ∗ são linguagens sobre o alfabeto Σ Exemplo 2.29 Seja A ={a, b}. Os seguintes conjuntos são linguagens definidas sobre o conjunto A: • L1 = {a, ab, ab2 , ab3 , ...}: todas as palavras começando com o sı́mbolo a e seguida por zero ou mais sı́mbolos b’s. • L2 = {am bm |m > 0}: todas as palavras começando com um ou mais sı́mbolos a’s seguida pelo mesmo número de sı́mbolos b’s. • L3 = {bm abn |m ≥ 0, n ≥ 0}: todas as palavras com exatamente uma letra a. • L4 = {0, 1}∗ {101}{0, 1}∗ : todas as palavras sobre {0,1}que contém a subpalavra 101 39 2.2. LINGUAGENS • L5 = {w ∈ {a, b, c}/|w| ≤ 3} : conjunto de palavras sobre o alfabeto {a, b, c} com comprimento menor ou igual a 3. • L6 = {a, b}∗ ab{a, b}∗ ∪ {a, b}∗ ba{a, b}∗ : conjunto de palavras que contém a subpalavra ab ou a subpalavra ba. • L= {x, y}∗ : conjunto de todas as palavras sobre o alfabeto {x, y} Lp = {xx, yy, xy, yx}∗ : conjunto de palavras sobre {x, y} de comprimento par Li = {x, y}∗ − {xx, yy, xy, yx}∗ : conjunto de palavras sobre {x, y} de comprimento ı́mpar 2.2.1 Especificação de Linguagens As linguagens de interesse para Ciência da Computação são aquelas onde as palavras tem formas especificadas convenientemente. Formas aceitáveis definem a sintaxe da linguagem (a maneira como são construı́das as palavras). Para especificar (descrever) uma linguagem necessitamos de uma descrição precisa (não ambı́gua, não confusa) das palavras que compõem tal linguagem. Considerando que uma linguagem formal é um conjunto de palavras, então podemos especificar as linguagens das seguintes formas: • Por extensão: Uma linguagem finita pode ser explicitamente definida pela enumeração (listagem) dos seus elementos (todas as palavras da linguagem). • Por compreensão : quando descrevemos a propriedade P de todas as palavras. L = {w ∈ Σ∗ /w tem a propriedade P } Este método de especificação é muito utilizado principalmente para linguagens infinitas (na maioria dos casos). • Recursivamente: Linguagens infinitas podem ser definidas recursivamente apresentando os requisitos sintáticos para construir as suas palavras utilizando uma base, um passo recursivo (algoritmo de construção) e um fecho (relação que exclui os não-elementos). Exemplo 2.30 Se L é a linguagem sobre Σ = {♣, ♥} de todas as palavras com comprimento menor ou igual a 2, então ela tem seis elementos: L = {λ, ♣, ♥, ♣♣, ♣♥, ♥♥} Exemplo 2.31 A linguagem LaPAR sobre o conjunto {1, 0} na qual cada palavra começa com um número 1 e tem comprimento par, pode ser definido recursivamente da seguinte maneira: 40 Linguagens Formais e Autômatos - Prof. Ausberto S. Castro V. • Base: 11, 10 ∈ LaPAR • Passo Recursivo: Se u ∈LaPAR, então u10, u01, u00 ∈LaPAR • Fecho: Uma palavra u ∈LaPAR somente se pode ser obtida a partir de elementos da base por um número finito de aplicações do passo recursivo. LaPAR ={11, 10, 1110, 1010, 1101, 1001, 1100, 1000, ... } Exemplo 2.32 A linguagem LaB definido sobre o conjunto {4, a} na qual cada ocorrência de a é imediatamente precedida por um número 4 é especificada da seguinte forma: • Base: λ ∈LaB. • Passo Recursivo: Se u ∈LaB, então u4, u4a ∈LaB. • Fecho: Uma palavra u ∈LaB somente se pode ser obtida a partir dos elementos da base por um número finito de aplicações do passo recursivo. São palavras da linguagem LaB: λ, 4, 4a, 4a444a. Não são palavras da linguagem LaB: a, aa, a4, 4aa. 2.2.2 Operações sobre Linguagens Definição 2.8 União Se L1 e L2 são duas linguagens sobre o mesmo alfabeto então a união L1 ∪ L2 é uma linguagem L1 ∪ L2 = {w ∈ Σ∗ /w ∈ L1 ou w ∈ L2 } Definição 2.9 De Morgan Se L1 e L2 são duas linguagens sobre o mesmo alfabeto então, (L1 ∪ L2 )c = Lc1 ∩ Lc2 (L1 ∩ L2 )c = Lc1 ∪ Lc2 Definição 2.10 concatenação A concatenação das linguagens X e Y, denotado por XY, é a linguagem XY = {uv|u ∈ X e v ∈ Y } A concatenação de X consigo mesma n vezes é denotada por Xn . O conjunto X0 é definido como {λ} 41 2.3. CONJUNTOS REGULARES Exemplo 2.33 Sejam X = {a, b, c} e Y = {012, 02}. Então XY = {a012, b012, c012, a02, b02, c02} X0 = {λ} = a palavra nula 1 X = {a, b, c} = conjunto de palavras de tamanho 1 2 X = {aa, ab, ac, ba, bb, bc, ca, cb, cc} = conjunto de palavras de tamanho 2 ... = ... Xn = {aaa...a, bbb...b, ..., abcabc..., ...} = conjunto de palavras de tamanho n = {w ∈ {a, b, c}∗ /|w| = n} Definição 2.11 Estrela de Kleene Seja X um conjunto qualquer de sı́mbolos. Então, a Estrela de Kleene do conjunto X, denotado por X∗ , é definido como ∗ X = ∞ [ Xi = X0 ∪ X ∪ X2 ∪ · · · ∪ Xn ∪ · · · i=0 e + X = ∞ [ X i = XX ∗ i=1 ∗ Observe que X é conjunto de todas as palavras sobre o conjunto X e X ∗ = X + ∪ {λ} Por exemplo, {a, b}∗ é conjunto de todas as palavras construı́das usando os sı́mbolos a e b. Também, X+ é conjunto de palavras não nulas construı́das a partir do conjunto X 2.3 Conjuntos Regulares Informalmente podemos dizer que um conjunto é regular se ele pode ser gerado a partir de um conjunto vazio, do conjunto que contém a palavra nula λ, de conjuntos unitários contendo um sı́mbolo do alfabeto e utilizando apenas as operações de união, concatenação e estrela de Kleene. Definição 2.12 Conjunto regular Seja Σ um alfabeto. Um conjunto regular sobre Σ é definido recursivamente como: • Base: O conjunto vazio ∅, e os con juntos unitários {λ} e {a}, para cada sı́mbolo a ∈ Σ, são conjuntos regulares sobre Σ 42 Linguagens Formais e Autômatos - Prof. Ausberto S. Castro V. • Passo Recursivo: Se X e Y são conjuntos regulares sobre Σ, então os conjuntos X ∪ Y (união), XY (concatenação) e X∗ também são conjuntos regulares sobre Σ. • Fecho: X é um conjunto regular sobre Σ somente se este pode ser obtido partir dos elementos da base por um número finito de aplicações do passo recursivo. Exemplo 2.34 Seja Σ = {1, 2} então: • {}, {λ}, {1}, {2} são conjuntos regulares sobre {1, 2} • {1} ∪ {2} = {1, 2} é um conjunto regular sobre {1, 2} • {1, 2}{2} = {12, 22} é um conjunto regular sobre {1, 2} • {11, 12, 21, 22}, {1, 12, 122, 21, 1121, ...} são conjuntos regulares sobre {1, 2} Exemplo 2.35 A linguagem L = {a, b}∗ {aba}{a, b}∗ , o conjunto de palavras contendo a sub-palavra aba, é um conjunto regular sobre {a, b} Exemplo 2.36 O conjunto de palavras que começam e terminam com 0 e contém pelo menos um 1, é regular sobre {0, 1}. As palavras neste conjunto poderão ser descritos intuitivamente como: “um 0, seguido por qualquer palavra, seguido por um 1, seguido por qualquer palavra, seguido por um 0”. A concatenação {0}{0, 1}∗ {1}{0, 1}∗ {0} = ABCBA mostra a regularidade do conjunto. Vejamos por que: • 0 ∈ {0, 1} logo A = {0} é regular (Base) • 0, 1 ∈ {0, 1} então A = {0} e C = {1} são regulares e também {0}∪{1} = {0, 1} é regular (união, Passo Recursivo). Logo, B = {0, 1} também é regular (estrela de Kleene, Passo Recursivo). • Se A e B são regulares então AB é regular (concatenação, Passo Recursivo). Sucessivamente aplicamos este fato para provar que (((AB)C)B)A é regular 2.4 Expressões Regulares Definição 2.13 expressão regular Expressões regulares são abreviações que denotam ou identificam conjuntos regulares Exemplo 2.37 Se {a}, {b} são conjuntos regulares, então a,b são expressões regulares 2.4. EXPRESSÕES REGULARES 43 Se u = {a, b} então u é uma expressão regular Se u = {a} e v = {aa, bb} então (u ∪ v) é uma expressão regular Se {a, b}∗ é um conjunto regular então (a∪b)∗ é uma expressão regular Definição 2.14 expressão regular Seja Σ um alfabeto. Uma expressão regular sobre o alfabeto Σ é definida recursivamente como: • Base: ∅, λ e a, para cada a ∈ Σ, são expressões regulares sobre Σ. Estas são chamadas de expressões regulares primitivas • Passo Recursivo: Se e1 e e2 são expressões regulares sobre Σ, então as expressões (e1 ∪ e2 ), (e1 e2 ) e (e∗1 ) são expressões regulares sobre Σ • Fecho: u é uma expressão regular sobre Σ somente se pode ser obtido a partir dos elementos da base por meio de um número finito de aplicações do passo recursivo. Exemplo 2.38 Se Σ = {0, 1, 2} então são expressões regulares: ∅, λ, 0, 1, 2 Exemplo 2.39 Se Σ = {m, n} então são expressões regulares: m, n, (m ∪ n), mn, (m∗ ) e (n∗ ) Exemplo 2.40 A expressão regular (0 ∪ 1)∗ 010(0 ∪ 1)∗ representa o conjunto regular das palavras que contém a subpalavra 010 (sobre o alfabeto {0, 1}) Definição 2.15 Expressão regular Cada uma das seguintes é uma expressão regular sobre um alfabeto Σ: • O sı́mbolo λ (palavra vazia) e o par ( ) (expressão vazia) são expressões regulares. • Cada sı́mbolo a ∈ Σ é uma expressão regular. • Se r é uma expressão regular, então (r∗ ) é uma expressão regular. • Se r1 e r2 são expressões regulares, então (r1 ∨ r2 ) é uma expressão regular. O sı́mbolo ∨ é o OU lógico. • Se r1 e r2 são expressões regulares, então (r1 r2 ) é uma expressão regular. Exemplo 2.41 Expressão Regular Conjunto regular a, aa, aaa {a} ab, abab {ab} ∗ (a ∪ b) {a, b}∗ 44 Linguagens Formais e Autômatos - Prof. Ausberto S. Castro V. Duas expressões que representam o mesmo conjunto são chamadas de equivalentes As identidades da tabela 2.1 [SUD 05] podem ser usadas para manipular algebricamente expressões regulares para construir expressões equivalentes. Tabela 2.1: Identidades de Expressões Regulares 1. ∅u = u∅ = ∅ 2. λu = uλ = u 3. ∅∗ = λ 4. λ∗ = λ 5. u ∪ v = v ∪ u 6. u ∪ ∅ = u 7. u ∪ u = u 8. u∗ = (u∗ )∗ 9. u(v ∪ w) = uv ∪ uw 10. (u ∪ v)w = uw ∪ vw 11. (uv)∗ u = u(vu)∗ 12. (u ∪ v)∗ = (u∗ ∪ v)∗ = u∗ (u ∪ v)∗ = (u ∪ vu∗ )∗ = (u∗ v ∗ )∗ = u∗ (vu∗ )∗ = (u∗ v ∗ )u∗ Outras identidades interessantes: a∗ ∅ = ∅, onde a é um sı́mbolo de um alfabeto ∅∗ = {λ} r ∪ ∅ = r, onde r é uma expressão regular rλ = r, r é uma expressão regular Se Σ = {a, b} e r = a então L(r) = {a} e L(r ∪ λ) = {a, λ} 2.5 Linguagens Regulares Definição 2.16 Linguagem sobre um alfabeto A linguagem L(r) sobre o alfabeto A, definida pela expressão r sobre A, é definida da seguinte forma: 1. L(λ) = {λ} e L(()) = ∅ 2. L(a) = {a}, onde a é uma letra em A. 3. L(r∗ ) = (L(r))∗ , o fecho de Kleene 4. L(r1 ∨ r2 ) = L(r1 ) ∪ L(r2 ), união de linguagens 45 2.6. EXERCı́CIOS 5. L(r1 r2 ) = L(r1 )L(r2 ), concatenação de linguagens Exemplo 2.42 Seja Σ = {x, y} e r = Σ∗ xΣ∗ então L(r) é o conjunto de palavras w onde cada w tem pelo menos um sı́mbolo x Exemplo 2.43 Seja Σ = {0, 1} e r = 1∗ (10+ )∗ então L(r) é o conjunto de palavras w onde todo 1 em w é seguido por pelo menos um sı́mbolo 0. Exemplo 2.44 Σ = {0, 1} e r = 0Σ∗ 0 ∪ 1Σ∗ 1 ∪ 0 ∪ 1, então L(r) é o conjunto de palavras que começa e termina com o mesmo sı́mbolo. Exemplo 2.45 Se Σ = {a, b} então para r = (a∪λ)(b∪λ) temos L(r) = {λ, a, b, ab}. Definição 2.17 Linguagem regular Seja L uma linguagem sobre A. Então L é chamada uma linguagem regular sobre A se existe uma expressão regular r sobre A tal que L = L(r), isto é, todas as linguagens regulares podem ser especificadas por expressões regulares Exemplo 2.46 Seja A = {a, b}. • r = a∗ , então L(r) consiste de todas as potências de a, incluindo a palavra vazia λ • r = aa∗ , então L(r) consiste de todas as potências positivas de a • r = (a ∨ b)∗ . Note que L(a ∨ b) = {a} ∪ {b} = A. Logo L(r) = A∗ : toda as palavras sobre A. • r = a ∧ b∗ . Neste caso, L(r) não existe, pois r não é uma expressão regular. 2.6 Exercı́cios 1. Dar três exemplos de alfabetos conhecidos 2. Se Σ = {0, 1}, qual das afirmações é correta: 0 ∈ Σ ou 0 ∈ Σ∗ . Por que? 3. Provar por indução sobre i, que (wR )i = (wi )R para qualquer palavra w e para todo i ≥ 0 4. Seja X = {aa, bb} e Y = {λ, b, ab}. (a) Listar as palavras no conjunto XY. (b) Listar as palavras do conjunto Y∗ de tamanho 3 ou menos (c) Quantas palavras de tamanho 6 existem em X∗ ? 5. Seja A = {a, b}. Descreva verbalmente as seguintes linguagens sobre A: 46 Linguagens Formais e Autômatos - Prof. Ausberto S. Castro V. (a) L1 = {(ab)m |m > 0} (b) L2 = {ar bas bat |r, s, t ≥ 0} (c) L3 = {a2 bm a3 |m > 0} 6. Considere a linguagem L = {ab, c} sobre A = {a, b, c}. Encontrar as linguagens L0 , L3 e L−2 . 7. Dar uma expressão regular que represente o conjunto: (a) de palavras sobre {1, 0} que contém as sub-palavras 11 e 10 (b) de palavras sobre {a, b} que contém as sub-palavras ab e ba (c) de palavras sobre {a, b, c} de tamanho menor de três (d) de palavras de tamanho ı́mpar sobre {a, b, c} que contém exatamente uma a. (e) de palavras sobre {a, b, c}, onde cada b é seguida imediatamente por pelo menos um c. (f) de palavras sobre {1, 2, 3} de comprimento ı́mpar 8. Encontre dois prefixos e dois sufixos para a palavra nomamin em {o, a, i, m, n}∗ 9. Utilizando a definição recursiva, determine os reversos das palavras 00101 e 1011 10. Se u = 0101 e v = 10101, determine o reverso de uv e de vu sobre Σ = {0, 1} 11. Fazer uma lista de pelo menos 10 palı́ndromos conhecidos 12. Utilize a Tabela 2.1 para estabelecer as seguintes identidades: (a) (ba)+ (a∗ b∗ ∪ a∗ ) = (ba)∗ ba+ (b∗ ∪ λ) (b) b+ (a∗ b∗ ∪ λ)b = b(b∗ a∗ ∪ λ)b+ (c) (a ∪ b)∗ = (a ∪ b)∗ b∗ (d) (a ∪ b)∗ = (a∗ ∪ ba∗ )∗ (e) (a ∪ b)∗ = (b∗ (a ∪ λ)b∗ )∗ 13. Para um dos alfabetos seguintes escrever pelo menos cinco conjuntos regulares (a) Σ = {x, y, z} (b) Σ = {5, 7, 9} (c) Σ = {café, com, leite, pão, açúcar} (d) Σ = {x, y, =, <, 1, 4} 2.6. EXERCı́CIOS 47 14. Suponha que Σ = {0, 1}. Escreva expressões regulares para os seguintes conjuntos: (a) Todas as palavras em Σ∗ com não mais que três 0’s . (b) Todas as palavras em Σ∗ com um número de 1’s divisı́veis por três. (c) Todas as palavras em Σ∗ com, exatamente, uma ocorrência da sub-palavra 000. 15. Quais das seguintes afirmações são verdadeiras? Justifique sua resposta. (a) baa ∈ a∗ b∗ a∗ b∗ (b) b∗ a∗ ∩ a∗ b∗ = a∗ ∪ b∗ (c) abcd ∈ (a(cd)∗ b)∗ 16. Para r = ab ∪ ba, determinar L(r) 17. Se r = (ΣΣ)∗ , onde Σ é um alfabeto, determinar L(r) 48 Linguagens Formais e Autômatos - Prof. Ausberto S. Castro V. Capı́tulo 3 Autômatos Finitos Um autômato, tal como é estudado na disciplina de Teoria da Computação, é um modelo matemático computacional, isto é, descreve em forma abstrata o comportamento de um computador. Um procedimento ou atividade real que determina quando uma palavra é parte de uma linguagem é chamado aceitante de linguagem. O objetivo deste capı́tulo, é definir uma classe de máquinas abstratas (independente de sua implementação) cujas computações determinem a aceitabilidade de uma palavra de entrada, isto é, apresentar um modelo matemático de computador (máquina computacional) que aceite uma entrada, processe esta entrada, e gere uma saı́da para esta entrada. Para cada entrada, a máquina abstrata terá um determinado comportamento (processo). Os autômatos finitos ao modelar uma máquina abstrata computacional, mostra o QUE faz esta máquina (processamento, compilação, simulação). Figura 3.1: Máquina Abstrata Estados da máquina são ”fotografias”(snapshots, E1 , E2 , ..., En ) mostrando o comportamento da máquina em um determinado momento. O processamento de uma tarefa através de uma máquina é a seqüência (histórico) de estados E1 , E2 , ..., En , começando pelo estado inicial E1 e terminando no estado final En . Por exemplo, uma máquina de vender bebidas (drink machine), aceita uma mo49 50 Linguagens Formais e Autômatos - Prof. Ausberto S. Castro V. eda ou ficha como entrada e devolve uma bebida como saı́da. • Um estado inicial: a máquina com a lata de bebida no seu interior pronta para ser oferecida, e o usuário com a moeda adequada pronta para ser introduzida na máquina. • O processamento da entrada: a máquina verificando se a moeda ou ficha corresponde ao valor do produto selecionado • Um estado final: o usuário com a lata de bebida desejada na mão e a moeda introduzida na máquina. Figura 3.2: Máquina de vender bebidas 3.1 Uma ferramenta: JFLAP JFLAP (http://www.jflap.org/) é um pacote de ferramentas gráficas desenvolvidas por Susan H. Rodger ([email protected]) no Departamento de Ciência da Computação da Duke University, NC, USA. JFLAP é um software de distribuição gratuita para testes com tópicos de linguagens formais: autômatos finitos não-determinı́sticos, autômatos de pilha não-determinı́sticos, máquinas de Turing multi-fita e vários tipos de gramáticas. As principais caracterı́sticas do JFLAP (versão 7.0, em 17/01/2011) incluem: 3.1. UMA FERRAMENTA: JFLAP 51 • Interface agradável para Windows e Macintoch • Construção de autômatos finitos e de pilha • Construção de tabelas para LL e LR • Analisadores para gramáticas • Máquinas Mealy e Moore • Transformação de CGF (Context-Free Grammar) em CNF (Chomsky Normal Form) • Algoritmos para converter AEF em expressões regulares • Comparação de dois AEF (equivalência) JFLAP 7.0 requer a presença do compilador Java 1.5 ou superior. O texto de referência sobre o JFLAP é [ROD 06] Figura 3.3: JFLAP - Conteúdo Menu Principal (v.7.0) 52 Linguagens Formais e Autômatos - Prof. Ausberto S. Castro V. Figura 3.4: JFLAP - Editor de Autômatos e Entrada de dados Figura 3.5: Simulações com JFLAP 3.2 Autômatos Finitos Determinı́sticos Informalmente, podemos afirmar que um autômato é um modelo abstrato (sem detalhes) de um computador digital. Algumas caracterı́sticas de um autômato padrão incluem: • Uma entrada • Uma saı́da 53 3.2. AUTÔMATOS FINITOS DETERMINı́STICOS • um dispositivo de armazenagem • Uma unidade de controle • Um conjunto de estados internos da máquina Definição 3.1 Autômato Finito Determinı́stico, AFD Um Autômato Finito Determinı́stico (AFD) chamado também de Aceitante Finito Deterministico ou Reconhecedor de sı́mbolos, é uma máquina abstrata definida como uma tupla (5-upla) M = (Q, Σ, δ, q0 , F ) onde Q = {q0 , q1 , . . . , qn } é o conjunto de finito de estados internos da máquina Σ é um alfabeto (conjunto de sı́mbolos) q0 ∈ Q é o estado inicial F ⊂ Q é o conjunto de estados finais ou aceitos δ : Q × Σ −→ Q é uma função total chamada função de transição Exemplo 3.1 A máquina M definida como M = (K, Σ, s, F ) é um autômato finito determinı́stico onde K = {q0 , q1 }, Σ = {a, b}, s = q0 , F = {q0 } e onde δ : K × Σ → K é a função de transição definida como: δ(q0 , a) = q0 δ(q0 , b) = q1 δ(q1 , a) = q1 δ(q1 , b) = q0 e mostrada no grafo da Fig. 3.6 b a q1 q0 a b Figura 3.6: Autômato Finito Determinı́stico Para entender a sua natureza mecânica, a operação de um AFD é descrita em termos de componentes que estão presentes em muitas máquinas de computação: 54 Linguagens Formais e Autômatos - Prof. Ausberto S. Castro V. a b a b Fita de entrada cabeça de leitura q0 controle finito Figura 3.7: Autômato um registrador interno simples, um conjunto de valores para o registrador, uma fita, um leitor de fitas, e um conjunto de instruções. • Os estados de um AFD representam o status interno da máquina. • O registrador da máquina, chamado de controle interno ou unidade de controle, contém o estado corrente da máquina. No inı́cio da computação, contém o estado inicial q0 . P • A entrada é uma seqüência finita de elementos obtidos do alfabeto . • A fita armazena as entradas a serem computadas, e é dividida em quadrados. Cada quadrado com a capacidade de conter um elemento do alfabeto. A fita deve ter comprimento ilimitado. A entrada para uma computação pelo autômato é colocado no segmento inicial da fita • A cabeça da fita lê um quadrado da fita de entrada. • O corpo da máquina consiste da cabeça da fita e do registrador • A posição da cabeça de fita é indicado colocando a cabeça da fita sob o quadrado que esta sendo explorada. • O estado corrente do autômato é indicado pelo valor do registrador. • A configuração inicial de uma computação com entrada baba é representada pela Fig. 3.7 • O estado da máquina e o sı́mbolo explorado determinam a instrução a ser executada. A ação de uma máquina em estado qi explorando (executando,processando) um único sı́mbolo a e produzir um novo estado, δ(qi , a) no controle. Considerando que δ é uma função total, existe exatamente uma instrução especificada para cada combinação de estado e sı́mbolo de entrada (determinismo). • O conjunto de instruções (programa) é construı́do a partir da função de transição δ do AFD. 55 3.2. AUTÔMATOS FINITOS DETERMINı́STICOS • A computação de um autômato é a execução de uma seqüência de instruções. A execução de uma instrução altera o estado da máquina e move a cabeça da fita um quadrado à direita. • O status da máquina em qualquer momento da computação é chamado P de configuração. Esta configuração é qualquer elemento do conjunto Q × ∗ . configuração = ( estado , palavra ) Por exemplo, na segunda computação da máquina mostrada na Fig. 3.8, a configuração é (q1 , ba). O objetivo de uma computação por parte de um autômato é determinar a aceptabilidade de uma cadeia de caracteres de entrada, por exemplo, ”a := x + Y”. Uma computação começa com a cabeça da fita explorando o quadrado mais a esquerda da fita e o registrador contendo o estado inicial q0 . O estado e a instrução são usados para selecionar a instrução. A máquina então altera seu estado como indicado pelo programa e a cabeça da fita move-se a direita. O ciclo da instrução é repetido até a cabeça da fita ficar num quadrado em branco (palavra vazia, λ). Definição 3.2 Função de Transição Estendida, δ ∗ A função de transição δ que processa um único sı́mbolo do alfabeto Σ, pode ser estendida, δ ∗ , para processar uma única palavra, utilizando a definição recursiva seguinte: δ ∗ : Q × Σ∗ −→ Q • Base: δ ∗ (q, λ) = q, para todo q ∈Q • Passo recursivo: δ ∗ (q, wa) = δ(δ ∗ (q, w), a), para todo q ∈Q, w ∈ Σ∗ , a ∈ Σ Exemplo 3.2 Se Q = {q0 , q1 }, Σ = {a, b}, s = q0 , função de transição definida como: δ(q0 , a) = q0 δ(q0 , b) = q1 δ(q1 , a) = q1 δ(q1 , b) = q0 então: δ ∗ (q0 , abb) = δ(δ ∗ (q0 , ab), b) = δ(δ(δ ∗ (q0 , λa), b), b) = δ(δ(δ(δ ∗ (q0 , λ), a), b), b) = δ(δ(δ(q0 , a), b), b) = δ(δ(q0 , b), b) = δ(q1 , b) = q0 F = {q0 } e δ : K × Σ → K é a (Passo recursivo) (a = λa (Base) Definição 3.3 Palavra aceita por uma máquina Uma palavra de entrada é aceita por uma máquina abstrata M, se a computação de 56 Linguagens Formais e Autômatos - Prof. Ausberto S. Castro V. a b a q0 a b a b q1 a b a q0 q0 a b b a a q1 q1 a Figura 3.8: Computação na máquina M2 M termina em um estado aceitável, isto é, em um estado que faz parte do conjunto de estados finais. Caso contrário, a palavra é rejeitada por M. Exemplo 3.3 A máquina M2 definida como: M2: Q = {q0 , q1 } Σ = {a, b} F = {q1 } δ(q0 , a) = q1 δ(q0 , b) = q0 δ(q1 , a) = q1 δ(q1 , b) = q0 aceita a palavra aba como mostra a Fig. 3.8 Definição 3.4 Linguagem de uma máquina Seja M = (Q, Σ, δ, q0 , F ) um autômato finito determinı́stico. A linguagem de M, 57 3.2. AUTÔMATOS FINITOS DETERMINı́STICOS denotada por L(M), é o conjunto de palavras em Σ∗ aceitas por M. L(M ) = {x ∈ Σ∗ |x é aceita por M } = {x ∈ Σ∗ |δ ∗ (q0 , w) ∈ F } Definição 3.5 Máquinas equivalentes Duas máquinas que aceitam a mesma linguagem são ditas ser equivalentes. Definição 3.6 `M A relação binária `M sobre Q ×Σ+ , definida por (qi , aw) `M (δ(qi , a), w) para cada a ∈ Σ e w ∈ Σ∗ , se aplica entre duas configurações de M, se, e somente se, a máquina pode passar da configuração (qi , aw) para a configuração (δ(qi , a), w) como resultado ou através de um simples movimento (da cabeça da fita). Neste caso dizemos que (qi , aw) produz um resultado (δ(qi , a), w) em um passo. A notação (qi , u) `∗ (qj , v) é usada para indicar que a configuração (qj , v) pode ser obtida de (qi , u) por zero ou mais transições. Exemplo 3.4 F), onde Suponhamos que M3 seja o autômato finito determinı́stico (Q, Σ, δ, q0 , M3: Q = {q0 , q1 } Σ = {0, 1} F = {q0 } δ(q0 , 0) = q0 δ(q0 , 1) = q1 δ(q1 , 0) = q1 δ(q1 , 1) = q0 Podemos verificar que a linguagem L(M3) é o conjunto de palavras em {0, 1}∗ que têm um número par de 1’s. Consideremos a palavra de entrada 00110, sua configuração inicial é (q0 , 00110). Então: (q0 , 00110) `M `M `M `M `M (q0 , 0110) (q0 , 110) (q0 , 10) (q0 , 0) (q0 , λ) Portanto, q0 , 00110) `M (q0 , λ) , e assim 00110 é aceita pela máquina M3, pois q0 é um estado final. Exemplo 3.5 No exemplo anterior da máquina M3, consideremos a palavra 01011 (com um número ı́mpar de 1’s) 58 Linguagens Formais e Autômatos - Prof. Ausberto S. Castro V. (q0 , 01011) `M `M `M `M `M (q0 , 101) (q1 , 011) (q1 , 11) (q0 , 1) (q1 , λ) Observamos que q1 6∈ F (não é um estado final), logo a palavra 01011 é rejeitada pela linguagem L(M3). Definição 3.7 Diagrama de estados O diagrama de estados de um autômato finito determinı́stico M = (Q, Σ, δ, q0 , F) é um grafo rotulado G definido pelas seguintes condições 1. Os vértices de G são os elementos de Q. 2. Os rótulos sobre as arestas (arcos) de G são elementos do alfabeto P . 3. q0 é o vértice (nodo) inicial. 4. F é o conjunto de nodos de aceitação. 5. Existe uma aresta do nodo qi até o nodo qj rotulado com a, se δ(qi , a) = qj . 6. Para cada nodo qi e sı́mbolo a ∈ Σ, existe exatamente uma aresta rotulada com a deixando qi . Exemplo 3.6 M4: Q = {q0 , q1 , q2 , q3 } Σ = {0, 1} F = {q0 , q1 , q2 } O diagrama de estados é mostrado na Fig. 3.9. δ(q0 , 0) = q0 δ(q0 , 1) = q1 δ(q1 , 0) = q0 δ(q1 , 1) = q2 δ(q2 , 0) = q0 δ(q2 , 1) = q3 δ(q3 , 0) = q3 δ(q3 , 1) = q3 59 3.3. AUTÔMATOS FINITOS NÃO-DETERMINı́STICOS 0 1 0 q0 1 q1 1 q2 1 0 q3 0 Figura 3.9: Diagrama de estados para um AFD 3.3 Autômatos Finitos Não-Determinı́sticos Definição 3.8 Autômato Finito Não-Determinı́stico, AFND Um Autômato Finito Não-Determinı́stico (AFND) é uma tupla (5-upla) M = (Q, Σ, δ, q0 , F ) onde Q P é o conjunto de finito de estados é um alfabeto q0 ∈ Q é o estado inicial F ⊂ Q é o conjunto de estados finais ou aceitos δ é uma função total de Q×Σ para P(Q) chamada função de transição. P(Q) é o conjunto de partes (conjunto de conjuntos) de Q. A única diferença entre um AFD e um AFND, está na função de transição. Neste último, as saı́das (os ”próximos estados”) podem ser zero, um ou mais a qn qi qi δ(qn,a) ={qi} qn qn δ(qn,a) ={ } a a a δ (qn,a) ={qi , qj, qk} qj qk Figura 3.10: Autômato Finito Não-determinı́stico 60 Linguagens Formais e Autômatos - Prof. Ausberto S. Castro V. Exemplo 3.7 A máquina N definida como: N: Q = {q0 , q1 , q2 } Σ = {a, b} F = {q2 } δ(q0 , a) δ(q0 , b) δ(q1 , a) δ(q1 , b) δ(q2 , a) δ(q2 , b) = = = = = = {q0 } {q0 , q1 } ∅ {q2 } ∅ ∅ é um autômato finito não-determinı́stico, que aceita a computação da palavra ababb (q0 , ababb) `N (q0 , babb) `N (q0 , abb) `N (q0 , bb) `N (q0 , b) `N (q0 , λ) (q0 , ababb) (q0 , ababb) `N (q0 , babb) `N (q0 , babb) `N (q1 , abb) `N (q0 , abb) `N (q0 , bb) `N (q1 , b) `N (q2 , λ) A segunda computação da máquina N finaliza depois da execução de três instruções, pois nenhuma ação é especificada quando a máquina N está no estado q1 explorando o sı́mbolo a Definição 3.9 Palavra aceita Uma palavra de entrada w é aceita pela máquina N se existe pelo menos uma computação que processa a palavra completa w e parar em um estado aceitável (final). Uma palavra é um elemento de uma linguagem de uma máquina nãodeterminı́stica, se existe uma computação que aceita esta palavra. Definição 3.10 Linguagem de um autômato A linguagem de um autômato finito não-determinı́stico N, denotado por L(N), é o conjunto de palavras aceitas por N, isto é, L(N) = {w|∃(q0 , w) `∗ (qi , λ) com qi ∈ F} q0 b q1 b a, b Figura 3.11: Grafo do autômato N q2 61 3.4. AUTÔMATOS FINITOS E EXPRESSÕES REGULARES Podemos observar graficamente que a linguagem aceita por N é (a ∪ b)∗ bb Exemplo 3.8 Seja a máquina N2 = (Q, Σ, δ, s, F) onde: Q = {q0 , q1 , q2 , q3 , q4 } Σ = {a, b} F = {q4 } s = q0 δ(q0 , a) δ(q0 , b) δ(q1 , a) δ(q1 , b) δ(q2 , λ) δ(q3 , b) δ(q4 , a) δ(q4 , b) = = = = = = = = {q0 } {q0 , q1 } q3 {q2 } q4 q4 q4 q4 Na Fig. 3.12 podemos observar que este é um dos vários possı́veis autômatos finitos não-determinı́sticos que aceitam o conjunto de palavras contendo uma ocorrência do padrão bb ou do padrão bab a, b q0 b q1 q2 b λ a a, b q3 b q4 Figura 3.12: Autômato Não-Determinı́stico N2 Executando as respectivas computações podemos afirmar que a palavra bababab é aceita pela linguagem L(N2). 3.4 Autômatos Finitos e Expressões Regulares Teorema 3.1. A classe de linguagens aceita por autômatos finitos é fechada sob união, concatenação, estrela de Kleene, complementação e intersecção. Prova.- ver [LEW 00]. 62 Linguagens Formais e Autômatos - Prof. Ausberto S. Castro V. a, b M1: q 1,0 a, b q 1,1 b q1,2 b b a M2: q2,0 q2,1 b Figura 3.13: Autômatos Não-Determinı́sticos M1 e M2 Teorema 3.2. Uma linguagem é regular se e somente se ela é aceita por um autômato finito. 3.5 Transições Lambda As transições de um estado para outro nos autômatos determinı́sticos e não-determinı́sticos são inicializados pelo processamento de um sı́mbolo de entrada. Nos AFND, permitese as transições de estado sem a necessidade de processar uma entrada. Esta transição é chamada de transição lambda. Os autômatos que utilizam este tipo de transições são denotados por AFND-λ. Definição 3.11 Autômato com transições lambda Um P autômato finito não-determinı́stico com transições lambda é uma tupla NL = {Q, , δ, q0 , F}, onde Q, q0 e F são os mesmos de um AFND. A função de transição é definida como: X δ :Q×( ∪{λ})P(Q). Diagramas de estado para um AFND-λ é construı́do utilizando transições lambda com arcos rotulados com o sı́mbolo λ. Transições lambda podem ser usadas para construir máquinas complexas a partir de máquinas mais simples. Exemplo 3.9 Sejam M1 e M2 duas máquinas como mostra a Fig. 3.13 e que aceitam, respectivamente, a ∪ b)∗ bb(a ∪ b)∗ e (b ∪ ab)∗ (a ∪ λ). Os estados finais são, respectivamente, F1 = {q1,2 } e F2 = {q2,0 , q2,1 }. A linguagem do AFND-λ é L(M1) ∪ L(M2). 63 3.6. EQUIVALÊNCIA DE AUTÔMATOS a, b a, b M: λ q0 q 1,0 b λ b q 1,1 b q1,2 a q2,0 q 2,1 b Figura 3.14: Autômato Não-Determinı́stico Composto A computação na máquina composta M (Fig. 3.14) começa no estado q0 e segue uma aresta lambda ao estado inicial de M1 ou M2. Se o caminho p mostra a aceitação da palavra pela máquina Mi , i = 1, 2, então a palavra é aceita pela máquina M. Desde que, o movimento inicial (de q0 a qi,0 ) em cada computação não processa qualquer sı́mbolo de entrada, a linguagem de M é L(M1) ∪ L(M2) 3.6 Equivalência de autômatos Definição 3.12 Autômatos Equivalentes Dois autômatos finitos M1 e M2 são equivalentes, e escrevemos M1 ≡ M2, se L(M1) = L(M2), isto é, se ambos autômatos aceitam a mesma linguagem. 3.7 Exercı́cios 1. Mostrar o grafo dos seguintes Autômatos Finito Determinı́sticos: Q={q0 , q1 , q2 , q3 } Σ = {0, 1} (a) s = q0 F= {q3 } δ(q0 , 0) = q2 δ(q0 , 1) = q1 δ(q1 , 0) = q2 δ(q1 , 1) = q1 δ(q2 , 0) = q3 δ(q2 , 1) = q2 δ(q3 , 0) = q3 δ(q3 , 1) = q2 64 Linguagens Formais e Autômatos - Prof. Ausberto S. Castro V. Q={q0 , q1 , q2 , q3 , q4 } Σ = {0, 1} (b) s = q0 F= {q2 , q4 } δ(q0 , 0) = q1 δ(q0 , 1) = q3 δ(q1 , 0) = q2 δ(q1 , 1) = q4 δ(q4 , 0) = q4 δ(q2 , 0) = q1 δ(q2 , 1) = q4 δ(q3 , 0) = q2 δ(q3 , 1) = q4 δ(q4 , 1) = q4 Q={q0 , q1 , q2 , q3 , q4 } Σ = {x, y} (c) s = q0 F= {q4 } δ(q0 , x) = q1 δ(q0 , y) = q0 δ(q1 , x) = q2 δ(q1 , y) = q3 δ(q4 , x) = q4 δ(q2 , x) = q2 δ(q2 , y) = q4 δ(q3 , x) = q4 δ(q3 , y) = q3 δ(q4 , y) = q4 2. Para cada um dos AFDs do exercı́cio anterior, indicar uma expressão regular que represente a linguagem (conjunto de palavras aceitas) de cada autômato. 3. Utilizando a função de transição estendida δ ∗ no exercı́cio 1.c), mostrar passo a passo a verdade ou falsidade da computação: (a) δ ∗ (q0 , 00001) = q4 (b) δ ∗ (q3 , 0001) = q4 (c) δ ∗ (q2 , 000101) = q4 (d) δ ∗ (q1 , 001110) = q4 4. Encontrar uma expressão regular que represente a linguagem dos seguintes autômatos mostrados na Fig. 3.15, (a) e (b) 65 3.7. EXERCı́CIOS (a) (b) Figura 3.15: Autômatos Determinı́sticos 5. Seja M o autômato finito determinı́stico M: QP = {q0 , q1 , q2 } = {0, 1} F = {q2 } δ(q0 , 0) = q0 δ(q0 , 1) = q1 δ(q1 , 0) = q2 δ(q1 , 1) = q1 δ(q2 , 0) = q2 δ(q2 , 1) = q0 (a) Mostrar o gráfico de estados para M (b) Mostrar em diagramas as computações de M para processar as palavras 0100, 111011, 101010 e 11100. Mencione quais são as palavras aceitas por M (c) Dar uma expressão regular para L(M) 6. Verificar que a palavra 00101 não é aceita pela máquina M3 7. Construa autômatos finitos determinı́sticos que aceitem cada uma das seguintes linguagens: 66 Linguagens Formais e Autômatos - Prof. Ausberto S. Castro V. (a) {w ∈ {a, b}∗ | cada a em w é imediatamente precedida por um b}. (b) {w ∈ {0, 1}∗ |w tem 0101 como uma sub-palavra}. (c) {w ∈ {4, 5}∗ |w tem 45 e 54 como sub-palavras}. (d) {w ∈ {a, b}∗ |w tem exatamente um sı́mbolo a }. (e) {w ∈ {0, 1}∗ |w tem pelo menos um sı́mbolo 1 }. (f) {w ∈ {0, 1}∗ |w tem no máximo dois sı́mbolos 0 }. (g) {w ∈ {a, b}∗ |w = w1 aw2 com |w1 | ≥ 2, w2 ≤ 4 }. 8. Construir um AFD que aceite a linguagem: (a) todas as palavras sobre {a, b} nas quais a sub-palavra ab ocorre pelo menos duas vezes (b) todas as palavras sobre {m, n} que começam com m e terminam com nn. (c) todas as palavras sobre {0, 1, 2} nas quais cada 1 é seguido por, pelo menos, dois sı́mbolos 2. 9. Desenhe diagramas de estado para autômatos finitos não determinı́sticos que reconheçam essas linguagens: (a) (ab)∗ (ba)∗ ∪ aa∗ (b) ((01 ∪ 001)∗ 0∗ )∗ (c) ((a∗ b∗ a∗ )∗ b)∗ 10. Um homem deve cruzar um rio de largura grande transportando em sua canoa um de três objetos ”perecı́veis”cada vez. Enquanto transportar um deles para o outro lado, os outros dois devem ficar. Os objetos podem ser: onça-galinhamilho, leão-ovelha-alfafa, lobo-ovelha-alfafa, tigre-galinha-milho, lobo-cabrarepolho, etc. Simule o processo de transporte através de um autômato finito não-determinı́stico (Q, Σ, δ, q0 , F) mostrando: (a) O diagrama de estados da ”maquina” (b) O conjunto de estados Q (c) O alfabeto do autômato (d) A função de transição (e) Os estados inicial e finais q0 e F 11. Seja N um AFND cujo diagrama de estados esta na Fig. 3.16 67 3.7. EXERCı́CIOS a b a q0 q1 b a a q2 Figura 3.16: Autômato Não-Determinı́stico N (a) Construir a tabela de transição (função δ) de N (b) Mostrar graficamente todas as computações da palavra aaabb em N (c) A palavra aaabb está na linguagem L(N) ? 12. Encontrar um AFD que aceite a linguagem definida pelo autômato da Fig. 3.17 0 0 q4 q5 0 q0 q3 0 0 q1 0 q2 Figura 3.17: 13. Mostrar o diagrama de estados para o autômato que aceite: (a) o conjunto de palavras sobre {1, 2, 3} onde a soma dos elementos é divisı́vel por 6. (b) o conjunto de palavras sobre {a, b} que contém um número par de ba’s 68 Linguagens Formais e Autômatos - Prof. Ausberto S. Castro V. (c) o conjunto de palavras sobre {a, b} cujo tercer e último sı́mbolo é b. 14. Construir um AFND tal que: (a) não tenha mais que cinco estados e aceite a linguagem L = {0101n |n ≥ 0} ∪ {010n |n ≥ 0} (b) não tenha mais de três estados e aceite a linguagem {ab, abc}∗ (c) tenha exatamente três estados e que aceite palavras do tipo an ou bm ak com n ≥ 1, m, k ≥ 0 (d) tenha quatro estados e aceite palavras do tipo an ou bm a com n ≥ 0, m ≥ 1 15. Para o autômato da Fig. 3.18, determinar δ ∗ (q0 , a) e δ ∗ (q1 , λ) q0 a q1 q2 Figura 3.18: Capı́tulo 4 Gramáticas Livre de Contexto Definição 4.1 Regra, produção, regra de produção Seja V um conjunto de sı́mbolos chamados de variáveis ou sı́mbolos não-terminais e seja Σ um conjunto chamado alfabeto ou sı́mbolos terminais. Os conjuntos V e Σ são disjuntos. Uma regra de produção p ou simplesmente regra ou produção, é um elemento do conjunto { (A, w)|A ∈ V, w ∈ (V ∪ Σ)∗ } O elemento p =(A,w) se escreve geralmente como A→w e é conhecida como uma A-regra. A produção A → λ é chamada de regra nula ou λ-regra. A seta → pode-se ler como ”é definido por”. Definição 4.2 Gramática Uma gramática G é uma quádrupla ordenada G = (V, Σ, P, S) onde: V é o conjunto finito de sı́mbolos variáveis ou não-terminais, Σ é um conjunto finito de sı́mbolos terminais (alfabeto), P é um conjunto de regras de produção, e S é um elemento distinguido (especial) de V, chamado de sı́mbolo inicial (de partida ou ”start”). Os conjuntos V e Σ são disjuntos Exemplo 4.1 A quádrupla G1 = (V, Σ, P, S) onde: V = {A,B,C,D,S} Σ = {0, 1} P={ 69 70 Linguagens Formais e Autômatos - Prof. Ausberto S. Castro V. S A A A C B B B D −→ −→ −→ −→ −→ −→ −→ −→ −→ AB AC0 AC1 101 0 BD0 BD1 010 1 } é uma gramática. Exemplo 4.2 A quádrupla QuatroOper = (V, Σ, P, S) onde: V = {K, Op, Som, Mul, Dif, Div, A, B, S} Σ = {a, b, (, ), +, ∗, −, /} P={ Som −→ + S −→ Op Mul −→ * S −→ K K −→ (Op)(Op) Dif −→ Op −→ ASomB Div −→ / Op −→ AMulB A −→ a A −→ b Op −→ ADifB B −→ a Op −→ ADivB B −→ b } também é uma gramática. Gramáticas são utilizadas para gerar palavras bem formadas a partir de um alfabeto. O passo fundamental no processo de geração consiste em transformar uma palavra pela aplicação de uma regra de produção. Por exemplo, a aplicação da regra A −→ w à variável A na palavra uAv produz a palavra uwv Se A −→ w então uAv ⇒ uwv O prefixo u e o sufixo v no lado esquerdo de uAv ⇒ uwv definem o contexto na qual a variável A ocorre. Quando u e v são nulas em todas as regras de produção, dizemos que a gramática é livre de contexto. Se u ou v não são nulas, então dizemos que a gramática é sensı́vel ao contexto. Definição 4.3 Gramática Livre de contexto, Context-Free Grammars, CFG Uma gramática G = ( V, Σ, P, S) é chamada livre de contexto se todas as produções em P tem a forma A −→ x onde A∈V e x ∈ (V ∪ Σ)∗ Exemplo 4.3 G = ( V, Σ, P, S) é uma gramática livre de contexto, onde: 71 V = { A, B, S} Σ = {a, b} P ={S −→ AB, A −→ Aa, B −→ Bb, A −→ a, B −→ b } S é o sı́mbolo de partida. Notação.- As produções: α → β1 , α → β2 , . . . , α → βk , podem ser escritas como: α → (β1 , β2 , . . . , βk ) ou α → β1 |β2 | . . . |βk Definição 4.4 Palavra derivável Uma palavra w é derivável de v se existe uma seqüência finita de aplicações de regras de produção de uma gramática que transformam v em w v ⇒ w1 ⇒ w2 ⇒ ... ⇒ wn = w ∗ A derivabilidade de w a partir de v, é denotado por v ⇒ w Exemplo 4.4 De acordo com as produções da gramática G1, temos S ⇒ AB ⇒ AC1B ⇒ (AC0)C1B ⇒ (10100)01B ⇒ (10100)01010 ∗ logo a palavra 1010001010 é derivável de S, ou S ⇒ 1010001010 Definição 4.5 Conjunto de palavras deriváveis Seja G = (V, Σ, P, S) uma gramática livre de contexto e seja v ∈ (V ∪Σ)∗ . O conjunto de palavras deriváveis de v é definido recursivamente como: • Base: v é derivável de v. • Passo Recursivo: Se u = xAy é derivável de v e A → w ∈ P, então xwy é derivável de v. • Fecho: Somente as palavras construı́das de v pela aplicação finita do passo recursivo, são deriváveis de v. Observações: • A regra → é um elemento da relação V × (V ∪Σ)∗ • A regra ⇒ é um elemento da relação (V ∪Σ)+ × (V ∪Σ)∗ + • O sı́mbolo ⇒ significa derivabilidade usando uma ou mais aplicações da regra. n • A derivação de w a partir de v de comprimento n é denotado por v ⇒ w. • Quando mais de uma gramática é considerada, então utilizamos a notação ∗ v ⇒ w para indicar a gramática G. G 72 Linguagens Formais e Autômatos - Prof. Ausberto S. Castro V. 4.1 Gramáticas e Linguagens Definição 4.6 Forma sentencial, Linguagem de uma gramática Seja G = {V, Σ, P, S} uma gramática livre-de-contexto. Então: • Uma palavra w ∈ (V ∪Σ)∗ é uma forma sentencial de G se existe uma ∗ derivação S ⇒ w em G. ∗ • Uma palavra w ∈ Σ∗ é uma sentença de G se existe uma derivação S ⇒ w em G. ∗ • A linguagem de G, denotada por L(G), é o conjunto { w ∈ Σ∗ |S ⇒ w }. Neste caso, dizemos que G gera cada palavra em L(G). De acordo com a definição anterior, ressaltamos que: ◦ As formas sentenciais são as palavras deriváveis do sı́mbolo inicial da gramática. ◦ As sentenças são as formas sentenciais que contém somente sı́mbolos terminais. ◦ A linguagem de uma gramática é o conjunto de sentenças geradas pela gramática Exemplo 4.5 Considerando a gramática G1 do Exemplo 4.4 temos: ◦ A palavra w=A00C1B é uma forma sentencial de G1, pois existe uma derivação S⇒A00C1B da forma: S ⇒ AB ⇒ AC1B ⇒ (AC0)C1B ⇒ (A00)C1B ◦ A palavra w= 1010001010 é uma sentença de G1, pois existe uma derivação S⇒1010001010 da forma S ⇒ AB ⇒ AC1B ⇒ (AC0)C1B ⇒ (10100)01010 Definição 4.7 Linguagem livre-de-contexto, Gramáticas equivalentes Um conjunto de palavras L sobre um alfabeto Σ é chamado de linguagem livrede-contexto se existe uma gramática livre de contexto que gera L. Duas gramáticas são equivalentes, se elas geram a mesma linguagem. Exemplo 4.6 Considere a gramática MiniG = (W, Σ, P, S), onde W = { S, A, N, V, F} ∪Σ Σ = {Pedro, grande, verde, queijo, comeu} F → N, F → AF, S → FVF, A → grande, P={ } A → verde, N → queijo N → Pedro V → comeu (5 sı́mbolos) Esta é uma gramática para uma parte do idioma português: S significa sentença, A para adjetivo, N para substantivo, V para verbo e F para frase. O conjunto de sı́mbolos terminais Σ também pode ser escrito como Σ = {p, g, v, q, c} 73 4.1. GRAMÁTICAS E LINGUAGENS As seguintes são algumas ”palavras” em L(G2): Pedro comeu queijo Pedro grande comeu queijo verde queijo grande comeu Pedro queijo grande comeu queijo grande verde grande verde verde pcq pgcqv qgcp A seguir, apresentamos as derivações para obter a palavra ’Pedro comeu queijo’: S ⇒ FVF ⇒ NVF ⇒ Pedro VF ⇒ Pedro comeu F ⇒ Pedro comeu N ⇒ Pedro comeu queijo Podemos facilmente verificar que a palavra pvcqv (Pedro verde comeu queijo verde) não é gerada pela gramática MiniG. P Exemplo 4.7 Consideremos a gramática G3 = {V, , P, S} onde V = {S, A} Σ = {a, b} P = { S → AA, A → AAA |bA |} Ab | a então mostraremos algumas derivações da palavra ababaa S ⇒ AA ⇒ aA ⇒ aAAA ⇒ abAAA ⇒ abaAA ⇒ ababAA ⇒ ababaA ⇒ ababaa S ⇒AA S ⇒AAAA ⇒ aAAA ⇒ abAAA ⇒ abaAA ⇒ ababAA ⇒ ababaA ⇒ ababaa ⇒AA ⇒ Aa ⇒ AAAa ⇒ AAbAa ⇒ AAbaa ⇒ AbAbaa ⇒ Ababaaa ⇒ ababaa S ⇒ AA ⇒ aA ⇒ aAAA ⇒ aAAa ⇒ abAAa ⇒ abAbAa ⇒ ababAa ⇒ ababaa Nas duas primeiras colunas, cada aplicação de uma regra nas derivações transforma a primeira variável que ocorre mais à esquerda da palavra. Esta propriedade é chamada de derivação mais à esquerda. Similarmente, na terceira coluna do exemplo, cada aplicação de uma regra transforma a variável que ocorre mais à direita da palavra. Esta propriedade é chamada de derivação mais à direita. Definição 4.8 Regra Diretamente Recursiva Uma A-regra da forma A → uAv é chamada Regra Diretamente Recursiva e pode gerar infinitas cópias de u seguidas de A e igual número de v’s. Uma variável A é chamada de recursiva se existe uma derivação A ⇒ uAv. Uma derivação da forma A ⇒ w ⇒ uAv, onde A não está em w, é chamada de derivação indiretamente recursiva. 74 Linguagens Formais e Autômatos - Prof. Ausberto S. Castro V. 4.2 Exemplos de Gramáticas e Linguagens Exemplo 4.8 Seja G a gramática dada pelas produções: S → aSa | aBa B → bB | b Então L(G) = {an bm an |n > 0, m > 0} Exemplo 4.9 Uma gramática é construı́da para gerar o conjunto de palı́ndromos sobre {a, b}. Então as regras de produção são: S→a|b|λ S → aSa | bSb Exemplo 4.10 As gramáticas G1 e G2 geram palavras sobre {a, b} que contém exatamente dois b’s. A linguagem L(G1) ou L(G2) é a∗ ba∗ ba∗ . G1: S → AbAbA G2: S → aS | bA A → aA | λ A → aA | bC C → aC | λ G1 requer somente duas variáveis, pois as três instâncias de a∗ são geradas pela mesma A-regra. Exemplo 4.11 A gramática G3 gera a linguagem de todas as palavras de tamanho par sobre {a, b}. S → aO | bO | λ O → aS | bS A estratégia pode ser generalizada para construir palavras de tamanho divisı́vel por 3, por 4, etc. As variáveis S e O servem como contadores. Um S ocorre em uma forma sentencial quando um número par de terminais tem sido gerados. Um O registra a presença de um número ı́mpar de terminais. Exemplo 4.12 Forma de Backus-Naur.- Existe outra notação para gramáticas, chamada de Forma de Backus-Naur ou BNF, que é usada para descrever as produções de uma gramática livre de contexto para linguagens de programação. Especificamente: • O sı́mbolo ::= é usado para substituir → • Cada sı́mbolo não terminal é inserido dentro de < > • Todas as regras de produção com o mesmo sı́mbolo não terminal no lado esquerdo, são escritas em uma declaração com todos os lados direitos listados a direita de ::=, separados por linhas verticais |. Por exemplo, as produções A → aB, A → b, A → BC, são escritas na forma: <A> ::= a <B> | b | <B><C> 4.3. TIPOS DE GRAMÁTICAS 75 Consideremos a linguagem de programação C e uma das suas instruções: o if simples: if ( condição ) { conjunto-de-instruções } Podemos escrever esta instrução utilizando uma BNF da seguinte forma: < if > ::= if <cond-logica> { <corpo-instr> } <cond-logica> ::= (<expr><relacao><expr>)| <cond-logica><oper-log><cond-logica> <expr> ::= <termo><outros-termos> <outros-termos> ::= <oper-arit><termo><outros-termos> |λ <oper-arit> ::= +|− <termo> ::= <fator><mais-fatores> <mais-fatores> ::= <oper-mul><fator><maisfatores> |λ <oper-mul> ::= ∗| / <fator> ::= <identif> | <intnum> |(<expressao>) <relacao> ::= == | > | < | >= | <= | != <identif> ::= <letra> (<letra> | <digito>)∗ ... ::= ... Exemplo 4.13 Consideremos as seguintes regras a serem utilizadas por uma gramática qualquer: S → aB | bA | λ A → aC | bS B → aS | bC C → aA | bB Então a interpretação de cada variável é a seguinte: S : número par de a’s e número par de b’s A : número par de a’s e número par de b’s B : número ı́mpar de a’s e número par de b’s C : número ı́mpar de a’s e número ı́mpar de b’s. Quando a variável S está presente, a palavra derivada satisfaz a especificação de um número par de a’s e um número par de b’s. A aplicação de S → λ remove a variável da forma sentencial, produzindo uma palavra na linguagem L. 4.3 Tipos de Gramáticas Gramáticas são classificadas de acordo com as classes de regras de produção permitidas. A seguinte classificação hierárquica deve-se a Noam Chomsky (1956). Assumimos que G = { V, Σ, P, S} e α, β ∈ V. • Tipo 1: Sem restrições nas regras de produção. • Tipo 2: Se cada regra de produção é da forma α → β onde |α| ≤ |β|, ou da forma α → λ. 76 Linguagens Formais e Autômatos - Prof. Ausberto S. Castro V. • Tipo 3: Se cada regra de produção é da forma A → β, isto é, o lado esquerdo da regra de produção é um sı́mbolo não terminal. • Tipo 4: Se cada regra de produção é da forma A → (a|aB), isto é, o lado esquerdo é um sı́mbolo não terminal, e o lado direito é um único sı́mbolo terminal ou um sı́mbolo terminal seguido de um sı́mbolo não terminal, ou da forma S → λ Outra classificação para gramáticas também pode ser: • Sensı́vel ao Contexto • Livre de Contexto • Regulares Definição 4.9 Gramática sensı́vel ao contexto Uma gramática G é dita ser sensı́vel ao contexto se as regras de produção são da forma: α1 Aα2 → α1 βα2 O nome sensı́vel ao contexto deve-se ao fato que podemos substituir a variável A por β somente quando A está entre α1 e α2 . Definição 4.10 Gramática livre de contexto Uma gramática é dita ser livre de contexto se as regras de produção são da forma: A→β O nome livre de contexto deve-se ao fato que podemos substituir a variável A por β independentemente do lugar onde A aparece. 4.4 Gramáticas e Linguagens Regulares Definição 4.11 Gramática regular Uma gramática regular é uma gramática livre de contexto na qual cada regra de produção tem uma das seguintes formas: A→a A → aB A→λ onde A, B são sı́mbolos não terminais e a é um sı́mbolo terminal. Definição 4.12 Linguagem regular Uma linguagem é regular se é gerada por uma gramática regular. Definição 4.13 Gramática linear à direita, GLD Uma Gramática Linear à Direita(GLD) é uma gramática livre de contexto onde 4.4. GRAMÁTICAS E LINGUAGENS REGULARES 77 cada regra de produção têm uma das seguintes formas: A→w A → wB A → λ, ∗ onde w ∈ Σ Definição 4.14 Gramática Linear à Esquerda, GLE Uma Gramática Linear à Esquerda(GLE) é uma gramática livre de contexto onde cada regra de produção têm uma das seguintes formas: A→w A →Bw A → λ, ∗ onde w ∈ Σ Definição 4.15 Árvore de Derivação ∗ Seja G = (V, Σ, P, S) uma gramática livre de contexto e seja S ⇒ w uma derivação. ∗ A árvore de derivação, AD, de S ⇒ w é uma árvore ordenada que pode ser construı́da iterativamente como segue: 1. Inicializar a AD com a raiz S 2. Se A → x1 x2 ...xn com xi ∈ (V ∪Σ) é uma regra de produção na derivação aplicada à palavra uAv, então agregar x1 , x2 , ..., xn como filhos de A na árvore. 3. Se A → λ é uma regra de produção na derivação aplicada à palavra uAv, então agregar λ como o único filho de A na árvore Exemplo 4.14 Seja G uma gramática com as produções: S → aAB, A → Bba, B → bB, B → c A palavra w = acbabc pode ser derivada de S como segue: S ⇒ aAB → a(Bba)B ⇒ acbaB ⇒ acba(bB) ⇒ acbabc então a árvore de derivação é mostrada na Fig. 4.1. 78 Linguagens Formais e Autômatos - Prof. Ausberto S. Castro V. S a S A S → B a S A a A B b B aAB B a b A → Bba S S A B a B → c c a B B a b B → bB b a B B A b B a b c B→ c B c Figura 4.1: Árvore de Derivação 4.5 Gramáticas Regulares e Autômatos Uma gramática livre de contexto é chamada regular se cada regra é da forma A → aB | a | λ. Cada palavra derivável em uma gramática regular contém, no máximo, uma variável (sı́mbolo não-terminal) que, se presente, ocorre como o sı́mbolo mais à direita. A derivação termina se é aplicada uma das regras A → a ou A → λ. Consideremos a linguagem L = a+ b+ gerado pela gramática G e aceito pelo autômato não-determinı́stico M, como mostrado na Fig. 4.2. A palavra para teste é aabb. Derivação Computação S ⇒ aS (S,aabb) `M (S, abb) ⇒ aaA `M (A, bb) ⇒ aabA `M (A, b) ⇒ aabb `M (Z, λ) Palavra Processada a aa aab aabb Uma computação em um autômato começa com a palavra de entrada, seqüencialmente processa o sı́mbolo mais à esquerda, e termina quando a palavra completa 79 4.5. GRAMÁTICAS REGULARES E AUTÔMATOS G: S → aS | aA A → bA | b a S a b A b Z M Figura 4.2: Gramática e Autômato foi analisada. Uma geração começa com o sı́mbolo de inı́cio S da gramática e agrega sı́mbolos terminais ao prefixo da forma sentencial derivada. A derivação termina com a aplicação da λ-regra ou de uma regra onde o lado direito é um sı́mbolo terminal. O exemplo mostra a correspondência entre a geração de uma palavra terminal em uma gramática e o processamento de uma palavra por uma computação de um autômato. Teorema 4.1. Seja G=(V, Σ, P, S) uma gramática regular, e seja M = (Q, Σ, δ, S, F) um autômato finito não-determinı́stico, definido como segue: ( V ∪ {Z} • Q= V onde Z ∈ V, se P contém a regra A → a em outro casso. • δ(A,a) = B quando A → aB ∈ P δ(A,a) = Z quando A → a ∈ P ( {A|A → λ ∈ P } ∪ {Z} se Z ∈ Q • F = {A|A → λ ∈ P } em outro casso. então L(M) = L(G) Exemplo 4.15 A linguagem a∗ (a ∪ b+ ) é gerada pela gramática G e é aceita pelo autômato M (Fig. 4.3). G: S → aS | bB | a B → bB | λ Exemplo 4.16 A linguagem da gramática regular G, é o conjunto de palavras sobre {a, b, c} que não contém a sub-palavra abc: S → bS | cS | aB | λ 80 Linguagens Formais e Autômatos - Prof. Ausberto S. Castro V. b M: B a b S a Z Figura 4.3: Exemplo de Gramática e Autômato B → aB | cS | bC | λ C → aB | bS | λ O autômato correspondente é mostrado na Fig. 4.4 b, c M: b b B S estado inicial a C c a b Figura 4.4: Outro exemplo de Gramática e Autômato 4.6 Exercı́cios 1. Dar três exemplos de gramáticas com alfabetos diferentes 2. Escreva pelo menos cinco formas sentenciais e cinco sentenças para a gramática QuatroOper do Exemplo 4.4 3. Considere a gramática G definida pelo alfabeto Σ = {a, b, c, d} e pelas produções: S → abSc| A A → cAd|cd (a) Dar uma derivação da palavra ababccddcc. 81 4.6. EXERCı́CIOS (b) Use a notação de conjuntos para definir L(G). 4. Provar por indução que se G = ({S}, {a, b}, P, S) com P dado por S −→ aSb, S −→ λ, então L(G) = {an bn |n ≥ 0} 5. Considere a gramática MiniG apresentada num exemplo anterior. Qual seria a mudança a realizar para derivar a palavra ”Pedro verde comeu queijo verde”? 6. Para cada uma das seguintes gramáticas livre-de-contexto, usar a notação conjunto para definir a linguagem gerada pela gramática: (a) S → aaSB | λ B → bB | b (b) S → abScd | A A → cdAba | λ (c) S → aSb | A A → cAd | cBd B → aBb | ab 7. Construir uma gramática sobre {a, b, c} cuja linguagem é {an b2n cm |n, m > 0} 8. Construir uma gramática sobre {a, b} cuja linguagem é {am bi an |i = m + n}. 9. Considere a gramática G determinada pelas regras: S → abA S→B S → baB S→λ A → bS B → aS A→b Construa um autômato finito não-determinı́stico M tal que L(M) = L(G). Trace as transições de M que conduzem para a aceitação da palavra abba e compare com uma derivação da mesma palavra em G. 10. Construir um autômato associado à gramática S → aA | bB A → aS | bC B → bS | aC | λ C → aB | bA 11. Seja M o autômato finito não-determinı́stico mostrado na Fig. 4.5 (estado inicial = q0 , estados finais = {q0 , q2 }) 82 Linguagens Formais e Autômatos - Prof. Ausberto S. Castro V. M: a a a q2 q1 q0 b b estado inicial = q0 estados finais = { q0,q2} Figura 4.5: Autômato e Gramática regular (a) Construir uma gramática regular a partir de M que gere a linguagem L(M). (b) Dar uma expressão regular para L(M). 12. Seja G uma gramática dada pelas regras de produção seguintes: S → aS | bA | a A → aS | bA | b. (a) Construir um autômato finito não-determinı́stico MN que aceite L(G). (b) Usando a o item anterior, construir um autômato finito determinı́stico MD que aceite L(G). (c) Construir uma gramática regular a partir de MN que gere L(MN) (d) Dar uma expressão regular para L(G) Capı́tulo 5 Autômatos de Pilha Linguagens regulares são conjuntos de palavras geradas por gramáticas regulares e aceita por autômatos finitos. O inverso não é verdadeiro. Isto significa que nem toda linguagem livre de contexto pode ser reconhecida por um autômato finito, pois, algumas linguagens livre de contexto não são regulares. Daı́ a necessidade estender a teoria para outro tipo de máquinas que reconheça linguagens livre de contexto: o autômato de pilha. Uma das linguagens livre de contexto que não é aceita por qualquer autômato finito é L1 = {ai bi |i ≥ 0}. Outra linguagem com o mesmo problema é L2 = {wwk |w ∈ {a, b}∗ } Em resumo, algumas razões porque é necessário estender o conceito de autômato finito padrão: • Autômatos finitos não podem reconhecer todas as linguagens livres de contexto • Autômatos finitos tem memória estritamente finita • Reconhecimento de linguagens livres de contexto requerem, algumas vezes, armazenamento de quantidades ilimitadas de informação, por exemplo, L={ an bn /n ≥ 0} • Precisamos armazenar e comparar uma seqüência de sı́mbolos em ordem inversa, por exemplo em L = { wwR } 5.1 Autômatos de Pilha e Linguagens Definição 5.1 Autômato de pilha Um autômato de pilha, denotado por AuP, é uma séxtupla M = (Q, Σ, Γ, δ, q0 , F), 83 84 Linguagens Formais e Autômatos - Prof. Ausberto S. Castro V. onde Q é um conjunto finito de estados internos da unidade de controle Σ é um conjunto finito de sı́mbolos chamado alfabeto de entrada Γ é um conjunto finito chamado alfabeto de pilha q0 ∈ Q é o estado inicial. F ⊆ Q é o conjunto de estados finais. δ : Q × (Σ ∪ {λ}) × (Γ ∪ {λ}) → Q ×(Γ ∪ {λ}) é a função de transição Um autômato de pilha tem dois alfabetos: um de entrada, a partir dos quais são construı́das as palavras de entrada, e outro, o alfabeto de pilha cujos elementos serão armazenados na pilha1 . A pilha é representada como uma palavra de elementos de pilha com o elemento do topo da pilha sendo o sı́mbolo mais a esquerda da palavra. Ex. BABBA. As seguintes são as caracterı́stica s de uma pilha: • Os elementos do alfabeto de pilha Γ são escritos com letras maiúsculas ou com sı́mbolos diferentes do alfabeto de entrada. • Letras gregas representam palavras de sı́mbolos de pilha. Ex. α = AABAB. • A notação Aα representa uma pilha α com o sı́mbolo A como o elemento topo. • Uma pilha vazia é representada pelo sı́mbolo λ Símbolos de entrada a b b a b b a b b a Unidade de Controle Pi l h a cabeça de leitura primeiro elemento B topo A B B A Figura 5.1: Autômato de Pilha 1 Uma pilha é uma estrutura do tipo LIFO (Last Input First Output). As operações mais conhecidas são: push (inserir elementos), pop (remover elementos) e top (para saber qual é o elemento do top) 5.1. AUTÔMATOS DE PILHA E LINGUAGENS 85 Exemplo 5.1 Considere o autômato de pilha com Q = {q0 , q1 , q2 , q3 } Σ = {a, b} Λ = {A, B} F = {q3 } com estado inicial q0 e com as transições δ(q0 , a, A) = {q1 , A), (q3 , λ)} δ(q0 , λ, A) = {(q3 , λ)} δ(q1 , a, B) = {(q1 , BB)} δ(q1 , b, B) = {(q2 , λ)} δ(q2 , b, B) = {(q2 , λ)} δ(q2 , λ, A) = {(q3 , λ)} 5.1.1 Funcionamento de un Autômato de Pilha • A computação de um autômato de pilha começa com a máquina em estado inicial q0 , com a palavra a ser processada na fita, e com a pilha vazia. • O AuP consulta o atual estado, o sı́mbolo de entrada e o sı́mbolo do topo da pilha para determinar a transição da máquina. A função de transição δ lista todas as possı́veis transições dadas pela combinação de estado, sı́mbolo e topo de pilha. O valor da função de transição δ(qi , a, A) = { [qj , B], [qk , C] } indica que duas transições são possı́veis quando o autômato esta no estado qi lendo o sı́mbolo a e tendo um A no topo da pilha. A transição: [qj , B] ∈ δ(qi , a, A) ou δ(qi , a, A) = [qj , B] indica para a máquina: - mudar o estado de qi para qj - processar o sı́mbolo a (avançar a cabeça da fita) - remover o sı́mbolo A do topo da pilha - inserir o sı́mbolo B no topo da pilha. • Um argumento λ na posição da pilha indica que o valor da componente nem deveria ser consultada nem utilizada para a transição. A aplicabilidade da transição é completamente determinada pelas posições que não contém o sı́mbolo λ. Uma transição δ somente é determinada pelo estado e o sı́mbolo de entrada. A transição não consulta nem altera a pilha • Quando um λ ocorre como argumento na posição da pilha na função δ, a transição é aplicável. Por exemplo, a transição δ(qi , a, λ) = [qj , B] entrará em estado qj e agregará B no topo da pilha, porém, a máquina está em estado q0 para processar o elemento a. 86 Linguagens Formais e Autômatos - Prof. Ausberto S. Castro V. • Quando a posição de entrada é λ, a transição não processa nenhum sı́mbolo de entrada. A transição somente (i) remove e (ii) insere o sı́mbolo da pilha sem alterar o estado ou entrada. Uma configuração de um AuP é representada por [qi , w, α] onde qi é o estado da máquina, w a entrada não processada, e α a pilha. A notação: [qi , w, α] `M [qj , v, β] indica que a configuração [qj , v, β] pode ser obtida a partir de [qi , w, α] por uma simples transição do autômato de pilha M Utilizando diagramas de estado, uma transição num autômato de pilha pode ser representado como mostra a Fig. 6.2: qi a A/B qj Figura 5.2: Transição δ(qi , a, A) = { [qj , B] } onde A/B indica substituir, no topo da pilha, o sı́mbolo A pelo sı́mbolo B. Exemplo 5.2 Seja M definido da seguinte forma: Q = {qo , q1 } Σ = {a, b} Γ = {A} F = {q0 , q1 } δ(q0 , a, λ) = {[q0 , A]} δ(q0 , b, A) = {[q1 , λ]} δ(q1 , b, A) = {[q1 , λ]} Observa-se que processar o sı́mbolo a significa inserir (push) o elemento A na pilha, e processar b significa retirar (pop) o topo da pilha. A computação gerada pela palavra de entrada aabb mostra como trabalha a máquina M: [q0 , aabb, λ] ` [q0 , abb, A] ` [q0 , bb, AA] ` [q1 , b, A] ` [q1 , λ, λ] Definição 5.2 Palavra aceita Seja M = (Q, Σ, Γ, q0 , F) um AuP. Uma palavra w ∈ Σ∗ é aceita por M se existe uma computação [q0 , w, λ] ` [qi , λ, λ] 87 5.1. AUTÔMATOS DE PILHA E LINGUAGENS onde qi ∈ F. Em outras palavras, uma entrada é aceita se existe uma computação que processe a palavra completa e termine em um estado aceitável (final) com a pilha vazia. Este tipo de aceitação é chamada de aceitação por estado final e pilha vazia. Definição 5.3 Linguagem de uma máquina A linguagem de M, denotada por L(M), é o conjunto de palavras aceitas por M. A computação que aceita uma palavra é chamada de computação com sucesso. Uma palavra w é aceita por estado final se existe uma computação [q0 , w, λ] `∗ [qi , λ, α], onde qi é um estado aceitável e α ∈ Γ∗ . Uma linguagem aceita por estado final é denotada LF Exemplo 5.3 O autômato de pilha M aceita a linguagem {wcwR |w ∈ {a, b}∗ }. A pilha é usada para armazenar a palavra w que está sendo processada. M: Q = {q0 , q1 } Σ = {a, b, c} Γ = {A, B} F = {q1 } δ(q1 , b, B) = {[q1 , λ]} δ(q0 , a, λ) = {[q0 , A]} δ(q0 , b, λ) = {[q0 , B]} δ(q0 , c, λ) = {[q1 , λ]} δ(q1 , a, A) = {[q1 , λ]} A computação para a palavra de entrada abcba é a seguinte: [q0 , abcba, λ] ` [q0 , bcba, A] ` [q0 , cba, BA] ` [q1 , ba, BA] ` [q1 , a, A] ` [q1 , λ, λ] Como seriam as computações para as entradas aacaa e abbcbba ? Definição 5.4 Autômato de Pilha Determinı́stico, AuPD Um AuP é determinı́stico se existe, no máximo, uma transição que é aplicável para cada combinação de estado, sı́mbolo de entrada e topo de pilha. Definição 5.5 Transições compatı́veis Duas transições [qj , C] ∈ δ(qi , u, A) e [qk , D] ∈ δ(qi , v, B) são chamadas compatı́veis se qualquer das seguintes condições são satisfeitas: • u=v eA=B • u = v e A = λ ou B = λ • A = B e u = λ ou v = λ • u = λ ou v = λ e A = λ ou B = λ Exemplo 5.4 A linguagem L = {ai |i ≥ 0} ∪ {ai bi |i ≥ 0} contém palavras formadas por unicamente a’s o por igual número de a’s e b’s. A pilha do autômato finito M que aceita L mantém um registro do número de a’s processados até ser encontrado um b ou a palavra de entrada tenha sido processado completamente. O gráfico 5.3 mostra a máquina M. 88 Linguagens Formais e Autômatos - Prof. Ausberto S. Castro V. a λ /A q0 estado inicial b A/ λ λ λ/ λ q1 M q2 b A/ λ estado final estado final λ A/ λ Figura 5.3: Autômato de pilha para a linguagem {ai |i ≥ 0} ∪ {ai bi |i ≥ 0} Ao processar a no estado q0 existem duas transições que são aplicáveis. Uma palavra da forma ai bi para i > 0 é aceita por uma computação que permanece nos estados q0 e q1 . Se uma transição ao estado q2 segue ao processamento de um a final em uma palavra ai , a pilha é esvaziada ea entrada é aceita. Atingir o estado q2 de outra maneira significa ter uma computação sem sucesso, pois nenhuma computação é executada após atingir q2 . A λ-transição a partir de q0 permite à máquina entrar no estado q2 depois de ter sido lido uma entrada completa. Isto introduz não-determinismo na máquina. Exemplo 5.5 A linguagem formada por palı́ndromos pares sobre {a, b} é aceita pela máquina M (Fig. 5.4). A linguagem é L(M) = {wwR |w ∈ {a, b}∗ } Uma computação permanece no estado q0 enquanto processa a palavra w e entra no estado q1 para a leitura do primeiro sı́mbolo em wR . As palavras na linguagem L(M) não tem marcadores intermediários que induzam à mudança de estado de q0 para q1 . Por exemplo, para processar a palavra u = abbbba, primeiro devemos identificar a palavra w de modo que u = wwR . Logo trataremos de criar duas máquinas M1 e M2: na primeira será processada w e, na segunda, será processada wR . Como wR é o reverso de w, fica claro que M1 será usada para a operação push na pilha (estado q0 ) e M2 para a operação pop (estado q1 ). A mudança de um estado para outro (de M1 para M2) será feita usando a λ-transição. Logo M = M1 ∪ M2. 89 5.2. VARIAÇÕES DE UM AUTÔMATO DE PILHA b λ /B a λ /A q0 estado inicial λ λ/ λ q1 b B/ λ a A/ λ estado final Figura 5.4: Autômato de pilha para a palı́ndromos pares 5.2 Variações de um Autômato de Pilha Definição 5.6 Autômato de Pilha Atômico Um autômato de pilha é chamado de atômico se cada transição produz somente uma das três ações: retirar o topo da pilha (pop), inserir um elemento na pilha (push) e processar um sı́mbolo de entrada. Transições de um AuP atômico são da forma: [qj , λ] ∈ δ(qi , a, λ) [qj , λ] ∈ δ(qi , λ, A) [qj , A] ∈ δ(qi , λ, λ) Teorema 5.1. Seja M um autômato de pilha. Então existe um autômato de pilha atômico N com L(N) = L(M). Definição 5.7 Transição estendida Uma transição estendida é uma operação sobre um AuP que insere uma palavra completa em vez de um único elemento sobre a pilha. Por exemplo, [qj , BCD] ∈ δ(qi , u, A). Um autômato de pilha que contém transições estendidas é chamado de Autômato de Pilha Estendido. Teorema 5.2. Seja M um autômato de pilha estendido. Então existe um autômato de pilha N tal que L(N)=L(M) Exemplo 5.6 Seja L ={ai b2i |i ≥ 1}. Sejam Σ = {a, b} o alfabeto de entrada, Γ = {A} o alfabeto de pilha, e F ={q1 }. As computações são mostradas na seguinte tabela: 90 Linguagens Formais e Autômatos - Prof. Ausberto S. Castro V. AuP Q = {q0 , q1 , q2 } δ(q0 , a, λ) = {[q2 , A]} δ(q2 , λ, λ) = {[q0 , A]} δ(q0 , b, A) = {[q1 , λ]} δ(q1 , b, A) = {[q1 , λ]} AuP Atômico Q = {q0 , q1 , q2 , q3 , q4 } δ(q0 , a, λ) = {[q3 , λ]} δ(q3 , λ, λ) = {[q2 , A]} δ(q2 , λ, λ) = {[q0 , A]} δ(q0 , b, λ) = {[q4 , λ]} δ(q4 , λ, A) = {[q1 , λ]} δ(q1 , b, λ) = {[q4 , λ]} AuP Estendido Q = {q0 , q1 } δ(q0 , a, λ) = {[q0 , AA]} δ(q0 , b, A) = {[q1 , λ]} δ(q1 , b, A) = {[q1 , λ]} Como seriam as computações, nos três autômatos, da palavra aabbbb ? 5.3 Autômatos de Pilha e Linguagens Livre de Contexto Como exemplo, consideremos uma gramática G definido pelas seguintes regras: S → aAB | aB A → aAB | aB B→b que aceita a linguagem L = {ai bi |i > 0}. Construiremos um autômato de pilha da seguinte forma: • Estado inicial q0 e estado final q1 • Uma S-regra da forma S → aA1 A2 ...An gera uma transição que processa o sı́mbolo terminal a, insere as variáveis A1 A2 ...An na pilha e entra no estado q1 • O resto das computações usam os sı́mbolos de entrada e o topo da pilha para determinar a apropriada transição. • A função de transição δ é definido diretamente das regras: δ(q0 , a, λ) = {[q1 , AB], [q1 , B]} δ(q1 , a, A) = {[q1 , AB], [q1 , B]} δ(q1 , b, B) = {[q1 , λ]} Teorema 5.3. Seja L uma linguagem livre de contexto. Então existe um autômato de pilha que aceita L. Demonstração. [SUD 05] Teorema 5.4. A classe de linguagens aceitas por autômatos de pilha é exatamente a classe de linguagens livres de contexto. Demonstração. [LEW 00], pág. 134 5.3. AUTÔMATOS DE PILHA E LINGUAGENS LIVRE DE CONTEXTO 5.3.1 91 Construção de gramáticas livres de contexto a partir de autômatos de pilha I. As regras de uma gramática livre de contexto são construı́das a partir das transições do autômato de pilha. A gramática é desenhada de modo que a aplicação de uma regra corresponde a uma transição em um AuP. II. Seja M = (Q, Σ, Γ, δ, q0 , F) uma autômato de pilha. Um autômato de pilha estendido N com transição φ é construı́da a partir de M, incrementando δ com as transições: Se [qj , λ] ∈ δ(qi , u, λ) então [qj , A] ∈ φ(qi , u, A) para cada A∈ Γ. Se [qj , B] ∈ δ(qi , u, λ) então [qj , BA] ∈ φ(qi , u, A) para cada A∈ Γ. III. Uma gramática G = (V, Σ, P, S) é construı́da a partir das transições de N. • O alfabeto de G é o alfabeto de entrada de N • As variáveis de G são o sı́mbolo de inı́cio S e os objetos da forma hqi , A, qj i, onde os q’s são os estados de N e A∈ Γ ∪ {λ} • A variável hqi , A, qj i representa a computação que começa no estado q1 , termina no estado qj e remove o sı́mbolo A da pilha. As regras de G são construı́das da seguinte forma: i. S → hq0 , λ, qj i para cada qj ∈ F ii. Cada transição [qj , B] ∈ δ(qi , x, A), onde A ∈ Γ ∪ {λ}, gera o conjunto de regras: {hqi , A, qk i → xhqj , B, qk i | qk ∈ Q} iii. Cada transição [qj , BA] ∈ δ(qi , x, A), onde A ∈ Γ, gera o conjunto de regras: {hqi , A, qk i → xhqj , B, qn ihqn , A, qk i | qk , qn ∈ Q} iv. Para cada estado qk ∈Q, temos hqk , λ, qk i → λ Exemplo 5.7 M: Seja M um autômato de pilha definido da seguinte forma: Q = {q0 , q1 } Σ = {a, b, c} Γ={A} F = {q1 } δ(q0 , a, λ) = {[q0 , A]} δ(q0 , c, λ) = {[q1 , λ]} δ(q1 , b, A) = {[q1 , λ]} As transições δ(q0 , a, A) = {[q0 , AA]} e δ(q0 , c, A) = {[q1 , A]} são agregadas a M para construir N. As regras da gramática G são dadas na Tabela 5.1. A linguagem de M é o conjunto {an cbn | n ≥ 0} Para visualizar o relacionamento entre computações de um autômato de pilha e derivações na gramática associada, usamos a palavra de entrada w = aacbb 92 Linguagens Formais e Autômatos - Prof. Ausberto S. Castro V. Transição δ(q0 , a, λ) = {[q0 , A]} Regra S → hq0 , λ, q1 i hq0 , λ, q0 i → ahq0 , A, q0 i hq0 , λ, q1 i → ahq0 , A, q1 i δ(q0 , a, A) = {[q0 , AA]} hq0 , A, q0 i → ahq0 , A, q0 ihq0 , A, q0 i hq0 , A, q1 i → ahq0 , A, q0 ihq0 , A, q1 i hq0 , A, q0 i → ahq0 , A, q1 ihq1 , A, q0 i hq0 , A, q1 i → ahq0 , A, q1 ihq1 , A, q1 i δ(q0 , c, λ) = {[q1 , λ]} hq0 , λ, q0 i → chq1 , λ, q0 i hq0 , λ, q1 i → chq1 , λ, q1 i δ(q0 , c, A) = {[q1 , A]} hq0 , A, q0 i → chq1 , A, q0 i hq0 , A, q1 i → chq1 , A, q1 i δ(q1 , b, A) = {[q1 , λ]} hq1 , A, q0 i → bhq1 , λ, q0 i hq1 , A, q1 i → bhq1 , λ, q1 i hq0 , λ, q0 i → λ hq1 , λ, q1 i → λ Tabela 5.1: Regras de G construı́das a partir de transições [q0 , aacbb, λ] ` [q0 , acbb, A] ` [q0 , cbb, AA] ` [q1 , bb, AA] ` [q1 , b, A] ` [q0 , λ, λ] S ⇒ hq0 , λ, q1 i ⇒ ahq0 , A, q1 i ⇒ aahq0 , A, q1 i ⇒ aachq1 , A, q1 i ⇒ aacbhq1 , λ, q1 i ⇒ aacbhq1 , A, q1 i ⇒ aacbbhq1 , λ, q1 i ⇒ aacbb Teorema 5.5. Seja M um autômato de pilha. Então existe uma gramática livre de contexto G tal que L(G) = L(M) Lema 5.1. Se hqi , A, qj i ⇒ w onde A ∈ Γ ∪ {λ}, então existe uma computação [qi , w, A] ` [qj , λ, λ] Lema 5.2. Se [qi , w, A] ` [qj , λ, λ] onde A ∈ Γ ∪ {λ}, então existe uma derivação hqi , A, qj i ⇒ w 5.4. FORMAS NORMAIS DE CHOMSKY E GREIBACH 5.4 93 Formas Normais de Chomsky e Greibach Definição 5.8 Forma Normal de Chomsky Uma gramática livre de contexto G = (V, Σ, P, S) está em forma normal de Chomsky se cada regra de produção tem uma das seguintes formas: i. A → BC ii. A → a iii. S → λ onde B,C ∈ V - {S}. Definição 5.9 Forma Normal de Greibach Uma gramática livre de contexto G = (V, Σ, P, S) está em forma normal de Greibach se cada regra de produção tem uma das seguintes formas: i. A → aA1 A2 ...An ii. A → a iii. S → λ onde a ∈ Σ e Ai ∈ V - {S} para i = 1, 2, ..., n. Lema 5.3. Seja G uma gramática livre de contexto em forma normal de Chomsky e seja A ⇒ w uma derivação de w ∈ Σ com árvore de derivação T. Se a profundidade de T é n, então o comprimento de w é menor o igual que 2n−1 Lema 5.4. Lema do Bombeamento. Seja L uma linguagem livre de contexto. Existe um número k, dependente de L, de modo que qualquer palavra z ∈ L com |z| > k pode ser escrito z = uvwxy onde i. |vwx| ≤ k ii. |v| + |x| > 0 iii. uv i wxi y ∈ L, para i ≥ 0 Exemplo 5.8 A linguagem L = {ai bi ci |i ≥ 0} não é livre de contexto. Considere k o número do lema de bombeamento, então w = ak bk ck = uvwxy. Pode ser provado que não é possı́vel este tipo de decomposição. Exemplo 5.9 A linguagem L = {ai bj ai bj |i, j ≥ 0} não é livre de contexto. Consideramos aqui z = ak bk ak bk = uvwxy 94 Linguagens Formais e Autômatos - Prof. Ausberto S. Castro V. Exemplo 5.10 A linguagem L ={w ∈ a∗ | |w| é primo } não é livre de contexto. Assume-se que L é livre de contexto (contradição) e que n é primo maior que k. Então a palavra an = uvwxy. Seja m = |u| + |w| + |y|. O comprimento de qualquer palavra |uv i wxi y| = m + i(n − m). Em particular, |wv n+1 wxn+1 y| = m + (n + 1)(n − m) = n(n − m + 1) não é primo, logo a palavra não está em L. Assim, L não é livre de contexto. 5.5 Exercı́cios 1. Seja Q Σ Γ F M um autômato de pilha definido como: = {q0 , q1 , q2 } δ(q0 , a, λ) = {[q0 , A]} = {a, b} δ(q0 , λ, λ) = {[q1 , λ]} = {A} δ(q0 , b, A) = {[q2 , λ]} = {q1 , q2 } δ(q1 , λ, A) = {[q1 , λ]} δ(q2 , b, A) = {[q2 , λ]} δ(q2 , λ, A) = {[q2 , λ]} (a) Descrever a linguagem aceita pela máquina M. (b) Mostrar o diagrama de estados para M. (c) Mostrar todas as computações para as palavras aab, abb, aba em M. (d) Mostrar que aabb e aaa são palavras da linguagem L(M). 2. Construir autômatos de pilha que aceitem cada uma das seguintes linguagens: (a) {ai bj ck |i + k = j} (b) {ai bj |i 6= j} (c) {ai+j bi cj |i, j > 0} (d) {a3i bi |i ≥ 0} 3. Seja G = (V, Σ, P, S) uma gramática livre de contexto. Defina um autômato de pilha estendido M na seguinte forma: Q = {q0 } Σ = ΣG Γ = ΣG ∪ V F = {q0 δ(q0 , λ, λ) = {[q0 , S]} δ(q0 , λ, A) = {[q0 , w] | A → w ∈ P } δ(q0 , a, a) = {[q0 , λ] | a ∈ Σ} Provar que L(M) = L(G) 4. Provar que cada uma das seguintes linguagens não é livre de contexto: 5.5. EXERCı́CIOS (a) {ai b2i ai | i ≥ 0} (b) {ai bj ck | 0 < i < j < k} (c) {wwR w | w ∈ {a, b}∗ } 95 96 Linguagens Formais e Autômatos - Prof. Ausberto S. Castro V. Capı́tulo 6 Máquinas de Turing 6.1 Decidibilidade, Computabilidade e Computadores Em 1936, com a idade de 24 anos, Alan M. Turing1 consagrou-se como um dos maiores matemáticos do seu tempo quando fez antever aos seus colegas que era possı́vel executar operações computacionais sobre a teoria dos números por meio de uma máquina que tivesse embutidas as regras de um sistema formal. Embora propriamente não existisse tal máquina, Turing enfatizou desde o inı́cio que tais mecanismos poderiam ser construı́dos. Sua descoberta abriu uma nova perspectiva no esforço de formalizar a matemática, e, ao mesmo tempo, marcou fortemente a história da computação. Em sua brilhante solução para um dos problemas chave discutidos pelos formalistas, Alan Turing descreveu em termos matematicamente precisos como um sistema formal automático, com regras muito simples de operação, pode ser poderoso. Um sistema formal automático é um dispositivo fı́sico que manipula automaticamente os sı́mbolos de um sistema formal de acordo com as regras dele. A máquina teórica de Turing era tanto um exemplo da sua teoria da computação como uma prova de que certos tipos de máquinas computacionais poderiam, de fato, serem construı́das. Quando ele uniu matemática e lógica na forma de uma máquina, Turing tornou possı́veis sistemas processadores de sı́mbolos. Propôs ainda que a grande maioria dos problemas inteligı́veis poderiam ser convertidos para a forma ”encontre um número n tal que ...”. E, mais importante do que esta ligação entre as abstrações do nosso 1 Alan Mathison Turing nasceu em Paddington, Londres, em 1912. Morreu em Manchester em 1954. Foi um dos grandes pioneiros do mundo da computação. Seu nome inspirou os conhecidos termos Máquina de Turing e Teste de Turing. Como matemático aplicou o conceito de algoritmo a computadores digitais. Trabalhou na implementação das máquinas COLOSSUS, ACE (Automatic Computing Engine), MADAM (Manchester Automatic Digital Machine) 97 98 Linguagens Formais e Autômatos - Prof. Ausberto S. Castro V. sistema cognoscitivo e a realidade concreta dos números - buscada pelos pesquisadores do campo da inteligência artificial -, foi a descoberta feita por Turing de que os números eram elementos mais importantes como sı́mbolos, neste caso, do que como elementos de cálculo. O que faz o raciocı́nio humano quando executa um cálculo, perguntou Turing. Ele definiu que os cálculos mentais consistem de operações para transformar números em uma série de estados intermediários que progridem de um para outro de acordo com um conjunto fixo de regras, até que uma resposta seja encontrada. Algumas vezes usamos papel e lápis para não perdermos o estado dos nossos cálculos. As regras da matemática exigem definições mais rı́gidas que aquelas descritas nas discussões metafı́sicas sobre os estados da mente humana, e Turing concentrou-se na definição destes estados de tal maneira que fossem claros e sem ambigüidades, para que tais definições pudessem ser usadas para comandar as operações da máquina. Turing começou com uma descrição precisa de um sistema formal, na forma de ”tabela de instruções”que descreviam quais movimentos a fazer para qualquer configuração possı́vel dos estados no sistema. Ele então provou que a descrição destas informações, que os passos de um sistema axiomático formal semelhante à lógica, e o estados da máquina que fazem os ”movimentos”em um sistema formal automático são equivalentes entre si. Estes conceitos estão todos subjacentes na tecnologia atual dos computadores digitais, que foram possı́veis somente uma década depois da publicação de Turing. Turing provou que para qualquer sistema formal existe uma máquina de Turing que pode ser programada para imitá-lo. Era este sistema formal genérico, com a habilidade de imitar qualquer outro sistema formal, o que Turing procurava. Tais sistemas chamam-se Máquinas de Turing Universais. A teoria foi estabelecida pela primeira vez em um ’paper’ que tinha o tı́tulo ”On Computable Numbers, with an application on the Entscheidungsproblem”. Um pequeno parêntesis para falar do ”Entscheidungsproblem”, isto é, o problema da decidibilidade. Em 1900, no Segundo Congresso Internacional de Matemática, realizado em Paris, David Hilbert propôs uma lista de problemas de envergadura, cuja solução ”desafiaria futuras gerações de matemáticos”. Vários destes problemas dessa famosa lista foram desde então resolvidos, sendo que alguns resistem até hoje e permanecem ainda em aberto. O décimo problema da lista de Hilbert era de enunciado bastante simples: descreva um algoritmo que determina se uma dada equação diofantina do tipo P (u1 , u2 , ..., uN ) = 0, onde P é um polinômio com coeficientes inteiros, tem uma solução dentro do conjunto dos inteiros. Em ’computês’: escreva um programa que tem por entrada uma equação diofantina, e que dá por saı́da um sim ou não, conforme a equação dada tenha ou não soluções inteiras. O programa não precisa encontrar a solução da equação, somente se tal solução existe. Se a entrada for x2 − y 2 + xy − 11 = 0, então o programa após um número finito de passos, deve responder sim, pois esta equação tem solução inteira (x=3, y=2 é uma 99 6.2. MÁQUINA DE TURING PADRÃO solução). Já se a entrada fosse x2 + y 2 + xy − 11 = 0, a resposta deveria ser não, pois esta equação não possui soluções inteiras. A Máquina de Turing era a resposta de Alan Turing à questão metamatemática de Hilbert. Turing estabeleceu um modelo formal de algoritmo e um pouco depois Church proporia que qualquer procedimento efetivo poderia ser realizado por uma Máquina de Turing (Tese de Church). Quer dizer, qualquer processo aceito por nós homens como um algoritmo é precisamente o que uma Maquina de Turing pode fazer. A idéia de computabilidade começa a ser delineada. 6.2 Máquina de Turing Padrão Nem autômatos finitos nem autômatos de pilha são capazes de reconhecer linguagens do tipo L = {an bn cn | n ≥ 0}. Para resolver este problema foram criados outro dispositivo chamado Máquina de Turing. Isto não significa que tal dispositivo seja uma extensão dos autômatos. Definição 6.1 Máquina de Turing Padrão Uma Máquina de Turing Padrão P é uma tupla M = (Q, , Γ, δ, q0 ) onde Q é um conjunto finito de estados, Γ um conjunto finito P chamado alfabeto de fita, Γ contém um sı́mbolo especial B que representa um branco, é um subconjunto de Γ - {B} chamado alfabeto de entrada, δ é uma função parcial: δ : Q × Γ −→ Q × Γ × {L, R} chamada função de transição, e q0 ∈Q o estado inicial. A fita de uma máquina de Turing se estende infinitamente em uma direção (a direita). As posições da fita são numeradas usando números naturais, com a primeira posição (a mais a esquerda) numerada com 0. 0 1 2 3 4 5 a a b b b ... q0 Figura 6.1: Fita da Máquina de Turing ... 100 Linguagens Formais e Autômatos - Prof. Ausberto S. Castro V. 6.2.1 Funcionamento da Máquina de Turing A Máquina de Turing funciona da seguinte maneira: i. A computação começa com a máquina no estado inicial q0 e a cabeça leitora da fita examinando a posição 0 (a primeira). P ii. A entrada, uma palavra de ∗ , é escrita na fita começando na posição 1. iii. A posição 0 e o resto da fita, assume-se estar em branco. O alfabeto da fita Γ fornece todos os sı́mbolos adicionais que podem ser utilizados na computação. iv. A transição esta formada por três ações: • mudança de estado, • escrever um sı́mbolo no quadrado examinado pela cabeça leitora, e • mover a cabeça leitora A direção do movimento é especificado pela terceira componente da transição: uma L indica move uma posição na fita à esquerda (Left), e uma R indica mover uma posição a direita (Right). i i x y qi qj Figura 6.2: Transição δ(qi , x) = [qj , y, L] A transição da Fig. 6.2, muda o estado qi para qj , substitui o sı́mbolo x pelo y, e move a cabeça leitora uma posição a esquerda (L). A habilidade da Máquina de Turing de se movimentar nas duas direções e processar espaços em branco (B) introduz a possibilidade da computação continuar indefinidamente. v. A Máquina de Turing pára (stop, halt) quando encontrar um par (estado, sı́mbolo) para os quais nenhuma transição é definida. Quando uma transição indicar que se deve movimentar para a esquerda da posição 0, entendemos este fato como uma terminação anormal. Note-se que na definição de Máquina de Turing não foram considerados os estados finais. 101 6.2. MÁQUINA DE TURING PADRÃO vi. As computações da Máquina de Turing são sobre palavras do alfabeto de entrada. vii. Uma Máquina de Turing pode ser representada por um diagrama de estados. A transição δ(qi , x) = [qj , y, D] | D ∈ {L, R} é representada por um arco de qi para qj rotulada por x/yD. viii. Uma configuração esta formada por o estado, a fita e a posição da cabeça leitora. Uma configuração é denotada por uqi vB, onde todas as posições a direita de B são brancos e uv é a palavra desde a posição inicial da fita até B. Brancos (B) podem ocorrer em uv. A notação uqi vB indica que a máquina está em estado qi examinando o primeiro sı́mbolo de v e que todos os espaços a direita de B são brancos. Obviamente, a sub-palavra u indica a parte já processada. O inı́cio da computação tem a seguinte configuração: q0 BwB, onde w é a palavra a ser processada. ix. As representações das configurações da máquina podem ser utilizadas para mostrar as computações da Máquina de Turing. A notação uqi vB `M xqj yB indica que a configuração xqj yB é obtida a partir de uqi vB por uma transição simples de M. Exemplo 6.1 Máquina Inversora Seja a função de transição δ de uma Máquina de Turing Padrão M com alfabeto de entrada {a, b} na seguinte tabela: δ q0 q1 q2 a b q1 , b, R q2 , a, L q1 , a, R q2 , b, L a/a λ b/b λ a/b R b/a R M: B/B R q0 B q1 , B, R q2 , B, L q1 B/B q2 Figura 6.3: Diagrama de estados para a Máquina de Turing M Consideremos a palavra de entrada abab. Então as computações são as seguintes: q0 BababB ` Bq1 ababB ` Bbq1 babB ` Bbaq1 abB ` Bbabq1 bB ` Bbabaq1 B ` Bbabq2 aB ` Bbaq2 baB ` Bbq2 abaB ` Bq2 babaB ` q2 BbabaB 102 Linguagens Formais e Autômatos - Prof. Ausberto S. Castro V. Pergunta: O que faz esta máquina de Turing? Como são as computações para a palavra de entrada aabaa ? Exemplo 6.2 Máquina Copiadora Seja C uma Máquina de Turing definida sobre o alfabeto {a, b}, de modo que para cada entrada da forma BwB temos uma saı́da da forma BwBwB. Funcionamento: A computação copia a palavra da entrada, um sı́mbolo por vez, começando do sı́mbolo mais a esquerda. Os sı́mbolos Y e Y da fita registram a parte da entrada que já foi processada. O primeiro sı́mbolo não marcado na palavra especifica o caminho a seguir a partir do estado q1 . O ciclo (q1 , q2 , q3 , q4 , q1 ) substitui um a por um X e agrega um a à palavra que esta sendo construı́da. X/X R a/a R b/b R C: q2 q0 B/B R a/a R b/b R q3 a/X R q1 B/B L X/a L Y/b L B/B R Y/Y R q7 b/Y R q5 B/B R a/a R b/b R B/a L B/b L q6 a/a R b/b R q4 a/a L b/b L B/B L Figura 6.4: Máquina de Turing Copiadora Processar a palavra w = aba usando a máquina C. 6.3 Máquina de Turing como Aceitantes de Linguagens Definição 6.2 P Palavra aceita por estado final P Seja M = (Q, , Γ, δ, q0 , F ) uma máquina de Turing. Uma palavra u ∈ ∗ é aceita por estado final se a computação de M com entrada u pára em um estado final qi ∈ F . Uma computação que termina anormalmente rejeita a entrada indiferentemente do estado final da máquina. A linguagem de M, denotada por L(M), é o conjunto de todas as palavras aceitas por M. 103 6.3. MÁQUINA DE TURING COMO ACEITANTES DE LINGUAGENS Definição 6.3 Linguagem recursivamente enumerável Uma linguagem aceita por uma máquina de Turing é chamada de linguagem recursivamente enumerável. A linguagem que é aceita por uma máquina de Turing que pára para todas as palavras de entrada, é uma linguagem recursiva. A recursividade é uma propriedade da linguagem e não da máquina de Turing. Exemplo 6.3 A máquina de Turing M que aceita a linguagem L = (a ∪ b)∗ aa(a ∪ b)∗ é mostrada na Fig. 6.5. b/b R q0 B/B R q1 a/a R estado inicial q2 a/a R q3 estado final b/b R Figura 6.5: Máquina de Turing para (a ∪ b)∗ aa(a ∪ b)∗ Como são as computações da palavra babaa? da palavra aabb? Exemplo 6.4 Consideremos agora a linguagem L = {ai bi ci | i ≥ 0} Y/Y R Z/Z R q5 q6 a/a L b/b L Y/Y L Z/Z L estado final Y/Y R q0 B/B R B/B R q1 B/B R a/X R q2 b/Y R q3 c/Z L q4 estado inicial a/a R Y/Y R b/b R Z/Z R X/X R Figura 6.6: Máquina de Turing para {ai bi ci | i ≥ 0} A computação da máquina da Fig. 6.6 termina satisfatoriamente quando todos 104 Linguagens Formais e Autômatos - Prof. Ausberto S. Castro V. os sı́mbolos de entrada tem sido transformados em sı́mbolos de fita. A transição de q1 para q6 aceita a palavra nula. 6.4 Critérios de Aceitação alternativos A aceitação de uma palavra em uma máquina de Turing, definida anteriormente, esta baseada no estado da máquina quando a computação pára. A seguir definimos outras alternativas • Aceitação por Parada: quando uma palavra de entrada é aceita se a computação iniciada com esta palavra produz uma parada na máquina de Turing respectiva. Computações pelas quais a máquina termina anormalmente rejeita a palavra. P Máquinas com este critério de aceitação são definidas pela 5-tupla (Q, , Γ, δ, q0 ) sem os estados finais. • aceitação por estado final Uma palavra w é aceita por uma máquina de Turing M se a computação de M com entrada w entra (porém não necessariamente termina) em um estado final Referências Bibliográficas [AHO 08] AHO, A.V.,Lam, M.S., Sethi, R., Ullman, J.D., Compiladores Princı́piosm, técnicas e ferramentas, São Paulo: Pearson AddisonWesley, 2008. [AND 06] ANDERSON, J.A., Automata Theory with Modern Applications, Cambridge: Cambridge University Press, 2006. [DIV 00] DIVERIO, T.A., Menezes,P.F.B., Teoria da Computação Máquinas Universais e Computabilidade, Porto Alegre: Instituto de Informática da UFRGS: Editora Sagra Luzzatto, 2000. [GER 01] GERSTING, J.L., Fundamentos Matemáticos para a Ciência da Computação, Quarta Edição, LTC, Rio de Janeiro, 2001. [HOP 01] HOPCROFT, J.E., Motwani,R., Ullman, J.D. Introduction to Automata Theory, Languages, and Computation, 2nd edition, AddisonWesley, New York, 2001. [LEW 00] LEWIS, H.R., Papadimitriou, Ch.H. Elementos de Teoria da Computação, Porto Alegre: Bookman, 2000. [LIN 06] LINZ, P., An Introduction to Formal Language and Automata, Jones & Bartlett Publishers, 2006. [LIP 97] LIPSCHUTZ, S., Lipson, M., Discrete Mathematics, Schaum’s Outlines Series, New York: McGraw-Hill, 1997. [MEN 00] MENEZES, P.F.B., Linguagens Formais e Autômatos, Porto Alegre: Instituto de Informática da UFRGS: Editora Sagra Luzzatto, 2000. [PAR 02] PARKES, A.P., Introduction to Languages, Machines, and Logic, New York: Springer Verlag, 2002 [PAU 06] PAUN, G., Rozenberg, G., Salomaa, A. DNA Computing: New Computing Paradigms, New York: Springer Verlag, 2006. 105 106 Linguagens Formais e Autômatos - Prof. Ausberto S. Castro V. [ROD 06] RODGER, S.H.,Finley, T.W. JFLAP: An Interactive Formal Languages and Automata Package, Jones & Bartlett Pub, 2006. [SAL 03] SALOMAA, A., Computation and Automata, Cambridge: Cambridge University Press, 2003. [SIP 05] SIPSER, M., Introduction to the Theory of Computation, 2 edition, Course Technology, 2005. [SIP 11] SIPSER, M., Introdução à Teoria da Computação, 2 edição, São Paulo : CENAGE Learning, 2011. [SUD 05] SUDKAMP, T.A. Languages and Machines - An introduction to the Theory of Computer Science, Reading: Addison-Wesley Longman, 2005. [WEB 07] WEBBER,A.B., Formal Language: A Practical Introduction, Beedle & Associates, Inc, 2007