• Nenhum resultado encontrado

Computabilidade: tese de Church-Turing, problemas indecidíveis.

N/A
N/A
Protected

Academic year: 2019

Share "Computabilidade: tese de Church-Turing, problemas indecidíveis."

Copied!
7
0
0

Texto

(1)

Teoria da Computabillidade

Nesta aula, vamos reorganizar boa parte do assunto visto adotando a perspectiva dos estudos da Teoria da Computabillidade.

Num nível básico, a Computabilidade estudo quais problemas computacionais podem ser re-solvidos (computados, calculados) por algum algoritmo.

 Problemas computacionais consistem em associar, para cada entrada, uma saída que seja uma resposta adequada à entrada.

Em alguns estudos da área, ao invés de problemas computacionais, é comum estudar quais funções sobre os números naturais podem ser calculadas com algoritmos. Essas visões são equivalentes.

Um problema computacional qualquer pode também ser chamado de problema função. Nele, entradas e saídas podem ser cadeias quaisquer:

 Entrada: uma cadeia de símbolos qualquer

 Saída: uma cadeia de resposta (que resolva o problema para aqueles dados)

Exemplos de problemas funções: somar dois números inteiros, achar o menor caminho entre dois vértices de um grafo, ordenar listas, listar os fatores primos de um número, etc.

Problemas funções são classificados, pela Teoria da Computabilidade, em problemas compu-táveis, que aqueles que podem ser resolvidos por algoritmo, e em problemas não-computáveis, que não pode ser resolvidos por nenhum algoritmo possível.

Porém, vamos focar em um tipo de problema mais restrito, que são os problemas de decisão.  Entrada: uma cadeia qualquer (que pode ser vista como os dados de uma consulta ou

pergunta)

Saída: um valor booleano, V ou F (como resposta para a consulta feita)

(2)

1. Definindo Algoritmo

Um algoritmo é uma solução para um problema computacional. Dizemos que ele resolve um problema se ele é capaz de calcular, em tempo finito, a saída a partir de qualquer entrada do problema1.

Para a Teoria da Computabilidade poder avançar, ela precisou estabelecer uma definição clara de algoritmo. Isso aconteceu na primeira metade do século passado. Tudo começou com uma definição informal, intuitiva de algoritmos. Depois, foram propostos vários modelos que visa-vam capturar essa definição intuitiva. Resumimos essa discussão abaixo.

1.1 Definindo Intuitivamente

Um algoritmo, inicialmente, foi entendido como um processo mecânico (“procedimento efeti-vo”) para calcular a saída de um problema para qualquer dada entrada.

O foco está na ideia de processo, que indica que um algoritmo indica os passos a serem segui-dos para se calcular a saída. Essa visão engloba tanto um processo que uma pessoa segue, para, lendo e escrevendo símbolos no papel, calcular algo; como o procedimento interno de alguma maquina criada para fazer operações de calcular sequenciais de alguma forma.

Porém, a uma definição assim não serve para os estudos de Computabilidade e, por isso, fo-ram propostas definições formais (lógico-matemáticas). O objetivo era propor algo formal que capturasse esse entendimento intuitivo e informal do que é um algoritmo.

1.2 Definindo Formalmente

Vários modelos formais, lógico-matemáticos, foram propostos para serem adotados como definição de algoritmo nas primeiras décadas do século passado. Porém, dois modelos se des-tacaram por terem sido pioneiros e por serem, até hoje, os mais poderosos!

 Lambda-cálculo (proposto por Alonzo Church, proposto ao longo da década de 30, mas que teve sua versão final em 1936)

 Modelo de máquinas abstratas (que hoje chamamos de Máquinas de Turing, propos-to por Alan Turing em 1936/1937)

Os dois modelos acima são equivalentes. Outros modelos foram propostos, porém, no máxi-mo, eles têm a mesma capacidade de resolver problemas desses dois. (Exemplos: Post-Turing Machine, Funções Recursivas, Máquina de Registradores, etc).

Os dois modelos acima convenceram a comunidade de que eles (e a MT, em especial) repre-sentam bem a noção intuitiva de algoritmo. Isso levou à definição de algoritmo aceita hoje pelos matemáticos, lógicos e teóricos da Computação – a chamada Tese de Church Turing.

1 Dependendo do autor, o termo “computável” pode ser definido de forma mais fraca, em que é

(3)

Com base nesta definição, a discussão básica da Teoria da Computabilidade consiste em achar MTs que sempre param e resolvem um problema, para provar que tal problema é computá-vel/decidível (para problema função/de decisão), ou provar que não existe tal MT para classifi-car um problema como não-computável/indecidível.

Os modelos que são equivalentes às MTs (ou seja, que resolvem precisamente os mesmos problemas) são chamados de Turing-completos. Por exemplo: o lambda-cálculo e as Post-Turing machines são modelos Turing-completos. Esta classificação também pode ser usada para linguagens de programação (que também são modelos para criar algoritmos), ignorando as limitações de memória. Toda linguagem minimamente rica é Turing-completa, tais como: C, Java, Haskell e Python. Algumas linguagens específicas de domínio (como a linguagem usada nas fórmulas do Excel, aparentemente) não são Turing-completas.

Tese de Church-Turing: A definição formal de algoritmo que (melhor) captura a ideia intuitiva é esta:

(4)

2. Problemas Decidíveis

Definição: Um problema de decisão é decidível sse existe uma MT que sempre para (um deci-sor) que resolve o problema para todas as entradas.

São problemas decidíveis:

 Testar se um número é par  Testar se um número é primo

 Testar se uma lista de valores está ordenada

 Testar se um dado número é potência de 2 (provamos abaixo)  Testar se uma multiplicação está correta x.y=z (Sipser, pag. 152)

 Testar se todos os elementos de uma lista são diferentes entre si (Sipser, pag. 153)  Testar se um polinômio de uma variável tem raiz inteira (Sipser, pag. 163)

 Testar se um grafo é conexo (Sipser, pag. 165)

 Testar de um AFD aceita uma dada cadeia (Sipser, pags. 174 e 175)  Testar se uma GLC pode gerar uma cadeia (Sipser, pags. 178 e 179)

Vamos provar que o problema de testar se um número é potência de 2 (v. Sipser) é decidível. (Adaptado da pag. 149 do livro de Sipser). Não daremos a MT completa, mas vamos dar uma descrição de como a MT deve manipular a fita sequencialmente para dar uma resposta para qualquer entrada. Dessa descrição, deve ficar óbvio que é possível construir uma MT que fun-ciona assim. Descrição da MT:

Entrada: um número inteiro positivo n, representando por n repetições do símbolo 0. 1. A partir da posição inicial, percorra a fita para a direita, marcando (trocando por outro

símbolo) um zero sim e outro não. Ignore os zeros marcados anteriormente. a. Se só havia um símbolo zero, ACEITE.

b. Se a quantidade de zeros for ímpar > 1, REJEITE. (Basta ver se, depois de mar-car um zero, não havia nenhum outro zero depois).

2. Ao chegar ao final da cadeia (sem cair nos casos 1.a e 1.b acima), volte para a posição inicial da fita e retorne ao passo 1.

Vamos provar que o problema de testar se um polinômio de uma variável tem raiz inteira é decidível. Descrição da MT que decide este problema:

(5)

3. Problemas Indecidíveis

Definição: Um problema de decisão é indecidível sse ele não é decidível.

 Ou seja, é impossível criar uma MT que sempre para (nunca entra em loop infinito) pa-ra resolvê-lo.

São problemas indecidíveis:

 Problemas da aceitação em MTs: Testar se uma máquina de Turing M aceita uma ca-deia w. (Provamos a seguir.)

 Problema da parada: Testar se uma MT para (dizendo aceita ou rejeita, tanto faz) ao receber uma cadeia w. (Sipser, pags. 198 a 199).

 O décimo problema de Hilbert: Testar se um polinômio de múltiplas variáveis tem so-lução inteira. (Muito avançado).

 Testar se uma MT de entrada <M> qualquer reconhece a linguagem vazia (ou seja, se ela não aceita nenhuma cadeia). (Sipser, pags. 200 e 201)

Prova de que o problema da aceitação é indecidível. Faremos uma prova por redução ao ab-surdo, assumindo o contrário e tentando chegar a uma contradição.

Hipótese: Vamos supor que este problema seja decidível.

Isso quer dizer que existiria uma MT que nunca para (decisor), que chamaremos de X, que funcionaria assim:

X ao receber <M,w>:

 ACEITA, se M aceita w;

 REJEITA, caso contrário (se M rejeitar w ou entrar em loop infinito). Veja que X seria uma MTU melhorada, que nunca entra em loop.

A partir de X, poderíamos criar outro decisor (MT que nunca para) que recebe apenas uma descrição <M> de uma MT, e depois chama X passando <M,<M>> e nega o resultado. Va-mos chamar esta nova máquina de AUTO e ela teria este comportamento:

AUTO ao receber <M >:

 REJEITA, se M aceita <M>;

 ACEITA, caso contrário (se M rejeitar <M> ou entrar em loop infinito).

O que aconteceria se AUTO recebesse sua própria descrição <AUTO>? Qual saída seria da-da? Vamos analisar as possibilidades:

 AUTO não pode entrar em loop porque é um decisor (já que é uma simples modifi-cação do decisor X).

 Para AUTO(<AUTO>) retornar REJEITA seria necessário que AUTO aceitasse <AU-TO>. Esta possibilidade é uma contradição.

 Para AUTO(<AUTO>) retornar ACEITA seria necessário que AUTO rejeitasse <AU-TO>. Temos outra contradição aqui.

(6)

Prova de que o problema da parada é indecidível. Vamos fazer o que é chamado de uma redu-ção ao problema da aceitaredu-ção em MTs – ou seja, vamos mostrar que se existir uma soluredu-ção para este problema, também existe para o problema da aceitação. A prova, novamente, será por redução ao absurdo.

Hipótese: Vamos supor que o problema da parada seja decidível.

Isso quer dizer que existiria uma MT que nunca para (decisor), que chamaremos de Y, que funcionaria assim:

Y ao receber <M,w>:

 Aceita, se M aceita ou rejeita w (em ambos os casos, ele para);  Rejeita, se M entra em loop infinito ao receber w.

A partir desta, vamos definir outra MT chamada Z que recebe uma cadeia <M,w>, que re-presenta uma MT M e uma entrada w. Vamos mostrar como construir Z para que ela deci-da (resolva sem entrar em loop) o problema deci-da aceitação. Ela vai funcionar como uma MTU, porém, para evitar entrar em loop infinito na simulação de M, ele vai usar Y no pri-meiro passo.

Descrição da MT Z: Entrada: <M,w>.

1. Executar a máquina Y na entrada <M,w> (para testar se M vai parar).

2. Se Y retornar ACEITA (isso quer dizer que M vai parar com w), então simule M ao rece-ber w (da forma vista na explicação de uma MTU).

a. Ao final, retorne o mesmo que M retornar. 3. Se Y retornar REJEITA (neste caso, M vai entrar em loop),

a. Retorne REJEITA.

Veja que Z resolve o problema da aceitação, retornando ACEITA quando M aceita w (no passo 2.a), retornando REJEITA quando M rejeita w (também no passo 2.a) e retornando REJEITA quando M entra em loop com w (no passo 3.a).

Além disso, Z nunca entra em loop infinito. O ponto onde ela poderia entrar em loop seria na simulação no passo 2, porém, ela só entra neste caso se M não entrar em loop, logo a simulação é feita de forma segura e sempre para. Logo, Z é um decisor para o problema da aceitação.

Mas já provamos, antes, que o problema da aceitação é indecidível, logo não existe decisor para ele – contradição. Isso prova que a hipótese é falsa.

(7)

4. Conclusão

A existência de problemas indecidíveis tem a importância teórica de mostrar os limites dos algoritmos – nem todo problema computacional pode ser resolvido com eles.

Tais problemas não são muito comuns, mas é importante conhecer, pelo menos, os que apre-sentamos aqui. Eles têm versões semelhantes em linguagens de programação. Estes proble-mas também são Indecidíveis, sempre que a linguagem for Turing-completa. Exemplo:

 Problema da parada em C: testar de um dado programa P escrito em C vai parar (ou fi-car em loop infinito) ao receber uma dada entrada x

Se você tiver, um dia, que programar uma solução para algum problema assim, esteja prepa-rado para a possibilidade de seu programa entrar em loop infinito ou de, simplesmente, não responder corretamente para todas as entradas. Sabendo da dificuldade, a sugestão é que crie uma solução heurística imperfeita, que decide alguns casos corretamente, mas falha em ou-tros – existe uma área de pesquisa sobre isso!

A indecidibilidade de alguns problemas também têm implicações diversas na Matemática e na Lógica. Algumas delas:

 Não é possível criar um procedimento para achar, sempre, as raízes inteiras de poli-nômios de múltiplas variáveis quaisquer.

 Todo sistema matemático suficientemente “forte” (formado por axiomas e métodos de prova capazes de representar computações em MTs) não pode ser completo e con-sistente ao mesmo tempo (ou seja, ele não pode provar todos os teoremas sem provar contradições).

 Não existe um algoritmo geral que seja capaz de provar uma afirmação matemática qualquer. Na verdade, não há algoritmo nem mesmo se nos restringirmos somente a afirmações sobre os números naturais e se quisermos apenas testar a veracidade ou falsidade da afirmação (sem obter a prova completa).

 Existem números reais cujas casas decimais não podem ser computadas por nenhum algoritmo.

Existem também questionamentos profundos na Física sobre se a capacidade de calcular de todos os processos da natureza têm o mesmo limite das MTs ou não. (Em outras palavras, será que existe um processo físico que pode ser usado para resolver o problema da parada?)

“Arrependei-vos, pois, e convertei-vos, para que sejam apagados os vossos pecados, e venham, assim, os tempos do refrigério pela presença do Senhor.”

Referências

Documentos relacionados

Pode-se ligar a teoria da linguagem e a noção de computabilidade da máquina de Turing, o que será feito mais tarde nesta parte, mostrando como uma gramática reescrevendo uma

Faz a varredura do arquivo fonte reconhecen- do e identificado cada um dos elementos significativos da linguagem; e eliminando qualquer caracteres irrelevantes ao processo

não para em s4 sem transições &#34; &#34; em s5 reconhecido maiorIgual s0 → s2 ignora os brancos do início. sem transições &#34; &#34; em s2 reconhecido

– identificado um erro, o analisador sintático descarta símbolos de entrada, até que seja encontrado um token pertencente ao subconjunto de tokens de sincronização;. • tokens

• Nos métodos descendentes (top-down), temos de decidir qual a regra A→ a ser aplicada a um nó rotulado por um não-terminal A. – A expansão de A é feita criando nós

Fragrâncias Clássicos: Âmbar | Alecrim | Cascas &amp; Folhas Curumim | Flor de Algodão | Marruá | Pitanga | Provence Fragrâncias Esplendor: Buquê de Peônias | Terra Madre..

Para que esse estudo fosse possível foi necessário encontrar um grupo de pessoas disposto a colaborar com a pesquisa, haja vista que anteriormente uma série de

Também nesta edição: Bio Piscinas on tour Equipamento de salvamento A piscina biológica do Monte da Fonte Santa Escola de água PB online PONDY AWARD Bio Piscinas, Lda!. distinguida