Capítulo 1 Autômatos com Pilha (APs)

Tamanho: px
Começar a partir da página:

Download "Capítulo 1 Autômatos com Pilha (APs)"

Transcrição

1 Fascículo 3 Depois de trabalharmos com modelos matemáticos que funcionam gerando cadeias no fascículo 2, voltaremos a trabalhar com modelos que funcionam aceitando e rejeitando cadeias neste fascículo. Primeiro veremos o Autômato com Pilha, para linguagens livres de contexto. Depois, veremos um modelo especial conhecido como Máquina de Turing, que é o modelo de computação mais poderoso já pensado. Devido à importância deste último modelo, dedicamos o capítulo final à análise dos seus limites quais linguagens a Máquina de Turing pode e quais ela não pode representar. Veremos que os limites teóricos da Máquina de Turing são considerados limites teóricos também para os nossos mais modernos computadores. 1

2 Capítulo 1 Autômatos com Pilha (APs) No fascículo 1, vimos três tipos de autômatos aos quais nos referimos pelo nome geral pelo nome de autômatos finitos: AFD, AFND e ε-afnd. Apesar de algumas diferenças de funcionamento, os três têm o mesmo poder de representação de linguagens, sendo as linguagens que eles representam chamadas de linguagens regulares. Neste capítulo, veremos um modelo de autômato mais poderoso do que os três modelos de autômatos finitos é o modelo Autômato de Pilha (AP). Este modelo é capaz de reconhecer a classe das linguagens livres de contexto, que inclui toda a classe das linguagens regulares e mais algumas outras. Você deve lembrar que nós já apresentamos a classe das linguagens livres de contexto no final do fascículo 2, quando definimos que esta é classe das linguagens que podem ser representadas por meio de gramáticas livres de contexto. Assim, o modelo autômato de pilha, que agora vamos apresentar, é um modelo que funciona de modo parecido com os autômatos finitos, mas que têm poder equivalente ao das gramáticas livres de contexto. Vamos começar o estudo deste novo modelo apresentando seus princípios básicos de funcionamento na seção a seguir. 1.1 Princípio de Funcionamento Os autômatos com pilha (APs) são como os autômatos finitos com transições vazias (ε-afnds), mas têm um componente extra chamado pilha. A pilha serve como uma memória adicional infinita (por isso, não podemos chamar um autômato de pilha de autômato finito ). O autômato pode escrever 2

3 símbolos nessa pilha para ler mais tarde e isso dá ao autômato um poder adicional em relação aos ε-afnds. Para explicar o nome pilha, pense no que é uma pilha de pratos (ou uma pilha de livros ). Esse é o nome que damos a um conjunto de pratos dispostos um sobre o outro. Geralmente, se queremos colocar mais um prato na pilha, colocamos ele no topo, em cima dos outros pratos. Também quando vamos remover um prato, geralmente, tiramos aquele que está no topo. Como resultado, o prato que colocamos por último acaba sendo o primeiro a ser retirado. De modo geral, em Computação, chamamos de pilha toda estrutura que segue essa regra de inserção e remoção. A figura abaixo ilustra isso. Os autômatos que vamos ver usam uma pilha para guardar símbolos especiais, que chamaremos símbolos da pilha. Os autômatos só podem inserir e remover esses símbolos de uma mesma extremidade da pilha (como se fosse o topo de uma pilha de pratos). Assim, o último símbolo que é escrito fica na primeira posição. Outro detalhe é que a pilha dos APs não inicia vazia ela começa automaticamente com um símbolo de início pré-definido. Lembre-se que, nos autômatos vistos antes, as mudanças de estado (transições) dependiam apenas do próximo símbolo da cadeia de entrada. Agora, nos APs, o primeiro símbolo da pilha também será levado em consideração. Assim, as mudanças de estados vão depender de duas condições: o próximo símbolo da entrada e o próximo símbolo da pilha. Um autômato de pilha só mudará de estado por uma dada transição se ambas as condições da transição forem satisfeitas. 3

4 Como nos autômatos finitos, o símbolo lido em uma transição de um AP é automaticamente removido. Isso vale tanto para o próximo símbolo da cadeia como para o símbolo do topo da pilha. Além disso, depois das remoções, o autômato também insere na pilha uma cadeia de símbolos. A representação gráfica de um AP é parecida com a dos outros autômatos vistos. O estado inicial e os estados de aceitação são representados da mesma maneira (reveja a apostila 1 caso não lembre). A grande diferença na representa gráfica são as setas de transição entre estados, que precisam conter toda a informação que apresentamos. Para isso, elas recebem rótulos no seguinte formato: s, X / Y 1...Y k, onde: s é o símbolo que será lido da cadeia (ou ε para não ler nada) X é o símbolo que será lido do topo da pilha (ou ε para não ler nada) Y 1...Y k é a cadeia de símbolos que será escrita na pilha (ou ε para não escrever nada), considerando que os símbolos serão empilhados na ordem inversa (de Y k para Y 1 ), deixando Y 1 no topo Um detalhe importante é que, semelhante aos ε-afnds, podemos usar o símbolo especial ε para indicar que um AP pode fazer a transição sem ler nem remover nenhum símbolo da entrada (se for usado no lugar do rótulo s) ou da pilha (se for usado no lugar do X). Também podemos usar o ε para representar que, após uma transição, nenhum símbolo será inserido na pilha (se o colocarmos no lugar do rótulo Y 1...Y k ). A figura a seguir ilustra um AP simples que recebe cadeias formadas com o alfabeto {a,b} e que possui $ como símbolo de início da pilha. 4

5 Veja que o autômato dado tem uma transição de q 0 para q 1 que só pode ser realizada se duas condições forem verdadeiras: o próximo símbolo da cadeia de entrada tem que ser a e o próximo símbolo da pilha tem que ser $. Quando ambas as condições forem verdadeiras no estado q 0, o autômato muda para q 1 e escreve os símbolos ABC na pilha na ordem inversa (deixando o símbolo A no topo). A outra transição (de q 1 para q 0 ) não exige e não lê nenhum símbolo da entrada, mas exige que o próximo símbolo da pilha seja A. Se for, o autômato muda do estado q 1 para o estado q 0 e escreve $ na pilha. Vamos apresentar a seguir como um AP processa (computa) uma cadeia de entrada para indicar se ela faz parte da linguagem ou não. 1.2 Computação e Aceitação no Autômato com Pilha Vamos começar analisando o comportamento do AP anterior quando ele recebe a cadeia de entrada aa. Em geral, chamaremos a esse processo de teste de uma cadeia de computação. Portanto, o que vamos ver agora é a computação da cadeia aa. Como dissemos acima, esse autômato tem $ como símbolo inicial da pilha. Observe também que seu estado inicial é q 0. Portanto, no início da computação, teríamos a seguinte configuração do autômato: Na figura acima, o autômato está em seu estado inicial q 0, a pilha contém apenas o símbolo $ e a entrada ainda contém toda a cadeia aa. Nessa configuração, temos a como próximo símbolo da entrada e $ como próximo símbolo da pilha, permitindo fazer a mudança de q 0 para q 1. O resultado é a seguinte configuração: 5

6 Para entender como chegamos aqui, lembre-se que o símbolo a (da cadeia de entrada) e o símbolo $ (da pilha) foram removidos após serem lidos. Além disso, a cadeia ABC foi inserida na pilha do C para o A. Partindo da configuração representada acima, veja que é possível voltar de q 1 para q 0 sem ler símbolo da entrada, mas lendo o símbolo A que do topo da pilha. O resultado está representado abaixo: Veja que a transição de q 1 para q 0 causou a escrita do símbolo $ na pilha. Assim, temos novamente um símbolo a para ser lido da entrada e um símbolo $ para ser lido da pilha e podemos fazer outra transição para q 1 : Neste ponto, a cadeia de entrada já foi completamente lida e o autômato chegou a um estado de aceitação. Como acontecia nos autômatos finitos, essas duas condições são necessárias para concluir que a cadeia aa foi aceita, (ou seja, faz parte da linguagem que o autômato representa)! O fato da pilha ainda ter símbolos não tem importância nessa decisão. De fato, a cadeia pode ser aceita mesmo que a pilha não termine vazia. 6

7 Veja que, no processo de reconhecimento, existem três informações importantes: o estado atual, o que resta da cadeia de entrada e a pilha atual. Por isso, podemos representar cada configuração de um autômato de pilha simplesmente como triplas na forma (q, s 1 s 2...s n, X 1 X 2...X p ) onde: q é o estado atual do autômato s 1...s n é o restante (ainda não lido) da cadeia de entrada X 1...X p é uma cadeia que reflete o conteúdo da pilha, considerando que o símbolo da esquerda X 1 representa o topo da pilha (como se a pilha tivesse sido deitada para a esquerda) Essas triplas serão chamadas de descrições instantâneas ou IDs (do inglês instantaneous description). Apesar do nome especial, essas triplas são apenas uma maneira mais formal e sucinta de representar a configuração do autômato em um dado instante. Vamos considerar que um AP está na seguinte ID genérica: (q, s 1 s 2...s n, X 1 X 2...X p ). Observe que o próximo símbolo da entrada é s 1 e o próximo símbolo da pilha é X 1. Se houver, neste autômato, uma transição saindo do estado q para o estado r, e na transição tiver o rótulo s 1, X 1 / Y 1...Y k, então o autômato pode mudar de estado e de configuração, causando três mudanças na ID: trocamos o estado q por r, removemos o s 1 da entrada e o X 1 da pilha, acrescentamos Y 1...Y k na esquerda (topo) da pilha. A nova ID seria a tripla (r, s 2...s n, Y 1...Y k X 2...X p ). Representamos que esta é uma mudança válida de configuração (ou de ID) assim: (q, s 1...s n, X 1...X p ) - (r, s 2...s n, Y 1...Y k X 2...X p ) (AO DIAGRAMADOR: - é um símbolo só, como se fosse o símbolo rotacionado) 7

8 A partir de agora, vamos usar as IDs para representar a computação de uma cadeia em um AP. Vamos dar exemplos usando ainda o mesmo autômato de antes, o qual reproduzimos abaixo: Como primeiro exemplo, apresentamos abaixo a computação da cadeia aa, que vimos no início desta seção: (q 0, aa, $) - (q 1, a, ABC) - (q 0, a, $BC) - (q 1, ε, ABCBC) Compare com as figuras no início da seção e perceba como cada ID está diretamente relacionada a cada figura. Veja que a computação chega a uma ID cujo estado é de aceitação (q 1 ) e cuja entrada está vazia (ε). Como dissemos antes, ssas são as duas condições necessárias para concluirmos que a cadeia aa foi aceita! Vamos agora ver o exemplo de uma cadeia que é rejeitada. Segue a computação da cadeia ab: (q 0, ab, $) - (q 1, b, ABC) - (q 0, b, $BC) Ela começa no estado inicial q 0, com a cadeia ab e o símbolo de início $ (primeira ID). A partir do estado q 0, o AP lê e remove a da entrada e $ da pilha, indo para q 1 e escrevendo ABC (formando a segunda ID). A partir de q 1, o AP ignora (não lê) o símbolo da entrada, mas lê e remove o A da pilha, indo para q 0 e escrevendo o $ (antes do BC). A computação pára no estado q 0 com o símbolo b na entrada e $ na pilha, pois não existe nenhuma seta saindo de q 0 com estes dois símbolos. Como a entrada não foi toda lida e o estado q 0 não é de aceitação, concluímos que a cadeia é rejeitada. Veja que a definição de aceitação que usamos considera o estado onde o AP pára, mas não considera do conteúdo da pilha. O primeiro exemplo que demos ilustra bem isso, pois a pilha não terminou vazia e mesmo assim a 8

9 cadeia foi aceita. Isso porque usamos a definição de aceitação por estado final. Existe uma definição alternativa, chamada de aceitação por pilha vazia, na qual não importa o estado onde o AP pára, mas é obrigatório que a pilha termine vazia para a cadeia ser aceita. Neste material, vamos trabalhar apenas com a aceitação por estado final por ser mais parecida com a aceitação dos autômatos finitos do 1º fascículo (AFD, AFND e ε-afnd). O que importa saber é que as duas definições são equivalentes para todo AP que aceita por estado final existe um AP que aceita por pilha vazia. Caso interesse, você pode pesquisar em outros materiais sobre a aceitação por pilha vazia. Na próxima seção, damos a definição matemática formal dos autômatos com pilha. É importante que você tenha compreendido bem o que vimos até aqui antes de passar para ela. (Se não compreendeu, releia as seções 1.1 e 1.2 ou entre em contato com seu tutor). 1.3 Definição Formal Os autômatos com pilha são 7-tuplas (ou seja, estruturas contendo uma seqüência de 7 elementos) na forma: P = (Q, Σ, Γ, δ, s, $, F), onde: Q é conjunto finito de estados, como nos autômatos finitos Σ (sigma) é o conjunto dos símbolos de entrada, como nos autômatos finitos Γ (gama) é o conjunto dos símbolos da pilha, que são os únicos símbolos que podem ser escritos na pilha δ (delta) é a função de transição, parecida com a dos autômatos finitos (abaixo descreveremos melhor essa função) 9

10 s é o elemento de Q que serve de estado inicial, como também ocorre nos autômatos finitos $ é um elemento de Γ usado como símbolo inicial da pilha F é o conjunto de estados de aceitação ou estados finais, como nos autômatos finitos Se você comparar com a definição dada para os autômatos finitos no 1º fascículo, verá que temos apenas dois novos componentes: Γ e $. Os dois são relacionados à pilha do autômato que estamos vendo. Como os autômatos finitos não tinham pilha, não precisavam desses dois componentes. Outra diferença para os demais autômatos é a função de transição δ. Ela também está presente nos autômatos finitos, mas é definida de maneira diferente nos APs: δ : Q x (Σ {ε}) x (Γ {ε}) 2 Q x Γ*. Isso quer dizer que ela recebe como argumento uma tripla assim δ(q,a,x), onde: q é o estado de onde sai a transição a é o próximo símbolo da cadeia de entrada ou ε (para não ler nada) X é o próximo símbolo a ser lido da pilha ou ε (para não ler nada) Para cada tripla dada como argumento, a função de transição delta dá como resultado um conjunto de pares { (p 1, α 1 ), (p 2, α 2 ),..., (p j, α j ) }. Cada par indica o próximo estado p x e a cadeia que será escrita na pilha α x. Usamos conjunto porque os APs são não-determinísticos e, por isso, podem ter mais de uma opção de transição para cada entrada. Isso quer dizer que o autômato pode escolher uma das opções: Mover para p 1 e escrever α 1 na pilha, OU mover para p 2 e escrever α 2 na pilha, OU..., OU mover para p j e escrever α j na pilha. 10

11 !! ATENÇÃO!! Esse não-determinismo dos APs pode fazer com que haja mais uma computação para uma mesma cadeia. Como nos AFNDs, a cadeia será considerada aceita se existir pelo menos uma computação que leve a um estado final após ler toda a cadeia. Ou seja, alguma computação deve chegar a uma ID na forma (q x, ε, α), em que q x é algum estado de aceitação e a entrada está vazia (já a pilha pode ter um conteúdo α qualquer). Sobre a representação da função de transição dos APs, não vamos mais usar tabelas porque é um pouco mais difícil do que antes. Vamos preferir listar todas as opções de transição na forma δ(q,a,x) = { (p 1, α 1 ),..., (p j, α j ) }, desde que o conjunto de saída não seja vazio. Se o resultado for um conjunto vazio, simplesmente não escrevemos nada. Vamos agora fazer a representação formal do AP visto na seção 1.1 e reproduzido abaixo. Vamos chamar o autômato de P 1 : É fácil perceber que o conjunto de estados é {q 0, q 1 }, sendo q 0 o estado inicial e q 1 o único estado de aceitação. É fácil também identificar os símbolos de entrada, pois, na descrição dada naquela seção, dissemos claramente que seria o conjunto {a,b}. Já os símbolos da pilha nós podemos descobrir olhando os rótulos das transições, porém ignorando o primeiro rótulo de cada transição. Assim, os símbolos da pilha são: {$, A, B, C}, sendo $ o símbolo de início da pilha, como informamos na seção 1.1. Assim, já podemos preencher seis componentes da definição formal: P 1 = ( {q 0, q 1 }, {a, b}, {$, A, B, C}, δ 1, q 0, $, {q 1 } ) 11

12 A função de transição δ 1 nós descrevemos com base nas setas da representação gráfica. Veja que temos uma única seta saindo de q 0. Ela lê o símbolo a, da entrada, e o símbolo $, da pilha. O efeito dessa transição é fazer o autômato ir para q 1 e escrever ABC na pilha. Portanto, temos: δ 1 (q 0, a, $) = { (q 1, ABC) } A outra seta sai de q 1, não lê nada da entrada, mas lê A da pilha. Ela leva para q 0 e escreve $ na pilha. Portanto, temos: δ 1 (q 1, ε, A) = { (q o, $) } Pronto, essas duas sentenças definem a função δ 1. Podemos entender que todas as outras entradas possíveis dão como resultado o conjunto vazio. Por exemplo: δ 1 (q 0, b, A) ou δ 1 (q 1, a, B) dão o resultado. Este único AP dado como exemplo até agora é ainda muito simples. Ele simplesmente reconhece todas as cadeias que são formadas apenas por símbolos a. Esse exemplo ainda não demonstra o poder dos autômatos de pilha porque essa linguagem nós poderíamos representar com um autômato finito sem dificuldades. A seguir, veremos a construção de um AP para uma linguagem que não pode ser representada com autômatos finitos. Aprenda praticando Questão 1: Vimos no capítulo sobre gramáticas livres de contexto (fascículo 2) a linguagem das cadeias na forma 0 n 1 n, para todo n>1. Lá, dissemos que essa linguagem não é regular, mas é livre de contexto. Isso quer dizer que há alguma gramática livre de contexto e também algum autômato com pilha para representá-la. A gramática já foi apresentada no fascículo 2. Crie agora um AP de nome P 2 para representá-la. Resolução: Perceba que, pela descrição dada, as cadeias que o autômato deve aceitar começam com algum número n de símbolos 0, depois deve ter o mesmo 12

13 número n de símbolos 1. Assim, o autômato vai precisar contar de alguma maneira a quantidade de símbolos 0, para depois conferir se existe a mesma quantidade de 1s. A idéia é usar a pilha para fazer essa contagem. A cada símbolo 0 lido da cadeia de entrada, colocamos algum símbolo na pilha. Vamos usar X para isso. Depois, a cada símbolo 1 lido da entrada, o autômato P 2 deve ler um símbolo X da pilha ao mesmo tempo. O autômato irá para o estado de aceitação se retirarmos todos os Xs da pilha nesse processo, pois isso significa que para cada símbolo X tinha um símbolo 1. O diagrama do autômato P 2 é dado abaixo. Considere que $ é o símbolo de início da pilha. Veja que a transição de q 0 para q 0 serve para ler todos os 0s da entrada, colocando os Xs correspondentes na pilha. A transição para q 1 só vai acontecer quando houver, ao mesmo tempo, um símbolo 1 na entrada e um símbolo X na pilha. A partir daí, no estado q 1, para cada símbolo 1 lido, deve haver um símbolo X na pilha. Se houver a quantidade certa de símbolos 1s, a entrada vai ficar vazia no mesmo momento em que acabarem os símbolos Xs da pilha. A pilha, então, voltará a ter apenas o símbolo inicial $ (que estava abaixo dos Xs). Com o símbolo $ na pilha, o autômato pode mover para o estado de aceitação. Questão 2: Represente formalmente o autômato da questão anterior. Resolução: 13

14 Os estados são facilmente identificáveis na figura. Eles formam o conjunto: {q 0,q 1,q 2 }. Desses, temos q 0 como estado inicial e o conjunto unitário de estados de aceitação {q 2 }. Pela descrição dada para linguagem, podemos concluir que os símbolos de entrada são: {0,1}. Por sua vez, os símbolos da pilha você pode descobrir revendo o processo de construção do autômato (ou apenas olhando nas transições do autômato final). Confira que são apenas dois os símbolos da pilha, formando o conjunto: {$,X}. Destes, usamos $ como símbolo de início da pilha. Falta apenas a função de transição do autômato, que chamaremos de δ 2. Ela é construída com base nas transições do autômato, representadas por setas. Por exemplo, temos uma transição de q 0 para q 0 que lê 0 da entrada e nada (ε) da pilha e, depois escreve X. Essa transição nos leva a concluir que δ 2 (q 0,0,ε) = { (q 0, X) }. Fazendo o mesmo para as outras três transições, completamos a definição formal de P 2 : P 2 = ({q 0,q 1,q 2 }, {0,1}, {$,X}, δ 2, q 0, $, {q 2 }), onde δ 2 é dada por: δ 2 (q 0,0,ε) = { (q 0,X) } δ 2 (q 0,1,X) = { (q 1,ε) } δ 2 (q 1,1,X) = { (q 1,ε) } δ 2 (q 1,ε,$) = { (q 2,$) } Questão 3: Mostre a computação do AP da questão anterior quando ele recebe a cadeia Diga se esta cadeia é aceita e justifique. Resolução: Começamos no estado inicial q 0, com a entrada 0011 e com a pilha com seu símbolo de início $: (q 0, 0011, $) 14

15 Podemos agora fazer a transição de q 0 para q 0 que lê 0 e escreve X na pilha, o que nos dá a ID: (q 0, 011, X$) Podemos fazer novamente a mesma transição: (q 0, 11, XX$) Veja que já lemos os dois 0s e, como resultado, escrevemos dois Xs na pilha. O que o autômato vai fazer a partir de agora é como se ele conferisse que há um símbolo 1 para cada X. Veja que, neste ponto, só podemos fazer a transição de q 0 para q 1 que lê justamente um 1 e um X juntos, dando o resultado: (q 1, 1, X$) Agora podemos fazer uma transição de q 1 para q 1 que faz algo parecido: (q 1, ε, $) Observe que cadeia já está vazia, mas ainda não estamos em um estado de aceitação. Por sorte, ainda podemos fazer uma transição que não lê símbolo da entrada, e lê $ da pilha. Ela leva de q 1 para q 2, resultando na ID: (q 2, ε, $) Veja que chegamos a uma configuração com um estado de aceitação e com a entrada vazia. Portanto, podemos concluir que a cadeia 0011 é aceita. Nós detalhamos com bastante cuidado todo o processo de reconhecimento para facilitar o seu entendimento, mas, nas suas respostas em exercícios ou provas, você pode ser mais objetivo e listar diretamente toda a computação assim: (q 0, 0011, $) - (q 0, 011, X$) - (q 0, 11, XX$) - (q 1, 1, X$) - (q 1, ε, $) - (q 2, ε, $) 15

16 Saiba mais A apresentação inicial dos autômatos com pilha na seção 1.1 foi baseado no livro de Sipser, que recomendamos pela sua boa didática. Porém, os principais detalhes do presente capítulo, tais como definição formal, computação e aceitação em APs, estão mais parecidos com o livro de Hopcroft, Ullman e Motwani. Por isso, este livro é a principal leitura complementar recomendada para o assunto. Um assunto interessante presente em ambos os livros citados é prova da equivalência entre gramáticas livres de contexto e autômatos de pilha. Nós apenas citamos aqui que esses dois modelos são equivalentes, mas o livro vai além e descreve detalhadamente como converter de um modelo para o outro. Atividades e Orientações para estudo Abaixo apresentamos algumas atividades que servirão para você, cursista, fixar o assunto aqui apresentado. Tente resolver os exercícios aqui apresentados e, em caso de dúvida, consulte o tutor ou o professor. Questão 1: Considerando o autômato P 2 dado antes, mostre a computação de cada uma das cadeias abaixo e diga se cada cadeia é ou não aceita: a) 01 b) 001 c) d)

17 Questão 2: Crie um autômato P 3 para representar a linguagem das cadeias na forma 0 n 1 2n, para n>1. Ou seja, são cadeias que iniciam com um número qualquer (n) de símbolos 0s e que, depois, têm um número duas vezes maior (2n) de símbolos 1s. (DICA: use uma idéia muito parecida com a que usamos para criar P 2, porém o novo autômato, para cada 0 lido, você deve preparar o autômato para ler dois 1s). Questão 3: Vimos que os APs são não-determinísticos, mas só demos exemplos de APs determinísticos. Abaixo, mostramos um exemplo de APs não-determinístico para reconhecer cadeias na forma w.w r, ou seja, cadeias cuja segunda metade é o inverso da primeira. Por ser (verdadeiramente) não-determinístico, o autômato P 4 pode permitir mais de uma computação para uma cadeia dada. Para cada cadeia abaixo, encontre alguma computação que comprove que ela é aceita pelo autômato. (Já estamos afirmando que todas são aceitas. Falta achar uma computação que comprove isso). a) aa b) abba c) bbbb Questão 4: Crie as representações formais dos autômatos P 3 e P 4. 17

18 18

19 Capítulo 2 Máquinas de Turing Talvez você, cursista, tenha chegado neste ponto do curso ainda sem saber exatamente o que os modelos matemáticos vistos têm a ver com os computadores modernos. Se este for o seu caso, não se preocupe, pois o que veremos neste capítulo o fará entender melhor a relação entre os modelos matemáticas e os computadores que usamos. Primeiramente, veremos mais um modelo matemático para representação de linguagens as Máquinas de Turing (MTs). Apesar de sua aparente simplicidade, este modelo é mais poderoso do que todos os modelos que vimos antes. Aliás, nenhum outro modelo matemático é capaz de representar mais linguagens do que ele. Devido a essa grande capacidade das máquinas de Turing, elas é que são usadas como base para o estudo teórico dos limites dos computadores reais criados pelo homem. Acredita-se, por exemplo, que nunca haverá um computador capaz de resolver mais problemas do que as máquinas de Turing. Antes de nos aprofundarmos nessa discussão, vamos aprender como funcionam as Máquinas de Turing (que abreviaremos como MTs). 2.1 Princípio de Funcionamento das MTs As máquinas de Turing são parecidas com os autômatos vistos anteriormente neste curso. Porém, elas possuem uma memória linear infinita que chamaremos de fita, por lembrar as fitas magnéticas usadas para 19

20 armazenar dados em computadores antigos 1. Na máquina de Turing, cada posição da fita guarda algum símbolo. Esses símbolos são lidos em seqüência, um por vez, como faz a cabeça ou cabeçote nas fitas magnéticas reais. A cadeia de entrada da máquina de Turing é automaticamente gravada na fita quando a máquina é iniciada. Como a fita é infinita, as (infinitas) posições mais à esquerda e mais à direita da cadeia são preenchidas com um símbolo especial que chamaremos de símbolo branco. Por exemplo, se considerarmos que a cadeia de entrada é abab e que o símbolo branco é representado por, a fita da MT seria iniciada assim: A MT começa com a cabeça posicionada sobre o primeiro símbolo da cadeia de entrada e, a partir daí, começa a operar. A cada etapa de sua operação, a MT faz três ações na fita: ela lê o símbolo que está sob a cabeça, escreve outro símbolo sobre ele (substituindo-o) e move a cabeça uma única posição, para a esquerda ou para a direita. Essas três ações ocorrem em conjunto, levando a máquina a caminhar na fita uma posição por vez em qualquer direção. Para representar uma MT, podemos usar um diagrama de estados parecido com o dos autômatos finitos e dos autômatos com Pilha. Novamente, temos um estado inicial e zero ou mais estados de aceitação, representados da mesma maneira que antes. Porém, as setas das transições recebem rótulos diferentes dos usados nos outros autômatos. Cada transição tem um rótulo: X / Y, M, onde: X é o símbolo que precisa ser lido da fita (pela cabeça) 1 Também é usada em computadores modernos, em algumas aplicações restritas (por exemplo: para fazer backups de servidores). 20

21 Y é símbolo que será escrito na fita (substituindo X) M indica a direção para onde a cabeça se moverá na fita, podendo assumir apenas dois valores: o E, para esquerda (também pode ser usado L, do inglês left) o D, para direita (também pode ser usado R, do inglês right) Para ilustrar, mostramos abaixo um primeiro exemplo de MT, que aceita cadeias sobre o alfabeto {a,b}: Para explicar este primeiro exemplo de MT, vamos detalhar como ela manipula a fita. A idéia usada na construção da máquina é que, toda vez que ele encontrar um b na fita, ela vai escrever X no lugar e vai voltar uma posição. Isso acontece na transição b/x,e em q 0. Já se a MT dada ler um a, ela vai andar duas posições para a direita. A primeira posição ela anda ao encontrar o próprio a, como você pode conferir na transição a/a,d de q 0 para q 2. A segunda posição ela anda qualquer que seja o símbolo, como você pode ver nas várias opções de transição de q 2 para q 0. Se em algum momento, no estado q 0, a máquina encontrar o símbolo vazio, ela vai para o estado de aceitação q 1 e ali irá parar. Entenda que uma máquina de Turing pára em um estado quando nenhuma transição pode ser usada a partir desse estado. 21

22 Destacamos ainda que, nas máquinas de Turing, a cadeia não precisa ser lida inteira para ser aceita, como acontece nos outros tipos de autômatos. A única coisa que importa é que a MT pare em um estado de aceitação. Por isso, toda vez que a MT mostrada acima chegar ao estado q 1, ela não só irá parar como também irá aceitar a cadeia (mesmo que ela não tenha sido lido inteira). Como fizemos com os APs, vamos dedicar uma seção inteira aos detalhes do processo de reconhecimento em uma MT. 2.2 Computação e Aceitação nas Máquinas de Turing Vamos começar analisando o comportamento da MT dada quando ela recebe a cadeia aab como entrada. A configuração inicial da MT é exibida graficamente abaixo: Veja que esta máquina está no estado inicial q 0 e a cabeça da fita está no primeiro símbolo da cadeia. Lembramos que tanto à direita quanto à esquerda da cadeia existem infinitos símbolos brancos. Veja que há uma transição saindo de q 0 para q 2 lendo o símbolo a. O que ela faz na fita é reescrever o a (ou seja, não muda a fita) e move a cabeça para a direita. A configuração resultante é: 22

23 Agora, temos a cabeça de leitura apontando para outra ocorrência do símbolo a. Este é um ponto interessante para lembrar a você, cursista, que o movimento da cabeça da fita e a mudança entre os estados são coisas distintas. A mudança de estados é definida pelas setas, enquanto a direção da fita é definida pelo terceiro elemento do rótulo da seta (que pode ser E ou D). Veja que, neste ponto, a MT vai fazer uma transição de volta ao estado q 0, mas movendo a cabeça para a direita. O resultado é mostrado abaixo: Com a MT no estado q 0 e com o símbolo b sendo lido pela cabeça da fita, a máquina vai fazer a transição de q 0 para q 0. Apesar de permanecer no mesmo estado, a fita da MT vai mudar: o símbolo b vai ser trocado pelo símbolo X e a cabeça anda para esquerda. O resultado é a configuração: 23

24 Estamos novamente no estado q 0 com a cabeça apontando para um símbolo a. Você agora já deve ser capaz de perceber que a MT vai mudar para q 2 e a fita vai andar para a direita, resultando na configuração: Em q 2 e com o símbolo X sendo lido pela cabeça, a máquina vai voltar para q 0 com a fita andando para a direita. O resultado é a seguinte configuração: A máquina agora está no estado q 0 com a cabeça da fita posicionada em um símbolo branco. Pelo diagrama de estados, vemos que a próxima 24

25 configuração será o estado q 1 com a cabeça da fita posicionada um símbolo à esquerda, assim: Agora a máquina chegou a um estado do qual não sai nenhuma transição. Portanto, dizemos que a MT parou no estado q 1. Como q 1 é um estado de aceitação, concluímos que a cadeia aab é aceita pela máquina dada. Em outras palavras, a cadeia aab faz parte da linguagem que a MT representa. Se você entendeu o processo de reconhecimento descrito acima, não terá dificuldades para entender o que vamos definir a seguir. (Se ainda estiver inseguro, aconselhamos você a reler cuidadosamente a partir do início da seção.) Como fizemos com os APs, vamos mostrar uma representação mais sucinta de cada configuração do autômato. Mas antes, pense um pouco: quais elementos são importantes na configuração de uma MT? Um elemento é fácil de perceber: o estado do autômato. Não precisamos mostrar todo o diagrama a cada passo, como fizemos acima. Basta informar o estado onde a MT está a cada instante. Outro elemento poderia ser simplesmente a fita, que poderia ser representada como uma cadeia. Porém, teríamos alguma dificuldade para representar a posição atual da cabeça. O que vamos fazer para resolver esse problema é dividir a fita em duas partes: uma parte contendo o que está à esquerda da posição atual e a outra parte contendo tanto a posição atual como o que está à direita dela. 25

26 Os três elementos citados vão formar a descrição instantânea ou ID (instantaneous description) de uma máquina de Turing. Para simplificar, uma ID será representada na seguinte forma: <fita à esquerda>, <estado>, <posição atual + fita à direita> Um detalhe é que a fita de uma MT possui infinitos símbolos brancos, tanto à esquerda quando à direita, que poderiam dificultar a representação. Usaremos duas regras para lidar com isso: Em primeiro lugar, não representaremos seqüência infinitas de símbolos brancos que ocorrerem na extrema esquerda de <fita à esquerda> ou na extrema direita de <posição atual + fita à direita>. Em segundo lugar, se uma das duas partes da fita ficar vazia, colocaremos um símbolo (do trecho infinito que foi omitido). Vejamos agora como representar com IDs a computação da cadeia aab (a mesma que fizemos antes de maneira gráfica). A configuração inicial da MT inclui o estado q 0. O lado esquerdo da fita é composto apenas de símbolos brancos, que representaremos com um só (para não ficar vazia). Já a outra parte da fita, é formada justamente pela cadeia aab. Assim a ID inicial será:, q 0, aab Como fizemos com os APs, representaremos mudanças de IDs válidas nas máquinas de Turing com o símbolo -. Assim, o processamento da cadeia aab pode ser representado pela seqüência de IDs mostrada abaixo. Compare com as configurações apresentadas anteriormente com figuras., q 0, aab - a, q 2, ab - aa, q 0, b - a, q 0, ax 26

27 - aa, q 2, X - aax, q 0, - aa, q 1, X Atente para o detalhe de que o primeiro símbolo depois do estado representa a posição que será lida pela cabeça e que servirá para decidir a próxima configuração. Na primeira ID foi lido um a, o que levou ao estado q 2 e causou um movimento para a direita, como pode ser visto na segunda ID. Na segunda ID, foi lido o segundo a, que causou a mudança para q 0, etc. Observe, ainda, que na primeira e na sexta IDs tivemos que mostrar um símbolo branco da seqüência infinita de alguma das extremidades lado da fita.. Lembre-se que, no fundo, a primeira ID, por exemplo, representa algo assim: (infinitos)..., q 0, aab... (infinitos) Nas outras IDs, a MT estava em posições intermediárias da cadeia e, por isso, omitimos todos os símbolos brancos. Consideramos que uma cadeia w dada como entrada para uma MT será aceita se a computação dela tiver as seguintes características: Inicia em uma ID na forma, q 0, w, onde q 0 é o estado inicial Termina em uma ID qualquer α, q x, β, de maneira que a MT não possa mais sair dessa configuração. O estado q x desta última ID é um estado de aceitação. De maneira parecida, a cadeia será considerada rejeitada se a computação dela satisfizer as duas primeiras condições (de sair da configuração inicial e parar), mas não satisfizer a terceira (de terminar em um estado de aceitação). Você agora pode estar pensando que aceitar e rejeitar uma cadeia são as duas únicas opções de uma MT, mas, infelizmente, essa não é a realidade. 27

28 Existem situações em que a MT não consegue satisfazer a segunda condição dada antes: de parar em alguma configuração. Para exemplificar, vamos usar a seguinte máquina de Turing T 2, que recebe entradas sobre o alfabeto {a,b}: Se você tentar entender essa MT verá que ela aceita apenas as cadeias formadas apenas por símbolos a s. Mas o que acontece se a cadeia tiver um b? Vamos analisar o comportamento de T 2 quando ela recebe a entrada ab para entendermos. A computação resultante é descrita abaixo:, q 0, ab - A, q 0, b - AB, q 1, - ABC, q 1, - ABCC, q 1, - ABCCC, q 1, -... Perceba que, depois de entrar em q 1, a MT começa a trocar cada (branco) por C, seguindo para a direita. Porém, seguindo à direita ela sempre encontra outro (pois a fita tem infinitos deles) e o processo se repete indefinidamente. Ou seja, essa MT nunca vai parar! Nesse caso, dizemos que a MT entra em loop para a cadeia ab. Neste caso, a cadeia definitivamente não é considerada aceita, mas também não 28

29 chega ser devidamente rejeitada. De maneira informal, podemos dizer que a cadeia deveria ser rejeitada, mas a MT não consegue parar para rejeitar. Esse comportamento não é desejável em uma MT. A realidade é que, em muitos casos, é possível criar uma MT que nunca entra em loop, qualquer que seja a entrada. Porém, em outros casos isso não é possível. Não entraremos em detalhes porque esse assunto será visto no próximo capítulo. O importante é que já vimos todos os detalhes de funcionamento das MTs e agora podemos apresentar a definição matemática precisa desse modelo. 2.3 Definição Formal As máquinas de Turing podem ser definidas matematicamente como 7- tuplas contendo os componentes descritos abaixo: T = (Q, Σ, Γ, δ, s,, F), onde: Q é conjunto finito de estados Σ (sigma) é o conjunto dos símbolos de entrada Γ (gama) é o conjunto dos símbolos de fita, que são os símbolos que podem ser lidos e escritos na pilha, incluindo todo o conjunto Σ δ (delta) é a função de transição, que deixaremos para descrever melhor abaixo s é o elemento de Q que serve de estado inicial é o símbolo branco, que é um elemento de Γ mas não de Σ, ou seja, ele aparece na fita mas não pode aparecer em cadeias de entrada F é o conjunto de estados de aceitação ou estados finais Como você pode perceber, a definição da máquina de Turing é parecida com as definições dos autômatos finitos e do autômato de pilha, vistos antes. 29

30 As definições de todos os modelos de autômatos variam em dois ou três dos componentes, mas o componente que é o principal responsável pela forma de operação específica de cada um é a função de transição δ. Por esse motivo, falaremos somente sobre ela a partir de agora. Aqui, ela é definida como δ : Q x Γ Q x {E,D}. Isso quer dizer que ela recebe como argumento um par assim δ(q,x), onde: q é o estado de onde sai a transição X é o símbolo na próxima posição da fita O valor da função, se estiver definido, é uma tripla (p,y,m) onde: p é o próximo estado Y é o símbolo que será escrito sobre o X (substituindo-o) M é a direção de movimento da cabeça, podendo assumir apenas os valores E (esquerda) ou D (direita) Como nos outros autômatos, o que a função de transição representa é o mesmo que as setas entre os estados da representação gráfica representam. Aquilo que formalmente dizemos assim δ(q 0,X) = (q 1,Y,D), graficamente é representado assim: O estado de onde sai a seta (q 0 ) e o símbolo antes da barra (X) são os dois argumentos da função, enquanto que o estado onde chega a seta (q 1 ), o símbolo depois da barra (Y) e a direção da fita (D, de direita), formam o resultado da função. Vamos agora dar a representação formal da MT do primeiro exemplo, que reproduzimos abaixo. Vamos chamá-la aqui de T 1. 30

31 Os estados de T 1 são facilmente identificáveis: {q 0, q 1, q 2 }, onde q 0 é estado inicial e o conjunto de estados de aceitação é o conjunto unitário {q 1 }. Os símbolos de entrada formam o conjunto {a,b}, como dissemos quando apresentamos esta MT na primeira seção. Já os símbolos da fita incluem todos os símbolos usados: {a, b, X, } 2, onde é o símbolo branco. Com isso, já podemos dar quase todos os detalhes da representação formal: T 1 = ({q 0, q 1, q 2 }, {a,b}, {a,b,x,}, δ 1, q 0,, {q 1 }) O que falta representar é a função de transição δ 1. Veja que as funções de transição das MTs recebem apenas duas entradas. Isso nos permite representá-las com tabelas. Como nos autômatos finitos, usaremos as linhas para os estados e as colunas para os símbolos de fita. No encontro de linha e coluna colocaremos a tripla que representa o valor da função. Assim, a função δ 1 pode ser representada pela seguinte tabela: a b X q 0 (q 2, a, D) (q 0, X, E) - (q 1,, E) q q 2 (q 0, a, D) (q 0, b, D) (q 0, X, D) (q 0,, D) 2 Atenção, não confunda! E e D não foram listados porque não são símbolos da fita, mas sim direções do movimento da cabeça da fita. 31

32 Podemos perceber na tabela acima que, dado um estado e um símbolo, a máquina oferece uma das duas opções: ou existe uma opção de movimento única (dada pela tripla) ou não existe opção de movimento (representada com um traço). Por isso, em um dado instante em toda máquina de Turing, sabemos sempre exatamente o que fazer: se houver a tripla, a MT faz o movimento; se não houver, a MT pára. Nelas não existem múltiplas opções de movimento para um mesmo par (estado, símbolo) Isso significa que as MTs que nós definimos são determinísticas.. Você deve lembrar que os autômatos que apresentavam ambigüidades de movimento, nós chamamos antes de não-determinísticos. O exemplo mais recente que vimos foram os autômatos com pilha. Definimos os APs daquela maneira porque, se os definíssemos como determinísticos, eles seriam menos poderosos. Porém, as Máquinas de Turing determinísticas e nãodeterminísticas têm o mesmo poder! É possível transformar uma MT de um tipo em uma MT do outro tipo. Por isso, preferimos trabalhar com o tipo mais simples que é a MT determinística. Seguem alguns exercícios sobre MTs para ajudar a fixar o assunto. Aprenda praticando Questão 1: Represente formalmente o autômato T 2 (que é o mesmo que usamos para dar exemplo de loop infinito na seção 2.2). Resolução: 32

33 Os estados formam o conjunto {q 0, q 1 }, onde q 0 é estado inicial e o único estado de aceitação. Os símbolos de entrada são {a,b}, como pode ser lido na descrição original na seção 2.2. Já o alfabeto da pilha tem a mais os símbolos A, B, C e, onde é o símbolo branco. Com isso, podemos terminar a representação formal de T 2, que fica assim: T 1 = ({q 0, q 1 }, {a,b}, {a,b,a, B,C,}, δ 2, q 0,, {q 0 }), onde δ 2 é: a b A B C q 0 (q 0,A,D) (q 1,B,D) q (q 1,C,D) Em um caso como este, que a MT não está definida para muitas configurações, teria sido mais simples representar os valores da função assim: δ 2 (q 0,a) = (q 0,A,D) δ 2 (q 0,b) = (q 1,B,D) δ 2 (q 1, ) = (q 1,C,D) As duas maneiras são equivalentes, então fique à vontade para escolher como fazer, nos exercícios. Questão 2: Abaixo, mostramos uma MT que representa a linguagem das cadeias sobre o alfabeto {0,1} que têm a forma 0 n 1 n, com n 1. (Ou seja, são cadeias com um quantidade n de símbolos 0 s, seguidos da mesma quantidade n de símbolos 1 s). Mostre a computação de cada cadeia abaixo. 33

34 >> Ao diagramador: Nas setas, trocar ponto-e-vírgula por barra /. Trocar também a letra L (left) por E (esquerda) e trocar R (right) por D (direita) << a) 01 b) 001 Resolução da letra a: Iniciamos a computação com uma ID contendo o estado inicial com a cadeia à sua direita:, q 0, 01 A partir dai, fazemos os movimentos válidos na MT até ela parar (quando não tiver mais movimento válido). Na ID acima, a máquina está em q 0 lendo o símbolo 0, portanto ela vai mover para q 1, vai trocar o 0 por A e, depois, vai andar na fita para a direita. A configuração resultante será essa: A, q 1, 1 Agora, no estado q 1 lendo 1, a MT vai para q 2, escreve B e anda para a esquerda da fita. O resultado é a ID: 34

35 , q 2, AB Em q 2, lendo A, a máquina muda para q 0, troca A por A (ou seja, não muda) e anda para a direita na fita: A, q 0, B Em q 0, lendo B a máquina irá para q 4 e anda para a direita na fita, produzindo a seguinte configuração: AB, q 4, Em q 4, ao ler o símbolo branco, a MT vai para o estado q 5, gerando a seguinte ID: AB, q 5, Neste estado, a MT não tem mais opção de movimento ela parou. Como a computação terminou no estado de aceitação q 5, concluímos que a cadeia 01 (dada no início) foi aceita! Resolução da letra b: Dessa vez, daremos a resposta de maneira mais direta e deixaremos por sua conta interpretar o que aconteceu a cada passo. A computação dessa cadeia é a seguinte seqüência de IDs:, q 0, A, q 1, 01 - A0, q 1,1 - A, q 2, 0B -, q 2, A0B - A, q 0, 0B 35

36 - AA, q 1, B - AAB, q 1, A máquina pára no estado q 1, que não é estado de aceitação. Por isso, a cadeia 001 não é aceita por essa máquina de Turing! 2.4 Noções de Teoria da Computabilidade O que vamos apresentar agora é uma visão introdutória da subárea da Teoria da Computação conhecida pelo nome de Teoria da Computabilidade. Um conceito importante para essa área é o conceito informal de algoritmo, que podemos definir assim: Um algoritmo é uma descrição precisa dos passos que uma máquina (um humano) deve seguir para resolver, em tempo finito, um problema matemático. Podemos dizer que um algoritmo é a lógica interna de uma máquina para resolver um problema. Podemos chamar essas máquinas de computadores, porque elas computam (ou seja, calculam) a solução do problema. (Por enquanto, vamos pensar que cada computador trata um problema único.) Com isso, podemos descrever a área assim: A Teoria da Computabilidade estuda quais problemas matemáticos podem e quais não podem ser resolvidos por meio de alguma máquina (computador) em tempo finito. Um detalhe sobre os problemas matemáticos que estamos tratando é que eles podem ter variações, indicadas por meio de parâmetros. Os valores desses parâmetros serão dados como entrada para o computador. Por sua vez, a máquina terá que retornar, em tempo finito, a saída que representa a solução do problema. A figura abaixo representa essa idéia: 36

37 entrada Computador para resolver um problema P saída Alguns exemplos de problemas matemáticos que podem ser tratados assim são descritos abaixo: Somar dois números inteiros o entradas: dois números a e b o saída: um número que seja soma de a e b Verificar se um número é par o entrada: um número o saída: sim/não Encontrar o menor caminho de um ponto a outro de uma cidade o entradas: mapa da cidade e das duas localizações x e y o saída: caminho de x para y Encontrar raízes inteiras de um polinômio o entrada: um polinômio o saída: lista de raízes inteiras A verdade é que já temos criados soluções para problemas assim ao longo de toda a disciplina. Porém, os problemas foram dados na forma de uma linguagem como, por exemplo, cadeias com um número par de 0 s, que 37

38 equivale ao problema de verificar se uma quantidade de 0 s é par. Além disso, nos nossos estudos até agora, as entradas foram sempre dadas na forma de cadeias e as saídas foram sempre ou sim ou não (que chamávamos de aceita ou rejeita). Dos exemplos anteriores, apenas o segundo (verificar se um número é par) tem saídas nessa forma. Mas isso não atrapalha nossos estudos, pois, na verdade, quase todos os problemas matemáticos podem ser modificados para usarem apenas saídas sim/não. Podemos transformar os outros três problemas dados antes em problemas de verificar se existe uma resposta ou em problemas de verificar se uma resposta (dada pela entrada) está correta. Os problemas ficariam assim: Verificar soma de números inteiros o entrada: três números a, b e c, onde c deveria valer a soma de a e b o saída: sim (se c for a soma de a e b) / não (caso contrário) Verificar o menor caminho de um ponto a outro de uma cidade o entrada: mapa da cidade e um caminho de x para y o saída: sim (se o caminho dado for o menor que existe para ir de x para y) / não (caso contrário) Verificar se um polinômio tem raízes inteiras o entrada: um polinômio o saída: sim (se o polinômio tem raízes inteiras) / não (caso contrário) Problemas que possuem saídas sim ou não, como os que foram dados acima, recebem o nome de problemas de decisão. Assim, quando criamos modelos para representar as linguagens nos capítulos passados, no fundo, estávamos lidando com a questão da computabilidade de problemas de 38

39 decisão. Ou seja, estávamos tentando provar que era possível criar um computador que resolve um problema de decisão: w Computador para representar uma linguagem L (ou seja, para resolver um problema de decisão P) sim/não Chamaremos um problema (ou uma linguagem) de decidível se for possível construir uma máquina para resolvê-lo (computá-lo) em tempo finito. Caso contrário, o problema será chamado de indecidível, o que representa que nenhum computador pode resolver o problema adequadamente, pois entraria em loop infinito para algumas entradas. ATENÇÃO Não confunda os termos! Os problemas todos que iremos tratar recebem o nome de problema de decisão, mas o nosso desafio será classificá-los como problemas decidíveis ou indecidíveis. Assim, o conceito de problema decidível é um caso especial do conceito de problema de decisão. O que você talvez ainda esteja questionando é que não detalhamos a construção de nenhum computador real na disciplina. Realmente não vimos detalhes físicos da construção, porém, vimos o que realmente importa no computador, que é a sua lógica interna, o seu algoritmo. E esses algoritmos foram representados com os vários modelos vistos, mas, principalmente com os autômatos: AFD, AFND, ε-afnd, AP e, agora, MT. 39

40 Por isso, ao representar a solução de um problema (ou uma linguagem) com um desses modelos, estamos provando que o problema (ou a linguagem) é decidível. Nesse caso, dizemos também que o autômato decide o dado problema (ou a dada linguagem). Com isso, podemos afirmar que os problemas e linguagens que estudamos nos capítulos anteriores são todos decidíveis. Porém, como você deve lembrar alguns dos modelos vistos decidem mais linguagens e outros decidem menos, formando classes de linguagens (e de problemas). Essa classificação forma a chamada Hierarquia de Chomsky, que discutiremos na próxima seção. 2.5 Hierarquia de Chomsky Como já vimos no 2º fascículo, a Hierarquia de Chomsky agrupa as linguagens de acordo com os modelos que são capazes de decidi-las. Agora que vimos o último modelo computacional (MT), podemos apresentar essa hierarquia de maneira completa. Antes disso, vamos fazer uma rápida revisão de todos os tipos de autômatos vistos, bem como das classes de linguagens que eles representam. É curioso observar que o poder para decidir linguagens de cada autômato parece depender do tipo de memória que ele possui e de como essa memória pode ser acessada. Por exemplo, os três modelos de autômatos finitos (AFD, AFND e ε-afnd) não têm nenhuma memória auxiliar. Por isso, eles são os modelos menos poderosos que estudamos. Chamamos as linguagens que eles são capazes de decidir de linguagens regulares. w sim/não Computadores baseados em autômatos finitos 40

41 Já os autômatos com pilha (APs) têm uma memória infinita (a pilha) que funciona segundo a regra o último que entra é o primeiro que sai. Por isso, estes autômatos são capazes de decidir um conjunto maior de linguagens. Chamamos a essas linguagens de linguagens livres de contexto. w sim/não Computadores baseados em autômatos com pilha Por fim, vimos as máquinas de Turing como autômatos com uma memória unidimensional infinita (a fita) que dá total liberdade para ler e escrever em qualquer posição. Como conseqüência, este é o modelo que é capaz de decidir mais linguagens do que todos os outros modelos vistos! w sim/não Computadores baseados em máquinas de Turing O que ainda não fizemos até aqui foi dar nome à classe de linguagens que esse modelo representa. Antes disso, precisamos lembrar que só podemos considerar as MTs que sempre param (ou seja, nunca entram em loop), afinal, a definição de decidível exige que a máquina execute em tempo finito (e isso não acontece nas MTs que entram em loop). Pois bem, as linguagens que 41

42 podem ser computadas por MTs que sempre param são chamadas de linguagens recursivas. Essa é a classe de linguagens mais abrangente, englobando as outras duas. As três classes de linguagens apresentadas estão organizadas na chamada Hierarquia de Chomsky 3, representada abaixo. Veja que cada nível engloba os níveis inferiores. Assim, toda linguagem regular é também livre de contexto e também recursiva. Isso equivale a dizer que tudo que podemos decidir com um AFD também podemos decidir com um AP e também com uma MT. Isso ressalta a afirmação que já fizemos antes sobre as MTs que esse é o modelo mais poderoso que vimos até agora. O nosso próximo passo, agora, é tratar uma questão importante ainda não discutida: será que existe outro modelo capaz de decidir mais linguagens (e problemas) do que as MTs? Trataremos disso na seção seguinte. 2.5 Tese de Church-Turing No início do século passado, ainda antes dos computadores existirem na forma que conhecemos, houve um grande debate científico sobre como representar da melhor maneira possível os algoritmos. Na época, ainda não havia modelos matemáticos para representá-los e os pesquisadores estavam 3 Na verdade, a hierarquia de Chomsky original continha outras duas classes e não continha a classe das linguagens recursivas. Mesmo assim, mantivemos o nome porque a idéia que seguimos é a mesma. 42

43 buscando criar o modelo capaz de representar algoritmos da maneira mais abrangente possível. Na década de 1930, dois pesquisadores apresentaram, de maneira independente, modelos que se tornaram bastante conhecidos. Alonzo Church apresentou o modelo chamado λ-cálculo (que não veremos) e Alan Turing apresentou o modelo máquina de Turing (que estamos estudando). Ambos os modelos se mostraram capazes de representar uma quantidade muito grande de algoritmos para diferentes problemas. Mais do que isso, Alan Turing também provou que os dois modelos eram equivalentes, ou seja, podiam resolver os mesmos problemas. Com o passar do tempo, muitos novos modelos foram propostos, mas nenhum deles se mostrou capaz de resolver mais problemas do que os dois modelos citados. No máximo, os novos modelos se mostraram equivalentes aos dois. Por isso, hoje em dia aceita-se a idéia de que esses dois modelos (λcálculo e máquina de Turing) são os modelos que conseguem resolver mais problemas dentre todos os que existem e, provavelmente, dentre todos que podem vir a existir. Isso é uma conseqüência da chamada Tese de Church-Turing, que definimos aqui da seguinte maneira: O modelo Máquina de Turing (ou o λ-cálculo) é capaz de representar tudo aquilo que se chama algoritmo. Ou seja, tudo que se pode calcular por meio de uma máquina real construída pelo homem, também pode ser calculado por meio de uma máquina de Turing. Isso quer dizer que não importa como um computador seja construído de fato. Não importa quanta memória ele tenha nem a maneira de acessá-la. O máximo que podemos conseguir é resolver os mesmos problemas que as máquinas de Turing. Os computadores modernos que usamos, na verdade, têm poder de resolução de problemas igual ao das MTs, se esquecermos apenas a questão da memória (que é infinita nas MTs, mas não nos nossos computadores). Todo 43

44 novo computador que surge não muda em nada essa realidade, pois, os computadores modernos evoluem apenas na velocidade, mas não no poder de resolver problemas. Assim, o modelo matemático Máquina de Turing, apesar da sua simplicidade, é ainda muito importante no estudo da Computação moderna. Aquilo que você provar que ele não pode resolver, estará provando também que não pode ser resolvido por nenhum computador real, nem no presente nem no futuro. Atividades e Orientações para estudo Abaixo apresentamos algumas atividades que servirão para você, cursista, fixar o assunto apresentado. Recomendamos a você que tente resolver e, em caso de dúvidas, que interaja com os tutores e com colegas no ambiente. Questão 1: A linguagem das cadeias na forma a n b n, com n 1, é livre de contexto. Porém a linguagem a n b n c n, com n 1, não é livre de contexto, mas é recursiva. Abaixo mostramos uma MT que recebe entradas sobre o alfabeto {a, b, c} e que decide esta linguagem. Mostre a computação de cada uma das cadeias dadas e diga se cada uma delas é aceita por T 4. 44

45 >> À diagramação: Nas setas, trocar: ponto-e-vírgula por barra /. Trocar também a letra L (left) por E (esquerda) e trocar R (right) por D (direita) << a) ab b) abc c) abbc d) aabc e) aabbcc Questão 2: Dê a representação formal da máquina T 4, usada na questão anterior. Questão 3: Tomando como base a máquina de Turing T 5, com alfabeto de entrada {a,b}, mostre a computação de cada uma das seguintes cadeias e diga se cada cadeia é aceita: 45

46 a) aa b) abba c) aab d) bb Questão 4: Crie uma máquina de Turing com alfabeto de entrada {0,1} que entre em loop infinito para alguma cadeia de entrada. (DICA: você pode fazer uma que fique apagando e reescrevendo algo na fita ou você pode fazer uma para avançar a fita na direção dos símbolos brancos indefinidamente). Questão 5: Responda às seguintes questões: a) O que é um problema de decisão? b) O que é um problema decidível? 46

47 c) Qual a relação entre os dois conceitos? Questão 6: Diga os nomes de todas as classes de linguagens estudadas no curso. Para cada classe de linguagens, diga o nome de um modelo de autômato capaz de decidir exatamente essa classe. Questão 7: Explique, com base na Tese de Church-Turing, qual a relação entre a classe das linguagens recursivas com o conjunto formado por todas as linguagens decidíveis. Explique se são classes iguais ou se uma delas inclui a outra. Saiba mais Todos os livros das referências influenciaram na escrita deste capítulo. No entanto, a definição das máquinas de Turing que demos foi baseada no livro de Hopcroft, Ullman e Motwani e outros autores. Recomendamos ao aluno interessado procurar nesse livro várias definições alternativas para a Máquina de Turing: não-determinística, com múltiplas fitas, com fita infinita apenas à esquerda, etc. Algo interessante que o livro apresenta é a demonstração da equivalência entre todas essas definições e a definição da MT determinística que usamos. 47

48 Capítulo 3 Máquina de Turing Universal e o Problema da Parada No capítulo anterior, vimos as Máquinas de Turing, que são os modelos matemáticos de computadores que têm a maior capacidade de reconhecer linguagens (e de resolver problemas). Capacidade essa que é considerada o limite teórico para todas as máquinas de computar construídas pelo homem, segundo a tese de Church-Turing. O que veremos neste capítulo são os limites do modelo Máquina de Turing. Veremos os dois lados da moeda: a sua admirável capacidade de simular a si próprio e a sua incapacidade de decidir algumas linguagens (e, conseqüentemente, de resolver alguns problemas). Vamos começar discutindo a Máquina de Turing Universal, que é uma MT capaz de simular qualquer outra MT. Depois, usaremos a própria Máquina de Turing Universal para mostrar o Problema da Parada, que é um problema (ou uma linguagem) que não pode ser decidida por nenhuma MT. 3.1 Máquina de Turing Universal (MTU) Até o momento, vimos MTs de propósitos específicos. Ou seja, cada MT que demos como exemplo representava uma única linguagem simples, como: a linguagem das palavras formadas apenas por a s ou a linguagem das palavras a n b n c n, com n 1. Essas MTs seriam como computadores muito restritos que resolvem um só problema. Em contraste, os nossos computadores modernos podem resolver vários problemas só depende do programa que é dado como entrada para ele. Isso 48

49 não seria um indicativo de que os computadores que usamos são mais poderosos do que as MTs? Não! Como já dissemos no capítulo anterior, os computadores modernos são, no máximo, equivalentes às MTs (se esquecermos que eles têm memória finita). E nós vamos mostrar, nesta primeira seção, que também existe uma MT geral que pode ser programada para resolver diversos problemas. Em especial, essa MT pode simular qualquer outra MT imaginável. Por isso, ela recebe o nome de Máquina de Turing Universal ou MTU. De certa forma, a MTU sozinha pode resolver todos os problemas que qualquer outra MT pode resolver. Mas para isso, a MTU precisa receber não só a cadeia w que será testada (ou a entrada de um problema), como também a descrição da MT X que se deseja simular. A MTU, então, vai simular o que X faria ao receber w, retornando, no final, o resultado (sim/não) que X retornaria. A figura abaixo ilustra essa idéia: w descrição de uma MT X Máquina de Turing Universal (vai simular a ação de X quando X recebe w) sim/não Essa descrição de X teria, na MTU, uma importância parecida com a que um programa tem nos computadores que usamos hoje em dia. Isso porque o que ambos fazem (tanto a descrição de X como o programa) é descrever como a máquina deve se comportar. Da mesma forma como usamos diferentes programas para fazer tarefas diferentes nos computadores modernos, também podemos dizer à MTU como resolver diferentes problemas passando para ela as descrições das diversas MTs que decidem cada problema. Um detalhe na figura anterior que ainda não está muito correto é que ela mostra duas entradas para a MTU. No entanto, sabemos que toda Máquina de Turing recebe uma só entrada, que deve ser a cadeia. Na verdade, podemos 49

50 fazer dar uma descrição da máquina X na forma de uma cadeia, que representaremos abstratamente como <X>. Ainda assim, teríamos duas cadeias: <X> e w. Vamos unir essas duas cadeias em uma só cadeia, que vamos representar abstratamente como <X,w>. Assim, quando escrevermos algo como <X,w>, entenda isso como uma cadeia em que podemos separar a parte <X> da parte w, onde a parte <X> é a descrição de uma máquina de Turing e w é uma cadeia de entrada para X. ATENÇÃO Fazer essa codificação de uma máquina de Turing X e de w em uma cadeia única <X, w> pode parecer difícil, mas você pode ter certeza de que é uma tarefa possível! Aliás, é possível transformar em cadeias não só uma MT como também diversas outras informações complexas tais como: figuras, textos, músicas e vídeos. De fato, todas essas informações são codificadas nos nossos computares como cadeias (imensas) do alfabeto binário {0,1}. Para o leitor interessado, nós explicamos detalhadamente no Apêndice A como fazer a codificação <X, w> usando esse mesmo alfabeto. A figura abaixo ilustra a MTU de maneira mais correta, recebendo uma só cadeia: MTU <X, w> (vai simular a ação de X quando X recebe w) sim/não 50

51 Não vamos definir a MTU em todos os seus detalhes, pois essa máquina teria, pelo menos, algumas dezenas de estados. O nosso objetivo é apenas mostrar que é possível usar o modelo Máquina de Turing para criar uma máquina universal que simula qualquer MT. Por isso, no restante da seção, daremos apenas a idéia geral de como essa máquina de Turing Universal funcionaria. Com base nesses detalhes e com algum esforço, um aluno interessado é capaz definir de maneira completa uma MTU. Para o restante da explicação, vamos representar de maneira abstrata como a informação <X, w> é disposta na fita da MTU usando figuras. A figura abaixo mostra como a fita da MTU é iniciada. Considere que à esquerda de X e à direita de w, naturalmente, existem infinitos símbolos brancos. Ao iniciar com a fita assim, a MTU vai acrescentar um espaço para uma terceira informação: uma cadeia representando o estado atual da máquina X. Essa informação será fundamental para simular o funcionamento de X. Inicialmente, a fita teria a descrição do estado inicial q posicionada imediatamente antes da cadeia w assim: O nosso objetivo será usar a fita para simular uma computação na máquina X. Portanto, deixaremos a informação do estado imediatamente antes do próximo símbolo a ser lido da cadeia w, similar à representação das IDs que criamos na seção 2.2 para as MTs. Assim, a região da fita que começou com a cadeia w será sucessivamente alterada para refletir o que X faria na sua fita. Portanto, em um momento qualquer da simulação a fita pode aparecer assim: Veja que esse conteúdo da fita representa uma ID <fita-esquerda> q <fitadireita> na máquina X. (Atenção ao detalhe de que essa não é a ID atual da 51

52 MTU, mas a ID da máquina X que a MTU está simulando na sua fita). O que a MTU irá fazer a partir de uma situação como essa é similar ao que fazemos com as IDs quando representamos uma computação em uma máquina de Turing. Porém, o processo na MTU será um tanto mais trabalhoso por conta das limitações da fita. A cada passo da computação, a MTU irá se comportar assim: 1. Ela irá fazer voltar a cabeça da fita até a definição da máquina X no começo da área útil da fita. Dentro da definição de X, ela irá procurar o trecho que codifica a primeira transição. 2. Digamos que a transição encontrada (mesmo que codificada de outra forma) represente δ(q or, A ler ) = (q dest, A escr, M). 3. A MTU irá comparar se o estado de origem q or da transição é igual ao estado atual da máquina X, representado na figura como o trecho q da fita. o Se forem distintos, ela vai procurar a próxima transição e volta ao passo Se os estados forem iguais, ela irá voltar à transição para ver qual o símbolo que ela precisa ler, que representamos antes como A ler. Em seguida, a MTU, vai comparar A ler com o símbolo atual da fita, que é o primeiro símbolo da região representada como fita-direita. o Se forem distintos, ela vai procurar a próxima transição e volta ao passo 2. 52

53 5. Se os símbolos forem iguais, então a MTU achou a transição a ser realizada na máquina X. Assim, a MTU vai voltar na fita para encontrar os resultados da transição, que são: (q dest, A escr, M). 6. A MTU avança na fita para mudar o estado atual de X, que passará de q para q dest. 7. A MTU vai mudar o símbolo atual de X, que passará de A para A escr. 8. A MTU vai deslocar o estado atual (q dest ) uma posição para a esquerda (ficando a duas posições de distância de A escr ) ou uma posição para a direita (ficando depois do símbolo A escr ), dependendo do valor M (que pode ser E ou D). Esse processo se repete enquanto a MTU encontrar, na descrição de X, alguma transição válida para realizar. Se, em algum momento, a MTU não achar uma transição, a MTU irá considerar que X parou. Nesse momento, a MTU irá procurar, na sua fita, o estado de X. Se for um estado de aceitação, a MTU aceita a cadeia w (indo para o seu estado de aceitação), senão ela rejeita. Dessa forma, ela dará a mesma resposta que X daria, como desejado. Vemos que o comportamento da MTU é um tanto complexo e, por isso, as sua definição completa ficaria enorme. Mas o que queremos que você aprenda aqui é que definir uma MT Universal é algo possível de ser realizado! Isso é um resultado impressionante do modelo MT ele é capaz de simular a si próprio. Nenhum dos outros modelos tem essa capacidade (por exemplo, não podemos construir um AFD que simule qualquer AFD dado como entrada). 53

54 Na próxima seção, usaremos a idéia da MTU para provar outro resultado interessante sobre as MTs. 3.2 O Problema da Parada Vamos começar esta seção falando de uma característica da MTU que criamos antes. O que acontece se a entrada <X,w> descrever uma situação em que a máquina X entra em loop infinito? A MTU vai aceitar ou rejeitar? Como, nesse caso, a MTU apenas simula o comportamento de X (ao receber a cadeia w), vai acontecer com ela exatamente o que aconteceria com X: a MTU vai entrar em loop infinito! Portanto, podemos descrever de maneira informal o comportamento da MTU assim: Ao receber uma entrada <<X>,w>, a MTU: Aceita, se X aceita w Falar Rejeita, que ela se pode X rejeita entrar w em loop... Entra em loop infinito, se X entrar em loop infinito ao receber w Explicar o problema da parada (da aceitação?)... A situação em que a MTU entra em loop não é exatamente um resultado que ela retorna, mas é um caso em que ela fica processando indefinidamente e não retorna nenhum resultado (como explicamos na seção 2.2 deste volume). Na verdade, os únicos resultados que desejamos obter da MTU (ou de qualquer MT) são apenas um dos dois: ACEITA ou REJEITA. A grande questão que queremos discutir nessa seção é se é possível construir alguma MTU que sempre retorne um desses resultados e que nunca entre em loop. Construída da maneira que explicamos na seção anterior, realmente a MTU pode entrar em loop infinito, mas talvez exista outra maneira de construir uma MTU melhorada em que isso não aconteça. 54

55 Para construir essa MTU melhorada, seria preciso lidar com o chamado Problema da Parada: Dada uma máquina de Turing X e uma cadeia w, identificar se X vai parar (ou se vai entrar em loop infinito) ao receber a cadeia w. Se existir algum algoritmo (ou uma MT) para resolver esse problema, então podemos construir a MTU melhorada usando esse algoritmo como parte dela. A idéia para fazer essa nova MTU seria a seguinte: primeiro, ela testaria se a entrada <X,w> vai parar. Se a resposta for sim, ela simularia normalmente a entrada (seguindo a idéia que ensinamos na seção anterior). Se for não, ela rejeitaria diretamente essa entrada, sem simular nada. Veja, que, na verdade, estamos mostrando que as duas questões abaixo estão interligadas: Será que temos como construir uma MTU melhorada que nunca entra em loop? Será que temos como prever que uma MT vai entrar em loop antes mesmo de simulá-la? (O problema da parada tem solução?) Se encontrarmos a resposta de uma das duas questões, automaticamente estaremos encontrando a resposta da outra. Se existir uma máquina que decide o problema da parada, então existe uma MTU melhorada que nunca entra em loop e vice-versa. E se não existir uma máquina que decide o problema da parada, também não existe a MTU melhorada! Infelizmente, não existe solução para o problema da parada e, portanto, a resposta para ambas as perguntas acima é NÃO. O restante desta seção será dedicado a provar isso. Mas como ambas as perguntas são interligadas, vamos provar apenas a primeira delas: vamos provar que não existe a tal MTU melhorada que nunca entra em loop! A demonstração que apresentaremos é o que, na Matemática, se chamada de prova por contradição. Uma prova matemática apresenta argumentos lógicos que nos permitem concluir com segurança que uma proposição P é 55

56 verdadeira. Na prova por contradição, no entanto, nós começamos assumindo hipoteticamente que a proposição P é falsa. A partir daí, desenvolvemos um raciocínio até chegar em algo matematicamente contraditório. Chegar nesse ponto contraditório significa que assumimos errado no início ou seja, P só pode ser verdadeira! No nosso caso, a proposição será que não existe uma MTU que nunca entra em loop. Mas, para provar por contradição, vamos começar assumindo o contrário: Existe uma MTU que nunca entra em loop A partir de agora, nosso objetivo nessa demonstração matemática é mostrar que, se a afirmação acima for verdade, então algumas coisas sem sentido também teriam que ser verdade. Chegando nesse ponto, poderemos concluir que a proposição acima é falsa. Por enquanto, vamos prosseguir assumindo que a proposição é verdadeira. Bem, a afirmação acima nos garante que existe a MTU melhorada de que falamos antes. Não sabemos como construí-la, mas, por enquanto, estamos assumindo que ela pode ser construída de alguma maneira. Vamos chamar essa MTU melhorada de M e o seu comportamento seria assim: Ao receber uma entrada <<X>,w>, a máquina M: Aceita, se X aceita w Rejeita, se X rejeita w Rejeita, se X entrar em loop infinito ao receber w Podemos simplificar a descrição dos dois casos de rejeição descrevendo o comportamento da máquina assim: 56

57 Ao receber uma entrada <X,w>, a máquina M: Aceita, se X aceita w Rejeita, se X não aceita w Assim como a MTU, essa máquina M recebe duas entradas codificadas em uma só cadeia: uma máquina de Turing X e uma cadeia w. Como a máquina X também está codificada como cadeia, poderíamos passar ela no lugar da entrada w, assim: <X,<X>>. Nesse caso, estaríamos testando se a máquina X aceita a sua própria descrição <X>. Isso não é nenhum problema, pois <X> é uma cadeia qualquer e pode ser dada como entrada até mesmo para a própria máquina X. O detalhe aqui é que ao invés de fazer isso diretamente, estaríamos simulando essa situação usando M. Bem, para a nossa prova, será melhor considerar uma máquina à parte que simula essa situação em que X recebe <X>. Essa nova máquina será chamada de Z e queremos que ela receba apenas a descrição <X> de uma MT. Ao receber essa entrada, ela irá operar de maneira similar a M quando recebe <X,<X>>, mas vamos considerar que Z irá retornar o contrário do que M retornaria. Assim, podemos descrever o comportamento de Z da seguinte maneira: Ao receber uma entrada <X>, a máquina Z: Rejeita, se X aceita <X> Aceita, se X não aceita <X> Não dar detalhes maiores da construção de Z, mas, ela pode ser construída a partir M com pequenas alterações. Quer dizer, o que importa para nós é que, se M existe, então Z também existe. Agora, queremos que você pense na seguinte situação: o que aconteceria se a máquina Z recebesse como entrada a sua própria descrição na forma de 57

58 cadeia <Z>? Qual seria a resposta da máquina? É importante que você reflita por alguns instantes sobre se cada resposta que Z poderia retornar. Pense em se faz sentido dizer que Z retornaria ACEITA e, depois, pense se faz sentido dizer que Z retornaria REJEITA, nesse caso. Se achar necessário, releia a descrição de Z para chegar a alguma conclusão. (Porém, não se demore demais nessa questão porque a resposta, dada abaixo, deve surpreendê-lo). Se você se esforçou um pouco, deve ter percebido que não é fácil chegar a uma conclusão sobre a resposta que Z retornaria ao receber Z. Na verdade, essa resposta é impossível de ser dada porque cada possível resposta seria contraditória, considerando o propósito da máquina Z. Com base na descrição dada antes, vamos analisar separadamente cada uma das possíveis respostas para você perceber as contradições existentes. Lembramos que a questão é: o que aconteceria se Z recebesse a entrada <Z>? Podemos substitui a entrada <X> por <Z> na descrição para ver as condições necessárias para a máquina Z dar cada resposta. Veja que, pela descrição, a resposta seria REJEITA somente se Z aceita Z. Quer dizer, a máquina Z rejeitaria <Z>, se ela aceitasse <Z>! Essa é uma condição claramente contraditória do ponto de vista lógico e matemático. A outra possibilidade também levaria a uma contradição: a máquina daria a resposta ACEITA somente se Z não aceita <Z>. Mais uma vez temos uma contradição. Resumindo as duas contradições: Quando Z recebe <Z>, ela retornaria REJEITA, se Z aceita <Z>. Quando Z recebe <Z>, ela retornaria ACEITA, se Z não aceita <Z>. Quer dizer, a condição para Z dar uma resposta é que ela dê a resposta oposta, o que é uma contradição. O que concluímos é que não pode existir a máquina de Turing Z. Mas nós só imaginamos a máquina Z porque havíamos assumido que havia uma MTU melhorada M que nunca entra em loop. Se Z não existe, somos obrigados a concluir que M não existe e que assumimos uma proposição errada no início. Ou seja, a verdade é que: Não existe nehuma MTU que nunca entre em loop 58

59 Isso significa que o problema da parada (testar se uma máquina X vai parar ao receber uma cadeia w) não tem uma solução. Ou seja, ele é um problema indecidível. Esse é um resultado curioso que mostra uma limitação do modelo Máquinas de Turing. Se na seção anterior, mostramos que esse modelo é poderoso o suficiente para permitir a ele simular a si próprio, nessa seção mostramos que ele não é poderoso o suficiente para decidir todos os problemas imagináveis. Devido à Tese de Church-Turing, essa limitação das MTs é uma limitação que vale também para qualquer máquina real construída pelo homem, inclusive os computadores mais modernos que existem hoje nenhum deles é capaz de resolver o problema da parada. Assim como o problema da parada, existem diversos problemas matemáticos que são podem ser decididos por nenhum computador. Outros exemplos desses chamados problemas indecidíveis são: Testar se um programa de computador vai entrar em loop infinito. (Similar ao problema da parada). Testar se uma linguagem decidida por uma MT pode ser decidida por um AFD. Testar se um polinômio de múltiplas variáveis (como: 5x 2 y 3 + 3x 2 + y 3-10) tem raízes inteiras. É importante não só que você saiba que existem problemas indecidíveis como também que conheça alguns deles. Assim, quando você se deparar com um deles, você não irá perder tempo tentando criar um programa para resolvêlos (afinal de contas, você não conseguiria). Até onde se sabe hoje em dia, esses problemas representam um limite teórico intransponível para a Computação. Atividades e Orientações para estudo 59

60 Abaixo apresentamos alguns exercícios para ajudar você, aluno, a fixar o assunto. Questão 1: Não demos detalhes muito profundos da definição da MTU, mas mostramos a idéia geral de como defini-la. Pedimos que você pense e descreva como definir os seguintes detalhes adicionais da MTU ao receber uma entrada <X,w>: a) Como fazer para representar o estado, considerando que a máquina <X> pode ter uma quantidade qualquer de estados. (Dica: use idéia semelhante à que descrevemos no apêndice A)? b) Descreva detalhes de como comparar o estado atual com o estado da transição (etapa 3 do passo-a-passo dado). Assim como os detalhes de como comparar o símbolo atual com símbolo lido na transição (etapa 4). c) Como fazer para deslocar o estado atual de X mais para a esquerda ou mais para a direita na fita da MTU (etapa 8)? d) Como permitir que a máquina X ande e escreva símbolos infinitamente para a esquerda da fita de X. Veja que, se a MTU for mal planejada, isso poderia fazê-la apagar a própria descrição de X. Questão 2: Os computadores modernos podem ser programados para fazer diversas tarefas. Isso porque podemos escrever um programa para dizer o que queremos que eles façam ou calculem. A MTU permite algo semelhante. Explique como a MTU permite ser programada externamente (ou seja, diga que estrutura na MTU tem função semelhante ao de um programa de um computador real). Questão 3: Cite dois problemas indecidíveis. 60

61 Questão 4: Pesquise sobre algum problema indecidível que não foi citado neste capítulo. Descreva a entrada do problema e o que ele deseja reconhecer nessa entrada. 61

62 Apêndice A Codificando Máquinas de Turing como Cadeias Como vimos na seção 2.3 deste volume, uma máquina de Turing X qualquer pode ser descrita por meio de uma tupla X=(Q,Σ,Γ,δ,s,,F). Essa definição será o ponto de partida para representarmos X como uma cadeia. Uma primeira idéia seria simplesmente escrever a definição formal em uma só linha e usá-la como cadeia. Porém, nesse caso, teríamos que usar um alfabeto com muitos símbolos, que é algo que não desejamos. O que nós vamos querer é codificar uma MT usando o seu próprio alfabeto de entrada. Para simplificar, vamos considerar apenas o alfabeto de entrada {0,1}. Ou seja, vamos trabalhar com as máquinas de Turing na forma: X = (Q, {0,1}, Γ, δ, s,, F) Agora o problema será representar todas as máquinas desse tipo usando apenas 0 s e 1 s. A idéia básica dessa representação será transformar todos os elementos de cada conjunto da definição em números naturais maiores que zero. Em especial, basta numerar os elementos dos conjuntos Q, Γ e os movimentos da cabeça, pois as outras partes da definição são dadas a partir deles. Cada um desses conjuntos usará uma numeração separada, que descreveremos, por enquanto, como #n (para algum valor n). Seguindo a ordem em que aparece na definição formal, vamos começar falando do conjunto de estados Q. Vamos considerar que cada MT terá, pelo menos dois estados. Cada estado será representado por um número, que pode ir de #1 a infinito O estado #1 será sempre o estado inicial e o estado #2 será sempre o estado de aceitação, que será único. (Isso não é um problema porque toda MT com vários estados de aceitação pode ser convertida para 62

63 uma MT com um só estado de aceitação). Os outros estados podem ser numerados de qualquer maneira com números a partir de #3. Isso pode ser resumido pela tabela abaixo: Número Estado que representa #1 Estado inicial #2 Estado de aceitação #n, para n > 2 Quaisquer outros estados Agora vamos falar do alfabeto de fita Γ, que inclui o alfabeto de entrada {0,1}, pela definição dada na seção 2.3. Também vamos representar cada símbolo desse alfabeto com um número de #1 a infinito. O símbolo 0 será representado pelo número #1 (não usamos #0 porque, como foi dito antes, os números precisam ser maiores que zero). Já o símbolo 1 será representado como #2. O símbolo branco ( ) também faz parte desse alfabeto e será representado como #3. Quanto aos demais símbolos de Γ, eles vão variar de máquina para máquina. Em todas elas, no entanto, eles têm uma função meramente auxiliar. Por isso, eles podem ser representados, em qualquer ordem, por quaisquer números a partir de #4. Por exemplo, se a MT usa os símbolos A e B, podemos representar com {A=#4 e B=#5} ou {A=#5 e B=#4}, etc. A tabela abaixo resume a representação dos símbolos: Número Símbolo que representa #1 0 63

64 #2 1 #3 Símbolo branco #n, para n > 3 Quaisquer outros símbolos que não sejam símbolos de entrada Ao descrevermos a representação númerica de Q e Γ, veja que acabamos por descrever também como representar s (o estado inicial), F (o conjunto de estados de aceitação) e (o símbolo branco). O que falta agora é a função de transição δ, que é a parte mais importante. Aliás, a representação da função de transição já será a representação final da máquina de Turing, pois todas as outras informações da MT podem ser obtidas a partir dela. Na representação da função, vamos assumir que o movimento E (esquerda) será representado por #1 e D (direita) será representado como #2, como mostra a tabela abaixo: Número Movimento que representa #1 E (esquerda) #2 D (direita) Com isso, podemos definir cada transição de δ usando apenas valores numéricos. Por exemplo, uma transição: δ( q inicio, 0 ) = (q aceita,, D) 64

65 Assumindo que q inicio é o estado inicial e q aceita o estado de aceitação, a transição pode ser descrita assim: δ( #1, #1 ) = ( #2, #3, #2) Ou seja, cada transição pode ser vista simplesmente como uma seqüência de cinco números: #1, #1, #2, #3, #2. O desafio, agora, é representar cada seqüência dessas como uma cadeia de 0 s e 1 s. Mas como fazer isso? É mais simples do que parece. Podemos simplesmente contar cada número usando repetidos 0 s. Por exemplo, #3 seria representado como 000 e o número #2 como 00. Para separar os cinco números da transição, colocamos símbolos 1 entre eles. Assim, a transição dada antes seria representada com a cadeia Cada subcadeia de 0 s está associada a um dos números da transição como indica a figura abaixo: De forma geral, cada transição δ( #m, #n ) = ( #o, #p, #q) será representada por uma cadeia na forma (0 #m )1(0 #n )1(0 #p )1(0 #q ), onde os parênteses são apenas para agrupamento (não são parte da cadeia). As transições de δ devem ser todas convertidas da maneira explicada. Isso irá gerar várias cadeias, que deverão ser concatenadas para formar uma só cadeia. Porém, para permitir identificar cada transição individualmente, usaremos uma subcadeia 11 para separar as transições entre si. Pronto, depois disso, a cadeia final produzida será a representação final da máquina de Turing! Como exemplo, vamos usar a máquina T dada abaixo parar criar a cadeia <T> que a representa. Vamos considerar que o seu alfabeto de entrada é {0,1} e o seu alfabeto de fita é {0,1,,K}: 65

66 Veja que essa máquina de Turing possui as seguintes transições: δ( qa, 0 ) = ( qb, 0, D ) δ( qb, 1 ) = ( qb, K, D ) δ( qb, ) = ( qc, K, E ) Como explicamos antes, qa, por ser estado inicial, deverá ser representado pelo número #1 e qc, por ser estado de aceitação, pelo número #2. O estado qb poderia ser representado por qualquer outro número, mas escolheremos o número #3. Quanto aos símbolos, lembre-se que 0 é representado por #1, 1 é representado por #2 e é representado por #3, obrigatoriamente. O símbolo K poderia ser representado por qualquer outro número, mas usaremos #4. Assim, as transições acima podem ser representadas pelas seguintes cadeias: Separando essas cadeias por 11 e concatenando tudo, teremos a cadeia final que representa T: <T> =

Linguagens Formais e Autômatos. Autômatos Finitos Determinísticos (AFD)

Linguagens Formais e Autômatos. Autômatos Finitos Determinísticos (AFD) Linguagens Formais e Autômatos Autômatos Finitos Determinísticos (AFD) Cristiano Lehrer, M.Sc. Linguagens Regulares A teoria da computação começa com uma pergunta: O que é um computador? É, talvez, uma

Leia mais

Capítulo 9: Linguagens sensíveis ao contexto e autômatos linearmente limitados.

Capítulo 9: Linguagens sensíveis ao contexto e autômatos linearmente limitados. Capítulo 9: Linguagens sensíveis ao contexto e autômatos linearmente limitados. José Lucas Rangel 9.1 - Introdução. Como já vimos anteriormente, a classe das linguagens sensíveis ao contexto (lsc) é uma

Leia mais

Teoria da Computação. Unidade 3 Máquinas Universais. Referência Teoria da Computação (Divério, 2000)

Teoria da Computação. Unidade 3 Máquinas Universais. Referência Teoria da Computação (Divério, 2000) Teoria da Computação Referência Teoria da Computação (Divério, 2000) 1 L={(0,1)*00} de forma que você pode usar uma Máquina de Turing que não altera os símbolos da fita e sempre move a direita. MT_(0,1)*00=({0,1},{q

Leia mais

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

Modelos de Computação Folha de trabalho n. 10 Modelos de Computação Folha de trabalho n. 10 Nota: Os exercícios obrigatórios marcados de A a D constituem os problemas que devem ser resolvidos individualmente. A resolução em papel deverá ser depositada

Leia mais

Teoria da Computação. Capítulo 1. Máquina de Turing. Prof. Wanderley de Souza Alencar, MSc.

Teoria da Computação. Capítulo 1. Máquina de Turing. Prof. Wanderley de Souza Alencar, MSc. Teoria da Computação Capítulo 1 Máquina de Turing Prof. Wanderley de Souza Alencar, MSc. Pauta 1. Introdução 2. Definição de Máquina de Turing 3. Variações de Máquina de Turing 4. A Tese de Church-Turing

Leia mais

Draft-v0.1. Máquinas de Turing Máquinas de Turing

Draft-v0.1. Máquinas de Turing Máquinas de Turing 13 Máquinas de Turing A necessidade de formalizar os processos algorítmicos levou, nas décadas 20 e 30 do século XX, a diversos estudos, entre os quais os de Post, Church e Turing, com vista a estudo formal

Leia mais

Universidade Federal de Alfenas

Universidade Federal de Alfenas Universidade Federal de Alfenas Linguagens Formais e Autômatos Aula 14 Máquinas de Turing humberto@bcc.unifal-mg.edu.br Última aula Autômatos com Pilha Controle de estado a b a a b X Y Y X O que já vimos...

Leia mais

Apostila 06. Objetivos: Estudar a Computabilidade Estudar a Decidibilidade Estudar a Redutibilidade

Apostila 06. Objetivos: Estudar a Computabilidade Estudar a Decidibilidade Estudar a Redutibilidade Cursos: Bacharelado em Ciência da Computação e Bacharelado em Sistemas de Informação Disciplinas: (1493A) Teoria da Computação e Linguagens Formais, (4623A) Teoria da Computação e Linguagens Formais e

Leia mais

Aula 7: Autômatos com Pilha

Aula 7: Autômatos com Pilha Teoria da Computação Segundo Semestre, 2014 Aula 7: Autômatos com Pilha DAINF-UTFPR Prof. Ricardo Dutra da Silva Vamos adicionar um memória do tipo pilha ao nossos autômatos para que seja possível aceitar

Leia mais

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

UNIVERSIDADE FEDERAL RURAL DO SEMI-ÁRIDO CURSO: CIÊNCIA DA COMPUTAÇÃO. Prof.ª Danielle Casillo UNIVERSIDADE FEDERAL RURAL DO SEMI-ÁRIDO CURSO: CIÊNCIA DA COMPUTAÇÃO Prof.ª Danielle Casillo Diferencia-se das máquinas de Turing e Post principalmente pelo fato de possuir a memória de entrada separada

Leia mais

Linguagens recursivamente enumeráveis

Linguagens recursivamente enumeráveis Linguagens recursivamente enumeráveis Uma palavra x Σ é aceite por uma máquina de Turing M ( x L(M)) se M iniciando com a palavra x na fita e no estado inicial, pára num estado final. Caso contrário, M

Leia mais

1. Uma linguagem de uma máquina de Turing

1. Uma linguagem de uma máquina de Turing Linguagem de uma Máquina de Turing 1. Uma linguagem de uma máquina de Turing, é. 2. Linguagens aceitas por uma MT são chamdas recursivamente enumeráveis. O recursivo nesta caso significa decidível, ou

Leia mais

Linguaguens recursivamente enumeráveis

Linguaguens recursivamente enumeráveis Linguaguens recursivamente enumeráveis Uma palavra x Σ é aceite por uma máquina de Turing M ( x L(M)) se M iniciando com a palavra x na fita e no estado inicial, pára num estado final. Caso contrário,

Leia mais

Capítulo 8: O problema da parada. Decidibilidade e computabilidade. José Lucas Rangel Introdução.

Capítulo 8: O problema da parada. Decidibilidade e computabilidade. José Lucas Rangel Introdução. Capítulo 8: O problema da parada. Decidibilidade e computabilidade. José Lucas Rangel 8.1 - Introdução. Como observado no capítulo anterior, podemos substituir a definição informal de procedimento pela

Leia mais

SCC 205 Teoria da Computação e Linguagens Formais

SCC 205 Teoria da Computação e Linguagens Formais Universidade de São Paulo Instituto de Ciências Matemáticas e de Computação Departamento de Ciências de Computação SCC 205 Teoria da Computação e Linguagens Formais Autômatos com pilha Lista 3 1. Dê um

Leia mais

Computação efectiva. Que linguagens podem ser reconhecidas por algum tipo de autómato?

Computação efectiva. Que linguagens podem ser reconhecidas por algum tipo de autómato? Computação efectiva Que linguagens podem ser reconhecidas por algum tipo de autómato? O que é ser computável? Que linguagens são computáveis? Existem linguagens que não são computáveis? Isto é, existem

Leia mais

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

SCC Capítulo 3 Linguagens Sensíveis ao Contexto e Autômatos Limitados Linearmente SCC-505 - Capítulo 3 Linguagens Sensíveis ao Contexto e João Luís Garcia Rosa 1 1 Departamento de Ciências de Computação Instituto de Ciências Matemáticas e de Computação - Universidade de São Paulo http://www.icmc.usp.br/~joaoluis

Leia mais

Linguaguens recursivamente enumeráveis e recursivas

Linguaguens recursivamente enumeráveis e recursivas Linguaguens recursivamente enumeráveis e recursivas Uma linguagem diz-se recursivamente enumerável (r.e) ou semi-decidível se é aceite por uma máquina de Turing. SD: classe de linguagens recursivamente

Leia mais

UNIVERSIDADE ESTADUAL DE MARINGÁ DEPARTAMENTO DE INFORMÁTICA

UNIVERSIDADE ESTADUAL DE MARINGÁ DEPARTAMENTO DE INFORMÁTICA UNIVERSIDADE ESTADUAL DE MARINGÁ DEPARTAMENTO DE INFORMÁTICA Máquina de Turing Prof. Yandre Maldonado - 1 Prof. Yandre Maldonado e Gomes da Costa yandre@din.uem.br Teoria da Computação Ciência da Computação

Leia mais

Universidade de São Paulo Instituto de Ciências Matemáticas e de Computação Departamento de Ciências de Computação

Universidade de São Paulo Instituto de Ciências Matemáticas e de Computação Departamento de Ciências de Computação Universidade de São Paulo Instituto de Ciências Matemáticas e de Computação Departamento de Ciências de Computação SCC-0505 INTRODUÇÃO À TEORIA DA COMPUTAÇÃO Lista de Exercícios do Capítulo 3 Gramáticas

Leia mais

Linguagens Livres de Contexto

Linguagens Livres de Contexto Universidade Católica de Pelotas Centro Politécnico Bacharelado em Ciência da Computação 364018 Linguagens Formais e Autômatos TEXTO 4 Linguagens Livres de Contexto Prof. Luiz A M Palazzo Maio de 2011

Leia mais

Máquinas de Turing 3

Máquinas de Turing 3 Máquinas de Turing 3 Exercícios Máquinas de Turing com Múltiplas Fitas Máquinas de Turing Não-deterministicas A Tese/Hipótese de Church-Turing Linguagens decidíveis por Máquinas de Turing (Recursivas)

Leia mais

a n Sistemas de Estados Finitos AF Determinísticos

a n Sistemas de Estados Finitos AF Determinísticos a n Sistemas de Estados Finitos AF Determinísticos 1 Relembrando Uma representação finita de uma linguagem L qualquer pode ser: 1. Um conjunto finito de cadeias (se L for finita); 2. Uma expressão de um

Leia mais

PCC104 - Projeto e Análise de Algoritmos

PCC104 - Projeto e Análise de Algoritmos PCC104 - Projeto e Análise de Algoritmos Marco Antonio M. Carvalho Departamento de Computação Instituto de Ciências Exatas e Biológicas Universidade Federal de Ouro Preto 5 de dezembro de 2017 Marco Antonio

Leia mais

Universidade Federal de Alfenas

Universidade Federal de Alfenas Universidade Federal de Alfenas Linguagens Formais e Autômatos Aula 15 Máquinas de Turing (parte 2) humberto@bcc.unifal-mg.edu.br Última Aula Uma Máquina de Turing (MT) possui: uma fita infinita para representar

Leia mais

Universidade Federal de Alfenas

Universidade Federal de Alfenas Universidade Federal de Alfenas Linguagens Formais e Autômatos Aula 13 Autômato com Pilha humberto@bcc.unifal-mg.edu.br Última aula Linguagens Livres do Contexto P(S*) Recursivamente enumeráveis Recursivas

Leia mais

Redutibilidade. Mário S. Alvim Fundamentos de Teoria da Computação (FTC) DCC-UFMG (2018/02)

Redutibilidade. Mário S. Alvim Fundamentos de Teoria da Computação (FTC) DCC-UFMG (2018/02) Redutibilidade Mário S. Alvim (msalvim@dcc.ufmg.br) Fundamentos de Teoria da Computação (FTC) DCC-UFMG (2018/02) Mário S. Alvim (msalvim@dcc.ufmg.br) Redutibilidade DCC-UFMG (2018/02) 1 / 46 Redutibilidade:

Leia mais

Autómatos de Pilha. Cada transição é caracterizada pelo estado, símbolo que está ser lido e o elemento no topo da pilha. dados de entrada.

Autómatos de Pilha. Cada transição é caracterizada pelo estado, símbolo que está ser lido e o elemento no topo da pilha. dados de entrada. Autómatos de Pilha Um autómato de pilha (não determinístico) (AP) é um autómato finito não determinístico com transições ɛ, acrescido de uma memória infinita a pilha mas em que o modo de acesso à informação

Leia mais

LINGUAGENS FORMAIS E AUTÔMATOS

LINGUAGENS FORMAIS E AUTÔMATOS LINGUAGENS FORMAIS E AUTÔMATOS O objetivo deste curso é formalizar a idéia de linguagem e definir os tipos de sintaxe e semântica. Para cada sintaxe, analisamos autômatos, ue são abstrações de algoritmos.

Leia mais

Curso: Ciência da Computação Turma: 6ª Série. Teoria da Computação. Aula 4. Autômatos Finitos

Curso: Ciência da Computação Turma: 6ª Série. Teoria da Computação. Aula 4. Autômatos Finitos Curso: Ciência da Computação Turma: 6ª Série Aula 4 Autômatos Finitos Autômatos Finitos Não Determinísticos Um autômato finito não-determinístico (AFND, ou NFA do inglês) tem o poder de estar em vários

Leia mais

Linguagem Universal. assim como a entrada ser processada por a. (b) A segunda fita de representa a fita de

Linguagem Universal. assim como a entrada ser processada por a. (b) A segunda fita de representa a fita de Linguagem Universal 1. Uma máquina de Turing representa um PC? Ou representa um possível problema que um PC pode resolver? 2. Uma máquina de Turing pode ser utilizada para simular uma de Turing máquina.

Leia mais

Teoria da Computação. Computabilidade e complexidade computacional

Teoria da Computação. Computabilidade e complexidade computacional Teoria da Computação Computabilidade e complexidade computacional 1 Computabilidade e Complexidade Computabilidade: verifica a existência de algoritmos que resolva uma classe de linguagens trata a possibilidade

Leia mais

Aula 9: Máquinas de Turing

Aula 9: Máquinas de Turing Teoria da Computação Aula 9: Máquinas de Turing DAINF-UTFPR Prof. Ricardo Dutra da Silva Uma máquina de Turing é uma máquina de estados finitos que pode mover o cabeçote em qualquer direção, ler e manipular

Leia mais

Máquina de Turing Linguagens Sensíveis ao Contexto e Enumeráveis Recursivamente

Máquina de Turing Linguagens Sensíveis ao Contexto e Enumeráveis Recursivamente ESIN/UCPel 058814 Linguagens Formais e Autômatos TEXTO 5 Máquina de Turing Linguagens Sensíveis ao Contexto e Enumeráveis Recursivamente Prof. Luiz A M Palazzo Maio de 2007 0. Introdução A Ciência da Computação

Leia mais

Teoria da Computação. Máquinas Universais Máquina com Pilhas

Teoria da Computação. Máquinas Universais Máquina com Pilhas Máquinas Universais Máquina com Pilhas Cristiano Lehrer Introdução A Máquina com Pilhas diferencia-se das Máquinas de Turing e de Post principalmente pelo fato de possuir uma memória de entrada separada

Leia mais

Modelos Universais de Computação

Modelos Universais de Computação Modelos Universais de Computação 1 Equivalência entre Variantes de TM TM s definem naturalmente uma classe. Toda variante razoável de TM define a mesma classe de linguagens. (reforça a Tese Church-Turing)

Leia mais

Computabilidade e Complexidade (ENG10014)

Computabilidade e Complexidade (ENG10014) Sistemas de Informação Computabilidade e Complexidade (ENG10014) Profa. Juliana Pinheiro Campos E-mail: jupcampos@gmail.com Modelo de computação poderoso concebido pelo matemático britânico Alan Turing

Leia mais

Computabilidade e Complexidade (ENG10014)

Computabilidade e Complexidade (ENG10014) Sistemas de Informação Computabilidade e Complexidade (ENG10014) Profa. Juliana Pinheiro Campos E-mail: jupcampos@gmail.com Decidibilidade O estudo da decidibilidade objetiva determinar a solucionabilidade

Leia mais

Máquina de Turing. Controle finito

Máquina de Turing. Controle finito Máquinas de Turing Máquinas de Turing podem fazer tudo o que um computador real faz. Porém, mesmo uma Máquina de Turing não pode resolver certos problemas. Estes problemas estão além dos limites teóricos

Leia mais

Máquinas de Turing (MT)

Máquinas de Turing (MT) Linguagens Formais e Autômatos Máquinas de Turing (MT) Andrei Rimsa Álvares Material extraído do livro e slides do Prof. Newton Vieira (hcp://dcc.ufmg.br/~nvieira) Sumário Introdução Máquinas de Turing

Leia mais

Linguagens livres de contexto e autômatos de pilha

Linguagens livres de contexto e autômatos de pilha Capítulo 6: Linguagens livres de contexto e autômatos de pilha José Lucas Rangel, maio 1999 6.1 - Introdução. Os aceitadores, ou reconhecedores, das linguagens livres de contexto são os chamados autômatos

Leia mais

INE5317 Linguagens Formais e Compiladores AULA 5: Autômatos Finitos

INE5317 Linguagens Formais e Compiladores AULA 5: Autômatos Finitos INE5317 Linguagens Formais e Compiladores AULA 5: Autômatos Finitos Ricardo Azambuja Silveira INE-CTC-UFSC E-Mail: silveira@inf.ufsc.br URL: www.inf.ufsc.br/~silveira As Linguagens e os formalismos representacionais

Leia mais

Linguagens Regulares. Prof. Daniel Oliveira

Linguagens Regulares. Prof. Daniel Oliveira Linguagens Regulares Prof. Daniel Oliveira Linguagens Regulares Linguagens Regulares ou Tipo 3 Hierarquia de Chomsky Linguagens Regulares Aborda-se os seguintes formalismos: Autômatos Finitos Expressões

Leia mais

ECO026 TEORIA DA COMPUTAÇÃO. Prof: Rafael Santos Site:

ECO026 TEORIA DA COMPUTAÇÃO. Prof: Rafael Santos   Site: ECO026 TEORIA DA COMPUTAÇÃO Prof: Rafael Santos Email: rafafic@gmail.com Site: http://sites.google.com/site/rafafic Máquinas de Turing Uma linguagem Turing-reconhecível (Linguagem recursivamente enumeravel),

Leia mais

Máquinas de Turing - Computabilidade

Máquinas de Turing - Computabilidade BCC244-Teoria da Computação Prof. Lucília Figueiredo Lista de Exercícios 03 DECOM ICEB - UFOP Máquinas de Turing - Computabilidade 1. Seja L uma linguagem não livre de contexto. Mostre que: (a) Se X uma

Leia mais

Aula 3: Autômatos Finitos

Aula 3: Autômatos Finitos Teoria da Computação Primeiro Semestre, 25 Aula 3: Autômatos Finitos DAINF-UTFPR Prof. Ricardo Dutra da Silva Um procedimento ue determina se uma string de entrada pertence à uma linguagem é um reconhecedor

Leia mais

UNIVERSIDADE ESTADUAL DE MARINGÁ DEPARTAMENTO DE INFORMÁTICA

UNIVERSIDADE ESTADUAL DE MARINGÁ DEPARTAMENTO DE INFORMÁTICA UNIVERSIDADE ESTADUAL DE MARINGÁ DEPARTAMENTO DE INFORMÁTICA Máquina de Turing Prof. Yandre Maldonado - 1 Prof. Yandre Maldonado e Gomes da Costa yandre@din.uem.br Teoria da Computação Ciência da Computação

Leia mais

UNIVERSIDADE DA BEIRA INTERIOR

UNIVERSIDADE DA BEIRA INTERIOR UNIVERIDADE DA EIRA INTERIOR Teoria da Computação Eng. Informática 2º emestre Frequência 2 (7 valores) Resolução 30/maio/2017 A. Expressões regulares e autómatos finitos 1. [1.25] Usando o método de eliminação

Leia mais

Problemas Computáveis

Problemas Computáveis Indecidibilidade Problemas Computáveis Máquinas de Turing ou Problemas Computáveis ou Linguagens Recursivamente Enumeráveis LER (*) podem ser divididas em 2 classes: as MT que sempre param (Algoritmos),

Leia mais

Aula 3: Autômatos Finitos

Aula 3: Autômatos Finitos Teoria da Computação Segundo Semestre, 24 Aula 3: Autômatos Finitos DAINF-UTFPR Prof. Ricardo Dutra da Silva Um procedimento ue determina se uma string de entrada pertence à uma linguagem é um reconhecedor

Leia mais

Autômato com pilha. IBM1088 Linguagens Formais e Teoria da Computação. Evandro Eduardo Seron Ruiz

Autômato com pilha. IBM1088 Linguagens Formais e Teoria da Computação. Evandro Eduardo Seron Ruiz Autômato com pilha IBM1088 Linguagens Formais e Teoria da Computação Evandro Eduardo Seron Ruiz evandro@usp.br Departmento de Computação e Matemática FFCLRP Universidade de São Paulo E.E.S Ruiz (DCM USP)

Leia mais

Melhores momentos AULA PASSADA. Complexidade Computacional p. 136

Melhores momentos AULA PASSADA. Complexidade Computacional p. 136 Melhores momentos AULA PASSADA Complexidade Computacional p. 136 Configurações controle q 7 cabeça 1 0 1 1 0 1 1 1 fita de leitura e escrita Configuração 1 0 1q 7 1 0 1 1 1 Complexidade Computacional p.

Leia mais

Teoria da Computação. Máquinas de Turing: variações

Teoria da Computação. Máquinas de Turing: variações Teoria da Computação Máquinas de Turing: variações 1 Máquina de Turing Modelo mais completo, feito com circuitos digitais http://aturingmachine.com 2 Máquina de Turing Modelo mais simplificado, feito com

Leia mais

Universidade Federal de Alfenas

Universidade Federal de Alfenas Universidade Federal de Alfenas Linguagens Formais e Autômatos Aula 16 Decidibilidade humberto@bcc.unifal-mg.edu.br Últimas Aulas Uma Máquina de Turing (MT) possui: uma fita infinita para representar a

Leia mais

Máquina de Turing. Controle finito

Máquina de Turing. Controle finito Máquinas de Turing Máquinas de Turing podem fazer tudo o que um computador real faz. Porém, mesmo uma Máquina de Turing não pode resolver certos problemas. Estes problemas estão além dos limites teóricos

Leia mais

A. (Autómatos finitos determinísticos e não determinísticos AFD e AFND)

A. (Autómatos finitos determinísticos e não determinísticos AFD e AFND) DEP. INFORMÁTICA - UNIVERSIDADE DA BEIRA INTERIOR Teoria da Computação Eng. Informática 1º Semestre Exame 1ª chamada - Resolução 2h + 30min 31/Jan/2011 Pergunta A.1 A.2 A.3 B.1 B.2 B.3a B.3b C.1 C.2 D.1

Leia mais

Material Teórico - Módulo Matrizes e Sistemas Lineares. Sistemas Lineares - Parte 2. Terceiro Ano do Ensino Médio

Material Teórico - Módulo Matrizes e Sistemas Lineares. Sistemas Lineares - Parte 2. Terceiro Ano do Ensino Médio Material Teórico - Módulo Matrizes e Sistemas Lineares Sistemas Lineares - Parte 2 Terceiro Ano do Ensino Médio Autor: Prof Fabrício Siqueira Benevides Revisor: Prof Antonio Caminha M Neto 1 A representação

Leia mais

Capítulo 2: Procedimentos e algoritmos

Capítulo 2: Procedimentos e algoritmos Capítulo 2: Procedimentos e algoritmos Para estudar o processo de computação de um ponto de vista teórico, com a finalidade de caracterizar o que é ou não é computável, é necessário introduzir um modelo

Leia mais

Linguagens Formais e Autômatos 02/2016. LFA Aula 04 16/11/2016. Celso Olivete Júnior.

Linguagens Formais e Autômatos 02/2016. LFA Aula 04 16/11/2016. Celso Olivete Júnior. LFA Aula 04 Autômatos Finitos 16/11/2016 Celso Olivete Júnior olivete@fct.unesp.br 1 Classificação das Linguagens segundo Hierarquia de Chomsky Máquina de Turing Máquina de Turing com fita limitada Autômato

Leia mais

Apostila 05 Assunto: Linguagens dos tipos 0 e 1

Apostila 05 Assunto: Linguagens dos tipos 0 e 1 Cursos: Bacharelado em Ciência da Computação e Bacharelado em Sistemas de Informação Disciplinas: (1493A) Teoria da Computação e Linguagens Formais, (4623A) Teoria da Computação e Linguagens Formais e

Leia mais

LINGUAGENS FORMAIS Modelos Determinísticos e Não Determinísticos. Usam-se modelos matemáticos para representar eventos (fenômenos) do mundo real.

LINGUAGENS FORMAIS Modelos Determinísticos e Não Determinísticos. Usam-se modelos matemáticos para representar eventos (fenômenos) do mundo real. LINGUAGENS FORMAIS Modelos Determinísticos e Não Determinísticos Modelos Matemáticos Usam-se modelos matemáticos para representar eventos (fenômenos) do mundo real. Ressalta-se contudo que é muito importante

Leia mais

Turing e Complexidade

Turing e Complexidade (baseado em material da disciplina PCS2214) PMR2300 Escola Politécnica da Universidade de São Paulo Máquina de Turing Máquina de Turing: modelo mais poderoso de computador, proposto pelo inglês Alan M.

Leia mais

Linguagens Livres de Contexto

Linguagens Livres de Contexto Linguagens Livres de Contexto 1 Roteiro Gramáticas livres de contexto Representação de linguagens livres de contexto Formas normais para gramáticas livres de contexto Gramáticas ambíguas Autômatos de Pilha

Leia mais

Autómatos determísticos de k-pilhas

Autómatos determísticos de k-pilhas Autómatos determísticos de k-pilhas dados de entrada a a a3 an controlo finito (S, Σ, Γ, δ, Z, s 0, F ) δ (S Σ Γ k ) (S, (Γ ) k ) Departamento de Ciência de Computadores da FCUP MC Aula 3 Dados um estado

Leia mais

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

Linguagens Livres do Contexto. Adaptado de H. Brandão Linguagens Livres do Contexto Adaptado de H. Brandão Linguagens Livres do Contexto Para as LLC, temos as Gramáticas Livres do Contexto; Linguagens Livres do Contexto Para as LLC, temos as Gramáticas Livres

Leia mais

Teoria da Computação

Teoria da Computação Ciência da Computação Teoria da Computação (ENG10395) Profa. Juliana Pinheiro Campos E-mail: jupcampos@gmail.com Máquinas Universais Máquinas Universais podem ser entendidas de duas formas: Se é capaz

Leia mais

Já falamos que, na Matemática, tudo se baseia em axiomas. Já estudamos os números inteiros partindo dos seus axiomas.

Já falamos que, na Matemática, tudo se baseia em axiomas. Já estudamos os números inteiros partindo dos seus axiomas. Teoria dos Conjuntos Já falamos que, na Matemática, tudo se baseia em axiomas. Já estudamos os números inteiros partindo dos seus axiomas. Porém, não é nosso objetivo ver uma teoria axiomática dos conjuntos.

Leia mais

Universidade Federal de Uberlândia Mestrado em Ciência da Computação

Universidade Federal de Uberlândia Mestrado em Ciência da Computação Universidade Federal de Uberlândia Mestrado em Ciência da Computação Solução da 1 a Prova de Teoria da Computação - 05/05/2010 Questão 1 (Valor = 7 pontos) Um número real é dito algébrico se é raiz de

Leia mais

Autômatos com Pilha: Reconhecedores de LLCs

Autômatos com Pilha: Reconhecedores de LLCs Autômatos com Pilha: Reconhecedores de LLCs 1 Autômatos com Pilha (AP) Definições alternativas para Linguagens Livres de Contexto Extensão de AFND com uma pilha, que pode ser lida, aumentada e diminuída

Leia mais

Aula 10: Decidibilidade

Aula 10: Decidibilidade Teoria da Computação Aula 10: Decidibilidade DAINF-UTFPR Prof. Ricardo Dutra da Silva Definição 10.1. Um problema de decisão P é um conjunto de questões para as quais as respostas são sim ou não. Exemplo

Leia mais

Linguagens Formais e Problemas de Decisão

Linguagens Formais e Problemas de Decisão Linguagens Formais e Problemas de Decisão Mário S. Alvim (msalvim@dcc.ufmg.br) Fundamentos de Teoria da Computação (FTC) DCC-UFMG (2018/02) Mário S. Alvim (msalvim@dcc.ufmg.br) Linguagens Formais e Problemas

Leia mais

UNIVERSIDADE ESTADUAL DE MARINGÁ DEPARTAMENTO DE INFORMÁTICA

UNIVERSIDADE ESTADUAL DE MARINGÁ DEPARTAMENTO DE INFORMÁTICA UNIVERSIDADE ESTADUAL DE MARINGÁ DEPARTAMENTO DE INFORMÁTICA Máquina de Turing Prof. Yandre Maldonado - 1 Prof. Yandre Maldonado e Gomes da Costa yandre@din.uem.br Teoria da Computação Ciência da Computação

Leia mais

MAC-4722 Linguagens, Autômatos e Computabilidade Lista L3

MAC-4722 Linguagens, Autômatos e Computabilidade Lista L3 MAC-4722 Linguagens, Autômatos e Computabilidade Lista L3 Athos Coimbra Ribeiro NUSP: ****** 3 de Abril de 26 Problema.46 (itens a,c, e d) Solução a) L = { n m n m, n } Usamos o lema do bombeamento para

Leia mais

Decidibilidade. Mário S. Alvim Fundamentos de Teoria da Computação (FTC) DCC-UFMG (2018/02)

Decidibilidade. Mário S. Alvim Fundamentos de Teoria da Computação (FTC) DCC-UFMG (2018/02) Decidibilidade Mário S Alvim (msalvim@dccufmgbr) Fundamentos de Teoria da Computação (FTC) DCC-UFMG (2018/02) Mário S Alvim (msalvim@dccufmgbr) Decidibilidade DCC-UFMG (2018/02) 1 / 45 Decidibilidade:

Leia mais

Capítulo A máquina de Turing (TM) padrão Combinações de máquinas de Turing A Tese de Turing. ADC/TC/Cap.9/ /LEI/DEIFCTUC 375

Capítulo A máquina de Turing (TM) padrão Combinações de máquinas de Turing A Tese de Turing. ADC/TC/Cap.9/ /LEI/DEIFCTUC 375 Capítulo 9 Máquinas de Turing 9.1. A máquina de Turing (TM) padrão 9.2. Combinações de máquinas de Turing 9.3. A Tese de Turing ADC/TC/Cap.9/2009-10/LEI/DEIFCTUC 375 Linguagens regulares Autómatos finitos

Leia mais

Aula 10: Decidibilidade

Aula 10: Decidibilidade Teoria da Computação Segundo Semestre, 2014 Aula 10: Decidibilidade DAINF-UTFPR Prof. Ricardo Dutra da Silva Definição 10.1. Um problema de decisão P é um conjunto de questões para as quais as respostas

Leia mais

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

Marcos Castilho. DInf/UFPR. 16 de maio de 2019 16 de maio de 2019 Motivação Quais são os limites da computação? O que é um Problema de decisão? Um problema de decisão é um conjunto de perguntas, cada uma das quais tem um SIM ou um NÃO como resposta.

Leia mais

Números Inteiros Axiomas e Resultados Simples

Números Inteiros Axiomas e Resultados Simples Números Inteiros Axiomas e Resultados Simples Apresentamos aqui diversas propriedades gerais dos números inteiros que não precisarão ser provadas quando você, aluno, for demonstrar teoremas nesta disciplina.

Leia mais

Linguagens Formais e Autômatos P. Blauth Menezes

Linguagens Formais e Autômatos P. Blauth Menezes Linguagens Formais e Autômatos P. Blauth Menezes blauth@inf.ufrgs.br Departamento de Informática Teórica Instituto de Informática / UFRGS Linguagens Formais e Autômatos - P. Blauth Menezes 1 Linguagens

Leia mais

Material Teórico - Módulo Equações do Segundo Grau. Equações de Segundo Grau: outros resultados importantes. Nono Ano do Ensino Funcamental

Material Teórico - Módulo Equações do Segundo Grau. Equações de Segundo Grau: outros resultados importantes. Nono Ano do Ensino Funcamental Material Teórico - Módulo Equações do Segundo Grau Equações de Segundo Grau: outros resultados importantes Nono Ano do Ensino Funcamental Autor: Prof. Fabrício Siqueira Benevides Revisor: Prof. Antonio

Leia mais

Álgebra Linear Semana 04

Álgebra Linear Semana 04 Álgebra Linear Semana 04 Diego Marcon 17 de Abril de 2017 Conteúdo 1 Produto de matrizes 1 11 Exemplos 2 12 Uma interpretação para resolução de sistemas lineares 3 2 Matriz transposta 4 3 Matriz inversa

Leia mais

Teoria da Computação. Computabilidade e complexidade computacional

Teoria da Computação. Computabilidade e complexidade computacional Teoria da Computação Computabilidade e complexidade computacional 1 Computabilidade e Complexidade Computabilidade: verifica a existência de algoritmos que resolva uma classe de linguagens trata a possibilidade

Leia mais

Afirmações Matemáticas

Afirmações Matemáticas Afirmações Matemáticas Na aula passada, vimos que o objetivo desta disciplina é estudar estruturas matemáticas, afirmações sobre elas e como provar essas afirmações. Já falamos das estruturas principais,

Leia mais

Variantes de Máquinas de Turing

Variantes de Máquinas de Turing Variantes de Máquinas de Turing 1 Máquinas de Turing Input-Output TM s Input/output (ou IO ou transdutoras) diferem de TM s reconhecedoras por terem um estado de parada neutro q halt, ao invés de estados

Leia mais

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

Procedimentos e Algorítmos Programas e Linguagens de Programação Tese de Church-Turing Formas de Representação de Linguagens Procedimentos e Algorítmos Programas e Linguagens de Programação Tese de Church-Turing Formas de Representação de Linguagens 1 Introdução Estudar computação do ponto de vista teórico é sinônimo de caracterizar

Leia mais

Melhores momentos AULA PASSADA. Complexidade Computacional p. 205

Melhores momentos AULA PASSADA. Complexidade Computacional p. 205 Melhores momentos AULA PASSADA Complexidade Computacional p. 205 MT multifita por MT fita única Duas máquinas são equivalentes se elas reconhecem a mesma linguagem. Teorema. Dada uma máquina de Turing

Leia mais

AF Não-determinísticos Equivalência entre AFND e AFD

AF Não-determinísticos Equivalência entre AFND e AFD AF Não-determinísticos Equivalência entre AFND e AFD 1 AF NÃO-Determinístico (AFND) Consideremos uma modificação no modelo do AFD para permitir zero, uma ou mais transições de um estado sobre o MESMO símbolo

Leia mais

PCS3616. Programação de Sistemas (Sistemas de Programação) Máquinas de Turing

PCS3616. Programação de Sistemas (Sistemas de Programação) Máquinas de Turing PCS3616 Programação de Sistemas (Sistemas de Programação) Máquinas de Turing Escola Politécnica da Universidade de São Paulo Objetivos Familiarização com o funcionamento global de software de sistema computacional

Leia mais

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

COMPILADORES. Revisão Linguagens formais Parte 01. Geovane Griesang Universidade de Santa Cruz do Sul UNISC Departamento de informática COMPILADORES Revisão Linguagens formais Parte 01 geovanegriesang@unisc.br Legenda: = sigma (somatório) = delta ε = épsilon λ = lambda

Leia mais

Material Teórico - Inequações Produto e Quociente de Primeiro Grau. Inequações Quociente. Primeiro Ano do Ensino Médio

Material Teórico - Inequações Produto e Quociente de Primeiro Grau. Inequações Quociente. Primeiro Ano do Ensino Médio Material Teórico - Inequações Produto e Quociente de Primeiro Grau Inequações Quociente Primeiro Ano do Ensino Médio Autor: Prof. Fabrício Siqueira Benevides Revisor: Prof. Antonio Caminha M. Neto 27 de

Leia mais

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

ACH2043 INTRODUÇÃO À TEORIA DA COMPUTAÇÃO ACH2043 INTRODUÇÃO À TEORIA DA COMPUTAÇÃO 2. Linguagens Livres-do-Contexto Referência: SIPSER, M. Introdução à Teoria da Computação. 2ª edição, Ed. Thomson Prof. Marcelo S. Lauretto marcelolauretto@usp.br

Leia mais

Demonstrações Matemáticas Parte 2

Demonstrações Matemáticas Parte 2 Demonstrações Matemáticas Parte 2 Nessa aula, veremos aquele que, talvez, é o mais importante método de demonstração: a prova por redução ao absurdo. Também veremos um método bastante simples para desprovar

Leia mais

LFA Aula 05. AFND: com e sem movimentos 05/12/2016. Linguagens Formais e Autômatos. Celso Olivete Júnior.

LFA Aula 05. AFND: com e sem movimentos 05/12/2016. Linguagens Formais e Autômatos. Celso Olivete Júnior. LFA Aula 05 AFND: com e sem movimentos vazios 05/12/2016 Celso Olivete Júnior olivete@fct.unesp.br www.fct.unesp.br/docentes/dmec/olivete/lfa 1 Na aula passada... Reconhecedores genéricos Autômatos finitos

Leia mais

Projeto de máquina de Turing com múltiplas fitas reconhecedora de número primo

Projeto de máquina de Turing com múltiplas fitas reconhecedora de número primo Projeto de máquina de Turing com múltiplas fitas reconhecedora de número primo CCO 410 Aspectos Formais da Computação Prof.º Wanderley Lopes de Souza Universidade Federal de São Carlos Diego Luiz Cavalca

Leia mais

Variedades Adicionais das Máquinas de Turing

Variedades Adicionais das Máquinas de Turing LFA - PARTE 5 Variedades Adicionais das Máquinas de Turing 1 Máquinas de Turing com uma Fita Infinita de um Sentido A fita da máquina é infinita apenas à direita O quadrado da fita mais à esquerda contém

Leia mais

Método Simplex. Marina Andretta ICMC-USP. 19 de outubro de 2016

Método Simplex. Marina Andretta ICMC-USP. 19 de outubro de 2016 Método Simplex Marina Andretta ICMC-USP 19 de outubro de 2016 Baseado no livro Introduction to Linear Optimization, de D. Bertsimas e J. N. Tsitsiklis. Marina Andretta (ICMC-USP) sme0211 - Otimização linear

Leia mais

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

ACH2043 INTRODUÇÃO À TEORIA DA COMPUTAÇÃO ACH2043 INTRODUÇÃO À TEORIA DA COMPUTAÇÃO 2. Linguagens Livres-do-Contexto Referência: SIPSER, M. Introdução à Teoria da Computação. 2ª edição, Ed. Thomson Prof. Marcelo S. Lauretto marcelolauretto@usp.br

Leia mais

Máquinas Universais. Departamento de Ciência de Computadores da FCUP MC Aula 23 1

Máquinas Universais. Departamento de Ciência de Computadores da FCUP MC Aula 23 1 Máquinas Universais Um modelo de computação diz-se universal se todo o problema efectivamente computável o for nesse modelo. Um modelo universal é suficientemente poderoso para se aceitar a si próprio:

Leia mais

Linguagens Formais e Autômatos P. Blauth Menezes

Linguagens Formais e Autômatos P. Blauth Menezes Linguagens Formais e Autômatos P. Blauth Menezes blauth@inf.ufrgs.br Departamento de Informática Teórica Instituto de Informática / UFRGS Linguagens Formais e Autômatos - P. Blauth Menezes 1 Linguagens

Leia mais

a n Sistemas de Estados Finitos AF Determinísticos

a n Sistemas de Estados Finitos AF Determinísticos a n Sistemas de Estados Finitos AF Determinísticos 1 Definição formal de um AF Determinístico Um AF Determinístico (AFD) é denotado formalmente por uma quíntupla (Q,,, qo, F) onde: Q é o conjunto de estados

Leia mais