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), se alguma máquina de Turing a reconhece. Três resultados podem ser obtidos por uma máquina de turing. Aceitar, rejeitar ou entrar em loop. Uma máquina que nunca entra em loop é chamada decidível. Uma linguagem Turing-decidível (Linguagens Recursivas) ou simplesmente decidível se alguma máquina de Turing a decide.
Máquinas de Turing Relacionamento entre classes de linguagens Turing-reconhecível Decidível Livre-do-contexto Regular
Linguagens
Máquinas de Turing Algumas Variações de MTs Máquina com cabeçote imóvel Máquina com múltiplas trilhas Máquina com fita ilimitada em ambas as direções Máquina com múltiplas fitas Máquina não determinística O modelo original e suas variantes razoáveis todos têm o mesmo poder eles reconhecem a mesma classe de linguagens.
Questões pertinentes à Teoria da Computação 1. Quais as capacidades e limitações fundamentais dos computadores? 2. O que pode e o que não pode ser resolvido pelos computadores? 3. O que faz alguns problemas serem computacionalmente mais difíceis que outros?
Definição de Algoritmo Um algoritmo é uma coleção de instruções simples para realizar alguma tarefa em tempo finito. Procedimentos ou receitas. Algoritmos desempenham um importante papel na matemática. Algumas descrições de algoritmos na matemática antiga contemplam: Como encontrar números primos Máximo divisor comum e outros.
Problema de Hilbert Em 1900, o matemático David Hilbert definiu 23 problemas matemáticos e que seriam desafios para o próximo século. O décimo problema dizia respeito a algoritmos. O décimo problema era conceber um processo com o qual ela possa ser determinada por um número finito de operações (algoritmo), que testasse se um polinômio tinha uma raiz inteira. Ele aparentemente assumiu que um tal algoritmo tinha que existir e que alguém só precisava encontrar
Tese de Church-Turing A prova do problema de Hilbert teve que esperar pela definição clara do que é um algoritmo. A definição veio nos artigos de 1936 de Alonzo Church e Alan Turing. Church usou um sistema notacional denominado λ- cálculo para definir algoritmos. Turing o fez com suas maquinas. As duas definições foram demonstradas equivalentes. Essa conexão entre a noção informal de algoritmo e a definição precisa veio ser chamada de tese de Church-Turing.
Tese de Church-Turing Noção intuitiva de algoritmos é igual a Algoritmos de máquina de Turing Em 1970, Yuri Matijasevič, mostrou que nenhum algoritmo existe para se testar se um polinômio tem raízes inteiras, respondendo ao 10 problema de Hilbert. A abordagem operacional de Turing permitiu a Von Neuman elaborar o modelo para a construção de máquinas digitais.
Computação efetiva Computação efetiva tem como características: a possibilidade de execução mecânica; produção da mesma saída para as mesmas entradas; execução em tempo finito; etc. Formalizando computação efetiva, é possível mostrar que: um problema é computável (ou decidível, se for Problema de Decisão); um problema é não computável (ou indecidível, se for Problema de Decisão)
Computação efetiva Formalismos igualmente expressivos: máquinas de Turing; sistemas de Post; funções µ-recursivas; λ-cálculo; máquinas abstratas associadas a linguagens de programação,como Java, C, Pascal. Tese de Church-Turing Se uma função é efetivamente computável, então ela é computável por meio de uma máquina de Turing. (Ou: todo algoritmo pode ser expresso mediante uma MT.) Como os formalismos são equivalentes, da tese de Church- Turing segue-se que: se uma função é efetivamente computável, então ela é computável por meio de um programa escrito na linguagem C, etc...
Decidibilidade Vamos investigar questões de computabilidade por meio de situações nas quais o resultado de uma computação é sim ou não. Apesar do poder computacional de uma Máquina de Turing (MT) ser maior do que qualquer computador real, existem problemas que não são Turing Computáveis. Logo,de acordo com a tese de Church-Turing, tais problemas não são solúveis por meio de um algoritmo. Quais são os limites dessa computabilidade? Um caminho seria explorar os limites onde certos problemas podem ser resolvidos algoritmicamente e outros não podem.
Decidibilidade Por que estudar a insolubilidade? A demonstração de que um problema é insolúvel apesar de parecer inútil, principalmente porque em princípio se deseja resolvê-lo, tem duas motivações: 1. A primeira, saber que um problema é insolúvel algoritmicamente é útil pois assim se perceberá que este problema deverá ser alterado ou simplificado para que se encontre uma solução algorítmica. Como qualquer ferramenta, os computadores têm capacidades e limitações que devemos considerar para usá-los eficientemente; 2. A segunda é cultural, mesmo lidando com problemas sabidamente solúveis, uma ideia do insolúvel pode estimular a imaginação e ajudar a adquirir uma nova perspectiva em Computação.
Decidibilidade Problemas de Decisão Estratégia estudar alguns modelos computacionais conhecidos, e ver seus limites computacionais. Por onde começar? Por modelos conhecidos, que em tese resolvem todos problemas computacionais complexos conhecidos.
Decidibilidade Denominamos problemas de decisão a um problema caracterizado por uma classe de perguntas, cuja resposta deve ser sim ou não, exemplos: 1. Dados um Autômato Finito Determinístico M e uma palavra w, determinar se M reconhece w; 2. Dada uma palavra w, determinar se w pode ser gerada por uma Gramática Livre de Contexto; 3. Dados um polinômio com coeficientes inteiros, determinar se ele possui raízes inteiras; 4. Dada uma MT M e uma palavra w, determinar se M pára com a entrada w;
Decidibilidade Relembrando Dizemos que um problema de decisão é computável, ou é decidível, se existe um algoritmo para a solução desse problema. Se tivermos uma MT que para sob quaisquer entradas w, pertencentes ou não à linguagem, temos nessas linguagens a classe das Linguagens Recursivas ou Turingdecidível. O problema é decidível se há um modelo computacional provado de que sempre vamos obter um sim ou um não como saída.
Decidibilidade Problemas Decidíveis (Linguagens Regulares) Aceitação de um AFD descrito pela linguagem: A AFD = { B, w B é um AFD que reconhece a cadeia w } Teorema: A AFD é decidível Prova: devemos mostrar que uma MT M D decide A AFD. M D = entrada: B,w onde B é um AFD e w é uma cadeia 1. simula B com a entrada w; 2. se a simulação termina em um estado final aceita (ou reconhece) w, senão rejeita.
Decidibilidade Problemas Decidíveis (Linguagens Regulares) Aceitação de um AFN descrito pela linguagem: A AFN = { B, w B é um AFN que reconhece a cadeia w } Teorema: A AFN é uma linguagem decidível Prova: podemos projetar uma MT M N para operar como a MT M D do primeiro exemplo, simulando um AFN ao invés de um AFD. Em particular, teremos M N usando M D como uma sub-rotina M N primeiro converte o AFN que recebe em um AFD antes de seguir para a M D M N = entrada: B,w onde B é um AFN e w é uma cadeia 1. converta B em um AFD equivalente D 2. execute MD para a entrada D,w 3. se MD aceita a entrada, MN aceita, caso contrário rejeita. Executar MD no passo 2 significa incorporar MD ao projeto de MN como numa sub-função.
Decidibilidade Problemas Decidíveis (Linguagens Regulares) Testar a vacuidade para a linguagem de um autômato finito. Seja a linguagem: E AFD = { A A é um AFD e L(A) = } Teorema: E AFD é uma linguagem decidível. Prova: um AFD aceita alguma cadeia se e somente se é possível alcançar algum estado final a partir do estado inicial seguindo os arcos. Para testar se esta condição é satisfeita, podemos criar uma máquina de Turing M VAFD que usa um algoritmo que marca os estados. M VAFD = entrada: A, onde A é um AFD 1. marque o estado inicial de A. 2. repita 3. até que não se marque mais estados 3. marque todos os estados que tenham um arco vindo de um estado marcado. 4. se nenhum estado final estiver marcado, M VAFD aceita; caso contrário rejeita.
Decidibilidade Problemas Decidíveis (Linguagens Livres do Contexto) Testar se uma dada Gramática Livre de Contexto gera uma cadeia w.seja a linguagem: A GLC = { G, w G é uma GLC que gera a cadeia w } Teorema: A GLC é uma linguagem decidível. Idéia da prova: para a GLC G e a cadeia w, queremos testar se G gera w. Uma idéia seria usar G para testar todas as derivações para verificar se há uma derivação para w. Essa idéia não funciona, pois se podem testar infinitas derivações. Se G não gera w, o algoritmo nunca pára, o que nos daria uma máquina de Turing que seria apenas um reconhecedor (que em princípio, tem sua parada garantida apenas nas entradas w pertencentes à linguagem da máquina).
Decidibilidade Problemas Decidíveis (Linguagens Livres do Contexto) Continuação Para obter uma máquina de Turing M GLC que decide A GLC, devemos garantir que M GLC testa apenas um número finito de derivações de G. Se G está na forma normal de Chomsky, qualquer derivação de w, tal que w = n, tem 2n-1 passos. Nesse caso, verificando apenas as derivações com 2n- 1 passos para determinar se G gera w seria suficiente. Se G não está na forma normal de Chomsky, podemos converter G usando o procedimento adequado que foi estudado com as Gramáticas e Linguagens Livres de Contexto.
Decidibilidade Problemas Decidíveis (Linguagens Livres do Contexto) Continuação Por exemplo: Na gramática G ex com produções: S AB A AA a B BB b A geração da palavra w = aabb, que tem comprimento n = w = 4, temos 2*4 1 = 7 derivações: S AB AAB AABB aabb aabb aabb aabb cuja árvore é dada por: Em 7 passos pode-se verificar se w = aabb, com w = 4, foi gerada pela GLC G ex.
Decidibilidade Problemas Decidíveis (Linguagens Livres do Contexto) Testar se uma dada Gramática Livre de Contexto gera uma cadeia w.seja a linguagem: A GLC = { G, w G é uma GLC que gera a cadeia w } Prova: a máquina de Turing M GLC para A GLC M GLC = entrada: G, w, onde G é uma GLC e w uma cadeia: 1. converta G em uma gramática na forma normal de Chomsky. 2. liste todas as derivações com 2n-1 passos, onde n é o comprimento de w. 3. se alguma destas derivações gera w, M GLC aceita; caso contrário rejeita.
Bibliografia utilizada nos slides HOPCROFT, John E.; ULLMAN, Jeffrey D.; MOTWANI, Rajeev. Introdução à teoria de autômatos, linguagens e computação. 2 ed. 9 reimpr. Rio de Janeiro: Elsevier, 2002. 560 p. ISBN 8535210725. SIPSER, Michael. Introdução à teoria da computação. 2 ed. São Paulo: Thomson Learning, 2007. xxi, 459 p. ISBN 8522104999. VIEIRA, Newton José. Introdução aos Fundamentos da Computação: Linguagens e Máquinas. São Paulo: Pioneira Thomson Learning, 2006.