Problemas insolúveis. Um exemplo simples e concreto



Documentos relacionados
Dadas a base e a altura de um triangulo, determinar sua área.

A lógica de programação ajuda a facilitar o desenvolvimento dos futuros programas que você desenvolverá.

AV2 - MA (a) De quantos modos diferentes posso empilhá-los de modo que todos os CDs de rock fiquem juntos?

1.1. Organização de um Sistema Computacional

(a 1 + a 100 ) + (a 2 + a 99 ) + (a 3 + a 98 ) (a 50 + a 51 ).

Tutorial de Matlab Francesco Franco

5 Equacionando os problemas

OBI2014 Caderno de Tarefas

ALGORITMOS PARTE 01. Fabricio de Sousa Pinto

CAPÍTULO 3 - TIPOS DE DADOS E IDENTIFICADORES

Exercícios Resolvidos sobre probabilidade total e Teorema de Bayes

Contagem I. Figura 1: Abrindo uma Porta.

O Princípio da Complementaridade e o papel do observador na Mecânica Quântica

1. NÍVEL CONVENCIONAL DE MÁQUINA

Estruturas Discretas INF 1631

Hoje estou elétrico!

INSTITUTO TECNOLÓGICO

Por que o quadrado de terminados em 5 e ta o fa cil? Ex.: 15²=225, 75²=5625,...

Exercícios Teóricos Resolvidos

Resolução de problemas e desenvolvimento de algoritmos

2. Representação Numérica

INTRODUÇÃO ÀS LINGUAGENS DE PROGRAMAÇÃO

Projeção ortográfica da figura plana

Algoritmos e Pseudocódigo

1. Quem somos nós? A AGI Soluções nasceu em Belo Horizonte (BH), com a simples missão de entregar serviços de TI de forma rápida e com alta qualidade.

Exercícios de Fixação Pseudocódigo e Estruturas Básicas de Controle

¹CPTL/UFMS, Três Lagoas, MS,Brasil, ²CPTL/UFMS, Três Lagoas, MS, Brasil.

Organização de programas em Python. Vanessa Braganholo

AULA 6 LÓGICA DOS CONJUNTOS

OBI2009 Caderno de Tarefas

O conceito de probabilidade

A Torre de Hanói e o Princípio da Indução Matemática

Revisão de combinatória

Soluções Nível 1 5 a e 6 a séries (6º e 7º anos) do Ensino Fundamental

Algoritmos. Objetivo principal: explicar que a mesma ação pode ser realizada de várias maneiras, e que às vezes umas são melhores que outras.

Faculdade de Computação

Análise e Complexidade de Algoritmos

Material Teórico - Módulo de Divisibilidade. MDC e MMC - Parte 1. Sexto Ano. Prof. Angelo Papa Neto

Trabalho 7 Fila de prioridade usando heap para simulação de atendimento

MA14 - Aritmética Unidade 4. Representação dos Números Inteiros (Sistemas de Numeração)

2 echo "PHP e outros.";

O papel do CRM no sucesso comercial

Análise e Desenvolvimento de Sistemas ADS Programação Orientada a Obejeto POO 3º Semestre AULA 03 - INTRODUÇÃO À PROGRAMAÇÃO ORIENTADA A OBJETO (POO)

Faculdade de Computação

Múltiplos Estágios processo com três estágios Inquérito de Satisfação Fase II

Computadores XXI: Busca e execução Final

QUESTÃO 1 ALTERNATIVA B

Como Gerar documento em PDF com várias Imagens

20 Caracteres - Tipo char

Bases Matemáticas. Aula 2 Métodos de Demonstração. Rodrigo Hausen. v /15

ANALÓGICA X DIGITAL. Vamos começar essa aula estabelecendo os dois tipos de eletrônica: Eletrônica Analógica. Eletrônica Digital

Lógica de Programação

Equações do segundo grau

Simulado OBM Nível 2

Ficha Técnica: Design e Impressão Mediana Global Communication

Introdução às Linguagens de Programação

SUMÁRIO 1. AULA 6 ENDEREÇAMENTO IP:... 2

ACH2043 INTRODUÇÃO À TEORIA DA COMPUTAÇÃO. Seção 5.1 Problemas indecidíveis. Slides originais gentilmente cedidos pela Profa. Ariane Machado Lima

Estrutura de Dados Básica

Cálculo Numérico Aula 1: Computação numérica. Tipos de Erros. Aritmética de ponto flutuante

Capítulo 1. x > y ou x < y ou x = y

MANUAL DE BOAS PRÁTICAS PARA CARTÕES BANCÁRIOS

Projeto e Análise de Algoritmos. Profa. Juliana Kaizer Vizzotto. Projeto e Análise de Algoritmos - Aula 1

A INTERNET COMPLETOU 20 ANOS DE BRASIL EM 2015.

Algoritmos e Programação (Prática) Profa. Andreza Leite andreza.leite@univasf.edu.br

É possível que cada pacote tenha: ( ) 2 ( ) 3 ( ) 4 ( ) 5 ( ) 6 ( ) 7 ( ) 9 ( ) Circule as frações equivalentes: 03- Escreva:

Programação de Computadores I Fluxogramas PROFESSORA CINTIA CAETANO

Aritmética Binária e. Bernardo Nunes Gonçalves

CAP. I ERROS EM CÁLCULO NUMÉRICO

Programação 1. Rafael Vargas Mesquita. ftp://ftp.ci.ifes.edu.br/informatica/mesquita/

Os Problemas de Natureza Econômica

Alunos dorminhocos. 5 de Janeiro de 2015

O Problema do Troco Principio da Casa dos Pombos. > Princípios de Contagem e Enumeração Computacional 0/48

Associação Educacional Dom Bosco Curso de Engenharia 1º ano

AV1 - MA (b) Se o comprador preferir efetuar o pagamento à vista, qual deverá ser o valor desse pagamento único? 1 1, , , 980

OBI2013 Caderno de Tarefas

3. O NIVEL DA LINGUAGEM DE MONTAGEM

MATEMÁTICA COMBINATÓRIA: INTRODUÇÃO

16 Comprimento e área do círculo

CONCURSO PÚBLICO VESTIBULAR/2015

Orientação a Objetos

Processamento da Informação Teoria. Algoritmos e Tipos de dados

Estruturas de Controle A Tomada de Decisões

A equação da posição em função do tempo t do MRUV - movimento retilíneo uniformemente variado é:

Unidade VI. Validação e Verificação de Software Teste de Software. Conteúdo. Técnicas de Teste. Estratégias de Teste

Como escrever melhor em 5 passos simples

LABORATÓRIO WIRESHARK: DNS

Introdução à Programação e Algoritmos. Aécio Costa

Tutorial Gerar arquivo PDF. Gerando um documento pdf com várias imagens 1- Inserir imagem no Word

Revisão - Reveja os pontos principais, o Plano de Ação ou os tópicos da discussão do encontro anterior.

quociente razão. mesma área a partes de um tablete de chocolate

Há 4 anos. 1. Que dificuldades encontra no seu trabalho com os idosos no seu dia-a-dia?

VisuALG Estruturas de Repetição. Professores: Vilson Heck Junior Felipe Schneider Costa

Soluções de Questões de Matemática do Centro Federal de Educação Tecnológica Celso Suckow da Fonseca CEFET/RJ

Computadores de Programação (MAB353)

Gabarito da Prova de Oficinas dos Velhos Ano 2008

XI Encontro de Iniciação à Docência

IBM1018 Física Básica II FFCLRP USP Prof. Antônio Roque Aula 6. O trabalho feito pela força para deslocar o corpo de a para b é dado por: = =

x0 = 1 x n = 3x n 1 x k x k 1 Quantas são as sequências com n letras, cada uma igual a a, b ou c, de modo que não há duas letras a seguidas?

Escolha da Objectiva. Quais as principais características das objectivas que servem de base para a escolha das suas lentes?

Transcrição:

Surge agora uma outra questão. Viemos buscando algoritmos para resolver problemas. No entanto, será que sempre seria possível achar esses algoritmos? Colocando de outra forma: será que, para todo problema, sempre vai existir um algoritmo que consiga resolvê-lo? Problemas insolúveis Algoritmos são programas que rodam em computadores digitais. Então, num primeiro impulso, dada a voz corrente de que computadores são máquinas extremamente poderosas, capazes de realizar qualquer tarefa concebível, poderíamos responder que sim, ou seja, que para todo problema semprem há de existir um algoritmo que o resolva a contento. No entanto, surpresa! Não poderíamos estar mais enganados! De fato, existe um vastíssimo elenco de problemas para os quais simplesmente não há algoritmo legítimo que o resolva. Observe que exigimos um algoritmo legítimo, que satisfaça as quatro propriedades básicas já enunciadas. Na verdade, existem problemas de cunho prático, e importantes, para os quais não há solução algorítmica possível. Será que com mais tecnologia, e.g., com computadores mais rápidos e com maior capacidade de memória, e dado tempo suficiente para rodar o programa, poderemos resolver esses problemas, no futuro? A resposta é não, novamente. Não é uma questão de capacidade de processamento, ou capacidade de memória, que impedem a solução algoritmica para esses problemas insolúveis. O impedimento é intrínseco aos algoritmos. Simplesmente não é possível descrever receitas adequadas para esses problemas. Computador digital nenhum vai resolver esses problemas, nem hoje, nem amanhã, nem nunca; nem aqui, nem em Marte, nem lugar algum. Nem que o computador seja capaz de rodar programas por quanto tempo quisermos (anos, séculos,...). Esse é um dos grandes e surpreendentes resultados em Teria da Computação obtidos no século passado, há não mais de 80 anos. Um exemplo simples e concreto Vamos exibir um exemplo simples de um problema insolúvel. Os dados de entrada são um conjunto finito, T, de tipos de ladrilhos. Por exemplo, na figura abaixo, o conjunto T seria formado por ladrilhos de três tipos. r a g a a r a a r a g r As letras próximas das bordas de cada ladrilho indicam as cores daquela borda, caso você esteja lendo uma impressão deste texto que não comporte cores. A seguinte legenda poderia ser usada 4/3/2009 07:50 1

Símbolo Cor r vermelha g verde a azul O problema é determinar se podemos ladrilhar qualquer grade nxn, com ladrilhos de tipos indicados no conjunto T. Uma grade n x n é uma região quadrada do plano subdividida em n x n celas iguais e uniformes. As seguintes condições devem ser respeitadas: 1. Os ladrilhos não podem ser girados, i.e., rotacionados. 2. Podemos usar tantos ladrilhos quantos forem necessários, desde que idênticos a um daqueles contidos no conjunto de tipos T. Ou seja, temos um estoque potencialmente ilimitado de cada tipo de ladrilho. 3. As cores nas faces de ladrilhos que se tocam, ao serem posicionados na grade, devem ser idênticas. 4. Na área quadrada demarcada, não podemos deixar regiões sem ladrilhar. Exemplo 1: Assuma que o conjunto T é formado pelos ladrilhos r a g a a r a a r a g r Uma região 3 por 3 do plano poderia ser ladrilhada com este conjunto de ladrilhos, como pode ser visto abaixo: 4/3/2009 07:50 2

Será que toda região quadrada pode ser ladrilhada com ladrilhos do tipo indicado? A resposta é positiva, embora não demonstremos esse fato aqui. Exemplo 2: Assuma agora um outro conjunto com três tipos de ladrilhos, como abaixo: r a g a a r a a r a r g É fácil verificar que uma região 3 por 3 não pode ser ladrilhada com esse conjunto de ladrilhos e obedecendo-se as condições impostas. Portanto, um algoritmo para resolver o problema deveria emitir uma resposta positiva tendo como entrada a instância do primeiro exemplo e deveria produzir uma resposta negativa quando executado tendo como entrada a instância do segundo exemplo. Uma instância para o primeiro caso, por exemplo, poderia ser dada pelo número n (o tamanho do lado da grade) e por uma descrição dos tipos de ladrilhos que podem ser usados. Basicamente, qualquer descrição desses dados serviria, desde que fosse formada por uma sequência finita de símbolos. O resultado surpreendente é que não existe um algoritmo capaz de resolver esse problema de forma geral. Ou seja, o algoritmo deveria dar a resposta correta sempre, não importa qual o conjunto de tipos de ladrilhos e o tamanho da grade que sejam dados como entrada. Podemos provar esse fato, matematicamente, embora não o façamos aqui. A inexistência de algoritmos para esse problema, simples e fácil de entender, implica em que NENHUM computador digital JAMAIS vai conseguir resolver esse problema, nem agora, nem nunca, nem com QUALQUER melhoria de tecnologia, nem com QUALQUER tamanho de memória, nem que rode POR QUANTO TEMPO QUISERMOS. Isto porque, se algum computador o fizesse, teríamos que tê-lo alimentado com um algoritmo apropriado, o qual já afirmamos que não existe. O problema, inocente à primeira vista, é simplesmente muito complicado para que um algoritmo legítimo possa resolver qualquer instância do problema. Uma pequena variante do exemplo Como uma variante do problema anterior, considere agora o caso onde não estamos interessados na possibilidade de se ladrilhar qualquer região quadrada do plano. Agora, damos como entrada, além do conjunto de tipos de ladrilhos, uma posição inicial, I, e uma posição final, F, localizadas na grade do plano. Tanto I quanto F são posições marcadas na grade do plano todo, que é infinito nas quatro direções. O problema é 4/3/2009 07:50 3

determinar se podemos ladrilhar um caminho partindo de I e chegando até F, podendo o caminho passear por toda a extensão do plano. É claro que valem as mesmas condições do problema anterior. Em particular, a faces de ladrilhos que se tocam ao longo do caminho devem ser da mesma cor. Como um exemplo, escolhemos, de novo, um conjunto de ladrilhos de três tipos, como abaixo: c z c a g g c a r r c z e, como marcações de início e fim, escolhemos como indicado abaixo: I F A questão, então, é se podemos sair ladrilhando da posição indicada por I até alcançar a posição indicada por F. Nesse caso, e com esses ladrilhos, a resposta é positiva: Então, será que existe uma receita infalível que, recebendo como entrada o conjunto de tipos de ladrilhos e as posições inicial e final, determina se existe o caminho ladrilhado? Mais, essa receita deve ser um algoritmo legítimo. 4/3/2009 07:50 4

Note que essa é uma pequena variante do problema anterior, para o qual já sabemos que não existe um algoritmo apropriado. Pois para o caso presente, existe um algoritmo que decide a questão, quaisquer que sejam o conjunto de ladrilhos e as posições marcadas! Podemos exibir o algoritmo e provar matematicamente sua correção parcial e terminação. Nessa variante, portanto, o problema se torna decidível algoritimicamente. Outra pequena variante O problema anterior permitia que o caminho vagasse por todo o plano, em princípio. Vamos considerar o mesmo problema de determinar se existe um caminho de I até F que podemos ladrilhar. Mas, agora, vamos impor uma condição extra bem simples: não permitimos que o caminho cruze uma dada linha horizontal que divide o plano em dois semi-planos. É claro que se I e F estiverem em semi-planos distintos, então o caminho não existirá. Mas e quando estão no mesmo semi-plano: será que existe um algoritmo que sempre determina se o caminho existe, dadas as posições de I e de F? A resposta, surpreendentemente, é negativa. Isto é, não existe um algoritmo que resolva essa questão, determinando se existe ou não o caminho. Pelo simples fato de permitirmos, ou não, que um caminho cruze uma linha horizontal fixa, o problema passa de decidível para não decidível! No primeiro caso, existe um algoritmo para resolvê-lo; no segundo caso, não. No primeiro caso, podemos programar um computador para nos dar a resposta, para qualquer instância de entrada. No segundo caso, não há programa de computador capaz de sempre nos dar a resposta correta! E podemos demonstrar esses fatos matematicamente. Um exemplo envolvendo programas Já sabemos que podemos codificar receitas em linguagens de programação, produzindo o texto fonte do programa. Fixe uma linguagem de programação de cunho geral, P. Ou seja, P deve ser ampla o suficiente tal qual uma linguagem de programação moderna, como C ou Pascal. Com isso queremos dizer que não vale tomar P como uma linguagem trivial. E um programa escrito em P só será considerado um algoritmo legítimo se, para todas as suas entradas válidas, o programa sempre pára. Isso nos leva à seguinte consideração: será que não podemos escrever um algoritmo, L, que, tendo como entrada o código de outros programas escritos na linguagem P, o programa L determina se o programa dado sempre vai parar quando alimentado com dados de entrada válidos? Ou seja, gostaríamos de um algoritmo L capaz de detectar ausência de loops em códigos fontes de outros programas escritos na linguagem P. Esse algoritmo L seria muito útil, pois evitaria que tivéssemos que demonstrar correção total dos algoritmos que codificássemos na linguagem de programação P. Ou seja, poderíamos automatizar as provas de terminação para programas escritos na linguagem P. Pois bem. Podemos demonstrar que um tal algoritmo L não existe. Ou seja, é impossível escrevermos um algoritmo que detecte ausência de loops em programas fonte escritos na linguagem P. A dificuldade não está na linguagem P, especificamente. Está na natureza do problema que queremos resolver, qual seja, a detecção de loops. Esse problema é simplesmente muito complicado para ser resolvido em um computador digital, 4/3/2009 07:50 5

algoritmicamente. Então, NENHUM computador JAMAIS vai conseguir testar se, dado um programa PROG (escrito em C, por exemplo), e dada a especificação das entradas válidas para PROG, EXISTE OU NÃO alguma entrada válida que force PROG a não parar (i.e., que force PROG a entrar em loop, como se diz) quando ele executa com aquela entrada. 4/3/2009 07:50 6