Para a demonstração do tema proposto neste artigo será utilizado o compilador
GNU Prolog, que na presente data encontra-se na versão 1.3.0. A linguagem Prolog não possui grande padronização, e existem diversas outras implementações, com alguns recursos e sintaxes diferentes, como o SWI-Prolog e o Visual Prolog.
Em um sistema operacional
Linux Debian-like, podemos instalar o GNU Prolog com o comando:
# aptitude install gprolog
Um programa em Prolog deve ser escrito em um arquivo texto, geralmente com a extensão .pl, o que as vezes causa confusão com arquivos Perl. Uma vez instalado o GNU Prolog, podemos testá-lo criando um arquivo
teste.pl, com o seguinte conteúdo:
% programa de teste na linguagem Prolog
acessou(ip(200, 131, 10, 131), data(27, 12, 2009, domingo)).
acessou(ip(127, 0, 0, 1), data(22, 12, 2009, terca)).
classe_a(OCT1, OCT2, OCT3, OCT4) :-
OCT1 > 0, OCT1 < 126;
OCT1 = 126, OCT2 = 0, OCT3 = 0, OCT4 = 0.
final_de_semana(data(_, _, _, DIA)) :-
DIA = sabado; DIA = domingo.
Para executar o GNU Prolog, usa-se o comando:
gprolog
GNU Prolog 1.3.0
By Daniel Diaz
Copyright (C) 1999-2007 Daniel Diaz
| ?-
O programa que será compilado para a consulta deve ser especificado com o comando
consult, passando-se o caminho completo do arquivo teste.pl:
?-
consult('caminho/teste.pl').
compiling teste.pl for byte code...
teste.pl compiled, 11 lines read - 2039 bytes written, 22 ms
A partir deste ponto já é possível realizar consultas, como nos exemplos abaixo:
% "que IP acessou o site em um domingo do ano de 2009?"
?-
acessou(IP, data(_, _, 2009, domingo)).
IP = ip(200,131,10,131)
yes
% "que IP de classe A acessou o site em um domingo do ano de 2009?"
?-
acessou(ip(OCT1, OCT2, OCT3, OCT4), data(_, _, 2009, domingo)), classe_a(OCT1, OCT2, OCT3, OCT4).
no
% "qual o primeiro octeto dos ips que acessaram o site?"
?-
acessou(ip(OCT1, _, _, _), _).
OCT1 = 127 ? ;
OCT1 = 200
yes
Deve-se observar que, quando uma variável pode possuir mais de um valor (como no terceiro exemplo), o usuário deve pressionar ";" para ver o próximo valor, <ENTER> para finalizar a consulta e "a" para ver todas os resultados.
É possível visualizar o conteúdo da base pelo comando
listing:
?-
listing.
classe_a(A, B, C, D) :-
( A > 0,
A < 126
; A = 126,
B = 0,
C = 0,
D = 0
).
final_de_semana(data(_, _, _, A)) :-
( A = sabado
; A = domingo
).
acessou(ip(200, 131, 10, 131), data(27, 12, 2009, domingo)).
acessou(ip(127, 0, 0, 1), data(22, 12, 2009, terca)).
(4 ms) yes
Para finalizar o GNU Prolog, basta digitar o comando:
?-
halt.