Você está na página 1de 34

----------------------- Page 1----------------------Universidade Federal de Camp

ina Grande - UFCG Centro de Cincias e Tecnologia - CCT Departamento de Sistemas e


Computao - DSC APOSTILA: INTRODUO PROGRAMAO EM LGICA Alexandre de Andrade Barbosa
dsc.ufcg.edu.br Joseluce de Farias Cunha joseluce@dsc.ufcg.edu.br 34 pginas 2006
Av. Aprgio Veloso, 882 docong Caixa Pos tal 10.106 58.109-970 Campina Grande asil
Fone: 310-1119 Fax: 3 10-1273 ----------------------- Page 2---------------------APOSTILA: INTRODUO PROGRAMAO EM LGICA Alexandre de Andrade Barbosa Departamento de
Sistemas e Computao E-mail: aab@dsc.ufcg.edu.br Joseluce de Farias Cunha Departame
nto de Sistemas e Computao E-mail: joseluce@dsc.ufcg.edu.br Av. Aprgio Veloso, 882
Bodocong Caixa Postal 10.106 CEP 58109-970 Campina Grande PB Brasil Fone: 310-111
9 Fax: 310-1273 (DSC) Resumo Esta apostila foi criada como material de apoio dis
ciplina de Lgica MatemticadocursodeCinciadaComputaodaUniversidadeFederal de Campina G
rande - UFCG. O contedo apresentado neste material relacionado Programao em Lgica,
ais especicamente linguagem Prolog. NenhumarevisosobreLgicaMatemticaapresentada, ass
im, necessrio que o leitor j possua conhecimento sobre Lgica Proposia cional e Lgica
de 1 Ordem. Este texto possu nvel in1. ?- genitor( X, jim).
2. ?- genitor(jim, X).
3. ?- genitor(pam, X), genitor(X, pat).
4. ?- genitor(pam, X), genitor(X, Y), genitor(Y, jim).trodutrio, uma vezqueconhec
imentosavanadossobrealinguagemnoseroexplorados na disciplina em questo. Palavras-cha
ve: Programao em lgica, Prolog, Lgica. PB Br Bo

1 ----------------------- Page 3----------------------Sumrio 1 Introduo 4 1.1 O que


Programao em Lgica/Prolog? . . . . . . . . . . . . . . . . . . . 4 1.2 Como Prolog
funciona? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 2 Impleme
ntaes de Prolog 5 3 Sintaxe SWI-Prolog 7 3.1 Os comandos write e read . . . . . .
. . . . . . . . . . . . . . . . . . . . . 7 3.2 Comentrios . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . 8 4 Utilizando o SWI-Prolog 9 5
Fatos, Regras e Consultas 10 5.1 Regras . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . 12 5.2 Regras recursivas . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . 13 5.3 Como Prolog responde consult
as . . . . . . . . . . . . . . . . . . . . . . . . 15 6 Listas 16 6.1 Checagem d
e pertinncia . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 6.2 Conca
tenao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 6.3 A
dicionando elementos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
8 6.4 Excluindo elementos . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . 18 7 Aritmtica 19 8 Corte de uxo 21 9 Exemplos 22 10 Exerccios 27

2 ----------------------- Page 4----------------------Lista de Figuras 1 Tela in


icial do SWI-Prolog Editor . . . . . . . . . . . . . . . . . . . . . . . 9 2 rvor
e genealgica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 3 R
elao descendente. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 4
rvore para a expresso . . . . . . . . . . . . . . . . . . . . . 19 5 Jogo Torre d
e Hanoi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 3 ---------------------- Page 5----------------------1 Introduo

Esta apostila foi criada para apoiar a disciplina Lgica Matemtica, em sua parte na
l relacionada Programao em Lgica. O contedo apresentado aqui possui nvel introdutri
uma vez que a disciplina em questo no far uso de recursos avanados da linguagem. Est
udos mais avanados sobre a Programao em Lgica devero realizados em disciplinas poster
iores. O contedo deste texto busca fornecer aspectos mais prticos relacionados lin
gua gem Prolog, o funcionamento interno da linguagem no ser detalhado neste materi
al. Caso o leitor deseje se aprofundar no estudo da linguagem, recomenda-se a le
itura de [1 ], [2], [3] e [4], nos quais este texto baseado. Espera-se que aps a
leitura deste material o leitor seja capaz de: compreender e executar programas
Prolog; modicar programas Prolog; escrever programas Prolog bsicos e intermedirios
. 1.1 O que Programao em Lgica/Prolog?
Existem diversos paradigmas de programao, hoje, o paradigma mais utilizado o parad
igma procedural. As linguagens Java, Pascal, C/C++ so ditas linguagens procedurai
s, pois, nestes programas necessrio implementar um procedimento para resol ver de
terminado problema. Outro paradigma de programao o paradigma imperativo, que possu
i a linguagem LISP como sua representante mais famosa. A Programao em Lgica faz par
te do paradigma de programao denominado declarativo ou descritivo, nest e, deve-se
implementar uma descrio do problema e no um conjunto de instrues. A linguagem Prolog
uma representante do paradigma declarativo, esta a repres en-

tante mais famosa da Programao em Lgica, a qual se baseia no clculo de predicados. P


rolog foi criada em 1972 por Colmerauer e Roussel, um programa Prolog no possui cd
igo para manipular a memria ou realizar desvios condicionais. Isso no signica que
Prolog seja superior s outras linguagens, pode-se armar apenas que a linguagem ma
i s adequada para solucionar uma determinada categoria de problemas. Esta catego
ria diz respeito aos problemas onde necessrio representar algum tipo de conhecime
nto, por exemplo, em aplicaes que realizem computao simblica, na compreenso de lingua
em natural ou em sistemas especialistas. 1.2 Como Prolog funciona?

Um programa Prolog constitui-se de uma coleo de fatos (base de dados) e regras (re
laes lgicas), esses tens descrevem o domnio de um determinado problema. Esta descri
o problema avaliada por um interpretador, o qual utilizando um motor de inferncia
realiza dedues em busca de concluses vlidas para consultas realizadas pelos usurios.
Assim, pode-se armar que a computao destes programas equivalente a prova de um te
orema em lgica. 4 ----------------------- Page 6----------------------Os fatos de
Prolog permitem a denio de predicados por meio da declarao de quais tens pertencente
s ao universo (ou domnio) satisfazem os predicados. Por exem plo, pode-se denir o
predicado homem(x) e utilizar este para denir quais elementos do u niverso poss
uem tal predicado, no caso x homem. Vale salientar que responsabilidade do progr
amador manter a denio de um predicado consistente. Por exemplo, poderia ser criado
o predicado come(x,y) para representar que x come y ou y come x, o programador
que dever especicar os fatos de maneira consistente. As regras Prolog so descries de
predicados por meio de condicionais. Por exempl o, pode-se denir o predicado pa
i(x), signicando que x pai, atravs da regra: pai(X) :prole(X,_), homem(X). A regr
a signica que x pai se x possui ao menos um lho. O usurio interage com o programa
atravs de consultas (queries). Por exemplo, s ejam dados os fatos: homem(pedro).
homem(joao). mulher(maria). mulher(teresa). o usurio pode realizar a consulta ho
mem(X). e receber as seguintes respostas X=pe dro; X=joao; No, signicando que pe
dro e joao so homens, o No indica que no existem mais respostas que satisfaam a con
sulta. As computaes em Prolog utilizam os conceitos de clusulas de horn, resoluo e en
cadeamento para trs (backtracking), com estes possvel realizar a computao de a manei
ra equivalente a uma deduo em Lgica de 1 ordem.

Tanto fatos quanto regras so representados atravs de clusulas de horn, ou seja, so fr


mulas que contm predicados ou negao de predicados conectados por disjunes, onde ao me
nos um predicado no uma negao. Quanticadores no so representados explicitamente, por
a linguagem trata uma regra como se ela estivesse universal mente quanticada. U
tilizando a regra de inferncia da particularizao universal repetidas vezes, possvel
retirar os quanticadores e fazer com que uma varivel assuma qualquer valor do domn
io de representao. Para realizar uma deduo Prolog utiliza unicao e a regra de infern
da resoluo. Assim, duas clusulas do origem a um resolvente quando possuem predicado
s correspondentes, sendo um positivo (no negado) e outro negativo (negado). Quand
o o usurio realiza uma consulta o motor de inferncia tenta resolver metas, sendo q
ue u ma meta pode conter submetas, quando no existem mais metas para serem satisf
eitas em uma linha de resoluo, o sistema utiliza encadeamento para trs (backtrackin
g) em bus ca de outras respostas possveis. Ao longo desta apostila os conceitos c
itados sero exemplicados, no entanto, as explicaes fornecidas sobre o funcionamento
destes na linguagem Prolog no sero detalhadas. 2 Implementaes de Prolog
Diversas implementaes da linguagem Prolog podem ser encontradas, o que para muitos
constitui um problema, pois estas nem sempre so totalmente compatveis. Atualmente
,

5 ----------------------- Page 7----------------------existem verses livres e com


erciais criadas para os principais sistemas operaciona is. Algumas das implement
aes mais conhecidas so: Win-Prolog [5]- respeita a sintaxede Edinburgo, a implement
ao mais prxima do dialeto puro. A verso 4.6, a mais recente, est disponvel apenas par
Windo ws (98, ME, NT, 2k, XP). um sistema comercial, mas possui uma verso para t
este s gratuita. OpenProlog[6]-disponvelunicamenteparaMacintosh(MacOS7.5ousuperio
r). Respeita a sintaxe padro ISO, baseada na sintaxe de Edinburgo. um software gr
atuito, desde que seu autor seja avisado de sua utilizao. Ciao Prolog [7]- distrib
udo gratuitamente, possui licena Library General Pub lic License (LGPL). Respeita
a sintaxe padro ISO, pode ser utilizada em diverso s sistemasoperacionais, taisco
mo, Windows(98, NT,2k, XP),Linux, SunOS,Solari s, MacOS X, entre outros.

YAP Prolog [8] - criado pela Universidade do Porto em parceria com a Unive rsida
de Federal do Rio de Janeiro. Uma das principais caractersticas desta i mplementao
sua velocidade. Respeita a sintaxe padro ISO, tambm compatvel com outras implementae
de Prolog, tais como, Quintus e SICStus. A verso 5.1. 1 pode ser utilizada em di
versas distribuies Linux e Windows. SWIProlog[9]-softwaregratuito, sobalicena Lesse
r GNU Public License. Pode ser utilizado nas plataformas Windows, Linux e MacOS.
Possui diversas ferr amentas de edio grca, tais como, J-Prolog Editor e SWI-Prolog
-Editor (recomendado). Permite a utilizao da linguagem Prolog por outras linguagen
s, tais como, C/C ++ e Java. uma das implementaes mais utilizadas atualmente. SICS
tus Prolog [10] - um software comercial, mas possui verso gratuita para avaliao. Re
speitaasintaxepadroISOepodeserusadanasplataformasWindows (2k e XP), Linux, Solari
s 7, MacOS X e algumas distribuies Unix. Assim como o SWI, possui interfaces para
comunicao com outras linguagens, por exemplo, C & C++, .NET, Java, Visual Basic e
Tcl/Tk. Amzi! Prolog [11] - pode ser utilizado de maneira conjunta a IDE Eclipse
, permite tambm comunicao com outras linguagens. Possui distribuies gratuitas e comer
ciais, que podem ser utilizadas em sistemas operacionais diversos, tais como, Wi
ndows, Linux, Solaris e HP/UX. Visual Prolog [12] - bastante diferente da verso p
adro de Prolog, fortemente tipado. Tambm conhecido como PDC Prolog ou Turbo Prolog
, possui distribuies gratuitas e comerciais para Windows e Linux. Fornece um ambie
nte complto p ara programao, porm, um dialeto mais complexo que o original. Outras
distribuies Prolog conhecidas so: GNU Prolog [13], XSB [14] e Trinc Prol og [15]. A
implementao utilizada ao longo desta apostila a SWI-Prolog, todo cdigo utilizado n
os exemplos e exerccios apresentados aqui foram desenvolvidos nesta ve rso de Prol
og. 6 ----------------------- Page 8----------------------3 Sintaxe SWI-Prolog
Assim como todas as linguagens de programao, existem algumas regras que devem ser
respeitadas pelo programador. Os dados representados em Prolog podem ser um dos
seguintes tipos:

variveis - devem ser iniciados com letras maisculas ou underscore (_), segui dos d
e qualquer caractere alfanumrico. Caso uma varivel seja denida apenas com undersco
re, ela ser considerada uma varivel annima, ou seja, no se deseja sab er seu valor.
Ex.: X, Y1, _Nome, ...; no variveis; atmicas; tomos - so constantes expressas atravs
e palavras. Devem ser inici ados com letra minscula seguida de qualquer caractere
alfanumrico. Cas o seja necessrio denir um tomo com letra maiscula ou nmero, deve se
usar aspas simples. Ex.: joao, `Joo', `16', `Marys', ...; inteiros-qualquernmeroq
uenocontenhaumponto(.) serconsiderado uminteiro. Caracteres ASCII entreaspasduplas
soconsideradosinteir os. Ex.: 1, 6, -3, a (interpretado como 97), ...; nmerosempon
toutuante-qualquernmerocomumpontoepelomenos uma casa decimal. Ex.: 5.3 (correto),
7.8 (correto), 7. (incorr eto); no atmicas; listas - uma seqencia de elementos ord
enados. Uma lista declarada entre colchetes e os elementos devem ser separados p
or vrgula. P ode-se separar a cabea (1o. elemento) do corpo (demais elementos) de
um a lista utilizando . Ex.: [ a, b, c], [a 3.1 Os comandos write e read b, c ],
... .
O comando write exibe o valor do parmetro no dispositivo de sada corrente. O dispo
sitivo padro o monitor, assim, o comando write(`Teste de impresso.'). ir exibir a m
ensagem Teste de impresso. na tela do monitor. O mesmo comando pode ser utilizad
o para imprimir o valor de qualquer varivel. No entanto, no existe um comando padro
Prolog para escrita de expresses formatadas. Devido a isso, o SWI-Prolog utiliza
comandos de extenso, um deste o comando writef do C-Prolog de Edinburgo. Este co
mando possui a seguinte sintaxe writef(Formato, Argumentos). Onde as opes para det
erminar a formatao so: %w - imprime o termo; %d - imprime o termo ignorando seu tip
o, por exemplo, n impresso como uma string. %s - imprime o termo como uma string
; 7 ----------------------- Page 9-----------------------

%Nc - imprime o termo de modo centralizado numa quantidade N de colunas; %Nl - i


mprime o termo alinhado esquerda numa quantidade N de colunas; %Nr - imprime o t
ermo alinhado direita numa quantidade N de colunas; Para gerar alguns caracteres
deve se usar seqencias de escape, estas so: n - cria uma nova linha; l - criar um
separador de linha, o resultado igual ao produzido por n; r - retorna ao incio d
a linha; t - tabulao; % - imprime o smbolo %; nnn - onde n um nmero decimal, produz
o caractere ASCII com o cdigo informado. O comando read l um valor no dispositivo
de entrada corrente e unica (atribui) o valor uma varivel. O dispositivo de entra
da padro o teclado, assim, o comando read(X). ir ler um valor do teclado e unicar
este valor com a varivel X. 3.2 Comentrios
Assim como em outras linguagens de programao Prolog possui caracteres, ou seqencias
de caracteres, que identicam um trecho de comentrios. Os comentrios no so levados e
m considerao pelos interpretadores, porm, so importantes para que outras programador
es possam compreender mais facilmente a codicao de um programa. Em Prolog existem
dois tipos de comentrios, estes so identicados pelos smbolos % e /* */. O smbolo % e
xpressa que tudo aquilo que estiver entre ele e o nal da linha deve ser tratado
como comentrio. Os smbolos /* */ indicam que tudo que estiv er entre /* e */ ser tr
atado como comentrio, pode-se observar exemplos de comentrios no trecho de cdigo ab
aixo: / Descrio dos precidados homem e mulher elementos do universo de representao h
omem(pedro ). % representa o fato homem(joao ). % representa o fato mulher(maria
). % representa o fato mulher( teresa ). % representa o fato sobre . / de que d
e que de que de que todos os pedro homem. joao homem. maria mulher teresa mulher
.
Consideraes mais detalhadas sobre a sintaxe, os tipos de dados permitidos e so bre
outros comandos podem ser encontrados no manual do SWI-Prolog, disponvel em [16]
.
8 ----------------------- Page 10----------------------4 Utilizando o SWI-Prolog
Aps realizar o download e a instalao do SWI-Prolog e do SWI-Prolog-Editor, inicie

o editor, ser apresentada a tela deste, a qual deve ser similar a exibida na Figu
ra 1. Pode-se observar que a tela se divide em duas janelas editveis, identicada
s na ima gem com os nmeros 1 e 2. A rea 1 corresponde a janela de edio do programa,
a rea 2 a janela de interao do usurio com o interpretador. Para que se possa realiza
r qualque r interaocomoprogramaqueestsendoeditadonecessrio, apssalvaroarquivo, clicar
sobre boto de consulta, identicado com o nmero 3. Caso o arquivo seja alterado e o
boto no seja acionado o interpretador ir trabalhar com a ltima verso do programa que
foi consultada. O nmero 4 identica o prompt de comandos, a partir deste que pode
m ser enviados os comandos para o interpretador. Todo comando enviado para o int
erpretador deve obrigatoriamente ser nalizado pelo caractere ponto (.). Por ex e
mplo, o comando ?- write(Teste)no resultar em uma impresso, enquanto o comando ?wri
te(Teste) . resultar na impresso da string `Teste'. O smbolo ?- ser usado nos exempl
os e exerccios apresentados para representar o prompt de comandos, ele no de ve se
r digitado. As outras funcionalidades (e.g. salvar, abrir, debug, ... ) existent
es no si stema so similares ou idnticas aes encontradas em diversos sistemas. Maiore
s detalhes de funcionamento do programa podem ser encontradas no manual do siste
ma. Figura 1: Tela inicial do SWI-Prolog Editor 9 ----------------------- Page 1
1----------------------5 Fatos, Regras e Consultas

Como j foi armado, um programa Prolog captura a descrio de um determinado problema.


O programador deve implementar um conjunto de fatos e regras relacionados ao pr
oblema em questo. Ao longo de toda esta seo sero apresentados alguns fatos, regras e
consultas Prolog que podem constituir um programa. Para facilitar a explicao des
tes conceitos ser implementado um programa que descreva as relaes de uma famlia. A F
igura 2 exibe a rvore genealgica de uma famlia, nesta possvel observar que existem d
iversos tipos de relao, por exemplo, bob pai de pat, pam av de ann, ann irm de pa
jim lho de pat, entre outras. Figura 2: rvore genealgica Para se representar estas
relaes em Prolog, inicialmente pode-se criar a relao genitor(x, y), signicando que
x genitor de y. Ento, podemos inserir na janela de edio do programa os seguintes fa
tos: genitor(pam, genitor(tom, genitor(tom, genitor(bob, genitor(bob, genitor(pa
t , bob). bob). liz ). ann). pat ). jim ).
Estasclusulasdescrevemtodaainformaosobrearelaogenitor existentenarvore

apresentada (domnio). Aps a denio desta relao podem ser realizadas consultas no siste
a, para isso basta clicar no boto de consulta, e digitar perguntas no promp t de
comandos, tal como exibido a seguir: 3 ? Yes 4 ? No genitor(pat , jim ). genitor
(jim , pat ).
a consulta rotulada com o nmero 3, retorna a resposta yes (sim), isso ocorre pois
o motor de inferncia encontrar o fato correspondente e responder positivamente.
J pa ra 10 ----------------------- Page 12----------------------a pergunta rotula
da com o nmero 2, a resposta retornada No (no), pois o programa no possui nenhum fa
to que indique que pat genitora de jim. As consultas apresentadas exemplicam o t
ipo mais simples de consulta, quando um fato da base j satisfaz a pergunta. Consu
ltas mais interessantes so possveis, por e xemplo, pode-se indagar quem so os genit
ores de um determinado sujeito, ou quem so os lhos de deste na base de fatos do e
xemplo. Para isso, pode-se digitar no promp t de comandos as seguintes perguntas
: 5 ? X = X = No 6 ? X = X = No 7 ? X = Y = X = Y = X = Y = X = Y = X = Y = X =
Y = No genitor(X, bob). pam ; tom ; genitor(bob, X). ann ; pat ; genitor(X,Y). p
am bob ; tom bob ; tom liz ; bob ann ; bob pat ; pat jim ;
a consulta rotulado com o nmero 5, indaga quem so os pais do indivduo bob. Isso oco
rre pois X uma varivel, assim, o motor de inferncia realiza substituies sobre est a
para encontrar quais fatos da base satisfazem a indagao. O mesmo ocorre na consult
a rotulada com o nmero 6, porm, esta indaga quais so os lhos do indivduo bob. A

consulta rotulada com o nmero 7 exibe pares genitor-lho, observe que o ordem das
respostas idntica a ordem dos fatos inseridos na base. Os exemplos exibidos at o m
omento ilustram consultas simples, possvel, por exemplo, realizar consultas sobre
fatos que no esto diretamente descritos. Diga-se, por exemplo, que se deseja sabe
r quem so os avs de determinado sujeito, apesar de no existir um fato que determine
esta relao pode-se criar uma consulta que realize es ta pergunta. Para isso, pode
-se digitar no prompt de comandos a seguinte pergunta: 8 ? genitor(Y, jim) , gen
itor(X,Y). Y = pat X = bob ; No a consulta pode ser interpretada como Y genitor
de jim e X genitor de Y, ou seja, essa consulta busca quem o pai do pai de um su
jeito. Note que as clusulas esto separadas por uma vrgula (,), para o SWI-Prolog a
vrgula representa uma conjuno, enquanto um ponto e vrgula (;) representa uma disjuno.
Ento, uma seqencia de 11 ----------------------- Page 13----------------------clusu
las separadas por vrgula s sera satisfeita se e somente se todas as clusulas fo rem
satisfeitas. Do mesmo modo, pode-se armar que uma seqencia de clusulas separadas
por ponto e vrgula sera satisfeita se ao menos uma clusula for satisfeita. Umoutro
conectivoimportanteanegao. Paraexemplicarautilizaodesteconectivo sero denidos os pred
cados homem(x) e mulher(x), signicando que x homem e x mulher respectivamente. A
ssim, so denidos os fatos: mulher(pam). homem(tom). homem(bob). mulher( liz ). mu
lher(pat ). mulher(ann). homem(jim ). aps denidos os fatos, podemos indagar, por
exemplo, quem a me de bob, ou seja, deseja-se saber quem o genitor de bob que mul
her. Para isso, pode-se digitar nop rompt de comandos a seguinte pergunta: 9 ? g
enitor(X, bob) , mulher(X). X = pam ; No a mesma consulta poderia ser realizada
atravs da seguintes pergunta: 10 ? genitor(X, bob) , not(homem(X)). X = pam ; No
5.1 Regras
Muitas outras consultas podem ser realizadas sobre uma base de fatos, porm, muito

mais interessante utilizar regras, pois o poder de expresso obtido muito maior. P
ara exemplicar o uso de regras ser denida a relao prole(y,x), signicando que y pro
le de x. Esta relao a relao inversa de genitor(x,y), assim, pode-se armar que y pro
e de x se x genitor de y. Para isso, pode-se criar a seguinte regra na janela de
edio do programa: prole(Y,X) : genitor(X,Y).

o smbolo :- pode ser lido como se. A parte da regra a esquerda do smbolo :- denomi
nada de concluso (ou cabea), j a parte a direita deste chamada de condio (ou corpo).
Assim, para responder a consulta o interpretador Prolog precisa satisfaz er part
e condicional da regra, uma vez que no existem fatos relacionados a prole, para e
nto obter uma concluso. Para isso, so utilizadas substituies, at que se satisfaa a p
e condicional ou no existam mais possibilidades de substituio. Consultas so realizad
as sobre regras da mesma maneira como se estas fossem fa tos, por exemplo, para
indagar quem a prole do indivduo tom deve-se digitar no prompt de comandos a segu
inte consulta: 11 ? prole(X,tom). 12 ----------------------- Page 14---------------------X = bob ; X = liz ; No para satisfazer a regra o interpretador Prolog
substituiu a varivel X at que encon trou o fato genitor(tom, bob), o qual correspo
nde a parte condicional da regra prole( Y,X) :- genitor(X,Y), aps as substituies ad
equadas. Posteriormente foi encontrado o fato genitor(tom, liz), o qual tambm pod
e satisfazer a regra, nenhuma outra substituio resultou em sucesso. Outras relaes po
dem ser denidas para o exemplo. Pode-se denir as relaes mae(x,y) e avos(x,y), apre
sentadas anteriormente como consultas. Para isso, dev e-se digitar na janela de
edio do programa as seguintes regras: mae(X,Y) : avos(X,Z) : genitor(X,Y) , mulher
(X). genitor(X,Y) , genitor(Y,Z).
Um outra relao que pode ser denida a relao irma(x,y), signicando x irm de y. Note
deve-se ter cuidado na denio deste relacionamento, pois, pode-se denir este atravs
da seguinte regra: irma(X,Y) : genitor(Z,X) , genitor(Z,Y) , mulher(X).
porm, esta regra permite uma pessoa seja irm de si mesma, para comprovar isso bast

a realizar a seguinte consulta: 12 ? Yes irma(pat , pat ).


o programador deve estar atento a especicaes deste tipo, para descrever corretamen
t e a relao necessrio indicar que x e y precisam ser diferentes, assim a regra corr
eta seria: irma(X,Y) : genitor(Z,X) , genitor(Z,Y) , mulher(X) , not(X = Y).

Uma diferena bsica entre uma regra e um fato que um fato sempre uma informao verdad
ira, j uma regra precisa ser avaliada para que se possa determinar se esta verdad
eira ou no. Regras podem depender diretamente de um fato, como no exemplo anterio
r ou de outras regras (inclusive dela mesma). Regras denidas em term os de si me
sma so chamadas de regras recursivas ou recorrentes, este tipo de regra s er apres
entado na seo seguinte. 5.2 Regras recursivas

A recurso um dos elementos mais importantes da linguagem Prolog, este conceito pe


rmite a resoluo de problemas signicativamente complexos de maneira relativamente s
imples. A construo de uma regra recursiva ser apresentada atravs da denio da relao
ndente(x,y), signicando que y um descendente de x, tal como ilustrado na Figura
3. possvel denir esta relao utilizando a relao genitor, assim, uma descendncia dire
ou seja, quando x genitor de y, seria representada com a segu inte regra: desce
ndente(X,Z) : 13 ----------------------- Page 15----------------------Figura 3:
Relao descendente. Para outros casos de descendncia, que no uma descendncia direta, p
oderiam ser utilizadas seguintes regras: descendente(X,Z) : descendente(X,Z) : .
.. genitor(X,Y) , genitor(Y,Z). genitor(X,Y) , genitor(Y,W) , genitor(W,Z). geni
tor(X,Z).

porm, esta soluo seria limitada e trabalhosa. Usando recurso possvel obter uma solu
m mais simples e completa para a relao de descendncia. Par a isso, necessrio denir a
seguinte armao x um descendente de z se existe um y, tal que, x seja genitor de y
e y seja um descendente de z, a seguinte regra descreve isso: descendente(X,Z)
: genitor(X,Y) , descendente(Y,Z).
assim, utilizando as duas regras, pode-se descrever a relao de descendncia de manei

ra correta. As duas regras so necessrias, pois o uso somente da primeira regra s se


ria suciente para casos de descendncia direta (equivalente relao genitor), enquanto
o uso exclusivo da segunda regra levaria a uma busca innita de descendncia. Ento,
a regra Prolog para relao de descendncia incorpora as seguintes regras: descendent
e(X,Z) : descendente(X,Z) : genitor(X,Z). genitor(X,Y) , descendente(Y,Z).
Pode-se ento realizar consultas na base de exemplo sobre a relao de descendncia, par
a isso, basta escrever a seguinte consulta: 13 ? X = bob X = ann X = pat X = jim
No descendente(pam,X). ; ; ; ;
com isso so exibidos os nomes de todos os descendentes de pam. 14 ---------------------- Page 16----------------------O programa completo que descreve as relaes f
amiliares discutidas nesta seo pode ser observado a seguir: / Programa Prolog sobr
e relaes familiares . / genitor( pam, bob). % fato genitor( tom, bob). % fato geni
tor( tom, liz ). % fato genitor( bob, ann). % fato genitor( bob, pat ). % fato g
enitor( pat , jim ). % fato mulher(pam). % fato mulher( liz ). % fato mulher(pat
). % fato mulher(ann). % fato homem(tom). % fato homem(bob). % fato homem(jim )
. % fato prole(Y,X) : genitor(X,Y). % regra mae(X,Y) : genitor(X,Y) , mulher(X).
% regra avos(X,Z) : genitor(X,Y) , genitor(Y,Z). % regra irma(X,Y) : genitor(Z,
X) , genitor(Z,Y) , mulher(X). % regra descendente(X,Z) : genitor(X,Z). % regra
descendente(X,Z) : genitor(X,Y) , descendente(Y,Z). % regra recursiva Um conjunt
o de regras utilizados para descrever uma nica relao , em geral, chamada de procedim
ento (procedure). Assim, as regras relacionadas descendncia, ilustradas no exempl
o, podem ser denominadas de procedimento. 5.3 Como Prolog responde consultas
Uma consulta Prolog sempre um conjunto de metas. Quando uma pergunta feita, Prol
og precisa satisfazer todas as metas. Isso, como j armado, equivalente a prova

r um teorema ou realizar uma deduo. Para isso, Prolog busca vericar se a(s) meta(s
) so conseqncias lgicas dos fatos e regras contidos no programa. Para ilustrar o pro
cedimento executado para responder uma consulta ser utilizado o programa de exemp
lo, relacionado relacionamentos familiares. Diga-se que a consulta ?- descenden
te(tom, pat). seja realizada. Sabe-se que descendente(bob, pat) um fato existent
e no programa. Este fato seria derivado a partir da primeira regra relacionada a
descendncia. Alm disso, sabe-se que a regra genitor(t om, bob) um fato. Com isso,
e o fato derivado descendente(bob, pat) pode-se concluir descendente(tom, pat)
utilizando a segunda regra relacionada descendncia existente no programa. Isso il
ustra o que foi utilizado pra realizar a prova, ser apresentado agora como esta p
rova foi obtida. Prolog encontra uma prova na ordem inversa a forma ilustrada an
teriormente. Prolog inicia com uma meta e, utilizando regras, substitui estas me
tas por novas metas, at que uma meta seja satisfeita por um fato. Assim, feita a
pergunta descendente(tom, pat), Prolog procede da seguinte ma neira. Para satisf
azer esta meta procurada alguma clusula (fato ou regra) da qual a meta possa ser
deduzida. Ento, so encontradas as duas regras relacionadas descendncia existentes n
o programa, pois, a cabea da regra corresponde meta. Como a regra de15 ----------------------- Page 17----------------------scendente(X,Z) :- genito
r(X,Z).aparece primeiro, e como a meta atual descendente (tom, pat), as variveis
so substitudas, tal como a seguir: X = tom, Z = pat a meta descendente(tom, pat) su
bstituda pela meta genitor(tom, pat). Como no existe umaclusulaondeacabeasejacorresp
ondenteaesta,Prologrealizaumencaminhamento para trs, ou seja, retorna a meta orig
inal para tentar encontrar uma maneira alte rnativa de satisfaz-la. Ento, a regra
descendente(X,Z) :- genitor(X,Y), descendente(Y,Z). ser utilizad a. Mais uma vez,
as variveis X e Z sero substitudas por tom e pat respectivamente, porm Y aindanofois
ubstituda. Assim, ametaatualdlugarasmetas genitor(tom,Y), descendente(Y, pat). Pro
log deve agora satisfazer a conjuno de metas genitor(tom,Y), descendente(Y, pat),
isso feito na ordem em que as metas esto escritas, ou seja, primeiramente P rolog
ir tentar satisfazer genitor(tom,Y). Realizando uma busca por clusulas que satisf
aa m

a meta, Prolog encontra o fato genitor(tom, bob), assim, Y substituda por bob. Co
m isso, a meta atual descendente(bob, pat). Para satisfazer esta meta a regra d
escendente(X,Z) :- genitor(X,Z) ser usada novamente. Observe que esta uma nova se
qencia de prova, sendo assim, as substituies anteriores no possuem nenhuma relao com
sta. Com isso, Prolog usa um novo conjunto de variveis, e assim, pode-se reescrev
er a regra como descendente(X1,Z1) :genitor(X1,Z1). Assim, como a cabea deve corr
esponder meta, as seguintes substituies so realizadas: X = bob, Z = pat e ento, a me
ta atual trocada para nova meta genitor(bob, pat). Como esta satisfei ta por um
fato presente no programa o procedimento acaba. 6 Listas
ListassoumdostiposdedadosmaisteisexistentesnalinguagemProlog, diz-sequeuma lista u
ma seqncia ordenada de uma quantidade qualquer de elementos. Os elementos de uma l
ista podem ser de qualquer tipo, tais como, nmeros ou tomos. Os elementos contidos
em uma lista devem ser separados por vrgulas, e precisa m estar entre colchetes.
Por exemplo, uma lista pode conter os nomes dos indivduos do exe mplo da seo anter
ior, esta lista seria denida como: [pam, liz, pat, ann, tom, bob, jim] Existem d
ois tipos de listas, as listas vazias e as no vazias. Uma lista vazi a representa
da por [ ]. Listas no vazias podem ser divididas em duas partes, so elas: cabea - c
orresponde ao primeiro elemento da lista; cauda - corresponde aos elementos rest
antes da lista. Por exemplo, para a lista: 16 ----------------------- Page 18---------------------[pam, liz, pat, ann, tom, bob, jim] pam a cabea, enquanto [liz
, pat, ann, tom, bob, jim] a cauda. Observe que a cauda uma nova lista, que por
sua vez tambm possui cabea e cauda. Assim, pode-se dizer que o ltimo elemento de um
a lista possui uma cauda vazia (uma lista vazia). Podese especicar que um elemen
to de uma lista tambm uma lista, assim, pode-se representar listas tais como: Hob
bies1 = [tenis, musica]. Hobbies2 = [sky, comida]. Lista = [ann, Hobbies1, tom,
Hobbies2].

possvel separar as partes de uma lista utilizando uma barra vertical, assim, pode
-se escrever Lista = [cabea cauda]. Com isso, possvel determinar as seguintes list
as : [a b, c] = [a, b, c]

possvel realizar uma srie de operaes sobre listas, as sees seguintes exibem algumas
stas aes. 6.1 Checagem de pertinncia
Para se checar se um determinado elemento pertence uma lista deve-se utilizar a
relao member(x,y), que indica se x pertence y, por exemplo: 3 ? Yes 4 ? No 5 ? Yes
member(a, [a,b,c ]). member(a, [[a,b] ,c ]). member([a,b] , [[a,b] ,c ]).
na consulta rotulada com o nmero 3, a um elemento da
de cabea desta. J a consulta rotulada com o nmero
, isso ocorre por que o elemento contido na lista uma
o a. Isso ilustrado na consulta rotulada com o nmero

lista, uma vez que correspon


4, indica que a no pertence list
outra lista [a,b] e no o tom
5. 6.2 Concatenao

Pararealizar aconcatenao de listas pode-seutilizar o predicado append(L1,L2,L3).,


este predicadoconcatenaalista L1 e L2 exibindooresultadoem L3. OMesmopredicadopo
de ser utilizado para decompor listas. Para denir a relao de concatenao, necessrio s
tisfazer as seguintes restries: um argumento uma lista vazia - caso algum argument
o seja vazio a concatenao resultar na repetio do argumento no vazio; nenhum dos argum
ntos vazio - a concatenao resulta na adio de todos os elementos da segunda lista ao
nal da primeira lista. Visto isso, tem-se os exemplos: 17 ---------------------- Page 19----------------------conc([a,b], [], [a,b]) = true conc([a,b], [c,d],
[a,b,c,d]) = true Para denir esta relao pode-se implementar as seguintes regras: c
onc ([] , L, L). conc ([X L1] , L2, [X L3]) : conc(L1,L2,L3).

Denidas as regras, pode-se realizar as seguintes consultas: 6 ? conc ([a,b] , [c


] , L). L = [a, b, c] ; No 7 ? conc ([a] , [b, c] , L). L = [a, b, c] ; No As re
gras denidas tambm podem ser usadas para decompor uma lista em suas componentes.
Para checar isso, basta realizar a seguinte consulta: 6 ? L1 = L1 = L1 = L1 = No
6.3 conc(L1, L2, [a,b,c ]). [] L2 = [a, b, c] ; [a] L2 = [b, c] ; [a, b] L2 = [
c] ; [a, b, c] L2 = [] ; Adicionando elementos
A adio de um elemento uma lista pode ser denida de modo simples. Para isso, basta
inserir o elemento no incio da lista, esta relao denida atravs da seguinte regra: in
sere (X, L, [X L]). com isso, pode-se realizar as seguintes inseres: 7 ? insere (a
, [b,c] , L). L = [a, b, c] ; No 8 ? insere ([1 ,2] , 3, L). L = [[1 , 2] 3] ; N
o 6.4 Excluindo elementos
A excluso de um elemento pode ser implementada atravs das seguintes regras: exclui
(X, [X exclui (X, [Y Tail ] , Tail ). Tail ] , [Y Tail1 ]) : exclui (X, Tail ,
Tail1 ).
a primeira regra utilizada quando o elemento que se deseja excluir corresponde c
abea da lista. J a segunda regra exclui um elemento que pertence a cauda da lista
. V ale 18 ----------------------- Page 20----------------------salientar que es
ta implementao no exclui todos os elementos existentes na lista que correspondam ao
elemento passado como argumento. Denidas as regras podem ser realizadas as segu
intes consultas: 9 ? exclui (a, [a,b,c] , L). L = [b, c] ; No

10 ? L = [a, No 11 ? L = [a, L = [a, No


exclui (b, [a,b,c] , L). c] ; exclui (c , [a,c ,b,c] , L). b, c] ; c , b] ;

Existem diversas outras operaes nativas de Prolog, um exerccio interessante ser ia


realizaraimplementaodealgumasoperaes. Pode-se, porexemplo, criarumaoperao para checar
se uma lista est contida em outra ou uma operao para realizar permutao dos elementos.
7 Aritmtica

Geralmente, quandoseescreveumaexpressomatemticaanotaoinxautilizada, por exemplo , ond


e e so argumentos e e so operadores. Em Prolog uma expresso representada internamen
te como uma rvore, assim a expresso anterior seria representada pela rvore da Figur
a 4. Uma maneira de representar em Prolog a expre sso em questo utiliza notao prexa,
a expresso seria representada como . Porm, por ser mais usual a representao inxa ta
mbm compreendida pela linguagem. Figura 4: rvore para a expresso Prolog possui deni
dos operadores para as quatro operaes: , para realizar soma, subtrao, multiplicao e d
viso, respectivamente. Para se obter o resultado de uma operao necessrio utilizar o
operador is, tal como ilustrado nas consultas abaix o: 3 ? X = No 4 ? X = No 5 ?
X is 2 + 3. 5 ; X is 4 3 ; X is 2 19 ----------------------- Page 21---------------------X = 10 ; No 6 ? X is 9 / 2. X = 4.5 ; No Para o SWI-Prolog a operao rep
resenta uma diviso real, para se obter uma diviso inteira deve-se usar o operador
. A precedncia de operaes aritmticas em Prologamesmaprecednciaadotadanamatemtica,ass
quandonecessriodevemser utilizados parnteses para descrever uma expresso corretamen
te. Alguns dos operador es reconhecidos so: mod - para obter o resto da diviso; para potenciao; 1. 5.

cos - funo cosseno; sin - funo seno; tan - funo tangente; exp - exponencial; ln - log
ritmo natural; log - logaritmo; sqrt - raiz quadrada. Existem tambm operaes de conv
erso, algumas so automticas outras precisam ser explicitamente solicitadas. Um exem
plo de converso automtica ocorre quando um nmero inteiro relacionado em uma expresso
com nmeros de ponto utuante, automaticamente os inteiros so convertidos para nmero
s nmeros de ponto utuante. Algumas converses explcitas nativas so: integer(X) - conv
erte X para inteiro; oat(X) - converte X para ponto utuante. Prolog tambm possui
operaes para comparao, os operadores so: - maior que; - menor que; - maior ou igual;
- menor ou igual; - igual; - diferente. 20 ----------------------- Page 22--------------------- importante explicitar a diferena entre os operadores e , o primei
ro operador verica se dois objetos so iguais, enquanto o segundo verica se o resu
ltado da operao igual. Isso ca mais claro atravs das consultas: 18 ? No 19 ? Yes 20
? A = 2 B = 1 No 8 1 + 2 = 2 + 1. 1 + 2 =:= 2 + 1. 1 + A = B + 2. ; Corte de ux
o

A ordem das clusulas em um programa e a ordem de denio de uma regra podem determina
r o uxo de execuo de um programa. Esta seo apresenta um elemento para controle do ux
o denominado de corte, representado por !. A principal funo do corte melhorar a ec
incia de um programa. Como j foi apresentado, Prolog utiliza encadeamento para trs
sempre que necessrio para satisf azer uma meta. Porm, muitas vezes, a utilizao de en
cadeamento para trs causa uma busca desnecessria, levando a inecincia. Para estes c
asos o uso do mecanismo de cor te extremamente til. Para apresentar o corte ser ut
ilizado o seguinte exemplo: Sejam dados dois nme ros e , desejado saber qual o va
lor mximo destes. As seguintes regras descrevem a relao maximo(x,y), signicando que
x o mximo valor se x maior ou igual a y, y o maior valor se y maior que x: maxim
o(X,Y,X) : maximo(X,Y,Y) : X >= Y. X < Y.
estas regras computam a relao de maneira correta, porm, elas so exclusivas, ou seja,
quando a primeira obtm sucesso a segunda ir falhar. Porm, Prolog sempre executa as
duas regras, utilizando encadeamento para trs, o que para esta relao resulta apena
s em inecincia. A mesma relao pode ser obtida, porm, sem gerar processamento inecien
te utilizando corte. Para isso, as regras seriam escritas como: maximo(X,Y,X) :
maximo(X,Y,Y) : X >= Y, !. X < Y.
com isso, caso a primeira regra obtenha sucesso a segunda regra no ser executada.
A execuo do programa com corte no altera o resultado deste, o corte apenas evita qu
e sejam realizadas buscas desnecessrias. No entanto, o uso do corte exige muito m
ais ateno do programador. Isso ocorre pois um programa sem cortes pode ter a ordem
de suas clusulas e regras modicadas sem alterar o signicado do mesmo. Por sua ve
z, um programa que possua cortes pode ter seu signicado alterado caso suas clusul
as sejam reordenadas. O seguinte exemplo ilustr a estas armaes. Sejam dadas as reg
ras: 21 ----------------------- Page 23----------------------p : p : a, b. c.
o signicado lgico das regras pode ser interpretado pela frmula: . Com esta frmula p
odemos modicar a ordem das clusulas e seu signicado no ser alterado. Porm, caso seja
utilizado corte, tal como nas seguintes regras: p : p : a, ! , b. c. .
o signicado lgico das regras pode ser interpretado pela frmula:

Com esta, caso a ordem das regras seja alterada para: p : p : c. a, ! , b.


o signicado lgico das regras pode ser pela frmula: . Assim, pode-se armar que o cor
te um mecanismo til, porm, deve ser utilizado com cuidado. 9 Exemplos

Uma das melhores formas de se aprender uma nova linguagem de programao observando
o cdigo de programas. Esta seo apresenta alguns programas escritos em Prolog, o nvel
de complexidade destes programas ser crescente, no que diz respeito aos con ceit
os utilizados. Uma boa atividade para o leitor seria realizar algumas modicaes ou
extenses sobre os programas apresentados. Exemplo 9.1. Exemplo Descrio: O exemplo c
lssico para determinar que se todo homem mortal e se Scrates um homem, ento Scrates
mortal. Essas armaes podem ser representadas atravs das frmulas:
a partir destas pode-se concluir:
O programa Prolog que descreve estas relaes pode ser representado como a segui r.
Cdigo: mortal(X) : % Todos os homens so mortais homem(X), writef (`%w%w%w', [ `Sim
, ', X, ` mortal ']). homem( socrates ). % Scrates um homem Consulta: 22 ---------------------- Page 24----------------------? mortal( socrates ). Sim, socrates
mortal Yes
Exemplo 9.2. Exemplo Descrio: Dado um conjunto de animais determinar a cadeia alim
entar de um animal qualquer.

O programa Prolog que descreve estas relaes pode ser representado como a segui r.
Cdigo: animal(urso ). animal(peixe ). animal(peixinho ). animal(guaxinim ). anima
l(raposa ). animal(coelho ). animal(veado ). animal( lince ). planta(alga ). pla
nta(grama). come(urso , peixe ). come(peixe , peixinho ). come(peixinho , alga )
. come(guaxinim , peixe ). come(urso , guaxinim ). come(urso , raposa ). come(ra
posa , coelho ). come(coelho , grama). come(urso , veado ). come(veado , grama).
come(lince , veado ). cadeiaalimentar(X, Z) : come(X, Z). cadeiaalimentar(X, Z)
: come(X, Y), cadeiaalimentar(Y, Z). Consulta: ? Y Y Y Y Y Y Y Y = = = = = = =
= cadeiaalimentar(urso , Y). peixe ; guaxinim ; raposa ; veado ; peixinho ; alga
; peixe ; peixinho ; 23 ----------------------- Page 25----------------------Y
= Y = Y = Y = No alga ; coelho ; grama ; grama ;
A repetio de elementos ocorre, pois, um urso come um animal z diretamente e co me
algum animal y que come z. Ento, a cada vez que um animal aparece na cadeia alime

ntar de um urso ele ser exibido. Exemplo 9.3. Exemplo Descrio: Implementar um cdigo
para solucionar o jogo Torre de Hanoi, com n peas. O jogo formado por uma base co
ntendo trs pinos, em um destes pinos esto dispostos sete discos uns sobre os outro
s, em ordem crescente de dimetro, de cima para baixo, tal como ilustrado na Figur
a 5(a). O problema consiste em passar todos os discos de um pino para outro qual
quer, usando um dos pinos como auxiliar, de maneira qu e um disco maior nunca qu
e em cima de outro menor em nenhuma situao. O nmero de discos pode variar sendo que
o mais simples contm apenas trs. A Figura 5(a) ilustr a um possvel estado inicial
e a Figura 5(b) ilustra um possvel estado nal para o esta do inicial exibido. (a)
Estado inicial para o jogo torre de hanoi. (b) Estado nal para o jogo torre de
hanoi. Figura 5: Jogo Torre de Hanoi Um programa Prolog que fornece solues para o
jogo descrito pode ser implementa do como a seguir. Cdigo: hanoi(N) : move(N, esq
uerdo , central , direito ). move(0, _, _, _) : !. move(N, A, B, C) : M is N1, m
ove(M, A, C, B) , inform(A, B) , move(M, C, B, A). inform(X, Y) : writef (`%w%w%
w%w', [ `Mova o disco do pino ', X, ` para o pino ', Y ]) , nl. Consulta: ? hano
i (3). Mova o disco do pino esquerdo para o pino central 24 ---------------------- Page 26----------------------Mova Mova Mova Mova Mova Mova o o o o o o disco
disco disco disco disco disco do do do do do do pino pino pino pino pino pino e
squerdo central esquerdo direito direito esquerdo para o para o para o para o pa
ra o para o pino pino pino pino pino pino direito direito central esquerdo centr
al central

Yes Para visualizar a soluo procure uma verso do jogo na internet, porm, o cdigo impl
ementado considera que o estado inicial do jogo contm todos os discos no pino da
esquerda, enquanto alguns verses disponveis na internet aceitam outras conguraes. Ex
emplo 9.4. Exemplo Descrio: O bubble sort, o mais simples algoritmo de ordenao. O al
goritmo consiste em percorrer um vetor vrias vezes, em cada iterao o menor ou o mai
or elemento colocado em sua posio correta no vetor. O programa Prolog que implemen
ta este algoritmo o exibido a seguir. Cdigo: bubblesort (Lista_In , Lista_Out) :
append(L_Front, [A, B Rest ] , Lista_In) , % Lista_In = [A + B Rest ] B < A,! ,
% checa se B menor que A append(L_Front, [B, A Rest ] , L_Rest), % L_Rest = [B +
A Rest ] bubblesort (L_Rest, Lista_Out ). % utiliza e regra recurs ivamente bub
blesort (Lista , Lista ). % Lista j est ordenada Consulta: ? bubblesort ([2 ,3 ,1
,7 ,5 ,4] , L). L = [1 , 2, 3, 4, 5, 7] ; No

Exemplo 9.5. Exemplo Descrio: Dada uma lista de elementos, determine se ela um paln
dromo ou no. Um palndromo uma palavra ou nmero cuja leitura a mesma, quer se faa da
esquerda para a direita, quer se faa da direita para a esquerda; Cdigo: palindrome
([]). palindrome ([_]). palindrome ([F R]) : append(S,[F] ,R) , palindrome(S).
Consulta: ? Yes ? palindrome ([m,a,a]). 25 ----------------------- Page 27---------------------No ? palindrome ([s ,o,c ,o,r ,r ,a,m,m,e,e,m,m,a,r ,r ,o,c ,o,
s ]). palindrome ([m,a,m]).

Yes
Exemplo 9.6. Exemplo Descrio: Mximo Divisor Comum (M.D.C.). Dados dois inteiros pos
itivos A e B, o eu mximo divisor comum, C, o maior nmero que divide A e B sem deix
ar resto. Para encontrar o m.d.c de dois nmeros necessrio trabalhar com trs casos,
so eles: se A=B, ento, C=A ou B; se A < B, ento, C igual ao maior divisor comum de
A e B - A; se A > B, ento, C igual ao maior divisor comum de B e A - B. Um progra
ma Prolog que que implementa m.d.c pode ser representado como a seg uir. Cdigo: m
dc(A, A, A). A < B, Temp is B mdc(A, Temp, mdc(A, B, C) : A > B, Temp is A mdc(T
emp, B, Consulta: ? C = No ? C = No mdc(12, 18, C). 6 ; mdc(4,4,C). 4 ; mdc(A, B
, C) : A, C). B, C).
Exemplo 9.7. Exemplo Descrio: Clculo de fatorial. Implementar um programa Prolog qu
e realize o clculo do fatorial de um nmero. Cdigo: fatorial (0 ,1). fatorial (N,F)
: N>0, N1 is N1, factorial (N1,F1), F is N F1. 26 ----------------------- Page 2
8----------------------Consulta:

? W = No ? X = No
fatorial (3,W). 6 ; fatorial (4, X). 24 ;
Exemplo 9.8. Exemplo Descrio: Implementar um programa que determina se um determin
ado dia faz parte de um dia da semana ou nal de semana. Note que a determinao de u
ma categoria j exclui a possibilidade de que o elemento pertena a outra categoria,
ou seja, no ex iste um dia que seja semana e nal de semana. Cdigo: semana(segunda
). semana(terca ). semana(quarta ). semana(quinta ). semana(sexta ). fimdeseman
a(sabado ). fimdesemana(domingo). categoria (X) : fimdesemana(X) , writef (`%w%w
', [X, ` um final de semana. ']) , !. categoria (X) : semana(X) , writef (`%w%w'
, [X, ` um dia de semana. ']) , !. Consulta: ? categoria segunda um Yes. ? categ
oria domingo um Yes. (segunda ). dia de semana. (domingo). final de semana.
10
Exerccios
As questes 10.1 at 10.4 so relacionadas ao programa Prolog apresentado a seguir: ge
nitor( pam, bob). genitor( tom, bob). genitor( tom, liz ). 27 ---------------------- Page 29-----------------------

genitor( bob, ann). genitor( bob, pat ). genitor( pat , jim ). mulher(pam). mulh
er( liz ). mulher(pat ). mulher(ann). homem(tom). homem(bob). homem(jim ). prole
(Y,X) : genitor(X,Y). mae(X,Y) : genitor(X,Y) , mulher(X). avos(X,Z) : genitor(X
,Y) , genitor(Y,Z). irma(X,Y) : genitor(Z,X) , genitor(Z,Y) , mulher(X) , not(X
= Y). descendente(X,Z) : genitor(X,Z). descendente(X,Z) : genitor(X,Y) , descend
ente(Y,Z). Exerccio 10.1. Quais as respostas para as seguintes consultas? 1. ?- g
enitor(X, jim). 2. ?- genitor(jim, X). 3. ?- genitor(pam, X), genitor(X, pat). 4
. ?- genitor(pam, X), genitor(X, Y), genitor(Y, jim). Exerccio 10.2. Formule cons
ultas para descobrir: 1. Quem so os pais de Pat? 2. Liz possui lhos? 3. Quem o av
de Pat? 4. Quem a me de Jim? 5. Quem o irmo de Bob? 6. Quem a irm de Pat? Exercci
0.3. Formule regras para as seguintes relaes: 1. tio(a); 2. irmo; 3. avs paternos; 4
. avs maternos; 5. ascendente (o inverso de descendente); 6. primo(a), insira nov
os fatos para realizar consultas sobre esta relao. 28 ----------------------- Page
30-----------------------

Exerccio 10.4. Em quais das seguintes consultas Prolog utiliza encadeamento para
trs? 1. ?- genitor(pam, bob). 2. ?- mae(pam, bob). 3. ?- avos(pam, ann). 4. ?- av
os(bob, jim). Exerccio 10.5. Considere as seguintes premissas: Todos os animais tm
pele. Peixe um tipo de animal, pssaros so outro tipo e mamferos so um terceiro tipo
. Normalmente, os peixes tm nadadeiras e podem nadar, enquanto os pssaros tm asas e
podem voar. Se por um lado os pssaros e os peixes pem ovos, os mamferos no pem. Embo
ra tubares sejam peixes, eles no pem ovos, seus lhotes nascem j formados. Salmo um o
tro tipo de peixe, e considerado uma delcia. O canrio um pssaro amarelo. Uma avestr
uz um tipo de pssaro grande que no voa, apenas anda. Os mamferos normalmente andam
para se mover, como por exemplo uma vaca. As vacas do leite, mas tambm servem elas
mesmas de comida (carne). Contudo, nem todos os mamferos andam para se mover. Po
r exemplo, o morcego voa. Considere ainda que existem os seguinte animais: 1. Pi
upiu, que um canrio. 2. Nemo, que um peixe. 3. Tutu, que um tubaro. 4. Mimosa, que
uma vaca. 5. Vamp, que um morcego. 6. Xica, que uma avestruz. 7. Alfred, que um
salmo. Dena fatos e regras Prolog que representam as premissas acima, e formule
cons ultas Prolog para responder s seguintes perguntas: 1. O piupiu voa? 2. Qual
a cor do piupiu? 3. A Xica voa? 4. A Xica tem asas? 5. O Vamp voa? Tem asas? Poe
m ovos? 6. Quais os nomes dos animais que pem ovos? 7. Quais os nomes dos animais
que so comestveis? 29 ----------------------- Page 31-----------------------

8. Quais os nomes dos animais que se movem andando? 9. Quais os nomes dos animai
s que se movem nadando mas no pem ovos? As questes 10.6 at 10.8 so relacionadas ao pr
ograma Prolog apresentado a seguir : animal(urso ). animal(peixe ). animal(peixi
nho ). animal(guaxinim ). animal(raposa ). animal(coelho ). animal(veado ). anim
al( lince ). planta(alga ). planta(grama). come(urso , peixe ). come(peixe , pei
xinho ). come(peixinho , alga ). come(guaxinim , peixe ). come(urso , guaxinim )
. come(urso , raposa ). come(raposa , coelho ). come(coelho , grama). come(urso
, veado ). come(veado , grama). come(lince , veado ). presa(X) : come(_, X) , an
imal(X).
Exerccio 10.6. Quais as respostas para as seguintes consultas? 1. ?- come(urso, p
eixinho). 2. ?- come(raposa, coelho). 3. ?- come(guaxinim, X). 4. ?- come(X, gra
ma). 5. ?- come(urso, X), come(X, coelho). 6. ?- presa(X), not(come(raposa, X)).
Exerccio 10.7. Formule regras para as seguintes relaes: 1. herbvoro; 2. carnvoro. Ex
erccio10.8. Utilizandoaregrada questo anterior, elaboreconsultasparaas seguintes p
erguntas: 1. Quais animais so herbvoros? 30

----------------------- Page 32----------------------2. Quais animais so carnvoros


? 3. Quais animais herbvoros so presas de uma raposa? Exerccio 10.9. Elabore um pro
grama Prolog que fornea o nome da capital de qualquer estado brasileiro. Exerccio
10.10. Implemente um programa para determinar quais tipos sanguneos podem doar/re
ceber sangue de quais tipos. A tabela seguinte fornece a informao neces sria para a
implementao. A Doa/Recebe Recebe Doa Tabela 1: Tipos sanguneos. B AB Doa Doa/Receb
e Doa Recebe Doa/Recebe Doa Doa O Recebe Recebe Recebe Doa/Recebe
A B AB O
Exerccio 10.11. Dena: 1. um predicado que fornea a interseco de duas listas; 2. um p
redicado que identique se um conjunto de elementos est contido em uma li sta; 3.
dois predicados que identiquem se uma lista possui tamanho par ou mpar; 4. um pre
dicado que escreva uma lista em ordem inversa. Dica: utilize concate nao; 5. um pr
edicado que retorne o maior valor contido em uma lista numrica; 6. um predicado p
ara obter a soma dos N primeiros nmeros naturais. Exerccio10.12. Implementeum prog
ramaque retornea N-sima potnciadeum nmero. Exerccio 10.13. As regras abaixo identica
m se um nmero positivo, negativo ou zero. Dena regras que realizem o mesmo proced
imento, porm, de maneira mais eciente. Dica: utilize cortes. checagem(N, positivo
) : checagem(0, zero ). checagem(N, negativo) : N > 0. N < 0.
Exerccio 10.14. Implemente um programa que classique se uma pessoa considerada: c
riana (idade <= 12), adolescente (12 < idade <= 18 ), adulto (18 < idade <= 65) o
u idoso (65 < idade). Obs.: Utilize cortes para melhorar a ecincia do programa. E
xerccio 10.15. Implemente um programa que fornea o signo de uma pessoa, mediante a
uma consulta do tipo dataNascimento(DD,MM, Signo). Obs.: Utilize cortes para me
lhorar a ecincia do programa.

31 ----------------------- Page 33----------------------Exerccio 10.16. Um estuda


nte acostumado a usar linguagens procedimentais est desenvolvendo um compilador e
m Prolog. Uma das tarefas consiste em traduzir um cdig o de erro para uma pseudodescrio em portugus. O cdigo por ele usado : traduza(Codigo , Significado): traduza(C
odigo , Significado): traduza(Codigo , Significado): Codigo=1, Significado=integ
er_overflow . Codigo=2, Significado=divisao_por_zero . Codigo=3, Significado=id_
desconhecido .
O cdigo funciona, porm, pode ser implementado de outra maneira (mais descritiva e
menos procedimental). Melhore o cdigo. 32 ----------------------- Page 34---------------------Referncias [1] Ivan Bratko. Prolog Programming for Articial Intelli
gence. Addison-Wesley, 1 986. [2] L. Sterling e E. Shapiro. The Art of Prolog. M
IT Press, 1986. [3] Marco Antnio Casanova, Fernando Giorno, and Antnio L. Furtado.
Programao em lgica e a linguagem Prolog. Edgar Blucher, 1987. [4] Judith L. Gersti
ng. Fundamentos matemticos para Cincia da Computao. LTC, 2001. [5] Logic Programming
Associates. Logic Programming Associates. www.lpa.co.uk /, 2006. [6] Mike Brady
. Open Prolog Home Page. www.cs.tcd.ie/open-prolog/, 2006. [7] The Computational
logic, Languages, Implementation, and Parallelism Laboratory. The Ciao Prolog D
evelopment System WWW Site. www.clip.dia..upm.es/Software/Ciao, 2006. [8] LIACCUniversidade do Porto and COPPE Sistemas-UFRJ. Yet Another Prolog. www.ncc.up.pt
/ vsc/Yap, 2006. [9] Jan Wielemaker. What is SWI-Prolog? www.swi-prolog.org/, 20
06. [10] Swedish Institute of Computer Science. SICStus Prolog. www.sics.se/sics
tus/ , 2006. [11] Amzi! Inc. AMZI! www.amzi.com/, 2006. [12] Prolog Development
Center. Visual Prolog. www.visual-prolog.com/, 2006. [13] Daniel Diaz. The GNU P
rolog web site. gnu-prolog.inria.fr, 2003. [14] Stony Brook University. Welcome
to the home of XSB! xsb.sourceforge.net/, 2

006. [15] TRINC. Trinc Prolog R3a. www.trinc-prolog.com, 2006. [16] University o
f Amsterdam. SWI-Prolog anual. gollem.science.uva.nl/SWI-Prolog/Manual/, 2006. 3
3 5.6.17 Reference M