Automatizando a criação de uma base de conhecimento em Prolog para gerenciar os acessos a um site

O presente artigo pretende demonstrar a implementação de uma base de conhecimento em Prolog, capaz de agregar dinamicamente novas informações a cada acesso a um site. Ela permitirá que o usuário formule consultas complexas e que necessitem de certo grau de inferência, de forma simples e relativamente próxima da linguagem natural.

[ Hits: 27.613 ]

Por: Rafael José de Alencar Almeida em 08/01/2010 | Blog: http://www.rafael-labs.com


Introdução



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
    Próxima página

Páginas do artigo
   1. Introdução
   2. GNU Prolog
   3. Gerenciando os acessos a um site
   4. Conclusão
Outros artigos deste autor

Esteganografia e Esteganálise: transmissão e detecção de informações ocultas em imagens digitais

Python: automatizando a extração de informações na web com expressões regulares

Leitura recomendada

Tutorial Kettle

JOINS - Uma introdução a JOINS em bancos de dados de forma didática

Criando uma mala direta com OpenOffice.org

Paginação de resultados com a classe ADODB

Instalando o Caché (banco de dados pós-relacional)

  
Comentários
[1] Comentário enviado por rony_souza em 08/01/2010 - 16:09h

muito bom...


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts