• Nenhum resultado encontrado

Indecidibilidade da LPO

No documento Lógica Computacional e Algoritmos (páginas 55-64)

A. SejaMuma interpretação ondeA={a, b, c, d}erM={(b, c),(b, b),(b, a)}. É o caso queM |=φ?

B. SejaM0 uma interpretação ondeA0={a, b, c}erM0 ={(b, c),(a, b),(c, b)}. É o caso queM0 |=φ?

vii. É o caso que∀x(p(x)∨q(x))|=∀xp(x)∨ ∀xq(x)? Em caso afirmativo, construa uma prova, e em caso negativo justifique sua resposta.

viii. É o caso que∃x(p(x)∨q(x))|=∃xp(x)∨ ∃xq(x)? Em caso afirmativo, construa uma prova, e em caso negativo justifique sua resposta.

ix. Considere as seguintes sentenças:

x(∃y(x+y= 0)∧ ∃z(z+x= 0))

x((x+ 0 =x)∧(0 +x=x))

xyz(x+ (y+z) = (x+y) +z)

Sejaγ a conjunção destas três sentenças.

A. Mostre queγé satisfatível.

B. Mostre que γnão é uma tautologia.

C. Mostre que a sentença∀xy(x+y=y+x)não é consequência lógica deγ. x. Determine se os sequentes a seguir são válidos ou não, e justifique sua resposta:

A. `(∀xyp(x, y))→(∃yxp(x, y)) B. `(∃yxp(x, y))→(∀xyp(x, y))

Um exemplo de uma instância deste problema é (1,101),(10,00),(011,11). Note que esta instância possui a sequência (1,3,2,3)como solução. Observe que nosso espaço de busca é infinito, e isto nos dá uma certa intuição da razão pela qual este problema não é solúvel em geral.

Assumindo então a indecidibilidade do PCP, provaremos que a noção de validade na LPO também é indecidível conforme [19]. Iniciaremos definindo a noção redutibilidade entre problemas:

Definição 97. Um problemaAé redutível para um problemaB se existe uma função (total) computável f :A→B tal que:

x∈A⇐⇒f(x)∈B.

Nossa prova consiste em reduzir o PCP para o problema da validade na LPO, construindo uma função computável que a cada instância do PCP retorna uma fórmula da LPO. Desta forma, se validade na LPO fosse decidível poderíamos construir um algoritmo para decidir PCP da seguinte forma:

• para cada instância C de PCP construímos uma fórmulaφC tal queφC é válida se, e somente se, C possui uma solução.

Teorema 98. A LPO é indecidível.

Proof. A prova consiste em dada uma instância C do problema da correspondência de Post, construir em espaço e tempo finitos uma fórmula φC da LPO tal que|=φC se, e somente se, a instância C tem uma solução. Seja C a sequência (s1, t1),(s2, t2), . . . ,(sk, tk). Consideramos como símbolos de função e, f0, f1 de aridade 0, 1, 1 respectivamente. Interpretamos e como sendo a palavra vazia, e f0 e f1 como sendo a concatenação com 0 e 1, respectivamente. Assim, se b1b2. . . bl é uma palavra binária então podemos codificá-la como sendo o termo fbl(fbl−1. . .(fb2(fb1(e))). . .). Para facilitar a leitura das fórmulas abreviaremos um termo da forma fbl(fbl−1. . .(fb2(fb1(t))). . .) por fb1b2...bl(t). Também utilizaremos um predicado bináriop, ondep(s, t)significa “existe uma sequência de índices(i1, i2, . . . , im) tal que s é o termo representando si1si2. . . sim e t é o termo representando ti1ti2. . . tim”. Ou seja, s constrói uma palavra utilizando a mesma sequência de índices utilizada port. Nossa fórmula φCpossui a seguinte estrutura: (φ1∧φ2)→φ3, onde:

φ1 :=

k

^

i=1

p(fsi(e), fti(e))

φ2 := ∀vw(p(v, w)→

k

^

i=1

p(fsi(v), fti(w))) φ3 := ∃zp(z, z)

Afirmação: |=φC sse a instânciaC do problema da correspondência de Post tem uma solução.

Inicialmente vamos assumir que|=φC. Nossa estratégia é encontrar um modeloMparaφC que nos diga que existe uma solução para a instânciaC por simples inspeção do significado da satisfatibilidade deφCparaM. O universoAdeMé o conjunto de todas as palavras binárias finitas incluindo a palavra vazia (que denotaremos por), isto éA={0,1}. A interpretaçãoeM da constanteeé a palavra vazia . A interpretaçãof0M def0 é a concatenação de 0 a uma dada palavra: f0M(s) =s0. Analogamente, f1M(s) =s1. Por fim,

pM := {(s, t)| existe uma sequência de índices (i1, i2, . . . , im)tais quesé igual a

ondeset são palavras binárias esi eti são dados deC.

Por hipótese temos que |= φ, e portanto M |= φ. Mostraremos que M |= φ3, de onde podemos concluir que a instânciaC possui uma solução.

Afirmação 1: M |=φ1. De fato, a sequência unitária(i)é tal quep(fsi(e), fti(e))é verdadeiro para todoi= 1, . . . , k.

Afirmação 2: M |=φ2. De fato,(s, t)∈pM implica que existe um sequência(i1, i2, . . . , im)tal que sé igual asi1si2. . . sim eté igual ati1ti2. . . tim.

Escolhendo a sequência(i1, i2, . . . , im, i)temos quessié igual asi1si2. . . simsiettié igual ati1ti2. . . timti, e portantoM |=φ2. Temos queM |= (φ1∧φ2)→φ3eM |=φ1∧φ2, e portantoM |=φ3. Pela definição deφ3 epM, concluímos que existe uma solução paraC.

Reciprocamente, suponha que a instância C dada do problema da correspondência de Post possui uma solução, a saber (i1, i2, . . . , in). Precisamos provar que se M0 é um modelo qualquer contendo a constanteeM0, duas funções unáriasf0M0 ef1M0, e um predicado bináriopM0 entãoM0satisfazφ. Como φé uma implicação, não há nada a fazer se M06|=φ1 ouM0 6|=φ2. A parte interessante é mostrar que M0|=φ3sempre queM0 |=φ1∧φ2. Faremos isto interpretando palavras binárias finitas no domínioA0 deM0:

i() := eM0 i(s0) := f0M0(i(s)) i(s1) := f1M0(i(s))

Note que a funçãoi:{0,1}→A0 é definida indutivamente sobre o comprimento des.

A função de interpretação iaplica as funções f0M0 ef1M0 de forma reversa. Por exemplo, a palavra 0100110 é interpretada como f0M0(f1M0(f1M0(f0M0(f0M0(f1M0(f0M0(eM0))))))). Note que i(b1b2. . . bl) = fbM0

l (fbM0

l−1(. . .(fbM0

1 (eM0)). . .)) corresponde ao significado dado para fs(e) em A0, onde s corresponde a b1b2. . . bl. Sendo assim, e sabendo que M0 |= φ1 concluímos que (i(si), i(ti)) ∈ pM0 para todo i = 1,2, . . . , k. Analogamente, como M0 |= φ2 concluímos que para todo (s, t) ∈ pM0 temos que (i(ssi), i(tti))∈pM0 para todo i= 1,2, . . . , k. Iniciando com (s, t) = (si1, ti1) podemos utilizar o fato anterior repetidamente para obter que

(i(si1si2. . . sin), i(ti1ti2. . . tin))∈pM0.

Como as palavrassi1si2. . . sineti1ti2. . . tinformam uma solução deCestas palavras são iguais. Sendo assim,i(si1si2. . . sin)ei(ti1ti2. . . tin)representam o mesmo elemento deA0. LogoM0|=∃zp(z, z), isto é,M0|=φ3. Logo validade na LPO é um problema indecidível.

Part II

Algoritmos

Nesta seção vamos utilizar os temas abordados nos capítulos anteriores para analisar algoritmos.

Os computadores e seus algoritmos estão presentes na maioria das atividades quotidianas, utilizamos computadores para fazer compras, transações bancárias, etc. Os carros, aviões e equipamentos hospitalares modernos também possuem diversos sistemas embarcados. A medida em que estes equipamentos de tornam mais comuns em nosso dia a dia, aumenta também o seu poder de processamento e de armazenamento.

Diante desta realidade é natural perguntar: por que analisar algoritmos? Inicialmente porque precisamos garantir que são corretos. Mas o que significa dizer que um algoritmo é correto? Intuitivamente, significa que o algoritmo sempre fornece respostas corretas para qualquer entrada possível. Por exemplo, se AlgOrd é um algoritmo de ordenação de inteiros, então espera-se que para qualquer vetor de inteiros A dado, AlgOrd(A) retorne uma permutação deAque esteja ordenada. Isto significa que as respostas dadas pelo algoritmo são corretas para todas as entradas possíveis, e que estas respostas são geradas em tempo finito. Como veremos, em alguns casos a prova de correção é simples, mas em geral esta é uma tarefa complexa. Uma ferramenta que será utilizada frequentemente nas provas de correção de algoritmos é a indução matemática estudada no capítulo anterior.

Adicionalmente, precisamos analisar a eficiência destes algoritmos. Mas não poderíamos simplesmente migrar para um computador mais potente e com mais capacidade de armazenamento quando fosse necessário? A resposta é não. Ainda que tivéssemos uma capacidade infinita de processamento e/ou de armazenamento, a análise da eficiência seria necessária. De fato, não faz sentido ter que esperar horas para a finalização de um processamento se for possível fazê-lo de forma mais eficiente em apenas alguns segundos, ou utilizar uma quantidade gigantesca de memória sem necessidade. Estudaremos diversos problemas ao longo deste curso, e veremos situações em que uma abordagem ingênua (força bruta) requer um número exponencial de operações, enquanto que uma abordagem cuidadosa pode diminuir substancialmente o número de operações necessárias para resolver o mesmo problema. Ao analisarmos a eficiência dos algoritmos também faremos o uso de diversas ferramentas matemáticas (somatórios, conjuntos, funções, matrizes, etc). O apêndice VIII do livro [12] pode ser usado para revisar estes temas.

Já a análise da complexidade de tempo e/ou complexidade de espaço de um algoritmo consiste no estudo sistemático do número de operações realizadas, ou espaço extra demandado, durante a execução do algoritmo.

Chapter 4

Análise Assintótica

O ponto de partida do estudo que faremos consiste em determinar a quantidade de recursos demandados por um algoritmo em função do tamanho das instâncias, e neste contexto, é natural esperar que quanto maior for a instância a ser resolvida, maior também será a quantidade de recursos demandados. Os recursos que estamos interessados em investigar são basicamente o tempo de computação e o espaço de armazenamento (ou memória). Assim, considerando novamente o contexto de ordenação de listas (ou vetores), quanto maior for a lista a ser ordenada (instância), maior será o tempo (recurso) demandado.

Isto sugere então que para o problema de ordenação, o tamanho das instâncias seja justamente o número de elementos da lista (ou vetor) a ser ordenado.

O parâmetro n que denota o tamanho da entrada também precisa ser fornecido a partir de uma medida adequada para que possamos fazer uma análise concisa. Para o caso de ordenação de uma lista (ou vetor), vimos que o número de elementos da lista representa uma medida adequada, e a tabela abaixo apresenta outros exemplos:

Problema Tamanho da entrada

Busca em um vetor Tamanho do vetor Multiplicação de duas matrizes Dimensão das matrizes

Busca em grafos Tamanho da representação do grafo1

O modelo computacional que utilizaremos é o de uma máquina de acesso aleatório (random-access machine - RAM) com um processador, e devemos lembrar que nossos algoritmos serão implementados

como programas neste modelo, onde as instruções são executadas sequencialmente, sem operações concorrentes[12, 24, 22, 5, 7]. As instruções no modelo RAM são as encontradas em computadores reais:

• aritmética (soma, subtração, multiplicação, divisão, resto, piso e teto);

• movimento de dados (load,store, copy);

• controle (ramos condicionais e não-condicionais, chamadas a subprocedimentos e retorno).

Assumiremos que cada uma destas instruções é executada em tempo constante. Além disto, os tipos abstratos de dados deste modelo são os números inteiros e números em ponto flutuante.

Vejamos agora os fundamentos para a análise da eficiência de algoritmos. O que significa dizer que um algoritmo é eficiente? Podemos analisar a eficiência de um algoritmo de duas formas: eficiência temporal e eficiência espacial. No primeiro caso, estamos interessados no tempo de execução do algoritmo,

4O tamanho da representação normalmente é determinado a partir do número de vértices e número de arestas do grafo.

enquanto que no segundo caso, queremos analisar a quantidade de espaço extra (memória) que é utilizado pelo algoritmo durante sua execução. A forma de determinar a eficiência de um algoritmo deve permitir a comparação de algoritmos distintos que resolvam o mesmo problema. Inicialmente, poderíamos pensar em utilizar o tempo de execução de um programa que implementa um algoritmo, mas esta não é uma boa medida porque depende tanto do computador (hardware) quanto da implementação (software). Precisamos de um método que nos informe sobre a eficiência do algoritmo independentemente do computador em que ele venha a ser implementado, da linguagem de programação e do estilo de programação utilizados. O método deve ser preciso e geral de forma que possa ser utilizado para diversos algoritmos e aplicações. Uma ideia inicial é contar todas as operações realizadas pelo algoritmo, mas veremos que esta abordagem possui alguns problemas, além de ser muito trabalhosa.

No documento Lógica Computacional e Algoritmos (páginas 55-64)