UNIVERSIDADE FEDERAL DE UBERLÂNDIA Faculdade de Computação Disciplina : Teoria da Computação Professora : Sandra Aparecida de Amo Lista de Exercícios n o 2 Exercícios sobre Modelos de Máquinas de Turing 1. Uma máquina de Turing com fita duplamente infinita é similar ao nosso modelo simples exceto que sua fita é infinita à esquerda e à direita. A fita é inicialmente preenchida com brancos, exceto para a porção que contém o input. A computação é definida como de costume, exceto pelo fato de que o ponteiro de controle nunca encontra o fim da fita a medida que se move para a esquerda (como é o caso da fita comum). Mostre que este tipo de modelo de Máquina de Turing pode ser simulado pelo modelo simples de uma fita limitada à esquerda e vice-versa. Portanto, os dois modelos são equivalentes. 2. Uma máquina de Turing com reset à esquerda é é similar ao nosso modelo simples exceto que a função de transição δ tem a forma : δ : Q Γ Q Γ {R, RESET } Se δ(q, a) = (r, b, RESET ) quando a máquina está no estado q lendo o símbolo a na fita, então escreve b no lugar do a, entra no estado r e o ponteiro do controle pula para a posição mais à esquerda na fita. Repare que este tipo de máquina não tem a habilidade de mover uma casa para a esquerda. Só tem a habilidade de mover uma casa para a direita e de voltar para trás até a posição inicial. Mostre que este tipo de modelo de Máquina de Turing pode ser simulado pelo modelo simples de uma fita limitada à esquerda e vice-versa. Portanto, os dois modelos são equivalentes. Exercícios sobre Problemas e Linguagens Decidíveis e Turing-reconhíveis Modelo : como provar que um problema é decidível (a) Primeiramente, é preciso verificar se todos os elementos envolvidos na descrição do problema estão bem definidos. (b) Deixar bem claro : (1) qual é o input do problema, (2) qual a pergunta do problema, (3) a resposta é do tipo sim ou não? 1
(c) Dar uma codificação do input do problema em forma de string. A codificação deve ser tal que : (1) a todo input I está associado um único string denotado por < I >, (2) a todo string na imagem da função codificação existe um input I (único) correspondente (é possível decodificar de forma única um string). (d) Dar a descrição em alto nível e se for pedido, dar também a descrição de implementação da Máquina de Turing que resolve o problema. EXEMPLO - Considere o seguinte problema : Dado um grafo não dirigido, o grafo é conexo? (a) Todos os elementos envolvidos no enunciado estão bem definidos? Grafo : Um grafo G é um par (V,E) onde V é um conjunto de vértices e E é um conjunto de conjuntos de dois elementos {A,B}, onde A e B são vértices. Grafo Conexo : Um grafo (V,E) é dito conexo se para quaisquer v, u V existem arestas a 1,..., a n E tais que a 1 = (v, x 1 ), a 2 = (x 1, x 2 ),..., a n = (x n 1, u) (as arestas formam um caminho ligando v e u). (b) (1) Input do Problema = um grafo, (2) Pergunta do Problema : o grafo é conexo? (3) A resposta é do tipo sim ou não. (c) Codificação do input em forma de string : Seja G = (V,E) onde V = {v 1,..., v n }, E = {e 1,..., e m }. O string que codifica G é dado por : onde (e i ) = (a, b) se a aresta e i = {a, b}. (v 1,..., v n )((e 1 )(e 2 )...(e m )) Exemplo : se V = {1,2,3,4} e E = { {1,2}, {1,3}, {2,4} } então a codificação do grafo é dada pelo string : (1, 2, 3, 4)((1, 2)(1, 3)(2, 4)) (d) Descrição em alto nível do algoritmo que decide se um grafo é ou não conexo : M = No input < G >, faça : i. Selecione o primeiro vértice de G e marque-o. ii. Repita o seguinte passo até que não existam novos vértices marcados : iii. Para cada vértice de G, marque-o se ele estiver ligado a um vértice que já foi marcado. iv. Varra os vértices de G para determinar se todos estão marcados. Se estiverem, responda Sim. Caso contrário, responda Não. (e) Descrição da implementação de uma Máquina de Turing que aceita somente strings que correspondem a grafos conexos e rejeita todos os strings que correspondem a grafos não conexos. M = No input < G >, faça : 2
i. M testa se o string do input é a codificação de um grafo G. Se for, continue. Se não for, páre no estado q r. ii. M marca com um ponto o primeiro vértice da parte do input correspondente aos vértices. iii. M escaneia os vértices até encontrar o primeiro vértice n 1 não marcado com um ponto. M marca este vértice com um traço. M escaneia novamente a lista dos vértices e seleciona o primeiro que tem um ponto. Vamos chamá-lo de n 2. Marca este vértice com um um traço também. iv. M escaneia a parte do string correspondente às arestas e testa se existe uma aresta contendo n 1 e n 2. Se existir, M marca n 1 com um ponto, retira os traços de n 1 e n 2 e recomeça do passo 3. Se não existir, M retira o traço de n 2 e procura o próximo vértice (diferente do n 2 ) marcado com um ponto. Chamo este novo vértice de n 2 e repete o passo 4. v. Se não existir mais nenhum vértice marcado com ponto para ser testado junto com n 1, então n 1 não está ligado a nenhum vértice marcados com pontos. Neste caso, M vai para o passo 3 (neste passo, o primeiro vértice que M vai encontrar sem ponto será o primeiro depois do atual n 1 ). vi. M escaneia a lista dos vértices para determinar se todos estão marcados com um ponto. Se for o caso, M entra no estado q a e portanto aceita o string de input. Caso contrário, M entra no estado q r e para o qual não existem mais movimentos futuros (logo, M pára no estado q r e portanto rejeita o string de input). 3. Considere a Máquina de Turing M descrita no modelo acima. Considere o seguinte grafo G = (V,E), onde V = {1,2,3,4,5} e E = { {1,3}, {3,5}, {4,5}, {2,5} }. Descreva o funcionamento da máquina de Turing M no input G. 4. Considere o seguinte problema : Dado um grafo não-dirigido etiquetado (com labels) e um número B, determinar se existe um circuito no grafo com comprimento B. Definições dos termos que aparecem no problema : Grafo dirigido etiquetado : G = (V,E) onde V = {v 1,..., v n } e E = {({a, b}, d) a, b V e d é um inteiro positivo }. Isto é E é um conjunto formado por pares de arestas junto com um número indicando o comprimento da aresta. Um circuito de G é uma sequência de arestas (a 1, a 2 ), (a 2, a 3 ), (a 3, a 4 ),..., (a k, a 1 ) tais que o conjunto dos vértices que aparecem nestas arestas {a 1,..., a k } é igual a V (todos os vértices são visitados). Comprimento de um circuito : soma de todos os labels correspondentes às arestas que aparecem no circuito. Pede-se : (a) Identifique o problema e diga se se trata de um problema de decisão. (b) Dê uma codificação do input do problema. 3
(c) Diga se o problema é decidível. Em caso afirmativo, dê a descrição em alto nível e a descrição de implementação da Máquina de Turing que resolve o problema (sempre pára para qualquer input). Não é necessário dar a descrição formal da Máquina de Turing. 5. Seja P um problema. Sejam c 1 e c 2 duas codificações dos inputs de P. Suponha que exista uma Máquina de Turing M 1 que transforma um string c 1 (I) num string c 2 (I), isto é, o código do input I segundo a primeira codificação pode ser transformado no código do input I segundo a segunda codificação, via uma Máquina de Turing M. Mostre que se existir uma máquina de Turing M 2 que resolve o problema P, onde o input é codificado segundo a segunda codificação então existe uma máquina de Turing M 1 que resolve o problema P, onde o input é codificado segundo a primeira codificação. Isto é : o fato de um problema ser ou não decidível não depende da maneira como seu input é codificado! 6. Dê descrições em nível de implementação de máquinas de Turing que decidem as seguintes linguagens sobre o alfabeto {0,1}. (a) {w w contém o mesmo número de 0 s e 1 s } (b) {w o número de 0 s em w é o dobro do número de 1 s} (c) {w w o número de 0 s em w não é igual ao dobro do número de 1 s} 7. Mostre que o conjunto das linguagens decidíveis (ou recursivas) é fechado com relação às seguintes operações : (a) união (b) concatenação (c) star (d) complementação (e) intersecção 8. Mostre que toda linguagem finita é decidível. 9. Seja A a linguagem contendo um único string s, onde : s = 0 se Deus existe s = 1 se Deus não existe Esta linguagem é decidível? Por que? Note que a resposta não depende de suas convicções religiosas! 10. Explique por que o seguinte texto não corresponde a nenhum tipo de descrição de uma máquina de Turing. O input é um polinômio p com as variáveis x 1,..., x n. Suponha que < p > é uma codificação de p : M = No input < p > : 4
1. Teste se < p > corresponde ao código de um polinômio com as variáveis x 1,..., x n. 2. Tente todas as possibilidades de associar valores inteiros a x 1,..., x n. 3. Teste p para cada uma destas possibilidades. 4. Se para uma das possibilidades, o teste em p der zero, entre no estado q a. 5. Se para nenhuma destas possibilidades, o teste em p der zero, entre no estado q r e páre. 11. Seja L uma linguagem e suponha que exista uma função parcial recursiva F é crescente e Imagem(F) = L. Mostre que L é decidível. Uma função f : N X é dita parcial recursiva se existe uma máquina de Turing M tal que, após executar M no input n, caso M parar num estado de aceitação, o resultado na fita é f(n). Veja que função parciais recursivas podem não estar definidas para todo N. Em alguns pontos ela pode entrar em loop. Repare que o fato de existir uma função parcial recursiva tal que Imagem(F) = L, significa que é possível enumerar os elementos de L por uma Máquina de Turing. O que o exercício está pedindo é o seguinte : se existir uma maneira de enumerar os elementos de uma linguagem de forma crescente através de uma máquina de Turing, então é possível decidir se um string pertence ou não a linguagem L. 5