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 em 1936. Usa uma fita infinita como sua memória ilimitada. Essa fita é dividida em células. Tem um cabeçote que pode ler/ escrever símbolos e mover-se sobre a fita. Inicialmente a fita contém apenas a cadeia de entrada e está em branco em todo o restante.
As MT podem tanto ler quanto escrever sobre a fita. O cabeçote pode se movimentar tanto para a esquerda quanto para a direita. Os estados de aceitação e rejeição fazem efeito imediatamente (entrou em um estado de aceitação ou rejeição, a entrada nem continua a ser lida, a computação termina)
Ex: MT M para reconhecer a linguagem L = {a n b n n >= 1} Indica que se o cabeçote está posicionado sobre um b na fita, esse b deve ser substituído por B e o cabeçote deve se mover para a esquerda (L).
Definição formal: Uma MT é uma 7-upla, (Q,, Γ, δ, q 0, q aceita, q rejeita ) onde: Q é um conjunto finito de estados é o alfabeto de entrada sem o símbolo branco Γ é o alfabeto de fita, onde Є Γ e Ϲ Γ δ: Q x Γ -> Q x Γ x {E, D} é a função de transição. Se a máquina está num estado q e o cabeçote está sobre uma célula da fita com símbolo a e se δ(q,a) = (r, b, E), a máquina escreve o símbolo b substituindo o a e vai para o estado r. E indica que o cabeçote se move para a esquerda. q 0 Є Q é o estado inicial. q aceita Є Q é o estado de aceitação e q rejeita Є Q é o estado de rejeição, onde q rejeita q aceita
Vamos usar nessa disciplina a definição: Uma MT é uma 6-upla, (Q,, Γ, δ, q 0, F) onde F é o conjunto de estados finais (F C Q). Computação em uma MT: É importante observar que a definição de MT não distingue os conceitos de programa e máquina. É como se a δ fosse o programa da MT que determina o símbolo a ser gravado, o sentido do movimento da cabeça e o novo estado.
Computação em uma MT: Uma MT recebe sua entrada sobre as n células mais à esquerda da fita e o restante da fita está em branco. A cabeça começa sobre a célula mais a esquerda da fita e a computação procede conforme as regras descritas pela função de transição. Se M em algum momento tenta mover seu cabeçote para a esquerda além da extremidade esquerda da fita, ela permanece no mesmo lugar. A computação continua até que ela entre em um estado de aceitação ou rejeição em cujo ponto ela para. Se nenhum desses ocorre, M continua para sempre.
Computação em uma MT: A medida que a MT computa, mudanças ocorrem no estado atual, no conteúdo atual da fita e na posição atual do cabeçote. A computação de uma máquina de Turing é dada por uma seqüência de descrições instantâneas (configurações) C1, C2,..., C k contendo cada uma um possível valor desses 3 itens.
Uma configuração é representada da seguinte forma: dado um estado q e duas cadeias u e v Γ*. uqv representa a configuração em que o estado atual é q, o conteúdo da fita é uv e a posição atual do cabeçote é o primeiro símbolo de v.
Exemplo: A figura abaixo representa MT com a configuração abcq 3 ac
Suponha que tenhamos a, b e c em Γ, assim como u e v em Γ* e os estados q i e q j. Digamos que a configuração: uaq i bv origina uq j acv se na função de transição δ(q i, b) = (q j, c, E); e uaq i bv origina uacq j v se na função de transição δ(q i, b) = (q j, c, D); q i bv origina q j cv se δ(q i, b) = (q j, c, E); uaq i é equivalente a uaq i
A configuração inicial da computação de uma MT sobre a entrada w é q0w. Uma MT M aceita a entrada w se uma sequencia de configurações C1, C2,..., Ck existe, onde: C1 é a configuração inicial de M sobre a entrada w Cada Ci origina Ci+1 Ck é uma configuração de aceitação (o estado da configuração é um estado final)
Uma linguagem aceita por uma MT é dita Turingreconhecível ou Linguagem recursivamente enumerável LRE (aceita alcançando estado final ou rejeita alcançando estado não final ou entrando em loop). Uma linguagem é Turing-decidível ou linguagem recursiva - LRec, se alguma máquina de Turing M a decide (pára para qualquer entrada, nunca entra em loop):
Definições alternativas (variantes) de MT: MT com marcador de início de fita; MT com fita infinita nas 2 direções; MT em que o cabeçote não se move em uma leitura/gravação; MT multifita; MT não determinísticas. O modelo original e suas variantes tem todos o mesmo poder computacional.
MT multifita: possui várias fitas, cada uma tem sua própria cabeça. inicialmente a entrada aparece sobre a fita 1, e as outras iniciam em branco. A δ permite ler, escrever e mover as cabeças em algumas ou todas as fitas simultaneamente. δ: Q x Γ k Q x Γ k x {E, D} k, sendo k o nº de fitas. δ(q i, a 1,..., a k ) = (q j, b 1,..., b k, E, D,..., E) significa que, se a máquina está no estado q i e as cabeças 1 a k estão lendo símbolos a 1 a a k, a máquina vai para o estado q j, escreve os símbolos b 1 a b k e direciona cada cabeça para mover para a esquerda ou direita, ou permanecer parada.
Toda MT multifita tem uma MT de 1 única fita equivalente.
MT não determinística: Em qualquer ponto em uma computação, a máquina pode proceder de acordo com várias possibilidades. A função de transição tem a forma: Q x Γ -> P(Q x Γ x {E, D}) A computação é uma árvore cujos ramos correspondem a diferentes possibilidades para a máquina. Se algum ramo leva ao estado de aceitação, a máquina aceita sua entrada.
Toda MT não determinística tem uma MT determinística equivalente (tenta todos os ramos da computação não determinística). 0 0 1 0... Fita de entrada D x x # 0 1 x... Fita de simulação 1 2 3 3 2 3 1 2 1... Fita de endereço
Terminologias para descrever MT: Descrição formal: especificação das 7 partes da MT Descrição de implementação: usa a língua natural escrita para descrever a maneira pela qual a MT move sua cabeça e a forma como ela armazena os dados sobre a fita. Descrição de alto nível: usa a língua natural para descrever um algoritmo, ignorando os detalhes de implementação.
Ex: Para L = {a n b n n >= 1} Descrição formal:
Descrição no nível de implementação: 1. Se w for cadeia vazia, rejeite. 2. Faça um zigue-zague ao longo da fita indo e voltando entre os a's e b's, marcando um de cada até que todos os a's tenham terminado. Se todos os b's tiverem sido marcados e alguns a's permanecem, rejeite. Se aparecer algum a após algum b, rejeite. 3. Quando todos os a's tiverem sido marcados, verifique a existência de algum simbolo remanescente. Se resta algum símbolo, rejeite; caso contrário, aceite.
Descrição de alto nível: 1. Se w for cadeia vazia, rejeite. 2. Verifique se existe um b para cada a em w. Se não existir, rejeite. Se existir algum a após algum b, rejeite. 3. Verifique se existe um a para cada b. Se não existir, rejeite. Caso contrário, aceite.
Vamos fixar um formato e uma notação para descrever MT (descrição de alto nível): A entrada para a MT é sempre uma cadeia. Se desejamos fornecer como entrada um objeto que não uma cadeia, primeiro temos que representar esse objeto como uma cadeia. A notação para a codificação de um objeto O na sua representação como cadeia é <O> e para vários objetos O1, O2,, On é <O1, O2,, On>. Descrevemos algoritmos de MT com um segmento indentado de texto dentro de aspas. A 1ª linha do algoritmo descreve a entrada para a máquina.
Ex: Considere a linguagem A: A = {<G> G é um grafo não-direcionado conexo}. Como <G> codifica o grafo G como uma cadeia? Considere uma codificação que é uma lista dos nós de G seguida de uma lista das arestas de G. <G> = (1,2,3,4) ((1,2), (2,3) (3,1), (1,4))
Descrição de alto nível de uma MT que decide A. M = Sobre a entrada <G>, a codificação de um grafo: 1. Selecione o primeiro nó de G e marque-o. 2. Repita o seguinte até que nenhum novo nó seja marcado 3. Para cada nó em G, marque-o, se ele estiver ligado por uma aresta a um nó que já esteja marcado. 4. Faça uma varredura em todos os nós de G para determinar se eles estão todos marcados. Se estiverem, aceite; caso contrário, rejeite.
Quando M recebe a entrada <G>, ela primeiro faz um teste para determinar se a entrada é uma codificação apropriada de algum grafo: M faz uma varredura na fita para ter certeza de que existem 2 listas e que elas estão na forma apropriada (a 1ª deve ser uma lista de nºs decimais e a 2ª, uma lista de pares de nºs decimais); a lista de nós não deve conter repetições; todo nó da lista de arestas deve também aparecer na lista de nós. Esse nível de detalhes não será necessário sempre, apenas se for solicitado.
Chegamos em um momento decisivo no estudo da teoria da computação. Continuamos a falar de MT, mas nosso verdadeiro foco a partir de agora é em algoritmos. A MT simplesmente serve como um modelo preciso para definição de algoritmo.
A definição de algoritmo Informalmente, um algoritmo é um conjunto finito de instruções bem definidas e não ambíguas para realização de uma tarefa. Aprendemos algoritmos para somar, subtrair, encontrar MDC, resolver equações de 2 grau, etc. A história a seguir relata como a definição precisa de algoritmo foi crucial para um importante problema matemático.
A definição de algoritmo Em 1900, o matemático David Hilbert proferiu uma agora-famosa palestra no Congresso internacional de matemáticos em Paris. Na sua apresentação, ele identificou 23 problemas matemáticos e colocou-os como um desafio para o século vindouro. O 10º problema de sua lista dizia respeito a algoritmo: conceber um algoritmo que verificasse se um polinômio tinha uma raiz inteira. Hoje sabemos que não existe nenhum algoritmo para essa tarefa, ela é algoritmicamente insolúvel.
A definição de algoritmo Provar que um algoritmo não existe requer a posse de uma definição clara de algoritmo e isso veio nos artigos de 1936 de Alonzo Church e Alan Turing. Para definir algoritmos eles apresentaram o lambda-calculo e as MT respectivamente. Essa conexão entre a noção informal e a precisa de algoritmo veio a ser chamada de tese de Church Turing.
Tese de Church (Church-Turing) A tese de Church afirma que qualquer função computável (algoritmo) pode ser processada por uma MT. Turing criou a MT como uma proposta de definição formal de algoritmo. Vários outros trabalhos (Máquina de Post e funções recursivas e outros mais recentes como máquina Norma e autômato com pilhas) resultaram em conceitos semelhantes ao de Turing.
Tese de Church (Church-Turing) O fato de todos esses trabalhos independentes gerarem o mesmo resultado em termos de capacidade de expressar computabilidade é um forte reforço na tese de Church, enunciada como: A capacidade de computação representada pela máquina de Turing é o limite máximo que pode ser atingido por qualquer dispositivo de computação
Tese de Church (Church-Turing) A tese de Church não é demonstrável, pois é fundamentada em uma noção intuitiva (não formal) de algoritmo. Ela é aceita como verdadeira, ou seja, é assumida como hipótese. Por isso é conhecida também como Hipótese de Church (ou Church- Turing).
A definição de algoritmo A tese de Church provê a definição de algoritmo necessária para resolver o 10º problema de Hilbert. Em 1970, Yuri Matijasevic mostrou que não existe um algoritmo para o problema. O problema de Hilbert é um problema de decisão. Um problema de decisão (PD) é uma questão que faz referencia a um conjunto finito de parâmetros e que, para valores específicos dos parâmetros, tem como resposta sim ou não. Ex: determinar se uma palavra w é gerada por uma gramática G.
A definição de algoritmo Instância para PD: questão obtida dando valores para os parâmetros.. Solução para PD: algoritmo que, para qualquer instancia do PD, determina SIM ou NÃO corretamente. Se um PD tem solução é dito ser decidível e um PD que não tem solução é indecidível.
A definição de algoritmo Uma linguagem é uma forma precisa de expressar problemas de decisão, permitindo um desenvolvimento formal adequado ao estudo da computabilidade. A solucionabilidade de um problema será estudada analisando-a como a investigação da existência de um algoritmo que determine se uma palavra pertence ou não à linguagem que traduz esse problema.
A definição de algoritmo Poderíamos representar o PD determinar se uma palavra w é gerada por uma gramática G com a seguinte linguagem que traduz esse problema: L = {<w, G> A palavra w é gerada pela gramática G} Essa linguagem contém as codificações de todas as gramáticas juntamente com todas as palavras que elas geram. O problema de testar se uma palavra w é gerada por uma gramática G é o mesmo que o problema de testar se <w, G> pertence à linguagem L.
A definição de algoritmo Podemos representar o problema de Hilbert como uma linguagem: D = {p p é um polinômio com uma raiz inteira} O 10º problema de Hilbert pergunta se a linguagem D é Turing-decidível. Podemos mostrar que D é Turingreconhecível (pára se p D, mas não para se p D ), mas não decidível. Vamos apresentar um problema D 1 análogo ao problema de Hilbert para polinômios que tem uma única variável.
A definição de algoritmo D 1 = {p p é um polinômio sobre x com uma raiz inteira} Aqui está a MT M 1 que reconhece D 1 : M 1 = sobre a entrada <p> que é a codificação de um polinômio sobre a variável x: 1. calcule o valor de p substituindo x sucessivamente pelos valores 0, 1, -1, 2, -2, 3, -3, Se em algum ponto o valor do polinômio resulta em 0, aceite.
A definição de algoritmo Se p tem uma raiz inteira, M 1 vai encontrá-la e aceitar. Se p não tem uma raiz inteira, M 1 vai rodar para sempre. Para o caso multivariável, podemos apresentar uma MT similar, M, que reconhece D. Nesse caso, M testa todas as possíveis valorações inteiras para suas variáveis. Tanto M 1 quanto M são reconhecedores, mas não decisores. É possível converter M 1 para ser um decisor, porque podemos calcular limitantes dentro dos quais as raízes de um polinômio de uma única variável têm que residir, e restringir a busca a esses limitantes. Para provar que D não é decidível, Yuri Matijasevic mostrou que é impossível calcular esses limitantes para polinômios multivariáveis.
Referências Sipser, M.; Introdução à Teoria da Computação. Ed. Thomson, 2007. ISBN: 9878522104994. Diverio, T. A.; Menezes, P. B.. Teoria da Computação: Máquinas Universais e Computabilidade. Porto Alegre: Sagra Luzzato, 2000. Carnielli, W. A.; Epstein, R. L.; Computabilidade, funções computáveis, lógica e os fundamentos da matemática. 2.ed. São Paulo: Editora UNESP, 2009. Vieira, N. J.; Introdução aos Fundamentos da Computação: Linguagens e Máquinas. Ed. Thomson, 2006. ISBN: 8522105081.