Autor: Diego | Publicado: 2009-06-06T11:50:00-07:00

Programação Lógica  Rômulo Gama, Diego Augusto, Eduardo Assis     Programação lógica é um paradigma de programação que faz uso da lógica matemática. John McCarthy [1958] foi o primeiro a publicar uma proposta de uso da lógica matemática para programação.  A primeira linguagem de programação lógica foi a Planner, a qual permitia a invocação orientada a padrões de planos procedimentais de asserções e de objetivos. Com a necessidade de adaptação aos sistemas de memória muito limitada, que eram disponíveis quando ela foi desenvolvida. A linguagem Planner usava estruturas de controle de backtracking, de tal forma que apenas um único caminho computacional tinha que ser armazenado por vez. Em seguida, o Prolog foi desenvolvido como uma simplificação do Planner que permitia a invocação orientada a padrões apenas a partir de objetivos (também baseado em backtracking).  A partir do Planner, foram desenvolvidas as linguagens de programação QA-4, Popler, Conniver, e QLISP. As linguagens de programação Mercury, Visual Prolog, Oz e Frill, foram desenvolvidas a partir do Prolog. Atualmente existem linguagens de programação lógica concorrentes (não baseadas em backtracking) derivadas do Planner (por exemplo, a Ether) e derivadas do Prolog (Shapiro).     História  A programação lógica é uma idéia que tem sido investigada no contexto da inteligência artificial pelo menos desde o momento em que John McCarthy propôs: "programas para manipular com sentenças instrumentais comuns apropriadas à linguagem formal (muito provavelmente uma parte do cálculo de predicado)". O programa básico formará conclusões imediatas a partir de uma lista de premissas. Essas conclusões serão tanto sentenças declarativas quanto imperativas. Quando uma sentença imperativa é deduzida, o programa toma uma ação correspondente.     Base na Lógica Matemática  O sentido da programação lógica é trazer o estilo da lógica matemática à programação de computadores. Matemáticos e filósofos encontram na lógica uma ferramenta eficaz para desenvolvimento de teorias. Vários problemas são naturalmente expressos como teorias. Dizer que um problema precisa de solução frequentemente equivale a perguntar se uma nova hipótese é consistente com uma teoria existente ou se é conseqüência dela. A lógica proporciona uma maneira de demonstrar se uma questão é verdadeira ou falsa.  O processo de construir uma demonstração é bem conhecido, portanto a lógica é um meio confiável de responder perguntas. Sistemas de programação lógica automatizam      este processo. A inteligência artificial teve uma influência importante no desenvolvimento da programação lógica.  As proposições são indicadas pelas letras latinas minúsculas: p, q, r, s, t.  Exemplo:Prolog  Escolhemos a linguagem de programação Prolog, para exemplificar. A linguagem de programação Prolog foi explicitamente apresentada como baseada na lógica matemática. A base dessa alegação era que um programa Prolog podia literalmente ser lido como um conjunto de fórmulas em um fragmento da lógica de primeira ordem, herdando o modelo de teoria e demonstração da lógica de primeira ordem.  Prolog foi desenvolvida em 1972 por Alain Colmerauer. Ela veio de uma colaboração entre Colmerauer em Marselha e Robert Kowalski em Edinburgo. Colmerauer estava trabalhando na compreensão da linguagem natural, usando lógica para representar semânticas e usando resolução para questionamento-resposta. Durante o verão de 1971, Colmerauer e Kowalski descobriram que a forma clausal da lógica poderia ser usada para representar gramáticas formais e que demonstrações do teorema da resolução poderia ser usado para análise gramatical. Eles observaram que algumas demonstrações de teoremas, como o da hiper-resolução, comportavam-se como analisadores ascendentes e outros, como resolução-SL (1971), comportavam-se como analisadores descendentes.  Durante o seguinte verão de 1972, Kowalski, novamente trabalhando com Colmerauer, observou que resolução-SL trata cláusulas universalmente quantificadas na forma declarativa de implicações.        B1 e … e Bn implica H.            como procedimentos de objetivo-redução                 para   mostrar/resolver H, mostrar/resolver B1 e … e Bn.               Essa interpretação dupla declarativa/procedimental depois foi formalizada na notação do Prolog                 H :- B1, …, Bn.               que pode ser lida (e usada) tanto declarativamente como procedimentalmente. Tornou-se também claro que tais cláusulas poderiam ser restringidas para definir cláusulas ou cláusulas de Horn, em que H, B1, …, Bn são todos os predicados atômicos, e que resolução-SL poderia ser restrita (e gerada) para LUSH ou resolução-SLD.  Colmerauer, com Philippe Roussel, usou essa interpretação dupla de cláusulas assim como a base do Prolog, a qual foi implementada no verão e outono de 1972. O primeiro programa na linguagem, também escrito em 1972 e implementado em Marseille, foi um sistema francês de pergunta-resposta. A interpretação procedimental de Kowalski e LUSH foi depois descrita em um memorando em 1973, publicado em 1974.  A relação próxima entre interpretação declarativa e processual resulta numa característica típica das linguagens de programação lógica, embora a relação se torne mais complexa quando há negação, disjunção e outros quantificadores são permitidos em programas.Exemplo: Queens Prolog  é um exercício muito simples, mostrando o básico do jogo estratégico programação. O código fonte está disponível apenas para Turbo Prolog.     Limitações para o uso da Lógica Matemática para a Programação  John MacCarthy propôs que a lógica matemática fosse usada como o fundamento para a epistemologia de sistemas de computadores. Sob a liderança de Marvin Minsky e Seymour Papert, uma abordagem diferente baseada em procedimentos processuais foi desenvolvida no MIT. Quando o Planner foi desenvolvido, levantou-se o a questão sobre o relacionamento entre as duas abordagens.  Robert Kowalski desenvolveu a tese que "computação pode concebida dedução" teve boa aceitação ao citar o slogan "a computação é uma dedução controlada," que ele atribuiu a Pat Hayes em seu artigo de 1988 no início da história do Prolog. Ao contrário de Kowalski e Hayes, Carl Hewitt desenvolveu a tese de que a dedução lógica era incapaz de executar computação concorrente em sistemas abertos. A resposta à questão sobre a relação entre as abordagens lógica e procedimental é que a abordagem procedimental tem uma semântica matemática diferente (ver semântica denotacional) da semântica da lógica matemática (ver teoria dos modelos).     Programação Lógica Concorrente  Keith Clark, Hervé Gallaire, Steve Gregory, Vijay Saraswat, Udi Shapiro, Kazunori Ueda, etc. desenvolveram uma família de sistemas concorrentes de passagem de mensagens do tipo Prolog, usando unificação de variáveis compartilhadas e fluxo de estrutura de dados para mensagens. Esforços foram feitos para basear esses sistemas em lógica matemática, e elas foram usadas como a base para o Projeto Japonês da Quinta Geração de Computadores.  Como o modelo de atores, os sistemas com o Prolog concorrente são baseados em passagem de mensagens e conseqüentemente estavam sujeitos à mesma indeterminação. Esta foi a base de um argumento de Carl Hewitt e Gul Agha sugerindo que os sistemas com Prolog concorrente nem eram dedutivos nem lógicos.     Programação Lógica de Ordem Superior     Diversos pesquisadores estenderam a programação lógica com as características da programação de ordem superior derivadas da lógica de ordem superior, tais como variáveis de predicado. Tais linguagens incluem as extensões do Prolog HiLog e λProlog.     Programação Lógica Linear     Basear a programação lógica na lógica linear resultou no projeto de linguagens de programação lógica que são consideravelmente mais custosas do que aquelas baseadas na lógica clássica. Programas com cláusulas de Horn (Prolog) podem apenas representar uma mudança de estado pela mudança em argumentos para predicados. Na programação lógica linear, pode-se usar a lógica linear como ambiente para dar suporte à mudança de estado. Alguns projetos iniciais das linguagens de programação lógica baseadas na lógica linear, incluem LO [Andreoli &amp; Pareschi, 1991], Lolli [Hodas &amp; Miller, 1994], ACL [Kobayashi &amp; Yonezawa, 1994], e Forum [Miller, 1996].O Fórum proporciona a interpretação direcionada a objetivos de toda a lógica linear.