Conceitos Preliminares

Documentos relacionados
Conceitos Preliminares

Teoria de Linguagens 2 o semestre de 2017 Professor: Newton José Vieira Primeira Lista de Exercícios Data de entrega: 19/9/2017 Valor: 10 pontos

Teoria de Linguagens 1 o semestre de 2018 Professor: Newton José Vieira Primeira Lista de Exercícios Data de entrega: 17/4/2018 Valor: 10 pontos

Teoria de Linguagens 2 o semestre de 2015 Professor: Newton José Vieira Primeira Lista de Exercícios Entrega: até 16:40h de 15/9.

Linguagens Formais e Problemas de Decisão

BCC244. Alfabeto, String, Linguagem, Gramática. Registro aqui o agradecimento à Profa. Lucília por ceder slides que fazem parte deste materal.

Universidade Federal de Alfenas

Fundamentos da Teoria da Computação

Linguagens Formais e Autômatos P. Blauth Menezes

Um alfabeto é um conjunto de símbolos indivisíveis de qualquer natureza. Um alfabeto é geralmente denotado pela letra grega Σ.

Fundamentos da Teoria da Computação

1 INTRODUÇÃO E CONCEITOS BÁSICOS

Linguagens Formais - Preliminares

IBM1088 Linguagens Formais e Teoria da

Prof. Dr. Marcos Castilho. Departamento de Informática/UFPR. 27 de Fevereiro de 2018

I.2 Introdução a Teoria da Computação

Teoria da Computação Aula 02 Introdução

Linguagens Formais. Aula 01 - Conceitos Básicos. Prof. Othon Batista Mestre em Informática

Introdução Definição Conceitos Básicos de Linguagem

INE5317 Linguagens Formais e Compiladores AULA 3: Introdução a Teoria da Computação

Linguagens Formais e Autômatos 02/2015. LFA Aula 02. introdução 28/09/2015. Celso Olivete Júnior.

Definições Exemplos de gramáticas

Procedimentos e Algorítmos Programas e Linguagens de Programação Tese de Church-Turing Formas de Representação de Linguagens

Conceitos Básicos. Vocabulário Cadeias Linguagens Expressões Regulares Problema X Linguagem

INE5317 Linguagens Formais e Compiladores. AULA 4: Gramáticas

INE5403 FUNDAMENTOS DE MATEMÁTICA DISCRETA

Capítulo 2: Procedimentos e algoritmos

Apostila 01 Fundamentação da Teoria da Computação e Linguagens Formais

Alfabeto, Cadeias, Operações e Linguagens

Disciplina: LINGUAGENS FORMAIS, AUTÔMATOS E COMPUTABILIDADE Prof. Jefferson Morais

Problema A Codificação Símbolos Dado um inteiro n, n é N representação de inteiros 0,1,...,b - 1 numa base b Dado um grafo G, G é conexo?

Modelos de Computação

Linguagens, Reconhecedores e Gramáticas

Conceitos básicos de Teoria da Computação

Histórico e motivação

LINGUAGENS FORMAIS E AUTÔMATOS

Linguagens Formais e Autômatos Decidibilidade

Gramática. Prof. Yandre Maldonado e Gomes da Costa. Prof. Yandre Maldonado - 1

Gramática. Gramática. Gramática

Teoria da Computação. Computabilidade e complexidade computacional

Apostila 05 Assunto: Linguagens dos tipos 0 e 1

Matemática Discreta para Ciência da Computação

ACH2043 INTRODUÇÃO À TEORIA DA COMPUTAÇÃO

Gramáticas Livres de Contexto

Gramática regular. IBM1088 Linguagens Formais e Teoria da Computação. Evandro Eduardo Seron Ruiz Universidade de São Paulo

Gramá3ca Livre de Contexto (GLC)

SCC Capítulo 1 Linguagens Regulares e Autômatos Finitos

Seja S = {2, 5, 17, 27}. Quais da sentenças a seguir são verdadeiras? 3. Quantos conjuntos diferentes são descritos abaixo? Quais são eles?

LINGUAGEM LIVRE DE CONTEXTO GRAMÁTICA LIVRE DE CONTEXTO

Linguagens Formais e Autômatos

Linguagens Formais e Autômatos

LFA Aula 09. Gramáticas e Linguagens Livres de Contexto 18/01/2016. Linguagens Formais e Autômatos. Celso Olivete Júnior.

Teoria das Linguagens. Linguagens Formais e Autómatos (Linguagens)

COMPILADORES. Revisão Linguagens formais Parte 02. Prof. Geovane Griesang

UNIVERSIDADE FEDERAL RURAL DO SEMI-ÁRIDO CURSO: CIÊNCIA DA COMPUTAÇÃO. Prof.ª Danielle Casillo

SCC Capítulo 3 Linguagens Sensíveis ao Contexto e Autômatos Limitados Linearmente

Linguagens Formais e Autômatos P. Blauth Menezes

Gramáticas e Linguagens Independentes de Contexto

Expressões Regulares. Tiago Alves de Oliveira

Linguagens Formais e Autômatos P. Blauth Menezes

Construção de Compiladores

Linguagens Livres de Contexto

Prof. Dr. Marcos Castilho. Departamento de Informática/UFPR. 22 de Fevereiro de 2018

Gramáticas Livres de Contexto Parte 1

Teoria da Computação

COMPILADORES. Revisão Linguagens formais Parte 01. Geovane Griesang

ACH2043 INTRODUÇÃO À TEORIA DA COMPUTAÇÃO

Gramáticas e Linguagens independentes de contexto

Linguagens Regulares. Prof. Daniel Oliveira

Definições Hierarquia de Chomsky Exemplos de gramáticas. Gramáticas. Objetivo de ensinar o inglês pelo computador e conseguir um tradutor de línguas

LFA. Aula 04. Sintaxe e Semântica. Conceitos Básicos Alfabeto Palavra Linguagem

Aula 8: Gramáticas Livres de Contexto

Linguagens Formais e Autômatos 02/2016. LFA Aula 01 24/10/2016. Celso Olivete Júnior.

Compiladores Aula 4. Celso Olivete Júnior.

Curso de Engenharia de Computação - UTFPR Teoria da Computação - Prof. Celso Kaestner Lista de exercícios

Marcos Castilho. DInf/UFPR. 21 de março de 2019

Marcos Castilho. DInf/UFPR. 16 de maio de 2019

LINGUAGENS FORMAIS Definições. Desenvolveram-se na História em função da necessidade dos grupos humanos que as empregavam

LINGUAGENS FORMAIS E AUTÔMATOS

Gramáticas Sensíveis ao Contexto (GSC) Linguagens Sensíveis ao Contexto (LSC) Autômatos Linearmente Limitados (ALL)

Máquinas de Turing - Computabilidade

Gramáticas ( [HMU00], Cap. 5.1)

Resolução Exe 2.12 Monolítico Recursivo

Construção de Compiladores Aula 16 - Análise Sintática

Capítulo 1: Alfabetos, cadeias, linguagens

Lista de Exercícios CT-200 Primeiro Bimestre Carlos Henrique Quartucci Forster Estagiário: Wesley Telles. Revisão de Teoria de Conjuntos

Conceitos Preliminares

1 introdução. capítulo. O que é uma solução computável? Quais são os limites do que pode ser computado? Existem problemas sem solução computacional?

Linguagens Livres do Contexto. Adaptado de H. Brandão

Modelos de Computação Folha de trabalho n. 8

Matemática Discreta - 01

Teoria Elementar dos Conjuntos

Compiladores. Análise lexical. Plano da aula. Motivação para análise lexical. Vocabulário básico. Estrutura de um compilador

O que é Linguagem Regular. Um teorema sobre linguagens regulares. Uma aplicação do Lema do Bombeamento. Exemplo de uso do lema do bombeamento

Prof. Jorge Cavalcanti

Aulas 10 e 11 / 18 e 20 de abril

Noção de Computabilidade

Teoria Elementar dos Conjuntos

Exercícios Associados à Aula 28 (27/11/2013) Feitos em sala e em equipes

Transcrição:

Capítulo 1 Conceitos Preliminares Inicialmente, na Seção 1.1, será abordado o problema fundamental relativo ao uso dos computadores, ou seja, o da representação, com o intuito de fazer transparecer a importância dos conceitos matemáticos a serem introduzidos, tanto no nível de modelagem quanto no de representação propriamente dito. O conceito de linguagem formal, a partir do qual será desenvolvido todo o material do restante do texto, será mostrado na Seção 1.2. Em seguida, será dada a noção de gramática, um dos formalismos mais utilizados para a definição de linguagens formais. Nessas duas seções, os conceitos de linguagem formal e de gramática serão vistos de modo sucinto, nas suas formas mais gerais; nos capítulos seguintes, eles serão retomados em conexão com classes específicas de linguagens. Para finalizar o capítulo, será apresentada a noção de problemas de decisão. 1.1 Representação Quando se pretende resolver um problema por computador, uma tarefa importante é representar as entidades envolvidas, sejam elas concretas ou não. A representação de umaentidade nas formasdeumprograma, deentradaparaumprogramaou desaídade um programa é, muitas vezes, constituída por sequências de símbolos. 1 Considere, por exemplo, uma aplicação referente à folha de pagamento de uma empresa. A entidade correspondente ao processo de cálculo da folha de pagamento é representada por uma sequência de símbolos em uma linguagem de programação, denominada programa; a entrada para tal programa é constituída de sequências de símbolos representando vários tipos de entidades, como o mês em questão, o ano, os nomes dos empregados, o número de horas trabalhadas para cada empregado etc.; a saída do programa é constituída por sequências de símbolos representando os empregados, o total de horas trabalhadas, a remuneração etc. No exemplo do parágrafo anterior, os símbolos utilizados nas representações das 1 Embora cada vez mais estejam sendo usados recursos gráficos bi e tridimensionais, som etc. De qualquer maneira, em algum nível, mesmo tais entidades são representadas mediante sequências de símbolos. 1

2 Editora Thomson Introdução aos fundamentos da computação Entidade Modelo Matemático Representação Mês Número inteiro no Um dos caracteres 1, 2, 3, 4, 5, intervalo [1,12] 6, 7, 8, 9, 0, A ou B Remuneração Número real positivo Número real na base 10 Presença Vetor de números, um Sequência de números reais na para cada dia do mês base 10 FP Relação Tabela em que cada linha tem o nome, cargo, salário etc. Cálculo de FP Algoritmo Programa Figura 1.1 A matemática entre a entidade e a representação. diversas entidades mencionadas são normalmente os caracteres (letras, dígitos e/ou caracteres especiais). No entanto, aqui o que pode ser considerado símbolo ficará em aberto, de forma que não se tenha, de partida, uma restrição desnecessária quando se pretenda conceber alguma linguagem para representação de alguma coisa. Assim, por exemplo, podem ser usados como símbolos sequências específicas de alguns caracteres específicos. Podem ser usados como símbolos alguns desenhos inventados especificamente para a aplicação em questão. E assim por diante. Muitas vezes, é útil considerar, entre uma entidade representada e a sequência de símbolos que a representa, a existência de um terceiro elemento: o modelo matemático correspondente à entidade representada. A Figura 1.1 mostra alguns exemplos (FP refere-se à abreviação de folha de pagamento). Veja que a representação do mês não é lá muito convencional (outubro representado por 0, novembro por A e dezembro por B). Por outro lado, as descrições de algumas representações estão um pouco vagas, não especificando precisamente (por enquanto) quais são as sequências realmente permitidas; por exemplo, não é explicitada qual é a linguagem de programação específica do programa que representa o cálculo da folha de pagamento. Na coluna representação, da Figura 1.1, o elemento fundamental é a sequência de símbolos. Ela é utilizada na representação de qualquer tipo de entidade, de maneira a propiciar a comunicação entre humanos, entre humanos e computadores e entre computadores, além do processamento computacional que a envolve. Por outro lado, as próprias sequências de símbolos podem ser estudadas matematicamente, ou seja, há um modelo matemático especialmente desenvolvido para tratar das mesmas. Em tal modelagem, em geral, os símbolos e as sequências de símbolos são consideradas como componentes do que se denomina linguagens formais. Exemplo 1 Seja o (sub)problema de representar o mês em algum tipo de aplicação. Os meses do ano, de janeiro a dezembro, são as entidades a serem representadas. Na Figura 1.1 tais entidades são modeladas como o conjunto dos números 1 a 12. Sendo um pouco mais abstratos, basta considerar como modelo um conjunto de 12 elementos; considerar tais elementos como números é absolutamente dispensável. Por outro lado, existem inúmeras representações possíveis, além daquela exibida na Figura 1.1. Por

Newton José Vieira Capítulo 1: Conceitos preliminares 3 exemplo: As palavras janeiro, fevereiro,..., dezembro. Símbolos usados: letras a, b,..., z. Numerais na base decimal. Símbolos usados: os dígitos 0 a 9. Numerais na base binária. Símbolos usados: os dígitos 0 e 1. Numerais em algarismos romanos. Símbolos usados: as letras I, V e X. Sequências de um a doze 0s. Símbolos usados: apenas o dígito 0. A linguagem formal usada para representar os meses é, assim, constituída de sequências de alguns símbolos escolhidos. Em nível matemático, uma linguagem formal será definida, na Seção 1.2, justamente como um conjunto de sequências de símbolos, sendo o conjunto dos símbolos escolhidos denominado o alfabeto da linguagem. Um exemplo importante de linguagem formal é uma linguagem de programação. Cada programa escrito em uma certa linguagem de programação é uma sequência de símbolos. No caso, pode-se convencionar que os símbolos são os caracteres que podem aparecer nos programas. Mas, alternativamente, pode-se convencionar que os símbolos são certas sequências específicas de caracteres. Por exemplo, a palavra while, presente em muitas linguagens de programação, pode ser considerada como uma sequência de 5 símbolos, se se considerar cada caractere como um símbolo, ou como um único símbolo. Cada uma dessas duas visões pode ser a mais conveniente dependendo da aplicação. De qualquer forma, considerando um programa como uma sequência de símbolos, a linguagem de programação pode ser considerada como o conjunto de tais sequências. Uma boa parte deste texto versará sobre linguagens formais. Isso será importante tanto para introduzir técnicas bem fundamentadas para a construção de algoritmos, visando amplo espectro de aplicações, quanto para caracterizar o conceito de computabilidade. Nesse último aspecto, será visto, por exemplo, que existe uma infinidade de funções que não são computáveis; em particular, serão vistos problemas com enunciados bastante simples para os quais não existe algoritmo e, portanto, não há programa em nenhuma linguagem de programação. Exemplo 2 SejaJ o conjunto dos programas em Java. Tal conjunto serávisto nestelivro como a linguagem Java. Neste caso, o problema de determinar, dada uma sequência de símbolos (no caso, caracteres) x qualquer, se ela pertence ao conjunto J, é computável. Ele é o problema da análise sintática: 2 se x J, então x é (um programa) sintaticamente correto; se x J, x é incorreto. Um exemplo de problema para o qual não existe algoritmo é o de, dado um programa qualquer em Java, determinar se ele emitirá algum sinal sonoro, isto é, dada uma sequência de símbolos x, determinar se ela pertence ao conjunto {x J x, ao ser executado, emite um sinal sonoro}. Para fazer o estudo das linguagens formais, assim como para considerar modelos alternativos para o conceito de computabilidade, são necessários alguns elementos de 2 A expressão x A denota que o elemento x pertence ao conjunto A, e x A denota que x não pertence a A. Elementos de teoria dos conjuntos serão apresentados na Seção A.2.

4 Editora Thomson Introdução aos fundamentos da computação matemática, que estão revisados no Apêndice A. Esses elementos também são úteis na etapa intermediária de modelagem ilustrada na Figura 1.1. Em tal apêndice, cada assunto é revisado de forma bastante concisa, mas suficiente para dar suporte ao aprendizado do que vem a seguir. Na próxima seção, o conceito de linguagem formal introduzido anteriormente será um pouco mais elaborado, de forma a dar suporte ao conteúdo dos capítulos restantes. Exercícios 1. Encontre uma maneira de representar, por meio de uma sequência dos símbolos x e o: a) qualquer número inteiro positivo; b) qualquer vetor de números inteiros positivos; c) qualquer matriz de números inteiros positivos. 2. Uma versão do problema da parada, problema este a ser abordado no Capítulo 5, é: dado um programa (sem entrada), determinar se ele para. Lá no Capítulo 5, será visto que não existe algoritmo que, recebendo como entrada um (texto de) programa qualquer em Java (ou em outra linguagem de programação), determine se ele para ou não. Em outras palavras, o problema da parada não é computável. Sabendo disto, argumente que o problema enunciado no Exemplo 2, dado um programa qualquer em Java, determinar se ele emitirá algum sinal sonoro, também não é computável. 1.2 Linguagens Formais Uma linguagem formal, ao contrário de uma linguagem natural, é tal que: a) tem uma sintaxe bem definida, de forma que, dada uma sentença, seja sempre possível saber se ela pertence ou não à linguagem; e b) tem uma semântica precisa, de modo que não contenha sentenças sem significado ou ambíguas. As linguagens formais são úteis, não só na matemática, mas também nas áreas que utilizam a matemática como ferramenta, como as engenharias, a física, a química e a computação. No caso da computação, as linguagens formais têm uma importância ímpar, pois a maioria dos profissionais da área lida diretamente com uma ou mais no dia-a-dia. Exemplos de linguagens formais, ou concretizações diretas das mesmas, são as linguagens Java, C, Pascal, HTML etc. Em princípio, se um programador ou analista projeta um programa ou sistema que envolve um diálogo com o usuário, ele tem o problema de projetar a linguagem (formal) de comunicação. Desde o nível de instruções de máquina até os níveis mais altos da programação de um computador, as linguagens formais são uma presença constante.

Newton José Vieira Capítulo 1: Conceitos preliminares 5 Nesta seção, será vista uma definição de linguagem formal bastante geral, sem tocar na parte de semântica. À primeira vista isso pode parecer uma limitação, mas o fato é que uma abordagem puramente sintática é suficiente para a caracterização do conceito de computabilidade, um dos objetivos deste texto, assim como para servir de base para ampla gama de aplicações, como ficará claro no decorrer do livro. Além disso, a especificação e o processamento da sintaxe de linguagens formais já envolve um material bastante extenso, que pode anteceder um estudo posterior de semântica. No entanto, muitas vezes consegue-se uma estrutura sintática rica o suficiente para capturar todos os aspectos relevantes da linguagem, não havendo a necessidade de considerar uma semântica à parte. Toda linguagem 3 tem um alfabeto associado. Um alfabeto é um conjunto finito não vazio de elementos que serão referidos como símbolos. Uma palavra 4 sobre um alfabeto Σ é uma sequência finita de símbolos de Σ. 5 O tamanho de uma palavra x, x, é o número de símbolos que a compõem. Em particular, existe a palavra vazia, constituída de zero símbolos; tal palavra será designada por λ. Assim, λ = 0. Exemplo 3 Dois exemplos de alfabetos particularmente importantes são: Σ = {1} e Γ = {0,1}. São palavras sobre Γ: λ, 0, 1, 00, 01, 10, 11, 000 etc. Com esse alfabeto, pode-se representar qualquer número. Uma possibilidade é utilizar a codificação na base 2: 0 é representado por uma infinidade de palavras: 0, 00 etc.; 1 é representado por uma infinidade de palavras: 1, 01 etc.; apenas λ não representa nenhum número. São palavras sobre Σ: λ, 1, 11, 111 etc. Observe que, com esse alfabeto, também se consegue representar qualquer número natural! Por exemplo, basta representar o número n por uma palavra de tamanho n. Nesse caso, cada palavra x representaria o número x. Comparando a representação do parágrafo anterior com a deste, note que a menor palavra x usada para representar um número n na base 2 tem tamanho log 2 n +1, e a palavra y usada para representar o mesmo número n na base 1 possui tamanho n. Dessa forma, nessa segunda representação a palavra usada é exponencialmente maior. Seja a um símbolo qualquer. A notação a n, em que n N, será utilizada para designar a palavra constituída de n as em sequência. Assim, por exemplo, dado o alfabeto {0,1}, são exemplos de palavras sobre tal alfabeto: 1 0 = λ, 0 4 = 0000, 1 3 01 2 = 111011 etc. Umalinguagem sobreumalfabeto Σéumconjuntodepalavras sobreσ. Denotando o conjunto de todas as palavras sobre Σ por Σ, diz-se, então, que uma linguagem sobre Σ é qualquer subconjunto de Σ. 3 Daqui para a frente, quando se disser linguagem, quer-se dizer linguagem formal, a menos que se diga o contrário. 4 Em inglês, são utilizados os termos string ou word. 5 Formalmente, uma sequência é uma função f : {1,2,3,...,n} Σ. Ela é representada normalmente por f(1)f(2)f(3) f(n). Por exemplo, a sequência f : {1,2,3} {0,1} tal que f(1) = 1, f(2) = 0 e f(3) = 1 é representada por 101.

6 Editora Thomson Introdução aos fundamentos da computação Exemplo 4 Seja o alfabeto Σ = {0,1}. O conjunto de todas as palavras sobre Σ é Σ = {λ,0,1,00,01,10,11,000,...}. São exemplos de linguagens sobre Σ:. é a linguagem mais simples que existe; não contém palavras; {λ}. Contém uma única palavra: a palavra vazia; {0}. Contém uma única palavra: 0; {λ,0}. Contém duas palavras: λ e 0; {w Σ 1 w 5}. Contém 5 i=1 2i palavras; {0 n n é um número primo}. Esta linguagem é infinita, já que existe uma infinidade de números primos; {0 n 1 n n N}. Linguagem constituída de toda palavra de tamanho par cuja primeira metade só contém 0s e cuja segunda metade só 1s; Σ. Contém todas as palavras sobre o alfabeto Σ. Assim como as três últimas linguagens do Exemplo 4, a maioria das linguagens de interesse é infinita. Como fazer para especificar tais linguagens, se não dá para listar explicitamente todas as suas palavras? Na verdade, como será visto oportunamente, existem muitas opções para isso, cada uma delas possuindo contextos em que é mais apropriada. Como uma linguagem é um conjunto, pode-se lançar mão das operações sobre conjuntos, definidas na Seção A.2. Assim, por exemplo, se L 1 e L 2 são linguagens sobre alfabetos Σ 1 e Σ 2, respectivamente, também são linguagens: L 1 L 2, uma linguagem sobre Σ 1 Σ 2 ; L 1 L 2, uma linguagem sobre Σ 1 Σ 2 ; L 1 L 2, uma linguagem sobre Σ 1. L 1 = Σ 1 L 1, uma linguagem sobre Σ 1. Note que, por definição, o complemento de uma linguagem é constituído das palavras no alfabeto da própria linguagem, excetuadas as palavras da mesma. Além dessas, levandose em consideração que os elementos que constituem as linguagens são as palavras, existem outras operações, tanto sobre palavras quanto sobre linguagens, que podem auxiliar na especificação de uma linguagem. Veja ainda que: P(L 1 ) é um conjunto de linguagens sobre Σ 1 ; P(Σ 1 ) é o conjunto de todas as linguagens sobre Σ 1. A concatenação de duas palavras x = a 1 a 2...a m e y = b 1 b 2...b n é a palavra xy = a 1 a 2...a m b 1 b 2...b n. Em particular, note que λw = wλ = w para qualquer palavra w. Tal definição implica que a concatenação é uma operação associativa: x(yz) = (xy)z para quaisquer palavras x, y e z. Desse modo, uma sequência de concatenações poderá ser escrita sem parênteses. E para expressar a concatenação de uma palavra w com ela mesma n 1 vezes, pode-se escrever w n ; em particular, define-se que w 0 = λ para qualquer palavra w.

Newton José Vieira Capítulo 1: Conceitos preliminares 7 Exemplo 5 Sejam x = aab e y = cc. Então yx = ccaab, x 2 = xx = aabaab, xy 2 = aab(cc) 2 = aabcccc, axbbyc = aaabbbccc = a 3 b 3 c 3, λ(aa) 3 λλy 3 λ = a 6 c 6. Uma palavra x é dita ser um prefixo de uma palavra w se w = xy para alguma palavra y; é dita ser um sufixo de w se w = yx para alguma palavra y; e é dita ser uma subpalavra de w se w = yxz para algum par de palavras y e z. As três partes, x, y e z, podem ser λ ou não. Observe que, em particular, λ e w são prefixos, sufixos e subpalavras de qualquer palavra w, e também que prefixos e sufixos são subpalavras. Exemplo 6 Considere a palavra abc. Seus prefixos são: λ, a, ab e abc. Seus sufixos: λ, c, bc eabc. As subpalavras deabcsão: λ, a, b, c, ab, bceabc. Apenas a subpalavra b não é prefixo nem sufixo de abc. O reverso de uma palavra w = a 1 a 2...a n, w R, é a sequência dos símbolos de w na ordem reversa, isto é, w R = a n a n 1...a 1. Uma palavra w tal que w = w R é um palíndromo. Veja que todo palídromo de tamanho par é da forma xx R, e que os palíndromos de tamanho ímpar são da forma xax R, em que a é um símbolo do alfabeto em questão. Exemplo 7 Alguns reversos de palavras: λ R = λ; a R = a; (c 5 ) R = c 5, (abcaabb) R = bbaacba. Alguns palíndromos: λ, a, bb, ccc, aba, baab, abcacba. A concatenação de duas linguagens L 1 el 2 é dada por: L 1 L 2 = {xy x L 1 e y L 2 }. Em particular, L = L = e {λ}l = L{λ} = L, para qualquer linguagem L. Exemplo 8 Sejam as linguagens L 1 = {w {0,1} w = 5} e a linguagem L 2 = {0y y {0,1} }. Então: L 1 L 1 = {w {0,1} w = 10}; L 1 L 2 = {w {0,1} o sexto símbolo de w é 0}; L 2 L 1 = {w {0,1} w começa com 0 e w 6}; L 2 L 2 = {0y y {0,1} e y contém no mínimo um 0}. SejaLumalinguagem. AnotaçãoL n seráutilizadaparadesignarll...l(n vezes). Recursivamente: a) L 0 = {λ}; b) L n = L n 1 L para n 1. L 0 = {λ} porque, segundo o item b desta definição, tem-se que (para n = 1) L 1 = L 0 L, e para que L 1 seja igual a L é preciso que L 0 seja {λ}. Exemplo 9 {0,1} 2 = {00,01,10,11}. Generalizando, {0,1} n = {w {0,1} w = n}paraqualquern 0. {λ,0,1} 2 = {λ,0,1,00,01,10,11}. Generalizando, {λ,0,1} n = {w {0,1} w n} para qualquer n 0. {0,01} 2 = {00,001,010,0101}.

8 Editora Thomson Introdução aos fundamentos da computação A operação fecho de Kleene de uma linguagem L, L, pode ser definida recursivamente assim: a) λ L ; b) se x L e y L, então xy L. A partir desta e da definição de concatenação de linguagens, pode-se verificar que: L = n NL n. Ou seja, L = L 0 L 1 L 2 = {λ} L LL. Define-se também o fecho positivo de Kleene de L: L + = LL. Pode-se verificar que: L + = n N {0} Segue diretamente dessas definições que L = L + {λ}. Pode-se mostrar também que L + = LL = L L. Exemplo 10 A seguir, são apresentadas algumas linguagens e seus fechos de Kleene: = {λ}, e + = ; {λ} = {λ} + = {λ}; {0} = {0 n n N} e {0} + = {0 n n 1}; L n. {λ,00,11} = {λ,00,11} + = {λ} {00,11} +. Com as operações definidas nesta seção, pode-se expressar (ou definir) de forma precisa algumas linguagens, como exemplificado a seguir. Exemplo 11 Seguem descrições informais, em português, para algumas linguagens sobre {0, 1}, bem como descrições mais formais utilizando as operações definidas nesta seção: a) o conjunto das palavras que começam com 0: {0}{0,1} ; b) o conjunto das palavras que contêm 00 ou 11: {0,1} {00,11}{0,1} ; c) o conjunto das palavras que terminam com 0 seguido de um número ímpar de 1s consecutivos: {0,1} {01}{11} ; d) oconjuntodaspalavras quecomeçam outerminamcom0: {0}{0,1} {0,1} {0}; e) o conjunto das palavras de tamanho par que começam ou terminam com 0: ({0,1}{0,1}) [{0}{0,1} {0,1} {0}]; f) o conjunto do item (e): [{0}{0,1}({0,1}{0,1}) ] [{0,1}({0,1}{0,1}) {0}];

Newton José Vieira Capítulo 1: Conceitos preliminares 9 g) o conjunto das palavras com um prefixo de um ou mais 0s seguido(imediatamente) de um sufixo de 1s de mesmo tamanho: {0 n 1 n n 1}; h) o conjunto das palavras formadas por concatenações de palavras da forma 0 n 1 n para n 1: k 1 {0 n 1 n n 1} k. Um aspecto muito importante é que as seis primeiras linguagens do exemplo anterior são linguagens definidas a partir de conjuntos finitos de palavras usando apenas as operações sobre conjuntos e as de concatenação e fecho de Kleene. O tratamento computacional de uma linguagem (verificar se uma palavra pertence ou não à mesma) que possa ser descrita dessa forma pode ser feito de forma extremamente eficiente. O Capítulo 2 irá tratar justamente desse tipo de linguagem e do respectivo tratamento computacional. Já as duas últimas linguagens do exemplo não podem ser descritas por meio daquelas operações a partir de conjuntos finitos, e seu tratamento computacional não pode ser feito de forma tão eficiente. Elas serão consideradas em capítulos posteriores. Como uma linguagem sobre um alfabeto Σ é sempre um conjunto contável, pois é um subconjunto de Σ, que é enumerável, existe a possibilidade de fazer uma definição recursiva, da forma mostrada na Seção A.6. Mas a verdade é que, na prática, as linguagens raramente são definidas dessa forma. Existe um formalismo, que permite o uso de recursão, porém foi especialmente projetado para a definição de linguagens: a gramática. Na próxima seção será apresentada uma breve introdução às gramáticas. Em capítulos posteriores, elas serão mais bem estudadas e exploradas pouco a pouco. Exercícios 1. Qual é o númerodeprefixos, sufixosesubpalavras deumapalavra de tamanho n? 2. Seja Σ = {0,1,#}. Sejam k e n números naturais tais que k n. a) Quantas palavras há na linguagem Σ k? b) Quantas palavras há na linguagem (Σ {λ}) k? c) Quantas palavras de n símbolos contêm exatamente k ocorrências de #? d) Quantas palavras de n símbolos contêm no máximo k ocorrências de #? 3. Seja Σ um alfabeto. Prove que se x,y,w Σ e xw = yw, então x = y. 4. Sejam A = {00,11}, B = {01,10} e C = {λ,1}. Calcule: a) AA; b) AC; c) CC; d) (AB)C; e) A(BC); f) A(B C);

10 Editora Thomson Introdução aos fundamentos da computação g) AB AC. 5. Sejam Σ = {0,1}, A = Σ {0} e B = {1}Σ. Descreva, em português, as linguagens a seguir. Não é necessário dizer que as palavras são de 0s e 1s. Por exemplo, A é o conjunto das palavras que terminam com 0. a) A B; b) A B; c) A B; d) B A; e) A; f) AB; g) BA. 6. Seja L = {λ,0,1}. a) Que linguagem é L 0? b) Que linguagem é L 2? c) Que linguagem é L n para n 0? d) Quantas palavras tem L n para n 0? 7. Sejam A = {0} e B = {1}. Determine A n B, AB n e (AB) n. 8. Sejam A = {λ,a} e B = {a,b}. Determine A n B, AB n e A n B n. Quantos elementos tem cada um desses conjuntos? 9. Encontre linguagens A, B e C tais que A(B C) AB BC. 10. Que linguagens são subconjuntos de quais outras? a) {a} ; b) {a} {b} ; c) {a} {b} ; d) {a,b} ; e) ({a} {b} ). 11. Sejam A = {a} e B = {bb}. Quantas palavras de n símbolos, para cada n 0, há em: a) A B? b) AB? c) A B? 12. Descreva mais formalmente as seguintes linguagens sobre o alfabeto {0, 1}: a) o conjunto das palavras com, no mínimo, um 0; b) o conjunto das palavras com, no máximo, um 0;

Newton José Vieira Capítulo 1: Conceitos preliminares 11 c) o conjunto das palavras de tamanho ímpar; d) o conjunto das palavras com um prefixo de um ou mais 0s seguido (imediatamente) de um sufixo de zero ou mais 1s; e) o conjunto dos palíndromos que não tenham símbolos consecutivos idênticos; f) o conjunto das palavras de tamanho par cuja primeira metade é idêntica à segunda. Procure ser bem preciso e conciso. 13. Sejam Σ = {0,1}, A = Σ 5 e B = {0}Σ. Para cada uma das linguagens a seguir, dê uma propriedade necessária e suficiente para que uma palavra pertença à mesma. Não é preciso dizer que a palavra contém apenas os símbolos 0 e 1. a) A ; b) B + ; c) A B; d) AB; e) A B. 14. Descreva, em português, as seguintes linguagens sobre o alfabeto {0, 1}: a) {0,1} {1}{0,1}; b) {0}{0,1} {0,1} {1}; c) {0,1} {01}{11}; d) {01,1}. e) {1,λ}({0}{0} {1}) {0} ; f) {0} {1}({0} {1}{0} {1}). 15. Seja Σ o conjunto de todas as 26 letras do alfabeto e C o conjunto das 21 consoantes. Seja D o conjunto de todas as palavras de um dicionário da lingua portuguesa, e, para cada letra l Σ, seja P l = {w D w contém a letra l}. A partir de tais conjuntos, usando operações sobre conjuntos, concatenações e fechos de Kleene, descreva o conjunto das palavras: a) que contêm pelo menos uma das letras A, B ou C; b) que contêm as letras A e B, mas não C; c) que não contêm A nem B; d) que começam com a letra A; e) que começam com a letra A e contêm pelo menos uma consoante; f) que contêm a subpalavra RR. 16. Expresse as linguagens a seguir utilizando as operações sobre conjuntos finitos de palavras de {0,1}. Considere o alfabeto como sendo {0,1}. a) o conjunto das palavras de 10 símbolos; b) o conjunto das palavras que têm de 1 a 200 símbolos;

12 Editora Thomson Introdução aos fundamentos da computação c) o conjunto das palavras que começam e terminam com o mesmo símbolo; d) o conjunto das palavras que contêm pelo menos um 0 e um 1; e) o conjunto das palavras que começam com 0 e contêm 00; f) o conjunto das palavras que não têm 00 como prefixo, mas têm 00 como sufixo; g) o conjunto das palavras que começam com 00 ou 11 e terminam com 01 ou 10; h) o conjunto das palavras em que todo 0 é seguido de dois 1s consecutivos; exemplos: λ, 1, 1011111, 11011101111; i) {01 n 0 n é ímpar}; j) o conjunto das palavras de {0} {1} de tamanho par; k) o conjunto das palavras com número par de 0s ou ímpar de 1s (ou ambos); l) o conjunto das palavras que contêm um ou dois 1s, cujo tamanho é múltiplo de 3; m) o conjunto das palavras com número par de 0s e ímpar de 1s. 17. Sejam A, B e C linguagens sobre um alfabeto Σ. Mostre que: a) A(B C) = (AB) (AC); b) nem sempre A(B C) = (AB) (AC). 18. Mostre que, se λ L, então L + = L e, se λ L, então L + = L {λ}. 19. Quando L é finita? 20. Prove que (w R ) n = (w n ) R para toda palavra w e todo n N. 21. Prove que não existe x {0,1} tal que 0x = x1. 22. Sejam L 1 e L 2 linguagens sobre um alfabeto Σ tais que L 1 L 2. Prove que L 1 L 2. 23. Apresente um exemplo em que L 1 L 2 = (L 1 L 2 ), mas L 1 L 2 e L 2 L 1. 24. Mostre que os conjuntos a seguir são enumeráveis: a) {0} ; b) {0} {1}. 25. Seja a seguinte definição recursiva da linguagem L sobre o alfabeto {0, 1}: a) λ L; b) se x L, então 0x L e x1 L; c) nada mais pertence a L. Que linguagem é L? 26. Seja a linguagem X, de alfabeto {a, b}, definida assim:

Newton José Vieira Capítulo 1: Conceitos preliminares 13 a) λ X; b) se x X então ax X e axbx X; c) x X somente se pode ser obtido como especificado em (a) e (b). Sejamn a (x) en b (x) onumerodeasedebs, respectivamente, napalavra x. Prove, por indução, que n a (x) n b (x). 27. Dê definições recursivas para as seguintes linguagens: a) {0 n 1 n n N}; b) {w {0,1} w contém 00}; c) {w {0,1} w é palíndromo}; d) {xx x {0,1} }; e) {0 0 10 1 10 2 1...0 n 1 n N}. 1.3 Gramáticas As gramáticas são um formalismo originalmente projetado para a definição de linguagens. Nesta seção, será apenas definido o conceito de gramática e apresentados alguns poucos exemplos. Nos próximos capítulos, o estudo de gramáticas, associado a classes específicas de linguagens, será retomado e serão apresentados muitos outros exemplos. Antes de dar uma definição precisa de gramática, serão apresentados os conceitos envolvidos de maneira informal. Como foi dito na Seção A.6, uma definição recursiva provê um meio de construir (ou gerar) os elementos de um conjunto (enumerável). Similarmente, uma gramática mostra como gerar as palavras de uma linguagem. O elemento fundamental das gramáticas é a regra. 6 Uma regra é um par ordenado (u,v), tradicionalmente escrito na forma u v, em que u e v são palavras que podem conter símbolos de dois alfabetos disjuntos, um com símbolos denominados variáveis, ou não terminais, e outro com símbolos chamados terminais. As variáveis são símbolos auxiliares para a geração das palavras da linguagem, enquanto o conjunto de terminais nada mais é que o alfabeto da linguagem definida. Nos exemplos a seguir, serão usadas letras maiúsculas para as variáveis e minúsculas para os terminais. Segue um exemplo de regra: aab baa Essa regra especifica que: dada uma palavra que contenha a subpalavra aab, tal subpalavra pode ser substituída por baa. Assim, a partir da palavra aabbaab, aplicando-se a regra mencionada, pode-se obter, diz-se derivar: baabaab, substituindo a primeira ocorrência de aab; ou aabbbaa, substituindo a segunda ocorrência de aab. A relação de derivação é denotada por. Por exemplo, a cadeia de derivações 6 Também chamada regra de produção, ou produção, simplesmente.

14 Editora Thomson Introdução aos fundamentos da computação aabbaab baabaab (aplicando-se a regra aab baa) bbaaaab (aplicando-se a regra aab baa) bbaabaa (aplicando-se a regra aab baa) mostra uma derivação de bbaabaa a partir de aabbaab. Uma gramática consta de um conjunto de regras e da indicação de uma variável especial denominada variável de partida. Qualquer derivação deve começar com a palavra constituída apenas pela variável de partida. As palavras de variáveis e/ou terminais geradas a partir da variável de partida são chamadas formas sentenciais da gramática. Assim, uma regra pode ser aplicada a uma forma sentencial para gerar uma outra forma sentencial. Uma forma sentencial sem variáveis é conhecida como sentença. A linguagem definida pela gramática, também dita gerada pela gramática, é o conjunto de sentenças geradas pela gramática. Para uma gramática G, a linguagem gerada por ela é denotada por L(G). A seguir, os conceitos introduzidos anteriormente são exemplificados. Exemplo 12 Agora define-se uma gramática G que tem duas variáveis, P e X, sendo P a variável de partida, e dois terminais, 0 e 1. Suas regras são: 1. P 0P 2. P 1X 3. X 1X 4. X λ Toda derivação deve começar com a forma sentencial constituída pela variável de partida P. Um exemplo de derivação é: P 0P (regra 1) 01X (regra 2) 01 (regra 4) Como01 é umasentença, tal palavra pertenceal(g). Um outro exemplo dederivação: P 0P (regra 1) 00P (regra 1) 001X (regra 2) 0011X (regra 3) 0011 (regra 4) Logo, 0011 L(G). Pode-se notar que qualquer derivação de sentença, ou seja, forma sentencial sem variáveis, envolve: aplicar n 0 vezes a regra 1, produzindo uma forma sentencial da forma 0 n P; em seguida,

Newton José Vieira Capítulo 1: Conceitos preliminares 15 aplicar uma única vez a regra 2, produzindo 0 n 1X; depois, aplicar k 0 vezes a regra 3, produzindo 0 n 11 k X; e, finalmente, aplicar uma única vez a regra 4, produzindo 0 n 11 k. Logo, a linguagem gerada por G é L(G) = {0} {1} +. Agora, define-se formalmente o que é gramática. Uma gramática é uma quádrupla (V,Σ,R,P), em que: a) V é um conjunto finito de elementos denominados variáveis; b) Σ é um alfabeto; V Σ = ; c) R (V Σ) + (V Σ) é um conjunto finito de pares ordenados chamados regras; e d) P V é uma variável conhecida como variável de partida. Observequeoladoesquerdodeumaregranãopodeserλ. Opróximoexemploapresenta uma gramática mais elaborada. Exemplo 13 Seja a gramática H = ({P,B},{a,b,c},R,P) em que R é constituído das regras: 1. P apbc 2. P abc 3. cb Bc 4. bb bb Toda derivação de H deve começar com a forma sentencial constituída pela variável de partida P. Um exemplo de derivação de sentença: P abc (regra 2) Logo, abc L(H). Outro exemplo de derivação: P apbc (regra 1) aap BcBc (regra 1) aaabcbcbc (regra 2) aaabbccbc (regra 3) aaabbccbc (regra 4) aaabbcbcc (regra 3) aaabbbccc (regra 3) aaabbbccc (regra 4) Logo, a 3 b 3 c 3 L(H). Na verdade, pode-se mostrar que L(H) = {a n b n c n n 1}.

16 Editora Thomson Introdução aos fundamentos da computação Émuitocomum umagramática ter duasou maisregras com omesmoladoesquerdo. Por exemplo, a gramática do Exemplo 12 tem as regras 1 e 2 com o mesmo lado esquerdo, assim como as regras 3 e 4. Nesse caso, pode-se abreviar colocando-se apenas um lado esquerdo e os lados direitos das várias regras separados por. Desta forma, as regras do Exemplo 12 seriam substituídas por: P 0P 1X X 1X λ De forma análoga, as regras 1 e 2 da gramática do Exemplo 13 podem ser substituídas por: P apbc abc Seja uma gramática G = (V,Σ,R,P). Diz-se que x y em G, em que x,y (V Σ), se há uma regra u v R tal que u ocorre em x e y é o resultado de substituir uma ocorrência de u em x por v. A relação n é definida recursivamente assim, utilizando-se : a) x 0 x para todo x (V Σ) ; b) se w n xuy e u v R, então w n+1 xvy para todo w,x,y (V Σ), n 0. Quando x n y, diz-se que de x deriva-se y em n passos, ou então que há uma derivação de tamanho n de y a partir de x. Diz-se ainda que de x deriva-se y em zero ou mais passos, x y, se existe n 0 tal que x n y. 7 E de x deriva-se y em um ou mais passos, x + y, se existe n 1 tal que x n y. 8 Com isso, pode-se definir o que é a linguagem gerada pela gramática G: L(G) = {w Σ P w}. Exemplo 14 Seja a gramática I = ({X,B},{a,b},R,X), em que R consta das regras: 1 e 2. P apb Bb 3 e 4. B Bb λ O seguinte esquema de derivação mostra como toda palavra da forma a n b n+1+k, para n 0 e k 0 podem ser geradas : P n a n Pb n (regra 1 n vezes, n 0) a n Bb n+1 (regra 2) k a n Bb n+1+k (regra 3 k vezes, k 0) a n b n+1+k (regra 4) 7 Usando a terminologia da Seção A.3, x y é o fecho transitivo e reflexivo da relação. 8 x + y é o fecho transitivo da relação.

Newton José Vieira Capítulo 1: Conceitos preliminares 17 Logo, pode-sederivar qualquer palavra a n b n+1+k, para n,k 0, em n+k+2 passos, ou seja, qualquer palavra a n b m tal que n < m, ou ainda, observando-se que m = n+1+k, então P m+1 = a n b m. E como não é possível gerar outras palavras, conclui-se que L(I) = {a n b m n < m}. No exemplo anterior foi introduzido o conceito de esquema de derivação. No exemplo, qualquer sentença que possa ser gerada obedece ao esquema, no sentido de que uma derivação da sentença pode ser obtida introduzindo-se valores específicos para as variáveis que aparecem no esquema. Por exemplo, uma derivação da sentença aabbbb seria obtida instanciando-se n com 2 e k com 1: P 2 a 2 Pb 2 (regra 1 duas vezes) a 2 Bb 3 (regra 2) 1 a 2 Bb 4 (regra 3 uma vez) a 2 b 4 (regra 4) Em geral, um esquema de derivação para uma gramática G mostra apenas como um conjunto A (das sentenças geradas segundo o esquema) está contido na linguagem gerada por G, ou seja, A L(G). Diferentes esquemas podem ser usados para mostrar que outros subconjuntos de L(G) são deriváveis. Por outro lado, deve-se provar também que as únicas palavras geradas por G são as deriváveis pelo(s) esquema(s) apresentado(s). No caso particular do Exemplo 14, como não existem outros esquemas para quaisquer sentenças deriváveis na gramática, pode-se dizer que o esquema lá apresentado mostra como derivar todas as palavras de L(G). Exemplo 15 Seja a gramática H do Exemplo 13. As duas derivações demonstram que P 1 abc e P 8 a 3 b 3 c 3. É fácil mostrar que todas as palavras da forma a n b n c n, para n 1, são geradas por H. Para isso, basta notar que tais palavras podem ser geradas por derivações da forma: P k a k P(Bc) k (regra 1 k vezes, k 0) a k+1 bc(bc) k (regra 2) 1 a k+1 bbcc(bc) k 1 (regra 3 uma vez) 2 a k+1 bbbccc(bc) k 2 (regra 3 duas vezes). k a k+1 bb k c k+1 k a k+1 b k+1 c k+1 (regra 3 k vezes) (regra 4 k vezes) Isso mostra que se pode derivar palavras da forma a k+1 b k+1 c k+1, para k 0, em k+1+(1+2+ +k)+k = (2k+1)+k(k+1)/2 = k(k+5)/2+1 passos. Tem-se, então, que: P (n 1)(n+4)/2+1 = a n b n c n para n 1. Logo, conclui-se que {a n b n c n n 1} L(H).

18 Editora Thomson Introdução aos fundamentos da computação Para a gramática H do Exemplo 13, analisando-se as alternativas possíveis ao esquema de derivação apresentado no Exemplo 15, pode-se notar que, qualquer que seja a ordem de aplicação das regras 3 e 4, não se consegue gerar outras sentenças que não sejam as da forma a n b n c n para n 1. Logo, L(H) = {a n b n c n n 1} A mesma linguagem pode ser gerada por inúmeras gramáticas. Duas gramáticas G e G são ditas equivalentes quando L(G) = L(G ). O problema de modificar uma gramática de forma que ela atenda a certos requisitos, mas sem alterar a linguagem gerada pela mesma, é importante em determinados contextos, por exemplo, na construção de analisadores sintáticos de linguagens. Algumas técnicas de manipulação de gramáticas serão abordadas na Seção 3.4.3. Na gramática a seguir, assim como nas dos Exemplos 12 e 14, as regras têm a característica de que os seus lados esquerdos contêm apenas e tão-somente uma variável. Esse tipo de gramática, muito importante em termos práticos, será estudado na Seção 3.4. Exemplo 16 Seja a gramática G = (V,Σ,R,E), em que: V = {E,T,N,D}; Σ = {+,,(,),0,1,2,3,4,5,6,7,8,9}; R contém as regras: E E +T E T T T (E) N N DN D D 0 1 2 3 4 5 6 7 8 9 A gramática G gera expressões aritméticas contendo números naturais na base decimal, operadores de soma e subtração e parênteses. Por meio das três regras com E do lado esquerdo, pode-se gerar uma sequência de somas e/ou subtrações de T s (termos); por exemplo: E E +T (regra E E +T) E T +T (regra E E T) E T T +T (regra E E T) T T T +T (regra E T) Observe como as regras são recursivas à esquerda, levando à produção de uma sequência da direita para a esquerda. Entretanto, as regras responsáveis pela produção dos números das expressões são recursivas à direita, redundando na produção de números da esquerda para a direita. Por exemplo, para gerar um número de quatro dígitos, pode-se derivar: N DN (regra N DN) DDN (regra N DN) DDDN (regra N DN) DDDD (regra N D)

Newton José Vieira Capítulo 1: Conceitos preliminares 19 e, em seguida, derivar os quatro dígitos usando-se as regras com D do lado esquerdo. Observe também que a geração de parênteses se dá por recursão (no caso, indireta), a qual não pode ser classificada como recursão à esquerda nem à direita. Por exemplo, na derivação: E E +T (regra E E +T) T +T (regra E T) (E)+T (regra T (E)) a variável E aparece (recursivamente) na forma sentencial entre ( e ). Exercícios 1. Seja a gramática ({A,B},{0,1},R,A), em que R tem as três regras: A BB B 0B1 λ Dê todas as derivações das seguintes palavras: a) λ; b) 01; c) 0101; d) 0011. Que linguagem é gerada? 2. Seja a gramática G = ({A,B},{a,b},R,A) em que R é constituído pelas quatro regras: A aa B B bb λ Apresente um esquema de derivação que mostre como derivar qualquer palavra de L(G). Expresse o que é L(G) de forma bem concisa utilizando a notação introduzida na Seção 1.2. 3. Seja a gramática H = ({P,A,B},{a,b},R,P) em que R tem as regras: P AB A aa λ B bb λ Mostre que H gera a linguagem do Exercício anterior. 4. Construa gramáticas para as seguintes linguagens:

20 Editora Thomson Introdução aos fundamentos da computação a) {0}{0,1} {11}; b) {λ,0}{11} {λ,0}; c) {w {a,b} o número de as em w é par}; d) {a n b n n N}; e) {w {a,b} w = w R }; f) {w {a,b} w = w R e w não contém símbolos consecutivos idênticos}; g) {a n b n c n d n n N}. 5. Para as gramáticas dos itens (d) e (e) do exercício anterior, determine o número de passos necessário para gerar uma palavra de tamanho n. 6. Considere as gramáticas desenvolvidas no Exercício 4. A partir delas, construa gramáticas que gerem: a) A concatenação das linguagens dos itens (c) e (d); b) A união das linguagens dos itens (d) e (e); c) O fecho de Kleene da linguagem do item (f). 7. Diga que linguagens são geradas pelas gramáticas: a) G 1 = ({A},{0,1},R 1,A), sendo R 1 constituído de: A 0A A0 1 b) G 2 = ({B},{0,1},R 2,B), sendo R 2 constituído de: B 0B00 1 c) G 3 = ({S,A,B},{0,1},R 3,S), sendo R 3 constituído de: S AA B A 0A A0 1 B 0B00 1 8. Identifique as linguagens geradas pelas gramáticas: a) G 1 = ({P,X},{a,b},R 1,P). R 1 : P ax bp λ X ap b) G 2 = ({P,A},{a,b},R 2,P). R 2 : P apa A A ba b c) G 3 = ({A,B},{0,1},R 3,A). R 3 : A 0A B B B1 01 d) G 4 = ({P,X},{a,b},R 4,P). R 4 : P ap Xb λ

Newton José Vieira Capítulo 1: Conceitos preliminares 21 X ap e) G 5 = ({P,X},{a,b},R 5,P). R 5 : P aap Xb λ X ap f) G 6 = ({A,B},{0,1},R 6,A). R 6 : A 0A0 B1 B 1B1 λ g) G 7 = ({P},{0,1},R 7,P). R 7 : P 0P1 1P0 λ h) G 8 = ({A,X},{0,1},R 8,A). R 8 : A XA X X 0X1 λ i) G 9 = ({X,B},{a,b,c},R 9,X). R 9 : X abx abc Ba ab Bb bb Bc bcc j) G 10 = ({X,A,#},{a,b},R 10,X). R 10 : X aax # Aa aa Ab ba A# b#a # λ 1.4 Problemas de Decisão Ao longo deste texto serão tratados vários problemas cujas respostas são do tipo sim ou não. Nesta seção, é apresentada uma introdução genérica e informal a esse tipo de problema. Um problema de decisão (PD) é uma questão que faz referência a um conjunto finito de parâmetros e que, para valores específicos dos parâmetros, tem como resposta sim ou não. Seguem alguns exemplos. Exemplo 17 São exemplos de problemas de decisão: a) determinar se o número 123654789017 é um número primo; b) determinar se um número natural n é um número primo; c) determinar se existe um ciclo em um grafo G; d) determinar se uma palavra w é gerada por uma gramática G.

22 Editora Thomson Introdução aos fundamentos da computação O primeiro PD não tem parâmetros, o segundo e o terceiro possuem um parâmetro cada um, um número natural n e um grafo G, e o quarto tem dois parâmetros, uma palavra w e uma gramática G. A questão referente a um PD pode ser vista como representando um conjunto de questões, uma para cada combinação possível dos valores que os parâmetros podem assumir. Cada questão obtida dando aos parâmetros valores específicos, ou seja, instanciando-se os parâmetros, é dita ser uma instância do PD. Em particular, um PD sem parâmetros contém uma única instância. Exemplo 18 O PD (b) do Exemplo 17, determinar se um número natural n é um número primo, é constituído pelo seguinte conjunto infinito de questões: determinar se 0 é um número primo; determinar se 1 é um número primo; determinar se 2 é um número primo; e assim por diante. O PD determinar se 123654789017 é um número primo é constituído por uma única instância, a qual é instância também do PD determinar se um número natural n é um número primo. Para cada instância de um PD, existe uma resposta correta, sim ou não. Uma solução para um PD, denominada procedimento de decisão, é um algoritmo que, para qualquer instância do PD, determina a resposta correta. Informalmente, um algoritmo é uma sequência finita de instruções, cada uma executável por uma máquina em tempo finito, e cada uma produzindo o mesmo resultado para os mesmos dados. Adiante, será apresentada uma proposta de formalização do conceito de algoritmo mediante a chamada hipótese de Church-Turing. Até lá, fica-se com esta definição informal. Um PD que tem solução é dito ser decidível, e um PD que não tem solução, indecidível. Pelo exposto anteriormente, se um PD tem um conjunto finito de instâncias, então ele é decidível: pode-se construir um algoritmo que simplesmente consulte uma tabela de respostas pré-computadas. Assim, o estudo de PDs torna-se mais interessante para PDs com uma infinidade de instâncias. Observe que uma solução para o PD mais geral determinar se um número natural n é um número primo serve também para solucionar o PD mais restrito determinar se 123654789017 é um número primo. Mas, mesmo que não existisse solução para o primeiro PD, haveria solução para o segundo! Mesmo que não se soubesse a resposta! Para ressaltar esse ponto, observe a famosa conjectura de Fermat, que só foi provada recentemente, 350 anos após enunciada: Para qualquer número natural n 3 não existem números naturais a, b e c tais que a n +b n = c n.

Newton José Vieira Capítulo 1: Conceitos preliminares 23 O problema de determinar se esta conjectura está correta é um PD que tem solução, pois é um PD sem parâmetros e, portanto, constituído por uma única instância. Mesmo na época em que a conjectura não tinha sido provada, o PD respectivo já tinha solução, embora desconhecida... Considere os dois algoritmos: retorne sim e retorne não ; um deles é a solução. Um PD obtido de outro, P, restringindo-se o conjunto de valores possíveis de um ou mais parâmetros de P, é dito ser uma restrição de P. Assim, por exemplo o PD determinar se 123654789017 é um número primo é uma restrição de determinar se um número natural n é um número primo. É evidente que, se um PD tem solução, então suas restrições também têm. No entanto, pode acontecer de uma ou mais restrições de um PD terem soluções e o PD não ter. Por exemplo, a restrição do PD determinar se uma palavra w é gerada por uma gramática G : determinar se uma palavra w é gerada por G 0, em que G 0 é uma gramática na qual o lado esquerdo de cada regra é constituído por uma variável, 9 tem solução, mas, como será mostrado à frente, o PD original não tem solução. Existe uma relação estreita entre problemas de decisão e linguagens. Em primeiro lugar, uma solução de um PD, sendo um algoritmo, deve poder ser expressa em alguma linguagem. Esta, tipicamente é uma linguagem de programação, mas, em princípio, pode ser qualquer linguagem projetada para se expressar algoritmos para uma certa noção específica de algoritmo. Por outro lado, há um outro tipo de linguagem que terá sua importância quando for abordado o problema da decidibilidade. Para que as instâncias de um problema sejam submetidas a um algoritmo elas devem ser expressas por meio de palavras em uma linguagem. Sendo Σ o alfabeto de tal linguagem, ela seria então L P = {w Σ w representa uma instância de P} (nada impede que uma mesma instância seja representada por várias palavras da linguagem). Para cada palavra de L P, a resposta pode ser sim ou não para a instância respectiva. Uma outra linguagem, subconjunto de L P, também importante, como se verá depois, é aquela constituída apenas das palavras que representem instâncias para as quais a resposta é sim : L s P = {w L P a resposta para a instância representada por w é sim }. Note que a resposta para a instância representada por w é sim se e somente se w L s P. Logo determinar se o PD P tem solução é equivalente a determinar se o seguinte PD tem solução: dada uma palavra w L P, determinar se w L s P. Segue um exemplo. Exemplo 19 Seja PP o problema de determinar se n N é primo. Representando-se cada instância por uma palavra w {0,1} +, de forma que w seja uma das representações em binário de um número natural, aqui referido por η(w), tem-se: L PP = {0,1} + ; L s PP = {w {0,1}+ η(w) é primo}. Com isto, n é primo se e somente se w L s PP, em que w é tal que η(w) = n. 9 Esse tipo de gramática será definido na Seção 3.4 como uma gramática livre do contexto.

24 Editora Thomson Introdução aos fundamentos da computação Exercício 1. Sejam os PDs: a) determinar se um número natural n, para 1 n 200, é um número primo; b) dada uma equação do segundo grau de coeficientes a, b e c, determinar se suas raízes são ambas reais, se cada um dos coeficientes é um númeronatural entre 10 e 20 (exclusive); c) dada uma equação do segundo grau de coeficientes a, b e c, determinar se suas raízes são ambas reais, se seus coeficientes podem ser números reais quaisquer; d) dada uma fórmula da lógica de predicados, determinar se ela é válida; e) dados dois conjuntos finitos, determinar se eles são disjuntos; f) determinar se uma árvore A tem altura menor ou igual a n; g) determinar se uma palavra w é palíndromo, se w {0,1}. Dizer quantos parâmetros e quantas instâncias tem cada um. 2. Dentre os PDs a seguir, quais são decidíveis? a) Determinar se existe vida extraterrestre. b) Determinar se para todo número natural n existe um par de números primos gêmeos maior que n. (m e n são primos gêmeos sse são ambos primos e m n = 2. Atualmente não se sabe se o conjunto dos primos gêmeos é finito ou não.) c) Dado um número natural n, determinar se existe um par de números primos gêmeos maior que n. (Primos gêmeos são como definidos na questão anterior.) d) Dado um conjunto finito de números naturais, determinar se ele contém algum número primo. e) Dado um programa em C (sem entrada) que tenha no máximo 1GB, determinar se ele para. f) dada uma equação do segundo grau de coeficientes a, b e c, determinar se suas raízes são ambas reais, se cada um dos coeficientes é um númeronatural entre 10 e 20 (exclusive); g) dada uma equação do segundo grau de coeficientes a, b e c, determinar se suas raízes são ambas reais, se seus coeficientes podem ser números reais quaisquer; h) Dados dois conjuntos finitos, determinar se eles são disjuntos. 3. Diz-se que um PD P é redutível a um PD Q, se existe um algoritmo R que, recebendo x como entrada, produz um resultado y tal que a resposta a P para a

Newton José Vieira Capítulo 1: Conceitos preliminares 25 entrada x é idêntica ou complementar 10 à resposta a Q para a entrada y, qualquer que seja a entrada x. Diz-se, com isso, que o algoritmo R pode ser usado para reduzir o problema P ao problema Q. Seja D um PD decidível e I um PD indecidível. O que se pode dizer de um PD X, com relação à sua decidibilidade, se: a) D é redutível a X? b) X é redutível a D? c) I é redutível a X? d) X é redutível a I? 4. Considere o problema de redução de um problema de decisão a outro, como descrito no exercício anterior. a) Dê um exemplo de redução de um problema decidível a um problema indecidível. b) Explique porque um problema indecidível não pode ser reduzido a um problema decidível. 1.5 Exercícios Adicionais 1. Seja um alfabeto qualquer Σ. Prove que Σ é enumerável. Prove que P(Σ ) não é enumerável. Ou seja, qualquer linguagem é enumerável, mas o conjunto de todas as linguagens não! Consequência: como o conjunto dos compiladores é enumerável, existem linguagens para as quais não há compiladores. 2. Faça uma definição recursiva da função v : {0,1} N tal que v(w) é o número natural representado por w na base 2. Por exemplo, v(01) = 1, v(101) = 5, v(0010) = 2 etc. 3. Seja o alfabeto Σ = {a,(,),+, }. Segue uma definição recursiva de uma linguagem E, de expressões aritméticas: a) a E; b) se x,y E então (x+y) E e (x y) E; c) só pertencem a E as palavras especificadas por (a) e (b). Prove que nenhuma palavra de E contém a subpalavra )(. 4. Seja a seguinte definição recursiva da linguagem L sobre o alfabeto {0, 1}: a) λ L; b) se x L, então 0x L e x1 L; c) nada mais pertence a L. Que linguagem é L? Prove sua resposta. 10 A resposta complementar a sim é não, e a não é sim.