1 Das aplicações da lógica na Computação Bruno Silva Guedes 1 Leonardo Roveda Faganello 2 Matheus de Carvalho Proença3 Thiago Caberlon Santini 4 (artigo escrito para trabalho da disciplina INF05508 – Lógica para Computação) Resumo A lógica possui aplicações inesperadas em diversas áreas da Ciência da Computação. São sobre essas aplicações que o artigo On the Unusual Effectiveness of Logic in Computer Science versa. A lógica, que teoricamente é considerada derivada da Matemática, encontra muito mais aplicações práticas na Ciência da Computação, e baseado nos exemplos citados pelo artigo em inglês, resumimos aqui a idéia básica destas aplicações. 1 Graduando em Engenharia de Computação Universidade Federal do Rio Grande do Sul E-mail: [email protected] 2 Graduando em Engenharia de Computação Universidade Federal do Rio Grande do Sul E-mail: [email protected] 3 Graduando em Engenharia de Computação Universidade Federal do Rio Grande do Sul E-mail: [email protected] 4 Graduando em Engenharia de Computação Universidade Federal do Rio Grande do Sul E-mail: [email protected] Abril de 2008 INF05508 – Lógica para Computação 2 INTRODUÇÃO Considerada “o Cálculo da Ciência da Computação”, a lógica desempenhou um papel fundamental no desenvolvimento dessa área do conhecimento. Desenvolvida fortemente no início do século XX, com o objetivo de formalizar e reunir todo o conhecimento matemático até então desenvolvido, a lógica acabou perdendo espaço entre os matemáticos, após Gödel demonstrar que a lógica de primeira ordem não era suficiente para demonstrar a completude da Matemática. Após a metade do século XX, a lógica se desvinculou da matemática tradicional e seu desenvolvimento está concentrado na sua potencialidade de aplicações. Do mesmo modo que a matemática encontrou aplicações em áreas “inesperadas” nas Ciências Naturais, como Física, Biologia, Química, a Lógica encontrou amparo na Ciência da Computação, em aplicações como Complexidade de Algoritmos e Banco de Dados, bases da Teoria da Computação, Teoria dos Tipos, Circuitos Digitais e Lógica Epistêmica, outros tópicos fundamentais na Computação. Os tópicos a seguir são baseados no artigo On the Unusual Effectiveness of Logic in Computer Science, escrito por Joseph Halpern, Robert Harper, Neil Immerman, Phokion Kolaitis, Moshe Vardo e Victor Vianu. O artigo foi publicado no The Bulletin of Symbolic Logic, Volume sete, Número 2, em junho de 2001. 3 APLICAÇÕES NA TEORIA DE COMPLEXIDADE A computação nos auxilia na resolução de milhares de tipos de problemas. A forma como um computador resolve problemas se baseia na execução de um algoritmo previamente pensado por algum ser humano. Como o computador é limitado fisicamente, faz sentido prever que um computador leva mais tempo para resolver problemas mais difíceis. A medida de “dificuldade” de um problema está diretamente relacionada com a complexidade do algoritmo que o resolve. Encontrar melhores algoritmos para resolução de certos problemas sempre foi uma tarefa primordial para o desenvolvimento da Teoria da Computação. A lógica está intimamente ligada à criação e desenvolvimento destes algoritmos mais robustos. A aplicação que o artigo cita são os problemas P e NP. Em complexidade, problemas do tipo P são aqueles que podem ser resolvidos em tempo polinomial O(f(n)), onde f(n) é uma função do tipo anxn + an-1xn-1 + ... + a0 (polinômio). Já os problemas NP são problemas cujos algoritmos trabalham em tempo superior ao polinomial, geralmente exponencial (algo como O(an), a > 0 por exemplo). Dentro da classe de problemas NP, temos os chamados problemas NPCompletos, que não podem ser reduzidos a problemas do tipo P. Porém, existem certos problemas em NP que podem ser reduzidos a P com alguma manipulação lógica-algébrica. Com o uso da Complexidade descritiva e as Lógicas de Primeira e Segunda Ordem, chega-se ao seguinte corolário: Corolário. (P = NP) ⇔ FO(LFP) = SO, onde LFP é um operador de mínimo ponto fixo e FO e SO se referem às lógicas de primeira e segunda ordem, respectivamente. Os problemas que podem ser manipulados dessa maneira podem ser transformados em tempo polinomial em problemas NP-completos. Caso se descubra uma maneira de resolver problemas NP completo em tempo polinomial, então finalmente teríamos uma maneira de resolver todos os problemas em NP em tempo polinomial. Esta questão ainda continua em aberto, e é um dos maiores problemas não resolvidos da Ciência da Computação. LÓGICA EM BANCO DE DADOS O impacto da lógica nos bancos de dados é um dos melhores exemplos da efetividade da mesma sobre a ciência da computação. A lógica de primeira ordem 4 reside no núcleo dos bancos de dados atuais, sendo utilizada desde as linguagens mais básicas como SQL até algumas mais complexas onde são utilizadas extensões da lógica de primeira ordem junto com a recursão. Há três motivos principais para sua utilização: 1) - A lógica de primeira ordem possui variáveis sintáticas de fácil utilização. 2) - Pode ser implementada usando relações algébricas, o que representa uma vantagem crucial quando tratamos de uma grande quantidade de dados. 3) - Suas buscas podem demorar tempos constantes para qualquer tamanho do banco de dados se houver paralelismo suficiente. Uma busca que pode ser expressa em uma lógica de primeira ordem pode ser aberta em uma série de buscas menores, formando assim blocos fundamentais que podem ser usados na busca. Porém está abordagem não é satisfatória, pois pode ser muito lenta com o aumento do banco de dados. A abordagem utilizada na prática envolve relações algébricas. Em resumo, a lógica de primeira ordem e a relação algébrica expressam a mesma busca. O uso da álgebra de relações para realizar buscas pode ser implementada usando estruturas de dados chamadas de “indexes” que permitem acesso rápido aos dados, somando isso a algumas regras de reescrita, a mesma busca, após reescrita, pode levar apenas n log(n) em vez de n². Como citado antes, buscas usando a lógica de primeira ordem podem ser realizadas com tempo constante independente do tamanho do banco de dados, isto só pode ser realizado graças ao processamento em paralelo, onde mais uma vez a álgebra de relações nos permite tal feito. Porém é necessário o uso de muitos processadores tornando, por enquanto, inviável o uso de seu potencial máximo. Contudo há algoritmos que são capazes de tirar o máximo de proveito de um grupo de processadores e os processadores usados para realizar operações algébricas não precisam ser poderosos. Finalizando, a lógica é uma ferramenta muito efetiva na área de banco de dados. A lógica de primeira ordem é uma ótima base para as linguagens de busca padrão devido à sua implementação eficiente e seu fácil uso. 5 TEORIA DOS TIPOS NAS LINGUAGENS DE PROGRAMAÇÃO Nas décadas de 80 e 90, o estudo das linguagens de programação foi revolucionado por uma confluência de idéias da lógica matemática e filosófica e da teoria da computação: a Teoria dos Tipos. A Teoria dos Tipos, aplicada a um sistema de tipos, impõe restrições aos programas, prevenindo que ocorram vários erros, decorridos de falhas na interpretação dos valores, como, por exemplo, aplicar uma função a um número inteiro utilizando valores lógicos. Um sistema de tipo é definido da seguinte forma: Γ╟ e : τ, onde e é uma expressão, τ é seu tipo e Γ representa tipos das variáveis globais que podem ocorrer em e. Segundo o princípio das “proposições como tipos” há um isomorfismo entre proposições e tipos, com a propriedade que a dedução natural prova que uma proposição corresponde aos elementos de seu tipo associado. Esse princípio se estende aos conetivos lógicos e quantificadores, incluindo os de segunda ordem ou de ordem maior. Organizar linguagens de programação por estrutura de tipos possui vários benefícios, como evitar confusões de conceitos distintos, ocorrência de erros de interpretação, e aperfeiçoar a eficiência e a integridade do compilador. LÓGICA EPISTÊMICA Os estudos da lógica epistêmica se iniciaram nos anos 50, mas seu interesse só floresceu mais recentemente, para a implementação em vários campos da computação, como teoria dos jogos e IA. A chave dessa lógica é a conexão entre conhecimento e ação. O que um agente precisa saber sobre a operação de outro agente para realizar sua própria operação? Um modelo utilizado para isso é o seguinte: - Possuímos um conjunto Φ de proposições primitivas, onde uma proposição p pertencente a Φ, representa um fato básico, como por exemplo “Está chovendo na Espanha”, e um conjunto {1. . . . n} de agentes. - Utilizamos apenas conjunções e negações, como na lógica proposicional, e operadores modais K1,...Kn, E e C. Dessa forma, Kiφ é lido como “Agente i conhece 6 φ” , Eφ é lido como “Todos conhecem φ”, e Cφ é lido como “φ é de conhecimento comum.” A semântica dessa lógica, como a de outras lógicas modais, é baseada em mundos possíveis. VERIFICAÇÃO AUTOMATIZADA DE DESIGNS DE SEMICONDUTORES Os circuitos integrados construídos sobre semicondutores estão presentes praticamente na totalidade das interações tomadas em nosso dia-a-dia. Além disso, eles passaram a facilitar nossa vida cada vez mais, tornando-se capazes de executar tarefas cada vez mais complexas. Tal capacidade implica no aumento da complexidade do projeto de tais circuitos, que por sua vez acarreta numa cada vez maior dificuldade de desenhá-los, fazendo com que os projetistas não sejam capazes de usufruir o total potencial que a tecnologia é capaz de oferecer devido à grande possibilidade de erro. Para contornar esses problemas, os profissionais da área implementaram uma série de métodos de validação do circuito, que seriam capazes de verificar se o mesmo executa a função para qual foi projetado, concluindo assim se há erros no projeto ou não. Infelizmente, esse tipo de processo se tornou também complexo demais, atingindo o ponto em que a indústria passou a se referir ao problema como “crise da validação” quando o processo de validação atingiu metade dos recursos para a produção do circuito. Verificação formal é um processo matemático utilizado para verificar o comportamento de um modelo, dado uma especificação inicial. Recentemente, tal tipo de ferramenta era de interesse somente acadêmico, mas com a evolução do problema, passou a ser amplamente utilizado industrialmente. Um dos métodos mais utilizados a fim de tal prática é a lógica temporal linear (LTL – Linear Temporal Logic, em inglês), onde os momentos no tempo são tratados como se houvesse um único futuro possível. Em LTL as fórmulas são construídas com proposições atômicas, os operadores booleanos usuais e os operadores temporais unários X (próximo), F (eventualmente) e G (sempre), e o operador temporal binário U (enquanto). Esses operadores são capazes de modelar uma computação sobre a especificação dada, sendo possível verificar seu comportamento. 7 Ferramentas para modelagem e verificação do comportamento dos semicondutores não param em LTL. Há muitas outras abordagens lógicas possíveis para a resolução do problema, tendo, todas juntas, mostrado sua capacidade para auxiliar na continuidade da evolução da área, resolvendo problemas fundamentais para a computação. 8 CONCLUSÃO Os efeitos e aplicações da lógica sobre a computação se estendem sobre as mais diversas áreas da mesma, dos mais altos níveis, como inteligência artificial, aos mais baixos, como na produção dos circuitos integrados. Assim, fornece não somente uma base sólida para a fundamentação do ramo, mas também uma poderosa ferramenta para o desenvolvimento do mesmo.