O presente artigo pretende demonstrar o uso da linguagem de programação lógica
Prolog para a construção de uma base de conhecimento sobre os acessos a um site. Esta base será criada de forma dinâmica e automatizada, agregando novas informações a cada acesso ao site. Será possível formular diversas consultas com alto nível de complexidade e que necessitem de certo grau de inferência, de forma simples e relativamente próxima da linguagem natural. A base de conhecimento será capaz de responder, por exemplo, questões como:
"Quais IPs de classe A acessaram o site em um final de semana à noite, entre os meses de janeiro e março do ano de 2004?"
Inicialmente o artigo abordará os conceitos básicos de programação em lógica e da linguagem Prolog, visto que esta segue um paradigma declarativo, opondo-se ao tradicional paradigma procedural, presente nas linguagens mais difundidas como C, C++ e Java. Enquanto no paradigma procedural se define como um problema deve ser resolvido, no declarativo define-se apenas que informações são conhecidas e o quê deve ser feito, deixando-se a cargo da linguagem o modo de resolução do problema - o que é realizado de forma transparente ao usuário.
Também será abordado o processo de instalação e uso do compilador
GNU Prolog, antes do tópico que demonstrará a construção e manipulação da base de conhecimento. Esta será composta por um arquivo texto, inicialmente possuindo alguns fatos e regras, no qual serão apensadas novas informações a cada visita à página web.
A linguagem Prolog
Prolog é uma linguagem de programação lógica matemática. Ela foi criada em 1972 na Universidade de Aix-Marseille, por um grupo de pesquisadores sob a liderança de Alain Colmerauer. O termo Prolog é um acrônimo para
PROgrammation en LOGique, uma vez que o programador precisa apenas descrever a estrutura lógica do problema a ser solucionado, deixando a cargo da linguagem a forma como este será solucionado.
O objetivo inicial do Prolog era a resolução de problemas baseados em linguagem natural, ou seja, linguagens faladas pelos seres humanos. Portanto, possui algumas oposições básicas em relação às linguagens de programação tradicional, como: processamento simbólico ao invés de processamento numérico, soluções heurísticas ao contrário de soluções algorítmicas e capacidade de apresentar múltiplas soluções e soluções parcialmente corretas para um determinado problema.
Essas características, aliadas à facilidade de representação, inserção e recuperação de conhecimento, capacidade de dedução e recursividade natural tornam a linguagem Prolog extremamente poderosa para resolução de problemas como:
- Análise de teoremas matemáticos;
- Inteligência Artificial;
- Sistemas especialistas;
- Processamento de linguagem natural;
- Redes semânticas;
- Banco de dados etc.
A estrutura fundamental da linguagem Prolog são os
fatos, as
regras e as
consultas. Estes conceitos serão introduzidos, em um nível básico, nos tópicos abaixo, conjuntamente com a noção de estruturas:
Fatos
Os fatos determinam informações e relações entre os objetos descritos, e denotam para o sistema uma verdade incondicional. Por exemplo, o horário de acesso a um site pode ser definido pelo seguinte fato:
acessou('76.74.248.57', '21:40').
O termo "acessou", também chamado de predicado, define uma relação, que possui dois argumentos, sendo eles dois objetos: um endereço IP e um horário de acesso. Em Prolog, os predicados e os objetos devem iniciar com letra minúscula ou número. Os argumentos devem ser separados por vírgulas, e o fato deve ser encerrado com ponto final. É importante notar que acessou('76.74.248.57', '21:40') não equivale a acessou('21:40', '76.74.248.57').
Regras
Enquanto os fatos definem informações
incondicionalmente verdadeiras, as regras
podem ser verdadeiras, caso determinadas condições sejam satisfeitas. Em Prolog, pode-se definir se um IP pertence à classe A, pela seguinte regra:
classe_a(OCT1, OCT2, OCT3, OCT4) :-
OCT1 > 0, OCT1 < 126;
OCT1 = 126, OCT2 = 0, OCT3 = 0, OCT4 = 0.
Onde "classe_a" é o nome da regra, e "OCT1", "OCT2", "OCT3" e "OCT4" são variáveis (iniciam com letra maiúscula) que representam os quatro octetos que compõe um endereço IP. O símbolo ":-" significa
se, e separa a regra em conclusão à esquerda e corpo à direita. No corpo da classe, a vírgula representa uma conjunção, semelhante ao operador lógico AND. O ponto-e-vírgula representa uma disjunção, assemelhando-se ao operador lógico OR.
Assim, a regra acima define que um IP é de classe A
se o valor de seu primeiro octeto estiver entre 1
e 125
ou se ele for 126
e os demais octetos possuírem valor 0.
Consultas
Uma consulta é uma seqüencia de um ou mais objetivos propostos ao sistema pelo usuário. Para obter uma resposta, o Prolog busca satisfazer os objetivos que compõe a consulta, a partir de deduções diretas ou indiretas a partir de sua base de conhecimento. Assim, a consulta do usuário pode ser entendida como um teorema a ser provado, com base nos axiomas representados pelo conjunto das cláusulas que constituem o programa.
Se a consulta proposta for verdadeira, o sistema retornará
yes, e, caso contrário,
no. Caso hajam variáveis envolvidas na consulta, e esta seja verdadeira, o sistema retornará o valor ou conjunto de valores das variáveis para os quais a consulta será válida.
As consultas podem ser realizadas no modo interativo do Prolog, que inicia-se com o operador
?-. Seguem algumas consultas relativas ao fato e à regra definidos nos exemplos acima (% e /**/ são comentários, respectivamente, de uma linha e de múltiplas linhas):
% "o IP 76.74.248.57 acessou o site às 21:40 horas?"
?-
acessou('76.74.248.57', '21:40').
yes
% "a que horas o IP 76.74.248.57 acessou o site?"
?-
acessou('76.74.248.57', Horario).
Horario = '21:40'
yes
% "o IP 76.74.248.57 é de classe A?"
?-
classe_a(200, 131, 10, 131).
no
Estruturas
Estruturas são objetos que possuem vários componentes. Estes, por sua vez, também podem ser estruturas. Por exemplo, a data de acesso a um site pode ser armazenada sob a forma de uma estrutura com quatro componentes: dia, mês, ano e dia por extenso. Estes objetos devem ser agrupados em uma única estrutura por um símbolo funcional (
functor), que no exemplo abaixo será "data":
data(27, 12, 2009, domingo).
No exemplo, os 4 argumentos são constantes (lembrando que variáveis iniciam-se com letra maiúscula ou _). Em Prolog todos os objetos estruturados são árvores. No caso do exemplo anterior, o
functor "data" é a raiz, e os quatro argumentos são as folhas da árvore. Podemos tornar as buscas de informações em estruturas mais genéricas e eficientes utilizando-se a variável anônima "_". Seguem alguns exemplos de consulta relativos a estrutura definida acima:
% "qual dia da semana foi 27/12/2009?"
?-
data(27, 12, 2009, NOME).
NOME = domingo
yes
% "que dia caiu em um domingo?"
?-
data(DIA, _, _, domingo).
DIA = 27
yes