Automatos

March 27, 2018 | Author: eduardomiguelcruz | Category: String (Computer Science), Grammar, Set (Mathematics), Definition, Formalism (Deductive)


Comments



Description

LICENCIATURA EM ENGENHARIA INFORMÁTICATEORIA DA COMPUTAÇÃO António Dourado Pereira Correia Advertência. Este documento é um texto de trabalho para apoio ao estudo da cadeira de Teoria da Computação. Não inclui toda a matéria leccionada na disciplina e naturalmente não dispensa a consulta da bibliografia complementar. O autor agradece qualquer comentário ou sugestão que o tolerante e paciente leitor entenda por bem fazer. Departamento de Engenharia Informática Faculdade de Ciências e Tecnologia Universidade de Coimbra Setembro 2009 Índice Geral Capítulo 1. Introdução e definições básicas 1 Capítulo 2. Autómatos finitos 43 Capítulo 3. Expressões regulares, linguagens regulares e gramáticas regulares 115 Capítulo 4. Propriedades das linguagens regulares 153 Capítulo 5. Linguagens livres de contexto 179 Capítulo 6. Simplificação de gramáticas e formas normais 213 Capítulo 7. Autómatos de Pilha 245 Capítulo 8. Propriedades das linguagens livres de contexto 273 Capítulo 9. Máquinas de Touring 299 Teoria da Computação Capítulo 1 – Introdução e Definições Básicas CAPÍTULO 1 INTRODUÇÃO E DEFINIÇÕES BÁSICAS 1.1. Introdução 3 1.2. Linguagens formais 3 1.2.1. Alfabetos, cadeias e operações sobre cadeias 5 1.2.2 .Operações de conjuntos sobre linguagens 10 1.3 Gramáticas 17 1.4 Autómatos 30 1.5. Os três paradigmas da computação 37 Bibliografia 42 Anexo 42 LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 1 Teoria da Computação LEI/DEI/FCTUC/2009/@ADC Capítulo 1 – Introdução e Definições Básicas Documento de trabalho 2 Há no entanto três temas centrais que são delas estruturantes: autómatos. LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 3 . Poderemos definir formalmente esta realidade. pelos gregos e pelos árabes). complexidade. As três visam dar resposta à questão primeira . computabilidade. Suporta também (através das gramáticas associadas aos autómatos) todo o desenvolvimento das linguagens de programação.2. de uma forma que veremos posteriormente. um autómato compreende. as linguagens formais (assim chamadas por serem definidas por um conjunto de formalismos matemáticos abstractos) são “faladas” por autómatos.1. numa interpretação genérica.Teoria da Computação Capítulo 1 – Introdução e Definições Básicas 1.Linguagens formais Tal como as linguagens humanas. desde os hieroglíficos até aos caracteres latinos. Começaremos pelos autómatos e veremos depois os elementos introdutórios fundamentais da computabilidade e da complexidade. de que falaremos no Capítulo 6. quando a noção e o significado de computação surgiu no panorama científico. gramáticas e autómatos são. Por exemplo Chomsky. é um linguista. as três faces de um mesmo prisma. isto é. Assim linguagens.quais são as capacidades e as limitações fundamentais dos computadores? O que se pode computar? Estas que têm ocupado intensamente os cientistas da computação desde os anos 30 do século passado. 1. de compiladores e de hardware. A teoria dos autómatos compõe o edifício formal que sustenta solidamente todo o desenvolvimento de processadores de texto. Introdução As ciências da computação. Nesta disciplina iremos abordar aqueles três temas. e sabe interpretar uma dada linguagem. com veremos. Vejamos formalmente em que consistem. É aliás interessante constatar que os estudiosos das linguagens humanas (os linguistas) deram uma contribuição muito importante para o desenvolvimento da teoria das linguagens formais. passando pelos chineses. têm a ver com todos os aspectos relacionados com os computadores e o seu funcionamento. Uma linguagem exprime-se através de símbolos de uma certa forma (tal como as linguagens humanas ao longo da história usaram símbolos diversos. o alfa e o beta.[. conjunto não vazio de símbolos (letras. o alfabeto dos frutos. algarismos e outros caracteres comuns como #. de símbolo.1. e esta é a única característica comum.  = {0. pratos. ameixa. $.) Os símbolos de um alfabeto podem ser de qualquer natureza e assumir um aspecto arbitrário. alfabeto binário composto pelos valores binários 0 e 1.b}.. banana. … }.8. facas. o alfabeto dos instrumentos de cozinha  = {maçã. alfabeto composto pelas duas letras a e b. A própria palavra alfabeto é composta pela concatenação do primeiro e segundo símbolos grego.  = {(. o alfabeto ASCII. tachos}.] } .5. o alfabeto romano minúsculo  ={conjunto de todos as caracteres ASCII}.). . Por razões de simplicidade usam-se normalmente apenas letras.2..1 Alfabeto.c.. alfabeto dos parênteses  = {0. LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 4 . Por isso um alfabeto pode ser um conjunto de qualquer espécie de coisas. colheres..3. alfabeto dos algarismos árabes  ={a. &. pêra.. garfos. cadeias e operações sobre cadeias Um alfabeto é composto por um conjunto não vazio de símbolos. Qualquer alfabeto é um conjunto.6. algarismos. Qualquer objecto pode pertencer a um alfabeto. z}.1}. ={símbolos}. usualmente representada pela letra grega  (sigma).4.  = {copos.b. Exemplos de alfabetos:  = {a. 9 }.2. etc.Teoria da Computação Capítulo 1 – Introdução e Definições Básicas 1..7. De facto nas linguagens humanas as palavras são cadeias de caracteres seguindo uma certa regra de formação – a ortografia. Nesse sentido as palavras são os elementos atómicos da linguagem humana que correspondem aos símbolos de um alfabeto de uma linguagem formal. cadeias de algarismos árabes. será wv=a1a2a3…anb1b2b3…bn e a concatenação à esquerda. w=5674.1 w= a.2 w =1. w=ab. Por vezes uma cadeia também se chama palavra.. w=23. Para evitar confusões usaremos preferencialmente o termo cadeia. em inglês). obtendo-se cadeias derivadas da original. Pode-se obter fazendo a concatenação à direita (v à direita de w). formalmente definida como uma sequências finitas de símbolos do alfabeto. Por exemplo a cadeia reversa.2. Exemplo 1. Por vezes estamos interessados em alterar essa ordem.. w=abbaba.an v= b1b2b3…bn a concatenação à direita de v com w .. Fazendo a concatenação de duas cadeias w e v obtém-se uma terceira cadeia que por isso se chama a concatenação de w e v. revertendo w. vw vw=b1b2b3…bna1a2a3…an Os caracteres numa cadeia seguem uma certa ordem.2. Alguns autores de língua inglesa (por exemplo Linz) usam o termo phrase frase) como sinónimo de cadeia.w=2. obtém-se invertendo (da direita para a esquerda) a ordenação dos caracteres.Teoria da Computação Capítulo 1 – Introdução e Definições Básicas Juntando-se vários caracteres de um alfabeto obtém-se uma cadeia (string. wv. por exemplo sendo w= a1a2a3 . LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 5 . De facto uma cadeia é gerada aplicando as regras (produções) de uma gramática. w.b} Exemplo 1. …cadeias no alfabeto  = {a. tal como uma frase de uma linguagem humana se constrói usando as regras da respectiva gramática. A reversa da cadeia w acima será. w. Subcadeia de uma cadeia w é qualquer cadeia composta por caracteres sucessivos de w . e denotase por  (alguns autores denotam por ) . terá 0 caracteres. o número de posições. para todo e qualquer w. Se por exemplo w=abbab Poderemos definir os seguintes prefixos de w: {.. sendo por isso vazia (um conjunto vazio). Por exemplo abcdedcba ou abcdeedcba podem ler-se igualmente da frente para trás ou de trás para a frente. Por vezes também se define comprimento como o número de caracteres da cadeia. O seu comprimento será nulo. De outro modo a cadeia anterior tem 2 caracteres (0 e 1) que. Se dividirmos qualquer cadeia w em duas partes u e v. ocupam 6 posições. ab. sendo por isso umas longas e outras curtas. anotando-se pelo módulo. a. abba. Elas têm um ponto de simetria. diz-se que u é um prefixo e v um sufixo de w. obtém-se w = w = w. qualquer que ele seja. Se uma cadeia não tem qualquer carácter (note-se que o singular de caracteres é carácter. abbab} e os seguintes sufixos de w: LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 6 .. Certas cadeias têm formas especiais.Teoria da Computação Capítulo 1 – Introdução e Definições Básicas wR =an. Se concatenarmos uma cadeia vazia com outra cadeia w qualquer. abb. tal que w=uv. ou de casas. e pode escolher-se de qualquer alfabeto. ocupadas pelos caracteres na cadeia.a3a2a1 O número de caracteres de uma cadeia pode ser qualquer. Chama-se comprimento de uma cadeia. repetidos. tal como a união de um conjunto com o conjunto vazio dá o conjunto original. |w|. e não carater). o que está certo se se incluírem as repetições nesse número. Voltaremos a falar deles. ||=0. Por exemplo 011011 tem comprimento 6. Em linguagem corrente chamam-se capicuas e mais formalmente chamam-se palíndromos e são tais que w = wR. n. Assim por exemplo w2 = ww w3 = www. Se a concatenação uma vez dá a própria cadeia. bbab. Por exemplo a3=aaa. Assim se ={0. é uma cadeia obtida pela concatenação n vezes da cadeia w consigo própria. Também se define potência de um alfabeto. b. O sinal de potência também se usa para exprimir a concatenação de um carácter consigo próprio. A ordem por que estão escritos acima reflecte essa associação. Potência n de uma cadeia. É fácil de ver que w1=w Quanto a w0. O prefixo a está associado ao sufixo bbab e o sufixo  ao prefixo abbab. } Note-se que cada prefixo está associado a um sufixo.1}.Teoria da Computação Capítulo 1 – Introdução e Definições Básicas {abbab. a concatenação zero vezes dá nada. etc. wn. como o conjunto das cadeias desse alfabeto de comprimento n. 0={}. cadeia vazia LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 7 . 1204=110000. bab. a cadeia vazia e portanto w0={} para todo e qualquer w. ou seja. ela será a concatenação de w consigo própria zero vezes. ab. anbm=aa…abb…b. ….10. Linguagem : dado um alfabeto qualquer . Se excluirmos a cadeia vazia do fecho estrela. um. Contém sempre a cadeia nula . 001. pode ter apenas uma parte deles. + + =*-{} É fácil de ver. para significar qualquer.01. cadeias com dois caracteres 3={000. e chama-se a * o fecho estrela do alfabeto (star-closure). *. num alfabeto qualquer podem-se definir múltiplas linguagens. linguagem L é qualquer subconjunto de *. mesmo quando o alfabeto  é finito. que estudaremos na ocasião oportuna. 0010.Teoria da Computação Capítulo 1 – Introdução e Definições Básicas 1={0. e é uma forma simples e elegante de denotar esse conjunto infinito. pela definição.1. esse conjunto terá todas as cadeias com zero. cadeias com um carácter 2={00. obtemos o fecho estrela positivo.1} . mesmo que tenham apenas um carácter). que quer * quer + são sempre conjuntos infinitos. Assim * é conjunto de todas as cadeias que se podem obter pela concatenação de zero ou mais símbolos de . 1 é um conjunto de cadeias. Elas terão propriedades diferentes que lhes dão características bem distintas. qualquer número de caracteres do alfabeto. Se definirmos o conjunto de todas as potências possíveis de um alfabeto. dois. (note-se que enquanto  é um conjunto de caracteres (símbolos). 111} cadeias com três caracteres etc. É simplesmente o conjunto de todas as cadeias possíveis no alfabeto . Uma linguagem num alfabeto não precisa de ter todos os caracteres desse alfabeto. Para exprimir este facto usa-se o símbolo estrela.2.11}. Assim sendo. …. Chegamos agora finalmente à definição de linguagem. Define-se frase (ou sentença) como qualquer cadeia na linguagem formal L LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 8 . um dos conceitos chave da computação: Definição 1. aab. incluindo a cadeia vazia. um programa qualquer correctamente escrito é um subconjunto de todas as cadeias possíveis que se podem formar com os caracteres da linguagem.1} com um número de 0’s igual ao número de 1’s L={. 01. aaabb. (ii) O conjunto L2={anbn: n0} é uma linguagem em . não pertencem a L2 (tente escrevê-las naquela forma de potências ). a3b3.}.aba. É uma linguagem finita. Nele *={. LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 9 .1011. (i) O conjunto L1={a. 10. Já as cadeias aba. As cadeias ab. abb} é uma linguagem em . pertencem a L2 porque se podem escrever na forma respectivamente a1b1.bbb. 1100. 0101.101. Seja por exemplo o alfabeto  ={a. …} Também se pode constatar que . 10001.o conjunto dos números binários cujo correspondente decimal é primo L={10. aabb. .bba.b.a. …} . a linguagem vazia. abb. não tem qualquer cadeia. Na linguagem Java. é uma linguagem em qualquer alfabeto. Também {}.111.bab.Teoria da Computação Capítulo 1 – Introdução e Definições Básicas A língua portuguesa é um conjunto de cadeias formadas pelas letras do nosso alfabeto latino. Como veremos a gramática da linguagem define as regras da formação das cadeias.11. É uma linguagem infinita. 1001. 1101.abb. contém todas as combinações possíveis dos símbolos do alfabeto. é uma linguagem em qualquer alfabeto...bb. O seu alfabeto é um subconjunto dos caracteres ASCII. ab. 0011.aaa. Por exemplo: . aaababbab. Na linguagem corrente cada cadeia é uma palavra e uma frase pode ter várias palavras.o conjunto de cadeias em ={0. 0110.b}. a linguagem composta apenas pela carácter vazio.aa. a2b2.baa.ba. Por vezes define-se uma linguagem exprimindo verbalmente as suas propriedades específicas que a distinguem de outra qualquer.ab. 1. LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 10 . à segunda L1L2={uv: uL1. um conjunto. *) menos as cadeias da linguagem complementada. Complemento de uma linguagem: todas as cadeias possíveis no alfabeto respectivo (isto é.2. Concatenação de duas linguagens: todas as cadeias em que uma parte (prefixo) pertence à primeira linguagem e a parte restante (sufixo).L2 = {w: wL1 e wL2}. Intersecção: todas as cadeias que pertencem simultaneamente a uma e a outra.L. poderemos fazer com elas as seguintes operações: União: todas as cadeias que pertencem ou a uma ou a outra. Compl(L) =L =* .2. como vimos. L1L2 = {w: wL1 e wL2}. Portanto aplicam-se-lhe todas as operações sobre conjuntos. Diferença de duas linguagens: todas as cadeias que pertencem a uma e não pertencem à outra. Operações de conjuntos sobre linguagens e suas propriedades Uma linguagem é. Reversão de uma linguagem: todas as cadeias que resultam da reversão das cadeias originais de L constituem a linguagem reversa de L denotada por LR LR = {wR : wL}. L1L2 = {w: wL1 ou wL2}. Se tivermos duas linguagens L1 e L2. mesmo que vazia). vL2}. L1 .Teoria da Computação Capítulo 1 – Introdução e Definições Básicas Note-se a diferença entre  e {} : a primeira não tem qualquer cadeia e a segunda tem uma cadeia (a cadeia vazia é de facto uma cadeia. L2 – L1 = {w: wL1 e wL2}.. ab1111. b}. b01).ab11.ab01. se  não pertence a L2.b111. ab.b0. e portanto não é possível obter em L1L2 a menor cadeia de L1. obtém-se uma cadeia maior do que a primeira. a11. ab11.1111}= ={a0. então a concatenação de uma qualquer cadeia de L1 com uma qualquer cadeia de L2 resulta numa cadeia que não pertence a L1 e por isso nenhuma cadeia de L1 neste caso pertence à concatenação.b1111)} LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 11 .Teoria da Computação Capítulo 1 – Introdução e Definições Básicas Dada a concatenação de L1 e L2 será que L1  L1L2. 1111} Então L2L3={0.ab1111. Vejamos as várias situações possíveis. No caso extremo em que L1=L2. b11.1111} e L1 . ab. as linguagens L1={a. ao concatenarmos a menor cadeia de L1 com a menor cadeia de L2. para quaisquer L1 e L2 em quaisquer alfabetos 1 e 2 ? Tal será possível se e só se   L2.a111. (i) No caso em que os dois alfabetos são disjuntos. ab0.a01.a1111.ab111. b11. 01} L3={11.11.b01.111. a título de exemplo. b0.a111.b1111} ={( a0. b}. (a11.01. L2={0. Mutatis mutandis da anterior L2  L1L2 se e só se   L1 Distributividade da concatenação em ordem à união Considerem-se. verifica-se a mesma situação.ab01.111. (L2L3) ={a.01.a01.{0.11. 111.b111.a1111. (ii) no caso particular em que as duas linguagens partilham o mesmo alfabeto. Pelo menos essa não pertence a L1L2 e por isso o mesmo sucede a L1 (esta só pertence à concatenação se todas as suas cadeias pertencerem).ab111.ab0. .0111. 0.{0. 111. b. 111. 0. ab.0111. ela irá entrar na concatenação. ab. ab.. aab. ab. a11. 111.011111} L1 (L2L3)={a. De facto se uma cadeia pertence à união de duas linguagens. 11.01111.0111. 1111}=. b}{0.b}. ela não entrará na concatenação.0111. ab. 1111} Concatenando estas duas. 1111}={011.ab.b}{11. ab.a1111. L1 .{L1L2 L1L3 Este resultado pode-se generalizar: a concatenação é distributiva em relação à união.01111. 111.011111}= ={a. Serão concatenadas todas as da união e apenas elas. ( L1L2).011111} Por outro lado. b. . 11. 1111} ={aa.{a. b. ab. Se formos capazes de encontrar um só caso em que isso se não verifique. b. 01}. 111. Por outro lado. 011. b} {11. não pertencem a L1 (L2L3).01111. b}{011. 01} (L1L3 ) = {a.01111. 01}.0111. ab.Teoria da Computação Capítulo 1 – Introdução e Definições Básicas = {a.01111. aab. 1111}= {a.a111. Será a união distributiva em relação à concatenação? Uma propriedade definida assim genericamente tem que ser válida para todos e quaisquer casos. Logo LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 12 . b.01111. a propriedade não é geral e portanto a resposta é não. se uma cadeia não pertence à união.0111. Faça-se L2L3={0. (L1L3 ) = {a. ( L1L2) = L1={a. 01}= {a. Considerem-se novamente as três linguagens acima. (L2L3)= L1L2  L1L3.} Ora as cadeias aa.{11.01} {a. ab.ab. elevando-o a zero obtém-se a unidade. Em que resulta ? Para um qualquer número real. a cadeia vazia. L= A concatenação de uma linguagem L qualquer com a cadeia vazia resulta na linguagem L (analogamente ao produto de um número real pela unidade). L=L Na concatenação o conjunto vazio desempenha o papel de zero e a cadeia vazia o papel da unidade. L0={} L1=L L2=LL . Podemos também considerar que a potência nula de uma linguagem consiste em escolher zero cadeias dessa linguagem. A concatenação de uma linguagem com o conjunto vazio (linguagem vazia) resulta no conjunto vazio (analogamente ao produto de um número real por zero). Se concatenarmos uma linguagem zero vezes com ela própria . Logo.. Então aqui será natural considerar-se que a potência zero de uma linguagem é a unidade da concatenação. vem L0 . ou seja.Teoria da Computação Capítulo 1 – Introdução e Definições Básicas L1 (L2L3)  ( L1L2) (L1L3 ) e concluímos que em geral a união não é distributiva sobre a concatenação. Potência de uma linguagem Define-se a potência n de uma linguagem a partir da concatenação da linguagem com ela própria (auto-concatenação) n vezes. LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 13 .. {0. todas as cadeias possíveis de 0’s e 1’s. Kleene star) de uma linguagem L* ao conjunto de todas as cadeias que se podem obter por concatenação da linguagem com ela própria. ou seja. 11}.{0.1}={000. 1}. …….{0.10.1100...011.. um número arbitrário de vezes (incluindo zero vezes).11}= ={000. ou seja. Unindo agora todos os subconjuntos teremos o conjunto de todas as cadeias de 0’s e 1’s com zero.01111.11} L2 ={0. três. a linguagem L={0.1}.{0.011. 11}.110. Se considerarmos a linguagem L={0. 11}={00.{0.{0.11}.pelas razões anteriores L1 ={0.01.1111}. Assim o fecho estrela desta linguagem com duas cadeias é uma linguagem infinita.111} .todas as cadeias de 0’s e1’s com dois caracteres L3={0.{0.todas as cadeias de 0’s e 1’s com quatro caracteres.1}={00.111111} LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 14 ..11110.1}.010.{0.{0.11}={00. E assim sucessivamente. L* = L0L1L2L3.01. por exemplo. Se tivermos.1111} L3={0..110.11011.todas as cadeias com zero caracteres L1 ={0. o seu fecho estrela é o conjunto de todas as cadeias de 0’s e 1’s.1} . incluindo a cadeia vazia.0110. 1}.001. Note-se que L* contém sempre .todas as cadeias de 0´s e 1´s com um carácter L2 ={0.{0.0011. 1}={00. De facto L0={} .todas as cadeias de 0’s e 1’s com três caracteres L4={0. 11}.Teoria da Computação Capítulo 1 – Introdução e Definições Básicas Chama-se fecho-estrela (star-closure. independentemente de L o conter ou não. qualquer número de caracteres. o que dará o seu fecho estrela ? L0={} . 1}.110. 1}. 11}. um.011.1} . dois.{0. 1}.11} .10. .. o seu fecho estrela é L*={}. L+ . = L* .. e 0110 pertence também a L3. + também não. L é infinita. Como se poderá obter 00110110 a partir de  ? De L6 é possível: 0011 pertence a L3. A linguagem  e a linguagem {} são as duas únicas linguagens que têm um fecho estrela finito. tal como o seu fecho estrela.Teoria da Computação Capítulo 1 – Introdução e Definições Básicas E assim sucessivamente. * ? 0={} 1= 2= Unindo tudo vem *={} ={} Quanto à linguagem com o carácter vazio.. então L*=L. Obtêm-se todas as cadeias de 0’s e 1’s em que os 1’s aparecem sempre aos pares. Por exemplo a cadeia 00110110. Se L não tem . Tal como se for a linguagem conjunto de todas as cadeias de 1’s . mas não 0010110 nem 0011010. L+ : L1L2L3. é o conjunto de todas as cadeias que se podem obter por concatenação da linguagem com ela própria uma ou mais vezes. E o fecho estrela da linguagem vazia.{} Exemplo: Seja LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 15 . Ainda neste exemplo o fecho estrela da linguagem finita com apenas duas cadeias resulta numa linguagem infinita. Há algumas linguagens que têm a concatenação aparentemente estranhas. Se considerarmos L a linguagem que contém todas as cadeias de 0´s (incluindo zero 0).. L={}. Fecho-positivo (positive closure) de uma linguagem. ...Teoria da Computação Capítulo 1 – Introdução e Definições Básicas L={anbn. ababab. . Mas vejamos desde já algumas noções básicas de gramáticas.. aaaabbbb.. pode-se escrever L2= {anbnambm. ... LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 16 . n1. aabbaabb. baa. que inclua todas as cadeias do complemento de L ? Fica o desafio ao leitor... .} L2= LL={ab. aabb... como fazê-lo? Trata-se de todas as cadeias que não obedeçam à regra de formação de L. aaaa. Por isso foram desenvolvidas representações alternativas: as expressões regulares e as gramáticas. aaaa. E o fecho estrela L* ? Nem sempre a notação de conjuntos é a mais adequada para representar linguagens.. A reversa de L é fácil de calcular: basta revertermos a expressão que a define: LR={bnan. abaaaabbbb. aabbaaaabbbb. abab. aabbaaabbb. aaabbb. n1} Logo: L={ab. . abaaabbb.... } Procurando uma forma compacta para L2. bbaab.... Por exemplo aab. aabbab. aabb. abaabb. Estudá-las-emos em capítulos posteriores. aaabbb. . ….. aaaabbbb. em notação de conjuntos. bbbbaa. Será fácil encontrar uma expressão compacta. bababa. n e m são independentes. n1} Se tivermos necessidade de escrever o complemento de L de uma forma sintética. m1}. Mateus.M. que ultrapassa as limitações da notação de conjuntos anterior. as regras de formação das palavras e das frases. Simbolicamente escreve-se a regra de produção frase  sintagma nominal sintagma verbal (produção 1) O sintagma nominal é composto por um determinante e um nome (pelo menos um deles) ou pode ser vazio: sintagma nominal  determinante nome | vazio (produções 2 e 3) O determinante pode ter um artigo ou um deíctico. Se usarmos a de Mateus e outros (Gramática da Língua Portuguesa. Vejamos um exemplo da língua portuguesa Exemplo 1. e portanto muito simplificadas em relação à riqueza da nossa língua): Regra: uma frase é composta por um sintagma nominal e um sintagma verbal. muito poderosa. A. I.Brito.1 Há várias gramáticas da língua portuguesa. M. Pode não ter sintagma nominal ou o sintagma verbal. mas tem que ter pelo menos um deles. ou nada: determinante  artigo | deícticos | vazio LEI/DEI/FCTUC/2009/@ADC Documento de trabalho (produções 4. Duarte. de modo que todos possamos entender. Caminho Série Linguística. normalmente identificadas pelo nome dos seus autores.Teoria da Computação Capítulo 1 – Introdução e Definições Básicas 1.H. É a gramática que dá sentido à linguagem: sem ela as pessoas não se entenderiam Uma gramática é também uma ferramenta para estudar matematicamente linguagens. H Faria. poderemos representar simbolicamente as regras de formação de uma frase (aqui feita para fins ilustrativos.5.3. M.3. 1989).6) 17 . Gramáticas A gramática de uma linguagem formal tem o mesmo objectivo da de uma linguagem humana: ela fixa. I. Todas as linguagens escritas têm uma gramática. Por exemplo: verbo  estuda | ama | compra | dorme|chove (produções 8 a 12) artigo  o | a |um | uma|<vazio> (produções 13 a 17) deícticos  este | esse | aquele | meu | teu | seu |<vazio> (produções 18 a 24) nome  Luís | Antónia | Isabel | livro | gelado | (produções 25 a 29) Com as regras de produção e os elementos terminais dados.Teoria da Computação Capítulo 1 – Introdução e Definições Básicas O sintagma verbal é composto por um verbo e um sintagma nominal (pelo menos um deles): sintagma verbal   verbo sintagma nominal (produção 7) Para podermos formar (produzir) frases temos que ter palavras concretas e não apenas categorias de palavras. Elas. são os elementos terminais da gramática. Por exemplo para produzir a frase a Antónia compra aquele gelado usam-se as regras de produção na ordem adequada para o fim em vista: frase  sintagma nominal sintagma verbal produção 1  determinante nome sintagma verbal produção 2  determinante nome  verbo sintagma nominal produção 7  determinante nome  verbo determinante nome produção 2  determinante nome  verbo deíctico nome produção 5  a nome  verbo deíctico nome produção 13  a Antónia  verbo deíctico nome produção 26 LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 18 . as palavras concretas. poderemos agora formar frases. conjunto não vazio finito de objectos.Teoria da Computação Capítulo 1 – Introdução e Definições Básicas  a Antónia compra deíctico nome produção 10  a Antónia compra aquele nome produção 20  a Antónia compra aquele gelado produção 29 Verifique o leitor se as seguintes frases obedecem à gramática dada: (i) O João foi ao cinema (ii) Chove (iii) A Isabel ama o Luís Este exemplo mostra como uma frase (ou oração). pode ser definida à custa de elementos simples (decomposição da complexidade). Definição 1. e reduz-se sucessivamente até se obterem os elementos irredutíveis com que se constrói a língua. Uma gramática G é definida por um quarteto G=(V. as linguagens dos computadores. As linguagens formais são construções matemáticas (conjuntos) que obedecem a certas regras. S. A generalização deste princípio leva-nos às gramáticas formais isto é. Começa-se no conceito mais complexo (frase). Por isso usam-se notação e conceitos matemáticos precisos para a sua definição e manipulação. T. P) em que V : variáveis. LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 19 .1. Para que não haja equívocos. coerente. Gramática. conjunto não vazio finito de objectos. completa. T: símbolos terminais. as gramáticas formais devem ter uma estrutura clara.3. gramáticas das linguagens formais. conceito geral e complexo. Várias gramáticas podem produzir a mesma linguagem. Mas uma gramática não pode produzir duas linguagens. um símbolo especial.3. A cadeia produtora x tem que ter qualquer coisa. Teremos a relação ilustrada na figura 1. As regras de produção de uma qualquer gramática têm sempre a forma padrão x y que se lê “ (a cadeia) x produz (a cadeia) y” . Nesse caso são gramáticas equivalentes. Gramáticas diferentes podem produzir a mesma linguagem. isto é V e T são conjuntos disjuntos. Por isso elas definem uma linguagem associada à gramática. No nosso estudo são em geral caracteres.Teoria da Computação Capítulo 1 – Introdução e Definições Básicas S  V: variável de inicialização. Gramáticas Linguagens L1 G1 G2 G3 L2 G4 Figura 1. As regras de produção constituem o cerne da gramática. o que não teria significado). também chamado axioma. não pode ser a cadeia vazia (se assim não fosse produzir-se-ia a partir do nada.3.1 . Mais à frente estudaremos técnicas e algoritmos para transformar uma gramática numa outra sua equivalente. P : um conjunto finito de produções As variáveis não podem ser símbolos terminais e vice-versa. Embora uma linguagem possa ser produzida por várias gramáticas. uma gramática produz uma e uma só linguagem.1. Este facto anota-se por LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 20 . pois é através delas que uma cadeia de caracteres se transforma noutra cadeia de caracteres. Anota-se assim por y  (V  T)* sendo agora legítimo escrever ( * ) para admitir a possibilidade da cadeia vazia. As regras de produção podem aplicar-se por qualquer ordem e tantas vezes quantas as necessárias. Neste caso quer dizer que a produção consiste simplesmente na anulação de x. pode conter variáveis da gramática. e/ou símbolos terminais. dependendo do caso. ou que z é produzida por w e anota-se com seta larga w z w e z podem variáveis e/ou símbolos terminsais. a cadeia x pela cadeia y. dada uma cadeia w = uxv x  y. e a regra de produção ____________ por substituição de x por y em w. obtém-se a cadeia z = uyv Diz-se que w produz z . numa forma sentencial. chamada o corpo da produção. A cadeia produzida y. como veremos. Duas produções e um símbolo inicial são suficientes para produzir uma linguagem infinita. Este facto permite que com um número finito de produções se possa obter uma linguagem infinita. Isto é. Por exemplo as duas produções seguintes S  aS S LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 21 . De facto (V  T)0 resulta na cadeia vazia. sem a cadeia vazia (por isso se escreve + e não *). A produção substitui.Teoria da Computação Capítulo 1 – Introdução e Definições Básicas x  (V  T)+ querendo-se dizer que a cadeia x pode ter variáveis da gramática e/ou símbolos terminais. podendo ser a cadeia vazia. conforme a gramática concreta. Ordens de derivação diferentes podem dar cadeias terminais iguais ou diferentes. apenas com símbolos de T. como em w1  w1 ). Exprime-se pela expressão L(G). então a sequência LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 22 . ou seja. L(G) = {wT*: S   w} Se uma dada cadeia pertence à linguagem. Entre uma forma sentencial inicial w1 e uma final wn poderemos passar por um grande número de formas sentencias intermédias. produz-se uma cadeia terminal. com uma só produção. P) a linguagem da gramática (ou gerada pela gramática) é composta por todas as cadeias terminais (sentenças. usando (*) para significar uma sequência de produções simples. uma linguagem infinita? Só em certas gramáticas especiais que estudaremos no Capítulo 12.  w1  wn (* ) exprime o facto de que para derivar wn a partir de w1 são necessários um número não  especificado de passos (incluindo eventualmente zero passos. T. dada a gramática definida pelo quarteto G=(V. em escrita mais compacta (mais prática). ou eventualmente ) que se podem gerar a partir de S com as produções de P. …. compõem a linguagem gerada por essa gramática. S. O conjunto de todas as cadeias terminais que se podem obter por uma gramática. ou seja. Em termos mais formais.Teoria da Computação Capítulo 1 – Introdução e Definições Básicas geram qualquer cadeia no alfabeto ={a}. por qualquer ordem qualquer número de vezes. Será possível obter. w1. Experimente o leitor gerar a cadeia aaa. w L(G). w1  w2  …  wn Diz-se que w1 produz wn ou. incluindo a cadeia vazia. Por cada ordem. w2. linguagem L da gramática G. As regras de produção podem ser aplicadas numa ordem qualquer. por nada)..Teoria da Computação Capítulo 1 – Introdução e Definições Básicas S  w 1 w2  .  wn  w é uma derivação da cadeia w.. Seja a gramática definida pelo quarteto G =({S}.b}. w2. A essas expressões chama-se formas sentenciais da derivação: são as cadeias S. que por isso é também chamado o axioma da gramática.. P) Comparando com a definição 1. as cadeias terminais terão apenas estes símbolos  Variável de inicialização: S  As produções P dadas por P1: S  aSb : partindo do símbolo inicial S. coloca-se-lhe um a antes e um b depois. S. Qualquer derivação da gramática começa sempre por S. . A cadeia w deve ter apenas símbolos terminais caracteres do alfabeto da linguagem.. Exemplo 1. P2: S   : o símbolo S pode ser substituído pela cadeia vazia (isto é..b . identificam-se os elementos do quarteto:  Conjunto V das variáveis: S  Símbolos terminais: a. {a.2. Uma derivação pode seguir o seguinte percurso: S  aSb aplicando a produção P1  aaSbb produção P1  aaaSbbb produção P1 LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 23 .3. wn . w1. incluindo eventualmente . Desde S até w passa-se por diversas expressões que têm variáveis da gramática ou uma mistura de variáveis e de símbolos terminais. usando as noções que vimos anteriormente... usando uma das técnicas de prova conhecidas. ou seja por nada. ao fim da nèsima produção obtémse aaa.. substituindo S por . n0} Este resultado é tão evidente que se pode dizer que não carece de demonstração.Teoria da Computação Capítulo 1 – Introdução e Definições Básicas  ..b = anbn Se aplicarmos primeiro a produção P2 obtém-se a cadeia vazia e não se pode prosseguir.. L(G) = {anbn. Nessa altura obtém-se uma frase da linguagem. o mais natural será usar a prova por indução. Demonstra-se que ele se obtém aplicando a produção P2 a partir de S. associada à noção de recursividade. O caso  .abbb. Vão-se obtendo sucessivas formas sentenciais. Conclui-se assim que esta gramática produz a linguagem composta por cadeias em que a primeira metade só tem a’s e a segunda metade só tem b’s.. ou seja. de uma forma matematicamente elegante. correspondente a n =0 tem que ser tratado à parte. até ao infinito. Como se trata de demonstrar uma fórmula para um número infinito de casos. todas as formas sentenciais são da forma wn = anSbn LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 24 . Queremos provar que qualquer que seja n ≥1. Em qualquer altura se pode aplicar a produção P2.. Assim. ao fim da 1ª produção obtém-se ab ao fim da 2ª produção obtém-se aabb etc.. Para os outros casos façamos a demonstração por recursividade da produção P1 e indução. Mas pode-se demonstrar formalmente. pode-se continuar um número qualquer de vezes. resultante de uma vez P1 a partir de S. wk+1a(akSbk )b Manipulando a expressão wk+1 (aak)S(bkb) ou ainda por definição de concatenação (potência) de caracteres.base da indução. anSbn anbn o que é verdade. ou seja. LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 25 .d. n≥1. n=1. é verdade ? sim. quod erat demonstrandum (o que era preciso demonstrar) q. é verdade que wk = akSbk -passo indutivo: em consequência é verdade para k+1 ou seja wk+1 = ak+1Sbk+1 Prova do passo indutivo (nesta prova há-de entrar a hipótese indutiva): Partindo de wk e por aplicação de P1 obtém-se wk+1 wk+1awkb mas substituindo a hipótese indutiva nesta produção. E a demonstração está feita.Teoria da Computação Capítulo 1 – Introdução e Definições Básicas . -hipótese indutiva: admitamos que é verdade para n=k e para todos os anteriores. wk+1  ak+1 Sbk+1 Falta finalmente provar que aplicando P2 a qualquer forma sentencial na forma wn = anSbn.e. se obtém uma sentença na forma anbn. Introduz-se com esse objectivo uma variável adicional. A. Note-se que partindo de S não se pode voltar a ele. n0} Esta linguagem é parecida com a do exemplo anterior.3: Encontrar uma gramática que gere a linguagem L={an+1bn. e definem-se as produções P1: S  aA P2: A  aAb P3: A em que S é a variável de inicialização. obtém-se S  aS  aaS  aaaSb  aaab i. P3. aplicando P1. sendo sempre a primeira. aplicar depois regras de produção como no caso anterior: P1: S  aS P2: S  aSb P3: S Teríamos assim a gramática definida exactamente como a anterior: G = ({S}. Pode-se simplesmente gerá-lo em primeiro lugar. Para que isto não aconteça. a3b. P1 só se pode aplicar uma vez. que não faz parte da linguagem. P2. P1. S.e. com a diferença de que é necessário gerar um a adicional à esquerda de b.3.b}. Poderemos agora definir a gramática G com o quarteto LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 26 . {a. e por isso P1 só se aplica uma vez.Teoria da Computação Capítulo 1 – Introdução e Definições Básicas Exemplo 1. P) Como as produções de podem aplicar por ordem arbitrária e um número arbitrário de veses. S. Se tivermos uma cadeia simétrica e lhe adicionarmos o mesmo carácter no princípio e no fim. que por isso se dizem equivalentes . logo é um palíndromo Para todo o a. resulta uma cadeia simétrica. Recorre-se frequentemente à prova por indução. Uma linguagem pode ser gerada por muitas gramáticas.. G1 e G2 são gramáticas equivalentes se L(G1)=L(G2) Na Fig. a PAL. 1. tem que se mostrar que: (i) por um lado toda a cadeia w L pode ser derivada a partir de S usando as produções P da gramática ou seja (ii) por outro lado qualquer cadeia gerada pela gramática G pertence à linguagem L. Vejamos mais em detalhe como se podem definir e gerar. sobretudo a primeira. G3 e G4 são equivalentes.1 as gramáticas G2.13. {a. P2 e P3.  PAL 2. Nem sempre é fácil fazer as duas demonstrações. Qualquer carácter isolado é simétrico. 3. Ver por exemplo em Linz. Os palíndromos são cadeias que têm interesse especial para o estudo de gramáticas e autómatos. P) sendo P composto pelas três produções P1. Definição formal de palíndromos ( PAL) sobre um alfabeto  Seja PAL a linguagem constituída por todos os palíndromos (capicuas) sobre um dado alfabeto.b}. exemplo 1. Para demonstrar que uma dada linguagem é gerada por uma certa gramática. LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 27 . Pode-se definir pelas três regras seguintes 1. logo pertence aos palíndromos.Teoria da Computação Capítulo 1 – Introdução e Definições Básicas G=({A}. O carácter vazio é simétrico. então ela pode ser gerada por aquelas três regras. b  PAL 3. e todo o a.  PAL 2.Teoria da Computação Capítulo 1 – Introdução e Definições Básicas Para toda a cadeia w  PAL . Por exemplo: b  PAL . Exemplo 1. awa  PAL Uma cadeia só pertence a PAL se puder ser gerada por estas 3 regras. Por outro lado se uma cadeia é um palíndromo. awa  PAL bwb  PAL Qualquer cadeia pertence a PAL se e só se for gerada pelas regras 1. Deste modo uma gramática para esta linguagem pode ser obtida pelas derivações seguintes: 1 P1: S   LEI/DEI/FCTUC/2009/@ADC (regra 1) Documento de trabalho 28 .4  = { a.3. 2 e 3. a PAL. 1. b } Seja o alfabeto Aplicando aquelas 3 regras. regra 2 aba  PAL. regra 3 babab  PAL regra 3 abababa  PAL regra 3 Como se poderá escrever uma gramática para esta linguagem? Poderemos tentar imitar as três regras: primeiro gera-se um palíndromo com a regra 1 ou a 2. cada vez maiores.e depois geram-se sucessivos palíndromo. Para qualquer wPAL. com a regra 3. aplicando-as as vezes necessárias pela ordem conveniente. etc. na web.Software para busca de texto em ficheiros. O estado permite “lembrar” o passado relevante do sistema (ele chegou lá após um certo número de transições.software para o projecto e o teste de circuitos digitais. 4. Se o número de estados de um sistema é finito. usando “|” para o “ou” lógico S  | a | b | S  aSa | bSb 1. Aplicam-se nomeadamente em (Hopcroft& col) 1.Teoria da Computação Capítulo 1 – Introdução e Definições Básicas 2 P2: S  a (regra 2) P3: S  b (regra 2) 3 P4: S  aSa (regra 3) P5: S  bSb (regra 3) Por exemplo para gerar abba teremos a sequência de produções S aSa  abSba  abba  abba Pode-se escrever as 5 produções gramática na forma compacta. e por isso a noção de estado é central num autómato a eles associado. 3.Software de verificação de sistemas que têm um número finito de estados distintos. poderemos representá-lo com uma quantidade limitada de recursos. protocolos de segurança.Analisadores lexicais dos compiladores (que verificam se uma palavra. Muitos componentes e sistemas digitais podem estar num entre um número finito de estados. etc. está bem escrita num programa).4. que são o seu passado). 2. tais como protocolos de comunicação. LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 29 .Autómatos Os autómatos finitos são modelos abstractos de muitos dispositivos de hardware e de software. por exemplo um identificador. na Fig.2 Press F A Press Figura 1. Para se saber como se inicializou o interruptor. Se está on e se se pressiona. provocadas pelo accionamento do interruptor.4.4. o on (A) e o off (F) Desenhando. F A Figura 1. Press F A Press Figura 1. O autómato finito do interruptor. As transições entre os estados do autómato.4. passa a on. Fig. Os dois estados do autómato que representa o interruptor on-off.4. F-fechado.3.3. Ele terá por isso dois estados. 1.1.2.Teoria da Computação Capítulo 1 – Introdução e Definições Básicas Considere-se por exemplo um interruptor on-off.4. Representando por arestas de um grafo as acções de pressionar ( “Press”) teremos a Fig. LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 30 . 1.1.3. identifica-se o estado inicial por uma seta.1. teremos os dois estados como dois vértices de um grafo. passa a off . e tem-se finalmente o desenho de um autómato finito (de dois estados) que representa o funcionamento do interruptor. Se está off e se se pressiona. Aaberto. 4. como veremos. conforme os autores. ela pareceu-lhe.4 com nova etiquetagem dos estados. Para assinalar este facto o estado 4 desenha-se com uma dupla circunferência.6.Teoria da Computação Capítulo 1 – Introdução e Definições Básicas As etiquetas das arestas representam a acção exterior sobre o sistema (neste caso pressionar o interruptor) e as arestas a evolução do sistema em consequência dessa acção. recebe do exterior (lê) a letra p e passa ao estão 2. LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 31 . Considere-se agora o autómato da figura 1. ou estado aceitador. O primeiro chama-se estado inicial.4.4. Inicializa-se no estado 1. p p pa a pai i Figura 1.4. caso contrário nunca chega ao estado 4.mais sugestiva. Poderíamos nomear os estados de um modo mais sugestivo. Um autómato finito que transita de estado pela entrada de letras.4. Por esta razão diz-se que o autómato é um aceitador da palavra pai. tal que a sua etiqueta nos sintetizasse o que se passou até aí. p a 1 i 2 3 4 Figura 1.6. e generalizando a noção de transição. Teríamos por exemplo a Fig. como na figura 1. de um estado para ele próprio). Pode afirmar-se que o autómato de 4 estados é capaz de reconhecer a palavra pai: se chegou ao estado 4. p a p i pa pai Figura 1. depois com as letras a e i passa sucessivamente aos estados três e 4. O autómato com estado final aceitador E chama-se estado final.5.4.4.5.4. que é sempre uma transição entre dois estados (ou. O autómato anterior da Fig 1.4. 1. informação de presença ou ausência de pessoas. O frontal detecta uma pessoa que se aproxima e o da retaguarda detecta a presença de uma pessoa na sua área de observação. caso contrário haveria um acidente. fechar.7. 1.4. rotativa.7. A. Tal como no exemplo anterior. Uma porta de abertura automática. e porta fechada. Exemplo 1. que recebe os sinais dos dois sensores e conforme o caso manda abrir.Teoria da Computação Capítulo 1 – Introdução e Definições Básicas Vejamos um exemplo um pouco mais complexo. conforme esquematizado na Fig.Teremos quatro situações possíveis. Quanto uma pessoa se aproxima para entrar a porta abre-se. tem geralmente dois sensores. Os dois sensores enviam. F. o controlador. Sensor Fronta Sensor Rectag Figura 1. que poderemos representar por 0 (ausência) e 1 (presença). cada um.4.. rotativa.4. considerando simultaneamente os dois sensores: 00 : ausência de frente e detrás LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 32 .3 Uma porta automática de entrada de um serviço público.4. poderemos desenhar dois vértices de um gráfico para esses dois estados. se não estivar ninguém detrás da porta. Há um dispositivo electrónico. um frontal. ou manter-se como está.8. F A Figura 1. correspondentes a porta aberta. girando sobre o seu eixo de fixação. O controlador terá dois estados. e um na retaguarda. Os dois estado do autómato abridor da porta. teremos as transições possíveis representadas na tabela (de transições) seguinte: Tabela 1. PF PR Carácter 0 0 00 a 0 1 01 b 1 0 10 c 1 1 11 d Considerando as restrições de segurança.Teoria da Computação Capítulo 1 – Introdução e Definições Básicas 01: ausência de frente e presença detrás 10: presença de frente e ausência detrás 11: presença de frente e presença detrás.2.4.1. Codificação do alfabeto ao autómato. abre ou deixa ficar como está ? Poderemos constatar que o alfabeto do autómato (o conjunto de informação externa que ele sabe ler) é composto por aquelas quatro situações. PF. conforme a tabela Tabela 1. Em cada uma destas quatro situações possíveis o controlador tem que tomar uma decisão: fecha. que poderemos associar a 4 caracteres de um alfabeto. Transições entre os estados em função dos caracteres de entrada lidos.4. Entrada Estado a 00 b 01 c 10 d 11 F F F A F A F A A A LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 33 .presença frontal. PR – presença na rectaguarda. b. como na figura seguinte b. detecta o fim da cadeia LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 34 .d.um ficheiro de entrada.um mecanismo para leitura do ficheiro de entrada de modo que lê a cadeia de entrada da esquerda para a direita. Depois deste dois exemplos muito simples. 2 que este autómato se chama por isso de Máquina de Moore.d c A/1 F/0 a Figura 1. Obtém-se a figura seguinte. estamos em condições de definir um autómato mais detalhadamente.d.9. um carácter de cada vez. O autómato anterior com a representação da saída.c. Poderemos introduzir essa informação colocando sob a letra do estado o valor lógico correspondente da saída.a b.d c A F a Figura 1. Como é que o controlador fecha e abre a porta? Enviando um sinal a um actuador mecânico.Teoria da Computação Capítulo 1 – Introdução e Definições Básicas Agora é fácil desenhar o grafo do autómato. com os dois nós correspondentes aos estados e as arestas correspondentes à 8 transições da tabela.4.a b. Poderemos assim considerar que o autómato tem uma saída que pode ter dois valores: 1 para abrir. Um autómato genérico tem os seguintes componentes: . Veremos no Cap. O autómato finito que representa o sistema de controlo de abertura da porta .4.c. composto por uma cadeia num alfabeto . 0 para fechar.10. .4. Ficheiro de entrada Sk Unidade de Controlo qk Ficheiro de saída mk M e m ó r i a yk Figura 1. sequencialmente.11. Representação genérica de um autómato finito. e o mecanismo de entrada está a ler um símbolo sk no ficheiro de LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 35 . 1.uma saída.4. onde a unidade de controlo pode escrever . pode mudar de estado segundo alguma regra. Juntando tudo teremos a Fig. O autómato funciona em tempo discreto.11. cada uma capaz de armazenar um símbolo de um alfabeto (que pode ser diferente do alfabeto de entrada).Teoria da Computação Capítulo 1 – Introdução e Definições Básicas . Um autómato concreto pode não ter memória (como os exemplos que vimos). Mas todos têm a unidade de controlo e a entrada. k. O autómato pode ler e alterar o conteúdo dos registos de memória. Num dado instante k está num certo estado interno.um dispositivo de memória temporária composto por um número ilimitado de células. O que lhe dá a característica de finito é tão só o número de estados da unidade de controlo: ele é finito. ou pode não ter saída (como o aceitador de pai).uma unidade de controlo que pode estar num de entre um certo número finito de estados internos. Esta figura é muito geral. sk. não têm saída informam pelo estado final em que terminam a leitura da entrada transdutores se produzem cadeias de caracteres na saída com alguma utilidade ii) a natureza da memória temporária (o factor mais importante)sendo autómatos finitos se não sem têm memória temporário ou autómatos de pilha se têm uma memória em pilha LIFO (em inglês pushdown automata. Todos ao autómatos que estudaremos se enquadram nesta descrição genérica. máquinas de Turing se têm a memória em fita. Chama-se configuração do autómato ao conjunto composto por . mk. que pode ser lida e alterada em qualquer ordem LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 36 . Chama-se um passo à transição do autómato de uma configuração para a configuração seguinte. qk+1 = f(qk. o estado interno do autómato vai ser determinado pelo estado actual. pelo símbolo lido à entrada e pelo conteúdo da memória. sendo aceitadores se reconhecem ou não a cadeia de entrada. da entrada actual e do conteúdo actual da memória. de empurrar (a pilha) para baixo ). mk) Entre dois instantes do tempo sucessivos pode produzir-se uma saída ou pode alterarse o conteúdo da memória.o ficheiro de entrada e . de dimensão infinita. Essa dependência é definida pela função de transição de estado f. No próximo instante de tempo.o conteúdo da memória. .Teoria da Computação Capítulo 1 – Introdução e Definições Básicas entrada.o estado interno da unidade de controlo. ou seja. que depende por isso do estado actual. Os diversos tipos que estudaremos distinguem-se por i) a forma de produzir a saída . soma de n números.. que calcula o n-èsino número primo. ou se a palavra “public” está bem escrita num programa de computador em Java. dizendo-se determinísticos se dada uma configuração. 1.. LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 37 . ou da função g. f (n)  n  ésimo  número  primo trata-se de uma função unária. Por exemplo. m)  n  m função binária. produto de dois números. por exemplo). o próximo passo pode ter várias alternativas. de dois argumentos m e n ou ainda da função h. o que queremos dizer exactamente ? Em primeiro lugar computação poder ser o cálculo do valor numérico de uma função. Ou então queremos saber se uma cadeia é um palíndromo. dado que desde muito cedo o homem precisou de fazer cálculos matemáticos (para calcular o calendário. g (n. h  a1  a2  . Na era do computador digital há outros tipos de computação. poderemos ter uma cadeia de 0’s e 1’s e calcular a sua paridade. existe um e um só comportamento futuro possível ou não determinísticos se dada uma configuração. é aliás tão antigo quanto a civilização humana. como por exemplo da função f(n). Este tipo de computação é mais antigo do que os computadores digitais.5. ou o número de zeros.Teoria da Computação Capítulo 1 – Introdução e Definições Básicas iii) a natureza da função de transição.  an função n-ária (de n argumentos). Os três paradigmas da computação Quando falamos em computação. 111. Comecemos pela verificação da primeira razão. o segundo paradigma da computação. Construa-se no alfabeto ={1} a linguagem composta por cadeias de 1’s que têm um comprimento igual a um número primo: L ={1n. n vezes Isto é L={11.Teoria da Computação Capítulo 1 – Introdução e Definições Básicas Este tipo de computação parece nada ter ver. mas decidir de modo fundamentado. O problema de reconhecimento de linguagens domina a teoria da computação. …} Agora temos o problema de reconhecimento de linguagens . com a computação do valor de funções. Como as cadeias de símbolos formam linguagens. em que como sabemos 1n = 111…1 .o número natural n é primo ? Trata-se de um problema de decisão: decidir se é ou não. à partida. Trata-se do reconhecimento. 1111111.a cadeia 1n pertence à linguagem L ? LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 38 . n primo}. de cadeias de símbolos. 11111. este tipo de computação chama-se por isso reconhecimento de linguagens. Considere-se o problema de decisão seguinte . Falaremos dele repetidamente até ao final da disciplina e ele ocupa a maior parte dos livros de teoria da computação. Porque é assim tão importante? Em primeiro lugar porque é muito representativo: pode-se reduzir qualquer problema de decisão a um problema de reconhecimento de linguagens. Em segundo lugar porque o problema do cálculo do valor de uma função pode também ser reduzido a um problema de reconhecimento de uma linguagem. ou classificação. 1. Vejamos como. etc. i) Qualquer caso de computação de uma função pode ser reduzido a uma instância do reconhecimento de uma linguagem.5.5. deslocando-a para a esquerda ou para a direita.1. qual o mais importante? De facto nenhum é mais importante do que o outro.Teoria da Computação Capítulo 1 – Introdução e Definições Básicas equivalente ao problema de decisão acima enunciado. Inter-redutibilidade entre os três paradigmas da computação. m é o n-ésimo número primo Tabela 1. Cálculo de funções f(n) Reconhecimento de Linguagens Transdução de cadeias Figura 1. a transformação de uma cadeia de símbolos por exemplo revertendo-a. Verifica-se até o princípio da inter-redutibilidade (Fig. De entre os três paradigmas da computação. ou seja. Função n-ésimo número primo LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 39 .5. Exemplo 1. Além do cálculo do valor de uma função ou do reconhecimento de uma linguagem temos outro tipo de computação: o da transdução de cadeias. Temos aqui o terceiro paradigma da computação. contando o número de a’s. Seja a função f(n) = m .1.1): qualquer instância de um dos três paradigmas de pode reduzir a uma instância de qualquer um dos outros dois.5.1. naquele conjunto de cadeias. 2.Teoria da Computação Capítulo 1 – Introdução e Definições Básicas n 1 2 3 4 5 6 … f(n) 2 3 5 7 11 13 … Suponhamos que queremos calcular f(5) = ?? Para reduzir este cálculo a um problema de reconhecimento de linguagens faça-se a construção engenhosa seguinte (inspirado em Taylor): 1º Usando a representação binária de números naturais. 101#1011 Assim. constroem-se as cadeias que resultam da concatenação de 101. ficamos a saber que f(5)=11 ii) Redução de uma classificação de cadeias a uma computação numérica de uma função LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 40 . isto é 5 em binário. 6. 4. com os números naturais (1. …). procurando-a. usando por exemplo # como separador: 101#1 101#10 101#11 101#100 101#101 101#110 101#111 … 2º Define-se agora a linguagem L associada aos números primos L ={Binário(n)#Binário(m)} (não esquecer que m é o n-ésio número primo). 3. 5. De facto há-de lá estar. A computação do valor de f(5) é equivalente à determinação de qual a única cadeia daquele conjunto que pertence a L . de modo que cada símbolo fique associado a um e um só número natural em binário. Claro que para cada caso é necessário desenvolver o engenho para encontrar a forma de implementar o princípio da inter-redutibilidade. …} A função característica de L será 1. basta calcular o valor da função característica (25) que é 1. LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 41 .se n é o código de um palíndromo  0. Por isso é o que usaremos ao longo da cadeira. Em segundo lugar constrói-se a linguagem dos palíndromos.0101.aaa. 011001. Em primeiro lugar faz-se uma codificação dos símbolos do alfabeto. em ={a. e assim se conclui que aba é um palíndromo.1010. se a = 01 e b = 10.b.. Mas este princípio é muito importante: ele permite que se use o problema da identificação de linguagens em teoria da computação como representativo dos três paradigmas.bab.aa.bb. … e os seus códigos. L(Pal)= {a. Por exemplo. L(Pal). então o palíndromo aba resulta no número natural 011001=2510.b}.100110.Teoria da Computação Capítulo 1 – Introdução e Definições Básicas Tomemos o caso do reconhecimento de palíndromos. Códigos= {01.101010. bbb. se n não o é  ( n)   Agora para se saber se 25 é o código de um palíndromo. O que importa saber é que é sempre possível encontrar uma solução.10. aba.010101. … … LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 42 . 1998. 2nd Ed. Anexo 1. 2001 Models of Computation and Formal Languages. John Hopcroft. PWS Publishing Co. Jeffrey Ullman. Tabela de números primos 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 101 103 107 109 113 127 131 137 139 149 151 157 163 167 173 179 181 191 193 197 199 211 223 227 229 233 239 241 251 257 263 269 271 277 281 283 293 307 311 313 317 331 337 347 349 353 359 367 373 379 383 389 397 401 409 419 421 431 433 439 443 449 457 461 463 467 479 487 491 499 503 509 521 523 541 547 557 563 569 571 577 587 593 599 601 607 613 617 619 631 641 643 647 653 659 661 673 677 683 691 701 709 719 727 733 739 743 751 757 761 769 773 787 797 809 811 821 823 827 829 839 853 857 859 863 877 881 883 887 907 911 919 929 937 941 947 953 967 971 977 983 991 997 1009 1013 1019 1021 1031 1033 1039 1049 1051 1061 1063 1069 1087 1091 1093 1097 1103 1109 1117 1123 1129 1151 1153 1163 1171 1181 1187 1193 1201 1213 1217 1223 1229 1231 1237 1249 1259 1277 1279 1283 1289 1291 1297 1301 1303 1307 1319 1321 1327 1361 1367 1373 1381 1399 1409 1423 1427 1429 1433 1439 1447 1451 1453 1459 1471 1481 1483 1487 1489 1493 1499 1511 1523 1531 1543 1549 1553 1559 1567 1571 1579 1583 1597 1601 1607 1609 1613 1619 1621 1627 1637 1657 1663 1667 1669 1693 1697 1699 1709 1721 1723 1733 1741 1747 1753 1759 1777 1783 1787 1789 1801 1811 1823 1831 1847 1861 1867 1871 1873 1877 1879 1889 1901 1907 1913 1931 1933 1949 1951 1973 1979 1987 1993 1997 1999 2003 2011 2017 2027 2029 2039 2053 2063 2069 2081 2083 2087 2089 2099 2111 2113 2129 2131 2137 2141 2143 2153 2161 2179 2203 2207 2213 2221 2237 2239 2243 2251 2267 2269 2273 2281 2287 2293 2297 2309 2311 2333 2339 2341 2347 2351 2357 2371 2377 2381 2383 2389 2393 2399 2411 2417 2423 2437 2441 2447 2459 2467 2473 2477 2503 2521 2531 2539 2543 2549 2551 2557 2579 2591 2593 2609 2617 2621 2633 2647 2657 2659 2663 2671 2677 2683 2687 2689 2693 2699 2707 2711 2713 2719 2729 2731 2741 2749 2753 2767 2777 2789 2791 2797 2801 2803 2819 2833 2837 2843 2851 2857 2861 2879 2887 2897 2903 2909 ….. 3rd Ed. Oxford University Press.. Harry Lewis and Christos Papadimitriou. Elements for the Theory of Computation. 2nd Ed. R. Introduction to Automata Theory. Languages and Computation.. Addison Wesley. 1998. 2001. Jones and Bartelett Computer Science. Introduction to the Theory of Computation. 1997. Gregory Taylor. Michael Sipser. Peter Linz. Prentice Hall. Rajeev Motwani.Teoria da Computação Capítulo 1 – Introdução e Definições Básicas Bibliografia An Introduction to Formal Languages and Automata. A arte de construir DFA’s 59 2. Autómatos Finitos CAPÍTULO 2 AUTÓMATOS FINITOS 2.4.3. Linguagens regulares 75 2. Introdução 45 2.6 Equivalência entre DFA’s e NFAs 85 2.8 Aplicação dos DFAs na busca de texto 105 2.Teoria da Computação Capítulo 2 .9 Autómatos transdutores 107 Máquinas de Mealy 108 Máquinas de More 109 Bibliogafia 112 Apêndice: Software de autómatos finitos 112 JFLAP Deus ex-máquina LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 43 .Aceitadores determinísticos 46 2.1.7.5.2. Autómatos finitos não-determinísticos (DFAs) 83 2. Redução do número de estados em Autómatos Finitos 97 2. Teoria da Computação LEI/DEI/FCTUC/2009/@ADC Capítulo 2 . Autómatos Finitos Documento de trabalho 44 . Caso contrário não pertenceria. Pode-se agora pôr o problema ao contrário: dada uma cadeia de caracteres. Mas para uma cadeia grande de um gramática mais elaborada. Felizmente para algumas classes de linguagens é possível construir autómatos finitos aceitadores: é o caso por exemplo das linguagens regulares. LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 45 . decidir se pertence ou não. Conhecidas as suas produções é fácil derivar cadeias da linguagem. Autómatos Finitos 2. Podem-se definir muitas linguagens a partir de um mesmo alfabeto. aaaabbbb.1 estudámos as noções básicas de linguagens. então para se saber se uma cadeia pertence a uma linguagem bastaria dá-la a ler ao autómato. gramáticas e autómatos. não é fácil decidir.aabbbbb. aaabbb. Infelizmente não é possível desenhar um autómato para uma qualquer linguagem. É aqui que entram os autómatos finitos. Por exemplo a partir do alfabeto Σ = {a. Vimos no Cap. …ou a linguagem L2 = { anbn | n >= 0 } a que pertencem as cadeias: λ.. Se ele parasse no estado aceitador depois de concluir a sua leitura. por inspecção visual. 1 um autómato aceitador da cadeia pai. Introdução No Cap. a cadeia pertenceria à linguagem. cujas propriedades veremos mais à frente. bbbb.Teoria da Computação Capítulo 2 .incluindo λ. ou ainda L3 = {a.b}* composta por qualquer cadeia de a’s e b’s . aaaa.1. cada uma delas com características próprias. Se fosse possível construir um autómato que aceitasse todas as cadeias de uma dada linguagem (e só essas).aabb. que indica como se formam as cadeias de caracteres.ab.m >= 0 }a que pertencem as cadeias : λ. b} e usando a notação de conjuntos poderemos definir as linguagens L1 = { anbm | n. Há linguagens para as quais ainda hoje não é possível decidir se uma cadeia lhe pertence ou não. Por agora basta-nos saber que é possível construir um autómato finito aceitador para uma linguagem regular. conforma as regras particulares de combinação dos caracteres do alfabeto. Num mesmo alfabeto pode-se definir um número infinito de linguagens. Quantas linguagens se podem definir com este alfabeto ? As linguagens podem ser definidas por uma gramática. como saber se pertence a uma dada linguagem ? Se a cadeia for pequena pode ser relativamente simples. 1.Teoria da Computação Capítulo 2 . Para as linguagens regulares. LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 46 . gramáticas e autómatos. 2. naturalmente distintos dos das linguagens regulares. Existem outras classes de linguagens. distinguindo-se a sua função de aceitador dentro do contexto em que é usado. 1). as mais simples. Exemplo 2.1. Aceitadores determinísticos Um aceitador determinístico define-se como uma estrutura matemática e desenha-se como um grafo. Quando um autómato é usado para reconhecer uma linguagem. que não regulares. os autómatos também mais simples. isto é. é mais exacto chamar-lhe aceitador. No entanto usaremos com frequência o termo autómato. Linguagens L Gramáticas G Geram as cadeias de L Autómatos Reconhecem as cadeias de L Figura 2.1.1. constroem-se autómatos finitos determinísticos. Como veremos existem autómatos que não são aceitadores. Autómatos Finitos Teremos assim a Figura 2. Vemos assim que há diferentes classes de linguagens e diferentes classes correspondentes de autómatos. mas antes para executarem sobre as cadeias de caracteres uma dada operação (como aliás já vimos no Cap. não são construídos para aceitar ou não uma linguagem. para as quais é possível também construir autómatos aceitadores. Relação entre linguagens.1.2.2. Estando em q0 e lendo 1. então aceita essa cadeia. que também. O seu alfabeto é Σ={0. estando em q1. LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 47 . Lendo agora 0. porque não há mais nada para ler. Mas há cadeias de outro tipo. transita para q2. etc. Se depois do último 1 aparecem dois zeros seguidos (e mais nada) ele termina também no estado aceitador.Teoria da Computação Capítulo 2 . Se estiver em q0 e aparece um 1. O autómato está no estado inicial. e apresenta-se-lhe à entrada uma cadeia de 0’s e 1’s. vai para o aceitador. o seu último será sempre o aceitador de ele ler apenas mais um 1. Portanto o autómato aceita as cadeias que terminam num 1 ou em 00 depois do último 1. fica onde está. As arestas representam as transições de estado quando o autómato lê o carácter etiqueta da aresta. Vejamos como funciona. como por exemplo 0100. Por exemplo 001.1}. q0. vai para o aceitador. transita para q2. Autómatos Finitos Por exemplo o grafo seguinte representa um aceitador determinístico. mantém-se no aceitador. Ele é o estado aceitador. Então conclui-se que qualquer cadeia que termine num 1 é aceite pelo autómato: de facto qualquer que seja o seu penúltimo estado. Se o autómato.1 Grafo de um aceitador determinístico. isto é 1 >1 > 0 >0. se estiver em q1 e aparece um 1. 0100. 1110001. Ele vai ler os caracteres da esquerda para a direita. 1 0 0 Início q0 1 q2 q1 0 1 Figura 2. transita para q1.2. partindo do estado inicial. leu a cadeia 1100 e terminou no estado aceitador. O estado q1 tem uma forma especial. são aceites. isto é. Estando em q2 e lendo 1. Poderemos ver outras que também aceita. Se estiver em q2 e aparece um 1. Lendo depois 0 transita para q3 e aí fica. com por exemplo 1100. Note-se que esta definição que estamos a adoptar não é seguida por todos os autores. uma para cada carácter do alfabeto. um estado final. Consequentemente todas as transições possíveis têm que estar explicitamente definidas. Pode-se simplificar o grafo colocando apenas uma aresta com duas etiquetas. quaisquer que sejam os caracteres seguintes na cadeia lida (mais tarde chamaremos ratoeira a este estado). está explicitamente definida para todos os valores do seu domínio. isto é.b.Teoria da Computação Capítulo 2 . um estado inicial. Tem cinco partes: um conjunto de estados. isto é. Nestes. um alfabeto de entrada que define os caracteres aceitáveis à entrada. Veremos casos que têm vários estados finais. porque tido lhe é dito: de cada estado há duas arestas definindo as duas transições possíveis. LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 48 .1 Figura 2. A função de transição é por isso uma função total. daí o nome de determinístico.c}. num dado estado. Autómatos Finitos Note-se que em cada estado o aceitador determinístico sabe exactamente o que deve fazer. passa a um estado não aceitador e não sai mais de lá. então de cada estado teriam que partir sempre três arestas explicitamente definidas (ainda que pudessem ser iguais). Um aceitador determinístico não tem qualquer capacidade de decidir em qualquer circunstância.2 Grafo do mesmo aceitador da Fig.2. Vimos que um autómato finito determinístico é facilmente definido e descrito por um grafo. 2. se aparecer à entrada. Para definir formalmente o autómato. usaremos todas essas cinco partes que compõem um quinteto. o DFA morre.1 Se tivéssemos uma alfabeto com três caracteres (por exemplo {a. 1 0 Início q0 0 1 q2 q1 0. com o na figura seguinte. Essas duas transições podem ser iguais. Alguns admitem que possam existir transições não definidas. um carácter para o qual não esteja explicitamente definida uma transição. com acontece no estado q2. um conjunto de regras para transitar entre eles.2. isso quer dizer que ela tem que estar definida para todas as combinações possíveis de um estado e um carácter do alfabeto.1 Aceitador determinístico Um aceitador determinístico (usaremos o acrónimo dfa-. F ) em que : Q: é o conjunto finito de estados internos Σ: alfabeto de entrada (conjunto finito de caracteres) δ : QxΣ →Q é a função total chamada função de transição q0 ∈Q é o estado inicial F ⊆ Q é o conjunto de estados finais ou aceitadores Uma função é total quando é definida para todos os valores possíveis dos seus argumentos. 1 Retomemos aqui o exemplo do interruptor do Cap. q0. Ao dizer-se que a função de transição é total. atendendo á sua definição.1 vê-se que LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 49 .Teoria da Computação Capítulo 2 . δ. caso contrário diz-se parcial. teremos P. PPPPP. colocando a dupla circunferência no estado A. um número ímpar de accionamentos do interruptor. etc. P F A P Figura 2.2. de deterministic finite accepter) é definido pelo quinteto M=(Q.3 Grafo do interruptor do Cap. Agora poderemos definir o autómato como um aceitador dessa linguagem. 1.. Exemplo 2.Σ. PPP.2. para todos os elementos do produto cartesiano QxΣ.2. O interruptor do Cap. Se definirmos a linguagem das sequências de Press(P) tais que o interruptor fica ligado após a sua aplicação (partindo do estado inicial F). Autómatos Finitos Definição 2. 1. ou seja.2. isto é. Aplicando-lhe a definição 2. função de transição: 1× a→ 2. alfabeto de entrada: {a. alfabeto de entrada: {P} δ . uma para a e outra para b. o estado final: {A} Exemplo 2. função de transição: F× P → A. Autómato do exemplo 2. LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 50 . é o estado inicial: 1 F.4. o estado final: {4} Neste caso a função de transição tem muitos elementos.3 Aplicando-lhe de igual modo a definição 2. A} Σ .3. a tabela tem que ter todas as células preenchidas.2.3. a Seja o autómato da Fig. q0 .2.2. A × P→ F q0 .4.Teoria da Computação Capítulo 2 . é o estado inicial: F F.2.2. 2 × b→ 3. Usando uma tabela especifica-se mais facilmente. Autómatos Finitos Q.b} δ . a 1 b 2 3 a b b b 4 a Figura 2. 2.4} Σ . Note-se que pelo facto de a função de transição der total.1 vê-se que: Q. conjunto de estados internos: {F. 1 × b→ 4. Neste caso para cada estado existem duas arestas possíveis. etc. conjunto de estados internos: {1. e por isso chama-se estado ratoeira. Tabela de transições do DFA da Fig. Tem apenas dispositivo de leitura e unidade de controlo. 2.2. Se estado e a entrada o estado actual é actual é seguinte será 1 a 2 1 b 4 2 a 4 2 b 3 3 a 3 3 b 4 4 a 4 4 b 4 Qual será a linguagem aceite por este autómato ? O estado 4 tem uma característica: se o autómato lá chegar.3.2. ou armadilha (trap) ou poço. 1 ao caso particular de um dfa. LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 51 . dá-se ou não uma transição de estado dentro da unidade de controlo.Teoria da Computação Capítulo 2 . A figura seguinte reduz o esquema geral de um autómato que vimos no Cap. Autómatos Finitos Tabela 2. Conforme o conteúdo actual da célula lida. Note-se que um dfa não tem nem dispositivo de memória nem cadeia de saída. nunca mais de lá sai.1. símbolo na saída (caso a tenha) δ Figura 2.2. O esquema de um DFA.2.2 Um autómato representa-se por um grafo em que os vértices Símbolo (nós) qi representam os estados e as arestas orientadas têm como Significado etiquetas Estado normal os caracteres lidos na cadeia de entrada. carácter de entrada estado actual estado seguinte.2.2.5. Há q0 três tipos de vértices.. Autómatos Finitos a cadeia de entrada a b b a b q0 q2 q1 Figura 2. A transição de um estado para outro depende do estado actual (antes da transição) e do carácter lido à entrada no instante actual. movida.6. indicados na Tabela Estado inicial 2. Note-se a ausência de qualquer dispositivo de memória.2. ao lado qf [*] carácter LEI/DEI/FCTUC/2009/@ADC Documento de trabalho Estado aceitador (ou final) Aresta 52 . Tabela 2. A função de transição de um DFA.Teoria da Computação Capítulo 2 . 1}.Teoria da Computação Capítulo 2 . Neste momento poderemos fazer o seguinte procedimento heurístico: -colocamo-nos no estado aceitador e vemos como lá poderemos chegar.4 1 q2 q1 q0 início 0 0 1 0 1 Figura 2. O DFA pode-se assim definir formalmente como M= (Q.2.1}.q0. Σ..2. Lendo com atenção as etiquetas das arestas pode-se escrever a seguinte tabela de transições. S.q1.2.4. Tabela 2.2. LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 53 . F = {q2} e δ é definida pela Tabela 2. Σ = {0. O alfabeto do autómato é Σ= {0.2. um de cada tipo. . Função de transição do exemplo 2. Entradas 0 1 q0 q1 q0 q1 q2 q0 q2 q1 q0 Estados Qual será a linguagem aceite pelo autómato? Um bom desafio para o leitor .F) com Q = {q0.4.2. Temos um autómato com três estados. Autómatos Finitos Exemplo 2.7 DFA do exemplo 2.3. No Capítulo 3 estudaremos as expressões regulares. uma técnica de especificação de linguagens que tem uma álgebra própria muito adequada para deduzir a definição da linguagem a partir de um DFA qualquer.4..q2}. Autómatos Finitos -depois andamos para trás e em cada estado vemos o mesmo.8. fazem com que o autómato alcance um dos estados finais depois de toda a cadeia ter sido lida. De modo que sempre que uma cadeia termine em 100.5 0 1 0 q0 Início q1 1 Fig.6 1 1 Início q0 q1 0 Fig. 2. Mas aceita se terminar em 10000.2. com (****)0. Chega-se ao estado final a partir de q1 com um 0. ou qualquer número par de zeros precedido de 1. a linguagem L aceite (ou reconhecida) por M é o conjunto de todas as cadeias que.9. Escreve-se L(M) para dizer que L é a linguagem aceite ou reconhecida por M.7 LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 54 . Chega-se a q1 com um 0 depois de 1: (***10)0. 2.2. Exemplo 2. começando a ser lidas no estado inicial. M.2.2. termina no estado aceitador. 0 Exemplo 2. Linguagem de um DFA Dado um DFA qualquer. ou seja. Que linguagens aceitam os seguintes autómatos ? Exmplo 2.2. Até que se consiga visualizar mentalmente a linguagem do autómato. Se terminar em 1000 não aceita a cadeia.2. Poderemos definir formalmente linguagem de um autómato finito.Teoria da Computação Capítulo 2 . 1000000. Definição 2.2a. Obtéma se assim a Fig. q2 e q3.b}. Autómatos Finitos 0 1 1 q0 0. 2. a) = q0 q0 q1 q2 δ (q1.2. facialmente se desenha o seu grafo. b) = q2 Nas transições aparecem três estados q1.Teoria da Computação Capítulo 2 . encontrar um outro com menos estados que aceite a mesma linguagem (e só a mesma) ? LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 55 .2. {a.10 Um DFA pode ser definido pela explicitação da função de transição e.11 q2 a.2. O grafo do autómato desenha-se “graficando” as transições. q1. δ. q0. b) = q2 a b δ (q1. a) = q2 δ (q2. 2 .2.1 0 q1 q2 Fig. a q0 b q1 b Fig. isto é. 2. a) = q1 Tabela de transições δ (q0. {q2}) cuja função de transição é a seguinte: δ (q0. q2}.8 Seja o DFA M = ({q0. a partir dela. b) = q2 q1 q0 q2 q2 q2 q2 δ (q2.11. depois de se desenharem os seus três estados.b Será possível simplificar este DFA. Exemplo 2. A função de transição estendida é assim definida por δ*: Q ×Σ* → Q LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 56 . em que o asterisco quer dizer “após um certo número de transições…”. b q2 a. 2. seria interessante dispor de uma forma de representação sucinta.11. Neste momento poderemos apenas olhar com atenção para o DFA e verificar o que ele faz. transita para q2 .12. vai para o aceitador q2.b}* que contenham pelo menos um b.2. e se estiver em q2 e aparecer um b. O autómato seguinte aceita essa linguagem. ele aceita-a: a sua linguagem é portanto o conjunto de todas as cadeias em {a. Portanto qualquer que seja o seu estado se parecer um b na cadeia de entrada. 2. Se quisermos calcular a transição do DFA de uma configuração inicial para outra configuração após um conjunto de transições. δ* Na definição do DFA a função de transição é definida de tal forma que ela é activada por um carácter.Teoria da Computação Capítulo 2 . no estado inicial. Se aparecer um b. compacta. reduzindo ao mínimo possível o número de estados.2. Grafo equivalente ao da Fig. mantém-se aí. Pode-se estender a noção de transição com esse objectivo.b Função de transição estendida a cadeias de caracteres. que exprimisse essa transição “salto” resultante da leitura de um conjunto de caracteres ou de uma cadeia completa. Se estiver em q1 e aparece um b. Autómatos Finitos Veremos em capítulos posteriores algoritmos para simplificar autómatos. a q0 Fig. Em vez de δ escreve-se δ*. Para o exemplo anterior teremos : δ* (q0.13. w). b)=q2 LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 57 .2. a) = q1 e δ(q1. b) = q2 então δ*(q0.2.λ)= q (ii) δ*(q. a). a q0 b q1 q2 δ ab q0 δ q2 δ* a) Função de transição b) Função de transição estendida Figura 2. e . ab)=δ (δ* (q0. se tivermos num autómato tal que δ(q0. λ). teremos a Fig.13. Em a) grafo normal. a) para todo o q∈ Q. b) δ*(q0. Por exemplo. Autómatos Finitos em que . ab)=δ ( q1. ab)=q2 Representando por grafos. Ilustração da função de transição estendida. aλ)=δ (δ*(q0.o seu segundo argumento é uma cadeia em vez de um carácter. w∈Σ*. a)=q1 δ*(q0.Teoria da Computação Capítulo 2 . em b) grafo compactado usando uma transição estendida. 2. A função de transição estendida pode definir-se recursivamente do modo seguinte: (i) δ*(q.wa)=δ (δ* (q. a∈Σ. a)=δ (q0.o seu valor de saída dá o estado do autómato depois de ler a (sub)cadeia. a)=δ* (q0. a linguagem das cadeias em {a. 2.2b. a a q0 q0 b b q1 q1 a.Linguagens de um DFA (definição formal) A linguagem L aceite (ou reconhecida) por um DFA M =(Q. O conjunto das cadeias em que isso se verifica constitui o complemento da linguagem L(M).Teoria da Computação Capítulo 2 .2. w)∈F } A função de transição δ e δ* são funções totais (definidas para todos os elementos do seu domínio). no mesmo alfabeto. não podendo fazer escolhas. pára num estado não aceitador. e se tem pelo menos um b não contém só a’s. i. L(M) = {w∈Σ* : δ*(q0. aceitando-as ou não. F) é o conjunto de todas as cadeias em Σ aceites por M.e.b a. e por isso o autómato se chama determinístico. as cadeias que tenham apenas a’s. diferentes apenas na identificação do estado final.b}. como vimos. Σ.b}* que tenham pelo menos um b. 2. O segundo aceita. Isto é. Quando não aceita uma cadeia. Autómatos Finitos Definição 2..2. LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 58 .2 14.b Figura. Um autómato processa todas as cadeias em Σ*. que se pode definir formalmente por Complem(L(M)) = {w∈Σ* : δ*(q0. δ. q0. w)∉F } Consideremos os autómatos da Fig. a linguagem do segundo é o complemento da linguagem do primeiro: se uma cadeia só tem a’s não tem nenhum b. Em cada passo define-se um e um só movimento. Autómatos complementares no alfabeto {a. O primeiro reconhece.14. LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 59 .: . e o estado aceitador do primeiro é o estado não aceitador do segundo. no alfabeto Σ ={0. e a sua construção (em grafo) é relativamente expedita.3. então o complemento de L será reconhecida pelo autómato que se obtém de M invertendo neste a função dos estados: os não aceitadores passam a aceitadores e os aceitadores passam a não aceitadores. 2. A arte de construir DFA’s Os exemplos de autómatos que vimos até aqui parecem simples. é fácil de ver a relação entre os autómatos de linguagens complementares. . Autómatos Finitos Repare-se que o estado não aceitador do primeiro autómato é o estado aceitador do segundo. Será assim no geral ? De facto é.e se uma cadeia é recusada pelo primeiro tem que ser aceite pelo segundo: se uma cadeia termina no estado não aceitador do primeiro tem que terminar no estado aceitador do segundo.2.1}. aceite todas as cadeias com um número ímpar de 1’s.9 Paridade individual Desenhar um autómato que. A expertise para desenhar DFAs depende mais da arte aprendida e treinada do que de uma teoria sofisticada. Vejamos um exemplo: Exemplo 2. Se um autómato M aceita uma linguagem L(M). De facto.Teoria da Computação Capítulo 2 . Casos há em que é bem mais difícil obter uma solução simples (na medida do possível) e apropriada para uma dada função.se uma cadeia é aceite pelo primeiro não o pode ser pelo segundo: uma cadeia que termine no estado aceitador do primeiro tem que terminar no estado não aceitador do segundo. Para este autómato com dois estados. para já. se não for deve estar noutro.1)=I. que podemos desde já desenhar. muito provavelmente obteremos um autómato confuso. P I Figura 2. uma solução. Logo δ (P. é porque até ao momento entrou um número par de 1s. E então desenhe-se a transição correspondente: δ (P. naturalmente. com mais ou menos remendos. passa a ímpar. Os estados do autómato de paridade individual Se o DFA está em P e lê 1 na entrada.1. por tentativa e erro. Em vez disso. Se o conseguirmos. partindo de um algoritmo mental para a folha de papel. Temos então (pelo menos) dois estados: Par (P) e Ímpar (I). até que consigamos. pensemos numa abordagem mais sistemática. Se agora entra mais um. Ora num problema qualquer. Autómatos Finitos Podemos começar a desenhar estados e arestas. é-lhe perfeitamente indiferente e por isso deve manter-se em P. a cadeia deve ser aceite porque entrou até ao momento um número ímpar de 1s.Teoria da Computação Capítulo 2 . O estado contém por isso a história até a um certo ponto da cadeia. Em primeiro lugar quantos estados terá que ter o nosso autómato ? Lembremo-nos do significado de um estado: o autómato chega lá depois de um certo número de transições resultantes da leitura de uma cadeia.0)=P. Se for par deve estar num certo estado. E se lê um zero estando em P ? Como nada lhe é pedido em relação aos zeros. o que deve memorizar o autómato? Apenas a informação mínima para ser capaz de responder ao que se lhe pede: neste caso lembrar-se da paridade do número de 1s entrados até ao momento. Temos então. O estado que corresponde a ímpar deve ser aceitador porque se não há mais nada para ler. com mais estados do que o necessário. difícil de interpretar por outrem. o que acontece ? Se está em P. LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 60 .3. onde o DFA deve estar antes de iniciar a leitura da cadeia. fica um número par. Simulando o seu funcionamento verifica-se que cumpre a sua missão.0)=I. todas as cadeias com um número par de 1s ? Facilmente se obtém. O estado aceitador também. 2. e por isso P é o estado inicial. seguindo o mesmo algoritmo mental. E se quiséssemos um DFA que aceitasse. Pela mesma razão de cima.2.3. 2. no mesmo alfabeto. Concluímos assim o desenho do DFA requerido na Fig.3 0 1 0 P I 1 Figura 2. 1 Documento de trabalho 61 . Autómatos Finitos 0 1 P I Figura 2. Ora zero é número par. Autómato de um número par de 1’s.4. δ (I.3.3.1)=P.Teoria da Computação Capítulo 2 . o autómato da Fig. 0 1 Figura 2.4. Entrando mais um. e por isso δ (I.3 Autómato de paridade de 1’s completo. pelo que se lhe coloca a setinha.3. Falta apenas identificar o estado inicial. quando entraram zero 0s e zero 1s. Transições a partir de P Faça-se de seguida o mesmo raciocínio par ao estado I.3. Todas as transições possíveis estão agora identificadas. Notem-se as semelhanças e diferenças relativamente ao anterior LEI/DEI/FCTUC/2009/@ADC 0 I P . Ele está lá porque entrou um número ímpar de 1s. ou seja. 2 Paridade de grupo Desenhar um DFA que no alfabeto Σ={0. e a decisiva: quantos estados deve ter o autómato ? Ele tem que saber identificar a situação de paridade entre todas as situações de paridade possíveis. elas são: . ainda no alfabeto Σ ={0.número ímpar de 0s e número par de 1s.número ímpar de 0s e número ímpar de 1s. Autómatos Finitos Fica o leitor desafiado a verificar que os autómatos seguintes aceitam.número par de 0s e número ímpar de 1s.1} aceite todas as cadeias com um número ímpar de 0s e um número ímpar de 1s. LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 62 . as cadeias com um número ímpar de zeros e um número par de zeros.Teoria da Computação Capítulo 2 . Autómatos de paridade de zeros. b) par Exemplo 2.número par de 0s e número par de 1s. .3. A primeira questão. . . Temos aqui uma situação mais complicada porque a imparidade é exigida simultaneamente aos dois caracteres do alfabeto. E quais são ? Tendo em conta que temos que medir simultaneamente a paridade de 0s e de 1s. a) ímpar.5.1}. 1 1 0 0 I P P 1 1 I 0 0 a) b) Figura 2.3. Se pelo contrário aparece um 1. Autómatos Finitos Não havendo mais nenhuma situação relevante para o caso. Transições a partir de PI IP LEI/DEI/FCTUC/2009/@ADC 0 0 Documento de trabalho II 63 .3. até aí leu um número par de 0s e um número par de 1s. leu um número par de 0s e um número ímpar de 1s. se lê 1 passa a PP e se lê 0 passa a II.8. PP PI IP II Figura 2.7. se estão em PI. Se o autómato está em PP é porque leu até ao momento um número par de 0s e um número par de 1s. IP.3. chamem-se PP. Podemos então desenhar as arestas que partem de PP.3. 1 Figura 2. 1 PP PI 1 Figura 2. fica um número ímpar se 1s e um número par de zeros e vai assim para PI.6. Os estados necessários para o exemplo 2. sendo aceitador o II. fica um número ímpar de zeros e um número par de 1s e por isso tem que transitar para IP.6. PI. Estando em PP. concluímos que quatro estados serão suficientes. Se aparece agora um 0.Teoria da Computação Capítulo 2 . etc. Calculemos agora as suas transições. Transições a partir de PP PP PI IP II 0 Se o DFA está em PI (par 0s ímpar 1s) . II.3. 1 Exemplo 2.10.3. IP II 1 E juntando as duas condições.3.3.2. obtém-se o autómato com dois estados finais: LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 64 .3. O estado inicial (zero 0s e zero 1s) é PP porque zero é um número par. obtendo-se 1 PP PI 1 0 0 0 0 1 Figura 2. Se quisermos o DFA que aceita as cadeias com um número impar de 0s e um número par de 1s (IP).3.Teoria da Computação Capítulo 2 .9. Autómatos Finitos É agora fácil de ver que o autómato completo é representado pelo grafo seguinte. Grafo completo do exemplo 2. Grafo completo do exemplo 2. ímpar-ímpar ou ímpar-par. Desenhar o autómato aceitador da linguagem composta por todas as cadeias com um número ímpar de 0s e um número ímpar de 1s.3. basta mudar o estado aceitado no autómato anterior.3. 1 PP PI 1 0 0 0 0 1 IP II Figura 2. 3. Desenhe-se um DFA que em Σ ={a. 2 e 3.b} aceite todas as cadeias que tenham corridas de três ou mais a’s. dois. 1. O autómato tem que ser capaz de contar uma corrida de três a’s : zero.11. não pertencem. LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 65 . 0 a 1 a 2 a 3 Figura 2. A memória de um DFA só existe nos estados.3. bbbbbbabababaaaaabab. aabbbbbaabbabbbaab.Portanto baabbaaababab. A questão aqui é mais complicada do que a simples paridade. pertencem à linguagem. Autómatos Finitos 1 PP PI 1 0 0 0 0 1 Figura 2. Grafo do DFA aceitador de II ou de IP IP II 1 Exemplo 2.2.3. Como pode contar ? Tem que ter memória para isso (contar tem memória implícita). Contagem de sequências (corridas) de caracteres. mas baabaababbabbbb. O número do estado é o número de a’s seguidos contados até aí. Uma corrida de três é aaa.Teoria da Computação Capítulo 2 . Serão estes quatro estados suficientes? É o que vamos ver. No caso aaaa temos uma corrida de 4. três. um.12. e por isso para contar até três são precisos quatro estados a que chamaremos 0. Como contar 3 a’s. mas se de seguida aparece um b ele anula a corrida. Se aparece baab este último b obriga de igual modo ao reinício da contagem. a. LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 66 .14.13. Teremos portanto completo o grafo do autómato na Fig. a.b b 0 a 1 a 2 a 3 b b Figura 2. se a cadeia começa por b. obrigando ao reinício da contagem.13. Por isso pode-se colocar uma aresta do estado 3 para si mesmo com a ou com b. bbb. De facto depois da corrida de três a’s a cadeia é aceite independentemente do que acontecer a partir daí. 2. bb.b b a 0 a 1 2 a 3 Figura 2. DFA que conta corridas de 3 ou mais a’s.3.3. Por outro lado.14. Quer isso dizer que do estado 1 se volta ao estado 0 se aparecer um b na entrada. Temos para já a Fig. venham mais a’s ou mais b’s. Se aparece um a temos uma corrida de um a. 2. Autómatos Finitos Se depois de 3 a’s vier um quarto. E se aparece bab? Interessam-nos as corridas de a’s.3.Teoria da Computação Capítulo 2 . a cadeia continua aceite. E o autómato já vai tomando forma.3. o autómato conta sempre zero a’s e por isso existe uma aresta de 0 para 0 com b. bastaria trocar os a’s pelos b’s e os b’s pelos a’s nas arestas do grafo. No autómato respectivo.b a 0 b 1 b 2 b 3 b 4 a a a Figura 2. cria-se um estado inicial 0. respectivamente.3. Se em vez de uma corrida de três tivéssemos uma corrida de quatro ou cinco. Se aparece um a. Os nomes dos estados foram alterados para os relacionar com a sua função: chega a 2a depois de uma corrida de dois a’s e chega a 2b depois de uma corrida de dois b’s. Autómatos Finitos Fica o leitor desafiado a encontrar uma qualquer cadeia com uma corrida de três a’s que não seja aceite por este autómato. reinicia-se a contagem com retorno ao estado 0.Teoria da Computação Capítulo 2 . Desenhar o autómato que aceita no mesmo alfabeto {a. se for um b. Para corridas de três a’s. a. Para iniciar.15.3.4. Exemplo 2. inicia-se a contagem de b’s. A situação aqui complicou-se um pouco. quando surge um b. inicia-se a contagem de a’s. o autómato teria uma forma semelhante. Se em vez de corridas de a’s quiséssemos corridas de b. Mas agora quando aparece um b duas coisas têm que acontecer: por um lado a anulação da contagem de a’s e por outro lado o início da contagem de b’s. como na Fig. sabemos como fazer. DFA aceitador das cadeias com corridas de quatro ou mais b’s.16.3. com cinco ou seis estados. Para corridas de três b’s também sabemos como fazer. b} qualquer cadeia que tenha uma corrida de três a’s ou uma corrida de três b’s. LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 67 . Vejamos o problema por partes. quando aparece um a por um lado anula-se a contagem de b’s e por outro lado inicia-se a contagem de a’s.2. E de modo análogo. b .4: aceita corridas de três ou mais a´s ou corridas de três ou mais b´s LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 68 . a. A caminho da solução do exemplo 2.3.3. 1b. ou seja.4 b b 1b b 2b 3b Finalmente.3.b a 1a a 2a 3a a b b 0 a. A caminho da solução do exemplo 2. 18. a 1a 2a a ab 3a a a a 0 b b ab b 1b b 2b b 3b Figura 2.4 Agora vamos à corrida de a’s e quando aparece lá um b transita-se para o estado correspondente a um b.3. Autómato completo do exemplo 2.3. 2.17.3.18 que completa a resolução do exemplo. Autómatos Finitos Teoria da Computação a 1a a 2a 3a a 0 a.3.b b b 1b b 2b 3b Figura 2.16. na corrida de b’s procede-se de modo semelhante quando aparece um a e obtémse o autómato da Fig.b Figura 2.Capítulo 2 a. então não leu um número suficiente de zeros e tem que reiniciar o escrutínio.2. Iniciado.3.4. independentemente do que acontecer depois. Documento de trabalho 69 . ou pode já ter encontrado um. “00”.2. Se lê um 0. Estamos na Fig. O “Nada” será o estado inicial. 1 1 Ini 0 1 LEI/DEI/FCTUC/2009/@ADC 0 0 00 1 001 Figura 2. 0. Pode ainda não ter encontrado nenhum dos caracteres da sequência.Início da resolução do exemplo 2. 1 Estando em “00” se aparece 1 então apareceu 001 e a cadeia deve ser desde já aceite. Mas se em vez do 0 lhe aparece um 1. transitando por isso para o estado aceitador “001” e não saindo de lá mais.19. seja com 0 seja com 1. dois ou os três.3. está no bom caminho e transita para o estado “00”. 2. A primeira tarefa é determinar quais os estados que o autómato deve ter. o estado “0”. Chamem-se “Nada”. então pode ser o primeiro da sequência procurada e por isso transita para o estado de já ter lido um 0.Teoria da Computação Capítulo 2 .19 1 0 Ini 0 0 00 Figura 2. voltando assim ao estado inicial. Se de seguida lhe aparece um outro 0.1} que contenham a sub cadeia 001. “001”.20. “0”.3. Por exemplo 10010. São por isso necessários pelo menos quatro estados. 010010.4 Detecção de uma sub cadeia de caracteres Pretende-se um autómato que aceite todas as cadeias no alfabeto {0. 1010101010001111 pertencem a esta linguagem. Ele tem que reconhecer 001. Este último requisito alcança-se colocando uma aresta de “001” para si mesmo. DFA que reconhece a sub-cadeia 001. Autómatos Finitos Exemplo 2. mas 11010100 e 0101010 não pertencem. se lê um 1 isso não lhe interessa e deixa-se ficar. 3. Tabela 2.5. Desenhar um autómato que seja capaz de contar em módulo 2. Σ ={0. 1}. ou seja. 1.1 .3. 1.2 Contagem em módulo 2 N 0 Código 0000 Mod2 0 1 2 3 4 5 6 7 8 0001 0010 0011 0100 0101 0110 0111 1000 1 0 1 0 1 0 1 0 LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 9 10 1001 10010 1 0 70 . N Contagem dos números inteiros positivos e negativos -10 -9 -8 -7 -6 -5 -4 -3 -2 -1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 0 1 2 3 4 0 1 2 3 4 0 1 2 3 4 0 1 2 3 4 0 6 2 3 4 5 0 1 2 3 4 5 0 1 2 3 4 5 0 1 2 3 4 o 7 4 5 6 0 1 2 3 4 5 6 0 1 2 3 4 5 6 0 1 2 3 10 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 12 2 3 4 5 6 7 8 9 10 11 0 1 2 3 4 5 6 7 8 9 10 M 2 0 1 2 3 4 5 6 7 8 9 10 ó d 5 u l Exemplo 2. Contagem em módulo. 0. Autómatos Finitos Contagem em módulo n.3.2.Teoria da Computação Capítulo 2 . A tabela seguinte ilustra a contagem em módulo para números inteiros positivos e negativos. Os números a contar são codificados em binário.2. 2. 2. A contagem em módulo n é uma contagem de números inteiros cíclica que se inicia em zero e volta a zero n passos à frente. …. Sem perda de generalidade consideraremos apenas os números positivos. Tabela 2. teremos a Tabela 2. Por exemplo a contagem módulo 3 é 0. 22.Teoria da Computação Capítulo 2 . mantém-se no estado 0. mod2(5)=1) vai para o estado 1. por exemplo. modulo 2 dá 1) mantém-se no estado 1. se aparece um 1. Estando no estado 1 depois de ler 11: se aparece 0 (110) vai para o estado 0). 2. modulo 2 dá 0). e só é conhecido no fim da leitura. o estado final será o estado 0 . 10101111 pela ordem 1-0-1-0-1-1-1-1. Início da construção do DFA contador em módulo 2 1 0 1 Estando no estado 1. Isto quer dizer que o LSB (Least Significant Bit) é o lido mais à direita. transita para o estado 0. Autómatos Finitos A contagem em módulo dois tem dois resultados possíveis: 0 ou 1.3. falta definir o estado aceitador. se aparece um 0 (leu até agora 10. Se aparece um 0.21. se aparece 1 (111) mantém-se no estado 1. o estado final será o estado 1. o 0 (para contar 0) e o 1 (para contar 1). Por isso o autómato só necessita de dois estados. conta 1 e por isso vai para o estado 1. Continuação da construção do DFA contador em módulo 2 1 1 0 1 0 Estando no estado 0 depois de ler 10: se aparece 1 (101=5. iniciando-se a sua leitura da esquerda para a direita: o DFA lê. Inicialmente está no estado 0. O número a contar está codificado em binário. LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 71 . 0 Figura 2.se forem as cadeias que em módulo 2 dêem zero.3.23. O DFA conta com qualquer número de bits: só quando a cadeia acaba se conhece o seu tamanho.se forem as cadeias que em módulo 2 dêem um. 0 Figura 2.3. mantém-se no estado 0. Para que o DFA esteja completo. que depende da linguagem especificada: . se aparece 0 (100=4. Neste caso teremos a Fig. mod2(4)=0). Se aparece um 1 (leu até agora 11=3. Quatro estados serão em princípio suficientes. Desenhar o DFA capaz de contar os números inteiros (não negativos) correctamente em módulo 4.Teoria da Computação Capítulo 2 . aparece 1 (11) vai para o estado 3. No início temos o estado inicial 0. 1 3 0 2 Estando no estado 2 (depois de ler 10): aparece 0 ( 100) vai para o estado 0.3.3.2. LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 72 . vai para o estado 1. mod4(7)=3) vai para o estado 3. mod4(6)=2) vai para o estado 2. DFA da linguagem L(M)={w∈{0. A leitura da cadeia é feita da esquerda para a direita. A contagem módulo 4 tem quatro valores possíveis: 0. mod4(5)=1) vai para o estado 1. aparece 1. 3. aparece 1 (111=7. mantém-se no estado 0. aparece 1 (101=5. Autómatos Finitos 0 1 1 0 1 0 Figura 2. 1. Construção do DFA contador em módulo 4. Aparece 0.1}* : mod2(w)=1} Exemplo 2. O nome do estado é o valor da contagem que lhe corresponde. Estando no estado 1 (depois de ler 1): aparece 0 (10) vai para o estado 2.6.23. 0 1 0 1 Figura 2.24. Estando no estado 3 (depois de ler 11): aparece 0 (110=6. 2. Estando em 1 (lido 1): com 0 (10) vai para 2.5. Estando em 2 (lido 10): com 0 (100) vai para 4. com 1 (101) vai para 5.3.7.2.25. Contagem módulo 7 Neste caso precisaremos de um autómato com 7 estados 0. Se continuarmos veremos que o autómato não se engana.6.Teoria da Computação Capítulo 2 . em que o LSB é o primeiro à direita) que valem 2 em módulo 4. Se for por exemplo 2. com 1 (11) vai para 3.3.4. quando a cadeia binária é lida da direita para a esquerda. 0 1 0 1 2 1 1 0 0 Figura 2.1. O estado final será determinado pela linguagem requerida.26.3. E se fosse lida da esquerda para a direita ? Exemplo 2. Construção do DFA contador em módulo 7.2. 3 6 4 5 LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 73 . ela será composta pelas cadeias (binárias.7. sendo 0 o estado inicial. Estando em 0: se aparece 0 mantém-se em zero. É curioso verificarmos esta periodicidade. se aparece 1 vai para 1. Autómatos Finitos 0 0 1 1 1 0 1 0 2 3 1 0 Figura 2. DFA contador em módulo 4. 8mod7=1) vai para 1. 0 1 0 2 1 1 1 0 0 1 0 3 0 Figura 2. 10mod7=3) vai para 3.3. 13mod7=6) vai para 6. Estando em 3 (lido 11): com 0 (110) vai para 6. Estando em 6 (lido 110): com 0 (1100=12. 9mod7=2) vai para 2. com 1 (1101=13. com 1 (1011=11.27. Estando em 5 (lido 101): com 0 (1010=10. com 1 (1001=9. com 1 (111) vai para 0. 12mod7=5) vai para 5. dá certo. LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 74 . Autómatos Finitos Continuando. 0 1 0 2 1 1 1 0 0 1 0 3 0 1 6 4 0 5 1 Falta apenas definir o que acontece no estado 6. Estando em 4 (lido 100): com 0 (1000=8. 11mod7=4) vai para 4. 1 6 4 0 1 0 5 1 Testemos o DFA para : 1110101 =64+32+16+4+1=117 117mod7=5.Teoria da Computação Capítulo 2 . Continuação da construção do DFA contador em módulo 7. L=L(M) A família das linguagens regulares é composta por todas as linguagens que são aceites por algum DFA. Há uma família de linguagens em que tal acontece sempre: as linguagens regulares. que a reconheça ? Nem sempre. Autómatos Finitos 1010101011=512+128+32+8+2+1=683. Tal afirmação é fácil de provar: uma linguagem é um conjunto de cadeias.4. autómato finito determinístico. E dada uma linguagem qualquer. LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 75 . Uma linguagem L diz-se regular se e só se existir um DFA M que a reconheça. definida por um conjunto de cadeias.4.b}: a. em Σ={a. 683mod7=4. ou seja.Depois colocamo-nos dentro de cada estado e imaginamo-nos a ler a cadeia de entrada e a imitar o DFA. Um DFA aceita sempre alguma cadeia.A primeira e decisiva operação é determinar quanto estados terá o DFA e qual a função de cada um. DFA aceitador da linguagem L={λ}. numa boa estratégia de projecto de um DFA: . Em resumo. . .Teoria da Computação Capítulo 2 . como é o caso do autómato seguinte. mesmo que seja a cadeia nula. Linguagens regulares Qualquer DFA reconhece uma linguagem.b a 1 0 b Figura 2. existirá sempre um DFA.A etiqueta que atribuímos a cada estado deve exprimir a função do estado.1. 2. confere. só com a cadeia vazia. Nem todos os autómatos assim são. nunca há qualquer situação em que o DFA exite. Quando isso acontece o autómato deixa de ser determinístico. uma ou mais transições com o mesmo símbolo do alfabeto. Construir um DFA que aceite a linguagem L em Σ = {0. ou por não saber o que fazer. 2. 2. 1} tal que (a) L contém apenas “010” e “1”. (c) L é o conjunto de todas as cadeias sem “1”s consecutivos nem “0”s consecutivos. então ela é regular. Diz-se autómato não-determinístico ou indeterminístico. Autómatos Finitos E como se pode provar que uma linguagem é regular? Por prova construtiva: se formos capazes de construir um autómato que a reconheça. Exercícios de construção de DFAs. Autómatos finitos não-determinísticos Um DFA sabe sempre o que fazer: o seu caminho está completamente definido no seu grafo. 111100010 ∉ L(M) 3. (b) L é o conjunto de todas as cadeias que terminam com “00”.1}.Teoria da Computação Capítulo 2 . 1011000 ∈ L(M) 10101000. Mas também pode ser porque é impossível (o que acontece se a linguagem for não regular). Desenhar o DFA que aceita todas as cadeias em {0. Poderemos imaginar uma situação em que a partir de um estado sejam possíveis zero. em que há caminhos alternativos (para a mesma situação na entrada). com excepção das que contêm 010: 0111101100 . isto é. por poder escolher entre dois caminhos alternativos. E se não formos capazes? Aqui é que a porca torce o rabo. 1. Desenhar o grafo do DFA que aceite as cadeias binárias que valem 5 em módulo 6.5. LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 76 . 0000. pois pode ser por falta de perícia nossa. LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 77 .O contradomínio de δ é a potência 2Q do conjunto Q. Pode aceitar uma cadeia seguindo um dado caminho e não aceitar a mesma cadeia seguindo um outro caminho alternativo. No grafo não há uma aresta partindo de qi com o símbolo a.1): 1. Como definir neste caso a condição de aceitação de uma cadeia? Do modo seguinte: uma cadeia de entrada é aceite se houver para ela (pelo menos) um caminho que leve a um estado aceitador quando ela é toda lida. precisamente porque o resultado de δ pode ser no limite um qualquer subconjunto de Q.1 Parte de um autómato finito com dois caminhos alternativos para a mesma leitura na entrada.1: Um aceitador não-determinístico (NFA–Nondeterministic Finite Accepter) é definido pelo quinteto M= (Q. Lendo com atenção a definição constatam-se as seguintes diferenças em relação ao DFA (definição 2. δ.5. Autómatos Finitos Figura 2. entre o estado inicial e o estado aceitador. Não é obrigatório que exista uma aresta a partir de qi para cada um dos símbolos do alfabeto.2.5. q0. a a Havendo caminhos alternativos pode haver. Σ. Definição 2.Teoria da Computação Capítulo 2 . e não Q. F) em que a função de transição δ é definida por δ : Q× (Σ∪{λ}) → 2Q Os restantes membros do quinteto definem-se do mesmo modo que no caso do DFA. A potência 2Q de um conjunto é composta por todos os seus subconjuntos possíveis. a) pode ser vazio. significando que não há qualquer transição nesta situação. um ou vários caminhos. zero.O conjunto δ (qi. incluindo o vazio. 2. b) = qj qi b qj Lendo agora o carácter b o autómato transita par o estado qj. No grafo do NFA pode existir uma ou mais arestas com o símbolo λ. ou seja.λ também pode ser argumento de δ. Os nós são os estados e as arestas as transições. LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 78 . Este facto parece estranho na medida em que aceitar o nada numa primeira análise parece até contrariar a própria noção de aceitação. Suponhamos que estamos no estado qi depois de ler o prefixo aba da cadeia ababb. 1º .3. Autómatos Finitos 3.5. pode dar-se uma transição sem consumir um símbolo de entrada ( o mecanismo de leitura pode ficar parado em alguns movimentos). Mas veremos a utilidade deste facto.5. Figura 2. a transição δ(q1.Teoria da Computação Capítulo 2 . a) = {q2. Grafo (NFA) da transição δ(qi. Por exemplo.2. q3} só pode existir num NFA. Grafo da transição δ(q1. Com um grafo será a q1 q2 a Figura 2. Os NFAs podem representar-se por grafos tal como o DFA. dado que há dois caminhos alternativos: de q1 lendo a ou se transita para q2 ou se transita para q3.de um qualquer estado para ele mesmo pode-se sempre transitar com λ. q3} q3 Num NFA pode dar-se uma transição com o carácter λ. a) = {q2. Consequências da possibilidade de transição com λ Há algumas consequências da possibilidade de transição com o λ que convém aqui referir. aabab aabab b q2 q1 Figura 2. ou não consome b (consome λ que está implícito na cadeia aabab.5. LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 79 . 2º Quando a transição-λ for uma alternativa a uma transição com um outro carácter. aceitaria ou não? Teria que tentar todos os caminhos alternativos possíveis. Suponhamos. que um NFA chega a um estado q1.5. Autómatos Finitos Mas repare-se que a cadeia ababb é a mesma que abaλbb ou que abaλλbb ou que abaλλλbb e por aí além. 2.Teoria da Computação Capítulo 2 .5. O mesmo irá depois acontecer em qj . da figura seguinte.5. como se pode saber se uma cadeia é aceite pelo DFA? Se ele escolhe um caminho e não consegue chegar ao estado final conclui-se que não aceita a cadeia? E se ele tivesse escolhido outro. geralmente não se desenha. λ Figura 2. Por ser sempre verdade. Como representar esse facto no grafo? Simplesmente colocando uma transição λ do estado qi para ele mesmo. 2. aaλbab) e vai para q3. qi λ b qj Em qualquer NFA existe essa característica: há uma transição com λ de um qualquer estado para ele mesmo.5. e se lhe apresenta de seguida o carácter b. Por isso o grafo completo terá a forma da Fig. λ q3 aabab Havendo (por vezes tantas) escolhas. Se encontrasse um que o levasse a um estado aceitador então aceitaria a cadeia. Grafo (NFA) da transição δ(qi. o autómato escolhe “comer” um carácter ou não.4. O NFA tem dois caminhos alternativos: ou “consome” b e vai para q2. com explicitação (em relação ao da Fig.4. por exemplo. b) = qj . Nunca esquecer no entanto que no caso de um DFA não há transições-λ. considerando-se que a transição está lá implicitamente.3) das transições com λ. Se um dos caminhos de uma computação terminar num estado aceitador. o NFA aceita a cadeia. Autómatos Finitos A diferença entre uma computação determinística (podendo terminar ou não num estado aceitador) e uma computação não determinística em que existe um caminho aceitador é ilustrada pela Figura 2. Na computação não determinística cria-se uma árvore.5.5.6 (de Sipser). A cadeia lida ou é aceite ou não.6.Teoria da Computação Capítulo 2 . Caso nenhum caminho termine num estado aceitador. Uma cadeia é aceite pela NFA se houver alguma sequência de movimentos possíveis que coloquem o autómato num estado final (aceitador) no fim da cadeia. com sucessivas ramificações sempre que haja uma escolha possível. a cadeia é rejeitada. Cada configuração está LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 80 . Caso contrário é rejeitado. Uma computação determinística cria um caminho. Na computação determinística nunca há escolhas. Há uma outra forma de concebermos uma computação não determinística. Computação determinística Computação não determinística aceita ou rejeita aceita Figura 2. conforme o último estado seja aceitador ou não. o NFA replica-se uma vez por cada escolha. Sempre que há uma escolha possível. enquanto que uma computação não-determinística cria uma árvore. de modo que o número de configurações vai aumentado em cada ramificação da árvore supra. 5.5. Função de transição estendida δ* Tal como no caso do DFA. Autómatos Finitos no estado consequente da escolha feita e na sua entrada estão aos caracteres ainda não lidos. então esse autómato morre. w) ∩ F ≠ ∅} i. w) = Qj sendo Qj o conjunto de todos os estados possíveis do autómato que podem ser alcançados a partir de qi e pela leitura de w. qj ∈Q e w∈Σ*. qi w qj Definição 2. Isto é δ* (qi. q0. para todos os qi. w) contém o estado qj se e só se existir um caminho no grafo de transições desde qi até qj com etiqueta w. Se no fim da computação houver algum autómato sobrevivente e se pelo menos um deles estiver num estado aceitador.. Exemplo 2. 2. Se um dos autómatos replicados está numa configuração tal que não pode transitar para qualquer estado (seja com λ seja com um outro carácter). Ela resulta da leitura de uma cadeia w que é o seu segundo argumento (em vez de um carácter). F) é definida como o conjunto de todas as cadeias w que levem o autómato a um estado final aceitador. L(M) = {w∈Σ* : δ*(q0. Figura 2. δ* (qi.2.7.5. a cadeia é aceite.e. também num NFA se pode introduzir o conceito de função de transição estendida δ*.7.5. e se a leitura ainda não chegou ao fim. Linguagem aceite por um NFA A linguagem L aceite pelo NFA M = (Q. como na Fig. δ.Teoria da Computação Capítulo 2 .8 é não determinístico porque: LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 81 . é composta por todas as cadeias w para as quais existe pelo menos um caminho etiquetado w desde o vértice inicial até algum vértice final.1 (Linz) O autómato da Figura 2.5. ou seja. Σ. 8. mesmo se não desenhada. teremos: δ (q0. 1) = {q2} δ (q1.de q0 parte uma aresta etiquetada por λ . 0) = ∅ δ (q1. q2} δ (q1. LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 82 . Autómatos Finitos .de q1 partem duas arestas etiquetadas por 0 . Um aceitador não-determinístico Se escrevermos todas as transições possíveis. λ) = { q0.de q2 não é definida qualquer transição. q2} δ (q2.5. λ) = {q2} O autómato aceita: 10.existe sempre a transição δ (qi. 1 q0 q1 q2 1 λ Figura 2. λ) = { qi}. 0) = ∅ . 0) = {q0. δ (q2. 1) = {q1} δ (q0.Teoria da Computação Capítulo 2 . 1) = ∅ δ (q2. 0) = ∅ δ (q2. λ) = {q1} δ (q0. 0 0. para todo o i. porque dos dois estados alcançados um é final. … Não aceita : 1. obtém-se uma configuração morta (dead configuration).9. em que se transita para o estado vazio. ou seja. 0). Exemplo 2. 11. ∅. … A sua linguagem é composta palas cadeias de potências de 10.Teoria da Computação Capítulo 2 . com o alfabeto Σ={a}. Autómatos Finitos 1010. L(M) = { (10)n : n ≥ 0 } E se aparece a cadeia 110 ? Depois de ler 11 chega a q2. a a q1 q3 q2 a q0 a a q5 q4 a Figura 2. 01.5. 101010. Considere-se o autómato da Fig. esta cadeia não é aceite pelo NFA.2.5.5. Como não está definida a transição δ (q2. Ele é não-determinístico porque (i) no estado inicial há uma escolha possível com o carácter a e (ii) não estão definidas todas as transições possíveis. Como não se pode atingir um estado final processando 110. Exemplo 2.: (Linz).2 Qual é a linguagem aceite pelo autómato? LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 83 .9.5. 110)=∅. 2. Mais formalmente δ * (q0. e depois obter.construir DFAs complicados. Pense-se por exemplo o que aconteceria a um autómato que controlasse uma porta automática se ele não fosse determinístico … No entanto têm uma grande utilidade em Teoria da Computação. Como veremos de seguida não há nenhuma diferença essencial entre NFA’s e DFA’s: dado um NFA é possível encontrar um DFA equivalente. a2n. Se quisermos construir um autómato equivalente (estudaremos como num capítulo posterior) será mais fácil através de um NFA. aaaa. Pela parte de baixo aceita aa. Podemos assim especificar um grande número de cadeias usando apenas duas regras. um DFA equivalente. ou seja a união das duas. pela técnica que estudaremos. n≥1 O conjunto das duas. LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 84 . como na produção S→ aSb | λ em qualquer ponto pode-se escolher a primeira ou a segunda produção. poderemos numa primeira etapa construir um NFA. .definir linguagens compostas por conjuntos bastante diferentes (como no exemplo anterior {a3}∪{a2n : n ≥1}. Se quisermos construir um DFA. mais fácil de desenhar. dá a linguagem aceite pelo autómato L(M) = {a3} ∪ {a2n: n≥1} Se o NFA pode escolher. na prática com o se constrói? Para que servem? Os NFA são construções matemáticas que não passam disso: não se pode construir um NFA para uma aplicação prática. …. aaaaaa.Teoria da Computação Capítulo 2 . por exemplo) . .descrever de forma simples e concisa linguagens complicadas.modelizar algoritmos em que tem que se fazer escolhas (search-and-backtracking. Usam-se como um ferramenta matemática muito útil para . Autómatos Finitos Pela parte de cima aceita a cadeia aaa e só essa. Na definição de uma gramática pode existir um elemento de não-determinismo. LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 85 . em que os caminhos possíveis se reduzem sempre a um. e por isso qualquer DFA ou NFA tem muitos aceitadores equivalentes. Autómatos Finitos 2. existirá um DFA que a aceite? Será que o não-determinismo eliminou esta possibilidade ? De facto não eliminou: se uma linguagem é aceite por um NFA então existe um DFA que também a aceita. não se sabe precisamente em que estado está. se ambos aceitam a mesma linguagem.1.. Os DFA podem-se considerar casos especiais de NFA. Existem geralmente muitos aceitadores para uma dada linguagem. Por isso se uma linguagem é aceite por um DFA então existe um NFA que também a aceita. Equivalência entre autómatos (aceitadores) finitos determinísticos e não-determinísticos Como vamos ver. a partir de um qualquer NFA com um dado alfabeto pode-se obter um DFA que aceita as mesmas cadeias e rejeita as mesmas cadeias no mesmo alfabeto. qw. qk }. E o contrário? Se uma linguagem é aceite por um NFA. . Depois de um NFA ler uma cadeia w. mas sabe-se apenas que está num estado entre um conjunto Qw de estados possíveis Qw={qi. qj. Definição 2.Teoria da Computação Capítulo 2 ..6. Em contrapartida depois de um DFA ler a mesma cadeia tem que estar num estado bem definido. Diz-se que o DFA é equivalente ao NFA. Aceitadores equivalentes : dois aceitadores M1 e M2 são equivalentes se L(M1) = L(M2) isto é.6. Como encontrá-lo ? Como converter um NFA num DFA ? Como transformar uma situação de multi-escolha numa escolha única ? Um NFA pode escolher vários caminhos.. Vejamos mais formalmente a definição de equivalência entre autómatos. o DFA equivalente tem um número de estados substancialmente inferior.1 LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 86 . decide uma de duas coisas: ele não é o início de 000 (e neste caso deixa-se ficar onde está). Vejamos um exemplo. Construir um DFA que aceite a linguagem L composta pelas cadeias em Σ={0. O NFA. Exemplo 2.Se tivermos 6 estados no NFA teremos 26=64 estados no DFA ! Como geralmente o indeterminismo é apenas parcial. o número de estados no DFA será 2|Q|. 111.Teoria da Computação Capítulo 2 . vendo um zero. ele é o início de 000 (e então transita para o estado seguinte na corrida de três zeros). No entanto usando o não determinismo a solução surge de forma bastante simples. ou para o caso de 111.6.1. 10100010.1} que contenham três 0’s seguidos ou três 1’s seguidos . É relativamente fácil desenhar um DFA para o caso de 000.6. e portanto finito. o número máximo de estados que se podem obter no DFA é igual à potência de conjuntos de Q. no DFA.6. Autómatos Finitos Como encontrar uma correspondência entre estas duas situações? Pode-se conceber um truque simples: cria-se um estado no DFA equivalente ao conjunto Qw. Primeira parte do exemplo 2. Se isso for possível temos o problema resolvido.1 Será então: 1. como por exemplo 000. Mas resultará isso num autómato finito? Qual o número máximo de estados do DFA que se podem obter por este processo? Se no NFA existem no total Q estados. 0. mas não é assim para ambos os casos simultaneamente. etiqueta-se. poderemos desenhar o NFA que aceita as cadeias com 000. um estado por Qw. isto é. mesmo para um projectista experiente. No caso extremo de total indeterminismo no NFA.0 0 q1 q2 0 0 qf q0 Figura 2. A procura directa deste DFA pode tornar-se numa operação bastante complicada. Primeiro. 00111101000.1. isto é 2|Q|. 1. desenhamos o NFA que aceita as cadeias com 111 (e só essas). Mas se a seguir aparece 1. palpitando-lhe que aquele 0 não é ainda da sequência pretendida.se uma cadeia contém 000.6. Exemplo 2. q2 e qf. e só essas. . O estado final aceitador pode também ser comum (embora este facto não seja obrigatório).1 1. e por isso terminaria a computação não aceitando a cadeia 1010001).se uma cadeia não contém 000 não é possível chegar ao estado aceitador. ele acaba por morrer porque lhe aparece um 1 em q1 ou em q2 e não está aí definida qualquer transição com 1. obtendo-se a Fig 2. a partir do estado inicial comum. para termos a possibilidade das duas situações. Segunda parte do exemplo 2.6.0 0 0 q2 q1 0 q3 q0 1 1 1 q4 1 q5 Figura 2.2. Se o autómato não tivesse a possibilidade de ficar em q0 com 0. Autómatos Finitos Este NFA aceita todas as cadeias que contenham 000. basta-nos juntar os dois autómatos. evita esta situação.6. completo LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 87 .3.3.Teoria da Computação Capítulo 2 .6. Por exemplo para a cadeia 1100101001. ficando aí até ao fim da cadeia.6. O facto de poder esperar em q0. De facto: .1 Agora. 0. Ora acontece que a sequência 000 aparece mais à frente e a cadeia deveria ser aceite. Por exemplo no caso da cadeia 1001110110001101010 deixa-se ficar em q0 até ao nono carácter e depois transita sucessivamente para q1.1 qf 1 1 q0 1 1 q2 q1 Figura 2. Segundo. se o NFA transita com algum dos zeros para o estado q1. dado que não há saída de q1 com 1.1 0. Por razões análogas ele será 0. avançaria sempre para q1 quando lesse um 0 (por exemplo em 1010001). há sempre um caminho aceitador para ela. ele entra numa configuração morta. 6. 2. 2. como na Fig.Teoria da Computação Capítulo 2 . Assim sendo. O significado dos estados é definido pelo projectista. Autómatos Finitos E temos o NFA procurado.6. que são por isso co-alcançáveis. Para isso construa-se a tabela de transições: Tabela 2. Pormenor do cálculo do DFA equivalente: dois estados q2 e q3 do NFA coalcançáveis pela transição a produzem um só estado q23 no DFA equivalente.4.6.3 δN 0 1 q0 q0. Vamos agora procurar um DFA equivalente.1. nada nos impede de criarmos estados no DFA que correspondam a conjuntos de estado do NFA.4. LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 88 . a a q1 q2 q1 q23 a q3 a) no NFA b) no DFA equivalente Figura 2. Transições da Fig. E será lógico que todos os estados do NFA coalcançáveis pela mesma transição componham um estado do DFA alcançável por essa mesma transição. q4 q1 q2 - q2 q3 - q3 q3 q3 q4 - q5 q5 - q3 A primeira dificuldade deriva do facto de algumas transições terem vários estados alternativos de chegada.6. q1 q0. q1. δ q0 0 1 {q0. q4}={q0.2. Para isso colocamo-los na primeira coluna da tabela de transições.6. q1} = q01 {q0. q2}. q4} Crie-se de igual modo um estado equivalente a este conjunto.Teoria da Computação Capítulo 2 . Transições do DFA equivalente.2. o que se passará? Sabemos que q01 corresponde do conjunto {q0. Vamos chamar-lhe q01 para sabermos a que corresponde. ou seja para o conjunto {q0. q04. Estes estados q01 e q04 vão integrar o DFA. 2. q0. E portanto aquela pergunta é equivalente a: se o NFA está ou em q0 ou em q1 e aparece um 0.6. E se o DFA está em q01 e aparece 1. etiquetem-se os seus estados com índices agrupando os índices dos estados do NFA co-alcançáveis pelas mesmas transições. Mas {∅. Neste caso há uma nuance que convém realçar: se está em q1. q4}. pode-se ir ou para q0 ou para q1. pode-se ir ou para q0 ou para q4.6. Tabela 2. ∅. q4}= q04 q01 q04 Agora temos que imaginar o seguinte: se o DFA está em q01 e aparece 0.. Se está em q1 pode ir para q2. o que se passará? Se está em q0 pode ir para q0 ou para q1.3 de q0 com 0. Temos que saber o que se passa neles quando aparece 1 ou 0. ou seja para o conjunto {q0. LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 89 . Autómatos Finitos Para definir as transições no DFA. Crie-se por isso no DFA o estado q012. com 1 vai para o vazio. o que se passará? Fazendo uma análise semelhante conclui-se que estará em q04. q1} do NFA. como indicado na Tabela 2. q1} pode ir para {q0. q1} Crie-se um estado equivalente a este conjunto. Portanto estando em {q0. De q0 com 1. Na Fig. Autómatos Finitos Nesta segunda etapa surgiu o novo estado do DFA. q2}= q012 {∅.4. De q04 com 0 para onde se vai? E com 1? E de q012? Sempre que aparece um novo estado do DFA (vê-se palas etiquetas) tem que se colocar na primeira coluna na linha seguinte ainda não ocupada. q012. Tabela 2.6. q4}= q04 q012 E agora continua-se a análise. q0. q4}= q04 q01 {q0. q1. q4}= q04 q01 {q0. q1. Todas as transições do DFA equivalente δ 0 1 q0 {q0. que deve ser colocado na primeira coluna.3. q4}= q04 q04 q01 q045 q012 q0123 q04 q045 q01 q0345 q0123 q0123 q034 q0345 q013 q0345 LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 90 . q1} = q01 {q0. q0.6.Teoria da Computação Capítulo 2 . Termina-se quando só se obtêm estados do DFA que já existem na 1ª coluna. Tabela 2. q04 já lá estava. q2}= q012 {∅. Mais transições do DFA equivalente δ 0 1 q0 {q0. q1} = q01 {q0. deduzido do NFA. q0123.4. serão aceitadores no DFA todos os estado que “contenham” o estado q3 do NFA.Teoria da Computação Capítulo 2 . Para que o DFA seja equivalente. quer dizer que depois de lida essa cadeia se chegou a um aceitador. q034. q0345. neste exemplo. Os estados do DFA. Autómato determinístico equivalente com vários estados finais LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 91 . ou seja. e portanto a cadeia é aceite pelo NFA. seja DFA. q013. Um autómato. Portanto. Se um dos estados do conjunto é aceitador. O NFA aceita uma cadeia quando existe pelo menos uma computação que leve a um estado final. tem também que a aceitar.6. seja NFA. De facto para se chegar a esse conjunto de estados (no NFA). leu-se uma certa cadeia. Autómatos Finitos q013 q0123 q034 q034 q013 q0345 Resta-nos identificar o(s) estado(s) aceitador(es) para termos o DFA completamente definido. A partir da tabela de transições desenha-se o grafo do DFA: 0 0 q01 0 0 q012 q0123 1 1 1 q0 0 q034 1 0 0 1 1 q045 q04 1 0 q0345 q013 1 0 1 Figura 2. e em consequência o novo estado criado no DFA correspondente ao conjunto de estados do DFA tem que ser aceitador. Se num desses conjuntos existir um estado aceitador (no NFA) então quer dizer que o estado correspondente do DFA também será aceitador. correspondem a conjuntos de estados do NFA. pode ter vários estados finais aceitadores. Autómatos Finitos Depois de o autómato entrar num dos estados aceitadores.1} todas as cadeias que terminam em 10. 2.4. com um só estado final Olhando agora com atenção para o grafo do DFA poderemos ver que ele está de acordo com as orientações que vimos para desenhar DFAs no parágrafo 2. 1 0 0. Depois procura-se o DFA equivalente. Exercício 2.1 λ 0 1 F 0 1 1 1 11 1 Figura 2.6.6.6.6. Excepto para o estado final. Exercício 2.2.6. ou por ambas. Em primeiro lugar desenha-se um NFA.1.6. 0 0 00 0 0 1 0.3. LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 92 . 2. apenas pode transitar entre estados aceitadores e por isso todos os estados aceitadores se podem fundir num só. Simplificação do grafo da Fig. 1 1 0 Figura 2. por ser mais simples.6. 0. As etiquetas dos estados foram escolhidas de modo sugestivo.5 reflectem esse facto.Teoria da Computação Capítulo 2 . Calcular o DFA equivalente ao NFA da Figura 2.6. que poderíamos etiquetar por 000 ou por 111. como no grafo seguinte.1 Exemplo 2.6. indicando como se chega ao estado (qual ou quais os últimos caracteres lidos). Desenhar o DFA que aceita em Σ={0.6.5. As etiquetas dos estados na Fig. Exemplo 2. No entanto no contexto não determinístico é simples: imaginemos o LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 93 .Teoria da Computação Capítulo 2 . Exemplo 2.5. 0. Autómatos Finitos O NFA está no estado inicial até que lhe palpita que vêm aí os dois últimos caracteres e que eles serão 10. Desenhar o DFA que aceita em Σ={0.6. Por muito que tenhamos treinado a nossa arte de desenhar DFAs não é fácil encontrar de imediato uma solução.3.6. os que se obtêm na primeira coluna da Tabela 2.7.6.1 0 0 1 3 1 Figura 2.1} todas as cadeias em que o 3º símbolo a contar do fim é 1.Transiçoes da Fig.6.6.1 Figura 2.8. mas não 010101011.2 Vamos agora calcular a tabela de transições do DFA equivalente: Tabela 2. 2. O DFA equivalente ao NFA da Fig.7.7 Estado 0 1 0 0 01 01 03 01 03 0∅=0 0∅=0 actual O DFA terá 3 estados. Por exemplo1000101 pertence.5. 0 0 0 1 01 1 03 0.6.6.6. Logo. 2. Transições do NFA da Fig.6. 0 1 0 0 01 01 02 012 02 03 013 012 023 0123 03 0∅ 0∅ 013 02∅ 012∅ 023 03∅ 013∅ 0123 023∅ 0123∅ O DFA terá 9 estados e está desenhado na Fig. Autómatos Finitos NFA que está a ler a cadeia. 2.2. usando a técnica descrita acima. 1 0 0. 0.6.9. Fig.9. LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 94 . Começamos pela tabela de transições.6. Tabela 2.9.1 0. Todos os estados que contenham 3 na sua etiqueta serão aceitadores. 1 1 2 3 1 Figura 2. Teremos então o seguinte NFA com três estados.10. não se move até que lhe palpita que o 1 que aí vem é o antepenúltimo carácter da cadeia e então avança para o estado aceitador.6. 2.Teoria da Computação Capítulo 2 . NFA do exemplo 2.6.3 Vamos agora calcular o DFA equivalente.6. nomeadamente quanto à etiquetagem dos estados.6. pode-se chegar a 4.10. Será possível reduzir o número de estados aceitadores na Fig.5} e portanto na tabela de transição do DFA equivalente temos que criar o estado q2345. e depois com a transita-se para 4.6. onde é possível chegar ? Vê-se imediatamente que ao estado 2. NFA com transições-λ.4. Mas existe também uma transição λ de 1 para 3. a a 2 λ 1 b 4 3 a λ 5 b Figura 2. 1 1 0 0 0 01 03 02 1 0 1 0 1 Figura 2. quando calculamos o DFA equivalente temos que ter muito cuidado para não cometermos erros. 2.11.10 ? Caso em que o NFA tem transições-λ Se um NFA tem transições-λ.6.6. Portanto partindo de 1 com um simples a. 012 013 1 023 0 1 0 0123 1 Não seria fácil desenhar directamente no contexto determinístico … Compare-se a simplicidade do NFA com a do DFA. 2.Teoria da Computação Capítulo 2 . DFA equivalente ao NFA da Fig. de 4 para 5 transita-se com λ. A partir do estado 1 com a.6. Por isso a partir de 1 com a chega-se a um elemento do conjunto {2.3. Este caso evidencia de forma clara a utilidade dos NFAs. Portanto de 1 até 5 também se pode ir com λaλ=a. que é o mesmo que λa. Autómatos Finitos 0 0. A figura seguinte representa parte de um NFA. Mais ainda. LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 95 .3. LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 96 .6. Na tabela de transições. até ao número total de estados do autómato. ele faz parte do fecho-λ de 1.6. a Tabela 2. 2.6. Exemplo 2.12. Se houver uma transição-λ a partir do estado inicial no NFA.4. a 2 λ 1 b 3 Estado a b 136 245∅ 4∅ 245 2∅ 45∅ 4 ∅ 46 2∅ 2∅ ∅ 45 ∅ 46∅ 46 ∅ 46∅ ∅ ∅ ∅ a 4 λ λ 5 b b 6 Figura 2. sendo composto por todos os estados que se podem alcançar de 1 com λ (inclui naturalmente o próprio).6. Autómatos Finitos Ao conjunto {2.6.12.5} chama-se o fecho-a (a-closure) do estado 1.12 .3. A primeira tarefa será vermos qual o estado inicial do DFA. usando transiçõesλ. Seja o autómato anterior com um estado 6 aceitador e uma transição-λ do estado inicial para o estado 6. então o estado inicial do DFA equivalente será o estado composto pelo inicial do NFA mais o fecho-λ do estado inicial do NFA. quer isto dizer que o NFA aceita λ. Exemplo 2. Fig. Ora a única forma de o DFA também aceitar λ é fazendo o seu estado inicial aceitador. Calcule-se o DFA equivalente. Ao conjunto {1. quando calcularmos o DFA equivalente.3} chama-se fecho-λ ( λ-closure).6.6. pode ter um número qualquer de estados.4. tem que se ter muita atenção para com o fecho-λ de um estado quando estamos a calcular as transições do estado com os caracteres do alfabeto.Teoria da Computação Capítulo 2 . dependendo do caso. Transições da Fig. 2.4. Portanto o estado inicial do DFA será 136 e será por ele que iniciaremos a construção da sua tabela de transições. O estado 3 do NFA pode ser alcançado sem consumir caracteres. Como se vai de 1 para 6 aceitador com λ . Teoria da Computação Capítulo 2 . No autómato DFA seguinte há estados a mais.7. Redução do número de estados em Autómatos Finitos Qualquer DFA define uma única linguagem. b q0 Figura 2. Mas uma linguagem não define um único DFA. Por razões de eficiência deve-se reduzir o número de estados ao mínimo possível. b Figura 2.1.7. Ele tem um equivalente com um só estado: a.2. Autómatos Finitos O DFA equivalente terá 7 estados. 2. Vejamos alguns exemplos simples. Por razões de simplicidade. cujo número de estados pode ser bem diferente. a.7. dos quais dois serão aceitadores: 136 e 46.1 Exemplo 2.7. importa obter o de menor número de estados.7.1 aceita todas as cadeias no seu alfabeto. Autómato equivalente ao da Fig. o espaço necessário para computar é proporcional ao número de estados. Exemplo 2. Fica ao cuidado do leitor o seu desenho e a identificação da linguagem que ele aceita. b q0 q1 a. Para uma linguagem existem muitos possíveis DFA’s.2.7. 2.1 O autómato da Fig. LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 97 . existem muitos DFA’s equivalentes. porque todos os estados são aceitadores.7. Por exemplo se quisermos programar um DFA. 2. isto é. No autómato seguinte.3. b b a Figura 2. Fig.5 Em primeiro lugar os dois estados finais podem-se fundir num só. Têm que se introduzir as transições que mantenham a equivalência com o autómato original. Autómatos Finitos a a a b q1 b q3 q0 q2 b b a Figura 2. b q0 a b q4 q2 a. a a q0 a.7. coloca-se a possibilidade de fundir q1 com q2 no estado q12. LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 98 .7. 2.4. 2.2 também se podem eliminar alguns estados.7.7. dado que as transições a partir deles são reflexivas (voltam a eles): seja ele q34. b b q12 q3 b Figura 2. DFA equivalente ao da Fig.7. Exemplo 2.7.2.3. Se se chega a q3 com b quer seja a partir de q1 quer seja a partir de q2.Teoria da Computação Capítulo 2 . a b q1 q3 a. Autómatos Finitos a q1 b q0 a b a.7.w)∈F. também se chega a um estado aceitador a partir do outro com a mesma cadeia w.2 Este procedimento heurístico.se a partir de um deles se chega a um estado não aceitador com uma cadeia x. 2. Simpificação do DFA da Fig. b q12 b q34 a. δ* (p.7.7. formalmente. LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 99 . também se chega a um estado não aceitador a partir do outro com a mesma cadeia x: δ* (p.w) ∈F ⇒ δ* (q. o DFA resultante. b Figura 2.x) ∉F ⇒ δ* (q. pode formalizar-se num algoritmo de minimização do número de estados de um DFA. é equivalente ao inicial.7. Por outro lado de q1 com a vai-se para q2 e de q2 com a vai-se para q2. para todas as cadeias x ∈ Σ*. a q0 a. Estados indistinguíveis Dois estados p e q dizem-se indistinguíveis se: .7 com apenas 3 estados. Para o seu desenvolvimento vejamos algumas definições prévias. Fig.6. quer de q2. Se fundirmos q1 e q2 em q12. para todas as cadeias w ∈ Σ*.se a partir de um deles se chega a um estado aceitador com uma cadeia w . quer de q1. Em segundo lugar chega-se a q34 com b. b q34 q2 b a Figura 2. e . baseado na nossa habilidade.Teoria da Computação Capítulo 2 . mantendo essas transições. 2.7.7. DFA final no exemplo 2.x)∉F.5. Dois estados ou são distinguíveis ou são indistinguíveis. δ* (p. δ* (p. Os estados p e q são indistinguíveis. LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 100 . A racionalidade desta operação é evidente: se são indistinguíveis para que se hão-de ter lá ambos? O algoritmo divide-se em duas etapas: . Estados distinguíveis por uma cadeia Se existir uma cadeia w tal que de p se chegue a um estado aceitador e de q a um não aceitador.w )∈F então os estados p e q são distinguíveis pela cadeia w.w) ∈F ⇒ δ* (q. Autómatos Finitos Num grafo teremos a seguinte situação: u v p w u p v q x q w x Figura 2.7.primeiro marcam-se os estados distinguíveis. p R q e q R r ⇒ p R r (transitiva) Para reduzir a dimensão de um DFA. procuram-se os estados indistinguíveis e combinam-se entre si. p R q ⇒ q R p (simétrica) 3.p R p (reflexiva) 2. A indistinção tem as propriedades de uma relação de equivalência R: 1.Teoria da Computação Capítulo 2 .w )∉F ou tal que de p se chegue a um não aceitador e de q a um aceitador.w) ∉F ⇒ δ* (q.8. 3 (pág. não os estados individualmente. Se houver pelo menos um carácter a∈Σ tal que o par (pa. q) em Q. e se q é não aceitador. No fim todos os pares distinguíveis estão marcados como tal. então o par (p. Calculem-se as transições a partir deles para todos os caracteres do alfabeto. 2º Consideram-se todos os pares de estados (p. Este procedimento faz-se para todos os pares de estados (p. 64). De facto que maior distinção poderia haver entre dois estados? Marcam-se todos esses pares como distinguíveis.qj. Se p é aceitador. Autómatos Finitos . Pode fazer-se enumerando todos os caminhos simples no grafo (caminhos sem ciclos fechados) que partem do estado inicial. q) é distinguível. q∉F. Note-se que a marcação é para os pares. então o par (p. não para os estados individualmente. Q2={ql.9.qm. q). Teorema 2. …. Qx={qo. Marcam-se os pares. qa) resultante dessas transições seja distinguível. particiona-se o conjunto Q dos estados do DFA num certo número de subconjuntos disjuntos Q1={qi. 3º Considere-se um par de estados (p. qr} tais que LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 101 . fundem-se os estados indistinguíveis. q) é distinguível. Se um estado não está em qualquer caminho.….segundo. q). e portanto é inacessível. p q a a pa qa Figura 2.Removem-se todos os estados inacessíveis (limpeza do DFA). Ver a demonstração por exemplo em Linz.…. Procedimento de marcação dos estados distinguíveis 1º. tomados um de cada vez. qk}.….Teoria da Computação Capítulo 2 . qn} . Transições de p e de q com a. Um estado individual pode pertencer a um par distinguível e ao mesmo tempo a um par indistinguível. quer dizer que não se pode lá chegar a partir do estado inicial.7. Depois de se fazer a marcação dos estados distinguíveis. p∈F. Um estado acessível tem que estar num desses caminhos.qp. F ) por: 1º Para cada um dos conjuntos indistinguíveis Q1. Exemplo 2. por exemplo para Q1 será o estado equivalente qij…k. Σ. qn} então desenhar no grafo a transição ∧ δ (qij .Teoria da Computação Capítulo 2 .os estados do mesmo subconjunto são indistinguíveis entre si. é o que contém a etiqueta 0 do autómato original. Esta partição é sempre possível. se qr∈ Q1={qi. .F) calcula-se o equivalente M = (Q.Σ. F . A partir desta partição aplica-se o procedimento seguinte.…. LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 102 .n ∧ ∧ 3º O estado inicial de M .Minimizar o conjunto de estados do DFA da Figura 2.7.qualquer estado q pertence a um e só a um deles. Autómatos Finitos . … Qx cria-se um estado equivalente etiquetado apropriadamente (a sua etiqueta é o conjunto das etiquetas dos estados do subconjunto.…. q0 . qk}. Isto é. Procuram-se os dois subconjuntos a que pertencem qr e qp..qj. a)=qp do estado qr para o estado qp. ∧ ∧ 4º O conjunto dos estados aceitadores de M .qm.10. é o conjunto de todos os estados em cuja etiqueta entra um estado aceitador do DFA original. a) = qlm. tal que um dos elementos pertence a um dos subconjuntos e o outro pertence a outro.3 ..7. Q2. q 0 .qualquer par de estados. Traça-se a transição a entre os estados equivalentes a esses subconjuntos. ∧ ∧ ∧ ∧ ∧ Dado o DFA M=(Q.q0. . é distinguível.δ. δ . e qp ∈ Q2={ql.) 2º No autómato original M considera-se a transição δ(qr..k .. 5 7.6 2.7 7.6 4 5.5 5.3 3.7 7.5 7.6 1 3.7 7.4 2.6 2.4 6.6 6.5 5.4 6.4 6.3 7.4 4.4 6.7 5.7.7 5. Obteremos as duas tabelas seguintes.4 2.7.5 7.5 3.7 3 6.4 4.7.7 5.7 5 6.10.7 6 4.6 4.5 5.4 4.5 7.6 2 5.4 4.5 5.3 7.4 6.6 4.2 4.2 4.7 3.5 7.6 4.3 5.6 6. b 1º Marcação dos estados distinguíveis Havendo um só estado final.4 6.3 5.2 6.4 4.7 7.6 4.Teoria da Computação Capítulo 2 .7 5. Transições com a Tabela 2. 1 2 1 2.4 4.1.4 6.6 5 7.6 4.6 6.6 6.4 4.4 2.4 6.2 6.5 5.7 5.2 4.5 3.7 7 6. Portanto qualquer par que o contenha é distinguível.5 7.7 .4 4.4 6.7 4.2 6.6 6. Vamos agora considerar a segunda etapa: ver as transições de cada para com um a e com um b.2 Transições com b b 1 2 2. DFA a minimizar.5 7.2 2 3 4 LEI/DEI/FCTUC/2009/@ADC 5 6 7 Documento de trabalho 3 4 5 6 7 103 .6 4. ele é distinguível de todos os outros.5 5. Autómatos Finitos a 4 a b 2 a b a 5 b 1 a 6 b a 3 b a b 7 Figura 2.3 5.6 7 7.6 3 7.7 4 4.5 3.3 7.5 7.5 7.7 5.5 5.6 6.7 7.7 7.5 5.5 5.6 6 5. Tabela 2.4 4.7 3. 4). 4) com a dá (4. Na tabela de transições com b marcam-se todos os distinguíveis com a. em que 1 identifica os distinguíveis.4). Basta fazê-lo na metade superior (ou inferior) da tabela. já marcado e portanto (3.3.. excepto o par (6. 4).4) marca-se como distinguível. Neste caso não há nenhum.6) que é indistinguível. Tabela 2.4) é distinguível. nestas duas tabelas todos os pares que contenham o estado 6 devem ser marcados como distinguíveis (colorido).4) com a dá (6. Obtém-se a tabela seguinte. Será o par (1.7. (2. Para o par (3. portanto não se marca.2) com a dá (2.Teoria da Computação Capítulo 2 . Estados distinguíveis (1)e indistinguíveis (0) 1 2 3 4 5 6 7 1 0 0 1 0 1 0 1 2 0 0 1 0 1 0 1 3 1 1 0 1 0 1 0 4 0 0 1 0 1 0 1 5 1 1 0 1 0 1 0 6 0 0 1 0 1 0 1 7 1 1 0 1 0 1 0 Agora particiona-se o conjunto dos estados em subconjuntos que obedeçam às três condições acima enunciadas.2) distinguível ? (1. dado que 6 é o único aceitador. nenhum distinguível. Os pares que correspondem às células sombreadas serão agora marcados distinguíveis. LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 104 . O mesmo para todos os outros pares. Autómatos Finitos Da 1ª etapa. Vai-se ver à tabela de b se o par (2. Não é uma tarefa fácil.4): (3. Autómatos Finitos O estado 6 só é indistinguível de si próprio.11. Os vértices do grafo serão os estados.7. este procedimento manual de inspecção para se identificarem os pares distinguíveis não é fácil.2. portanto tem que ficar isolado num subconjunto. {3.Teoria da Computação Capítulo 2 . Dado um LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 105 . Como sabemos a pesquisa de cadeias de caracteres é uma das operações mais executadas na web. b a 124 b 357 b 6 a a Figura 2.5. 7} {6} verifica as condições. Para os restantes desenhe-se o grafo da propriedade indistinguível. 1 2 3 4 5 7 Figura 2. O DFA mínimo terá 3 estados. são equivalentes. 5. por exemplo em Hopcroft p. Hopcroft. Para um autómato com um elevado número de estados. 2. o DFA mínimo equivalente ao da Fig. Ele também é conhecido pelo algoritmo de enchimento da tabela (table. se na última tabela a respectiva célula tiver 0.12. Não é necessário desenhar a aresta reflexiva (do estado para ele mesmo). isto é.10. o original e o reduzido. A partição {1. Partição dos estados É bem visível a formação de dois sub-grafos conexos : {1.7. Entre dois estados existirá uma aresta se eles pertencerem a um par indistinguível. 68) Os autómatos finitos encontram na busca de texto uma aplicação interessante.156).7}. As linguagens dos dois autómatos.8 Um aplicação dos DFA: busca de texto (text search.filling algorithm. 4} {3. No entanto este algoritmo pode programar-se. 2.7. 2.4}. 1 tem o aspecto da Fig.Teoria da Computação Capítulo 2 . queremos encontrar todas as ocorrências delas num certo texto.1. Para se implementar o NFA. Autómatos Finitos conjunto de palavras. Sempre que há uma escolha.8. Para isso aplica-se a técnica padrão: constrói-se a tabela de transições e desenha-se o grafo depois.1. Se o alfabeto for composto pelos 26 caracteres do português (a b c d e f g h i j k l m n o p q r s t u v w x y z). o DFA equivalente ao NFA da Fig.8.2. que poderemos chamar palavras chave. 2.8. desenha-se um autómato com: .uma corrida de estados aos quais se chega depois de ler sucessivamente um carácter da palavra chave Σ c h 1 a 2 v 3 e 4 6 5 Figura 2. faz-se uma ou várias réplicas do NFA. construtivamente.8. Assim sendo.um estado inicial que transita para si próprio com todo e qualquer carácter do alfabeto. teremos muitas etiquetas para as arestas do autómato. por exemplo chave. que assim é. Para simplificar a sua escrita poderemos usar a notação Σ-a-e querendo dizer todos os caracteres do alfabeto menos a e e. DFA equivalente ao NFA da Fig. Fica ao cuidado do leitor verificar.2. 2. É no entanto mais prático calcular o DFA equivalente e então simulá-lo. Os autómatos finitos não determinísticos permitem fazê-lo de um modo expedito e simples. c Σ-v Σ-a c h 1 2 Σ-h a 3 v e 4 5 6 Σ-a Σ-e LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 106 . Esta notação é aceite pelo DEM (Deus Ex-Máquina).8. Para uma palavra chave. 2. pode-se escrever um programa que simula o seu funcionamento. NFA para busca da palavra chave. . calculando os estados em que está após ler um carácter. Σ-c Σ-c Figura 2. reconhecendo-as ou não como pertencentes a uma dada linguagem. Há outros tipos de autómatos... Esquema geral da um autómato finito Unidade de Controlo qk M e m ó r i a Ficheiro de saída LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 107 . 1 e aqui se reproduz na Fig. Exercício 2.1.3 NFA para o exemplo 2.1 Ficheiro de entrada S Figura 2.1. . 2. z}. cujo conteúdo pode variar conforme a evolução da configuração do autómato.9. .8.. c. como vimos já no Cap. Desenhar o DFA que aceita as palavras amarga e carta. Desenhar o o DFA equivalente. z}..9 Autómatos finitos transdutores Os DFA e NFA que estudámos até aqui são aceitadores e não têm saída. Ambos se podem enquadrar no esquema geral que vimos no Cap.9.8.. b.2.. m 5 6 e l 7 Desenhar o DFA equivalente. São os transdutores. Σ d o 1 c 2 e 3 4 0 Figura 2. Σ = { a.1 O seguinte NFA encontra num texto as palavras doce e mel..Teoria da Computação Capítulo 2 . 2. c.8.8. que têm um registo de saída. 1.. Autómatos Finitos Exercício 2. Σ = { a. Apenas lêem cadeias. de que se conhecem dois tipos: as máquinas de Mealy e de More. b. Teoria da Computação Capítulo 2 . Λ é o alfabeto de saída (conjunto finito de caracteres). q0 ) em que Q é o conjunto finito de estados internos. LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 108 . Tal como nos aceitadores. Uma Máquina de Mealy é definida pelo sexteto (agora há mais um músico …) M = (Q . qk) Definição 2. Σ é o alfabeto de entrada (conjunto finito de caracteres).Λ. γ : Q xΣ → Λ é a função de saída.9.9. δ .Σ . também um transdutor é representado por um grafo.1 Máquina de Mealy.9. Numa máquina de Mealy usa-se a notação da figura seguinte: qi 1/0 Entrada/Saída qj Figura 2. Autómatos Finitos 2.2 Notação da Máquina de Mealy Que tem a seguinte interpretação: estando a máquina no estado qi e lendo 1 na entrada. q0 ∈ Q é o estado inicial Comparando com a definição de autómato aceitador verificamos que não há aqui estados aceitadores (F). δ : Q xΣ → Q é a função de transição de estado. mas há em contrapartida um alfabeto de saída e uma função de saída.γ . A etiquetagem dos estados e das arestas é no entanto diferente.1 Máquinas de Mealy Numa máquina de Mealy a saída depende do estado interno do autómato actual e da entrada actual yk = f (sk. html) 2.4.9. Figura 2. escreve 1.lê 1. .ele.lê 0. passando a q2 . Autómatos Finitos . q2 0/0 Figura 2.1 Considere-se a máquina de Mealy da Fig. . Máquina de Mealy do exemplo 2.9.envia 0 para a saída.2.9. Esquema geral de uma máquina de Mealy.2. e funcionam em modo assíncrono: logo que a entrada variar pode variar a saída.3. As máquinas de Mealy podem implementar-se por circuitos lógicos.lê 1.br/~ailson/digital2/cld/chapter8/chapter08.9.Teoria da Computação Capítulo 2 . mantém-se em q1 1/λ 0/1 1/0 q0 0/λ No fim da leitura está em q1 e escreveu na saída λ1011.ufes.3 q1 Se lhe dermos a ler a cadeia 10111 ela faz: .. mantém-se em q1.9. escreve 1. escreve 1.lê 1. Máquinas de Moore As máquinas de Moore distinguem-se das de Mealy pelo facto de a sua saída depender apenas do estado actual yk = f (qk) LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 109 . escreve 0.lê 1 e escreve na saída λ transitando para o estado q1. Isto é.1. passa a q1. ( em http://www2. 1/1 Exemplo 2.doc4.9.transita para o estado qj . deslocou a cadeia para a direita uma casa (shift right). . depois com 1 na entrada transita para qj e escreva 0 na saída.Λ. γ : Q → Λ é a função de saída.6 faz. q0 ) Sendo Q o conjunto finito de estados internos. Definição 2.2.9.9. Autómatos Finitos isto é. Σ o alfabeto de entrada (conjunto finito de caracteres).γ . o deslocamento à direita da entrada que se lhe fornece. Máquina de Moore.Teoria da Computação Capítulo 2 . tal como a anterior. δ : Q xΣ → Q é a função de transição de estado. δ .Notação das Máquinas de Moore.9. q0 ∈ Q é o estado inicial. significando que quando entra no estado qi escreve 1 na saída.2 A Máquina de Moore da Fig.5. Exemplo 2.Σ . Λ o alfabeto de saída (conjunto finito de caracteres). 2. não dependem da entrada actual. Uma Máquina de Moore é definida pelo sexteto M = (Q . LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 110 .9. No seu grafo usa-se a notação Estado/Saída 1 qi /1 qj /0 Entrada Figura 2. ele. para as mesmas entradas.br/~ailson/digital2/cld/chapter8/chapter08. Trata-se de uma máquina síncrona (as mudanças na saída são sincronizadas com as mudanças de estado). LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 111 . passa a 4.com/univ/xse42. dá as mesmas saídas.9.html ou http://www. mantém 3. escreve 1 . Existe até software que simula estas máquinas e gera o circuito lógico a partir do autómato desenhado com um grafo (ver por ex.lê 1.lê 1.html). E vice-versa. estando no estado 0 3/1 1 . passa a 5.lê 0. passa a 1 escreve λ .html ).ufes.7.lê 1.Teoria da Computação Capítulo 2 . escreve 1 . Por isso a sua implementação por hardware faz-se com ilustrado na figura seguinte.lê 1.lê 1. A de Moore equivalente tem em geral um maior número de estados. escreve 1 . passa a 4. passa a 3.6 6/0 0 A máquina de Moore escreve na saída logo após transitar de estado.edu/~ee201/foundation/foundation_impl4. (Ignorando a saída do estado inicial na máquina de Moore).doc4. http://www.upenn. Estes dois exemplos indiciam que existe equivalência entre as máquinas de Mealy e de Moore: dada uma máquina de Mealy é possível encontrar uma máquina de Moore que. Figura 2.9. Esquema geral da Máquina de Moore (de http://www2. escreve 1 . Figura 2. As máquinas de Mealy e de Moore são os cavalos de batalha no projecto de circuitos lógicos complexos. Autómatos Finitos 1 Dá-se-lhe 1110101.lê 0. escreve 0 0 1/λ 0 1 1 4/1 0 0/λ 1 1 0 0 5/0 2/λ 1 0 Portanto escreveu λ111010.xilinx. passa a 5. escreve 0 .seas. G.Teoria da Computação Capítulo 2 . O software JFLAP (livre) para desenho e simulação de autómatos. Elements for the Theory of Computation. Sept 1955. John Hopcroft. pp... A Method for Synthesizing Sequential Circuits. Rajeev Motwani. Autómatos Finitos Bibliografia. Oxford University Press. Michael Sipser. 1997. R. http://www. H. Languages and Computation.. Introduction to Automata Theory. 2nd Ed. Prentice Hall. 2001 Models of Computation and Formal Languages. Peter Linz. Apêndice . Gregory Taylor. An Introduction to Formal Languages and Automata. Jeffrey Ullman.cs. Introduction to the Theory of Computation. Mealy. 1045–1079.duke. 1998. PWS Publishing Co. 2001. 2nd Ed. Jones and Bartelett Computer Science. Bell System Tech. vol 34. Addison Wesley. 3rd Ed. Harry Lewis and Christos Papadimitriou. 1998. J.edu/csed/jflap LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 112 . Autómatos Finitos Documento de trabalho 113 .Teoria da Computação LEI/DEI/FCTUC/2009/@ADC Capítulo 2 . O software DEM. etc.Teoria da Computação Capítulo 2 . LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 114 .Deus Ex-Maquina (também para a simulação de autómatos) está disponível na página da cadeira. Autómatos Finitos Livre: This work is licensed under a Creative Commons Attribution-NonCommercialShareAlike 2.5 License. gramáticas. Tem várias outras funcionalidades muito úteis em capítulos posteriores (equivalência de autómatos.). 2 Expressões Regulares 117 3.Teoria da Computação Cap.5 Gramáticas regulares 140 3. LINGUAGENS REGULARES E GRAMÁTICAS REGULARES 3.6 Síntese das equivalências 151 LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 115 .3 Regras algébricas para expressões regulares 126 3.1 Introdução 117 3.4 Relação entre expressões regulares e linguagens regulares 130 3. 3 Expressões regulares. linguagens e gramáticas CAPÍTULO 3 EXPRESSÕES REGULARES. Teoria da Computação LEI/DEI/FCTUC/2009/@ADC Cap. 3 Expressões regulares. linguagens e gramáticas Documento de trabalho 116 . isto é. dado que toda a linguagem regular tem o seu DFA ou NFA. gramáticas regulares. São expressões com símbolos de um dado alfabeto e caracteres operadores sobre as cadeias. Dada uma linguagem regular. É esse o objectivo das expressões regulares: são formas simples. expeditas. e neste caso diz-se gramática regular. com recurso aos autómatos finitos. E é sempre possível encontrá-la. ver qual a sua linguagem. pode interessar conhecer uma gramática que a gere. Interessa por isso uma forma mais simples de representar uma linguagem regular. com muita informação. Poderemos assim representar uma linguagem pelo seu autómato. Estudá-la-emos neste capítulo. para uma expressão regular há-de haver um autómato finito que represente a mesma linguagem. e se a uma expressão regular corresponde sempre uma linguagem regular. Dado um alfabeto Σ. Introdução Vimos que uma linguagem é regular se for aceite por um DFA ou um NFA. uma expressão regular é desenvolvida a partir de - os símbolos do alfabeto - os operadores de LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 117 . Autómatos finitos. de representar linguagens regulares. não é possível.Teoria da Computação Cap. 3 Expressões regulares. Há portanto uma estreita relação entre expressões regulares e linguagens regulares.1. Já vimos que uma linguagem pode ser definida por uma gramática. Mas se assim é. são três formas de representar o mesmo conjunto: uma certa linguagem regular. Expressões regulares Uma expressão regular é uma forma de descrever linguagens regulares. expressões regulares. que seja de utilização expedita.2. Estudaremos neste capítulo a forma como essas três representações se relacionam. 3. são expressões algébricas. de modo análogo ao de uma fórmula química de uma substância: olhando para ela extrai-se logo uma grande quantidade de informação sobre a sua natureza. por simples inspecção visual. linguagens e gramáticas 3. Se o autómato tiver um elevado número de estados. abb. a.. LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 118 . bbb.c). Como obter ababaa ? Fica o desafio ao leitor. aaa. 1. a+b. Consideremos o alfabeto Σ={a. aab. abc.. (a+bc)(a+b. linguagens e gramáticas  união : ∪ ou +  concatenação: ⋅  fecho-estrela : * de parênteses Exemplo 3. …. ab. aa. Por definição de *. aabc.m≥ 0 ou seja λ.Teoria da Computação - Cap. c} a linguagem (a + b)* é composta pelas cadeias cadeias λ..1. b. b. Muitas linguagens são infinitas e não se podem por isso escrever por enumeração explícita. b. . b.. No entanto poderemos defini-las formalmente. bbbaabab. Nele a linguagem finita L = {a} é definida pela expressão regular : a A linguagem L = {a. bcbc. teremos L= {(a+b⋅c)0 ∪ (a+b⋅c)1 ∪ (a+b⋅c)2 ∪ (a+b⋅c)3 … } = {λ. abcbc.c). São como que expressões algébricas num dado alfabeto. z}. O operador união em conjuntos corresponde ao operador adição nas expressões regulares. Finalmente.b. … } No alfabeto Σ = {a. c }. c. abbaa.c.. a linguagem (c+∅) contém apenas a cadeia c. 3 Expressões regulares. n. bca. As expressões regulares são formas sintéticas de exprimirmos as operações sobre cadeias que estudámos no Cap. No mesmo alfabeto a linguagem a*b* é composta pelas cadeias an bm .2. bc. é definida pela expressão regular: a∪b∪c ou a+b+c. aabbbb. aaa. bb. a.Qualquer cadeia que contenha só a’s e b’s pode ser obtida desta expressão regular. abca. A linguagem definida pela expressão regular (a+b⋅c)* é uma linguagem infinita devido ao fecho-estrela. ainda no mesmo alfabeto. ba. a. aabb. (a+bc)(a+b. bcbcbc.c)(a+b. aa. …} = {λ.. Teoria da Computação Cap. 3 Expressões regulares, linguagens e gramáticas 3.2.1. Definição formal, recursiva, de expressão regular Uma definição por recursividade usa como sabemos um conjunto de primitivas e uma recursão. Assim é também para as expressões regulares: Definição 3.2.1. Seja um Σ um dado alfabeto. Então: 1. As expressões regulares primitivas são compostas por zero ou um carácter: ∅, λ e a∈ Σ (para ∀a∈Σ ) são todas expressões regulares primitivas 2. Recursão: indica como se obtêm expressões regulares a partir umas das outras: Se r1 e r2 são expressões regulares, também o serão 2.1 r1+r2, (soma de duas expressões regulares) 2.2 r1⋅r2, (concatenação de duas expressões regulares) 2.3 r1* , r2* (fecho-estrela de uma expressão regular) 2.4 (r1), (r2) (parêntese de uma expressão) 3. Uma cadeia é uma expressão regular se e só se ela puder ser derivada a partir das expressões regulares primitivas e pela aplicação de um número finito de vezes das regras de 2 (princípio da recursividade) Exemplo 3.2.2 Seja o alfabeto Σ={0,1} A expressão regular seguinte define a linguagem indicada 01* = {0, 01, 011, 0111,…}, 0 concatenado com um número arbitrário de 1’s. Se concatenarmos toda e qualquer cadeia desta linguagem com 01 obtém-se (01*)(01) = {001, 0101, 01101, 011101, …..} Por outro lado LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 119 Teoria da Computação Cap. 3 Expressões regulares, linguagens e gramáticas (0+1)* = {0, 1, 00, 01, 10, 11, …..}, i.e., toda e qualquer as cadeias com “0” e “1”. Analisemos agora a expressão regular (0+1)*00(0+1)* À esquerda temos (0+1)*, qualquer cadeia de 0’s e 1’s. À direita temos a mesma coisa. Mas no centro temos o par 00. Quer dizer que esta expressão regular representa qualquer cadeia que contenha o par 00 precedido por qualquer número de 0’s e 1’s e seguido de qualquer número de 0’s e 1’s, ou seja, {00, 1001, 00110, 10100, 010101000111000…..}, i.e., todas as cadeias de 0 e 1 contendo “00” em qualquer posição. O par 00 tem que aparecer uma vez, mas pode aparecer além disso qualquer número de vezes. Exemplo 3.2.3 No alfabeto Σ = {a,b,c}, será (a+b⋅c)*⋅(c+∅) uma expressão regular ? Para responder temos que ver se ela se pode obter a partir das expressões regulares primitivas por uma recursão: Os símbolos a,b,c,∅ são expressões regulares primitivas. b.c é uma expressão regular (er) , do item 2.2. da definição, a+b.c é uma er, do item 2.1 da definição, (a+b.c) é uma er, do item 2.4 da definição, (a+b.c)* é uma er, do item 2.3 da definição, (c+∅) é uma er, dos itens 2.1 e 2.4 da definição, (a+b⋅c)*⋅(c+∅) é uma er do item 2.2 da definição. q.e.d E (a + c + ) é expressão regular ? a , c são er primitivas LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 120 Teoria da Computação Cap. 3 Expressões regulares, linguagens e gramáticas a+c é uma er a+c+ não é er, logo (a+c+) não é expressão regular. Exemplo 3.2.4. Seja a expressão regular (1+10)*. Que linguagem define ? Pela definição de fecho-estrela teremos sucessivamente: (1+10)*= (1+10)0∪ (1+10)∪ (1+10)2∪ (1+10)3∪… = λ∪(1+10)∪ (1+10) (1+10) ∪ (1+10) (1+10) (1+10) ∪… = {λ,1+10, (1+10) (1+10) , (1+10) (1+10) (1+10) , …} = {λ,1+10, 11,110,101,1010, (11+110+101+1010)(1+10), …} = {λ,1+10, 11,110,101,1010, 111,1110,1101,11010, 1011,10110,10101,101010,…} Qual a característica comum a todas estas cadeias? Elas começam todas por 1 e podem ter um número arbitrário de 1’s seguidos. Os 0’s são introduzidos pela parcela 10 quando esta é potenciada. Mas sendo potenciada, introduz 10, 1010, 101010, …, ou seja, quando introduz um zero mete sempre 1 antes, e por isso não é possível introduzir dois zeros seguidos. O facto de ambas as parcelas da soma se iniciarem por 1 faz com que todas as suas concatenações possíveis se iniciem por 1. Poderemos concluir que a linguagem é composta por todas as cadeias em {0,1} que se iniciam por 1 e não têm qualquer par de zeros. Exemplo 3.2.5 E no caso (0+1)*011 ? A primeira parte (0+1)* produz todas as cadeias. A segunda parte, 011, concatena o sufixo 011 a todas as cadeias da primeira parte. Portanto temos a linguagem de todas as cadeias em {0,1} que terminam em 011. LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 121 Teoria da Computação Cap. 3 Expressões regulares, linguagens e gramáticas Exemplo 3.2.6. Para 0*1*: Teremos um número arbitrário de 0’s (de 0*) seguido de um número arbitrário de 1’s (de 1*). Podemos resumir dizendo que é a linguagem de todas as cadeias que não têm um “0” depois de “1”. Exemplo 3.2.7. Seja agora 00*11*. Esta obteve-se da anterior colocando um 0 obrigatório no início, e um 1 obrigatório no meio. Portanto tem pelo menos um 0 e um 1.Além disso não aparece qualquer 0 depois de 1.A linguagem é portanto composta por todas as cadeias com pelo menos um “0” e um “1”, e nenhum “0” depois de “1”. 3.2.2. Linguagem associada a uma expressão regular Definição 3.2.2. Se r é uma expressão regular, L(r) denota a linguagem associada com r. Esta linguagem é definida pelas regras seguintes: 1. r=∅ é uma expressão regular , o conjunto vazio 2. r=λ é uma expressão regular, o conjunto {λ} com um elemento 3. Para todo o a∈Σ, r=a é uma expressão regular denotando {a} Se r1 e r2 são expressões regulares, então 4. L(r1+r2) = L(r1) ∪ L(r2) , união de duas linguagens 5. L(r1⋅r2) = L(r1) L(r2) , concatenação de L(r1) com L(r2) 6. L((r1)) = L(r1) 7. L(r1*) = (L(r1))* As regras 4 a 7 usam-se para reduzir recursivamente uma linguagem L a expressões mais simples. LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 122 Teoria da Computação Cap. 3 Expressões regulares, linguagens e gramáticas As regras 1 a 3 são as condições terminais para esta recursão. Para se verificar qual a linguagem que corresponde a uma dada expressão regular, aplicam-se aquelas regras tantas vezes quantas as necessárias. A precedência dos operadores é a seguinte 1º- fecho- estrela (*), 2º- concatenação (⋅), 3º- (+) união Exemplos 3.2.8: i) Seja o alfabeto Σ={x}. A linguagem de xx* será L(xx*) ={x, xx, xxx,...}= L(x+). ii) E L(x(xx)*) ={x, xxx, xxxxx,..} =L(xímpar). Em Σ = { a, b, c } iii) A linguagem de (a+c)b* será L((a+c)b*) = L(a+c)L(b*) (regra5)= (L(a) ∪L(c)) (L(b))* (regra 4 e regra 7) = = { a, c } { λ, b, bb, bbb, … } (regra 3) = ={ a, c, ab, cb, abb, cbb, abbb,..} iv) L(c+∅) = { c } (regra 4 e regra 3) Em Σ = {a, b} iv) L((a+b).(a+b).(a+b)) = L(a+b) L(a+b) L(a+b) (regra 4) = {a,b} {a,b} {a,b} (regra 3) = {aaa, aba, abb, baa, bba,..} LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 123 Teoria da Computação Cap. 3 Expressões regulares, linguagens e gramáticas v) Em Σ = {0,1} escrever a expressão regular para a linguagem das cadeias que contêm um número ímpar de zeros, ou seja, L ={w : w contém um número ímpar de zeros } Nota: (a+b)*= (a+b)*+(a+b)* (a união de um conjunto consigo próprio dá o próprio conjunto) (a+b)* = (a+b)*(a+b)* (a concatenação de qualquer cadeia de a’s e b’s com qualquer outra cadeia de a’s e b’s dá sempre uma cadeia de a’s e b’s; por outro lado λλ=λ). (a+b)* = a(a+b)*+b(a+b)*+λ (a união de todas as cadeias começadas por a com todos as cadeias começadas por b e com a cadeia vazia dá o conjunto de todas as cadeias com a’s e b’s mais λ. Exercícios: 1. Qual é a linguagem representada pela expressão regular: i) (1+01+001)*(λ+0+00) ii) ((0+1)(0+1))*+((0+1)(0+1)(0+1))* 2. Exemplos de linguagens complementares Seja Σ = {0,1}.Encontrar uma expressão regular para as linguagens: i) L(r) = {w∈ Σ* : w tem pelo menos um par de zeros consecutivos } ii) L (r) = {w∈ Σ* : w não tem qualquer par de zeros consecutivos } Resolução: i) Uma cadeia da linguagem tem que conter “00” em algum lado. Antes ou depois do par de zeros pode conter qualquer cadeia arbitrária. Como sabemos uma cadeia arbitrária de zeros e uns é dada por (0+1)*. A solução tem por isso três partes; o par 00 precedido e sucedido por (0+1)* ou seja, LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 124 Teoria da Computação Cap. 3 Expressões regulares, linguagens e gramáticas r1 = (1+0)*00(1+0)* Note-se que o enunciado não impede a existência de mais pares de zeros para além do obrigatório. Nunca confundir “ter um par de zeros” com “ter um só par de zeros”. ii) Esta linguagem é a complementar da anterior. No caso dos autómatos sabemos como desenhar o autómato do complemento a partir do autómato original: basta trocarmos a missão dos estados, passando os aceitadores a não aceitadores e os não aceitadores a aceitadores. Com expressões regulares não há nenhuma técnica assim expedita de encontrar o complemento. Tem que se pensar na questão desde a base. Se a linguagem não tem qualquer par de zeros consecutivos, quer dizer que sempre que aprece um “0” ele deve ser seguido imediatamente por um “1”, i.e., o 0 só pode aparecer na cadeia “01” Antes ou depois de “01” pode aparecer um número arbitrário de 1’s, produzindo a cadeia 1....1011.....1. Portanto a linguagem contém (1...1011...1)*, ou, equivalentemente, (1*011*)*. Note-se que ao fecharmos (fecho-estrela) a expressão estamos a replicá-la um número arbitrário de vezes, permitindo assim gerar cadeias com um número arbitrário de zeros. Mas cada zero aparece acompanhado à esquerda e à direita por um número qualquer de 1’s. Notese que obrigamos todas estas cadeias a terminar em 1, o que é limitativo. Não estão ainda incluídas as cadeias que terminam em “0”. Poderemos obtê-las da expressão anterior concatenando-lhe um zero no fim, obtendo-se (1*011*)*0 . Faltam também as cadeias que só têm 1’s; para elas basta adicionar 1*. Finalmente juntam-se as cadeias que só têm 1’s excepto o último que é “0”, 1*0. Teremos a união destes subconjuntos todos, pelo operador + em expressões regulares: (1*011*)* + (1*011*)*0 + 1* + 1*0 Este resultado responde à pergunta. Por uma questão de elegância podemos procurar simplificar a expressão. Pondo em evidência os factores comuns às parcelas obtém-se a LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 125 Teoria da Computação Cap. 3 Expressões regulares, linguagens e gramáticas r2= (1*011*)* (λ+0) + 1* (λ+0) Pensando de outro modo, talvez mais simples, as cadeias sem zeros consecutivos são a repetição arbitrária das subcadeias “1” e “01”, isto é, (1+01)*, às quais se pode ou não adicionar um zero no fim , obtendo-se r3 r3= (1+01)*(0+λ) equivalente à anterior, mas ainda mais elegante. Para uma dada linguagem existe um número ilimitado de expressões regulares equivalentes. Importa no entanto obter uma que seja simples. Não existe nada na forma de r1 e r2 ou r1 e r3 que sugira que definem linguagens complementares. Este facto indica uma das limitações das expressões regulares. 3.3.Regras algébricas para expressões regulares As expressões regulares são expressões algébricas sobre as quais se podem fazer algumas operações (união, concatenação, fecho estrela). Essas operações devem obedecer a um certo número de regras. Podemos agrupá-las em regras comutativas, regras associativas, regras distributivas, identidades e anuladores, regras de fecho. Duas expressões regulares são equivalentes se elas denotam a mesma linguagem. Quando se simplifica uma expressão regular, obtêm-se sucessivamente expressões regulares equivalentes. 3.3.1 Regras comutativas e associativas Sejam L, M e N expressões regulares. A união de duas expressões regulares é comutativa L+M=M+L A demonstração desta propriedade faz-se atendendo à natureza da operação em causa. LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 126 Teoria da Computação Cap. 3 Expressões regulares, linguagens e gramáticas De facto a união de duas linguagens é o conjunto das cadeias de ambas, postas no mesmo “saco”, por qualquer ordem. Podemos colocar primeiro as de L e depois as de M, ou ao contrário, que o conjunto resultante da união não se altera. Portanto a união é comutativa. A união de linguagens é associativa (L + M) + N = L + (M + N) Se queremos fazer a união de três conjuntos, poderemos unir os primeiros dois e depois unir o resultante com o terceiro; ou podemos unir os dois últimos, unindo depois o primeiro com o conjunto resultante. A concatenação de expressões regulares é associativa (LM)N = L(MN) A concatenação de três cadeias pode fazer-se indiferentemente de dois modos: concatenar as duas primeiras e depois a terceira à direita; ou concatenar as duas últimas e depois a primeira à esquerda. Mas não é comutativa LM≠ML A prova é imediata. 3.3.2 Regras distributivas A concatenação tem alguma analogia com o produto algébrico e a união com a adição. A concatenação é distributiva à esquerda em relação à união: L (M + N) = LM + LN Por exemplo aba(bba+abb)=ababba+abaabb. Atendendo ao significado de +, união, temos que concatenar o prefixo aba com cada uma das cadeias dentro do parêntese. O resultado é a união dessas concatenações. E também distributiva à direita LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 127 Teoria da Computação Cap. 3 Expressões regulares, linguagens e gramáticas (M + N)L = ML + NL Prova semelhante, agora com um sufixo em vez de prefixo. A união não é distributiva em relação à concatenação nem à direita nem à esquerda (MN) + L ≠ (M + L)(N + L) L + (MN) ≠ (L + M)(L + N) Para provar que assim é, faz-se prova por contradição: supõe-se que é igual e procura-se um caso em que não o seja. As propriedades têm que ser gerais, válidas para todas as linguagens e todas as cadeias em cada linguagem. (ab)+c= (a+c)(b+c) Ora (a+c)(b+c)=ab+ac+cb+cc por definição de união e de concatenação. Mas isto é diferente de (ab)+c, o que é suficiente para a prova por contradição. 3.3.3 Identidades e anuladores (zeros) Numa certa álgebra, a identidade é o elemento que operado com qualquer outro elemento dá esse elemento, tal como 1 na multiplicação numérica. O conjunto vazio, ∅ , é a identidade para a união porque ∅+L=L+∅=L Já para a concatenação, a identidade é a cadeia vazia porque λL=Lλ=L O anulador é o elemento que operado com outro elemento dá sempre o conjunto vazio. No caso da concatenação é o conjunto vazio ∅ L = L∅ = ∅ Para a união não existe anulador. E para a intersecção? LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 128 Teoria da Computação Cap. 3 Expressões regulares, linguagens e gramáticas 3.3.4. Regras do fecho-estrela O fecho estrela é uma operação muito importante em expressões regulares quando se trata de linguagens infinitas. Ele goza de algumas propriedades cuja demonstração fica ao cuidado do leitor. (i) (L*)* = L* (ii) L+ = LL* = L*L (iii) L* = L+ + λ (iv) ∅ * = λ (v) λ * = λ (vi) ( L+M )* = (L* M*)* Esta última merece alguns comentários, já que as restantes são mais ou menos evidentes. Vejamos um exemplo de duas cadeias: (a+b)* = (a*b*)* À esquerda temos qualquer cadeia com qualquer número de a’s e b’s e por qualquer ordem. Qualquer destas cadeias também pode ser obtida pela parte direita. Se começa por b’s, faz-se primeiro a0b*, depois a*b0 para os a’s, novamente a0b* para b’s e assim sucessivamente. Repare-se que o fecho externo permite fazê-lo tantas vezes quantas as necessárias. Poderemos ver que qualquer cadeia gerada pela expressão da direita pode ser gerada pela expressão da esquerda e vice-versa. Para uma prova mais formal ver Hopcroft p. 118. 3.3.5. Outras regras algébricas Para provar uma regra algébrica qualquer, por exemplo L + ML = (L + M)L LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 129 3 Expressões regulares. 1º Definem-se NFA para as expressões regulares primitivas ) os três primeiros elementos da definição 3.2. no caso por exemplo (a+ba) = (a + b)a que facilmente se vê ser falso ( e portanto aquela propriedade é falsa). 3.4. vice-versa.Teoria da Computação Cap. como vimos no Cap. recorre-se à definição recursiva de L(r) e segue-se a definição 3. Para auxiliar a prova podem-se substituir os símbolos das er por caracteres de um alfabeto.1) i) NFA aceitador de L1=∅ : r=∅ LEI/DEI/FCTUC/2009/@ADC q0 q1 Figura 3. 3. Aceitador do conjunto vazio Documento de trabalho 130 . Se pudermos construir um NFA a partir de uma expressão regular r qualquer.1 De uma expressão regular a um NFA: expressões regulares definem linguagens regulares Uma linguagem é regular. de for aceite por um DFA ou por um NFA (dado que estes são equivalentes a DFA). basta dar um contra exemplo.1. linguagens e gramáticas tem que se provar que qualquer cadeia gerada pela er da esquerda é também gerada pela RE da direita. Relação entre expressões regulares e linguagens regulares As expressões regulares são como vimos uma forma de especificar linguagens regulares. De facto assim é. Para o provar. Façamos a prova em duas etapas. Para provar que é falsa. para toda a expressão regular existe uma linguagem regular.1 de expressão regular. então essa expressão regular denotará uma linguagem regular L(r).4.4. Assim sendo para toda a linguagem regular existe uma expressão regular e. 4 Um antómato M genérico com o estado inicial q0 e o estado final qF. Construam-se os NFA para a segunda parte da Definição 3.4.4. Aceitador de λ a iii) NFA aceitador de L3={a} q1 q0 r=a Figura 3. 3º Suponhamos agora que temos dois NFAs M(r1) e M(r2) que aceitam as linguagens L(r1) e L(r2) definidas pelas expressões regulares r1 e r2. 3 Expressões regulares.2.4. Aceitador de a 2º Admitamos que temos uma expressão regular r e que o NFA que aceira L(r) é representado pela Figura 3. Autómato da soma de expressõe regulares LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 131 . λ ii) NFA aceitador de L2={λ} q0 r=λ q1 Figura 3. M (r) q0 qf Figura 3.4.2 do modo seguinte: iv) L(r1+r2) M (r1) λ λ q q0 λ M (r2) λ Figura 3.4. linguagens e gramáticas Não havendo possibilidade de alcançar o estado aceitador.2.Teoria da Computação Cap.5. e linguagem é o vazio.4 genérica. Note-se que qualquer NFA pode ser representado com um só estado final.3. com λ. L1 pela parte de cima e L2 pela de baixo. Repare-se que r1*=λ+r1+r1r1+r1r1r1+ … O λ vai pela parte de baixo do NFA directamente para o aceitador. 3 Expressões regulares.4. portanto está incluído na linguagem do NFA. LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 132 . vai até qf e volta para q0 pela parte de cima. Autómato do fecho-estrela de uma expressão regular. λ vi) L(r1*) M (r1) q λ λ qF λ Figura 3. Este NFA já não é tão evidente.Teoria da Computação Cap.4. Já r1r1 parte de q0 . As outras potências de r1 dão tantas voltas quantas as necessárias até ao estado final.7.6. v) L(r1r2) M (r1) q λ M (r2) λ λ qf Figura 3. linguagens e gramáticas O NFA aceita a união das linguagens. Autómato da concatenação de duas expressões regulares O NFA aceita uma cadeia que resulte da concatenação de uma cadeia de L1 (que leva o autómato ao estado aceitador da de M(r1)) com uma cadeia de L2 que lava depois a qf. O r1 vai através da máquina desde q0 até qf. linguagens e gramáticas Usando estas máquinas é possível construir um NFA para qualquer expressão regular. λ λ λ 1 λ Figura 3.1 1 0 DFA q0 Figura 3.4. Depois aplica-selhe a regra do fecho estrela. L(r) é uma linguagem regular Se r é uma expressão regular.4.4.1.1} 0. Exemplo 3. existe algum autómato finito não-determinístico que aceita L(r). em Σ={0.1. DFA de 1* LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 133 .11. Logo L(r) é uma linguagem regular. Autómato equivalente de 1* q0 Calculando o DFA equivalente obtém-se. 3 Expressões regulares. Pode-se por isso enunciar o teorema: Teorema 3.Teoria da Computação Cap.1 r=1* Sendo 1 uma expressão regular primitiva. desenha-se o seu autómato.8 Autómato NFA de 1* Agora pode-se demonstrar que este NFA é equivalente a 1 Figura 3.10.4.4. . 2 chamámos-lhe δ*.4. Partindo do estado q0. i. Desenha-se depois um outro de a e um outro de b que se concatenam. A partir do de a desenha-se o de a* que se concatena com o de b. a linguagem total será a união de todos os subconjuntos gerados deste modo.2. expressões regulares primitivas. 3. Grafos de transição generalizados são grafos de transição em que as arestas podem ser etiquetadas por expressões regulares (e não só por caracteres). No Cap. r=a+a*b Desenham-se os NFA de a e de b. Finalmente coloca-se um outro de a em paralelo com o de a*b. De um NFA a uma expressão regular: expressões regulares para linguagens regulares A toda a linguagem regular se pode associar um NFA e portanto um grafo de transições. colocando-se o conjunto em paralelo com o anterior. r=ab+(b+ab)* Desenha-se o de a que se concatena com o de b. procuram-se todos os caminhos possíveis até ao estado final e as suas etiquetas. É possível depois encontrar uma expressão regular que gere todas essas etiquetas.e. As cadeias expressas por essa expressão regular são um subconjunto da linguagem aceite pelo grafo de transição generalizado. Agora aplica-se o fecho estrela ao conjunto obtido.2. linguagens e gramáticas Exemplo 3. Temos então o seguinte caminho pata encontrar uma expressão regular para uma dada linguagem NFA → grafos de transição generalizados → expressões regulares LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 134 . A etiqueta de um caminho desde o estado inicial até ao estado final é a concatenação das etiquetas das arestas do caminho. a concatenação de expressões regulares e portanto é uma expressão regular.1. usam-se os grafos de transição generalizados.Teoria da Computação Cap.4. 3 Expressões regulares. Para facilitar esta operação. Desenha-se novamente o de b que se paraleliza com o de ab. Uma aresta etiquetada com um único carácter a interpreta-se como etiquetada pela expressão regular a.. O do meio pode ser eliminado. um ciclo fechado. Grafo genérico de três estados. e c d q qi a qj b Figura 3. Uma aresta etiquetada por vários caracteres a.4. 3 Expressões regulares. No proceddimento tem que se assegurar que que não se altera a linguagem aceite pelo NFA e denotada pelo conjunto das etiquetas que se podem gerar desde o estado inicial até ao estado final. ou LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 135 . Pode-se obter um grafo generalizado equivalente.12. Por exemplo para ir de qi até qi. b.. qi. Para que isso aconteça temos que analisar com atenção as etiquetas (expressões regulares) das arestas das transição possíveis entre os estados que hão-de restar. Pode-se assim afirmar que para toda a linguagem regular existe um grafo de transição generalizado que a aceita.Teoria da Computação Cap. qj. em que q não é nem um estado inicial nem um estado final. linguagens e gramáticas O grafo de um NFA pode considerar-se um grafo generalizado desde que se interpretem apropriadamente as suas etiquetas. Por outro lado toda a linguagem aceite por um grafo generalizado é uma linguagem regular. com um número qualquer de e’s.4.12 de um grafo generalizado com estados Q= {q.. Consideremos o exemplo da figura 3. eliminando o estado q. .. ... interpreta-se como etiquetada pela expressão regular a + b + .. A equivalência entre grafos generalizados define-se em termos da linguagem aceite.. vai-se com a até q. }. com menos um estado. seguindo depois para qj com b.4. qi → qi : ae*d qi → qj : ae*b qj → qj : ce*d qj → qi : ce*b Obtém-se assim o grafo de transição generalizado sem o estado q. Num grafo com mais estados. LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 136 . Note-se que no estado q entram e saem arestas para ambos os estados adjacentes e para si próprio. E de modo análogo para as outras transições. o processo completo exige que este procedimento seja feito sucessivamente para todos os pares (qi. Por outro lado elimina-se um estado de cada vez. Resumindo. Este procedimento assegura que a linguagem aceite não é alterada. mais complicado. Para ir de qi até qj passa-se em q e aí pode ler-se um número arbitrário de e’s. No caso de alguma delas não existir. omite-se o correspondente no grafo simplificado.13. mantém-se em q e depois com d regressa a q. 3.4. até restarem apenas dois. Grafo resultante da eliminação do estado intermédio da Fig.Teoria da Computação Cap.12.. concatenando dá ae*d. todos os pares que estejam ligados a q). qj) em Q – {q} antes de se remover q (i. linguagens e gramáticas seja e*. Fig. 3 Expressões regulares.4. ae*d ce*b ce*d qi qj ae*b Figura 3.e. 3. As transições generalizadas permitem-nos reduzir qualquer autómato finito a um outro com apenas dois estados.13. enunciar-se o teorema seguinte. seguido de r2 . Teorema 3. Qualquer NFA pode ser reduzido a esta forma. LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 137 . r2.14. até que se fique apenas com o estado inicial e o estado final. pode-se ir por r1 (um número arbitrário de vezes). 3 Expressões regulares.14 seguinte. Pode-se interpretar como um grafo de transição generalizado Aplica-se-lhe o procedimento anterior de eliminar sucessivamente vértices q. linguagens e gramáticas Pode provar-se que a construção seguida produz um grafo generalizado equivalente ao inicial. A expressão regular que denota a linguagem aceite pelo grafo é r=r1*r2(r4 + r3r1*r2)* De facto.4.Teoria da Computação Cap. Então existe uma expressão regular r tal que L=L(r).2).4.2 (3. Seja L uma linguagem regular.4. para se ir de q0 a qf . obtendo-se o grafo da Figura 3. Pode agora. em que r1. r1 r4 r3 q0 qf r2 Figura 3. r4 são expressões regulares. Demonstração: Existe um NFA que aceita L. r3. com um só estado final e tal que o estado inicial q0 não é estado final. e em consequência. 4 15. Exemplo 3. é necessário introduzir uma pequena alteração no autómato para que o estado inicial não seja o aceitador. 3.2. 3 Expressões regulares.16.1 LEI/DEI/FCTUC/2009/@ADC 1 0 Figura 3.4.16. Caso em que o estado inicial é aceitador.4. a expressão regular é r=(r1*+ (r2r4*r3))* Exemplo 3. linguagens e gramáticas . No caso de se obter um grafo em que o estado inicial também é estado final.Teoria da Computação Cap. Basta para isso introduzir um estado adicional q que passa a ser o inicial e do qual se transita para A através de λ. voltando para trás. de r3 seguido de r1* seguido de r2 . r1 r4 r3 qf r2 Figura 3.4.1 Calcular a expressão regular do autómato da Fig.4.seguido de r4 ou. e esta volta um número arbitrário de vezes. 3. Resulta um NFA equivalente.16 Documento de trabalho 138 .2.17.2. Introdução de um estado inicial na Fig. Antes de aplicar a construção subjacente ao teorema 3.4.4. q A λ A 1 1 1 0 C 1 B B C 1 0 0 Figura 3. Eliminação do estado C. r=λ(r4 + ∅)* =r4*= r4 3.Teoria da Computação Cap. LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 139 . Logo teremos o autómato r4 λ q0 A r4 = ( 0 + 11*0(11*0)*0 )* Figura 3. 3 Expressões regulares. Basta calcular o caminho de A para A passando por B. e expressões regulares.4. Logo os caminhos totais de A para A são 0+11*0(11*0)*0 um número arbitrário de vezes. Ainda de A para A temos 0 que se soma ao anterior. Elimine-se agora B. linguagens e gramáticas Elimine-se o estado C. Gramáticas Regulares Já vimos duas maneiras de especificar linguagens regulares: autómatos finitos (DFA ou NFA). O caminho de A para B. Teremos por isso 11*0 0 λ q 11*0 A B 0 Figura 3. De B para B passando por C é 11*0.17. que é 11*0(11*0)*0. As gramáticas são uma terceira forma de especificação de linguagens.18. Eliminação do estado B Alicando agora o resultado geral obtém-se a expressão regular do autómato inicial. Ambos têm as suas vantagens e inconvenientes. De B para A passando por C não há. passando por C é 11*0. De uma podemos obter a outra.4.5. ou seja (0+11*0(11*0)*0)*. 3 Expressões regulares.b}. Exemplos de gramáticas regulares: Exemplo 3. Gramática regular Uma gramática G = (V. é linear em B se x for uma constante. em que A. A → x. É linear por ter apenas uma variável. 1. linguagens e gramáticas como vimos no Cap.P) diz-se linear à direita se todas as suas produções são da forma A → xB. variáveis do conjunto das variáveis x∈ T. {a.T. No caso das linguagens regulares teremos gramáticas regulares. A → x.1. Na parte direita das produções aparece no máximo uma variável e ela situa-se sempre na posição mais à direita ou sempre na posição mais à esquerda do lado direito das produções. S. tal como uma equação A=xB.1.S.1.5. B ∈ V. símbolo do conjunto dos símbolos terminais O seu nome deriva do facto de a variável aparecer à direita do símbolo terminal.1 G1= ({S}. 3. uma classe de gramáticas lineares. linear à direita P1 : S → abA LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 140 . e por isso as cadeias vão sendo produzidas da esquerda para a direita.Teoria da Computação Cap. Uma gramática diz-se regular se ela é ou linear à esquerda ou linear à direita.5.5. Uma gramática diz-se linear à esquerda se todas as suas produções têm a forma A → Bx. P1) . Gramáticas lineares à esquerda e à direita Definição 3. 1.Teoria da Computação Cap.A.1.3. Exemplos de gramáticas não-regulares Exemplo 3.5. 3 Expressões regulares. P2 } . Generalizando conclui-se que a gramática G1 produz a linguagem (regular) definida pela expressão regular r=(ab)*a Exemplo 3. fica (ab)2S depois para eliminar S tem que se aplicar P2 resultando em (ab)2a. linear à esquerda P1 S → Aab P2 A → Aab | B P3 B→a Como derivar aababab de G2 ? S ⇒ Aab ⇒ Aabab ⇒ Aababab ⇒ Bababab ⇒ aababab Aplicando P2 sucessivamente conclui-se que esta gramática gera a linguagem regular definida pela expressão regular r=aab(ab)*. linguagens e gramáticas P2 : S → a Também se pode escrever em forma mais compacta por P : S → abA|a Como derivar ababa de G1 ? S ⇒ abS ⇒ ababS ⇒ ababa Aplicando P1 sucessivamente duas vezes e depois P2 para terminar.B}.2 G2 =({S. Aplicando duas vezes. De cada vez que se aplica P1 introduz-se ab.5.b}. {a. LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 141 . Aplicando três vezes P1 fica (ab)3S e depois P2 termina a derivação em (ab)3a. S. S.4. P } P: S ⇒ aSSa | λ é não linear porque do lado direito de uma produção aparecem duas variáveis (no caso duas vezes S ). G4 =({S}.2. 3.cD ⇒ ab.b}. Numa gramática linear à direita. linguagens e gramáticas G3 =({S. mas nem todas as lineares são regulares... Se é regular é linear.Teoria da Computação Cap.1. Se se conseguir. qualquer forma sentencial tem uma e uma só variável que é o símbolo mais à direita.B}. Uma gramática é linear se do lado direito de cada produção aparece no máximo uma variável. Uma passo numa derivação resultante de uma produção resulta em ab. As gramáticas regulares estão associadas com linguagens regulares.. Para o provar. é suficiente para provar que a linguagem é regular.A.b}. Gramáticas lineares à direita geram linguagens regulares Uma linguagem gerada por uma gramática linear à direita é regular.cdE LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 142 . {a. P } P1 S⇒A P2 A ⇒ aB P3 A⇒λ P4 B ⇒ Ab Esta tem produções lineares à direita (P2) e outras lineares à esquerda (P4) (P1 e P3 tanto são lineares à esquerda como à direita) por isso é linear mas não regular.5. seja à direita seja à esquerda. 3 Expressões regulares. S. {a. Exemplo 3. constrói-se um NFA que imite as derivações da gramática linear à direita..5. Para toda a linguagem regular existe uma gramática regular. .(3. Daí o teorema 3. Se w é uma cadeia em L(G). .P) uma gramática linear à direita.T. A parte da cadeia já processada foi obtida por construções semelhantes anteriores.1. Os estados do autómato correspondem às variáveis das formas sentenciais.5. V1. linguagens e gramáticas Um NFA pode imitar esta produção se tiver um estado D e um estado E e entre os dois uma aresta etiquetada por d : D d E Figura 3. então. 3 Expressões regulares. Então L(G) é uma linguagem regular.1 Produção D ⇒ dE Estando no estado D e aparecendo d transita para E.. a sua produção será V0 ⇒ v1Vi ⇒ v1v2Vj LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 143 . É como se o autómato estivesse a ler as cadeias geradas pela gramática.5..3) Uma gramática linear à direita produz uma linguagem regular Seja G = (V. Para o demonstrar constrói-se um NFA que imite as produções da gramática como visto acima.5. Sejam V = {V0.1 Teorema 3. Vn } o conjunto das variáveis da gramática S = V0 a variável inicial (axioma) P: V0 ⇒ v1Vi Vi ⇒ v2Vj … Vn ⇒ vl em que os v’s são sub-cadeias de um ou mais símbolos terminais.S. necessariamente.Teoria da Computação Cap. 5.3. a1a2a3. δ*(Vi. Vj) existe e será definida por δ*(Vi....amVj Para uma produção Vi → a1a2a3.. .amVj então o NFA terá um caminho ligando Vi a Vj...Teoria da Computação Cap... Produção Vi → a1a2a3. mas existem outros entre eles quando os v’s são cadeias com mais de um carácter.5. Por exemplo se tivermos a produção: Vi → a1a2a3. ou seja δ (Vi...vkvl = w O NFA a ser construído imita cada derivação “consumindo” um v de cada vez.am a função de transição generalizada será o estado final Vf.... Produção Vi → a1a2a3..am) = Vj Vi a1 a2 am Vj Figura 3. Vi.am) = Vf Vi a1 a2 am Vf Figura 3... Vj.am LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 144 ... 3 Expressões regulares. Além disso é preciso acrescentar o estado final. Vn são estados do autómato... * ⇒ v1v2. a1a2a3. V0. linguagens e gramáticas ...2.vkVn ⇒ v1v2. Se uma cadeia w é aceite pelo NFA. A.e..d. resultando em 4 estados S...vkvl e por isso a derivação * V0 ⇒ v1Vi ⇒ v1v2Vj ⇒ v1v2... ou seja. Derivação da cadeia ababab : S ⇒ aA ⇒ abB ⇒ abaA ⇒ababB⇒ababaA⇒ ababab Para se construir o NFA corresondente. linguagens e gramáticas Se uma cadeia w∈L(G) então ela foi gerada por um conjunto de produções definidas acima. Exemplo 3.. No NFA existe. Depois as transições entre cada dois estados extraem-se das produções: a etiqueta é o símbolo terminal da produção repectiva. S. então.B. w é aceite pelo NFA. q..b}. As produções que permitem completar a derivação.. A→ bB | b . até Vf usando caminhos etiquetados v1. P ) com P: S→ aA | aB .. pelo modo como este foi construído.vkvl = w é possível e em consequência w pertence a L (G)..A. Vi.. cria-se um estado por cada variável mais um estado final.F.Teoria da Computação Cap.vkVn ⇒ v1v2. w tem necessariamente a forma w= v1v2. B→ aA | bB .1 Seja G = ( {S. v2. para aceitar w o autómato tem que passar por uma sequência de estados V0.5. por construção... B}.2. as que têm no lado direito apenas caracteres LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 145 . {a. . 3 Expressões regulares. um caminho etiquetado w que vai de V0 até Vf ou seja. Σ.5. 3.F) o DFA que aceita L. ..2.5.1.2.4) Se L é uma linguagem regular no alfabeto Σ. q0.5. linguagens e gramáticas do alfabeto ou λ.3.4. e os símbolos produtores das transições são os terminais do lado direito das produções. Para isso LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 146 .. então existe uma gramática linear à direita G=(V. 3 Expressões regulares..(3.4.δ. Autómato da gramática do exemplo 3.Teoria da Computação Cap.3. Resulta o autómato seguinte da Fig. S.P) tal que L=L(G).5. Teremos assim o Teorema 3.qn } Σ ={a1. no caso é apenas a produção A → b. S a a A a b F b B b Figura 3. Gramáticas lineares à direita a partir de autómatos finitos Para provar que toda a linguagem regular pode ser gerada por uma gramática linear à direita (i) constrói-se o DFA para a linguagem e (ii) inverte-se a construção apresentada no teorema anterior 3.. levam necessariamente a uma estado final. Os estados do DFA transformam-se nas variáveis da gramática.q1.. tal que Q= {q0 ..3. Demonstração: Seja M=(Q. am} Vamos fazer a prova do teorema construindo uma gramática linear à direita a partir do DFA. a2.5.Σ. . introduz-se em P a produção qi → ajqk cria-se uma produção por cada transição entre dois estados Se existir também δ (qi. Se partirmos de um NFA. acrescenta-se a P a produção qk → λ cria-se uma produção que permite terminar as derivações.ou seja qi → ajqk | ajql Para cada transição δ (qi. introduz-se em P a produção ou seja. aj) = ql .. λ) = qk no NFA M. agora teremos 2º Para cada transição δ (qi. neste caso. linguagens e gramáticas 1º Construa-se a gramática linear à direita G = (V.qn } as variáveis da gramática são os estados do DFA S = q0 2º Para cada transição δ (qi. A construção é análoga. introduz-se em P a produção qi → ajqk cria-se uma produção por cada transição entre dois estados 3º Se qk faz parte de F. aj) = qk no DFA M . Começando por desenhar o NFA respectivo obtém-se LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 147 . com as pequenas diferenças.q1.Teoria da Computação Cap.3. o teorema é igualmente válido. Por outro lado. em vez de um DFA. A gramática G gerada deste modo pode produzir toda e qualquer cadeia de L.. qi → ai ql . então ela pode ser derivada pela gramática G. S. Exemplo 3.1 Construir a gramática linear à direita pata a linguagem L(aab*a). A demonstração mais detalhada ser vista por exemplo em Linz p. introduz-se em P a produção qi → qk (mais além chamaremos unitária a esta produção) A única diferença advém da escolha possível a partir de um estado. 3 Expressões regulares. aj) = qk no DFA M . Σ. P). tal que V= {q0 .5. 94. que se reflecte em duas produções possíveis. se uma cadeia w pertence a L. Teoria da Computação Cap. a)={q1} q0 → aq1 δ (q1.5.3. Construir a gramática linear à direita para a linguagem L(aab*a+aa+ab*a) A linguagem é a união de três: aab*a+aa a q1 a q2 LEI/DEI/FCTUC/2009/@ADC a b q3 a Documento de trabalho q4 148 .5.5.2.5.3. a)={qf} q2 → aqf qf ∈ F qf → λ Para gerar por exemplo a cadeia aaba usam-se as formas sentenciais q0 ⇒ aq1 ⇒ aaq2 ⇒ aabq2 ⇒ aabaqf ⇒ aaba Exemplo 3.b)={q2} q2 → bq2 δ (q2.Exemplo 3.3.NFA para aab*a A tabela de transições no NFA e das produções da gramática é a seguinte: Tabela 3.1. a)={q2} q1 → aq2 δ (q2.5. linguagens e gramáticas b q0 a q1 a a q2 qf Figura 3.1 Transições em M Produções em G δ (q0. 3 Expressões regulares. 5.2.5. λ)={qf} q7 → qf qf ∈ F LEI/DEI/FCTUC/2009/@ADC qf → λ Documento de trabalho 149 .5.7. Resolução por partes do exemplo 3. a)={q6} q5 → aq6 δ (q6.3. a)={q2} q1 → aq2 δ (q2. b)={q3} δ (q4.3.2. q5} q0 → q1| q5 δ (q1.2 Reduz-se a um NFA com um só estado inicial e um só estado final criando um estado inicial global e um estado final global com as necessárias transições λa q1 λ q a b a q2 a q3 λ q4 b λ q5 a q6 a q7 λ qf Figura 3. λ)={q1. q4} q2 → aq3| aq4 δ (q3.5. linguagens e gramáticas b ab*a a q5 a q6 q7 Figura 3. 3 Expressões regulares. Transições em M Produções em G δ (q0.a)={q3.5.2 Poderemos construir a tabela 3.5.6. a)={q4} q3 → aq4 δ (q3. NFA resultante para o exemplo 3. b)={q6} q6 → bq6 δ (q6.Teoria da Computação Cap. λ)={qf} q3 → bq3 q4 → qf δ (q5. das transições e das produções da gramática equivalente: Tabela 3.3.3.a)={q7} q6 → aq7 δ (q7. 5.5. ex. Mas se a reversa de L é regular. Que se passa com as gramáticas lineares à esquerda ? Tal como para as gramáticas lineares à direita. Este teorema é a conjugação dos dois anteriores. Vimos também que dado um DFA ou um NFA podemos a partir deles extrair uma gramática regular. Equivalência entre linguagens regulares e gramáticas regulares Nos parágrafos anteriores vimos a equivalência entre linguagens regulares.3 (3.Teoria da Computação Cap. também para as gramáticas lineares à esquerda se pode enunciar o teorema de equivalência: Teorema 3. LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 150 .5. Síntese das equivalências Vimos neste capítulo que dada uma expressão regular. 3. 98. Para demonstrar este teorema recorre-se à construção de uma gramática linear à esquerda que gera a linguagem reversa de L. em Linz p. 3 Expressões regulares. autómatos finitos e gramáticas lineares à direita.4. também o é. Assim se prova que a reversa de L é regular. Para mais detalhes ver p. Temos assim diversas equivalências possíveis (note-se que qualquer relação de equivalência é uma relação transitiva). Estas equivalências estão esquematizadas na figura seguinte.(3.6) Uma linguagem L é regular se e só se existir uma gramática regular G tal que L=L(G). porque a reversão preserva a propriedade de regular.)A linguagem L é regular se e só se existir uma gramática linear à esquerda G tal que L=L(G). e dada uma gramática regular poderemos construir um autómato finito equivalente.6. poderemos construir um autómato finito NFA ou DFA. linguagens e gramáticas 3.5. e vice-versa.4. Podemos finalmente enunciar o teorema de equivalência entre linguagens regulares e gramáticas regulares: Teorema 3. 6.4 Teorema 3.1.1.2 LR → ER (LR→ DFA → GTG → ER) Teorema 3. linguagens e gramáticas Expressões regulares (ER) Teorema 3.4.3 Gramáticas regulares (GR) Figura 3.(3.Teoria da Computação Cap.1) ER→ NFA Teorema 3.4 LR → Gramáticas Lineares à direita (LR → DFA → Gramáticas lineares à direita) LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 151 . 3 Expressões regulares.2 DFA ou NFA Teorema 3.3 Gramáticas lineares à direita → LR ( Gramáticas lineares à direita → NFA → LR ) Teorema 3.1 Teorema 3. Várias formas de descrever as linguagens regulares (LR) Teorema 3. 2nd Ed. 1997. Michael Sipser.. Models of Computation and Formal Languages. linguagens e gramáticas Bibliografia: An Introduction to Formal Languages and Automata. 1998. R. 3rd Ed. PWS Publishing Co. Rajeev Motwani. 1998. 3 Expressões regulares. Languages and Computation. Oxford University Press.Teoria da Computação Cap. Introduction to the Theory of Computation. Prentice Hall. Gregory Taylor. John Hopcroft. 2001.. Peter Linz. Jones and Bartelett Computer Science. Introduction to Automata Theory. 2001.. 2nd Ed. Harry Lewis and Christos Papadimitriou. LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 152 . Elements for the Theory of Computation. Jeffrey Ullman. Addison Wesley. Teoria da Computação Cap.2. Introdução 155 4. 4 Propriedades das linguagens regulares CAPÍTULO 4 PROPRIEDADES DAS LINGUAGENS REGULARES 4.3 Propriedades de decisão das linguagens regulares 161 4.4 Identificação das linguagens regulares: o lema da bombagem 163 The pumping lema 176 Bibliografia 177 LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 153 .Propriedades de fecho das linguagens regulares 155 4.1. Teoria da Computação LEI/DEI/FCTUC/2009/@ADC Cap. 4 Propriedades das linguagens regulares Documento de trabalho 154 . Um conjunto é fechado em relação a uma operação (sobre os seus elementos) se o resultado da aplicação dessa operação a quaisquer dos seus elementos resulta num seu elemento. gramáticas e autómatos. Figura 4. A figura 4.1.1.1.Teoria da Computação Cap. LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 155 .44. então ela não é regular. Importa agora conhecer mais pormenorizadamente as propriedades dessa família de linguagens. Qual o seu grau de generalidade ? São fechadas em relação a certas operações sobre conjuntos? Uma linguagem é finita ou não? Outra importante questão é como se pode saber se uma dada linguagem é regular. Introdução Nos capítulos anteriores estudámos fundamentalmente o contexto regular para linguagens. 4. seguinte ilustra esta propriedade para uma operação unária e uma operação binária (com dois argumentos): o resultado dá sempre um elemento do mesmo conjunto.1. Fecho em relação a operações de conjuntos Algumas conhecidas operações sobre conjuntos quando aplicadas a linguagens regulares produzem linguagens regulares. Se conhecermos uma propriedade geral que todas as linguagens regulares têm obrigatoriamente. 4 Propriedades das linguagens regulares 4. O esquema de equivalências a que se chegou define um universo de linguagens interessante e útil. Veremos uma tal propriedade geral. Propriedades de fecho das linguagens regulares As propriedades de fecho das linguagens regulares sob diferentes operações têm um interesse teórico considerável. 4.2.2. Dão uma perspectiva da natureza genérica das famílias de linguagens e ajudam na resposta a questões práticas. e se uma dada linguagem não a verifica. Fecho de um conjunto em relação a uma operação entre os seus elementos. Teoria da Computação Cap. 4 Propriedades das linguagens regulares Teorema 4.1. Se L1 e L2 são linguagens regulares, então também o são (i) L1∪L2, propriedade de fecho em relação à união (ii) L1∩L2, propriedade de fecho em relação à intersecção (iii) L1L2, propriedade de fecho em relação à concatenação, (iv) Compl(L1), Compl (L2), fecho em relação à complementação (v) L1*, L2*, fecho em relação ao fecho-estrela (vi) L1 – L2=L1 ∩ Compl(L2), fecho em relação à diferença Demonstração: A demonstração destas propriedades faz-se recorrendo ao que estudámos nos capítulos anteriores. (i) (iii) (v): Vimos que se L1 e L2 são regulares, existem expressões regulares r1 e r2 que lhes correspondem, isto é L1= L1(r1), L2= L2(r2). Vimos também que por definição de expressões regulares, r1+r2, r1r2 , r1* , r2* são expressões regulares denotando respectivamente as linguagens L1∪L2, L1L2, L1*, L2* Em consequência o fecho em relação à união(i), à concatenação (iii), ao fecho-estrela (v) é evidente e está demonstrado. (iv) Em relação à complementação (iv), não é assim tão imediato, mas já o vimos no Cap. 2. Seja M = (Q, Σ, δ, q0, F) o DFA que aceita L1. Ele tem estados finais F. Se considerarmos agora o autómato que se obtém deste invertendo a qualidade aceitador/não aceitador de cada estado, teremos o DFA complementar Mc. Então o DFA Mc = (Q, Σ, δ, q0, Q - F) aceita Compl(L1). LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 156 Teoria da Computação Cap. 4 Propriedades das linguagens regulares De facto, num DFA a função de transição generalizada δ* é uma função total, isto é, ela é definida para todas as cadeias de Σ*. Portanto, dada uma cadeia w e o estado inicial q0, δ*(q0, w) existe, e é ou um estado final (pertence e F, caso em que w∈L1 ) ou um estado não aceitador e portanto pertencente a Q-F e neste caso w∈ Compl(L1). Havendo um DFA que aceita Compl(L1), ela é regular e verifica-se o fecho em relação à complementação. (ii) Em relação à intersecção, faz-se uma prova construtiva: constrói-se um DFA especial a partir dos DFA de L1 e L2, respectivamente M1 e M2. Sejam M1 = (Q, Σ, δ1, q0, F1) e M2 = (P, Σ, δ2, p0, F2) os DFA de L1 e L2. Vamos construir o DFA intersecção destes dois e chamemos-lhe M12: ele aceitará uma cadeia se e só se essa cadeia for aceite por M1 e por M2 . Tomamos um carácter do alfabeto (que é o mesmo nas duas linguagens) e seguimo-lo num e noutro autómato. Se ele está num estado qi de M1 e num estado pj de M2, criamos um estado qij em M12. Se ele transita em M1 para qk e em M2 para pl, cria-se o estado qkl em M12. Assim os estados de M12 correspondem a pares de estados de (Q, P). Suponhamos o alfabeto Σ={a,b} e o carácter a. A Fig. 4.2.1 ilustra a demonstração. Em M1 Em M2 Então em M12 qi pj (qi, pj) a a a qij qk pl (qk, pl) qkl Figura 4.2.1 Autómato da intersecção de duas linguagens De seguida vê-se para onde se transita com b, em qi de M1 e pj de M2, e cria-se em M12 o estado respectivo. LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 157 Teoria da Computação Cap. 4 Propriedades das linguagens regulares O conjunto dos estados de M12 é um subconjunto do produto cartesiano dos estados de M1 com os de M2, QxP, composto por pares (qi, pj), com qi∈Qj e pj∈P. A função de transição do DFA M12, δ , obtém-se sabendo que M12 está no estado (qi, pj) sempre que M1 está no estado qi e M2 está no estão qj, ou seja, δ ((qi, pj), a)= (qk, pl) Sempre que δ1(qi,, a)= qk e δ2(pj,, a)= pl E quais serão os estados aceitadores em M12? Queremos obter o DFA que aceita a intersecção das linguagens L1 e L2, isto é, as cadeias que levam M1 a um estado aceitador e ao mesmo tempo M2 também a um estado aceitador. Para que isso aconteça, fazemos aceitadores em M12 os estados compostos por estados aceitadores, isto é, os estados (qi, pj) tais que qi é aceitador em M1 (qi∈F1) e pj é aceitador em M2 (pj∈F2). Deste modo o DFA M12 aceita todas as cadeias, e só essas, w∈L1∩L2. Alternativamente a esta demonstração construtiva, a usando os nossos conhecimentos de lógica, poderemos usar a Lei de DeMorgan L1 ∩ L2 = L1 ∪ L 2 Se L1 é regular, também o é o seu complemento. Se L2 é regular, também o é o seu complemento. Se os dois complementos são regulares, também o é a sua união. Se a união é regular, também o é o seu complemento. Logo a intersecção é regular. vi) Quanto à diferença, escrevamo-la de outra forma L1 − L2 = L1 ∩ L 2 LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 158 Teoria da Computação Cap. 4 Propriedades das linguagens regulares Sendo L2 regular, também o é o seu complemento. Sendo L1 regular, a intersecção com outra regular dá uma regular, como acabámos de provar. Logo a diferença é regular (sendo L1 e L2 regulares, naturalmente). Há uma outra operação interessante sobre uma linguagem - a reversão-, que se opera revertendo toda e qualquer cadeia da linguagem. Ora a reversa de uma linguagem regular é uma linguagem regular. Teorema 4.2. A família das linguagens regulares é fechada em relação à reversão. Para demonstrar, construirmos o DFA da linguagem e depois procuramos, a partir dele, um DFA que aceita a linguagem reversa. Se conseguirmos, está a prova feita. Uma cadeia reverte-se lendo-a do fim para o princípio. Tendo um NFA que aceita uma cadeia, ele vai-a lendo, partindo do estado inicial, até chegar ao estado aceitador. Se agora andarmos para trás, partindo do estado final aceitador, percorrendo as arestas em sentido contrário, chegaremos ao estado inicial depois de lermos a cadeia ao contrário. Portanto para a reversão, faz-se uma prova construtiva através dos passos seguintes: - constrói-se um NFA com um só estado final para a linguagem L. - transforma-se o estado inicial em final e o final em inicial - inverte-se o sentido das setas em todas as arestas do grafo do NFA. - o NFA resultante aceita LR Logo o NFA da reversa existe, porque acabámos de o construir, e por isso LR é regular. 4.2.2. Fecho em relação a outras operações 4.2.2.1. Homomorfismo Um homomorfismo é uma correspondência biunívoca entre dois conjuntos. Dois elementos são homomorfos (ou homomórficos) se são semelhantes na forma ou compostos por partes semelhantes entre si (homo-a mesma, morfo-forma). LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 159 Teoria da Computação Cap. 4 Propriedades das linguagens regulares Σ1 Σ*2 h a 01 h b 11 h c 101 h (abc) = h(a)h(b)h(c) = (01)(11)(101)=0111101 Figura 4.2.2. Ilustração do homomorfismo Uma cadeia no conjunto origem é homomórfica de uma cadeia no conjunto de chegada. A relação de semelhança resulta da transformação h. Teorema 4.3. Seja h um homomorfismo. Se L é uma linguagem regular, então a sua imagem homomórfica é também regular. A família das linguagens regulares é por isso fechada em relação a qualquer homomorfismo. Podemos imaginar uma prova construtiva deste teorema. Seguindo o exemplo, construímos o NFA da linguagem original. Nele existem arestas com etiquetas a, b e c. Substituamos cada aresta a por uma aresta 0 seguida de um estado seguido de uma aresta 1. Substituamos cada aresta b por uma aresta 1 seguida de um estado seguido de uma aresta 1. E substituamos cada aresta c por uma aresta 1 seguida de um estado seguido de uma aresta 0 seguida de um estado 1. 1 c 1 2 0 1 1 2 Figura 4.2.3. O autómato de um homomorfismo O NFA obtido aceita a linguagem que resulta da original depois do homomorfismo h, que por isso mesmo é uma linguagem regular. LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 160 Teoria da Computação Cap. 4 Propriedades das linguagens regulares Pode-se também demonstrar a partir das expressões regulares. Escreve-se uma expressão regular da linguagem original L. Nela substituem-se os caracteres a, b, c, pelas suas imagens homomórficas 01, 11, 101. O que resulta é ainda uma expressão regular e portanto denota uma linguagem regular. Esta é a imagem homomórfica de h. 4.2.2.2 Quociente à direita Considerem-se duas linguagens L1 e L2 no mesmo alfabeto. Tomemos agora todas as cadeias de L1 que se podem decompor em duas partes: um sufixo y e um prefixo x, tal que o sufixo y constitui uma cadeia de L2. L2 L1/L2 x y L1 Figura 4.2.4. Quociente à direita O conjunto dos prefixos x compõe a linguagem quociente de L1 por L2 à direita. Isto é, L1/L2={x: xy∈L1 para algum y ∈L2} Teorema 4.4. Se L1 e L2 são linguagens regulares, então L1/L2 é também regular. A família das linguagens regulares é fechada em relação ao quociente à direita por uma linguagem regular. Para demonstrar o teorema constrói-se o DFA do quociente. Ver por exemplo em Linz 107. 4.3. Propriedades de decisão de linguagens regulares Há questões importantes sobre linguagens regulares às quais temos que saber responder. Não se trata naturalmente de analisar todas as cadeias de uma linguagem, tipicamente infinita, e ver se elas têm alguma característica especial. Essa resposta obtém-se analisando uma das formas de representação estudadas: um autómato finito (determinístico ou não determinístico), uma expressão regular ou uma gramática regular. Uma questão diz-se decidível se formos capazes de lhe dar uma resposta genérica, aplicável a todas as linguagens LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 161 A questão da pertença Dada uma linguagem qualquer. existe um algoritmo para determinar se w pertence ou não a L. é vazia. a linguagem é infinita. Este é o algoritmo. finita ou infinita. se existir um algoritmo para ela. 3º Procuram-se todos os vértices que são base de um ciclo.2. Se algum desses vértices base está num caminho do estado inicial ao estado final. A questão de finitude ou infinitude de uma linguagem. Existe um algoritmo para verificar se uma linguagem. e depois testa-se se o DFA aceita ou não w. 2º Analisam-se os caminhos do grafo.5. 4 Propriedades das linguagens regulares (neste caso regulares). uma dada cadeia w pertence-lhe? Teorema 4.1. De facto poderemos dar um número infinito de voltas ao ciclo. 4. isto é.3. Se existe um caminho do estado inicial ao estado final. logo o número de cadeias aceites é infinito. Veremos de seguida algumas dessas questões fundamentais. Dada uma representação padrão de qualquer linguagem regular L em Σ e dada uma qualquer cadeia w∈Σ*. A demonstração é construtiva: 1º Representa-se a linguagem por um grafo de transição de um DFA. e por cada volta aceita-se uma cadeia. Se não.3. 4.3. a linguagem não é vazia. é finita. Como saber se uma linguagem é finita ou infinita? Teorema 4. Demonstração (construtiva): Representa-se a linguagem por um DFA.6. A questão da igualdade de linguagens LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 162 .3.Teoria da Computação Cap. o que é sempre possível por ser regular. dada numa forma padrão. 4. 1. por terem um número finito de estados.4. Demonstração construtiva: Constrói-se o DFA para a união das diferenças das linguagens L = (L1 .4. O princípio do pombal (pigeonhole) O princípio do pombal é usado pelos matemáticos para se referirem à seguinte situação: se dispusermos n objectos em m caixas (gaiolas no pombal) e se n>m. Sabemos que se formos capazes de construir um NFA para ela.4. as linguagens são iguais. terem memória limitada. LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 163 . então pelo menos uma caixa tem que conter mais do que um objecto.1. E se não formos ? Não será por falta de engenho e arte? Haverá um algoritmo para saber se uma linguagem não é regular? Disso trata o tão estranho (numa primeira abordagem) lema da bombagem. existe um algoritmo para determinar se L1=L2.7.Teoria da Computação Cap.L2 ou L2 – L1 é não-vazia e por isso L1 ≠ L2.L2=∅ e L2 – L1=∅ e ∅ ∪ ∅ =∅. 4. Assim sendo eles não são capazes de distinguir prefixos (de cadeias) de comprimentos arbitrários. De facto se L1=L2 então L1 . se não. A analogia com os autómatos finitos reside no facto de estes. são diferentes. Por outro lado se L não é vazia. Identificação de linguagens não regulares: lema da bombagem A questão básica sobre uma linguagem. então ou L1 .L2) ∪ (L2 – L1) e testa-se aí se a linguagem resultante é vazia. O princípio do pombal. ela é regular. Dadas duas linguagens regulares L1 e L2 numa forma padrão. 4. Figura 4.será ela regular ? – é a de resposta mais difícil. 4 Propriedades das linguagens regulares Como verificar se duas linguagens são ou não iguais? Teorema 4. Se sim. 4.4.4. ele terá mais de uma passagem.2. qualquer caminho de comprimento igual ou superior a n tem que repetir algum vértice. Considere-se a cadeia abab de L. Tabela 4.2 ab aa b x y2 z e abaaab LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 164 .Teoria da Computação Cap. O caminho abaab passa duas vezes no estado 3. Temos aqui uma ilustração do princípio do pombal.1 ab a x y b z Se tivermos agora a cadeia abaab também a poderemos decompor em três partes mas de modo ligeiramente diferente. Exemplo 4. isto é.1 A cadeia abb leva o DFA do estado inicial ao final aceitador.x.4.2) : a a b b 2 1 3 4 Figura 4. y e z. Poderemos decompô-la em três partes . passando uma vez em cada estado. 4 Propriedades das linguagens regulares Por exemplo.4. Seja L=L(aba*b) O seu NFA é fácil de desenhar (Figura 4. tem que conter um ciclo. Se cada estado for considerado uma gaiola.1. Qualquer caminho aceitador maior passará mais vezes em 3.da seguinte forma: Tabela 4. num grafo de transição com n vértices.4. Exemplo 4. Teoria da Computação Cap. dito de outro modo. ou. com o segmento ab chega-se ao ponto (estado) m.4 i w=xyiz 0 abb a b m 1 abab a b 2 abaab 3 abaaab 4 abaaaab qk ∈ F q0 Figura 4. aí podem-se tirar a’s da cartola. no caso com a’s bombeados) pertencem à linguagem. como na figura 4.3 ab aaa b x y3 z E assim sucessivamente.3: partindo de q0. … … Podem-se desenhar os caminhos correspondentes. A decomposição para o exemplo 1. tantos quantos se quiser. 4 Propriedades das linguagens regulares Tabela 4.4 seguinte: Tabela 4.4. Ela é possível para qualquer cadeia da linguagem de comprimento igual ou maior do que 4 (abab. abaab. dado que levam ao estado aceitador Analisemos em detalhe a decomposição xyz das cadeias desta linguagem. …). percorrendo o segmento b até ao fim. podem-se bombear a’s de um poço sem fundo.4. até que decidimos prosseguir.3.4. qualquer cadeia aceite se pode decompor em três partes xyiz como na Tabela 4. A decomposição verifica as condições seguintes: w=xyz com |xy|=aba = 3 LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 165 . Todas as cadeias bombeadas (isto é. Nesta decomposição x=ab.4.4. z=b. Teoria da Computação Cap. A decomposição xyz neste caso tem y=bab. Seja a linguagem L=abb(baa)*bb regular e infinita. z=bb.4. Pode-se fazer uma construção semelhante para uma qualquer linguagem regular infinita.2. Por outro lado a menor cadeia que contém xy é abbbaabb e portanto m= 8. a 1 b 2 b b 3 b 7 4 b 8 a 5 a 6 Figura 4. As outras partes serão x=abb. 4 Propriedades das linguagens regulares e |y| = 1 Se bombearmos y obtemos wi=xyiz a cadeia wi pertence a L para todo o i=0. Como é representada por um autómato finito. 2. Será aí que se faz a bombagem... 1. Se m for o comprimento da menor cadeia que contém uma vez o ciclo. Autómato de L=abb(baa)*bb Se olharmos atentamente para o NFA verificamos que o único ciclo existente é 4-5-6.4. para ser infinita tem que ter cadeias arbitrariamente grandes. Existe assim uma decomposição que verifica as condições seguintes: w=xyz com LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 166 . e portanto tem que ter pelo menos um ciclo que o permita. Exemplo 4. . neste caso m=4 e |xy| = 3 ≤ m. Bombeia-se bab um número arbitrário de vezes.4. escolhendo o 1º ciclo. cujo grafo do NFA é o da Fig 4.4.4.3 No caso da linguagem regular L=a(abb)*bb(baa)*bb.4.5.Teoria da Computação Cap.. encontraremos duas possibilidades. 4 Propriedades das linguagens regulares |xy|=abbbaa = 6 ≤ m e |y| = 3 Se bombearmos y obtemos wi=xyiz a cadeia wi pertence a L para todo o i=0. Exemplo 4.. a b 1 2 a b b b 7 4 b b 5 b 3 5 6 8 a a 6 Figura 4. LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 167 . Autómato de L=a(abb)*bb(baa)*bb existem dois ciclos que fazem a linguagem infinita.5.6 x y z a abb bbb a abb bbbaabb a abb bbbaabaabb a abb … temos que x e y são bem definidos mas z pode ter muitas composições. Se procurarmos uma decomposição xyz das cadeias da linguagem onde possamos fazer a bombagem. . 2. será xyz= a(abb)bbbb ou a(abb)bbbaabb ou a(abb)bb(baa)2bb Tabela 4.4. conforme o ciclo que escolhermos: . 1. 4.. Estamos agora em condições de enunciar esse tão famoso quanto incompreendido lema da bombagem para linguagens regulares.escolhendo o 2º ciclo. 2. terá um comprimento de pelo menos 11. será xyz= abb(baa)bb ou a(abb)bb(baa)bb ou … Tabela 4. LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 168 .Teoria da Computação Cap.7 x y z abb baa bb aabbbb baa bb aabbabbbb baa bb aabbabbabbbb baa … temos agora que y e z são bem definidos mas x pode ter muitas composições. 1. Para todas as cadeias da linguagem de comprimento maior do que 8 existe pelo menos um ciclo. Para que uma cadeia contenha os dois ciclos pelo menos uma vez. . 4 Propriedades das linguagens regulares .. Podemos assim afirmar que para todas as cadeias maiores do que 11 existe pelo menos uma decomposição xyz que verifica as propriedades w=xyz com |xy| ≤ 11 e |y| ≥1 Se bombearmos y obtemos wi=xyiz a cadeia wi pertence a L para todo o i=0. Teorema 4. Seja L uma linguagem regular infinita.4. . e daí o nome do lema. 2. |y|≥1.. p≥0.2. e a cadeia wi=xyiz pertence à linguagem para todo o i ≥ 0. Exemplo 4.8.Teoria da Computação Cap. Qual o interesse do lema ? Provar que uma linguagem é regular ? Será que só as linguagens regulares o verificam ? O lema não diz que se aplica só a elas. Pode-se dizer por isso que a sub-cadeia do meio é “bombeada”. Quer dizer que qualquer cadeia suficientemente longa de L se pode partir em três partes de tal modo que um número arbitrário de repetições da parte do meio produz outra cadeia de L. q≥1} Existe um m = 5 tal que para toda a cadeia |w|≥ 5 é possível encontrar uma decomposição w=xyz tal que |xy|≤4. Consideremos a linguagem L = {aapabqaq. Demonstração: LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 169 . Então existe algum inteiro positivo m tal que qualquer cadeia w∈L com |w| ≥ m se pode decompor em w=xyz com |xy| ≤ m e |y| ≥ 1 tal que wi=xyiz também pertence a L para todo o i=0. O Lema da bombagem (pumping lema) A propriedade das linguagens regulares que acabámos de analisar é formalizada pelo lema da bombagem. 4 Propriedades das linguagens regulares 4.4.4. 1.. Teoria da Computação Cap. Por isso as linguagens regulares são um subconjunto das linguagens que verificam o Lema da Bombagem. O leitor pode tentar desenhar um autómato finito. 4 Propriedades das linguagens regulares Seja a cadeia de L é aaaba. No entanto esta linguagem é livre de contexto não regular. LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 170 . Bombeando agora y obtém-se Tabela 4. y=a. por exemplo aaaaba. como veremos posteriormente. aabababa. Nela podemos fazer a decomposição xyz= |aa|a|ba| obedecendo às restrições de tamanho. Para cadeias de L maiores do que 5. pode-se sempre fazer a decomposição com x=a. ou escrever uma expressão regular para ela que não conseguirá fazê-lo devido ao termo aqbq que tem forçosamente um número de a’s igual ao número de b’s . de tal modo que bombeando o y se obtêm cadeias da linguagem para todo o valor de i.4.8 i w=xyiz 0 aaba 1 aaba 2 aaaba 3 aaaaba 4 aaaaaba … … cadeias que pertencem todas a L. Teoria da Computação Cap. se não existe um tal m.6. a linguagem não é regular. não regulares.4. Para isso temos que provar que é impossível a existência de um m apropriado. Mas há outras. isto é não é verdade que B→ A O que sabemos com toda a certeza é que Se (A → B) então (nãoB→ nãoA) isto é. O Lema usa-se precisamente com nãoB→nãoA: procura-se demonstrar com ele que uma linguagem não é regular. que também o verificam. com toda a certeza. 4 Propriedades das linguagens regulares Linguagens que verificam o Lema da Bombagem Linguagens regulares Figura 4. Como fazer a prova ? Por contradição: supõe-se que existe e tenta-se reduzir ao absurdo. O Lema diz-nos que se a linguagem é regular (proposição A) então existe um m apropriado (proposição B). As linguagens regulares verificam o Lema da Bombagem. Vejamos a lógica do Lema e do seu contrário: LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 171 . A → B (implicação) mas isto não nos autoriza a dizer que se existe um tal m então a linguagem é regular. pela bombagem de y. |xy|≤m .qualquer decomposição xyz produz.(pelo menos) uma cadeia |w| ≥ m existe pertencente a L em que .4.10.4.todas cadeias pertencentes a L bombagem de y.uma decomposição xyz que produz. a fim de podermos concluir que não é regular.Teoria da Computação Cap. O jogo do lema da bombagem Jogador 1 Jogador 2 Define a linguagem L Escolhe um m Indica uma cadeia de L Define uma decomposição |xy|≤m Indica um i que bombeie para fora LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 172 . tal como na Tabela 4.10.existe um m tal que para O Lema pela negativa . Tabela 4. xy z ∈ L i O que temos então que provar.qualquer cadeia |w| ≥ m pertencente a L .9.(pelo menos) uma cadeia que não pertence à linguagem ∃ i ≥ 0. xyiz ∉ L ∀i ≥ 0. pela . é tudo o que se encontra na segunda coluna desta Tabela 4. para uma linguagem qualquer.para qualquer valor de m sou capaz de encontrar . 4 Propriedades das linguagens regulares Tabela 4. O Lema pela afirmativa . |xy|≤m .4. A prova pode transformar-se num jogo entre duas pessoas.9.4. A decomposição xy tem que ser tal que todos elementos de y são a’s. Por aqui é legítima a suspeita de que a linguagem é não regular.5. Exemplo 4. eu apresento a cadeia a10b10. e aqui reside o cerne da prova. até ao infinito. Logo bombeando y por exemplo duas vezes. LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 173 . Mas provemo-lo formalmente com o lema da bombagem Tem que se provar que: para qualquer valor de m¸ por muito grande que este seja. ele será capaz de reconhecer esta linguagem. Para um qualquer m que o meu adversário proponha. qual a estrutura da cadeia que devo escolher de modo que ele fique impossibilitado de aí definir uma decomposição apropriada? Como o posso “encostá-lo à parede”? Esta é o desafio do jogador 1. escolho a20b20 e acontece coisa semelhante. Se me dão m=20.4. Só se o autómato pudesse ter um número arbitrariamente grande de estados. concluindo-se que a linguagem não é regular. O jogo só é conclusivo se o jogador 1 ganhar. Provar que L={anbn} não é regular Já encontrámos esta linguagem em diversas ocasiões. aumenta o número de a’s. Se me dão um m=10. O jogador 1 tem que ter uma estratégia para a escolha da cadeia concreta para um qualquer valor de m que o jogador 2 coloque sobre a mesa.Teoria da Computação Cap. pelo facto de |xy|≤ 10. que fica assim maior do que o número de b’s e por conseguinte a cadeia não pertence à linguagem. 4 Propriedades das linguagens regulares O jogador 1 tenta provar que não é regular e o jogador 2 o contrário (procurando o m). Exemplos de aplicação do Lema da Bombagem. A vitória do jogador 2 não permite qualquer conclusão (trata-se de um jogo pouco cavalheiresco …). existe uma cadeia em que qualquer decomposição |xy|≤ m bombeia para fora da linguagem. teria que ser capaz de memorizar o número de a’s que já entraram e depois contar um igual número de b’s até aceitar a cadeia. por exemplo. Para que um autómato finito a pudesse reconhecer. 6 Depois de n2. Admitamos que a linguagem é regular. que passa pelo menos em um estado. tem que ter um percurso fechado. 16.6. Vejamos outra perspectiva da prova. q i = qj Anel de comprimento p qn2 ∈ F q0 Figura 4. Mas se dermos duas voltas ao anel. há pelo menos dois estados iguais desde o incial q0 até ao final aceitador qn2. isto é 0. Ora este NFA tem que aceitar a cadeia com n2 zeros. a cadeia resultante também será aceite pela DFA. Assim pelo facto indiscutível de que n2>n . Seja n o seu número (finito) de estados.4. Essa cadeia terá ( n2+p) zeros.Ilustração do exemplo 4. 4. mas ainda assim prova por contradição. i ∈N}. Qualquer decomposição xyz bombeia para fora da linguagem. para ler esta cadeia toda tem que passar pelo menos duas vezes por um estado. o próximo quadrado perfeito é (n+1)2=n2+2n+1. definindo-se i-j= p ≤ n. O anel da figura tem comprimento p. 1. Será este um quadrado perfeito ? Se for bem faz o autómato em a aceitar. …. isto é.4. que não recorre directamente ao Lema da Bombagem. ou seja. LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 174 . L= {0i2. a linguagem não pode ser regular. Seja o alfabeto Σ={0} e a linguagem composta por cadeias apenas de zeros e com um número de zeros igual à sequência dos quadrados perfeitos. ou seja.Teoria da Computação Cap. Mas se não for ela não pertence à linguagem. Mas como tem apenas n estados. 9. Existe por isso um NFA que a aceita. Exemplo 4.4. Ora n2+p < n2+2n+1 porque p ≤ n e por isso n2+p não é um quadrado perfeito e portanto não pertence à linguagem. Sejam eles qi e qj. um anel.7. 4 Propriedades das linguagens regulares E para um m qualquer eu escolho a cadeia ambm. Logo não pode existir um tal NFA. Bombeando uma vez. Se me dás um certo m. bombeando y. e terá no máximo m zeros (nesta caso x é vazia). obtêm-se sempre. Agora a decomposição xyz coloca y nos primeiros m zeros. Fazendo agora ji=r e bombeando p vezes obtém-se um número de zeros igual a p+rp que não é primo e portanto a cadeia bombeada não pertence à linguagem.7 p Seja a linguagem dos números primos de zeros L= {0 . cadeias com um número de zeros que não é um quadrado perfeito. Tomamos um número primo p superior a n e concluímos que o DFA terá que conter um anel que fecha no estado qi=qj. tal que |xy|≤m. Exemplo 4. Isto basta para negar o Lema da Bombagem e concluir que a linguagem é não regular. o y ficará sempre nos primeiros m zeros. que não é um número primo (porquê? Note-se que r≥1). qualquer que seja y. por contradição. e portanto por muito grande que seja m posso encontrar sempre um primo superior. De facto. em que p é um número primo} Vamos ao jogo ! Dás-me um m qualquer e eu apresento-te a cadeia com p zeros. Isto é possível porque a quantidade de números primos é infinita. sendo p o número primo igual ou imediatamente superior a m. Isto é. Fazendo agora uma decomposição xyz. o número total de zeros será m2+m. em que y fica com os m zeros. admitindo que existe um DFA com n estados que aceita a linguagem. 4 Propriedades das linguagens regulares Esta prova “geométrica” é bastante intuitiva. Também se pode fazer uma prova gráfica. resulta uma cadeia com p+rp zeros. apresento-te a cadeia com um número de zeros igual ao quadrado perfeito m2. ou seja p(1+r) zeros. A contraprova aqui tem que procurar destruir a característica essencial da linguagem: os quadrados perfeitos dos seus zeros.4. Ora m2+m não é um quadrado perfeito. Analise-se este caso. bombeia-se para fora (embora para algumas bombagens se possa eventualmente fazer para dentro). Se bombear y um número de vezes igual a p. Se quisermos uma prova baseada no lema da bombagem.Teoria da Computação Cap. Seja r o comprimento de y. LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 175 . poderemo-nos inspirar na prova gráfica. se fosse m2+2m+1 sê-lo-ia porque seria (m+1)2. And some long word you pump becomes distinct from all the rest.edu/~mairson/poems/node1. So if you find a language L which fails this acid test. upon the other hand. As mathematical postscript. So there is a pumping lemma for all languages context-free.cs. LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 176 . or else you chose not well. O Professor Harry Mairson.html) dedica-lhe mesmo um inspirado poema. Then either L is regular. an addendum to the wise: The basic proof we outlined here does certainly generalize. The Pumping Lemma by Harry Mairson Any regular language L has a magic number p And any long-enough word in L has the following property: Amongst its first p symbols is a segment you can find Whose repetition or omission leaves x amongst its kind. da Universidade de Brandeis ( http://www. and y cannot be null. que aqui se reproduz com autorização.brandeis. x stays within its L.1. And y must come before p symbols have been read in full. w∈Σ . 4 Propriedades das linguagens regulares Exercício 4.e. resilient to the damage you have wrought. For w is xyz. O Lema da Bombagem é por alguns considerado um dos mais interessantes tópicos em Teoria da Computação. Provar que a linguagem L={ww.Teoria da Computação Cap. By contradiction you have shown that language L is not A regular guy.4. ∀Σ } é não regular. Although we do not have the same for those that are r. But if. Bombeando com i=0 apaga-se um 0 e ficando n=m e destruindose assim a condição n>m Normalmente em problemas deste tipo. Rajeev Motwani. Addison Wesley. bombeando y0 de modo a destruir a desigualdade. Jeffrey Ullman. 2001 Introduction to Automata Theory.. 1998. 4 Propriedades das linguagens regulares Outros exemplos 0n1m. segue-se esta estratégia: escolhe-se uma cadeia legítima no limite da desigualdade e depois apaga-se uma parte. Bibliografia An Introduction to Formal Languages and Automata. Prentice Hall. 1997.Teoria da Computação Cap. Languages and Computation. Jones and Bartelett Computer Science. Elements for the Theory of Computation. A decomposição xyz tem que ser feita de tal modo que o y é composto apenas por zeros (pelo menos um zero). 2001. John Hopcroft. 3rd Ed. Introduction to the Theory of Computation. que pertence à linguagem e é maior do que m. Peter Linz. 2nd Ed. Harry Lewis and Christos Papadimitriou. PWS Publishing Co... LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 177 . 2nd Ed. n>m Para qualquer m que me dês apresento a cadeia 0m+11m. com um desigualdade. Michael Sipser. 4 Propriedades das linguagens regulares Documento de trabalho 178 .Teoria da Computação LEI/DEI/FCTUC/2009/@ADC Cap. 2 Derivação pela extrema direita e pela extrema esquerda 188 5.1.Árvores de derivação (parse trees) 190 5.Parsing e ambiguidade 194 5.3. Introdução 181 5.5 Linguagens Livres de Contexto CAPÍTULO 5 LINGUAGENS LIVRES DE CONTEXTO 5. Parsing 194 5.2.2 Gramáticas livres de contexto 181 5.Teoria da Computação Cap. Definição e exemplos 183 5.1.3.2.2 Ambiguidade nas gramáticas e nas linguagens 203 5.1.3.2.4. Gramáticas livres de contexto e linguagens de programação 210 Biliografia 211 LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 179 .3. Teoria da Computação LEI/DEI/FCTUC/2009/@ADC Cap.5 Linguagens Livres de Contexto Documento de trabalho 180 . Introdução Concluímos o capítulo anterior provando que há algumas linguagens que não são regulares. a ela pertencendo as linguagens de programação. Gramáticas livres de contexto Nas gramáticas lineares que estudámos anteriormente existem duas restrições fundamentais: - na parte esquerda das produções existe apenas uma variável - na parte direita existe apenas uma variável na posição mais à esquerda ou mais à direita. obtêm-se as gramáticas livres de contexto.5 Linguagens Livres de Contexto 5. Como veremos no Capítulo 6 os autómatos finitos não são capazes de reconhecer linguagens livres de contexto não-regulares por não terem memória. As linguagens regulares são um caso particular de linguagens livres de contexto. Relação entre as linguagens regulares e as linguagens livres de contexto.2. constituindo uma sub-família destas. Linguagens livres de contexto Linguagens regulares Figura 5. e permitindo que aí existam diversas variáveis em qualquer posição. LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 181 . Relaxando a segunda restrição. As linguagens livres de contexto constituem a família mais importante de linguagens. e são tantas que se podem classificar em várias famílias. como veremos posteriormente. De facto há muitas linguagens não regulares.1.1. 5.Teoria da Computação Cap.1. Neste capítulo estudaremos as linguagens livres de contexto usando sobretudo as gramáticas (livres de contexto) e suas propriedades. A gramática G=({S}. e portanto toda a linguagem regular é também livre de contexto. ou seja.2. isto é. Exemplo 5. P ) é chamada livre de contexto se todas as produções em P têm a forma Ax em que AV e x(VT)*. LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 182 .1. Se existissem duas como por exemplo em AB  x a produção só se poderia aplicar quando aparecesse o par AB ou seja.1. Definição e exemplos Definição 5. Essa substituição não depende dos símbolos do resto da forma sentencial. Gramática livre de contexto e linguagem livre de contexto. Esta gramática diz-se por isso dependente do contexto.5 Linguagens Livres de Contexto 5. quando fosse esse o contexto de A e de B. P} com produções S  aSa S  bSb S é livre de contexto.Teoria da Computação Cap. {a. T.2.2. S. Note-se que toda a gramática regular é também livre de contexto. não depende do seu contexto. x é uma expressão qualquer composta por variáveis e/ou caracteres terminais ambos em número arbitrário. S. Esta característica resulta da existência de uma só variável na parte esquerda das produções. O nome de “livre de contexto” advém do seguinte facto: a substituição de uma variável na parte esquerda de uma produção pode fazer-se em qualquer altura em que essa variável apareça numa forma sentencial. Uma gramática G = ( V. Uma linguagem é livre de contexto se e só se existir uma gramática livre de contexto tal que L = L(G).b}.1. 2. Para isso tem que se encontrar uma gramática livre de contexto que a produza.2. Fazendo uma análise experimental. 1.2.3. Tente o leitor desenhar para ela um autómato finito. Exemplo 5. obtendo-se LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 183 . A linguagem desta gramática é L(G) ={wwR : w {a.b}*}.5 Linguagens Livres de Contexto Uma derivação possível. ou construindo uma árvore de derivação. Exemplo 5. generalizar a forma das cadeias obtidas pela gramática. e por isso no final a cadeia obtida é par e simétrica em relação ao seu centro. Mostrar que a linguagem L = {anbm : n m } é livre de contexto. Uma derivação dela: S  abB  abbbAa  abbbaaBba  abbbaabbAaba  abbbaabbaaBbaba  abbbaabbaabbAababa  abbbaabbaabbaaBbababa  abbbaabbaabbaabbAabababa  abbbaabbaabbaabbaaBbabababa  abbbaabbaabbaabbaabbAababababa  abbbaabbaabbaabbaabbababababa Não é fácil. Para o caso n = m viu-se no exemplo 1. A gramática G com produções S  abB A  aaBb B  bbAa A é livre de contexto. produzindo cadeias de vários comprimentos.Teoria da Computação Cap. verifica-se que L(G)= {ab(bbaa)nbba(ba)n : n 0 }.2 do Cap. uma linguagem livre de contexto não regular. olhando para as produções. sempre no meio da forma sentencial. S  aSa  aaSaa  aabSbaa  aabbaa Cada S introduz ou um par de a’s ou um par de b’s. Note-se que pela definição da linguagem o número de a’s tem que ser diferente do número de b’s.3. obtendo-se: S  AS1| S1B. {a. A primeira. LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 184 .b}. Note-se que para juntar os dois conjuntos de produções basta pôr as duas primeiras alternativas a partir de S. S1  aS1b | . Aqui temos uma situação contrária à anterior: introduzemse tantos a’s como b’s e depois introduzem-se à direita um ou mias b’s. ao criara o A logo de início. juntam-se os dois conjuntos de produções. A  aA | a Note-se que a segunda produção gera um número igual de a’s e de b’s. S1  aS1b | . Teremos as produções S  S1B. de seguida acrescente-se um a adicional à esquerda. Para o caso n  m. Esta gramática é não linear porque na primeira produção aparecem duas variáveis no lado direito. S. Tomemos agora o caso n < m. Mas é livre de contexto porque do lado esquerdo aparece só uma variável. Para isso usam-se aquelas produções do caso n=m e além disso uma para introduzir um ou mais a’s adicionais: S  AS1. A  aA | a.Teoria da Computação Cap. B  Bb | b. P) S  aSb| Seja agora o caso n > m. S1  aS1b | .5 Linguagens Livres de Contexto G =({S}. Primeiro forma-se uma cadeia com um número igual de a’s e de b’s. torna possível a última. A última acrescenta a’s à esquerda. B  Bb | b. obtém-se a linguagem para descrever a regra dos parênteses nas linguagens de programação.)}.4 Considere-se a gramática com produções S  aSb | SS |  Trata-se de uma gramática livre de contexto e não linear (porquê?). i. v um prefixo qualquer de w} e em que o número de b’s em qualquer sufixo de qualquer cadeia é maior ou igual ao nº de a’s. Ela contém por exemplo os casos (). i.5 Linguagens Livres de Contexto Exemplo 5.2. L = {w  {a. etc.e. ()()()(). ((()())). Algumas cadeias geradas: S  SS  SSSS  aSbaSbaSbaSb abababab S  aSb  aSSb aaSbSb  aaaSbbaSbb aaaSSbbaaSbbb aaaaSbaSbbbaaSbbb  aaaababbbaabb. {(. Gera cadeias com um número de a’s igual ao número de b’s (porquê ?) e em que o número de a’s em qualquer prefixo de qualquer cadeia é maior ou igual ao nº de b’s.b}* : na(w) = nb(w) e na(u) ≤ nb(u). Esta situação é dada pela gramática G=({S}.e. P) com produções S  (S) | SS |  Uma derivação será S  (S)  (SS) ((S)S) (( )S)  (( )) LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 185 . L = {w  {a. S. u um sufixo qualquer de w} Substituindo a por parêntese à esquerda e b por parêntese à direita. (()).b}* : na(w) = nb(w) e na(v)  nb(v).Teoria da Computação Cap. y . ( . com por exemplo { x. P) Em que o conjunto P é composto pelas seguintes 7 produções 1. E E + E 2. que se podem traduzir pelas produções seguintes: 1..2.Teoria da Computação Cap. E  (E) 4. z.E 3. A linguagem dos palíndromos pode-se definir por indução: Base da indução: . E E .5 Palíndromos em {0. (. P   2. ). Já no capítulo 1 vimos que um alfabeto pode ser composto por qualquer tipo de objectos. y. { x. 170).z. .2. P  1 4. . …}. 1}. x+y. +. x+(y-z). E  V 5. P  0 3. 0 e 1 são palíndromos (palíndromos elementares) Indução: se w é um palíndromo. (Hopcroft. Nenhuma cadeia é um palíndromo de 0’s e 1’s a menos que seja formada a partir destas regras.V}. E. P  1P1 Exemplo 5. Encontrar uma gramática que gere todas as expressões aritméticas possíveis com este alfabeto. +.. x-y. Exemplo 5.6 Seja o alfabeto ={x. Uma solução possível: G=({E. z.5 Linguagens Livres de Contexto Neste exemplo os parênteses fazem parte do alfabeto da linguagem. )}. V  x LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 186 . y. também o são 0w0 e 1w1. P  0P0 5. S}.5 Linguagens Livres de Contexto 6. S. 3)  x + (E .2. 2)  x + (V . 5)  x + (E) (prod.E) (prod. 7) Exercício 5. V  z Como se poderá gerar x+(y-z) ? EE+E (prod. 1) V+E (prod.2. S  AB 2. A  aaA 3. Que linguagem lhe está associada? 5. V  y 7.b}. B Bb LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 187 . 6)  x + (y . 4)  x + (y .Teoria da Computação Cap.2. P} com produções 1. Por exemplo. Derivação pela extrema direita e pela extrema esquerda Nas gramáticas livres de contexto não lineares aparece mais do que uma variável na parte direita das produções. 4)  x + (y . {a. A 4. Tem-se por isso uma escolha na ordem pela qual se substituem as variáveis. Considere a gramática com as produções S  0B | 1A A  0 | 0S | 1AA B  1 | 1S | 0BB Gere cinco cadeias com a gramática.1.E) (prod.V) (prod.z) (prod. G=({A.E) (prod. 4) x+E (prod.B. Exemplo de derivação (o número da produção aplicada está indicado sobre a seta): 1 2 3 4 5 5 3 S  AB  aaAB  aaB  aaBb  aab 1 4 2 S  AB  ABb  aaABb  aaAb  aab A linguagem correspondente é L(G) = {a2nbm: n0. Portanto a ordem das produções importa. Neste caso aplicando a produção 1 em primeiro lugar produzem-se cadeias que começam por a. Por exemplo as produções 1. ainda que por diferente ordem. Definição 5. m 0 } Nestas duas derivações obtém-se o mesmo resultado.5 Linguagens Livres de Contexto B 5. introduzem-se os mesmos caracteres nas formas sentenciais e na sentença final. Será sempre assim? Se se usam as mesmas derivações. Se se substituiu a variável mais à direita.2. a derivação diz-se pela extrema direita.2 Uma derivação diz-se pela extrema esquerda se em cada passo se substitui a variável mais à esquerda na forma sentencial. S  aSb 2. S  bSa 3. usando precisamente as mesmas derivações mas por ordem diferente.Teoria da Computação Cap. mas pode acontecer de diferentes ordens de aplicação das produções resultem em cadeias diferentes. e aplicando a 2 em primeiro lugar cadeias que começam por b. LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 188 . S   A produção 1-2-3 dá 1 2 3 S  aSb  abSab  abab e a produção 2-1-3 2 1 3 S  bSa  baSba  baba dá uma cadeia diferente. 5.7 Seja a gramática com as produções S  aAB. Por exemplo a árvore da Fig. etiquetados pelo lado esquerdo das produções - os filhos de um vértice representam os lados direito correspondente ao nó pai.2.Árvores de derivação (parse trees) As árvores de derivação são uma alternativa à escrita das produções.Teoria da Computação Cap.2.5 Linguagens Livres de Contexto Exemplo 5. lidas de forma inversa. Por outro lado. permitindo uma visualização gráfica do processo de geração de cadeias. Um árvore de derivação é uma árvore ordenada em que - os vértices iniciais e intermédios são as variáveis da gramática. permitem reconstruir as produções a partir da cadeia.1corresponde às produções: S  abABc A Bc LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 189 .2. 5.3. A  bBb. BA| Então S  aAB  aA  abBb  abAb  abbBbb  abbbb é uma derivação pela direita e S  aAB  abBbB  abAbB  abbBbbB  abbbbB  abbbb é uma derivação pela esquerda. e. e termina em folhas que são terminais (símbolos do alfabeto). Árvore de derivação Seja G = (V. Se um vértice tem uma etiqueta A  V. 4. em geral S. um símbolo terminal 3. Em cada nível mostra como se substitui cada variável nas derivações. dos quais 3 são folhas e 2 são vértices interiores (variáveis). an então P deve conter a produção da forma LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 190 . Uma árvore de derivação inicia-se na raiz. Todos os vértices interiores (vértices que não são folhas) têm uma etiqueta de V. T. e se os seus filhos são etiquetados (da esquerda para a direita) a1. P) uma gramática livre de contexto. dele não parte qualquer aresta. 2. Apenas dos vértices com variáveis.3. partem arestas. Na árvore nada indica a ordem de aplicação das segunda e terceira produções.Teoria da Computação Cap. isto é. Todas as folhas têm uma etiqueta de T  {}. Depois do vértice A resulta a folha c pela segunda produção e do vértice B a folha  pela terceira produção. Uma árvore de derivação.. Vejamos a definição formal. A raiz é etiquetada pelo símbolo inicial. a2. A partir da raiz aplica-se a primeira produção.. chamados vértices interiores (não raiz).5 Linguagens Livres de Contexto vértice raiz S a b A B 5 filhos da raiz c vértice interior  folha c Figura 5..2.1. com o símbolo inicial (em geral S).2. dando 5 filhos. uma variável... i. Uma árvore ordenada é uma árvore de derivação para a gramática G se e só se tiver as seguintes propriedades: 1. Definição 5. S. Quando um vértice contém um símbolo terminal. omitindo quaisquer  que se encontrem. um vértice com um filho  não pode ter outros filhos.e.8 Seja a gramática G=({S. sendo parte de uma árvore maior. Uma árvore de derivação é por defeito total. Todas as folhas têm etiquetas de V  T  {}.. BA| A árvore de derivação parcial da Fig. uma variável ou um símbolo terminal. diz-se uma árvore de derivação parcial. obtém-se o fruto (yield) da árvore. Isto é. {a.b}. S. A  bBb. O fruto é a cadeia de terminais obtida quando se percorre a árvore de cima para baixo. Exemplo 5. an em que ai pode ser um símbolo terminal ou uma variável. 4 e 5. i. i.B}. tomando sempre o ramo inexplorado mais à esquerda. da esquerda para a direita. e portanto não é necessário adjectivá-la. Lendo as folhas da árvore. 5.5 Linguagens Livres de Contexto A  a1 a2 . Uma árvore de derivação parcial deriva formas sentenciais e pode não derivar cadeias terminais.. Uma folha etiquetada  não tem irmãs.2.2 corresponde a S  aAB abBbB LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 191 . 5. Pelo contrário uma árvore de derivação total dá sempre cadeias terminais.. P} com produções S  aAB.A. esta será uma árvore de derivação parcial.. se extrairmos de uma árvore de derivação uma sub-árvore interior.Teoria da Computação Cap.2.e.. podendo ter variáveis nas folhas. Se uma árvore verifica as propriedades 3. mas a propriedade 1 não se verifica necessariamente e a propriedade 2 é substituída por 2a. 2.2.2.4 corresponde a (pela esquerda) S  aAB abBbB abbB abb ou a (pela direita) S  aAB aA abBb abb LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 192 . Árvore de derivação total B b  ou à derivação pela direita S  aABaAA aAbBb aAbbabBbbbabbbb Uma outra árvore de derivação Fig 5.Teoria da Computação Cap.3 corresponde à derivação pela esquerda S  aAB abBbB abbA abbbBb abbbb S a A B A b B  b b Figura 5.2. Àrvore de derivação parcial A árvore de derivação Fig.5 Linguagens Livres de Contexto S a A B b B b Figura 5.3.2. 5. O leitor pode ver uma prova formal por indução destas afirmações em Linz p.4.5 Linguagens Livres de Contexto S a A b B B  b  Figura 5. Este facto interessante constata-se observando que a árvore tanto pode ser desenhada da esquerda para a direita (produções pela esquerda) como da direita para a esquerda (produções pela direita). S. Inversamente. mas não explicitam a ordem da sua aplicação. Basta desenhá-la aplicando as produções que geraram w. isto é.2. Além disso a árvore exprime uma derivação pela direita ou uma derivação pela esquerda. Elas mostram como os símbolos terminais de uma cadeia se agrupam em sub-cadeias. As árvores de derivação. Cada cadeia terá a sua árvore de derivação própria. ao conjunto das cadeias geráveis a partir de uma variável da gramática LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 193 . T. pertence L(G). para toda a cadeia w L(G).Teoria da Computação Cap. existe uma árvore de derivação de G cujo fruto é w. Qualquer cadeia wL(G) tem uma derivação pela extrema esquerda e uma derivação pela extrema direita. na literatura de língua inglesa (por exemplo em Hopcroft. ou em Sipser). o fruto de qualquer árvore de derivação. Dada uma gramática livre de contexto G=(V. As árvores de derivação evidenciam as produções usadas na obtenção de uma qualquer cadeia. P). Outra árvore de derivação Podemos ver que uma árvore de derivação está ligada a uma derivação particular e não é um esquema geral de derivações para uma dada gramática. são chamadas parse trees. 132. cada uma das quais pertence à linguagem de uma das variáveis da gramática. desenhada de acordo com as produções de P. Por outro lado se tG é alguma árvore de derivação parcial de G cuja raiz está etiquetada por S. então o fruto de tG é uma forma sentencial da gramática G. 3. Mas podemos agora considerar a questão inversa. O conceito de parsing. Se não a encontram. até certo ponto.1. que tem absorvido uma parte significativa da investigação em computação a nível mundial. uma palavra difícil de traduzir. fazem precisamente isso: procuram a sequência de produções da gramática da linguagem que levou ao programa concreto. E se a cadeia pertence à linguagem. A palavra derivação pode. qual a sequência de produções que a gerou? Este é o problema de parsing : encontrar uma sequência de produções pelas quais se deriva wL(G). à falta de melhor tradução. 5. como saber se ela pertence a uma certa linguagem L(G) ? Este é o problema da pertença. a compilação é bem sucedida. LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 194 . sabemos gerar cadeias da sua linguagem. É essa estrutura de dados assim definida que facilita a tradução do código fonte em código executável. No entanto parsing é não a derivação em si mesma mas a sua procura e por isso mantém-se o termo parsing original. 5.net/doc/en/parse.sourceforge. ao permitir que sejam usadas funções recursivas para o processo de tradução. indicam erro. Parsing Dada uma gramática qualquer.3.Teoria da Computação Cap. Dada uma cadeia w. Nos compiladores as árvores de parsing são a estrutura de dados escolhida para representar o código fonte de um programa.html) e nas linguagens de computador. fazer o seu parsing em tempo útil (para o compilar depois) é um desafio para o qual ainda hoje se procuram respostas melhoradas. ser usada como tradução de parsing. aplica-se no estudo das linguagens naturais (ver por exemplo em http://nltk.5 Linguagens Livres de Contexto num vértice interior. Na disciplina de compiladores terá o leitor oportunidade de aprofundar esta questão. Parsing e ambiguidade O parsing é uma operação delicada. As técnicas de parsing baseiam-se na teoria de grafos e seus algoritmos (por isso a teoria de grafos é um dos mais importantes temas matemáticos das ciências da computação). que já conhecemos das linguagens regulares. aplicando as suas produções. Os compiladores quando analisam um programa escrito numa dada linguagem. Se imaginarmos que os programas de computador são cada vez maiores. Se a encontram. As cadeias geradas pertencem à linguagem da gramática. Trata-se de um método de parsing de cima-para-baixo. se ela existir.3. 1ª volta . Alguma é w ? 3ª volta – aplicar todas as produções possíveis à variável mais à esquerda em cada forma sentencial obtida da 2ª volta. Se w L(G). Exemplo 5. Esta técnica executa-se por voltas sucessivas.analisar as produções do tipo Sx encontrando todas as formas sentenciais e cadeias x que se podem obter de S em um passo.1 Seja a gramática com as produções S  SS | aSb | bSa | . Procede-se do modo seguinte. por exemplo) e verificando se se obtém a procurada w ou não.5 Linguagens Livres de Contexto Dada uma cadeia w em L(G) pode-se fazer o seu parsing por procura exaustiva. Por isso este método exaustivo há-de encontrar a solução. deve ter uma derivação de extrema esquerda de comprimento finito. Fazer o parsing da cadeia w = aabb. até que se encontre uma resposta. que pode ser visto simplesmente como a construção da árvore de derivação para baixo a partir da raiz. obtendo um novo conjunto de formas sentenciais alcançáveis em três passos.Teoria da Computação Cap. construindo sistematicamente todas as derivações possíveis (pela esquerda. Alguma é w ? e assim sucessivamente. LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 195 . Alguma é w? Se sim parar 2ª volta – aplicar todas as produções possíveis à variável mais à esquerda em cada forma sentencial x da 1ª volta. obtendo-se um conjunto de formas sentenciais alcançáveis em dois passos. 2. e portanto as suas etiquetas são formas sentenciais ou sentenças (daí a sua forma rectangular para distinguir dos círculos da árvore de derivação). Em cada etapa segue-se apenas por onde possa estar a solução. 2ª volta: a partir dos vértices restantes da etapa 1. desenhando a árvore da procura. Podem-se desde já eliminar as folhas que começam por b ou cujo segunda carácter é b. Segunda volta do parsing exaustivo Nenhuma cadeia é w. Podem-se desde já eliminar as folhas de bSa (dado que w se inicia por a) e  (dado que |w|>0). e esta árvore de procura de cadeias.1. Caminhos que se sabe serem estéreis não de prosseguem.Teoria da Computação Cap. Por outro lado esta árvore de procura é bastante genérica e não é afecta apenas a uma cadeia (embora se vá particularizando à media que se prossegue. S SSS aSbS bSa aSb SS bSaS S aSSb aaSbbb abSab  ab Figura 5. pelo abandono de caminhos inexequíveis). Note-se a diferença entre árvore de derivação (ou árvore de parsing) .5 Linguagens Livres de Contexto Vejamos como se aplica a procura exaustiva. Os filhos da raiz são as produções alternativas a partir de S. Nenhuma cadeia produzida é w. que vimos atrás. gerar todos os filhos possíveis. Primeira volta do parsing de aabb.3. usando uma e uma só produção pela esquerda. 1ª volta: inicializar a produção da gramática a partir da raiz S S SS aSb  bSa Figura 5. LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 196 .3. Por exemplo em SS substitui-se apenas o primeiro S. a árvore de procura seria também muito grande. LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 197 . Por isso é um processo pouco eficiente. Além disso é um processo fastidioso.3. Tem apenas um interesse didáctico. SaSbaaSbbbaabb Como se pode ver. o parsing exaustivo tem algumas desvantagens. ajudando-nos a perceber a essência do processo de parsing. parecido com os métodos de “força bruta” que consistem em experimentar todas as alternativas possíveis para um problema. Terceira e última volta do parsing de aabb E encontrou-se finalmente a cadeia aabb. a menos que se introduza um mecanismo de paragem ao fim de certo tempo. A sua derivação está identificada. S SSS SSSS aSSbS aSbS aSbSS aaSbbS bSa aSb SS bSaS bSaSS S SS abSabS aSSb aaSbSb aSSSb abbS aaSbb aaSSbb  abSab ab abSaSb aSb aaaSbbb aabSabb aabbb Figura 5.Teoria da Computação Cap. O seu parsing está concluído. Ela foi produzida pelo caminho assinalado a tracejado. Tem além disso um problema maior: pode nunca terminar se a cadeia não está na linguagem (verificar neste caso o que acontece para w= abb).3. Se a cadeia fosse muito grande. e nenhum compilador o usa hoje em dia. com produções pela esquerda.5 Linguagens Livres de Contexto 3ª volta: prossegue-se a partir de cada vértice da 2ªvolta. e portanto ao fim de n voltas elas terão pelo menos n+1 caracteres. é finita em tamanho. A gramática com produções S  SS | aSb | bSa | ab | ba obedece à restrição acima mencionada. introduzindo-se assim algumas restrições na forma da gramática. mas agora sem a cadeia vazia. Tal não acarreta problemas adicionais dado que tais restrições não diminuem significativamente o poder das gramáticas livres de contexto. o parsing exaustivo acabará por parar.Teoria da Computação Cap. Exemplo 5.5 Linguagens Livres de Contexto Como evitar a não paragem do parsing? Se admitirmos que uma cadeia. Uma outra produção possível pela esquerda: LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 198 . desde que de etapa para etapa aumente o tamanho das formas sentenciais. Uma produção possível (de extrema esquerda): S  SS  aSbS abSabS  abababS abababba Outra produção (de extrema direita) : S  SS SaSb SabSab  SabbSaab  Sabbabaab  baabbabaab Repare-se que as sucessivas formas sentenciais aumentam de tamanho pelo menos em uma unidade. No Capítulo 6 estudaremos técnicas de eliminar produções daqueles tipos (chamadas nulas e unitárias) nas gramáticas livres de contexto.2.3. Se na gramática existirem produções do tipo S (reduz o tamanho da forma sentencial) A  B (mantém o tamanho da forma sentencial esse facto não está assegurado. por muito grande que seja. Considere-se o seguinte exemplo para nos apoiar na análise. Pode-se verificar que gera a mesma linguagem do exemplo anterior. Portanto produções deste tipo devem ser eliminadas. Essas formas sentenciais têm variáveis e símbolos terminais. mas a partir da 6ª produção elas começam a ser substituídas por caracteres do alfabeto (símbolos terminais) até que a cadeia seja obtida. Então o parsing exaustivo pode ser feito por um algoritmo que. Depois de (no máximo. o método de parsing exaustivo termina sempre em não mais do que 2|w| voltas.b}+. Outra produção S  SS  SSS  SSSS  SSSSS  SSSSSS  SSSSSSS  abSSSSSS  abbaSSSSS  abbabaSSSS  abbabaabSSS  abbabaabbaSS  abbabaabbabaS  abbabaabbabaab Também aqui as formas sentenciais vão aumentando de comprimento. caso extremo) |w| voltas. Na pior das hipóteses. Daí o teorema seguinte. ou produz o parsing de w. substitui-se uma variável por um símbolo terminal de cada vez. No caso limite podem ter apenas |w| variáveis e nenhum símbolo terminal. ou conclui que não é possível qualquer parsing para w. para qualquer w *.1. A partir daqui é necessário substituir cada uma das variáveis para se obter uma cadeia de símbolos terminais. Qual o número máximo de formas sentenciais que se podem obter pelo parsing exaustivo ? LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 199 . B  V. Inicialmente contêm apenas variáveis. teremos enumerado todas as formas sentencias com |w| caracteres. o que implica mais |w| voltas. na pior das hipóteses. Considere-se uma gramática livre de contexto que não tem qualquer produção da forma A AB em que A.Teoria da Computação Cap. o parsing leva 2|w| voltas a completar-se (ou o parsing é encontrado ou a cadeia não pertence à linguagem). Teorema 5.3. Assim. Dada uma cadeia w {a.5 Linguagens Livres de Contexto S  SS  aSbS abSabS  abSSabS abbSaSabS  abbaSbaSabS  abbaabbaSabS  abbaabbabaabS  abbaabbabaabba As formas sentenciais vão aumentando em comprimento e contêm variáveis e símbolos terminais. Fazer o parsing da cadeia é verificar se o programa obedece às produções da gramática da linguagem.. Na 2|w|ª volta obtêm-se |P|2|w| formas sentenciais..5 Linguagens Livres de Contexto A gramática tem um número de produções distintas igual a |P|. Este é um problema central em teoria da computação: encontrar métodos de parsing que tenham menor complexidade computacional (isto é. se está bem escrito. Somando agora ao longo de todas as voltas. É melhor do que crescimento exponencial. Ainda hoje é um importante tema de investigação.Teoria da Computação Cap. LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 200 . obtém-se o limite superior para o número de formas sentenciais que se podem obter: F = |P| + |P|2 + |P|3 + . Na 3ª volta obtêm-se |P|2|P|=|P|3 formas sentenciais. Felizmente para algumas gramáticas especiais já se encontrou um método linear.. Repare-se que para um compilador a cadeia em causa é o programa completo. São as chamadas gramáticas simples. Na 1ª volta obtêm-se |P| formas sentenciais. demoraria um tempo exagerado a compilar um programa). Na 2ª volta obtêm-se |P||P|=|P|2 formas sentenciais. + |P|2|w| A última parcela evidencia que o comprimento da cadeia é expoente do último termo da soma. mas ainda muito ineficiente (um compilador que fosse por aí.. no máximo. no máximo. que sejam mais rápidos). isto é. Pode-se demonstrar que para quaisquer gramáticas livres de contexto existe um algoritmo que faz o parsing de qualquer cadeia w num tempo proporcional a |w|3. podendo tornar proibitivo o custo (computacional) do método. . no máximo. O que ainda se busca actualmente é um algoritmo de parsing que demore um tempo linear com o comprimento da cadeia para qualquer gramática livre de contexto. Prova-se assim que o trabalho de busca cresce exponencialmente com o comprimento da cadeia. Em cada produção substitui-se uma variável por um símbolo terminal e uma combinação de variáveis.3. T.2. xV*. se são da forma A  ax em que AV. Uma gramática livre de contexto G = (V. A gramática com produções S  aS | bSS | aSS | c não é uma s-gramática porque o par (S. por cada produção. S.3. A gramática com as produções S  aS | bSS | c é uma s-gramática. exactamente em uma unidade o número de caracteres terminais em cada forma sentencial. a) aparece nas duas produções S  aS e S  aSS. Assim aumenta-se. P ) é uma gramática simples ou uma s-gramática se todas as suas produções se iniciam por um símbolo terminal seguido de zero ou mais variáveis. Exemplo 5. a) aparece no máximo uma vez em P. ou seja.Teoria da Computação Cap. aT.3. Uma produção possível: S  aS  abSS  abSaSS  abSaSbSS abSaSbSc  abSaSbcc  abSacbcc  abcacbcc LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 201 .5 Linguagens Livres de Contexto Definição 5. e qualquer par (A. Ao fim de |w| produções já se introduziram |w| símbolos terminais e portanto já se encontrou a cadeia se ela pertence à linguagem. Uma produção possível (à direita): S  aS  abSS  abSaS  abSac  abcac Para se introduzir a. b ou c na forma sentencial há apenas uma possibilidade em cada volta. Podese parar ao fim de |w| voltas e por isso o número de voltas cresce linearmente com |w|. 5 Linguagens Livres de Contexto Aqui também o número de caracteres terminais aumenta em uma unidade por cada produção. Exemplo 5.Teoria da Computação Cap. na Figura 5. Um parsing numa s-gramática pode ser feito em |w| voltas. EE+E E E .4.3.6 (não é uma s-gramática). LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 202 . Para se introduzir a na forma sentencial há duas possibilidades (duas produções possíveis) e daí o facto de o processo de parsing ser mais longo. Ela é o fruto da árvore.3.z) encontra-se lendo as folhas da árvore da esquerda para a directa.4 Seja a gramática livre de contexto já encontrada no exemplo 5.E E  (E) EV Vx Vz V y Como se pode derivar a cadeia x+(y-z)? Desenhe-se a árvore de derivação.2. Muitas características de linguagens de programação podem ser descritas por s-gramáticas. e por isso o seu tempo é linear com o tamanho da cadeia. A cadeia x + (y . z) Figura 5.4. Definição 5. 5.4. Ambiguidade nas gramáticas e nas linguagens Vimos que dada uma cadeia wL(G).V)  x + (y . Neste caso há mais do que uma derivação pela esquerda e mais do que uma derivação pela direita. no sentido de que não se sabe que árvore usar.2.E)  x + (y .3.3.5 Linguagens Livres de Contexto A derivação da cadeia x+(y-z) será E E + E V ( E ) x E - E V V y z EE+E V+E x+E  x + (E)  x + (E . Qual usar? Temos uma situação de ambiguidade na linguagem. Situação bem distinta é aquela em que existem diversas árvores de derivação para a mesma gramática. Relembremos que uma árvore de derivação tem uma derivação pela esquerda e uma derivação pela direita.Teoria da Computação Cap. e portanto existem duas derivações para a mesma cadeia associadas à mesma árvore.3 LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 203 .E)  x + (y . o parsing exaustivo produz uma árvore de derivação.3. Árvore de derivação do exemplo 5.E)  x + (V .3. 3.Teoria da Computação Cap.3. Exemplo 5. Árvores de derivação do exemplo 5. S S a a S S b b S S  S S S a S b a S b a S b a S b     Figura 5.5.3.5(Linz) : Seja a gramática com produções S  aSb | SS |  construir a árvore de parsing de aabb.5 Linguagens Livres de Contexto Uma gramática livre de contexto é ambígua se existir alguma cadeia w  L(G) que tem pelo menos duas árvores de derivação possíveis. Fig.5.5 LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 204 . A ambiguidade implica a existência de duas ou mais derivações de extrema esquerda ou de extrema direita.3. Há várias possibilidades: i) S  aSbaaSbbaabb ii) S  SSaSbSaaSbbSaabbSaabb iii) S  SSSaSbSaaSbbSaabbaabb A que correspondem as árvores seguintes. 5. 5.3. LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 205 . Exemplo 5.3. A ambiguidade pode estar na linguagem ela própria. Exemplo 5. em que a ambiguidade é tolerada (tendo até valor literário). Poderia acontecer uma tragédia se um compilador pudesse fazer o parsing de um programa de dois modos: resultariam dois códigos executáveis diferentes.3. nas linguagens de programação só pode existir uma interpretação para cada cadeia (sentença) e por isso não pode existir ambiguidade. Hopcroft 172). ela deve por isso ser rescrita para a libertar de toda a ambiguidade. 142.3.6 S A S A S B B a b b a S b b Figura 5.6 Seja a gramática com as produções S  AS | a | b A  SS | ab Para gerar a cadeia abb podem-se seguir duas árvores de derivação. Se uma gramática é ambígua. Vejamos ainda outro exemplo (Linz. Contrariamente às linguagens naturais.5 Linguagens Livres de Contexto A segunda e terceira diferem apenas no facto de corresponderem a produções pela esquerda ou pela direita.6. Fig.Teoria da Computação Cap.6. A variável I representa os identificadores. Os argumentos dos operadores são identificadores.5 Linguagens Livres de Contexto Vamos desenvolver a gramática que produz cadeias do tipo (a+b)*c. Fig. do tipo das usadas por linguagens de programação). é o símbolo inicial. b ou c. I} T={a. 5. T. (.3. A variável E representa as expressões. *. a+b+c. E. e estes podem ser neste exemplo a. )} e as produções P: P1. Necessitamos de duas variáveis nesta gramática.7 E E E + E E I E E E a I I b c * + * E E I I I c a b Figura 5. a+b*c. considerando apenas os operadores adição + e multiplicação * .Teoria da Computação Cap. Teremos assim a gramática G= {V. Árvores das expressões aritméticas LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 206 . … Trata-se de uma gramática de expressões aritméticas. c. P} com V={E.7. EI P2.3. em versão muito simplificada. b. EE+E P3 EE*E P4 E  (E) P567 I  a | b | c Para derivar a cadeia a+b*c podem-se seguir duas árvores de derivação.+. Esta gramática produz a mesma linguagem da gramática ambígua e nesse sentido as duas são equivalentes.8. Só a primeira está certa. 5. TF P3.Teoria da Computação Cap.3. e façam-se as produções P1. A gramática é ambígua e é a sua ambiguidade que leva e esta problema. por análise própria. Introduzam-se mais duas variáveis. mas há ambiguidade na mesma. Temos aqui o problema da precedência dos operadores aritméticos.5 Linguagens Livres de Contexto Na árvore da esquerda a subcadeia b*c é filha de E. No entanto podem produzir resultados de compilação diferentes. Neste caso não há problemas de compilação. Para levantar a ambiguidade deve-se alterar a gramática. gerada antes de *c. T. FI P3. Não a encontrará porque a gramática é não ambígua. fazendo V={E. se pode obter a resposta. gerada depois da subcadeia a+. O leitor pode tentar uma outra árvore de derivação desta cadeia. Tendo em conta que a árvore de derivação define a estrutura de dados usada pelo compilador. I}. Se o leitor desenhar a árvore de derivação de a+b+c encontrará também duas soluções possíveis. Note-se que este problema de saber se uma gramática é ou não ambígua não tem ainda uma solução geral. teríamos na esquerda o código correspondente a (a)+(b*c) e na direita o código correspondente a (a+b)*(c). Na da direita a+b é filha E. uma correspondente a a+(b+c) e outra a (a+b)+c. F. Uma gramática assim poderia produzir resultados errados. LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 207 . só para algumas gramáticas. ET P2. EE+T P4 T  T* F P5 F  (E) P678 I  a | b | c Agora para derivar a mesma cadeia a+b*c teremos a árvore da Fig. Teoria da Computação Cap.8. LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 208 . podendo conter a’s. c’s. basta substituir na gramática anterior as produções P678 por I  a | b|c| Ia | Ib|Ic | I0|I1|. Nem sempre assim acontece. De facto há linguagens que são elas mesmas ambíguas e por isso não é possível encontrar para elas uma gramática não ambígua.7 Se quisermos uma gramática não-ambígua de expressões aritméticas com identificadores mais gerais. como foi o caso deste exemplo. mas iniciando-se sempre por uma das letras (a linguagem dos identificadores é a da expressão regular (a+b+c)(a+b+c+0+1)* ). 0’s e 1’s. 172): ET | E+T TF | T*F FI | (E) I  a | b | c | Ia | Ib | Ic | I0 | I1 Há gramáticas ambíguas que se podem tornar em gramáticas não ambíguas por pequenas alterações na sua estrutura.Árvore de derivação refeita Exemplo 5.5 Linguagens Livres de Contexto E E + T T T F F I I I c a b * F Figura 5.3. obtendose a gramática escrita em forma compacta seguinte (Hopcroft.3. b’s. 5 Linguagens Livres de Contexto Definição 5. Exemplo de linguagem inerentemente ambígua (Hopcroft. Se toda a gramática que gera L é ambígua. m 1)  {anbmcmdn.3. Uma gramática para ela: i) Para anbncmdm S  AB A  aAb | ab B  cBd | cd ii) Para anbmcmdn SC C  aCd | aDd D  bDc | bc Juntando agora as duas partes através da produção S  AB | C vem S  AB | C A  aAb | ab B  cBd | cd C  aCd | aDd D  bDc | bc LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 209 . m1} Esta linguagem é composta por todas as cadeias a+b+c+d+ tal que i) ou existem tantos a’s e b’s e tantos c’s e d’s ii) ou existem tantos a’s e d’s e tantos b’s e c’s Esta linguagem é livre de contexto. n 1. neste caso a linguagem diz-se inerentemente ambígua. 212) L = {anbncmdm.4 Se L é uma linguagem livre de contexto para a qual existe uma gramática não ambígua. n 1.Teoria da Computação Cap. então L diz-se não ambígua. S  C  aCd  aaDdd  aabDcdd  aabbcdd cujas árvores de parsing são as seguintes Fig 5. S  AB  aAbB  aabbB  aabbcBd  aabbccdd 2. A cadeia aabbccdd pode gerar-se por duas derivações de extrema esquerda.sun.no/java/grammar/JLS3.3.3. http://java. o Pascal.doc.10 5.3.10 (com folhas simplificadas): S S A a B b A a b c C d B c a d C a D d b D c d b c Figura 5.5 Linguagens Livres de Contexto Esta gramática é ambígua.9 3 5.4. 1.com/docs/books/jls/second_edition/html/jTOC. o C.Teoria da Computação Cap. Gramáticas livres de contexto e linguagens de programação As linguagens de programação.3. A completa. encontra-se na Java Language Specification em. com por exemplo o Phyton.9 Figura 5. desenvolvida pela Sun Microsystems.lykkenborg. são definidas por gramáticas livres de contexto. Java.html Pode ver-se uma outra versão em http://www. Para o caso do Java existem diversas versões.html LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 210 . 2001. Elements for the Theory of Computation. 2001 Introduction to Automata Theory.html. para fins didácticos. Jeffrey Ullman. com o a de http://www. Peter Linz. 2nd Ed.html ou a especificação BNF1 para uma mini Java em http://www.willamette.. Jones and Bartelett Computer Science.python.cambridge. 1997.org/resources/052182060X/MCIIJ2e/grammar. 2nd Ed.5 Linguagens Livres de Contexto Encontram-se também versões muito simplificadas. 3rd Ed. Rajeev Motwani. Prentice Hall.edu/~fruehr/231/grammar/simplest. 1998.unige. PWS Publishing Co.ch/dbresearch/Enseignement/analyseinfo/AboutBNF. Harry Lewis and Christos Papadimitriou.Para mais informação ver por exemplo http://cui. LEI/DEI/FCTUC/2009/@ADC Documento de trabalho 211 . Michael Sipser.org/ref/grammar.Teoria da Computação Cap. Addison Wesley. Languages and Computation. 1 BNF significa “Backus Naur Form”.htm.txt. Introduction to the Theory of Computation. Para o Phyton ver uma gramática BNF em http://docs. John Hopcroft... Bibliografia An Introduction to Formal Languages and Automata. Teoria da Computação LEI/DEI/FCTUC/2009/@ADC Cap.5 Linguagens Livres de Contexto Documento de trabalho 212 . Forma normal de Chomsky 233 6.3 Formas ou canónicas de Chomsky e de Greibach 233 6.Teoria da Computação Cap.5.1 Eliminação do carácter  216 6.3.4 Remoção das produções  223 6.2.2 Métodos para transformar gramáticas 215 6.2.2 Forma normal de Greibach 240 Bibliografia 243 LEI/DEIFCTUC/2009/@ADC Documento de trabalho 213 .2.3.1.2. Remoção das produções unidade 228 6.2.1 Introdução 215 6.2 Uma regra geral para substituir produções 217 6. 6 Simplificação de Gramáticas e Formas Normais CAPÍTULO 6 SIMPLIFICAÇÃO DE GRAMÁTICAS LIVRES DE CONTEXTO E FORMAS NORMAIS 6.3 Eliminação das produções inúteis 218 6. 6 Simplificação de Gramáticas e Formas Normais Documento de trabalho 214 .Teoria da Computação LEI/DEIFCTUC/2009/@ADC Cap. Teoria da Computação Cap. 6. encontrar uma gramática equivalente que tenha a forma mais adequada para o parsing. Introdução No Cap. é também originária da linguística e da matemática aplicada. Sabemos também que para uma mesma linguagem é possível definirem-se muitas gramáticas. devem ser eliminadas. 5 concluiu-se que certas gramáticas são melhores do que outras para efeitos de parsing. Professora de Ciências da Computação da Universidade da Califórnia em Los Angeles (UCLA). Métodos para transformar gramáticas Para se chegar a uma forma canónica é necessário previamente “limpar” as gramáticas de algumas limitações estruturais que lhes conferem características desadequadas.1. apelidadas de normais no sentido que elas definem uma norma à qual qualquer gramática livre de contexto se pode reduzir. como as produções unitárias (que não aumentam o tamanho das formas sentenciais). LEI/DEIFCTUC/2009/@ADC Documento de trabalho 215 . Poderemos por isso realçar a conveniência de. O grande objectivo das formas canónicas é a obtenção de gramáticas adequadas para o parsing e para a construção de autómatos de pilha para linguagens livres de contexto não regulares (assunto do Capítulo 7). as produções que não permitam um parsing eficiente. Veremos como eliminar as produções unitárias e as produções vazias de uma gramática qualquer. Sheila Greibach. Há gramáticas de formas especiais. 6 Simplificação de Gramáticas e Formas Normais 6. um reputado linguista e cidadão. Chomsky. ou as produções inúteis (que são isso mesmo). dada uma gramática livre de contexto numa forma qualquer. Esta questão é o objecto do presente Capítulo. Professor de Linguística no Massachusetts Institute of Technology (MIT). estudou as linguagens humanas e a partir daí elevou-se a um dos teóricos principais em gramáticas formais (isto é.2. Estudaremos as duas mais conhecidas que têm os nomes dos seus autores: a de Chomsky e a de Greibach. ou as produções lambda (que reduzem o tamanho das formas sentenciais). gramáticas das linguagens computacionais). O carácter vazio é de evitar. 6 Simplificação de Gramáticas e Formas Normais 6.{}. Se queremos passar a incluir . Por isso daqui para a frente neste capítulo suporemos apenas linguagens sem . Qual a diferença entre uma linguagem que contenha  e uma que o não contenha? A resposta é dada pela propriedade seguinte: Seja L uma linguagem livre de contexto que contenha . isto é.Teoria da Computação Cap. Por outro lado. dada uma qualquer gramática livre de contexto G. Seja G =(V. basta introduzir a nova produção acima indicada. T. ou produções vazias (ou esvaziadoras. LEI/DEIFCTUC/2009/@ADC Documento de trabalho 216 . Por isso as conclusões que se possam tirar para a linguagem L-{} também se aplicam a L. Mas será que a eliminação das produções- não amputa a gramática ( e a sua linguagem) de propriedades essenciais ? De facto uma gramática sem produções- não pode produzir a cadeia vazia. Esta nova gramática gera a linguagem L. Do ponto de vista prático não há diferenças entre linguagens livres de contexto que incluam  e as que não incluam. a partir da sua gramática obtémse uma linguagem que difere desta apenas por conter .2. Adicione-se também a P uma nova produção S0  S |  Obtém-se assim uma nova gramática. Dada uma linguagem sem . na medida em que vão esvaziando a forma sentencial. L sem .1. P) uma gramática livre de contexto para L-{}. S. Adicione-se uma nova variável S0 ao conjunto de variáveis V. introduzindo aquela pequena modificação na sua gramática. fazendo S0 a variável inicial (em vez de S). a menos que se diga o contrário. Eliminação do carácter vazio  A eliminação das produções-. há um método de obtenção de uma gramática G’ tal que L(G’) = L(G) . …) é uma necessidade para que se torne possível um método de parsing exequível. T.Teoria da Computação Cap. que deixa por isso de ser necessária. A nova gramática será G’= {V. Seja B  y1 | y2 | . p. Se A produz uma forma sentencial contendo B e se B produz diversas formas então pode-se ir directamente de A para estas formas. Exemplo: S  aAb A ab|a|b| LEI/DEIFCTUC/2009/@ADC Documento de trabalho 217 . S. Suponha-se que P contém uma produção da forma A  x1Bx2. eliminando B...2.2. Mas se assim é poderemos colocar esses destinos directamente em A. em que P’ se constrói de P A  x1Bx2 - eliminando a produção - adicionando a produção A  x1y1x2 | x1y2x2 | . 151. indirectamente através de B.2. 6 Simplificação de Gramáticas e Formas Normais 6..2.T. | yn o conjunto de todas as produções em P que têm B como lado esquerdo. quer dizer que de A se pode ir também para vários destinos.1. No entanto ele é bastante intuitivo. eliminando B que tem um papel de mero intermediário… Tem que se ter cuidado em não perder nenhum dos destinos originariamente possíveis..P) uma gramática livre de contexto. Se de A se vai para B e de seguida de B se pode ir para vária destinos. sendo A e B variáveis distintas. Seja G = (V.S. Uma regra geral de substituição de produções Teorema 6. | x1ynx2 | Ter-se-á a igualdade L(G’) = L(G) Este teorema está demonstrado em Linz. P’}. P) uma gramática livre de contexto. Definição 6. 6. Neste caso ela além de inútil é prejudicial dado que produz um ciclo infinito. e para não criar eventuais problemas importa removê-la. A variável A  V diz-se útil se e só se existir pelo menos um w L(G) tal que LEI/DEIFCTUC/2009/@ADC Documento de trabalho 218 . Por isso aquela produção nunca se pode utilizar. Seja G = (V.2. que nunca pode ser utilizada. Eliminação das produções inúteis Se tivermos uma produção.3..2. S.. T. Vejamos mais formalmente as situações em que uma variável é inútil. Serão todas aquelas em que a variável não é útil. 6 Simplificação de Gramáticas e Formas Normais Substitui-se por S  aabb|aab|abb|ab Que produz as mesmas 4 cadeias.. Seja a gramática S  aSb |  | A. nunca mais é possível passar de uma forma sentencial para uma sentença (cadeia só com símbolos terminais). Mas se em vez disso utilizarmos a produção S  A.Teoria da Computação Cap.3.1. ficando a gramática mais limpa. S  A  aA  aaA  aaaA  . ela é inútil. A  aA Por exemplo derivando S  aSb  aaSbb aabb obtém-se uma cadeia terminal. Cai-se numa “armadilha”. sendo inútil. numa dada gramática. Uma produção é inútil se envolve alguma variável inútil. T’.Teoria da Computação Cap. Teorema 6. A  aA Felizmente é possível eliminar todas as variáveis e todas as produções inúteis de uma gramática.1 Seja a CFG com as produções seguintes (e só essas): S  ABC | b Aa B b LEI/DEIFCTUC/2009/@ADC Documento de trabalho 219 . S. T. 6 Simplificação de Gramáticas e Formas Normais * * S  xAy  w com x. como por exemplo o B em SA A  aA |  B  bA ii) não pode derivar uma cadeia terminal (sentença) porque cria um ciclo infinito. Caso contrário é inútil.1 Seja G = (V.2. y em (VT)*. P’) que não contém qualquer variável ou produção inútil. Uma variável é útil se ocorrer pelo menos numa derivação.2. conforme é certificado pelo teorema seguinte.3. Então existe uma gramática equivalente G’ = (V’. se contribuir pelo menos para a derivação de uma sentença. Uma variável pode ser inútil por duas razões: i) nunca pode ser alcançada a partir da variável de início. com por exemplo a variável A em S  aSb |  | A. isto é. Exemplo 6. que afirma que para qualquer linguagem livre de contexto existe uma gramática sem variáveis ou produções inúteis. P) uma gramática livre de contexto. S.3. e portanto também é inútil. nunca mais nos libertaremos de C que por isso é uma variável inútil. Em gramáticas maiores e mais complicadas é necessário um procedimento algorítmico para a remoção das produções inúteis. por inspecção visual. bem como todas as produções em que entra.3. que tem as seguintes etapas. P). porque de S não se chega a A . em  = {a. T. Inicialmente está vazio. verifica-se que a variável C é inútil (cria um ciclo infinito) e deve ser eliminada. b}. Seja V1 conjunto das variáveis úteis. 6 Simplificação de Gramáticas e Formas Normais A variável C só entra na primeira produção. . Etapa A . e vai-se enchendo em voltas sucessivas.Teoria da Computação Cap. C} e P: S  aS | A | C Aa B  aa C  aCb reduz-se simplesmente a S  aS | A Aa De facto. Ficam apenas as produções que contêm S ou A. sendo V = {S.Construção de uma gramática intermédia cujas variáveis são todas úteis. A variável B nunca é alcançável a partir de S. A.2. Se a usarmos.2 Seja a gramática G = (V. LEI/DEIFCTUC/2009/@ADC Documento de trabalho 220 . Eliminando-a. fica S b Aa Mas a segunda produção nunca pode ser usada. S. reduzindo-se a gramática final simplesmente a Sb Exemplo 6. por isso elimina-se . bem como à produção que a contém. B. Estes exemplos são muito simples e resolvem-se por mera inspecção visual. colocar A em V1. Se entre S e uma variável A não existe nenhum caminho. Depois de completado este processo. pode haver outras que sejam inúteis. Encontrem-se por isso todas as variáveis que não podem ser alcançadas a partir de S e eliminam-se.2. Na 2ª volta e seguintes entram as que tenham do lado direito símbolos terminais e/ou variáveis já incluídas em V1 nas voltas anteriores. todas as suas variáveis estão em V1). p. Entre duas variáveis existe uma aresta se as duas estão em lados opostos da mesma produção. Por outro V1 só contém variáveis úteis.. V1 = . não por serem prejudiciais. Na 1ª volta só entram em V1 variáveis que tenham do lado direito apenas símbolos terminais. inicialização 2.e. Etapa B. Portanto todas as produções que têm estas variáveis inúteis são eliminadas na etapa A. Se houver uma variável que não esteja em V1.3. Exemplo 6. bem como as suas produções. Depois de desenhado o grafo.. Até que não se possam meter mais variáveis em V1. bem como todas as produções em que entre. Além das produções já eliminadas na etapa A. e será portanto inútil e prejudicial. 155. A partir da gramática intermédia obtém-se a gramática final. procuram-se os caminhos desde a variável inicial S até cada um das restantes variáveis. Para isso usa-se o grafo de dependências como ferramenta auxiliar. As produções P1 da gramática intermédia são todas as produções da gramática original cujos símbolos estão todos em V1T (i. O grafo das dependências tem um nó para cada variável ainda existente. Ver uma demonstração mais formal em Linz. então A não é alcançável e deve ser eliminada. ou seja. mas por serem inalcançáveis. 3.3 LEI/DEIFCTUC/2009/@ADC Documento de trabalho 221 .Teoria da Computação Cap. ela não produz qualquer cadeia final. todas as variáveis que possam gerar cadeias terminais estão em V1. De facto neste instante V1 está vazia e portanto V1T=T.xm com xi  V1T. Se A  x1 x2 x3. se uma produz a outra.. 6 Simplificação de Gramáticas e Formas Normais 1. Poderemos recorrer ao grafo de dependências.como S  A. B vai para V1 V1={S. Depois eliminam-se bem como todas as suas produções. B. S vai para V1 . D} 2ª volta . LEI/DEIFCTUC/2009/@ADC Documento de trabalho 222 . 1ª volta . 6 Simplificação de Gramáticas e Formas Normais Seja a gramática com as produções S  aS | A|C Aa BaaD CaCD DbD| Construção da gramática intermédia cujas variáveis são todas úteis: 1. 2. Para isso basta encontrar todas as variáveis que não são alcançáveis a partir de S.como B  aaD.Teoria da Computação Cap. Gramática intermédia G1 : produções de P1 são as produções originais cujos símbolos estão todos em V1T (ou seja. D} 3ªvolta -não há mais variáveis para introduzir em B 3.colocar D em V1 porque D V1={A. A. todas as suas variáveis estão em V1) S  aS | A A a B aaD D bD| Na segunda parte obtém-se a gramática G final a partir da gramática intermédia G1..V1=.colocar A em V1 porque Aa . 2.1.4. n≥1}. Variável anulável Qualquer variável A para a qual é possível a derivação * A   chama-se anulável (nullable). isso não obriga a que a gramática seja desprovida de produções-.3.4. Por exemplo S aA LEI/DEIFCTUC/2009/@ADC Documento de trabalho 223 . De facto ela pode-se anular (eliminar) nas formas sentenciais em que aparecer. Remoção das produções  Já sabemos o que são produções-: qualquer produção de uma gramática livre de contexto da forma A Definição 6. 6 Simplificação de Gramáticas e Formas Normais S A B D Figura 6.2. Assim a gramática final terá apenas as produções S  aS | A A a E aplicando a regra de substituição ficará S  aS | a que gera a linguagem L(G)={an. dado que B e D não são alcançáveis a partir de S. 6.2.3 Do grafo conclui-se que só ficam as variáveis S e A.Teoria da Computação Cap.3.2.1 Grafo de dependência do exemplo 6. Se uma gramática gera uma linguagem que não contém . Não contém . Repetir o passo 2 até que não seja possível adicionar mais variáveis a VN LEI/DEIFCTUC/2009/@ADC Documento de trabalho 224 . incluir B em VN. An com A1. Quando tal acontece é possível eliminar as produções- da gramática. que está inicialmente vazio. 1. Neste caso. Para todo o A tal que existe A  . fazendo S aA|a A aA|a obtém-se a mesma linguagem (confirme o leitor que assim é). Então existe uma gramática equivalente G’ sem produções- que gera a mesma linguagem. em mais de um passo.. em um passo.. incluir A em VN. ..Encontrar o conjunto VN das variáveis anuláveis.2.4. An pertencentes todas a VN. n≥1. 3. Estas são as variáveis anuláveis directamente. Também para eliminar as produções- é necessário um procedimento algorítmico para os casos mais complicados.Teoria da Computação Cap. Seja G uma gramática livre de contexto tal que  não pertence a L(G). Ele é fundamentado no teorema seguinte: Teorema 6. Demonstração: A demonstração faz-se desenvolvendo o algoritmo que permite encontrar G’: 1ª etapa.. embora a sua gramática contenha A. através de outras. 6 Simplificação de Gramáticas e Formas Normais A aA| gera a linguagem das cadeias de a’s.. 2. A2. Para todo o B tal que existe a produção B  A1A2 .. Estas são as variáveis anuláveis indirectamente. an.1.. a produção A   não se introduz em P’. m  1. m  1.2.esta produção A  x1x2.xm.4. cria-se (i) uma produção em que xi é substituída por . Ver também Hopcroft. 6 Simplificação de Gramáticas e Formas Normais Depois da primeira etapa sabemos quais são as variáveis anuláveis. xi  V  T tendo do lado direito caracteres terminais e/ou várias variáveis. Daí a segunda etapa de reconstituição das possíveis produções..as que resultam desta pela substituição das suas variáveis anuláveis por  em todas as combinações possíveis : se xi e xj são anuláveis. Procurar as produções em P da forma A  x1x2. podem-se anular simultaneamente ou uma de cada vez.xm. Colocar em P’ . 259..1 (Hopcroft. 2ª etapa ..Teoria da Computação Cap. de modo que temos três situações distintas que têm que se considerar para que a gramática não se altere (tudo o que se podia produzir antes tem que se continuar a poder produzir depois).. - se todas as xi são anuláveis.Substituição de produções 1. (ii)outra em que xj é substituída por . Exemplo 6. 2. 261) Sejam as produções S  AB A  aAA |  B  bBB |  LEI/DEIFCTUC/2009/@ADC Documento de trabalho 225 . Se duas delas aparecerem simultaneamente na mesma produção (lado direito). xi  V  T . podendo algumas ser anuláveis. e (iii) ainda outra em que xj e xj são ambas substituídas por . 2ª etapa. A  aAA multiplica-se em A  aAA A  aA Aa B  bBB multiplica-se em B  bBB B  bB Bb De modo que teremos. como fazer ? LEI/DEIFCTUC/2009/@ADC Documento de trabalho 226 . E se tivermos o caso de uma CFL com . S  . 6 Simplificação de Gramáticas e Formas Normais 1ª etapa: 1ª volta A e B são directamente anuláveis.Teoria da Computação Cap. fazendo A= fazendo A= e B=. fazendo B= S  B. indirectamente através de A e B. concluída a segunda etapa. a produção original S  A . Estas produções não permitem derivar a cadeia vazia. Consideramos uma produção de cada vez S  AB desmultiplica-se em S  AB . Portanto todas as variáveis são anuláveis. mas este caso não se retém. a gramática S  AB | A | B A  aAA | aA | a B  bBB | bB | b sem variáveis anuláveis. 2ªvolta Depois S também o é. Exemplo 6.Teoria da Computação Cap. consideramos em primeiro lugar a mesma linguagem mas sem  a que chamamos L-{}. introduz-se uma nova produção S0  S| Naturalmente que para incluir esta possibilidade se introduziu uma variável anulável S0. 6 Simplificação de Gramáticas e Formas Normais Se   L (G).4. e como vimos anteriormente.2.2 Seja a gramática com as produções S  aAbBc A  BC B  bB|b| C  D| Dc Obtenção do conjunto das variáveis anuláveis: B  1º 2º C donde VN={B. B. C} A  BC donde VN={A. o novo axioma. Poderemos afirmar agora que existe uma gramática CFG G1 sem produções- tal que L(G1) = L(G) – {}. Depois. C} VN={A. B. C} Agora 3º Não há mais S  aAbBc resulta em A  BC resulta em LEI/DEIFCTUC/2009/@ADC S  aAbBc S  abBc (anula A) S  aAbc (anula B) S  abc (anula A e B) A  BC AC (anula B) AB (anula A) Documento de trabalho 227 . Definição 6. entre as variáveis de uma gramática.2. o que dificulta o parsing. B  V são variáveis. Por isso devem ser eliminadas. poderemos usar o seguinte algoritmo de indução (Hopcroft.1. B) para o qual se possa encontrar uma sequência de derivações * A  B usando apenas produções unidade é um par unidade. Neste caso para descobrir todos os pares unidade. 6. p. 6 Simplificação de Gramáticas e Formas Normais B  bB Bb (anula B) C  D resulta em CD D  c resulta em Dc Chegamos assim a 11 produções para a gramática final. Produção unidade Qualquer produção de uma gramática livre de contexto da forma AB em que A.5. Mas numa gramática com muitas produções e um grande número de variáveis.Teoria da Computação B  bB resulta em Cap.2. Qualquer para (A. sem que a gramática se altere. chama-se produção unidade. já não é tão evidente.5. Remoção das produções unidade As produções unidade não aumentam o comprimento das formas sentenciais. O seu nome vem do facto de não alterar o comprimento da forma sentencial. de multiplicar este comprimento por 1. Pares unidade em um passo encontram-se por inspecção visual. ou seja. a unidade. 263): LEI/DEIFCTUC/2009/@ADC Documento de trabalho 228 . Demonstração: A demonstração faz-se também aqui desenvolvendo o procedimento de eliminação dos pares unidade (demonstração construtiva). Tal é sempre possível. 6 Simplificação de Gramáticas e Formas Normais Base : * (A... Seja G = (V. Então existe uma outra gramática livre de contexto G’ = (V’.. B) em P tais que B  y1 | y2 | . P’) equivalente a G que não contém qualquer produção unidade. 1º Qualquer produção do tipo A  A pode ser removida sem qualquer efeito (é evidente) 2º Colocar em P’ todas as produções não-unidade de P 3º Procurar todos os pares unidade 4º Para todos os pares unidade (A.. T. Identificados os pares unidade. Teorema 6.|yn LEI/DEIFCTUC/2009/@ADC Documento de trabalho 229 .1. S. vamos ver como os eliminaremos sem alterar a gramática.Teoria da Computação Cap. A) é um par unidade para todo o A em V: A  A em zero passos. então (A. B) é um par unidade e B  C é uma produção. C ) é um par unidade.5.2.| yn em P’ adicionar a P’ A  y1 | y2 | . T’. sendo C uma variável. P ) qualquer gramática livre de contexto sem produções-. conforme afirma o teorema seguinte. Indução: Se (A. Os grafos de dependência também podem ajudar a identificar os pares unidade. S’. 6 Simplificação de Gramáticas e Formas Normais o que corresponde à regra geral de substituição de produções que vimos no parágrafo 6. logo (S.5. S A B Figura 6. Vai-se de S a A através de B. Exemplo 6. 3º Adicionar a P’ todas as produções não unitárias de P S  Aa B  bb LEI/DEIFCTUC/2009/@ADC Documento de trabalho 230 .2.2.2. O grafo de dependência das variáveis confirma esta dedução. A) são pares unidade (S. Procurar os pares unidade S B. A aresta é orientada segundo a produção do par unidade. logo (B. A)-também o é.2. B) é par unidade B A.1.5. 160) Remover todas as produções unitárias da gramática cujas produções são S  Aa | B B  A | bb A  a | bc | B 1º e 2º. Existe uma aresta entre dois vértices se as respectivas variáveis fazem um par unidade.2.1 Grafo de dependências das variáveis de pares unidade do exemplo 6.5.5.2. B) é par unidade Se (S. No caso dá Fig.Teoria da Computação Cap. A) é par unidade A B. Os seus vértices são as variáveis que entram em pares unidade. logo (A. B) e (B.1 (Linz. 6.1. o alfabeto é ={0. Tem-se finalmente a nova gramática simplificada S  Aa |bb | a | bc | B  bb | a | bc A  a | bc | bb Exemplo 6. Os pares unidade são: LEI/DEIFCTUC/2009/@ADC Documento de trabalho 231 .Teoria da Computação Cap. as letras são a e b e os números 0 e 1. 6 Simplificação de Gramáticas e Formas Normais A  a | bc 4º Introduzir as derivações que substituem os pares unidade de P com produções de P’.b} .a. (Hopcroft.3.1.5.7 de criação de expressões numa linguagem de programação em que os identificadores são definidos do modo seguinte: uma letra seguida por letras ou números.2.1.2. como na tabela Par unidade em P Produção em P’ A criar em P´ * B  bb S  bb * B  bb A  bb * A  a | bc B  a | bc * A  a | bc S  a | bc S  B A  B B  A S  A Tabela 6. ou seja.5. As operações aritméticas usadas são a multiplicação * e a soma +.2. 263) Seja a gramática do exemplo 5. As suas produções são ET | E+T TF | T*F FI | (E) I  a | b | c | 0 | 1 | Ia | Ib | Ic | I0 | I1 Várias são produções unidade. F). No grafo de dependências representar-se-iam como arestas reflexivas em cada vértice (do vértice para ele mesmo). 6 Simplificação de Gramáticas e Formas Normais -directos (E.indirectos (E.Teoria da Computação Cap. Juntando as três operações de simplificação que estudámos até aqui.T): (F.2. depois sucessivamente (T.T).2 Seja L uma linguagem livre de contexto que não contém qualquer .T): ET resulta em E  a | b | c | 0 | 1 | Ia | Ib | Ic | I0 | I1 |(E)|T*F Juntando agora as produções não-unidade restantes. Atendendo ao grafo de dependências.F).I).2. pois geram as mesmas expressões.I) : FI resulta em F  a | b | c | 0 | 1 | Ia | Ib | Ic | I0 | I1 (T. (F. é mais conveniente eliminar ao pares unidade começando pelo fim do grafo.F). (F.F): TF resulta em T  a | b | c | 0 | 1 | Ia | Ib | Ic | I0 | I1 |(E) (E. neste caso pelo par (F. Então existe uma gramática livre de contexto que gera L e que não contém - produções inúteis - produções- LEI/DEIFCTUC/2009/@ADC Documento de trabalho 232 .I) F I Note-se que para além destes pares unidade teremos ainda os da base do algoritmo de Hopcroft.5. (E. (T. (E.1 .I) E T Fig. Teorema 6. teremos as produções Ea | b | c | 0 | 1 | Ia | Ib | Ic | I0 | I1 |(E)|T*F | E+T T a | b | c | 0 | 1 | Ia | Ib | Ic | I0 | I1 |(E)| T*F Fa | b | c | 0 | 1 | Ia | Ib | Ic | I0 | I1 | (E) I  a | b | c | 0 | 1 | Ia | Ib | Ic | I0 | I1 equivalentes às originais.5. 6. poderemos enunciar o teorema seguinte.I). 1. 6. são normalizadas e permitem normalizar em relação a elas qualquer gramática CFG). 6.Remover as produções inúteis. C pertencem a V e aT.Remover as produções- 2º . Definição 6.3.Teoria da Computação - Cap. As formas normais.3.3. 6 Simplificação de Gramáticas e Formas Normais produções-unidade Podem-se remover todas as produções indesejáveis através da seguinte sequência de passos: 1º . que têm esse objectivo.Remover as produções-unidade 3º .e. Formas normais (ou canónicas) de Chomsky e de Greibach Na família das gramáticas livres de contexto existem muitas formas normais (i. que obedecem a certas normas. Algumas revestem-se de importância particular e por isso as estudaremos de imediato. B..1. Uma gramática livre de contexto está na forma normalizada de Chomsky se todas as produções são da forma A  BC ou Aa em que A. Depois destas simplificações poderemos prosseguir no sentido de encontrar gramáticas que facilitem o parsing. Forma normal de Chomsky Na forma normal de Chomsky a parte direita de qualquer produção não pode ter mais de dois símbolos.1. requerem estas simplificações prévias. LEI/DEIFCTUC/2009/@ADC Documento de trabalho 233 . Esta variável terá uma só produção Ba  a. precisando de n produções para substituir as n variáveis. cria-se uma nova variável Ba. ou substitui uma variável de cada vez por um símbolo terminal.3.1. Este teorema demonstra-se construindo o algoritmo para transformação na forma de Chomsky. Para duas variáveis basta uma produção. 6 Simplificação de Gramáticas e Formas Normais Esta gramática ou aumenta em uma unidade em cada produção o tamanho das formas sentenciais..1. P} com   L(G) tem uma gramática equivalente G’ = (V’.1 Qualquer gramática livre de contexto G=(V.Teoria da Computação Cap. Pressupõe-se que G não tem produções  nem produções inúteis nem produções unidade nem símbolos inúteis. Usa-se Ba em vez de a nas produções de corpo maior ou igual a 2. S. Exemplo 6. P’) na forma normal de Chomsky. Demonstração. três variáveis duas produções. T. Vejamos as produções na FC Chomsky S  SB|a Bb Fazendo a derivação S  SB SBB SBBB SBBBB SBBBb SBBbb SBbbb Sbbbb abbbb obtém-se uma cadeia de 5 caracteres em 9 derivações. Para derivar uma cadeia com n símbolos finais são necessárias no máximo 2n-1 produções. Teorema 6. LEI/DEIFCTUC/2009/@ADC Documento de trabalho 234 . 1º passo Para todo o símbolo terminal a que aparece numa produção de corpo (lado direito) com comprimento igual ou superior a 2. T’. n variáveis n-1 produções. S. Olhando para as produções vê-se que esta gramática trabalha em duas fases: primeiro cria a forma sentencial apenas com n variáveis.3. Logo n-1+n dá 2n-1. De seguida substitui cada variável por um símbolo terminal. etc. ou pelo menos duas variáveis e nenhum terminal. A forma normal de Chomsky será finalmente. A produção original é substituída pelas n-1 produções A  C1D1 D1  C2D2 .3. … Dn-2  Cn-1Dn Ainda no mesmo exemplo. num conjunto de produções com duas variáveis no lado direito.. 6 Simplificação de Gramáticas e Formas Normais Cada produção fica com um corpo que é ou um terminal simples. introduzem-se as variáveis D1 (para a primeira produção) e D2 (para a segunda produção).Teoria da Computação Cap. Exemplo 6. D2. c . b.. Bb. Seja S  ABa A  aab B  Ac Introduzem-se Ba.1.2. n  3..Cn.. S  AD1 D1  BBa A  BaD2 LEI/DEIFCTUC/2009/@ADC Documento de trabalho 235 ... Vejamos um exemplo para acompanhar o desenvolvimento.. Bc para a. ficando S  ABBa A  BaBaBb B  ABc Ba  a Bb  b Bc  c 2º passo Partem-se as produções A  C1C2.. Para isso introduzem-se novas variáveis D1. Dn-2. Remoção das produções unidade (Hopcroft. I). E). F).F) 3.5.T) 2.3.I ) 4. (F. Passo indutivo: E T F I 1. Exemplo 6.2. (T.Teoria da Computação Cap. T) e a produção TF dá o par unidade (E. 6 Simplificação de Gramáticas e Formas Normais D2  BaBb B  ABc Ba  a Bb  b Bc  c Passou-se de 3 para 8 produções. nota-se que existem várias produções unidade.3. 263) Temos que identificar todos os pares unidade. ET | E+T TF | T*F FI | (E) I  a | b | c | Ia | Ib | Ic | I0 | I1 Reduzir esta gramática à FN de Chomsky.(E. (I.(E. T) e a produção TF dá o par unidade (T.2. Normalmente é este o custo da passagem à FN de Chomsky (FNC): um grande aumento do número das produções. (T. Considere-se a gramática não-ambígua do Exemplo 6. Para isso aplica-se o algoritmo que vimos: Base: pares unidade (E. Olhando com atenção para as produções.1. F) e a produção FI dá o par unidade (E. T).F) LEI/DEIFCTUC/2009/@ADC Documento de trabalho 236 .(E. E) e a produção ET dá o par unidade (E. A sua remoção é a primeira etapa para a resolução do problema. I) 6. )}. I) Ia | b | c | Ia | Ib | Ic | I0 | I1 Teremos assim a gramática sem produções unidade. 6 Simplificação de Gramáticas e Formas Normais 5. T) T T*F (T. E) E E+T (E. * . O grafo de dependências também evidencia esses pares unidade.I) Encontramos assim 10 pares unidade. I) F a | b | c | Ia | Ib | Ic | I0 | I1 (I. c. 1. incluindo os da base. Por isso é conveniente LEI/DEIFCTUC/2009/@ADC Documento de trabalho 237 . F) E (E) (E. F) F (E) (F. composta pelas 10 produções da segunda coluna da tabela. F) e a produção FI dá o par unidade (T. 0. Par Produções (E. Qualquer um deles aparece no corpo de uma produção com mais de um símbolo. Está por isso pronta para ser passada à FN de Chomsky. (F. Os símbolos terminais desta gramática são nove. F) T (E) (T. (T. Note-se que a gramática não tem nem produções- nem produções vazias. F) e a produção FI dá o par unidade (F. {a. I) Ea | b | c | Ia | Ib | Ic | I0 | I1 (T. +. T) E T*F (E. ( . b. Agora aplicamos a regra de substituição para os pares unidade na tabela seguinte. I) Ta | b | c | Ia | Ib | Ic | I0 | I1 (F.Teoria da Computação Cap. Teoria da Computação Cap. teremos as produções seguintes Produções actuais Novas produções E E+T E EPT E T*F E TMF E (E) E LER Ea | b | c | Ia | Ib | Ic | I0 | I1 Ea | b | c | IA | IB | IC | IZ | IU T T*F T TMF T (E) T LER Ta | b | c |Ia | Ib | Ic | I0 | I1 Ta | b | c |IA | IB | IC | IZ | IU F (E) F LER F a | b | c | Ia | Ib | Ic | I0 | I1 F a | b | c | IA | IB | IC | IZ | IU Ia | b | c | Ia | Ib | Ic | I0 | I1 Ia | b | c | IA | IB | IC | IZ | IU A a B b C c Z 0 U 1 LEI/DEIFCTUC/2009/@ADC Documento de trabalho 238 . Assim A a Z 0 M * B b U 1 L ( C c P + R ) Introduzindo as variáveis substituindo os caracteres finais nos corpos das produções com mais de um carácter. 6 Simplificação de Gramáticas e Formas Normais introduzir nove variáveis correspondentes aos símbolos terminais. e nove produções adicionais nas quais essas variáveis são substituídas pelo seu carácter terminal. Para concluirmos a passagem á forma normal de Chomsky resta resolver o problema da existência de mais de duas variáveis em alguns corpos.Teoria da Computação Cap. Um conjunto de três variáveis . 6 Simplificação de Gramáticas e Formas Normais P + M * L ( R ) Agora todos os corpos das produções ou têm mais de duas variáveis ou têm um símbolo terminal. com por exemplo EPT transforma-se num conjunto duas e mais um produção adicional: E EPT E EX1 X1PT obtendo-se assim duas produções na FN de Chomsky. As novas produções são as da tabela seguinte. Produções actuais E EPT Novas produções: FN Chomsky E EX1 X1PT E TMF E TX2 X2MF E LER E LX3 X3ER Ea | b | c | IA | IB | IC | IZ | IU Ea | b | c | IA | IB | IC | IZ | IU T TMF T TX2 T LER T LX3 LEI/DEIFCTUC/2009/@ADC Documento de trabalho 239 . Forma normal de Greibach Se colocarmos restrições não no número de símbolos da parte direita das produções. em que a  T e x  V* ( por exemplo aB.Teoria da Computação Cap. 6 Simplificação de Gramáticas e Formas Normais Ta | b | c | IA | IB | IC | IZ | IU Ta | b | c | IA | IB | IC | IZ | IU F LER F LX3 F a | b | c | IA | IB | IC | IZ | IU F a | b | c | IA | IB | IC | IZ | IU Ia | b | c | IA | IB | IC | IZ | IU Ia | b | c | IA | IB | IC | IZ | IU A a A a B b B b C c C c Z 0 Z 0 U 1 U 1 P + P + M * M * L ( L ( R ) R ) Temos um total de 50 produções na FN de Chomsky.3. Definição 6. aBC. teremos a forma normalizada de Greibach. …). aBCD. 6. para 16 produções à partida. mas nas posições relativas admissíveis das variáveis e dos símbolos terminais. As gramáticas de (Sheila) Greibach têm propriedades interessantes: LEI/DEIFCTUC/2009/@ADC Documento de trabalho 240 .2.3.2.1 Uma gramática livre de contexto está na forma normalizada de Greibach se todas as produções têm a forma A  ax. Teoria da Computação Cap. Existe um algoritmo LEI/DEIFCTUC/2009/@ADC Documento de trabalho 241 . o processo torna-se bem mais complicado. A demonstração deste teorema não é tão simples como o da FN de Chomsky.uma frase de tamanho n é derivada em n passos.1 S  SB|a Bb .3.10. como nos exemplos de Linz 6.2.2. Teorema 6. quando assim não acontece.1 S  0S1 | 1S0 |1 | 0| na FN Greibach.se aplicarmos um PDA para uma forma normal de Greibach. Existência da Forma Normal de Greibach Para toda a gramática livre de contexto G tal que   L(G) . S  0SA | 1SA |0 | 1| A0 B1 Este exemplo é simples porque todas a produções iniciais de iniciam com um carácter final (0 ou 1). mas fica aqui a nota).3. existe uma gramática equivalente G’ na forma normal de Greibach. dado que em cada produção se introduz exactamente um carácter terminal numa forma sentencial.1 Seja o exemplo 6. No entanto. Exemplo 6.3. Podem usar-se as regras de substituição de produções vistas anteriormente.1. 6 Simplificação de Gramáticas e Formas Normais . 7.1.9. 6.3. Introduzindo duas novas variáveis A para 0 e B para 0. obtém-se directamente a FCG. o que prova que é sempre possível eliminar tais transições num PDA (estudaremos os PDA no Cap. Exemplo 6. De facto não existe um algoritmo simples para transformar qualquer gramática numa FN Greibach.2. obtém-se um PDA sem transições-. Introduzindo de seguida variáveis adicionais para os caracteres terminais misturados com variáveis.3. que é uma FN de Greibach. sendo por isso variáveis inúteis. substitui-se o A S  ABb|a e A  aaA | B vai dar S  aaBb|BBb|a Mas agora é necessário substituir B na segunda produção S  BBb e B  bAb vai dar S  bAbBb Agora o primeiro carácter em qualquer produção é um símbolo terminal a ou b.2 (Ex.2. De facto A e B.Teoria da Computação Cap.13 Linz) Converter na forma normal de Greibach S  ABb | a A  aaA | B B  bAb Para obtermos um terminal na primeira produção. são variáveis que não permitem obter um cadeia final. Vejamos um exemplo. Fica assim apenas S  a. na gramática original. Za  a Zbb substituindo nas produções anteriores resulta na solução: S  aZaABZb | bAZaBZb | a A  aZaA | bAZb B  bAZb Za  a Zb  b Se se reduzir previamente a gramática. LEI/DEIFCTUC/2009/@ADC Documento de trabalho 242 . 6. 271) expandir a primeira variável de cada produção até se obter um terminal. Exemplo 6. obtém-se simplesmente S  a.2. 6 Simplificação de Gramáticas e Formas Normais Hopcroft sugere (p. Rajeev Motwani. 2001.uky. 1998. Peter Linz. 2nd Ed. de procurar chegar a um carácter terminal no início de cada produção. 3rd Ed.Teoria da Computação Cap. 6 Simplificação de Gramáticas e Formas Normais No entanto este procedimento. Existe um algoritmo para passar à FN Greibach a partir da FN de Chomski .pdf. Nesta passagem reside uma das principais utilidades da FN Chomsky: é fácil chegar a ela.. Este algoritmo pode ver-se por exemplo em http://www. eliminar os ciclos recursivos.. John Hopcroft. PWS Publishing Co. Addison Wesley. 2001. para qualquer CFG. 2nd Ed.. Introduction to the Theory of Computation. Michael Sipser. É possível. matéria a estudar no próximo capítulo. não funciona quando existem ciclos recursivos à esquerda que nunca atingem um terminal. LEI/DEIFCTUC/2009/@ADC Documento de trabalho 243 . An Introduction to Formal Languages and Automata. criando uma produção que (i)introduz um terminal como primeiro símbolo do corpo e (ii) tem variáveis a seguir a ele para gerar todas as sequências de variáveis que poderiam ter sido derivadas no caminho de geração daquele terminal. Introduction to Automata Theory. Prentice Hall. Jeffrey Ullman.edu/~lewis/texts/theory/languages/cf-lang. Jones and Bartelett Computer Science. Esta usase por exemplo para o projecto de autómatos de pilha. Elements for the Theory of Computation. Languages and Computation. É necessário neste caso curto-circuitar o processo. 1997. Harry Lewis and Christos Papadimitriou. Bibliografia. a partir de qualquer gramática e depois usa-se o algoritmo para passas à de Greibach. como por exemplo em A  AB.cs. 6 Simplificação de Gramáticas e Formas Normais Documento de trabalho 244 .Teoria da Computação LEI/DEIFCTUC/2009/@ADC Cap. 1 Introdução 247 7.5.3 Autómatos de Pilha Não-Determinísticos 249 7.7 Autómatos de Pilha CAPÍTULO 7 AUTÓMATOS DE PILHA 7. Autómatos de pilha e linguagens livres de contexto 261 7. Autómatos de pilha determinísticos e linguagens livres de· contexto determinísticas 265 7.4.6.2 O Autómato de Pilha. Gramáticas para linguagens livres de contexto determinísticas 270 Bibliografia 271 LEI/DEIFCTUC/2009/@ADC Documento de trabalho 245 . PDA-Push Down Automata 247 7.Teoria da Computação Cap. Teoria da Computação LEI/DEIFCTUC/2009/@ADC Cap.7 Autómatos de Pilha Documento de trabalho 246 . PDA – Push Down Automata Retomando aqui o esquema geral de um autómato. n  0} porque para isso é necessário uma capacidade infinita de contagem.1. A pilha pode ter uma dimensão arbitrariamente grande. o PDA tem uma pilha adicional em relação ao autómato finito. w  *}. 7. sendo até necessário aqui a memorização de uma cadeia de símbolos (e não apenas o seu número) por ordem inversa. LEI/DEIFCTUC/2009/@ADC Documento de trabalho 247 . que vimos no Cap. nenhum autómato finito é capaz de aceitar a linguagem L= {anbn :. Existirá uma classe de autómatos que se possa associar a todas as linguagens livres de contexto? No Cap. Por exemplo.1. PDA). uma subclasse das livres de contexto. determinísticos e não determinísticos. Também no caso de cadeias simétricas em relação a um ponto central. se verifica o mesmo. é impossível encontrar um autómato finito para a linguagem. Introdução As gramáticas livres de contexto são a base da construção das linguagens de programação e são por isso muito importantes.7 Autómatos de Pilha 7. L = {v  * tal que v=wwR. Este facto sugere a utilização de uma pilha como memória. onde se escrevem cadeias. que são uma forma de representação e especificação de linguagens. Pode ler e escrever no topo da pilha em cada instante. até . PDA) ou aceitadores de pilha (pushdown accepters. 2. No entanto como sabemos os autómatos finitos não conseguem representar todas as linguagens.Teoria da Computação Cap. como ilustrado na Fig. e uma unidade de controlo com um certo número finito de estados internos. temos os autómatos finitos. pilha do tipo LIFO (last in first out ) resultando numa classe de máquinas chamadas autómatos de pilha (pushdown automata.2. 7. 4 vimos que para linguagens regulares.2. Sempre que uma linguagem é infinita e que as suas cadeias têm uma estrutura tal que é necessário guardar memória da parte da cadeia já lida. Tal como ele tem um registo de entrada. O autómato de pilha. em função de tudo o que lê. não há equivalência entre os determinísticos e os não-determinísticos.2.7 Autómatos de Pilha cadeia de entrada a a b b a b q0 q2 a q1 b CONTROLO c P i l h a 0 1 # Figura 7. A classe dos autómatos de pilha determinísticos define uma nova família de linguagens.2. lê o símbolo que está no momento presente no topo da pilha. se se permitir que este autómato seja não determinístico. 7.2. Neste caso. Isto é.1 Esquema do autómato de pilha. LEI/DEIFCTUC/2009/@ADC Documento de trabalho 248 . O PDA lê caracteres de entrada. obtém-se uma classe de autómatos que aceitam exactamente as linguagens livres de contexto. executa uma movida do autómato para um outro estado interno. a função de transição  tem três argumentos de entrada e dois argumentos de saída. e em função do seu estado interno actual. as linguagens determinísticas livres de contexto. contrariamente ao que acontece para os autómatos finitos. muito importantes para as linguagens de programação e que são um subconjunto das linguagens livres de contexto maior do que as linguagens regulares (Fig. Como veremos posteriormente.2. 7.2.2 Função de transição do PDA. como na Fig.Teoria da Computação Cap. e eventualmente escreve (ou apaga) um ou vários símbolos no topo da pilha. carácter de entrada estado actual símbolo no topo da    estado seguinte escreve na pilha Figura 7.3). e infelizmente. estando num certo estado interno. Cada movida da unidade de controlo é determinada por  símbolo de entrada actual  símbolo no topo da pilha no momento presente. com um ficheiro de saída onde ele escreve. Poderemos conceber também PDA’s transdutores.7 Autómatos de Pilha Livres de contexto Livres de contexto determinísticas Regulares Figura 7. No entanto só nos interessaremos aqui pelos PDA aceitadores. O resultado de uma movida da unidade de controlo é  um novo estado da unidade de controlo  uma mudança no topo da pilha.2. LEI/DEIFCTUC/2009/@ADC Documento de trabalho 249 . cada movida da unidade de controlo  lê um símbolo na cadeia de entrada. Relação entre as linguagens regulares. cujo acrónimo é NPDA (do inglês).3. Autómatos de pilha não-determinísticos (NPDA) Num autómato de pilha não determinístico.Teoria da Computação Cap.3.  altera o conteúdo da pilha através das operações usuais em pilhas. livres de contexto determinísticas e livres de contexto. 7. da direita da cadeia para a esquerda (Fig. sendo neste caso uma transição-. . O contradomínio de  deve ser um conjunto finito porque Q* é um conjunto infinito e por isso tem subconjuntos finitos e infinitos. elas devem ser em número finito de possibilidades.7 Autómatos de Pilha 7. pela definição.Teoria da Computação Cap.3. as movidas serão inibidas. Um aceitador não determinístico de pilha (NPDA. . F) em que Q : conjunto finito de estados internos da unidade de controlo  : (sigma) o alfabeto de entrada  : (gama) conjunto finito de símbolos chamado alfabeto da pilha  : Q (  {})    subconjuntos finitos de Q * . é a função de transição.3. Esta escrita é feita carácter a carácter. Definição formal de autómato de pilha não-determinístico Definição 7. De uma movida resulta a escrita de um carácter no topo da pilha.2.nondeterministic pushdown accepter) é definito por um septeto M = (Q. Note-se que. o aceitador pára.7. q0. geralmente # (cardinal) F  Q : conjunto de estados finais (aceitadores). ver a figura 7. e o da pilha.  (gama). que são em geral diferentes (mas não obrigatoriamente). LEI/DEIFCTUC/2009/@ADC Documento de trabalho 250 . Existem dois alfabetos num NPDA: o de entrada. se a pilha estiver vazia.1).1. Embora o NPDA possa ter várias escolhas possíveis para as suas movidas. z0. .2.1. uma transição pode ter como carácter de entrada . q0  Q : estado inicial da unidade de controlo z0   : símbolo de inicialização da pilha. Por outro lado a definição de transição exige um símbolo no topo da pilha.3.  (sigma). 1 Escrita na pilha do NPDA As operações sobre a pilha são do tipo “push” – introduzir no topo um carácter adicional.Teoria da Computação Cap.1 ilustra outros tipos de transições possíveis.3.apagar um carácter. ) } pop apaga 0 6. 1) } nenhuma não altera 5. 10) } Sendo q0 : estado actual a : carácter lido à entrada 0 : símbolo no topo da pilha q1 : estado seguinte 10: escrever 1 no topo. A inicialização da pilha pode ser feita com qualquer símbolo de . sendo  a função de transição. . ou do tipo “pop”. por cima do zero. a. b. Uma substituição é feita por uma sequência pop-push. i. 0#) } push acrescenta 0 2. 0) = { (q1. (q0.:  (q0.3. “push 1”. (q1.e. 0) = { (q2. daí b pushdown c Figura 7. 10) } push acrescenta 1 LEI/DEIFCTUC/2009/@ADC Documento de trabalho 251 .1 Operações sobre a pilha no NPDA Transições Operações sobre a a pilha Significado 1.7 Autómatos de Pilha abc é escrita de cima a para baixo. 1) = { (q1. 0) = { (q1. . ou do tipo substituição de um carácter por outro (mantendo-se o tamanho da pilha). (q1. b. Uma movida do autómato tem a seguinte sintaxe. (q1. a. 1) = { (q1. (q0. (q0. 1) } substituição substitui 0 por 1 4. Tabela 7. Normalmente usa-se para símbolo inicial da pilha o carácter especial # (cardinal). A tabela 7. #) = { (q1. ) } pop apaga 1 3.3. b. 0) = { (q2. a unidade de controlo passa ao estado q3 . 1#). b) = {(q2. pop b. # ) = {(q1. ou seja. então acontecerá uma de duas coisas: i) . 1} z0=# F= {q3} e  (q0. # ) = {(q3. pop b e push cd. estando b no topo da pilha. 11)}. a. # ) = {(q3.3. 0. b. )}. (q3. )}.1. cd). Exemplo 7.7 Autómatos de Pilha Exemplo 7.}  = {a. q2. q3.)}. ii) .a unidade de controlo passa ao estado q2 .2. . 1 ) = {(q2. a. 1 ) = {(q1.3. isto é. )} Quando o autómato está no estado q1. a.  (q2. )}. Seja o NPDA com Q = {q0. 1 ) = {(q2.  (q0. apaga b do topo da pilha (que fica assim com menos um carácter). ou seja.substitui b pela cadeia cd no topo da pilha (que fica assim com mais um carácter) . b. b}  = {#. (q3.  (q1. Considere-se a transição num NPDA definida por  (q1.na pilha substitui b por .  (q1.Teoria da Computação Cap.  (q2. LEI/DEIFCTUC/2009/@ADC Documento de trabalho 252 . )}. . q1. se aparecer um a na cadeia de entrada. apaga um 1. A passagem do estado q1 ao estado q2 acontece quando aparece o primeiro b. devido a LEI/DEIFCTUC/2009/@ADC Documento de trabalho 253 . enquanto existirem 1’s na pilha. nunca mais de lá sai. a. )} - se no estado q2 lê um b. E agora se estiver no fim da cadeia. tendo 1 no topo da pilha. Que faz então o autómato? Quando atinge q3 ? Ele conta os a’s que vai lendo através dos 1’s que escreve na pilha. tendo um 1 no topo da pilha. Para os pontos do seu domínio para os quais não se encontra definida. quando o NPDA lê uma cadeia de L = {an bn : n  0}. assume-se que transita para o conjunto nulo representando uma configuração morta do NPDA. não havendo na leitura mais do que o . se o autómato cair num estado para o qual  não está definido. por este modo. - por cada a que aparece acrescenta um 1 à pilha. isto é. push 1.7 Autómatos de Pilha Note-se que  não é uma função total. O estado q3 é alcançado. ou seja. b. até que fique apenas o símbolo inicial #. Num certo instante tem tantos 1’s quantos os a’s que leu. 2ª :  (q2. 11)} - se no estado q1 lê um a. passa ao estado q2 e apaga o 1 do topo da pilha. 1 ) = {(q1. apaga todos os 1’s e chega ao símbolo inicial # que está no fundo da pilha. - por cada b que aparece nestas circunstâncias. Há duas transições neste exemplo que merecem uma análise mais detalhada: 1ª :  (q1. Se o número de b’s que leu até um certo instante igualar o número de a’s que leu na primeira parte. ou seja pop 1. Por cada b que lê depois. passa ao estado aceitador q3. estando por isso morto. mantém-se em q1 e acrescenta um 1 à pilha. muda de estado e apaga um 1. apaga um 1 da pilha. Depois aparece um b.Teoria da Computação Cap. Note-se que após a leitura do primeiro a o autómato pode passar directamente ao estado final q3. 1 ) = {(q2. sendo o topo o símbolo mais à esquerda. deste modo simples. Uma movida de uma descrição para outra descrição é denotada pelo símbolo |. impõe a restrição de que os b’s apareçam depois dos a’s. resultando numa linguagem bem diferente. O que significa aceitar uma linguagem. Pode-se afirmar. o autómato passa ao estado morto porque de q2 não há uma transição com a. ). Assim. yx) só é possível se existir a transição LEI/DEIFCTUC/2009/@ADC Documento de trabalho 254 . Note-se que o NPDA muda de estado após o aparecimento do primeiro b. Se aparecer depois um a. Se não houvesse mudança de estado naquela altura então os b´s poderiam ser seguidos de a’s. Por exemplo (q1. por analogia com o que acontece nos DFA. w. (q3. 1#). Descrição instantânea de um NPDA A descrição instantânea do NPDA é completamente definida pelo tripleto (q. a. u) em que q : é o estado actual do autómato w : é a parte ainda não lida da cadeia de entrada u : é o conteúdo da pilha. Se na primeira transição eliminarmos a possibilidade (q3. que o NPDA aceita esta linguagem. w.7 Autómatos de Pilha  (q0. O estado q3 é assim alcançado quando o NPDA lê uma cadeia de L = {an bn : n  0}  {a}. aw. já nosso conhecido dos capítulos anteriores. a linguagem aceite pelo autómato será simplesmente L = {an bn : n  0}. # ) = {(q1. bx) | (q2.Teoria da Computação Cap. )} e por aqui aceita a linguagem L={a}. num NPDA? Vejamos a noção de descrição instantânea do aceitador. isto é. .  . é irrelevante para esta definição de aceitação. Linguagem aceite por um NPDA Estamos agora em condições de definir formalmente a condição de aceitação de um NPDA. contrariamente ao que ao que acontece na definição seguinte. . O conteúdo da pilha. para algum q Q} Pode-se demonstrar que as duas definições são equivalentes: se existe um NPDA que aceita uma linguagem L por um estado final. u  *} Ou seja.7 Autómatos de Pilha  (q1. q0.2. a linguagem aceite por M é o conjunto de todas as cadeias capazes de colocarem o autómato num estado aceitador (F é o conjunto dos estados aceitadores) no final da leitura cadeia. b) = {(q2. A linguagem aceite por M é  L (M) = {w* : (q0. Aceitação por pilha vazia Diz-se que um NPDA aceita uma cadeia por pilha vazia se ele. y)}  As movidas com um número arbitrário de passos são denotadas por  . Por outro lado a  notação |M ou  M indica que as movidas se referem ao autómato específico M. q0 .. z0 .Teoria da Computação Cap. u). termina com a pilha vazia e num estado qualquer.3. o NPDA M = (Q . . . a.). z0. Definição 7. Formalmente. F) um autómato de pilha não determinístico. p F.  . Definição 7. w. F ) aceita a linguagem L (M) por pilha vazia se  L (M) = { w  * : (q0 . z0)  M (p. w . então existe um NPDA que aceita a mesma L pela pilha LEI/DEIFCTUC/2009/@ADC Documento de trabalho 255 . z0)  M ( q . nesta definição a pilha pode ficar com um conteúdo arbitrário desde que termine num estado aceitador.  . Aceitação por estado final Seja M = (Q. u. depois de inicializado e depois da leitura da cadeia. . Mas se vierem seguidos tantos b’s que esgotem os 0’s. LEI/DEIFCTUC/2009/@ADC Documento de trabalho 256 . Ver em Hopcroft e Coll. a. Suponhamos que a cadeia se inicia por a’s: sempre que aparece um a acrescenta-se um 0 à pilha (push). e por isso é necessário uma nova estratégia construtiva. #)}. b}* : na(w)=nb(w)} ? É necessário contar o número de a’s e b’s. na(w)=nb(w)=0  (q0. é necessário contar os a’s e os b’s com símbolos diferentes. e aparecer um b. um b acrescenta 1.Teoria da Computação Cap. (p. 00)}. apaga-se esse 1 (pop). #) = {(qf. restando apenas o símbolo de inicialização da pilha. o que se pode fazer facilmente usando a pilha.3. Como o número de a’s que surgiu até agora pode ser maior ou menor do que o número de b’s que já foram lidos. por exemplo o 0. apaga-se um zero da pilha (pop). Teremos assim as seguintes transições:  (q0. 0#)}. um b inicial acrescenta 1  (q0. Define-se um símbolo para contar o número de a’s. 0) = {(q0. Agora quando o topo da pilha for um 1 e aparecer um a. Depois se aparece um b.1. 11)}. b. Há aqui uma luta entre os a’s e os b’s para ver quem ganha. aceita a cadeia vazia. Exemplo 7. b. a. )}. #) = {(q0. b. acrescenta-se um 1 à pilha (push). 1) = {(q0.7 Autómatos de Pilha vazia. Qual o NPDA que aceita L = {w  {a. encarregando-se o futuro de igualar os dois. Uma cadeia pode iniciar-se por a ou por b. Mas agora a ordem dos a’s e b’s é irrelevante. #) = {(q0. isto é quando não houver mais zeros. dado que não podemos ter aqui a representação de números negativos. um b ou escreve 1 ou apaga 0. Um a ou escreve 0 ou apaga 1. um a apaga 1  (q0. 1#)}. )}. um b apaga 0  (q0. a. um a inicial acrescenta 0  (q0. então introduz-se na pilha um 1 por cada b em excesso. tal como no exemplo anterior. 0) = {(q0.2. e vice-versa. um a acrescenta 0  (q0. 230-236). 1) = {(q0. abbabbaa.2. LEI/DEIFCTUC/2009/@ADC Documento de trabalho 257 . abbabb. ) . escreve 0 na pilha e mantém-se em q0 O NPDA é formalmente definido pelo septeto M = ({q0.1. pode acontecer uma de duas coisas: . abbab. {qf}). #. #) e portanto é aceite.b}. #) | (qf. . ab. 0#) | (q0.3. {#. 1#) | | (q0.2 Grafo de um autómato de pilha O grafo de um NPDA tem algumas semelhanças com o de um NFA. abbabba. Os nós são os estados e as arestas representam as transições. 00#) | (q0. por estado final. As etiquetas das arestas têm que conter toda a informação necessária. qf}. #) | (q0. a. 0#) | (q0. 0#) | (q0. 1 . . 0. abba.o autómato consome o carácter de entrada. abb. {a.3. 01 q0 q1 0 1 Figura 7. #) | (q0.7 Autómatos de Pilha A transição- introduz indeterminismo no autómato. Quando aparece um a à entrada.Teoria da Computação Cap. Notação JFLAP. a.a notação de Linz e do JFLAP Pilha após movida a.o autómato transita para o estado qf sem consumir o a da entrada (transição . 1}. Não há uma convenção única de etiquetagem. #) | (q0. Conhecem-se duas principais: . Por exemplo a cadeia abbabbaa produz as seguintes movidas: (q0. q0. 7. 0 . 0) .2. . 01 q0 q1 1 0 Figura 7.faz o “pop” da pilha (apaga 1) . se lê a e se a pilha estiver com 1 no topo.Teoria da Computação Cap.passa ao estado q1. 01# (JFLAP).  5 7 qf b. # .2. 00 1 4 b. 11 6 a. Notação DEM Com o significado: estando o autómato no estado q0.  Figura 7. 1) A diferença entre as duas está apenas na ordem porque se anota a inserção dos símbolos na pilha: da direita para a esquerda.e depois o “push” de 01 ( escreve 1 seguido de 0. se lê a e se a pilha estiver com 1 no topo. 1 .passa ao estado q1. 1# 3 . # q0 a.7 Autómatos de Pilha Com o significado seguinte: Estando o autómato no estado q0. 0.3.3 Grafo do NPDA do exemplo 7. O grafo do NPDA. .3. será a. b}* : na(w)=nb(w)}.e depois o “push” de 0 e 1 (escreve 0 seguido de 1. com L = {w  {a.2. 0# 2 b. ou da esquerda para a direita #01 (DEM).3.2.1 LEI/DEIFCTUC/2009/@ADC Documento de trabalho 258 . o autómato . com notação do JFALP. topo à direita. 1 . # . topo à esquerda. # .faz o “pop” da pilha (apaga 1) .a notação de Taylor e DEM Pilha após movida a. 1 . o autómato . Descrição informal (Hopcroft. embora outros ramos do autómato não determinístico possam sobreviver e eventualmente atingir o estado de aceitação. Depois de transitar para o estado q1. mantendo o autómato no estado q0 continuando a ler entradas e a colocá-las na pilha. lêem-se os símbolos e vão-se colocando na pilha. i. com o DEM). podemos fazer os dois palpites: supõe-se que se atingiu o meio de w e supõe-se também que não. consome-se o símbolo de entrada e apaga-se o topo da pilha (pop). 4. um de cada vez.e. fizemos um palpite errado: w não é seguido de wR. Enquanto se estiver em q0. Exemplo 7. compara-se o símbolo da entrada com o símbolo no topo da pilha. 221): 1. poderemos dividi-las em várias partes: LEI/DEIFCTUC/2009/@ADC Documento de trabalho 259 . leu-se de facto uma entrada w seguida pelo seu reverso wR. e o primeiro carácter no fundo.7 Autómatos de Pilha O estado aceitador desenha-se com dupla circunferência. 3. Se forem diferentes. Este ramo morre. com o carácter mais à direita no topo. Transita-se então para o estado q1.. criando para isso um estado q2. b}+} O símbolos são inseridos na pilha pela ordem inversa por que são apagados.2. Se forem iguais. Em qualquer altura pode-se fazer o palpite de que se atingiu o meio.Teoria da Computação Cap. (Ver o mesmo exemplo em Taylor 538. Se se esvaziar a pilha. Em termos das transições. Aceita-se a entrada que foi lida até este ponto. Inicia-se no estado q0 que representa o “palpite” de que ainda não chegámos ao meio da cadeia. ainda não chegámos ao fim da cadeia w que deve ser seguida pela sua reversa. Como o autómato é não determinístico.2 Construir um NPDA que reconheça a linguagem dos palíndromos pares L = { wwR : w  {a. 2. fazendo o “push” de cada carácter. Nessa altura a pilha contém w.3. a. b)}. a) = {(q0. b. a) = {(q1. bb)}. b) = {(q0.b.a.  (q0. aba. 2ª parte palpitar o meio da cadeia  (q0.a. a.b. #)}. #) = {(q2.  (q0. a) = {(q1.2. # ..a . b)}. #) = {(q0. abab. Por exemplo a cadeia ababbaba.4. NPDA do exemplo 7. )}. ab. 7.Teoria da Computação Cap. a) = {(q0. baba#) | (q1. aba#) | (q1.. ababbaba. ba)}. O grafo do autómato será o da Fig. # .  (q0. a a.2. b. # .3. a . )}. ba#) | (q1. LEI/DEIFCTUC/2009/@ADC Documento de trabalho 260 . #) e portanto é aceite. b) = {(q1. b b. #) = {(q0. pode ser aceite pelas seguintes transições (q0.3. bb b.2. aba#) | (q0. ababba. 4ª parte para fazer a aceitação  (q1. ab Figura 7. baba#) | (q1.4. b1 .. ba b. aa)}. a . a. ab)}. #) | (q0. . 3ª parte para comparar wR com o conteúdo da pilha  (q1. em que w=abab.  (q0. a#) | (q0. b# . abab. ababbab.  a. .  (q1. .3. a. b.  (q0. abab. a)}. a# a. # qf . b) = {(q1. a#)}.b. ababb.. ba#) | (q0.. . b) = {(q0. a#) | (q1.2.. baba#) | (q1. aa q0 q1 . b . #) | (q2.7 Autómatos de Pilha 1ª parte para fazer o “push” de w  (q0.  b.  (q0.a. 4.1 Simulação de uma produção no NPDA LEI/DEIFCTUC/2009/@ADC Documento de trabalho 261 . . Autómatos de pilha e linguagens livres de contexto A relação entre linguagens livres de contexto e NPDA é análoga à relação entre autómatos finitos e linguagens regulares: para toda a linguagem livre de contexto existe um NPDA que a aceita. Repare-se que esta escolha não tira generalidade à prova porque para qualquer linguagem livre de contexto existe uma FN de Greibach.o NPDA implementa a derivação pela extrema-esquerda de qualquer cadeia. 6. A prova é construtiva: vamos construir um NPDA para uma CFL qualquer. se um NPDA aceita uma linguagem então ela é livre de contexto. A construção de um NPDA para esta gramática faz-se da seguinte forma: . .as variáveis da parte direita da forma sentencial colocam-se na pilha. .para simular A ax: - coloca-se A no topo da pilha - introduz-se a como símbolo de entrada - a variável na pilha é removida e substituída por x a a x A # A  ax # Figura 7.4.a parte esquerda da forma sentencial. x V* por ser mais fácil e intuitivo. Para isso usamos a forma normalizada da Greibach . a T.7 Autómatos de Pilha 7. composta pelos símbolos terminais. em que todas as produções são da forma A  ax.Teoria da Computação Cap. .4.1. como se viu no Cap. 7. é idêntica à entrada lida.começa-se colocando o símbolo inicial na pilha. NPDA’s para gramáticas livres de contexto Suponhamos que a CFG está na FN de Greibach. 1)  aaaABB (de 2. a.1) Procuremos agora um NPDA que modelize esta gramática. q1 e o aceitador qf.-2. AB)} 3º Simular 4º Simular LEI/DEIFCTUC/2009/@ADC Documento de trabalho 262 . a. #) = { (q1.7 Autómatos de Pilha Exemplo 7. o inicial q0 .1-1. S#)} 2º Simular S  aA  (q1. a.1)  aaaaBBBB (de 2. O alfabeto da pilha é  = {#.1)  aaAB (de 2.1)  aaaabbbB (de 3. o de derivações.2 A  aAB | aBB 3 Bb que gera a linguagem L (G) = { anbn : n  1 } Vejamos a derivação pela extrema esquerda de aaaabbbb : S  aA (de 1.4. B } e  = {a. S) = { (q1. b}. B)} A  aAB  (q1.2)  aaaabBBB (de 3. .Teoria da Computação Cap. A) = { (q1.1)  aaaabbbb (de 3. Vejamos se chegam três estados.1. A)} S  aB  (q1.1 (Taylor 550) Seja a CGF em forma normal de Greibach Produção 1. A.1)  aaaabbBB (de 3.2 S  aA | aB 2. S) = { (q1. S. 1º Introduzir o símbolo inicial na pilha:  (q0. BB Bb  (q1.  qf a. )} q1 b. . A . . BB a. AB)} q1 S  aA . B) = { (q1. a.2 PDA do exemplo 7. A)} q1 S  aB  (q1. BB)} Bb  (q1.4. AB A  aBB  (q1. a. S . A) = { (q1. . # q1 a. S# q1 a. A q0 . b. BB)} q1 a. B) = { (q1. # . #)} Documento de trabalho q0 . A) = { (q1.4. #) = { (qf. S) = { (q1. # . A . #S . B)} q1 A  aAB  (q1. A . A) = { (q1. 7. # .  aceitar a cadeia LEI/DEIFCTUC/2009/@ADC  (q1.1 (DEM).4. b. B . #) = { (qf. A a. # . Tabela 7. S .4.1 Produção Carregar S Movida  (q0. AB Figura 7. S .7 Autómatos de Pilha 5º Simular A  aBB  (q1. B a. a. # qf 263 .Teoria da Computação Cap. B . B a. #)} Note-se o carácter não determinístico no autómato (várias escolhas de movidas possíveis para uma da configuração). a. )} 6º Simular 7º Aceitar a cadeia quando aparece # no topo da pilha: muda para o estado aceitador  (q1.1 Resumo da simulação das derivações da gramática do Ex. S#)} Grafo q0  (q1. a. S) = { (q1. #) = { (q1. A . S . a. O NPDA do exemplo 7. substituindo S por . e daí (q1. B) = { (q1.3. # .4. q2} sendo q2=qf. b. S# q1 b. SA a. mudando as produções para (neste caso é simples) S  aSA | a A  bB. A) = { (q1. SA). 5º completar a derivação quando aparece # no topo da pilha:  (q1. O autómato correspondente terá 3 estados {q0. )}. B . S#)}. (q1. q1.7 Autómatos de Pilha Exemplo 7. S .2 Construir um NPDA que aceite a linguagem gerada pela gramática S  aSbb | a Antes de mais. )} simular a produção S  a. B  b. #) = { (qf. .1 (notação JFLAP). . LEI/DEIFCTUC/2009/@ADC Documento de trabalho 264 . A . # . 4º simular a produção B  b :  (q1. b.4. #)}. a. 2º simular a produção S  aSA.4. a. S) = { (q1. # qf b. 1º colocar o símbolo inicial S na pilha:  (q0. S . deve transformar-se a gramática na forma de Greibach. B)}. removendo S da pilha e colocando lá AS lendo a à entrada  (q1. 3º simular a produção A  bB :  (q1. B . #) = { (q1.Teoria da Computação Cap.  q0 . de modo análogo.  Figura 7. ). # q1 .Teoria da Computação Cap.  a. # . A . pode-se utilizar um símbolo especial na pilha.4.S$)} E agora começa-se com a gramática de Greibach. # . S . B a.4. $ . A . $. B .7 Autómatos de Pilha L (G) = { a n b 2(n-1) : n  1}. para uma linguagem definida por uma gramática de Greibach ? . A . S . S . #) = { (q0. sem . - o estado q0 pode ser eliminado. A . ficando o autómato não-determinístico. S . A . B a.  a. λ. NPDA com dois estados equivalente ao da Fig. B .no exemplo obtiveram-se três .4. # qf a. BB a. BA (Notação DEM) Figura 7. BA (Notação DEM) Figura 7.4. 7. com três estados. para inicializar a gramática:  (q0.2 Este resultado é geral: para qualquer CFL com  existe um NPDA com dois estados. # . $S q1 .5. Qual a linguagem do NPDA ? Qual o número mínimo de estados de um NPDA. BB a. A . Se quisermos evitar a introdução do . LEI/DEIFCTUC/2009/@ADC Documento de trabalho 265 . a. -  passa a ser aceite a. #S qf a. NPDA com dois estados para uma linguagem sem . Autómatos de pilha determinísticos e linguagens livres de contexto determinísticas Se concebermos um autómato de pilha que não tenha escolhas possíveis em qualquer estado. de modo que a gramática simule as movidas do NPDA. existe para ele uma gramática livre de contexto.Teoria da Computação Cap. Nesta construção reside uma das principais utilidades das gramáticas de Greibach. 7.4.7 Autómatos de Pilha Finalmente concluímos que para qualquer CFL sem λ existe um NPDA com dois estados. O teorema aplica-se a toda a gramática livre de contexto.5. Teorema 7. Chama-se. existe um NPDA M tal que L = L (M) A demonstração é feita pela construção anterior: .1. Gramáticas livres de contexto para NPDA’s O inverso do teorema anterior também é verdadeiro: dado um NPDA. Se L = L (M) para algum NPDA M. então existe uma gramática livre de contexto na forma normal de Greibach para L. em inglês. DPDA – Deterministic Push Down Accepter. Note-se que a exigência de que a gramática esteja na forma de Greibach é apenas para facilitar o desenvolvimento. LEI/DEIFCTUC/2009/@ADC Documento de trabalho 266 .Ver uma demonstração mais detalhada em Linz. Teorema 7. Para o provar baste reverter o processo construtivo.2. 185.4. -constrói-se um NPDA para simular as derivações pela extrema-esquerda dessa gramática. então L é uma linguagem livre de contexto. Para qualquer linguagem L livre de contexto.4.Se L é uma linguagem livre de contexto . 7. Ver em Linz 189.2. ele será determinístico. Teoria da Computação Cap.7 Autómatos de Pilha Definição 7.5.1. Autómato de pilha determinístico. Um autómato de pilha M = (Q, , ,, q0, z0, F) diz-se determinístico se for um autómato obedecendo a definição 7.3.1. e além disso se se submeter às restrições seguintes, para todo o q  Q, a   {} a b  , 1.  (q, a, b) contém no máximo um elemento (uma só movida possível): dado um símbolo de entrada e um símbolo no topo da pilha, só é possível uma movida, no máximo. 2. se  (q, , b) não é vazia, então  (q, c, b) deve ser vazio para todo o c  : quando é possível uma transição- para alguma configuração, não existe nenhuma alternativa que consuma caracteres de entrada para essa mesma configuração (i.e par ao mesmo topo da pilha). Definição 7.5.2. Linguagem livre de contexto determinística. Uma linguagem L diz-se livre de contexto determinística se e só se existir um DPDA M tal que L = L(M). Exemplo 7.5.1 Consideremos a linguagem L = { an bn : n 1 } Vejamos se ela é livre de contexto determinística. O PDA M = ({q0, q1, q2 }, {a, b}, {#,1}, , q0, #, {qf}) com  (q0, a, # ) = {(q1, 1#)} (inicia a contagem dos a’s)  (q1, a, 1 ) = {(q1, 11)}, (conta os a’s )  (q1, b, 1 ) = {(q2, )}, (detecta o primeiro b)  (q2, b, 1 ) = {(q2, )}, (conta os b’s)  (q2, , # ) = {(qf, )} ( aceita se nº a’s = nº b’s) LEI/DEIFCTUC/2009/@ADC Documento de trabalho 267 Teoria da Computação Cap.7 Autómatos de Pilha aceita aquela linguagem. Logo ela é determinística (e livre de contexto, como já se sabe). b ,1 ;  a, 1 ; 11 q0 b, 1 ;  a, # ;1# q2 q1 , # ;  qf Figura 7.5.1 O PDA determinístico do Exemplo 7.5.1 (JFLAP) Se quisermos aceitar a cadeia vazia, L = { a n b n : n 0 }, teremos a Fig. 7.5.2. b ,1 ;  a, 1 ; 11 q0 a, # ; 1# q1 b, 1 ;  q2 , # ;  qf Figura 7.5.2. PDA que aceita a cadeia vazia. ou ainda a Figura 7.5.3. a, # ;1# qf b ,1 ;  a, 1 ; 11 q1 b, 1 ;  q2 , # ;  Figura 7.5.3. PDA equivalente ao da Figura anterior, com um só estado aceitador: chegando a q2 e lendo # na pilha, passa ao estado aceitador. Contrariamente ao que acontece nos autómatos finitos, nos PDA não há equivalência entre os determinísticos e os não determinísticos. Diferenças entre os DFA e os DPDA Também os DFA não têm escolhas possíveis. Há no entanto algumas diferenças entre estes e os DPDA: LEI/DEIFCTUC/2009/@ADC Documento de trabalho 268 Teoria da Computação - Cap.7 Autómatos de Pilha aqui admitem-se transições- sem quebra de determinismo. Como o topo da pilha também desempenha um papel importante na determinação da movida seguinte, o carácter no topo da pilha levanta o indeterminismo da entrada . - a função  não é aqui necessariamente total, podendo ser parcial, isto é, pode haver transições para o conjunto vazio, transições não definidas, e portanto configurações mortas. - nos DPDA a única propriedade característica do determinismo é que em cada configuração só há no máximo uma movida possível. A tabela 7.5.1 resume estas diferenças. Tabela 7.5.1 Diferenças entre os DFA e os DPDA DFA DPDA não admite transições -  admite transições -  é uma função total  não é necessariamente uma função total há equivalência entre os determinísticos e não há equivalência entre os os não determinísticos determinísticos e os não determinísticos Semelhanças entre DFA e DPDA para linguagens regulares As linguagens regulares são um subconjunto das linguagens livres de contexto.Toda a linguagem livre de contexto determinística tem um DPDA. As linguagens regulares são determinísticas, e portanto as linguagens regulares são linguagens livres de contexto determinísticas. Podemos assim concluir que para qualquer linguagem regular existe um DPDA que a aceita. Quais as diferenças e semelhanças entre o DFA e o DPDA de uma linguagem regular? Vejamos um exemplo. Exemplo 7.5.2 (Taylor, 556) O DFA da Figura 7.5.4 aceita a linguagem definida pela expressão regular r = a*b. LEI/DEIFCTUC/2009/@ADC Documento de trabalho 269 Teoria da Computação Cap.7 Autómatos de Pilha b a q0 b a qf q1 b a Figura 7.5.4. DFA do Exemplo 7.5.2. Para desenhar um DPDA equivalente, é necessário alterar as etiquetas das transições a fim de introduzir as operações sobre a pilha. Como a pilha não é de facto necessária, em todas as transições não se faz nada na pilha, que se inicia com # e assim se mantém até ao fim. b ,# ;# a, # ; # q0 b, # ; # a, # ; # qf q1 b, #;# a, # ; # Figura 7.5.5. DPDA equivalente ao DFA da figura anterior. A pilha não é usada. Podemos assim dizer que um DFA é um DPDA sem pilha, ou com a pilha desactivada. 7.6. Gramáticas para linguagens livres de contexto determinísticas As linguagens livres de contexto determinísticas incluem todas as linguagens de programação. Elas têm características relevantes relacionadas com a construção de compiladores eficientes, pois pode-se fazer o seu parsing facilmente (gramáticas-s, mas não só). Têm importância particular as gramáticas LL (Left scan, Leftmost derivations) e as gramáticas LR (Left scan, Rightmost derivations), que serão objecto de estudo na disciplina de Compiladores. LEI/DEIFCTUC/2009/@ADC Documento de trabalho 270 Teoria da Computação Cap.7 Autómatos de Pilha Exemplo 7.6.1. Desenhar o grafo do NPDA da linguagem L = {anbm : 0  n  m , m  2 } (Taylor, 541). Este problema é um exemplo implementado no Deus Ex Máquina – ficheiro Example 10.3.2 na directoria dos “Pushdown Automata”. b, 0 ;  a, 0 ; 00 a,#; #0 b, # ; # q0 b, 0 ;  q1 b, # ; # b, # ; # qf Figura 7.6.1. NPDA do Exemplo 7.6.1 (notação DEM). Bibliografia. An Introduction to Formal Languages and Automata, Peter Linz, 3rd Ed., Jones and Bartelett Computer Science, 2001 Models of Computation and Formal Languages, R. Gregory Taylor, Oxford University Press, 1998. Introduction to Automata Theory, Languages and Computation, 2nd Ed., John Hopcroft, Rajeev Motwani, Jeffrey Ullman, Addison Wesley, 2001. Elements for the Theory of Computation, Harry Lewis and Christos Papadimitriou, 2nd Ed., Prentice Hall, 1998. Introduction th the Theory of Computation, Michael Sipser, PWS Publishing Co, 1997. LEI/DEIFCTUC/2009/@ADC Documento de trabalho 271 Teoria da Computação LEI/DEIFCTUC/2009/@ADC Cap.7 Autómatos de Pilha Documento de trabalho 272 Algumas propriedades decidíveis de linguagens livres de contexto 295 8. Algumas propriedades indecidíveis de CFL’s 297 Bibliografia LEI/DEIFCTUC/2009/@ADC 298 Documento de trabalho 273 .2.1 Introdução 275 8.3.3.2. Propriedades de fecho de linguagens livres de contexto 290 8.2. Relação entre os três lemas de bombagem 289 8.2 Lema de bombagem para linguagens lineares 285 8.2. 8 Propriedades das Linguagens Livres de Contexto CAPÍTULO 8 PROPRIEDADES DAS LINGUAGENS LIVRES DE CONTEXTO 8.3.1 Lema de bombagem para linguagens livres de contexto 275 8.2 Dois lemas de bombagem 266 8.3.3.Teoria da Computação Cap. Propriedades de fecho e algoritmos de decisão para linguagens livres de contexto 290 8.3.1. 8 Propriedades das Linguagens Livres de Contexto Documento de trabalho 274 .Teoria da Computação LEI/DEIFCTUC/2009/@ADC Cap. 8. definidas pelo seguinte teorema. Quando aplicamos certas operações a CFL. por não possuir certas propriedades estruturais da classe. Qualquer gramática tem um número finito de produções e por isso. criando-se assim ciclos que permitem a geração de um número infinito de cadeias de comprimento arbitrário.2. Numa CFL têm que existir ciclos com certas características.1 Lema de bombagem para linguagens livres de contexto Os lemas de bombagem aplicam-se a linguagens infinitas. Encontraremos aqui lemas da bombagem. importa saber se o resultado é ainda uma CFL. mas agora um pouco mais complicados. 8.1 Seja L uma linguagem infinita livre de contexto. Então existe algum inteiro positivo m tal que toda a w  L com |w|  m se pode decompor em w = uvxyz LEI/DEIFCTUC/2009/@ADC Documento de trabalho 275 . mas servem para provar o contrário: que uma dada linguagem não é livre de contexto. Introdução Tal como no Capítulo 4 estudámos propriedades fundamentais das linguagens regulares. para uma linguagem infinita. Há questões aparentemente simples sobre linguagens livres de contexto para as quais ainda não foi possível encontrar resposta. e isto leva-nos às propriedades de fecho. 8 Propriedades das Linguagens Livres de Contexto 8. Uma questão importante é a de se saber se uma dada linguagem é ou não livre de contexto. Dois lemas de bombagem Os lemas de bombagem servem para mostrar que uma linguagem não pertence a uma dada família. Teorema 8. Veremos algumas.2. iremos estudar neste capítulo algumas propriedades das linguagens livres de contexto.1.1.2. Eles não servem para provar que uma linguagem é livre de contexto. no quadro dos algoritmos de decisão.Teoria da Computação Cap. há produções que têm que ser usadas repetidas vezes na mesma derivação. com algumas semelhanças com o que vimos nas linguagens regulares. arbitrários bombagem : u v ix y iz Ou v ou y é não vazia (uma delas pode sê-lo) Figura 8. como já sabemos.. 8 Propriedades das Linguagens Livres de Contexto com |vxy|  m e |vy|  1 tal que bombeando os segmentos v e y se obtêm cadeias de L.Teoria da Computação Cap. com pilha infinita. . 2. LEI/DEIFCTUC/2009/@ADC Documento de trabalho 276 . |z|  0.Bombagem nas CFLs.. Graficamente pode ilustrar-se pela figura seguinte. A pilha serve precisamente para de algum modo contar as voltas do primeiro ciclo. 1. não pode ser um autómato finito. O PDA.. ou seja. tem essa possibilidade.1. Podendo ser um número arbitrariamente grande.2. Essa igualdade requer que o autómato que aceita a linguagem tenha a possibilidade de se lembrar do número de voltas no primeiro ciclo.1. A característica fundamental é a igualdade das voltas nos dois ciclos. Note-se que |vxy| m  |v|  m e |y|  m. w=uvxyz v y O mesmo número de voltas x u z |v x y|  m |x|  0 |u|  0. uvixyiz  L para todo o i = 0. 2. Sendo L infinita.1.2.1. temos o caso de uma linguagem regular. ora como o número de variáveis diferentes é finito. porque não há comparação a fazer. Considere-se uma Linguagem L. O comprimento do corpo de uma produção é sempre limitado. Neste caso não é necessário contar o número de voltas do ciclo. Para uma cadeia w  L. 8 Propriedades das Linguagens Livres de Contexto Repare-se que se v ou y for vazia (uma delas pode sê-lo. tal como ilustrado na Fig.3 LEI/DEIFCTUC/2009/@ADC Documento de trabalho 277 . e por isso um autómato finito (ou um PDA coma pilha desactivada) é suficiente para a linguagem. seja k esse limite. haverá necessariamente repetições de variáveis. Se considerarmos uma derivação suficientemente longa e um caminho longo desde a raiz até a uma folha. o comprimento da sua derivação (número de produções necessárias para a obter) será por isso de pelo menos n =| w |/k.{} . w 1 k 2 k 3 4 k k 5 k 6 k n k Figura 8. com uma gramática G sem produções unitárias e sem produções -.Teoria da Computação Cap. sem o carácter vazio. Aqui consideraremos o caso em que nem v nem y são vazias. mantendo |vy|  1). Vejamos uma demonstração do lema. 8. haverá no seu percurso um número ilimitado de variáveis. Este facto é natural: as linguagens regulares também são livres de contexto e por isso este lema também se lhes aplica.2 Uma cadeia é produzida por sucessivas produções de comprimento k. existem derivações arbitrariamente longas a que correspondem árvores de derivação de altura arbitrária. Teoria da Computação Cap. No fundo cada triângulo é uma sub-árvore. tendo em conta que de cima se tira uAz  uvAyz o que implica que * A  vAy. Da figura poderemos escrever a sequência de derivações * * * S  uAz  uvAyz  uvxyz.1.8. y. Uma derivação arbitrariamente longa repete necessariamente variáveis. z cadeias de símbolos terminais. Um triângulo representa um conjunto de derivações a partir da variável central até à cadeia-folha do triângulo. obtendo-se a Fig. v. LEI/DEIFCTUC/2009/@ADC Documento de trabalho 278 .1. Agora temos * * * S  uAz  uvAyz  * uvvAyyz  uvvxyyz e portanto a cadeia uvvxyyz = uv2xy2z  L . x.3. uvxyz  L sendo u.2. Pode-se então desenhar uma nova árvore de uma derivação com mais um conjunto de produções que completem um ciclo de A a A.2. * Quer dizer.4. 8 Propriedades das Linguagens Livres de Contexto S u A z v A y x Figura 8. Pode-se repetir o procedimento um número arbitrário de vezes. seja no princípio (u=). com a única diferença na definição da decomposição de w em partes. Basicamente prova-se que para uma dada linguagem não é possível encontrar as duas bombas síncronas satisfazendo o lema. Mas a filosofia de aplicação é exactamente a mesma. é de aplicação mais delicada. Mais um ciclo de A a A em relação à figura anterior. 8 Propriedades das Linguagens Livres de Contexto S u v z A y A y v A x Figura 8. de tal modo que uvi xyiz  L Fica assim demonstrado que bombeando v e y o mesmo número de vezes se obtêm cadeias na linguagem. ou no fim (z=).Teoria da Computação Cap. i. e por isso ela não é livre de contexto. pode estar em qualquer parte de w.2. sempre com |vxy|m . Como apresenta duas “bombas” funcionando sincronamente.1. Este Lema aplica-se de modo análogo ao do regular: para provar que uma linguagem não é livre de contexto. Note-se que agora a parte a bombear. vxy.4. seja no meio (u e z diferentes de ). LEI/DEIFCTUC/2009/@ADC Documento de trabalho 279 .4. o que implica que na prova se tenham que experimentar todas essas possibilidades.9. Poderemos repetir aqui a Tabela 4. É como se fossem duas bombas síncronas. todas cadeias pertencentes a L .1.1. pela bombagem de v e y.2. b´s e c´s. dado que a bombagem de apenas a’s e b’s. Provar que não é livre de contexto. uvixyiz  L  i  0. b’s e c’s. 2m b’s e m c’s. tem que ser menor ou igual a m. Se uma bombagem destruir essa relação.uma decomposição uvxyz que produz. a cadeia bombeada não pertence à linguagem. A característica essencial da linguagem é a da relação entre o número de a’s. Para fazer com que isso aconteça. b’s e c’s. ou de apenas b’s e c’s. ficando assim provado que a linguagem não é livre de contexto. 8 Propriedades das Linguagens Livres de Contexto Tabela 8.Teoria da Computação Cap. vxy. Verifica-se que qualquer que seja o posicionamento da bombagem obtêm-se sempre cadeias fora da linguagem.1. se a distância do último a ao primeiro c for maior do que m. Seja L={anb2ncn. |vxy| m . a cadeia com m a’s.existe um m tal que para .qualquer decomposição uvxyz produz. Note-se que esta construção é válida para qualquer valor de m. |vxy| m . como é o caso. nunca se podem bombear simultaneamente a´s.1 O lema da bombagem para CFLs.para qualquer valor de m sou capaz de encontrar . pela bombagem de v e y.(pelo menos) uma cadeia que não pertence à linguagem i  0.Ela é maior do que m e portanto deve verificar o lema. Considere-se por exemplo.(pelo menos) uma cadeia |w|  m pertencente a L em que . Como a subcadeia a bombear. destrói a relação. LEI/DEIFCTUC/2009/@ADC Documento de trabalho 280 . para um dado m. Pode-se por isso concluir que não existe um tal m que verifique o Lema. O Lema pela afirmativa O Lema pela negativa . uvixyiz  L Exemplo 8. basta impossibilitar a bombagem simultânea de a´s.para qualquer cadeia |w|  m pertencente a L existe .2. n 0}. 4. 8 Propriedades das Linguagens Livres de Contexto 2m b’s m a’s a a a a v x bombeia a’s a a a b b v x y b b b b b b b b b b b b m c’s c c v x y c c c c c y bombeia a’s e b’s v x y bombeia b’s bombeia b’s e c’s v x y bombeia c’ Figura 8. a Tabela 4. ao longo da cadeia de teste.Teoria da Computação Cap. Também se pode fazer a prova como um jogo entre dois parceiros.2.2. um procurando o m.2.1.2 O jogo do lema da bombagem Jogador 1 Jogador 2 Define a linguagem L Escolhe um m Indica uma cadeia de L maior do que m Define uma decomposição |uvxyz|  m Indica um i que bombeie para fora LEI/DEIFCTUC/2009/@ADC Documento de trabalho 281 .10 agora com uma nova decomposição uvxyz.5 É necessário tentar todas as localizações possíveis. o outro procurando uma cadeia que “encoste o adversário à parede”. na Tabela 8.1. Repete-se aqui. das partes bombeadas. Tabela 8.2.1. Para isso é conveniente que não se possam bombear simultaneamente a’s. Interessa.1. n> p q>0 } Aqui temos uma desigualdade. para um dado valor de m. seguindo a mesma estratégia.2 L= {anbpcq.2. m c’s) Decomposição uvxyz = |aaaaaaaa|ab|bbbbb|b|bcccccccc| Indica um i que bombeie para fora: i =0 Perde. chega-se à mesma conclusão: não existe um m que verifique o Lema. destruir a desigualdade. em qualquer decomposição com aaaaaaaabbbbbbcccccccc |vxy| 8 não pertence a L (p<q) Para outros valores de m.Teoria da Computação Cap.2 Jogador 1 Define a linguagem: Jogador 2 Escolhe um m: 6 Indica uma cadeia: aaaaaaaabbbbbbbcccccc estratégia: m+1 a’s. b’s e c’s (se se pudesse. m b’s.2. escolher uma cadeia na situação limite e depois. Tabela Exemplo 8. m b’s. 8 Propriedades das Linguagens Livres de Contexto Exemplo 8.1. m+1 a’s. LEI/DEIFCTUC/2009/@ADC Documento de trabalho 282 . com a bombagem. poder-se-ia eventualmente manter a desigualdade). m c’s Decomposição: uvxyz= |aaaaaa|a|bbbb|b|bcccccc Indica um i que bombeie para fora: i = 0 Perde. em qualquer decomposição com aaaaaabbbbbcccccc |vxy| 6 não pertence a L (p<q) Escolhe outro m: 8 Indica uma cadeia: aaaaaaaaabbbbbbbbcccccccc (estratégia. Há linguagens que não são livres de contexto e para as quais se verifica o Lema Livre de Contexto.d. Nem todas as linguagens que verificam o Lema Livre de Contexto são livres de contexto.c. em = {a. Linguagens que verificam o Lema Livre de Contexto Linguagens Livres de Contexto Figura 8.b. Veja-se o exemplo 8.2. Seja L = {anbncpd pep. n  2.2. De facto ela não o é devido à segunda parte dos c.6. obtém-se resultado igual.3. x=.e.d. A menor cadeia da linguagem é w = aabbcde. 8. em qualquer cadeia |w| m.6. que verifica a bombagem para dentro.3.Teoria da Computação Cap. Para cadeias maiores que 7.e. bombeando v=a e y=b obêm-se sempre cadeias de L. No entanto é possível encontrar para ela um valor de m e uma decomposição uvxyz.1. d’s e e’s.1. Mas se uma linguagem não o verifica. ela não é livre de contaxto. Mas não se pode concluir que a linguagem seja livre de contexto. 8 Propriedades das Linguagens Livres de Contexto A linguagem não é livre de contexto. usando sempre uma decomposição |vxy|=|a||b|.2. q.1. o primeiro par ab da cadeia.2. p  1}.1. Vejamos o que se passa com m=7. Por isso verifica-se o ilustrado na Fig. LEI/DEIFCTUC/2009/@ADC Documento de trabalho 283 .d. Exemplo 8.e} Esta linguagem não é livre de contexto devido à igualdade de c’s. Decompondo w=uvxyz=|a|a||b|bcde| . . se pode decompor em w = uvxyz com |uvyz|  m |vy|  1 de modo que bombeando simultaneamente v e y se obtém uvixyiz  L para todo o i=0. Sabemos que uma gramática é linear se do lado direito das produções aparece no máximo uma variável.2. Teorema 8. . w=uvxyz v |u v |  m O mesmo número de voltas x u |y z|  m y z |u v y z|  m x0 |vy|  1 |u v |  m |y z| m Figura 8. 8 Propriedades das Linguagens Livres de Contexto 8. Um lema de bombagem para linguagens lineares Uma linguagem livre de contexto diz-se linear se existir uma gramática livre de contexto linear tal que L = L(G). Então existe algum inteiro positivo m.2.2.1 ilustra graficamente onde se localizam as quatro sub-cadeias.2. tal que toda a cadeia w  L. com |w|  m. A figura 8. Note-se que aqui uma produção pode ser linear à esquerda e outra produção linear à direita e outra ainda linear ao centro. Note-se que |uvyz| ≤ m implica que |uv| ≤ m e |yz| ≤ m. 1..1 Seja L uma linguagem infinita linear.2.2.Teoria da Computação Cap..1 Lema de bombagem para linguagens lineares.2. 2.2. LEI/DEIFCTUC/2009/@ADC Documento de trabalho 284 . que não contenha nem produções unitárias nem produções .2. Neste. existe alguma gramática linear para ela. respectivamente..2. Demonstração: Sendo a linguagem linear.2.(efeito conjugado de produções lineares à esquerda.Teoria da Computação Cap.. Por razões semelhantes v e y são também limitados e por isso existe um m tal que |uvyz|  m (mesmo que o m tenha que ser grande. Se a gramática é linear (contém no máximo uma só variável no corpo de cada derivação). u e z podem ser arbitrariamente grandes. pode ter um tamanho arbitrário. as sub-cadeias a serem bombeadas (v e y) devem-se localizar dentro de m símbolos dos extremos esquerdo e direito de w. Este facto deriva da linearidade: havendo apenas uma variável em cada derivação. Havendo um número finito de variáveis no caminho de S até ao primeiro A.2.. x.2 Árvore de derivação de uma linguagem linear. à direita e ao centro). chega-se mais rapidamente a um ciclo do que no caso em que existam muitas variáveis em cada derivação. ( a eliminação deste tipo de produções não altera a linearidade da gramática). No lema anterior. as variáveis só podem aparecer no caminho central S-A-A . quer u quer z são limitados. é limitado). Consideremos a figura seguinte 8. Da figura poderemos escrever a sequência de derivações LEI/DEIFCTUC/2009/@ADC Documento de trabalho 285 . 8 Propriedades das Linguagens Livres de Contexto A grande diferença entre este lema e o anterior reside em w. e gerando cada uma delas um número finito de símbolos terminais. a cadeia do meio. S u A z v A y x Figura 8.2. para qualquer i. Agora temos * * * * S  uAz  uvAyz  uvvAyyz  uvvxyyz e portanto a cadeia uvvxyyz = uv2xy2z  L . Continuando a derivar a partir do último A. Continuando o processo.2. conclui-se que uvixyiz  L. z cadeias de símbolos terminais.3 S u z A v y A v y A x Figura 8. 8 Propriedades das Linguagens Livres de Contexto * * * S  uAz  uvAyz  uvxyz uvxyz  L sendo u. Fig.3 Mais um ciclo a partir da figura anterior.Teoria da Computação Cap.2. v. até encontrar novamente A. x. Isto implica que * A  vAy.2.2. y. LEI/DEIFCTUC/2009/@ADC Documento de trabalho 286 .8. pode-se desenhar uma segunda figura incluindo a produção adicional A  vAy . Teoria da Computação Cap.2. e assim bombeia a’s e não bombeia b’s  e m d’s no fim. n 0. trata-se de obrigar o adversário a não conseguir bombear sem destruir a característica da linguagem: a relação entre o número de a’s e de b’s e a relação entre o número de c’s e de d’s. Essa característica dá-nos já alguma luz sobre a estratégia da sua utilização: bloquear o adversário dando-lhe uma cadeia em que bombeando nos primeiros m caracteres e nos últimos m caracteres se destrua a característica da linguagem em causa. Jogador 2 Escolhe um m: 5 Indica uma cadeia: aaaaabbbbbbbbbbcccccddddd estratégia: m a’s. é suficiente apresentar uma cadeia que tenha  m a´s no início.1 Prove-se que a linguagem L={anb2ncpd p. e assim bombeia d’s e não bombeia c’s Tabela Exemplo 8. Para um valor de m qualquer. m c’s. Por isso se pode afirmar que o lema das linguagens lineares é um caso particular do lema livre de contexto. Aqui. m d’s Decomposição: |uvyz|5 uvxyz= |aa|a|aabbbbbbbbbbcccccddd|d|d| Indica um i que bombeie para fora: i = 0 aaaabbbbbbbbbbcccccdddd Perde. p 0} não é linear. em qualquer decomposição com |uvyz| 5 não pertence a L Escolhe outro m: 2 LEI/DEIFCTUC/2009/@ADC Documento de trabalho 287 .1 Jogador 1 Define a linguagem: anb2nc pd p. Exemplo 8. Sabendo nós que a zona de bombagem tem que estar próxima do início (à distância máxima de m caracteres) e próxima do fim (à distância máxima de m caracteres do fim). tem que se escolher uma cadeia segundo alguma estratégia. 2m b’s.2.2. 8 Propriedades das Linguagens Livres de Contexto As linguagens lineares são um subconjunto próprio da família das linguagens livres de contexto.2. 3. Será livre de contexto não-linear ? 8. 8 Propriedades das Linguagens Livres de Contexto Indica uma cadeia: aabbbbccdd (estratégia. m+1 a’s.1.3. u=z) Indica um i que bombeie para fora: i =2 Perde. LEI/DEIFCTUC/2009/@ADC Documento de trabalho 288 .2. Relação entre os três Lemas de Bombagem Pela hierarquia das linguagens sabemos que  a família das linguagens lineares é um subconjunto próprio das linguagens livres de contexto  a família das linguagens regulares é um subconjunto próprio das lineares e portanto também das livres de contexto Livres de Contexto LemaLC Lineares LemaLin Regulares LemaReg Figura 8. em qualquer decomposição com aaabbbbccddd |uvyz| 2 não pertence a L A linguagem não é linear. Relação entre os três lemas e as três famílias de linguagens em causa. m c’s) Decomposição uvxyz = ||a|abbbbccd|d|| .Teoria da Computação Cap. m b’s. No entanto o valor de m não é necessariamente o mesmo para os dois lemas na mesma linguagem. Propriedades de fecho e algoritmos de decisão para linguagens livres de contexto. Mas para provar que uma linguagem não pertence a uma das famílias.o Lema Regular é um caso particular do Lema Linear  se na decomposição uvxyz (Linear) uma entre v e y é vazia (uma só “bomba”) cai-se no caso Regular. temos o caso Regular. . Propriedades de fecho de linguagens livres de contexto As propriedades de fecho referem-se a operações de conjuntos feitas sobre as linguagens.  Se no Livre de Contexto v for vazia.o Lema Linear é um caso particular do Lema Livre de Contexto  se uma linguagem verifica o Lema Linear. quer dizer que . ela também verifica o Lema Livre de Contexto.uma linguagem regular deve satisfazer o Lema Linear ? Sim De facto: . pertence. .uma linguagem regular deve satisfazer o Lema Livre de Contexto ? Sim . aplica-se o lema dessa família (pela prova por contradição).Teoria da Computação Cap.o Lema Regular é um caso particular do Lema Livre de Contexto. a linguagem obtida é livre de contexto ou não ? LEI/DEIFCTUC/2009/@ADC Documento de trabalho 289 . ou se y for vazia temos de igual modo o caso Regular.3. qualquer que seja o caso. 8.uma linguagem linear deve satisfazer o Lema Livre de Contexto ? Sim .1. Por exemplo: se unirmos duas CFL. 8 Propriedades das Linguagens Livres de Contexto Assim sendo. O Lema nunca se aplica para provar que sim.3. 8. 1Considerem-se as gramáticas G1 e G2 seguintes.3. P3} LEI/DEIFCTUC/2009/@ADC Documento de trabalho 290 . Teremos assim a gramática G3 G3 =(V3. a prova é mais fácil se usarmos as suas gramáticas (relembre-se que no caso das linguagens regulares se construíam autómatos para a prova). T3.Teoria da Computação Cap.1. S2. S1. P1} S2  0S1 | 01L S1  aS1 | bA L 1M A bB M  00N B  aC P  11P | 1 C  bbC | c Se quisermos a linguagem L3=L1L2 poderemos usar as duas gramáticas para gerarem as cadeias da união. a que correspondem as linguagens L1 e L2: G2 =(V2.1.1. T1. usando ora uma ora outra. A família das linguagens livres de contexto é fechada em relação a a) união b) concatenação c) fecho-estrela e fecho-positivo d) homomorfismos e) reversão Demonstração No caso das CFL. 8 Propriedades das Linguagens Livres de Contexto Teorema 8. a) Prova em relação à união: Exemplo 8. Isto faz-se criando uma nova variável de inicialização (um novo axioma) que deriva ou a inicialização de G1 ou a inicialização de G2. S3. T2. P2} G1 =(V1.3. S4. 8 Propriedades das Linguagens Livres de Contexto S3  S1 | S2 S1  aS1 | bA S2  0S1 | 01L A bB B  aC C  bbC | c L 1M M  00N P  11P | 1 Esta forma de especificar a união é muito prática. se quisermos L1L2 cria-se de modo análogo uma gramática G4 do modo seguinte G4 =(V4. Este procedimento é possível para quaisquer gramáticas livres de contexto.Teoria da Computação Cap. b) Prova da concatenação Considerando ainda o mesmo exemplo. T4. Note-se que os alfabetos das linguagens L1 e L2 são bem diferentes mas isso não tira qualquer coerência à gramática G3 que nunca mistura letras com números numa cadeia. P4} S4  S1 S2 S1  aS1 | bAA S2  0S2 | 01L A  bBB B  aC C  bbC | c L  1MP M  00N P  11P | 1 Verifique o leitor que G4 nunca coloca letras depois de números. c) Prova do fecho estrela e do fecho-positivo LEI/DEIFCTUC/2009/@ADC Documento de trabalho 291 . S5. P5} S5  S1S5 | (ciclo em torno de S1) S1  aS1 | bAA A  bBB B  aC C  bbC | c Se eliminarmos  na produção S5 elimina-se o carácter vazio. S. também o é LR Seja G a gramática de L G = ( V. LEI/DEIFCTUC/2009/@ADC Documento de trabalho 292 .285 e) prova em relação à reversão Queremos provar que se L é uma CFL. P ). que possa ser feito um número qualquer de vezes. T. S. P R ) LR = L (GR) Assim sendo LR é livre de contexto (porquê?). teremos L1+. 8 Propriedades das Linguagens Livres de Contexto O fecho estrela L1* resulta da concatenação de sucessivas potências de L1. Ora tal pode fazerse criando uma gramática G5 que tenha um ciclo em torno de S1. ou seja. T. p. incluindo zero vezes: G5 =(V5. no caso de P virá PR A  abCBAab obteremos a gramática GR que gera LR GR = ( V.Teoria da Computação Cap. L = L (G) Com por exemplo a produção P A  baABCba Se construirmos uma gramática a partir de G revertendo todos os corpos das produções de G. T5. d) prova em relação aos homomorfismos: ver Hopcroft . i≥1} L2={0i1n2n.3. A prova em relação à complementação e diferença pode ver-se em Hopcroft 289. que são livres de contexto. Basta este exemplo para provar que a família das CFLs não é fechada em relação à intersecção.2. A família das linguagens livres de contexto não é fechada em relação à f) intersecção g) complementação h) diferença Vejamos um exemplo de intersecção que demonstra a propriedade. 8 Propriedades das Linguagens Livres de Contexto Teorema 8. i≥1} L1∩L2={0n1n2n.2 (Hopcroft. n≥1} Produções: Produções: Produções S→AB S→AB n n A→0A1|01 (gera 0 1 ) A→0|0 (gera 0i) B→2B|2 (gera 2i) B→1B2|12 (gera 1n2n) ??? A intersecção das duas linguagens dá de facto L. Por outro lado em L2 o número de 1’s iguala o número de 0’s. portanto as cadeias de L.1. 285) Pela aplicação do lema da bombagem verifica-se que L={0n1n2n. LEI/DEIFCTUC/2009/@ADC Documento de trabalho 293 . Ora L1 e L2 são livres de contexto e L não o é.Teoria da Computação Cap. Exemplo 8.1. Por um lado em L1 o número de 0’s iguala o número de 1’s.3. n≥1. em que o número de 0’s iguale o número de 1’s e o número de 2’s.3.1. Considerem-se agora as duas linguagens L1 e L2 da tabela onde também estão as produções de uma sua gramática. Só pertencem à intersecção das duas as cadeias em que se verifiquem simultaneamente as duas igualdades.2 L1={0n1n2i. n≥1. ou seja. Tabela Exemplo 8. n≥1} é uma linguagem não livre de contexto (é dependente de contexto). Em consequência.. a gramática é vazia. as produções. Caso contrário não o é. L-R uma CFL. A família das linguagens livres de contexto é fechada em relação à intersecção regular.2. S. LEI/DEIFCTUC/2009/@ADC Documento de trabalho 294 .2.1 Existe um algoritmo para decidir se uma dada cadeia pertence ou não a L(G): .3. também o é R e temos uma intersecção regular. Se L é uma gramática livre de contexto e R é uma linguagem regular.2. 8. Teorema 8. . Algumas propriedades decidíveis de linguagens livres de contexto Teorema 8. encontrando a cadeia se ela pertence á linguagem ou não a encontrando se ela não pertence à linguagem.1º remover as produções unitárias e as produções. 8 Propriedades das Linguagens Livres de Contexto Teorema 8.2º Se o símbolo inicial S da gramática G for inútil. T.Teoria da Computação Cap. os símbolos e produções inúteis.1.3.2. (propriedade de fecho em relação à intersecção regular).R=L ∩R Ora se R é regular. De facto L .1º remover as produções unitárias. então LR é livre de contexto.3. Ver a demonstração em Hopcroft 286. P) existe um algoritmo para decidir de L(G) é ou não vazia: . .3.3.2º fazer o parsing exaustivo O parsing termina após um número finito de etapas. Dada uma linguagem livre de contexto G= (V. Grafo de dependências S  bAAa A  bBB S A B C B  aC C  bbCA | cA|c Figura 8. a linguagem é infinita.1 . ABC…. Por exemplo o grafo de dependência da gramática seguinte.2.Teoria da Computação Cap. Caso contrário é finita. Se ele contiver algum ciclo fechado. … ABC. Fica o leitor desafiado a enumerar as suas cadeias. Já no exemplo seguinte teremos uma linguagem finita. Por exemplo se numa derivação a variável A se repetir. Uma linguagem infinita.2. ABC.2. Logo a linguagem é infinita. Verifica-se se nas derivações da gramática há alguma variável que se repita. 8 Propriedades das Linguagens Livres de Contexto Teorema 8. C. P) existe um algoritmo para decidir de L(G) é ou não infinita. na figura 8.. sem produções unitárias e sem símbolos inúteis.3.3. * *  xAy  A uzv é possível gerar um número infinito de cadeias: * S *  uAv  * * * uxAyv  uxxAyv  *  uxn A yn v  . T.2. C. S. a linguagem é finita. O grafo de dependência das variáveis também permite decidir. uxn zyn v Se nenhuma variável se repetir. identificados na figura: C. Dada uma gramática livre de contexto G= (V. apresenta dois ciclos. sendo G sem produções-.3. LEI/DEIFCTUC/2009/@ADC Documento de trabalho 295 ..3. Quer dizer sim que não há nenhum algoritmo geral que dê resposta (em tempo útil) para toda e qualquer linguagem livre de contexto. Uma linguagem finita 8. com por exemplo: a) é uma dada gramática CFG ambígua ? b) é uma dada linguagem CFL inerentemente ambígua ? c) é vazia a intersecção de duas linguagens CFL’s ? d) são duas linguagens CFL’s iguais ? e) é uma linguagem CFL igual a  * ? Isto não quer dizer que para uma linguagem concreta não se possa obter resposta a qualquer daquelas questões. Algumas propriedades indecidíveis de CFL’s (Hopcroft. LEI/DEIFCTUC/2009/@ADC Documento de trabalho 296 .3. Não existe nenhum algoritmo (não é possível resolver com um computador) algumas questões que são aparentemente simples.Teoria da Computação Cap. 8 Propriedades das Linguagens Livres de Contexto Grafo de dependências S  bAAa S A B C A  bBB B  aC Cc Figura 8.2.2.3.3. 302). Rajeev Motwani. 1997. Introduction to the Theory of Computation... Gregory Taylor. Introduction to Automata Theory. 3rd Ed. Oxford University Press. Addison Wesley. 2001. 2nd Ed. Jeffrey Ullman. LEI/DEIFCTUC/2009/@ADC Documento de trabalho 297 . 2001. Michael Sipser. 1998. 1998.. Elements for the Theory of Computation. Models of Computation and Formal Languages. Languages and Computation. Harry Lewis and Christos Papadimitriou. 2nd Ed.Teoria da Computação Cap. 8 Propriedades das Linguagens Livres de Contexto Bibliografia An Introduction to Formal Languages and Automata. Jones and Bartelett Computer Science. Peter Linz. Prentice Hall. R. PWS Publishing Co. John Hopcroft. Diagrama de estados ou de transição da MT 309 9.Teoria da Computação Cap.4.3. A tese de Turing 325 Bibliografia 328 LEI/DEIFCTUC/2009/@ADC Documento de trabalho 299 .1. Combinações de máquinas de Turing para tarefas complicadas 324 9. MT como aceitador de linguagens 311 9.5. Introdução 301 9.7. 9 Máquinas de Turing CAPÍTULO 9 MÁQUINAS DE TURING 9.6. A Máquina de Turing padrão 302 9. MT como transdutores 319 9.2. Teoria da Computação LEI/DEIFCTUC/2009/@ADC Cap. 9 Máquinas de Turing Documento de trabalho 300 . foram contemporâneos de Alain Turing. Existe em Portugal um blog como seu nome. Alain Turing (1912-1954) foi um brilhante matemático.1. Até hoje não foi ainda Um modelo abstracto de computação inventado um computador capaz de resolver um problema que a MT não possa resolver. definiu uma máquina abstracta capaz de executar essas operações segundo regras bem definidas. os anos 30 e 40 do século passado. É geralmente considerado como o fundador das ciências da computação. que merece uma visita. numa época efervescente de desenvolvimento da lógica e da matemática que haveria de resultar no computador digital. Máquina de Turing Figura 9. E as MT? Com que linguagens se relacionam? Já encontrámos linguagens que não são livres de contexto. Church nos EUA. A MT foi assim concebida para ser um modelo de computação. Por isso não é possível construir um autómato de pilha que as aceite.000 resultados. os autómatos de pilha para as linguagens livres de contexto. Inglaterra. Bertrand Russel na Europa. Introdução Uma pesquisa no Google em 6 de Dezembro de 2007 com “turing machine” deu 1. Os autómatos finitos são para as linguagens regulares. Em 1940 Alan Turing procura formalizar a noção de algoritmo. em Cambridge. Importância da Máquina de Turing.1. http://turing-machine. identificando as operações fundamentais e primitivas que possam servir de base ao cálculo matemático.1.pt. Será que uma MT é suficientemente poderosa para aceitar linguagens dependentes do contexto? Todas elas? Qual é o autómato mais poderoso? Quais os limites da computação? São questões às quais as MT respondem. As Máquinas de Turing (MT) estiveram no centro do desenvolvimento dos computadores e da computação durante os últimos 70 anos. Outros matemáticos famosos. Este número mostra a importância do tema.820. formalizando um conjunto de operações básicas às quais se pode reduzir qualquer computação. Este facto mantém ainda válida a tese de Church-Turing LEI/DEIFCTUC/2009/@ADC Documento de trabalho Problemas resolúveis e irresolúveis 301 . como Gödel.Teoria da Computação Cap.weblog. Depois. como por exemplo anbncn. 9 Máquinas de Turing 9.com. F) em que Q é o conjunto de estados internos da unidade de controlo  é o alfabeto de entrada LEI/DEIFCTUC/2009/@ADC Documento de trabalho 302 . .1. Esse dispositivo é uma fita unidimensional que contém um número ilimitado de células cada uma das quais pode conter um único símbolo.Teoria da Computação Cap. podendo escrever ou ler um único símbolo em cada movida. A máquina de Turing padrão A máquina de Turing é um autómato. . q0. UNIDADE DE CONTROLO R/W   FITA Figura 9. Associada à fita está uma cabeça de leitura-escrita que se pode mover sobre a fita para a esquerda ou para a direita.2. com uma unidade de controlo e com um dispositivo especial que funciona simultaneamente como entrada (onde lê). Uma máquina de Turing M é definida pelo septeto M = (Q.2. Esta informação pode ser lida e alterada em qualquer ordem e daí o potencial da MT. Essa é a sua característica distintiva em relação aos autómatos finitos (que não têm dispositivo de armazenamento) e aos autómatos de pilha (que armazenam numa pilha ). e saída (onde escreve).1 Componentes da Máquina de Turing Definição 9. 9 Máquinas de Turing 9. . A fita da MT prolonga-se indefinidamente em ambos os sentidos e por isso pode conter uma quantidade infinita de informação. .2. armazenamento. 1 Sejam  = { a. não confundir com ) que não existe no alfabeto de entrada. 9 Máquinas de Turing  é o conjunto finito alfabeto da fita  é a função de transição q0 é o estado inicial   é o carácter branco. R } ) e a transição  ( q0. R} em que R significa movida para a direita e L movida para a esquerda. LEI/DEIFCTUC/2009/@ADC Documento de trabalho 303 .Teoria da Computação Cap. b. a ) = ( q1. } : ( Q   )  ( Q   { L. símbolo especial de  F  Q é o conjunto de estados finais (aceitadores) O alfabeto de entrada é igual ao alfabeto da fita. Portanto =-{ } A função de transição é em geral uma função parcial em Q  : Q  Q {L. b } = { a. um carácter novo.2. próximo estado da unidade de controlo estado actual unidade de controlo escrever na fita um novo símbolo em substituição do presente  carácter de fita a ser lido no momento R/ fazer uma movida para a direita ou para a esquerda Figura 9. R ) Esta transição é ilustrada na figura seguinte. Exemplo 9. b.2. com excepção do símbolo (branco. Os dois argumentos de entrada da função de transição e os três de saída são os seguintes: q.2 Função de transição de uma Máquina de Turing A movida da cabeça faz-se depois da escrita do novo símbolo na fita.2. 2.3. De facto: .2. Seja a máquina de Turing definida por Q = {q0.Teoria da Computação Cap. O autómato é inicializado (no estado inicial q0 ) com alguma coisa já escrita na fita. definidas pela função . q1 }  = {a. b. É uma função parcial.tem uma unidade de processamento com memória finita (número finito de estados).1.2.tem uma segunda unidade de armazenamento de capacidade infinita. Uma máquina se Turing pode ser encarada como um computador muito simples. Como  é uma função parcial. O autómato fica então no estado parado (halt). . uma computação. ficando a apontar para b. -apaga-o e escreve b no seu lugar -move a cabeça de leitura uma célula para a direita. pode chegar a uma configuração para a qual não está definita nenhuma transição. Movida da MT do exemplo 9. } F = {q1} LEI/DEIFCTUC/2009/@ADC Documento de trabalho 304 .2. Exemplo 9. 9 Máquinas de Turing abc bbc q1 q0 Figura 9. . Nunca se definem transições a partir dos estados finais e por isso uma máquina de Turing pára sempre que atinge um estado final.a função de transição é o “programa” do computador. Executa depois uma sequência de operações. Lendo a. b}  = {a. a. R) q3 a b b b a b a q0 b b b a a b b a q0  (q0. R) b b b a a a b q0 q0  (q0. a. a. a. R)  (q0. ) = (q0. b. . R)  (q0. a) = (q0.4. a) = (q0. R) b b b b b q0 b b a b a b q0  (q0.2. 9 Máquinas de Turing e  (q0. b) = (q0. R) a b a b q0 b b a a a b a a a a q0  (q0. R) LEI/DEIFCTUC/2009/@ADC Documento de trabalho 305 .2.2 No fim obtém-se o seguinte conteúdo da fita b b a a a b Se para a mesma máquina a função de transição for  (q0. b) = (q0. ) = (q0.Teoria da Computação Cap. b) = (q0. a) = (q0. b. R) Figura 9. . Movidas do exemplo 9. b) = (q0. b) = (q1. 3. ) = (q0. 2. L) a a b b q0 q1 b b b b q0 q1 a  (q0.2. A máquina de Turing padrão tem as seguintes características: 1. b) = (q1. b. 9 Máquinas de Turing  (q0. a.É determinística na medida em que  define no máximo uma movida para cada configuração. não havendo escolhas possíveis. b. ) = (q0. b. b) = (q1. R) a a b q0 q0 q0  (q0. b) = (q0. permitindo um número arbitrário de movidas à esquerda e à direita.Teoria da Computação Cap. L)  (q1. segundo caso.2.Uma fita ilimitada em ambas as direcções.5 Movidas para o exemplo 9. R)  (q1. b. b. R) b b a a a  (q1. a) = (q0.Não existe qualquer ficheiro de entrada especial. Pressupõe-se que no instante inicial a fita tem algum conteúdo especificado aí introduzido pelo programador. R)  (q0. . a) = (q0. R) a a a b q0 b b a q1 Figura 9. L)  (q1. .2. b. Parte deste LEI/DEIFCTUC/2009/@ADC Documento de trabalho 306 . L) obtém-se um funcionamento em ciclo infinito. como se pode ver para a cadeia aabbba:  (q0. deve ser especificada na descrição instantânea.2. Para representar as movidas de uma MT utiliza-se a notação de configuração em configuração LEI/DEIFCTUC/2009/@ADC Documento de trabalho 307 .e. Utiliza-se a notação seguinte para a descrever uma configuração x1qx2 ou a1a2. estendendo algumas características (mas não aumentando o seu potencial limite de computação). x1 a1 a2  x2   ak .ak-1qakak+1. Como veremos posteriormente. 9 Máquinas de Turing pode ser considerado a entrada.. Sempre que a máquina pare (halt). i.. A configuração da máquina de Turing é definida pela sua descrição instantânea composta por três partes: - estado actual da unidade de controlo - o conteúdo da fita - a posição da cabeça de leitura/escrita.. algum do conteúdo da fita pode ser considerado como saída. Assume-se que a restante parte contém apenas símbolos brancos.    an q Figura 9.an correspondente à figura seguinte..Teoria da Computação Cap. A cabeça aponta para a célula que contém o símbolo que segue q. existem outras versões de máquinas de Turing mas que se baseiam neste modelo base.. que são considerados irrelevantes e por isso não é necessário mostrá-los. ak.6 Configuração de uma MT A descrição instantânea só mostra uma parte da fita. No entanto se a posição dos brancos for relevante. . e. Se houver necessidade de  distinguir entre diversas MT’s.2 Movida Seja M = ( Q.2. . c) = (q2.. R) abq1cd | abeq2d Figura 9. É possível uma movida a1a2.ak-1q1akak+1.. R) em termos de configurações escreve-se...2. 9 Máquinas de Turing configuração (k) | configuração (k+1) Por exemplo para a transição  (q1. é uma descrição instantânea de M. c) = (q2..an se e só se existir a transição LEI/DEIFCTUC/2009/@ADC Documento de trabalho 308 ... usa-se  M.ak-1q1akak+1. abq1cd | abeq2d configuração (k) | configuração (k+1) a b c d a b e q1 d q2  (q1.an com ai   e q1  Q.. ... .an | a1a2... Definição 9.7. Uma movida entre duas configurações instantâneas  O símbolo  indica um número arbitrário de movidas.ak-1bq2 ak+1.. q0. e.. . Então qualquer cadeia a1a2... F) uma MT. admitindo que na fita temos por exemplo abcd e que a cabeça aponta para c.Teoria da Computação Cap.. b) = (q1.  (q0. ) = (R. Diagrama de estados ou de transição da MT A notação da função de transição da MT é diferente no JFLAP e no DEM: JFLAP e Linz : ( Q   )  ( Q   { L. que faz o seguinte: . de ciclo infinito. ak) = (q2. 9 Máquinas de Turing  (q1.escreve os caracteres ab e LEI/DEIFCTUC/2009/@ADC Documento de trabalho 309 .inicializada lendo uma casa em branco. tal como nos outros autómatos estudados.an | a1a2. nunca parando. b.q2ak-1bak+1.1. denota-se por  x1qx2   Esta situação. R) É possível uma movida a1a2. Exemplo 9. ak) = (q2.. Chama-se computação à sequência das configurações que levam a MT do estado inicial ao estado de paragem (halt)..3. R } ) i.e. no DEM.....3.  (q0. b. q) São necessárias.an se e só se existir a transição  (q1. 9. mais instruções para a mesma funcionalidade : primeiro escreve. Consideremos a MT. b... e depois desloca-se. a) seja indefinido. . é muito importante na aplicação da teoria das MT. Os diagramas de estados são uma forma alternativa à escrita da função de transição. para os quais  (qj. R) DEM e Taylor  : ( Q   )  (  {L.Teoria da Computação Cap.ak-1q1akak+1. Usaremos preferencialmente a do JFAP. R })  Q i.. A situação em que a MT entra num ciclo infinito.. com uma fita completamente em branco. L) Diz-se que M parou partindo de alguma configuração inicial x1qix2 se  x1qix2  y1qjay2 para algum qj e algum a.. em que a máquina nunca mais pára.. nem de lá podendo sair.e. 1 No DEM teremos um grafo diferente: DEM q0 :a q0 q1 a a:R q1 q2 a :b q2 q3 a b b:L q3 qf a Figura 9. 9 Máquinas de Turing . q0 . b.3.Teoria da Computação Cap. a.1a Movidas e grafo no JFLAP da MT do Exemplo 9. R q1 q0 q1 a .3. b.1 b qf LEI/DEIFCTUC/2009/@ADC Documento de trabalho 310 . L q1 qf qf Figura 9.3.pára lendo o carácter a.1b. Movidas e grafo no DEM do exemplo 9.3. R . L qf q1 a q0 b . a. passa a q0 desloca-se para a esquerda. 9. MT do exemplo 9. MT do exemplo 9. R Figura 9. b. escreve a. escreve b . a. 9 Máquinas de Turing Exemplo 9.3.2.4. q0 :a q1 a:R q2 :b q3 b:R Figura 9. ficando assim a apontar para branco.2 no DEM Estando no estado inicial q0 lendo branco. Para uma MT com a fita inicial vazia que faz a MT da Figura seguinte ? q0 JFLAP . não estando nada previsto para este caso. no JFLAP. Estando em q2 apontando para branco. passa ao estado q1 e vai para a direita.3 2a. MT como aceitador de linguagens. Agora está em q0 lendo a na fita.Teoria da Computação Cap. Tal como nos autómatos anteriores.2.3.2b.3. faz halt e aí fica para sempre. também as MT podem funcionar como aceitadores de linguagens. R q1 . O processo de aceitação de uma linguagem pela MT é o seguinte: LEI/DEIFCTUC/2009/@ADC Documento de trabalho 311 .3. - antes de w estão brancos e depois de w brancos estão. A definição de Taylor (tem que parar apontando para um 1.1. Então a linguagem aceite por M é  L(M) = { w   + : q0 w  x1 qf x2 para algum qf  F e x1. Linguagem aceite pela MT.4. . - se a MT não parar (entrando num círculo infinito). . composta por todas as cadeias com um ou mais zeros (sem 1’s). Note-se que há estados que têm características especiais. - dá-se uma sequência de movidas. 76). q0. F) uma MT. Exemplo 9. x2  * } Se a cadeia tivesse brancos. Definição 9. w não é aceite. aceite. LEI/DEIFCTUC/2009/@ADC Documento de trabalho 312 . MT aceita uma linguagem se aceita todas as palavras de L e só essas (all and only the words in L). w não é aceite. - a MT inicializa-se no estado q0 com a cabeça de leitura-escrita posicionada no carácter mais à esquerda de w. .4.1 Seja o alfabeto  = {0. com o resto da fita em branco. Nota: a definição de Linz e de Hopcroft é equívoca quanto à necessidade de a MT ler toda a cadeia de entrada antes de fazer halt. a MT não saberia quando ela terminaria e teria que continuar a percorrer a fita até ao infinito. w é aceite. 1. . eventualmente. e 1 não pertence ao alfabeto de entrada) implica que toda a cadeia tenha que ser lida para ser. 1} e nele a linguagem L= L(00*). p. - se a MT parar (halt) num estado não final.3. Segundo Taylor (def. escrita na fita.Teoria da Computação - Cap. Seja M = ( Q. são os estados finais aceitadores. A cadeia w não contém brancos. 9 Máquinas de Turing dada uma cadeia w de caracteres do alfabeto de entrada (note-se que este não inclui . - se a MT entrar num estado final e parar (halt). o carácter vazio). A notação de Taylor para a função de transição não é igual à de Linz: Linz: : ( Q   )  ( Q   { L. No entanto o exemplo tem objectivos didácticos. R } ) i. caro leitor ?) e por isso não seria necessária uma MT para a aceitar. temos que ter em atenção a notação a usar . 2º Depois de ler todos os zeros há-de chegar ao primeiro branco à direita da cadeia. qf :  (q0.Teoria da Computação Cap. 0) = (q0. ela ficou a apontar para o segundo zero. ) = (R. até acabarem os zeros.e. deixa estar e desloca-se para a direita  (q0. b) = (q1. Solução: A primeira operação a fazer no projecto da MT (de qualquer MT) é definir um algoritmo. Nós queremos que a máquina “varra” a cadeia. 0. Admitamos também que A MT se inicializa com a cabeça de leitura apontando para o primeiro carácter da cadeia. deve passar a um estado aceitador. ) = (qf. R })  Q i. Admitamos que uma cadeia de zeros está escrita na fita. com brancos e só brancos à esquerda e à direita. Para desenharmos um diagrama de estados para esta função de transição. Trata-se de uma linguagem regular (porquê. ou seja. uma estratégia de operações elementares que levem ao fim pretendido. já leu a cadeia toda.e. no JFLAP ou no DEM. Então esta transição dá-se novamente. . R). e a aceite se só tiver zeros e a rejeite de tiver algures algum 1. Taylor:  : ( Q   )  (  {L. Se existisse um 1 algures no meio dos zeros a MT pararia (não está definida uma transição para essa eventualidade). Aí pode seguir para a direita. q) LEI/DEIFCTUC/2009/@ADC Documento de trabalho  (q0. R) Havendo vários zeros. R) 313 . indo por aí além. deixando o branco tal como está. da esquerda para a direita. 9 Máquinas de Turing Construir uma MT que aceite esta linguagem. Então pode ser assim: 1º Lê o primeiro zero. b. porque ela se mantém no estado q0 . Como correu tudo bem até aqui.  (q0. Estas hipóteses são as normalmente aceites. Voltaremos a este assunto mais tarde. Grafo JFLAP da MT do exemplo 9.e.1. São máquinas mais poderosas do que os autómatos estudados anteriormente. ba. 9 Máquinas de Turing O que obriga à criação de um estado adicional no DEM. 0) = (q1. Não pode ser q0 e por isso cria-se um outro estado qf para estado final. Chega-se a ele apenas quando se leu a cadeia toda sem encontrar qualquer 1.2. i. indicando que w não é aceite. ) q0 0:0 q1 1 : qf Figura 9. bbaabababbaaa.1. 0) = (q1. se a cabeça apontar para um branco..4. abaaabbabbbb. MT aceitadora de Linguagem na=nb Seja o alfabeto ={a.1 Note-se que  é uma função parcial. LEI/DEIFCTUC/2009/@ADC Documento de trabalho 314 . Por isso o diagrama de estados seguindo Linz e o JFLAP será 0:0:R : :R q0 qf Figura 9.4. 0) 0:R  (q1. 1).Teoria da Computação Cap. R)  (q1. por exemplo ab. Não é definida por exemplo  (q0. Seguindo Taylor e o DEM teremos que criar mais estados:  (q0. Se aparece um 1.4. a MT pára (halt) para sempre.4.2.b} e a linguagem composta pelas cadeias com um número de a’s igual ao número de b’s.. Exemplo 9. etc. em qualquer ordem. ) = (qf. a menos que q0 fosse um estado final.4. As MT podem reconhecer algumas linguagens que não são livres de contexto. no estado q0. Mas a definição de estado final deve ser feita previamente à resolução do problema: um estado é final se antes dele só apareceram 0’s e se já se chegou ao fim da cadeia. Grafo DEM da MT do exemplo 9. b}. R). verifica-se que em q0 com b passa a q1 (e em q0 com a pára). Chegando ao fim da cadeia (encontra um branco) volta ao princípio.3. b) = (q1. avançando até ao fim da cadeia.  (q1. R). qf}  (q0.Apaga-se o a e substitui-se por *. . b. b. Por exemplo para ababab teremos sucessivamente na fita aaababbb *aa*abbb bbabaa *b*baa aabbbabb *a*bbabb **a*a*bb ****a**b ***b*a ****babb ******** ****** ****b**b Programa da MT . deslocando-se para a esquerda até encontrar um branco.Carrega-se a cadeia na fita .  = {a. ) = (q0. F = {qf}. b (ou *). Suponhamos que é a. da direita para a esquerda) de tal modo que em cada varrimento substitui um a e um b por um* (uma forma de apagar).  (q0. 9 Máquinas de Turing Desenhar o grafo de uma MT capaz de reconhecer esta linguagem No projecto de uma MT a questão primeira e decisiva é a da concepção do algoritmo a programar: como é que uma MT pode contar a’s e b’s ? Uma solução possível: a máquina apaga um a e um b de cada vez. Segue para a direita.Desloca-se a cabeça até ao primeiro carácter. O grafo está na página seguinte.4. que será a ou b.  (q1. ) = (qf. }. Se sobrar um ou mais a’s (ou b’s) a cadeia não pertence à linguagem. Podemos imaginar varrimentos sucessivos da cadeia .Teoria da Computação Cap. Exemplo 9. .  (q1. é porque o número de a’s era igual ao número de b’s. R).b) = (q1. Que linguagem aceita ? Analisando as transições. Seja a MT com  = {a. a. a) = (q1. b. Em q1 lê a’s e b’s por qualquer ordem e em qualquer número. R). Aí encontra a. q1. Por LEI/DEIFCTUC/2009/@ADC Documento de trabalho 315 . R). Q = {q0. . se no fim não sobrar nenhum carácter. L a :a. Vai até ao fim e volta ao princípio.4 Construir no JFLAP uma MT que aceite a linguagem L = { an bm : n  1. na=nb no JFLAP e :R b:R *: q7 DEM no DEM.L q4 : b : b. R .b}. L : .2. 9 Máquinas de Turing isso a linguagem aceita pela MT á L= L[b(a+b)*]. R * : *. Exemplo 9.em cada viagem da esquerda para a direita apaga um a e um b.R q0 q3 : a : *. R * :*.Teoria da Computação Cap. LEI/DEIFCTUC/2009/@ADC Documento de trabalho 316 . marcando-os com *. MT :L *:R do exemplo 9. m  n } Um algoritmo possível: depois de escrita a cadeia na fita . L . a : a.L : *:R *: . R JFLAP a : *.R q1 * : *.4. L q2 b :b.4.L .L q5 a:R qf q1 *:R a:* b:* *:L *:R a:L :R q5 q0 b:* :L b:L q2 *:R q4 q6 Figura 9.3.4. L * : *. R b : *. todas as cadeias que se iniciam por b em {a. LEI/DEIFCTUC/2009/@ADC Documento de trabalho 317 . muda de estado e vai para a direita . Exemplo 9.encontra o primeiro b.5.não aceita de ou os a’s ou ao b’s acabarem num dos segmentos da cadeia. marca-o e muda de estado . sobrando nos outros.recomeça o ciclo até que ou acabem os a’s ou os b’s. Figura 9.4.4. A Figura 9. muda de estado e regressa ao início . Se sobrarem a’s ou b’s (ou exclusivo) a cadeia é aceite. terminando a computação no estado SIM. Desenhar uma MT que aceite a linguagem L = { an bn an bn : n  0 } . Caso contrário termina no estado NÃO. 9 Máquinas de Turing .procura o próximo b. marca-o.continua até que acabem os a’s e os b’s .4.5 apresenta um grafo possível. marca-o e muda de estado .4. marca-o. Esta MT decide se uma cadeia pertence à linguagem (termina em SIM) ou se não pertence à linguagem (termina em NÃO).continua até ao próximo a.aceita quando marcar todos e não sobrar nenhum .Teoria da Computação Cap.procura o próximo a . 6a.4. JFLAP do exemplo 9.6b.por cada a apaga dois b’s. 9 Máquinas de Turing Figura 9. Implementação JFLAP pelo aluno Cristóvão Pires em 2004-5 (exemplo 9.repete até que acabem todos os a’s e b’s -se sobrar algum a ou algum b não aceita Figura 9. Implementação FLAPP do exemplo 9.5 pelo aluno António Damasceno em 2004-5.4.6 pelo aluno António Damasceno em 2004-5. usando para isso dois estados (a forma de contar dois b’s) .6 O mesmo para o caso L = { an b2n : n  1} . LEI/DEIFCTUC/2009/@ADC Documento de trabalho 318 . Exemplo 9.4.4.Teoria da Computação Cap.5. Uma outra implementação possível Figura 9.4.4.6).4. se os c’s não chegarem não aceita.1º apaga n a’s à esquerda e n c’s à direita.7 Para L = { an bm an+m : n  0.7.7 pelo aluno António Damasceno no ano lectivo 2004-5.Teoria da Computação Cap. 9. Com estes conceitos pode-se encarar a MT M. 9. não aceita. Analogamente para apagar os b’s. Ora um computador é sobretudo um transdutor: transforma uma entrada numa saída. JFLAP do ex. m1 } temos o algoritmo . por isso cria-se um ciclo “apaga um a e vai apagar um c regressa”.4. se os c’s não chegarem ou se sobrarem. enquanto transdutor. A entrada para uma computação é composta por todos os símbolos não brancos escritos na fita no instante inicial.4. As MT podem funcionar também como transdutores. por exemplo fazendo um cálculo.2º apaga m b’s à esquerda e m c’s à direita. Para apagar os n a’s tem que percorrer n vezes um ciclo de apagar um.4. Figura 9. Para distinguir as diversas situações criam-se estados afectos a cada situação. Se os c’s acabarem antes dos a’s não aceita. . A saída da computação é o que resultar escrito na fita.5 TM como transdutores As MT são um modelo abstracto de computadores digitais em geral. 9 Máquinas de Turing Exemplo 9. como implementando uma função f definida por LEI/DEIFCTUC/2009/@ADC Documento de trabalho 319 . depois de todas as movidas da MT.  . só com 1’s. desde que se verifique que partindo de w no estado inicial após a e portanto com saída w computação de f chega a um estado final qf  q0w  M qf As especificações do estado final são feitas pelo programador. 233 Para adicionar números inteiros com uma MT. apontando para o primeiro carácter do resultado do cálculo. ficando brancos à esquerda e à direita: Figura 9. Admitamos que as separamos por um 0. Uma função f com o domínio D diz-se Turing – computável ou simplesmente computável se existir alguma máquina de Turing M = ( Q.1. são Turingcomputáveis. w  . Esta definição pressupõe que a MT pára. 9 Máquinas de Turing  = f (w).5.5. F) tal que qf  F q0w  M qf f (w). . para toda a w D. Esta afirmação não se pode provar.5. Função computável. q0. .1. Vejamos alguns exemplos. Todas as funções matemáticas usuais.1. Exemplo 9. Preparação da fita para a adição LEI/DEIFCTUC/2009/@ADC x=5 1 1 1 x=4 1 1 0 1 1 Figura 9. primeiro faz-se a sua representação unária. Preparação da adição Documento de trabalho 1 1 320 . Será que qualquer função é computável por uma MT ? Definição 9. .Teoria da Computação Cap. Depois temos que especificar como se escrevem as duas parcelas na fita da MT. mas acredita-se que assim seja porque até hoje ninguém foi capaz de propor uma função matemática que não fosse computável. Adição de inteiros (representação unária) (Linz.1. depois de calcular f(w). por mais complicadas que sejam.5. A MT inicia-se no primeiro 1 de uma cadeia de n 1’s e pára no primeiro 1 de uma cadeia ininterrupta de n 1’s . Escrevem-se os números na fita separados por um 0. 9.apagar um 1 da primeira parte e outro 1 da segunda.5.tm implementada em DEM.5. fita 8. até os 1s acabarem numa das partes LEI/DEIFCTUC/2009/@ADC Documento de trabalho 321 .5. escrevento a cópia à direita. deixando um branco entre os dois. 11110111111 Um algoritmo possível . A máquina copiadora (Linz. 1. Copying Machine.Teoria da Computação Cap. em representação unária.3 1 1 1 qf Este é também o Ex. 234).4.3. Comparação de dois números positivos. por exemplo. temos agora que escrever o programa da MT. seguido por uma cadeia ininterrupta de n 1’s. 9 Máquinas de Turing e que no fim da computação o resultado deve ser apresentado em unário (como uma sequência de 1s) x+ y =9 1 1 1 1 1 1 1 1 1 0 Figura 9.5. Outros exemplos: Exemplo 9. comparar 4 e 6.2.2 de Taylor.5. Linz 235. Vamos projectar uma MT que copie um número escrito em binário na fita. com o indicado na fig. 1 q0 1 1 Figura 9.2.seguida por um branco. x e y. Resultado final da adição Definido o início e o fim.tt Exemplo 9.3. Exemplo 9. quando acabam os 1’s em ambos os lados. substitui-o por um a. lê um branco. LEI/DEIFCTUC/2009/@ADC Documento de trabalho 322 .Teoria da Computação Cap.4 a:R Que faz ? 1º Inicializando-se numa fita vazia... Fica o leitor desafiado a desenhar o respectivo grafo.5... usando o JFLAP. não o encontra. No caso de igualdade. passa pelo zero e continua até ao último 1.. E esta ? q0 :a q1 a:R q2 :b q3 Figura 9.5 b:R Escreve sucessivamente abababababab. Exemplo 9.4 q0 :a q1 Figura 9. 9 Máquinas de Turing Caso 4&6 11110111111 *1110*11111**110**1111***10***111****0****11 Agora quando procura mais 1 do lado esquerdo não encontra. desloca-se para a direita e repete estas operações indefinidamente. passa ao estado x=y. 2º Percorre a fita até ao infinito sem escrever nada. Caso 6&4 11111101111*111110*111**11110**11***11101*******110**** Agora ao apagar mais um 1 do lado esquerdo e procurar o outro 1 do lado direito.5. chega ao branco e passa ao estado x>y.5.5.5. o que provoca a transição para o estado x<y.. 7 Desenhe uma MT que calcula a função f(x)=2x.6 Note-se que esta linguagem é regular. 9 Máquinas de Turing Exemplo 9. Uma delas poderá ser 1º. Figura 9. Figura 9. que diga se sim ou não uma cadeia pertence à linguagem). Não existe uma única solução.7 LEI/DEIFCTUC/2009/@ADC Documento de trabalho 323 .5.substituir cada 1 por um x e de seguida adicionar um y no fim da cadeia.6. estando x em unário.b} composta por todas as cadeias que contenham a subcadeia baa (isto é. e por isso também se pode desenhar um DFA que faz o mesmo. Construa uma MT que decida a linguagem em ={a.5.5.5. Exemplo 9. Por exemplo para f(111)= 111111 a fita terá sucessivamente 111 x11yxx1yyxxxyyy 2º . Primeiro devemos conceber um algoritmo que resolva o problema.substituir cada x por 1 e cada y por 1 xxxyyyxxxyy1xxxy11 xxx111 xx1111 x11111111111 O grafo da MT será o da Figura.Teoria da Computação Cap. a.5. a um apagamento. Implementação da função do exemplo 9.a. que se podem implementar pelos três blocos da Figura 9.8. se x  y f (x. MT que conta os a’s em cadeias de {m. a.1. i. Figura 9. r.i. uma soma. y) x<y Documento de trabalho Apagadora 324 .6. LEI/DEIFCTUC/2009/@ADC f (x. a. Somadora x x.Teoria da Computação Cap. d.1 (Linz) Seja a função f definida por x + y .a} 9.6. Exemplo 9.1.6. se x< y Podemos decompô-la em três operações: uma comparação.6. y) = 0.6. 9 Máquinas de Turing Exemplo 9.r. Combinações de máquinas de Turing para tarefas complicadas Muitas funções complicadas podem-se decompor em sequências de funções simples computáveis (toda a análise numérica visa esse fim).8 Desenhar uma MT que conte o número de a’a em cadeias no alfabeto {m.d. y Comparadora Figura 9. g.1. Tal conceito também se pode aplicar ao nível da Turing-computabilidade. a}. Pode-se projectar uma máquina de Turing composta por combinações de máquinas de Turing elementares a fim de realizar operações mais complexas.r. r.g.5. e. 2.Ninguém conseguiu ainda encontrar um problema. Mesmo actualmente um algoritmo pode-se definir como uma MT. f.Qualquer computação que possa ser feita por qualquer computador digital existente também pode ser feita por uma máquina de Turing. com um domínio D e o contradomínio R. Nesses tempos o desenvolvimento de um algoritmo consistia fundamentalmente na escrita de um programa de uma MT que o resolvesse. Um algoritmo para uma função f : D R é uma máquina de Turing M que.Teoria da Computação Cap. 9. XX Turing conjecturou que qualquer computação que possa ser implementada por processos mecânicos (i. para o qual não possa ser escrito um programa para uma máquina de Turing. 3.. 9 Máquinas de Turing Agora cada bloco pode ser executado por uma MT. mas nenhum deles é mais poderoso do que a máquina de Turing. resolúvel por um qualquer algoritmo. - dada como entrada um qualquer d  D na sua fita - pára (halt) com uma resposta correcta para f (d)  R na sua fita. escreve-se um programa tal que iniciando-se a MT apontando para o primeiro símbolo de d. para um elemento d do domínio escrito na fita de uma MT. A tese de Turing é (ainda ) uma lei básica das ciências da computação. termina uma computação depois de escrever na fita o valor de f(d). A tese de Turing Nos anos 30 do séc.Foram propostos modelos alternativos para a computação mecânica.7. Se considerarmos uma função qualquer. por uma máquina) pode também ser implementada por uma máquina de Turing. Pode ser interpretado ao contrário: uma computação é mecânica se e só se puder ser executada por uma máquina de Turing. Alguns argumentos a favor da tese de Turing: 1. Requer-se que LEI/DEIFCTUC/2009/@ADC Documento de trabalho 325 . Teremos assim a seguinte definição de algoritmo. A função total resulta da combinação das três MTs. Definição 9.7.1. Algoritmo. 1 Markov algorithm simulator 4 tapes Factoria f(n)= n! Fspacon f(n) = n**2 is fully space-constructible God Exodus 3.m)=nm the multiplication machine LEI/DEIFCTUC/2009/@ADC Documento de trabalho 326 .language Compiler/Interpreter Prototype Cnfsat CNF.1) (5 tapes) Convert Convert to unary Copying Copia cadeia de caracteres Cvp Circuit Value Problem (example 8.3 w=wR.Sat (Example 8. balpatent balanced parenthesis beaver busy beaver function w/ 5 arguments c-interp C.1) div2mult f(n)=n div 2 (multitape machine) div2single f(n)=n div 2 (single tape) Ex12-3-1 Language Emulator (Example 12.2. No DEM existe uma livraria de MTs que executam diversos algoritmos. qf  F para todo o d  D. Alguns deles recorrem a uma MT especial.3. 9 Máquinas de Turing  q0d  M qf f (d).Teoria da Computação Cap. odd palindromes Ex2-6-2 nondeterm accepter a**(2n)+a**(3n).1 Lista de exemplos do DEM. n0 Ex2-6-3 nondeterm accepter a**(n**2) n0 Ex2-6-5 nondeterm f(n) = cubicroot(n).1) Ex2-2-3 Example 2.5. apenas tornam mais fácil a programação de algoritmos. que no entanto não alteram as suas capacidades computacionais. A tabela seguinte enumera-os. se cubo perfeito.7. No Capítulo 10 abordaremos essas arquitecturas especiais da MT. Os exemplos estão em Taylor. com várias fitas (tapes).5. indefinida caso contrário Ex4. Tabela 9.13-14 I am who I am … Multiply f(n.8. em unário . 3º .Copia depois m um número n de vezes.Escreve-se na fita n0n0n.7.Copia n à direita um número n de vezes.1 Desenvolver um algoritmo para calcular n3 Uma solução possível: 1º . Para isso na MT . impares.10. vindo n-2 . -… .2.Teoria da Computação Cap. Exemplo 9. 2º . obtendo-se mxn=nxnxn.7.decrementa-se n-1.multiplica-se (n-2)p obtendo-se um novo valor de p. obtendo-se assim nxn=m.multiplica-se (n-1)n = p . e nesta altura o valor de p é o factorial.2 Palindro Palindromes Recdesct Recursive-descent Parser Recognzr Reconhecimento da cadeias (pares.copia-se n à direita .escreve-se n na fita.decrementa-se n. palindromes) Reverse reverse word Reverse2 reverse word multitape Samenumb same numbare of a’s as b’s single tape Samenumb4t same number of a’s and b’s 4 tapes Selctstr select a string Sqrt square root (perfect square) Exemplo 9. caráter do meio. Um programa para isso terá uma extensão considerável … LEI/DEIFCTUC/2009/@ADC Documento de trabalho 327 . 9 Máquinas de Turing N^n nn. Desenvolver as linhas gerais de um algoritmo para calcular n! Com sabemos n!=nx(n-1)x….x2x1. (subração de 1) ..até se atingir n-i=1. the n to n power Nntravsa Nearest-Neighboor Traveling Salesman Machnine/Exxample 8. 2001. 1998. 2nd Ed. 3rd Ed.uk/turing/Turing. R. John Hopcroft. Addison Wesley.uk/~history/Mathematicians/Turing. Introduction to Automata Theory.Teoria da Computação Cap. http://www-groups. 2nd Ed. Gregory Taylor. Peter Linz. 9 Máquinas de Turing Bibliografia An Introduction to Formal Languages and Automata. Oxford University Press.. Jones and Bartelett Computer Science. 1998.ac. LEI/DEIFCTUC/2009/@ADC Documento de trabalho 328 .html (Alan Turing Home Page). Introduction th the Theory of Computation. 1997.org. Rajeev Motwani.. Prentice Hall.htm. http://www. Michael Sipser.dcs. Languages and Computation. Elements for the Theory of Computation. PWS Publishing Co.st-and. 2001. Models of Computation and Formal Languages. Harry Lewis and Christos Papadimitriou.. Jeffrey Ullman.turing.
Copyright © 2024 DOKUMEN.SITE Inc.