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: 28.641 ]

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

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

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

Leitura recomendada

Criando uma mala direta com OpenOffice.org

Administrar um servidor MS SQL pelo Linux

Tutorial Kettle

Utilizando arquivos Access (.mdb) no seu Linux

Instalando o Interbase 7.5 no Debian Sarge

  
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