Table Of ContentProgramac¸˜ao em Prolog
´
UMA ABORDAGEM PRATICA
Eloi L. Favero
Departamento de Inform´atica
CCEN - UFPA
(Vers˜ao 2006)
favero@ufpa.br
• Parte I: Fundamentos e Te´cnicas de Programac¸a˜o
– Hist´orico e Teoria do Prolog
∗ Listas e Estruturas de Dados
∗ Fluxo de Controle e Aritm´etica
– T´ecnicas de Programa¸c˜ao:
∗ Anima¸c˜ao de Programas
∗ Classifica¸c˜ao e Ordena¸c˜ao
• Parte II: A Linguagem Prolog
– O Prolog Padr˜ao ISO
– Ambiente de Depura¸c˜ao
• Parte III: Estudos de Casos e Aplicac¸o˜es
– Programa¸c˜ao de Gram´aticas:
Autˆomatos e Gram´aticas Regulares, Gram´aticas Livres de Contexto,
Gram´aticas de Atributos; An´alise L´exica, Sint´atica e Semˆantica
– Linguagens Formais e Compiladores
– Processamento de Linguagem Natural:
L´exico/Morfologia, Sintaxe, Gera¸c˜ao de Linguagem Natural
– Inteligˆencia Artificial: KNN, Bayes, Kmeans
– Ngramas: Bigramas e Trigramas
Eloi L. Favero
Departamento de Inform´atica
favero@ufpa.br
Copyright (cid:13)c 2006
2006
Para minha companheira Flori
e nossos filhos, Emmanuel, Ayun e Thiago
pelo amor e a inspira¸c˜ao.
Pref´acio
N´os acreditamos que programa¸c˜ao pode ser, e deve ser, uma atividade intelectual
recompensadora; equeumaboalinguagemdeprograma¸c˜ao´eumapoderosaferramenta
conceitual — uma ferramenta para organizar, expressar, experimentar com, e ainda
comunicar nossos pensamentos; ... The Art of Prolog de L. Sterling e E. Shapiro [16].
Objetivos do livro
O objetivo deste livro-texto ´e servir como material did´atico na l´ıngua portuguesa para ensino
de programa¸c˜ao em Prolog, visando: 1) atender diferentes pu´blicos, de cursos de gradua¸c˜ao at´e
cursos de p´os-gradua¸c˜ao, nas ´areas da Ciˆencia da Computa¸c˜ao e correlatas (por exemplo, Sistemas
de Informa¸c˜ao); 2) servir de material de apoio para cursos com diferentes cargas hor´arias, de 20
horas at´e 60 horas; e 3) servir como material de referˆencia para usu´arios da linguagem Prolog
(adotamos o padr˜ao definido pela norma ISO).
Dependendo da dura¸c˜ao do curso, e do pu´blico-alvo, diferentes cap´ıtulos e se¸c˜oes do livro s˜ao
usados. No final deste pref´acio sugerimos algumas sequ¨ˆencias de cap´ıtulos para alguns usos do
livro.
A linguagem de programa¸c˜ao Prolog tem sido usada principalmente em disciplinas relacionadas
com a ´area de Inteligˆencia Artificial (IA). O Prolog1, tamb´em, traz bons resultados quando´e usado
nas atividades de programa¸c˜ao de disciplinas tais como: Programa¸c˜ao em L´ogica (a parte pr´atica),
Linguagens Formais, Compiladores, Linguagens de Programa¸c˜ao (paradigma l´ogico), entre outras.
Aabordagemdolivro´eessencialmentepr´atica, emoposi¸c˜aoaoenfoquete´oricodaPrograma¸c˜ao
em L´ogica que destaca assuntos, tais como estrat´egias de resolu¸c˜ao e computabilidade de um
programa. O objetivo de um curso pr´atico de Prolog ´e ensinar as t´ecnicas necess´arias para se
desenvolver, de forma clara, elegante e concisa, programas que expressam a solu¸c˜ao de problemas
reais.
Em uma perspectiva complementar, o subt´ıtulo do livro Uma abordagem pr´atica est´a rela-
cionado ao ditado que diz: o talento nasce da pr´atica fiel. A habilidade de desenvolver progra-
mas pensando em Prolog nasce de atividades pr´aticas de programa¸c˜ao. Para isso, apresentamos
inu´meros exerc´ıcios associados a cada novo assunto apresentado. Por outro lado, em especial na
terceirapartedolivro, apresentamosestudosdecasosbaseadosemproblemascoletadosemdiversas
1Usamos dois termos como sinˆonimos: “A linguagem Prolog”e “O Prolog”como um sistema que executa a
linguagem Prolog.
vii
viii
´areas da Ciˆencia da Computa¸c˜ao, incluindo: Linguagens Formais, Compiladores, Processamento
de Linguagem Natural, Inteligˆencia Artificial e Minera¸c˜ao de Dados.
O poder de expressividade do Prolog
Desdeosurgimento,in´ıciodosanos70,oPrologmant´emsuapopularidadedevido`acombina¸c˜ao
de diversas caracter´ısticas que definem o seu poder expressivo como linguagem de programa¸c˜ao:
• Prolog implementa um paradigma de programa¸c˜ao declarativa (em contraste com o
paradigma imperativo de C, Pascal) em que se descreve o que fazer e n˜ao como fazer.
Em Prolog, o conhecimento computacional (fatos e regras de inferˆencia) ´e expresso numa
forma declarativa de alto n´ıvel;
• Prolog trabalha com estruturas de dados de alto n´ıvel. Estruturas de dados complexas,
tais como listas, ´arvores, grafos, etc. s˜ao naturalmente representadas e manipuladas em
Prolog. Assim sendo, Prolog possibilita prototipa¸c˜ao r´apida, por exemplo, para valida¸c˜ao
de especifica¸c˜oes de sistemas de software;
• Prolog implementa um sistema de resolu¸c˜ao para a l´ogica de cl´ausulas definidas, que ´e um
subconjunto significativo da l´ogica de primeira ordem. Apesar desta fundamenta¸c˜ao l´ogica,
n˜ao ´e necess´ario ter forma¸c˜ao pr´evia em l´ogica para programar pensando em Prolog;
• Prolog vem com um sistema de processamento de regras gramaticais chamado Definite
ClauseGrammar(DCG),que´eessencialparaodesenvolvimentodeaplica¸c˜oes(ouprot´otipos)
nas ´areas de Linguagens Formais, Compiladores e Processamento em Linguagem Natural
(PLN) — o primeiro Prolog foi desenvolvido para PLN;
• Prolog permite metaprograma¸c˜ao, isto ´e, um programa pode se examinar e se automod-
ificar. Metaprograma¸c˜ao ´e sinˆonimo de linguagens de alta ordem (n˜ao primeira ordem), as
quais permitem e facilitam o desenvolvimento de ferramentas para outras linguagens, por
exemplo, interpretadores para sistemas de regras para IA.
Vale citar, tamb´em, que o Prolog possui uma sintaxe simples, que se mant´em est´avel desde o
surgimento do Prolog padr˜ao Edimburgo, em 1977. O padr˜ao ISO Prolog (1996) [10], 19 anos
depois,veioafirmarasintaxedoPrologEdimburgocomopadr˜ao,apenasapresentandoumconjunto
adicional de predicados predefinidos. Nesse sentido, observa-se que a maior parte dos programas
encontrados em livros da d´ecada de 80 rodam sem altera¸c˜oes (ou quase sem) nos interpretadores
atuais (por exemplo, os programas do livro Programming in Prolog de Clocksin & Mellish [5], de
1981). Neste texto, sempre que poss´ıvel, adotamos o padr˜ao ISO Prolog; eventuais diferen¸cas s˜ao
apontadas.
Disciplina de Programa¸c˜ao
Como professor, tenho observado que a pr´atica em Prolog desenvolve algumas habilidades pos-
itivas de programa¸c˜ao, que, uma vez adquiridas como talentos, s˜ao levadas para outros ambientes
de programa¸c˜ao, tais como C++ e Java. Estas habilidades s˜ao:
• Abstra¸c˜ao: c´odigo de especifica¸c˜ao de alto n´ıvel;
ix
• Limpeza: c´odigo-fonte limpo, conciso, sem redundˆancias;
• Ordem: c´odigo bem estruturado e organizado;
• Reusabilidade: em especial, no reuso de predicados revers´ıveis;
• Refinamento de programas e Refatora¸c˜ao de co´digo: rescrita de c´odigo quando j´a est´a
funcionando visando a generaliza¸c˜ao, a limpeza, a simplicidade, a ordem, o reuso; o uso do
interpretador facilita esta atividade (Just In Time Programming).
Programas Prolog s˜ao compactos e bem particionados. Em Prolog ´e mais f´acil identificar
possibilidades de fatorar c´odigo, removendo predicados redundantes. E, ao mesmo tempo, ´e f´acil
identificarpossibilidadesdereusodepredicados. Porexemplo, opredicadoappend(paraconcatenar
listas) ´e reus´avel em v´arios outros algoritmos. Isto se deve, em parte, porque em Prolog um
procedimento pode assumir mais de um papel: o append, definido inicialmente para concatenar
duas listas, pode ser usado para dividir uma lista em duas, a partir de um dado elemento.
OProlog´ebaseadonumsistemaderesolu¸c˜aoassociadoaumprocessodeunifica¸c˜ao. Enquanto
um programa procedural ´e baseado em dados+controle (como fazer), um programa em Prolog
´e baseado em fatos+regras (o que fazer). O controle em um programa Prolog est´a impl´ıcito em
regras condicionais de alto n´ıvel. Estruturas de dados com tipagem fraca, unifica¸c˜ao e resolu¸c˜ao
fazem de um programa Prolog um texto mais pr´oximo de uma especifica¸c˜ao abstrata de um
problema e, ao mesmo tempo, execut´avel.
O desenvolvimento por refinamentos sucessivos ´e uma t´ecnica de engenharia de software para
programa¸c˜ao. O Prolog, quando comparado com as linguagens imperativas, oferece algumas van-
tagens para trabalharmos com refinamento de programas: nota¸c˜ao concisa e fundamentada em
l´ogica; nota¸c˜ao declarativa; procedimentos revers´ıveis; usa somente vari´aveis locais; etc. Estas
caracter´ısticas facilitam a escrita de duas vers˜oes equivalentes de um programa, sendo uma vers˜ao
um refinamento da outra.
Estas habilidades de certa forma est˜ao relacionadas ao poder expressivo da linguagem Prolog,
que permite a codifica¸c˜ao de programas altamente concisos, para tratar de problemas relativamente
complexos. Por exemplo, um compilador ´e um programa relativamente complexo, at´e mesmo para
minilinguagem. Em Prolog podemos implementar um compilador para uma minilinguagem em
algumas p´aginas de c´odigo-fonte (como exemplificamos num dos cap´ıtulos do livro).
Usos para o Livro
O livro ´e constitu´ıdo de 21 cap´ıtulos organizados em trˆes partes. A parte I, cap´ıtulos 1 at´e 8,
apresenta os fundamentos e t´ecnicas da programa¸c˜ao Prolog. A parte II, cap´ıtulos 9 e 10, apresenta
um guia de referˆencia r´apida da sintaxe do Prolog ISO e o uso do depurador. A parte III explora
alguns t´opicos mostrando como programar solu¸c˜oes para problemas complexos: os cap´ıtulos 11 at´e
16 envolvem principalmente programa¸c˜ao de gram´aticas e os cap´ıtulos de 17 a 21 s˜ao t´opicos de
IA (aprendizagem de m´aquina e minera¸c˜ao de dados).
Pela escolha de uma determinada sequ¨ˆencia de cap´ıtulos, o livro-texto pode ser usado tanto
em cursos r´apidos de Prolog para estudantes sem experiˆencia em programa¸c˜ao, por exemplo,
para estudantes de Lingu¨´ıstica interessados em PLN, como para cursos semestrais avan¸cados para
estudantes de p´os-gradua¸c˜ao em Ciˆencia da Computa¸c˜ao.
Seguem algumas sugest˜oes de usos para o livro-texto:
• Curso r´apido de Prolog (30 horas). S˜ao recomendados os primeiros quatro cap´ıtulos da
Parte I, podem ser vistos s´o superficialmente os cap´ıtulos 5, 6, 7 e 8.
x
• Programa¸c˜ao em L´ogica e Prolog(60horas). Olivro´eindicadoparaapartedalinguagem
Prolog. Todos os cap´ıtulos da Parte I, mais alguns da Parte III.
• Fundamentos de programa¸c˜ao para IA (60 horas). Come¸cando com Curso r´apido de
Prolog. Mais alguns t´opicos da parte III.
• Fundamentos de Prolog para Linguagens Formais e Compiladores (entre 20 e 60
horas). Ou para o desenvolvimento de processadores de linguagens. Come¸cando com o
Curso r´apido de Prolog, mais os cap´ıtulos sobre Programa¸c˜ao de Gram´aticas e PLN.
• Paradigma L´ogico dentro de uma disciplina de Linguagens de Programa¸c˜ao (10 horas). Os
primeiros quatro cap´ıtulos da Parte I, ou apenas o cap´ıtulo 1 e parte do cap´ıtulo 2 (s´o duas
horas-aula).
Sobre o autor
O autor ´e Bacharel em Ciˆencias da Computa¸c˜ao pela UFRGS (1983-1987), Mestre em Ciˆencias
da Computac¸˜ao pela UFRGS (1987-1990) e ´e Doutor em Ciˆencias da Computa¸c˜ao com ˆenfase em
Computa¸c˜ao Inteligente pela UFPE (1996-2000). Professor e pesquisador do Departamento de
Inform´atica da UFPA desde 1991, atua tamb´em nos cursos de Mestrado e Doutorado do Programa
de P´os-Gradu¸c˜ao em Engenharia El´etrica e Computa¸c˜ao (PPGEEC) da UFPA, na sub´area de
Computa¸c˜ao Aplicada. O autor vem desenvolvendo pesquisa em algumas sub´areas da Inteligˆencia
Artificial (IA): IA Simb´olica, Processamento de Linguagem Natural e Agentes Inteligentes para
Web.
Description:Programas Prolog s˜ao compactos e bem particionados. Em Prolog é mais fácil No SWI-Prolog uma reconsulta é feita repetindo-se a pergunta.