Linguagens de programação - Prolog
Luiz em 29/09/2008
Continuando com nossa série sobre linguagens de programação, vou falar um pouco sobre um linguagem um tanto estranha, mas muito poderosa: Prolog. Ao contrário das outras linguagens já abordadas (vide acima), Prolog não é uma linguagem imperativa, na qual você “dá ordens” para o computador, mas sim uma linguagem declarativa, na qual você “diz” para o computador como é o problema que seu programa deve resolver.
A princípio, isso pode parecer mágica, mas existe toda uma teoria de lógica por trás. Um programa em Prolog é, na verdade, um conjunto de fatos, predicados e regras de derivação de lógica. Uma execução de um programa é, na verdade, uma prova de um teorema, iniciada por uma consulta. Confuso? Vamos dar um exemplo:
pai(joao, jose).
pai(jose, manoel).
avo(Avo, Neto) :-
pai(Avo, Filho),
pai(Filho, Neto).
O trecho de código acima define dois fatos: “joao” é pai de “jose” e “jose” é pai de “manoel”. Também define uma regra de derivação: a regra avo. A regra diz: um Avo é avô de um Neto se o Avo é pai de um Filho e (a vírgula faz o papel do conectivo lógico “e”) esse mesmo Filho é pai de um Neto. Note as letras maiúsculas no começo dos nomes; variáveis, em Prolog, devem começar com letra maiúscula (se não começar com letra maiúscula, ou é regra, ou é predicado ou é símbolo). Note, também, o ponto final no fim de cada fato e da regra: outro requisito da sintaxe de Prolog.
Agora, suponha que você queira saber quem são os netos de “joao”. Para isso, faz-se uma consulta, que é da seguinte forma:
?- avo(joao, X).
Note que passamos uma variável para a consulta (o X). Quando fazemos isso, o Prolog procura por todos os símbolos que satisfazem a consulta. Esse é o maior poder do Prolog: a busca. Toda consulta é uma busca numa árvore de possíveis soluções para a satisfação da consulta (ou para a prova do teorema).
Esse conceito de busca num espaço de estados vem das pesquisas em inteligência artificial, e é uma idéia fundamental na área. Aliás, justamente por isso, Prolog é bastante utilizado em aplicações de inteligência artificial. Graças a busca, programas em Prolog tendem a ser bastante compactos.
É possível, também, fazer um paralelo com bancos de dados. Os fatos podem ser vistos como entradas em tabelas; as regras de derivação, como consultas, só que mais genéricas, pois não restringem os valores buscados (apenas definem a relação entre os dados de entrada e os resultados esperados).
Outro recurso interessante da linguagem é o suporte simples a gramáticas de cláusulas definidas (uma tradução livre de DCG – definite clause grammar). Explicando sucintamente, o Prolog oferece um modo fácil de descrever uma sintaxe, permitindo escrever código para análise sintática simplesmente descrevendo a sintaxe.
Para utilizar a linguagem, é necessário um interpretador. Recomendo o SWI-Prolog. É possível ligar o interpretador com programas em outras linguagens, mas nunca fiz isso.
Apesar de tudo isso, Prolog também tem seus problemas. Além de ser necessário um pouco mais de cuidado para não escrever programas extremamente ineficientes, leva um tempo para se acostumar a pensar do modo necessário para programar declarativamente. Prolog é uma linguagem boa para se escrever alguns tipos de algoritmos, mas para a maioria das aplicações não é tão boa. A modularização também é um ponto fraco da linguagem (e da teoria da lógica, em geral). Talvez por esses problemas, a linguagem aparece como “acadêmica” na Wikipédia.
Resumindo, Prolog é uma linguagem interessante de se aprender; estimula um tipo de raciocínio diferente, mais lógico e mais recursivo. Também facilita muito a vida em alguns tipos de problemas.
Nota: a imagem do post remete ao problema de colorir mapas utilizando um número fixo de cores, um problema bastante difícil, mas que pode ser facilmente programado em Prolog. A imagem foi retirada deste site, que fala mais sobre o problema.