Prolog

Histórico e Propósitos

     O termo Prolog é derivado da expressão "Programming in Logic", uma vez que é baseado em Lógica de Predicados de 1a ordem.
     O Prolog é uma linguagem de programação prática e eficiente, introduzida

em 1973 por Alain Colmerauer e seus associados na Universidade de Marseille,

com o propósito inicial de traduzir linguagens naturais. Em 1977, David Warren da

Universidade de Edimburgo, implementou uma eficiente versão do Prolog,

batizada de Prolog-10. A partir daí, tornou-se uma escolha natural para a resolução

de problemas que envolvem a representação simbólica de objetos e relações entre

objetos. O fundamento básico por trás do Prolog é a noção de programação em

lógica, onde o processo de computação pode ser visto como uma sequência lógica

de inferências. Esta noção desenvolve-se então de modo a resultar em um

mecanismo automático de prova de teoremas. Atualmente, o Prolog é utilizado em

diversas aplicações na área de computação simbólica, incluindo-se aí: bases de

dados relacionais, sistemas especialistas, lógica matemática, prova automática de

teoremas, resolução de problemas abstratos e geração de planos, processamento de

linguagem natural, projeto de arquiteturas, logística, resolução de equações

simbólicas, construção de compiladores, análise bioquímica e projeto de fármacos.

     O Prolog é uma linguagem diferente, mas de uma simplicidade marcante.

Essa diferença decorre do fato de o Prolog ser uma linguagem funcional, e não uma

linguagem procedural. Sua estrutura conceitual está intimamente ligada com a

lógica matemática, o que a torna uma ferramenta indispensável para o estudo de

lógica. Versões diferentes do Prolog podem ser encontradas nas mais diversas

plataformas, tanto na forma de compiladores como de interpretadores.


Propósito da criação: criar programas para tradução de linguagem natural (= linguagens faladas, como português, inglês).
Não é uma linguagem padronizada: padrão ANSI esta sendo formalizado. Enquanto isso, o livro de Clocksin e Mellish, "Programming in Prolog" (1984) é um padrão não oficial.
Geralmente é interpretado, mas pode ser compilado.
Escolhida para o projeto japonês da linguagem de 5a. Geração.

Principais aplicações

Principais aplicações se dão na área de computação simbólica:
Lógica matemática, prova automática de teoremas e semântica;
Solução de equações simbólicas;
Bancos de dados relacionais;
Linguagem Natural;
Sistemas Especialistas;
Planejamento Automático de Atividades;
Aplicações de "General Problem Solving", como jogos (Xadrez, Damas, Jogo da Velha, etc.);
Compiladores;
Análise Bioquímica e projetos de novas drogas.

Interpretador Prolog

Compilador Prolog no estilo ISO/Edinburgh. Compatível com a parte 1 do padrão ISO para Prolog. Cobre todas as qualidades tradicionais do Prolog Edinburgh e compartilha muitas qualidades com os Prologs SICSTUS e Quintus, incluindo um sistema de módulos compatível. Compilador muito rápido, coletor de lixo (também em átomos), interface com C/C++ rápida e poderosa, "autoloading", "GNU-readline interface".

SWI-Prolog foi projetado e implementado para que possa ser facilmente modificado para experimentos com programação em lógica e o relacionamento entre programação em lógica e outros paradigmas de programação (tal como o ambiente orientado a objeto XPCE). SWI-Prolog tem um rico conjunto de predicados e performance de raciocínio embutidos, que torna possível desenvolver aplicações substanciais nele. A versão atual oferece um sistema de módulos, coletor de lixo e uma interface para a linguagem C.

 

 

Meta-interpretador Prolog para Prolog

 

Meta-interpretador Prolog para Prolog

 
/* a interpretacao do termo basico true 
   deve ser sempre satisfeita (axioma)
*/
interp(true).
/* a interpretacao de uma conjuncao e'
   satisfeita, se a interpretacao de cada
   termo/literal da conjuncao for satisfeita
*/
interp((G1,G2)) :- 
      interp(G1),
      interp(G2).
/* a interpretacao de uma disjuncao e'
   satisfeita, se pelo menos uma interpretacao 
   de alguma disjuncao for satisfeita
*/
interp((G1;G2)) :- 
      interp(G1);
      interp(G2).
/* a interpretacao de um literal simples
   e' satisfeita, se o literal existir no
   programa e seu antecedente for satisfeito
*/
interp(G) :-
      clause(G,B),
      interp(B).

 

 

Links: 

- http://www.cos.ufrj.br/~ines/courses/LP/prolog1/

- http://www.cin.ufpe.br/~if684/aulas/PrologSI.ppt

- http://www.swi-prolog.org