Escolar Documentos
Profissional Documentos
Cultura Documentos
Prolog
Joo Meidanis
c Copyright
2011 J. Meidanis
Contedo
Introduo
1.1
Objetos e relaes . . . . . . . . . . . . . . . . . . . . . . . . .
1.2
Programao em Prolog
. . . . . . . . . . . . . . . . . . . . .
1.3
Fatos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.4
Perguntas
. . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.5
Variveis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.6
Conjunes
. . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.7
Regras . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
10
Sintaxe e unicao
15
2.1
Constantes . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
15
2.2
Variveis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
16
2.3
Estruturas . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
16
2.4
Igualdade e unicao
18
. . . . . . . . . . . . . . . . . . . . . .
Aritmtica
20
24
4.1
. . . . . . . . . . . . . . . . . . . . .
24
4.2
Listas
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
25
4.3
Recurso . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
28
4.4
Juntando listas
. . . . . . . . . . . . . . . . . . . . . . . . . .
31
4.5
Acumuladores . . . . . . . . . . . . . . . . . . . . . . . . . . .
33
Backtracking
36
5.1
37
5.2
O corte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
39
5.3
Usos do corte
. . . . . . . . . . . . . . . . . . . . . . . . . . .
39
5.3.1
40
5.3.2
Combinao corte-falha . . . . . . . . . . . . . . . . . .
41
5.3.3
Limitando buscas . . . . . . . . . . . . . . . . . . . . .
42
42
5.4
e o corte
46
6.1
46
6.2
. . . . . . . . . . . . . . . . . .
48
6.3
49
6.4
. . . . . . . . . . . . . . . . .
50
6.5
Operadores
. . . . . . . . . . . . . . . . . . . . . . . . . . . .
50
Predicados pr-denidos
53
7.1
Verdadeiros
. . . . . . . . . . . . . . . . . . . . . . . . . . . .
53
7.2
Tipos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
53
7.3
Banco de dados . . . . . . . . . . . . . . . . . . . . . . . . . .
54
7.4
Listas
54
7.5
. . . . . . . . . . . . . . . .
54
7.6
Outros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
55
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Estilo e depurao
56
8.1
58
Depurao . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Gramticas
60
9.1
60
9.2
62
9.3
66
9.4
Argumentos adicionais
67
. . . . . . . . . . . . . . . . . . . . . .
Bibliograa
70
Captulo 1
Introduo
o que
como
feito.
As presentes notas esto baseadas no livro de Clocksin e Mellish,
ming in Prolog
Program-
1.1
Objetos e relaes
objetos
relaes
termo
1.2
Programao em Prolog
regras de inferncia
http://www.swi-prolog.org.
H para todos
1.3
Fatos
gosta(pedro, maria).
gosta(maria, pedro).
valioso(ouro).
mulher(jane).
possui(jane, ouro).
pai(pedro, maria).
entrega(romeu, livro, maria).
5
Observe que:
Terminologia: relaes so
1.4
Perguntas
?- possui(maria, livro).
Estamos perguntando se Maria possui o livro. Prolog tenta
unicar
o fato
Caso contrrio,
responder no.
Perceba que a resposta no em Prolog no signica necessariamente que
o fato no verdadeiro, mas simplesmente que Prolog no consegue
o fato a partir de seu banco de dados.
Considere o banco de dados:
humano(socrates).
humano(aristoteles).
ateniense(socrates).
e a pergunta:
provar
?- ateniense(aristoteles).
Embora seja verdade que Aristteles tenha sido ateniense, no se pode provar
isto a partir dos fatos dados.
1.5
Variveis
gosta(maria, flores).
gosta(maria, pedro).
gosta(paulo, maria).
Se zermos a pergunta:
?- gosta(maria, X).
estaremos perguntando Do que Maria gosta?. Prolog responde:
X = flores
e ca esperando por mais instrues, das quais falaremos em breve. Novamente, Prolog busca fatos que uniquem com o fato da pergunta. A diferena
que uma varivel est presente agora. Variveis no instanciadas, como
o caso de
Prolog examina
Quando Prolog encontra um fato que unica com uma pergunta, Prolog
mostra os objetos que as variveis guardam. No caso em questo, s h uma
varivel, que foi unicada com o objeto
X = flores.
flores,
Se teclarmos
ENTER, isto ser interpretado como signicando que estamos satisfeitos com
a resposta dada e Prolog interrompe a busca. Se em lugar disto teclarmos um
do
ponto onde tinha parado, tentando encontrar uma outra resposta pergunta.
ponto-e-vrgula (;) seguindo de ENTER, Prolog vai continuar sua busca
ressatisfazer
a pergunta.
X. Isto signica que Prolog deve agora esquecer que X vale flores e continuar
a busca com X voltando a estar no instanciada. A busca prossegue do ponto
marcado no banco de dados. O prximo fato unicante gosta(maria,
pedro). A varivel X agora instanciada a pedro e Prolog move a marca
para o fato gosta(maria, pedro), respondendo X = pedro e aguardando
mais instrues. Se pedirmos continuao com ; e ENTER, no h neste
caso mais respostas possveis, e por isso Prolog respoder no.
Vejamos rapidamente um outro exemplo sobre o mesmo banco de dados.
?- gosta(X, paulo).
X = maria ;
no
1.6
pergunta inicial
primeira resposta
no h mais respostas
Conjunes
Questes mais complexas como Ser que Pedro gosta de Maria e Maria gosta
de Pedro? podem ser feitas com conjunes. Este problema consiste de duas
metas separadas que Prolog deve tentar satisfazer, e existe uma notao para
isto na linguagem. Considere o banco de dados:
gosta(maria, chocolate).
gosta(maria, vinho).
8
gosta(pedro, vinho).
gosta(pedro, maria).
A pergunta
conjuno.
questo, a resposta ser no, pois, embora a primeira meta seja um fato, a
segunda no pode ser provada.
Conjunes combinadas com variveis podem responder a perguntas bastante
interessantes, por exemplo: H algo de que ambos Maria e Pedro gostam?.
Isto seria escrito da seguinte forma:
gosta(maria, chocolate).
chocolate em todas as ocorrncias de X
na pergunta.
instanciada a
instanciao de
X.
gosta(maria, vinho).
Prolog move a marca para a nova posio e instancia
4. Prolog tenta a prxima meta, que agora
vinho.
gosta(pedro, vinho).
Esta
no uma ressatisfao, mas sim uma meta inteiramente nova, e portanto a busca comea do incio do banco de dados. Esta nova meta
satisfeita e Prolog coloca a marca desta meta no fato unicador.
5. Todas as metas da pergunta esto satisfeitas agora. Prolog imprime as
instanciaes de variveis:
X = vinho
e aguarda instrues.
Resumindo, cada meta tem seu prprio marcador no banco de dados, que
usado caso a meta precise ser ressatisfeita. Junto com uma unicao cam guardadas instanciaes de variveis dela resultantes, que sero desfeitas
em caso de necessidade de ressatisfao.
backtracking.
1.7
Uma
Regras
regra
10
Pedro gosta de
se
gosta de vinho.
cabea
e um
corpo.
A cabea e o corpo
so conectados pelo smbolo :- formado por dois pontos e hfen. O :-
procuncia-se se. A dependncia acima seria escrito como:
o de metas que devem ser satisfeitas para que a cabea seja considerada
verdadeira. Por exemplo, podemos tornar Pedro mais exigente sobre o que
ele gosta adicionando mais metas ao corpo da regra:
escopo
de
Dizemos que o
for instanciada, as
Uma meta unica com uma regra se ela unica com a cabea
Agora, para vericar a veracidade da regra, o corpo usado.
Diferentemente dos fatos, onde basta haver unicao para que a meta seja
sarisfeita, no caso de uma regra a unicao na verdade transfere a vericao
da satisfao para a conjuno de metas que formam o corpo da regra.
Vamos ilustrar este procedimento com nosso prximo exemplo, que envolve a
famlia da rainha Vitria. Usaremos o predicado
11
pais
tal que
pais(X, Y, Z)
mulher
homem
so
Z.
O segundo
homem(alberto).
homem(eduardo).
mulher(alice).
mulher(vitoria).
pais(eduardo, vitoria, alberto).
pais(alice, vitoria, alberto).
irma_de tal que irma_de(X, Y) seja satisfeito
Y. Dizemos que X irm de Y quando:
for irm de
mulher
tem me
e pai
P,
X.
irma_de(X, Y) :mulher(X),
pais(X, M, P),
pais(Y, M, P).
Se perguntarmos:
?- irma_de(alice, eduardo).
as seguintes metas sero tentadas e os resultados podem ser vistos na Tabela 1.1, onde numeramos as variveis com ndices de acordo com a meta,
12
irma_de(alice, eduardo).
Meta
Marca
Variveis
irma_de(alice,eduardo)
irma_de,
X1 = alice,
Y1 = eduardo
regra 1
2
mulher(alice)
mulher,
pais(alice,M1 ,P1 )
fato 1
pais,
fato 2
pais(eduardo,vitoria,alberto)
pais,
M1 = vitoria,
P1 = alberto
-
fato 1
pois, embora a mesma letra signique a mesma varivel dentro de uma regra,
em metas diferentes a mesma letra signica variveis diferentes.
Note que, ao unicar com a cabea da regra, a meta 1 deu origem a trs outras
metas, denotadas pelos nmeros 2, 3, e 4, que vieram do corpo da regra. Ao
nal, Prolog consegue satisfazer a meta principal e responde:
agora que queiramos saber
de quem
sim.
Suponha
?- irma_de(alice, X).
O que ocorre ento est na Tabela 1.2, onde
X sem ndice
indicar a varivel
da pergunta.
Observe que
X = Y1 = eduardo
X = eduardo
e ca aguardando novas instrues. O que acontecer se pedirmos respostas
alternativas? Veja o exerccio a seguir.
Em geral, um mesmo precicado denido atravs de alguns fatos e algumas
regras.
Usaremos a palavra
clusula
coletivamente.
13
irma_de(alice, X).
Meta
Marca
Variveis
irma_de(alice,X)
irma_de,
X1 = alice,
Y1 = X
regra 1
2
mulher(alice)
mulher,
pais(alice,M1 ,P1 )
fato 1
pais,
M1 = vitoria,
P1 = alberto
Y1 = eduardo
fato 2
4
pais(Y1 ,vitoria,alberto)
pais,
fato 1
Exerccios
dif(X,Y)
irma_de
acima.
Este o compor-
14
so diferentes?
Captulo 2
Sintaxe e unicao
2.1
As
Constantes
constantes
pode ser
tomos
ou
nmeros.
tomo
livro,
maria,
caracteres,
nmeros,
15
vlidos:
2.2
Variveis
Sintaticamente, as
variveis
annimas.
underscore ) _.
Estas ltimas so
2.3
Estruturas
seguido de
Por exem-
plo, para indicar um livro com seu ttulo e autor podemos usar a estrutura
abaixo:
livro(incidente_em_antares, verissimo)
Observe que os fatos de um banco de dados em Prolog so estruturas seguidas
de um ponto nal.
16
aridade.
Funtores de aridade
Quando no h argumentos, a
operador.
+, -, *, /
-.
tm geralmente posio
maior que de
8/(2/2).
8/2/2
(8/2)/2
Note que Prolog diferente das outras linguagens no aspecto aritmtico, pois
uma expresso como
2 + 3
is
17
2.4
Igualdade e unicao
para a igualdade, mas em geral seu uso pode ser substitudo pelo
poderia ser
X = X.
Uma outra caracterstica da igualdade em Prolog, j que ela signica unicao, que ela pode causar a instanciao de algumas variveis, como temos
visto nos exemplos introdutrios.
Em geral, dada uma meta da forma
quer, a deciso sobre sua igualdade feita de acordo com a Tabela 2.1. Nesta
tabela so tratados os casos onde cada termo pode ser uma constante, varivel, ou estrutura. Note que quando dizemos varivel estamos na verdade
nos referindo a variveis no instanciadas, pois para variveis instanciadas
deve se usar o valor a que esto associadas para consultar a Tabela 2.1.
T2
constante
constante
se
varivel
for
mesma
varivel
T1
estrutura
sempre;
sempre;
estrutura
causa
nunca
instanciao
causa
tornam-se liga-
sempre;
instanciao
das
instanciao
nunca
sempre;
causa
instanciao
mesmo
causa
funtor,
mesmo nmero
de
componen-
Tabela 2.1: Condies para que dois termos se uniquem, segundo seus subtipos.
18
O subtipo
Exerccios
19
Captulo 3
Aritmtica
Prolog tem uma srie de predicados pr-denidos para artimtica, que podem
ser divididos entre comparao e clculo. Vamos comear pelos de comparao.
Os predicados de comparao so inxos e comparam apenas nmeros ou
variveis instanciadas a nmeros. So eles:
=:=
=\=
<
>
=<
>=
igual
diferente
menor
maior
menor ou igual
maior ou igual
=<,
e no
<=
como na
2 < 3.
seja verdadeiro.
Para exemplicar o uso dos comparadores, considere o seguinte banco de
dados contendo os prncipes de Gales nos sculos 9 e 10, e os anos em que
reinaram. Os nomes esto em gals.
20
?- principe(cadwallon, 986).
yes
?- principe(X, 900).
X = anarawd
yes
?- principe(X, 979).
X = iago_ap_idwal ;
X = hywel_ap_ieuaf ;
no
Para clculos aritmticos, o predicado especial pr-denido
is
21
aritmticas.
Para exemplicar, considere o seguinte banco de dados sobre a populao e a
rea de diversos pases em 1976. O predicado
pop
representar a populao
area
informar a rea de
pop(eua, 203).
pop(india, 548).
pop(china, 800).
pop(brasil, 108).
area(eua, 8).
area(india, 3).
area(china, 10).
area(brasil, 8).
Para calcular a densidade populacional de um pas, escrevemos a seguinte
regra, que divide a populao pela rea:
?- dens(china, X).
X = 80
yes
?- dens(turquia, X).
no
22
+
*
/
//
mod
soma
subtrao
multiplicao
diviso
diviso inteira
resto da diviso
Exerccios
soma(5).
soma(2).
soma(2 + X).
soma(X + Y).
e a meta
soma(2 + 3)
Com quais dos fatos esta meta unica? Quais so as instanciaes de
variveis em cada caso?
2. Quais so os resultados das perguntas abaixo?
?????-
X
X
6
X
Y
is 2
is Y
is 2
= 5,
is X
+ 3.
+ Z.
* 4.
Y is X // 2.
// 2, X = 5.
23
Captulo 4
Estruturas de dados e recurso
4.1
As estruturas podem ser desenhadas como rvores, onde o funtor ca na raiz
e os componentes so seus lhos, como na Figura 4.1.
pais
pais(carlos, bete, felipe)
carlos
bete
felipe
24
sentenca
sujeito
sentenca
predicado
sujeito
verbo
objeto
pedro
predicado
verbo
objeto
ama
maria
Por exemplo, a
4.2
Listas
25
ou uma
cabea
e a
cauda.
Na
(c .
()))).
.
[]
A exemplo de LISP, Prolog tambm tem uma maneira alternativa, mais prtica, de denotar listas, que no usa o funtor . explicitamente. Basta colocar
26
[a, b, c].
Qualquer
termo pode ser componente de uma lista, por exemplo, variveis ou outras
listas:
Lista
Cabea
Cauda
[a, b, c]
a
[b, c]
[ ]
no tem
no tem
[[o, gato], sentou]
[o, gato]
[sentou]
[o, [gato, sentou]]
o
[[gato, sentou]]
[o, [gato, sentou], ali]
o
[[gato, sentou], ali]
[X + Y, x + y]
X + Y
[x + y]
Para combinar com a notao simplicada para listas, Prolog tambm tem
uma notao especial, mais intuitiva, para indicar
vertical |:
[X|Y].
.(X, Y)
usando a barra
p([1, 2, 3]).
p([o, gato, sentou, [no, capacho]]).
?- p([X|Y]).
X = 1 , Y = [2, 3] ;
X = o, Y = [gato, sentou, [no, capacho]] ;
no
?- p([_,_,_,[_|X]]).
X = [capacho]
27
Uma ltima observao: possvel criar estruturas que parecem listas mas
no so, por exemplo,
[cavalo|branco],
Exerccios
4.3
Recurso
cauda agora.
relao
remos um predicado
member
tal que
member(X, Y)
28
Escreve-
verdadeiro quando o
termo
um elemento da lista
Y.
membro de
se
Em pri-
Y,
member(X, Y) :- Y = [X|_].
ou, simplicando,
member(X, [X|_]).
Note o uso da varivel annima. Neste fato, no nos interessa o que a cauda
de
Y.
ressa o que est na cabea da lista, que foi tratada na primeira clusula do
predicado
member.
por
Y,
j que
sumiu na
simplicao.
O que escrevemos foi basicamente uma denio do predicado
member, porm
a maneira de processar perguntas de Prolog faz com que esta deniao possa
ser usada computacionalmente. Exemplos:
parada
e para o
caso recursivo.
No caso de
member,
condies de
h na verdade duas
member
menor
temos certeza de acabaremos por encontrar a lista vazia, a menos claro que
encontremos o objeto antes.
Certos cuidados devem ser tomados ao fazer denies recursivas. Um deles
evitar circularidade, por exemplo:
loop
innito.
?- homem(X).
Prolog estrar em
30
homem(adao).
homem(X) :- homem(Y), filho(X, Y).
Em geral, aconselhvel colocar os fatos antes das regras.
Os predicados
lista([A|B]) :- lista(B).
lista([ ]).
a prpria denio de lista. Ela funciona bem com constantes:
?- lista([a, b, c, d]).
yes
?- lista([ ]).
yes
?- lista(f(1, 2, 3)).
no
Mas, se perguntarmos
?- lista(X).
Prolog entrar em
loop.
ver o problema.
4.4
Juntando listas
O predicado
append
Este predicado pode ser usado para criar uma lista que a concatenao de
duas outras:
append([ ], L, L).
append([X|L1], L2, [X|L3]) :- append(L1, L2, L3).
A primeira clusula a condio de parada. A lista vazia concatenada com
qualquer lista resulta na prpria lista.
seguintes princpios:
acima.
4. Conforme aplicamos a segunda clusula, o primeiro argumento vai diminuindo, at ser a lista vazia; logo, a recurso termina.
32
4.5
Acumuladores
acumuladores.
Estes
listlen
listlen(L, N) satis-
length
listlen([ ], 0).
listlen([H|T], N) :- listlen(T, N1), N is N1 + 1.
Observe que o primeiro argumento deve vir instanciado para que esta denio funcione. A denio com acumulador baseia-se no mesmo princpio
recursivo, mas acumula a resposta a cada passo num argumento extra. Usa-
lenacc([ ], A, A).
lenacc([H|T], A, N) :- A1 is A + 1, lenacc(T, A1, N).
listlenacc(L, N) :- lenacc(L, 0, N).
Acompanhe a seqncia de submetas criadas para calcular o comprimento de
[a, b, c, d, e]:
listlenacc([a, b, c, d, e], N)
lenacc([a, b, c, d, e], 0, N)
lenacc([b, c, d, e], 1, N)
33
lenacc([c, d, e], 2, N)
lenacc([d, e], 3, N)
lenacc([e], 4, N)
lenacc([ ], 5, N)
onde todos os
das regras denidas. Esta ltima meta unica com a condio de parada (a
primeira clusula de
listlen
rev,
reverse):
L1
e entrando
entram pela frente nas listas, combinando com as operaes de lista em Prolog
que s permitem manipular diretamente a cabea.
parada instancia
L3
No nal, a clusula de
reversa.
nicado
sig-
34
satisfeita
quando a reversa da
em
L3.
De
Exerccios
1. Escreva um predicado
o ltimo elemento da
2. Escreva um predicado
efface(L1, X, L2)
delete(L1, X, L2)
em
L1.
35
X
X
em
L1.
L2
L2
Captulo 5
Backtracking e o corte
Resumindo o que vimos sobre a operao de Prolog at agora:
n.
satisfaz-las.
2. a tentativa de satisfao de uma meta
casou.
A satisfao
backtracking
36
backtracking
backtracking
em
certas condies.
A notao k.m para indicar metas geradas por um casamento da meta
com uma regra interessante para saber quem a meta-me de cada meta
gerada, o que vai ser importante no nosso estudo do corte. Porm, em certas
situaes, podemos preferir simplesmente usar uma numerao sequencial
para as metas, como fazem alguns depuradores de sistemas Prolog.
5.1
pai(maria,
pai(pedro,
pai(sueli,
pai(jorge,
jorge).
jorge).
haroldo).
eduardo).
pai(X) :- pai(_,X).
H dois predicados
pai:
?- pai(X).
37
X =
X =
X =
X =
no
jorge ;
jorge ;
haroldo ;
eduardo ;
Note que Jorge apareceu duas vezes, pois h dois fatos onde ele aparece como
pai de algum. Talvez quisssemos que cada pai aparecesse uma vez s, mas
a operao padro de Prolog causar o resultado acima.
Uma situao semelhante ocorre com o predicado
member
visto anterior-
inteiro(0).
inteiro(N) :- inteiro(M), N is M + 1.
A pergunta
?- inteiro(N).
causar a gerao de todos os inteiros a partir do zero, em ordem crescente.
Isto pode ser usado em parceria com outro predicado que seleciona alguns
entre estes inteiros para uma determinada aplicao.
38
5.2
O corte
backtracking.
Alm disso,
como efeito colateral ele impede a ressatisfao da meta que lhe deu origem,
chamada de sua
meta me.
k . Numa tentativa
k como um todo, e
anterior a k .
Se o corte a meta
backtracking
g :- a, b, c, !, d, e, f.
Prolog realiza o
sucesso de
processo de
backtracking
a, b
at que o
backtracking
d, e
f,
5.3
Usos do corte
39
mas se
d. O
d em
que casou
Em alguns pre-
[X|Y]
no
casar com a lista vazia. Outras vezes, como quando os predicados envolvem
nmeros, isto no possvel. Nestes casos, o corte pode ajudar a fazer com
que a meta s case com o caso destinado a ela.
Considere a seguinte denio de um predicado
fat(N, F)
que calcula o
fatorial de um nmero:
fat(0, 1) :- !.
fat(N, F) :- N1 is N - 1, fat(N1, F1), F is F1 * N.
O corte aqui serve para impedir que uma meta da forma
?- fat(5, F).
F = 120 ;
no
Sem o corte:
?- fat(5, F).
F = 120 ;
loop
innito
A denio de
fat
out of memory )
40
fail
0 > 1
fail.
Se
nonmember(X, L)
queremos.
Este mesmo mtodo pode ser usado para implementar a negao de qualquer predicado. O uso deste artifcio to comum que existe uma notao
em Prolog para indicar esta forma de negao:
\+
41
Os sistemas
//,
desta seo.
inteiro
para gerar candidatos a quociente inteiro, que so testados pelas metas subseqentes. Note que sem o corte teramos um
loop
innito em tentativas de
ressatisfao.
5.4
Cortes tm um impacto signicativo no comportamento de qualquer predicado, e por isso necessrio ter clareza sobre exatamente que uso queremos
fazer de um predicado ao considerar a incluso de cortes em sua denio.
Para exemplicar esta questo, suponha que queiramos usar
member
apenas
para testar se elementos dados pertencem a listas dadas, sem nos importarmos com o nmero de vezes que aparecem. Neste caso, a denio
42
member(X, [X|_]) :- !.
member(X, [_|Y]) :- member(X, Y).
apropriada.
pais(adao, 0).
pais(eva, 0).
pais(_, 2).
Isto , Ado e Eva tm zero pais e qualquer outra pessoa tem dois pais. Se
usarmos este predicado para descobrir quantos pais uma pessoa tem, tudo
vai bem:
?- pais(eva, N).
N = 0
?- pais(pedro, N).
N = 2
Mas quando tentamos vericar uma armao algo inesperado acontece:
?- pais(eva, 2).
yes
43
pois a meta no casa com a clusula especca para Eva, mas no h nada
para impedir que a busca continue, e acabe casando com a clusula errada.
Uma forma de arrumar isto a seguinte:
pais(adao, N) :- !, N = 0.
pais(eva, N) :- !, N = 0.
pais(_, 2).
Agora as duas primeiras clusulas vo capturar as metas envolvendo Ado
e Eva e travar ali com o corte, deixando a vericao do valor de
para o
corpo da regra.
A concluso nal que ao introduzir cortes para que o predicado sirva a
um certo tipo de metas, no h garantia que ele continuar funcionando a
contento para outros tipos de metas.
Exerccios
1. Conserte o predicato
das onde
onde ambos
en chama-
vm instanciados.
nonmember
no esto na lista
[a, b, c]
com a
pergunta
44
(a)
member1
sem corte e
member2
sem corte?
(b)
member1
sem corte e
member2
com corte?
(c)
member1
com corte e
member2
sem corte?
(d)
member1
com corte e
member2
com corte?
member_com(X, [X|_]) :- !.
member_com(X, [_|Y]) :- member_com(X, Y).
member_sem(X, [X|_]).
member_sem(X, [_|Y]) :- member_sem(X, Y).
45
Captulo 6
Entrada e sada de dados
Neste captulo veremos alguns dos mecanismos que Prolog oferece para a entrada e sada de dados. Dividiremos a apresentao em trs partes: leitura e
escrita de termos; leitura e escrita de caracteres; leitura e escrita de arquivos.
Alm disso, abordaremos a questo dos operadores, que inuenciam o modo
como a leitura e a escrita ocorrem.
A descrio baseia-se no SWI Prolog. Outros sistemas podem diferir desta
implementao.
6.1
read(X)
satisfeita quando
dispositivo de entrada.
read
46
especial
end_of_file.
Em caso de ressatisfao,
read
falha.
?- pequeno.
|: 40.
yes
Observe o prompt '|:' usado por Prolog para indicar que est esperando um
termo.
Para escrever termos, Prolog disponibiliza o predicado pr-denido
write,
que aceita um argumento e imprime no dispoditivo de sada o termo instanciado a este argumento. Se o argumento contm variveis no instanciadas,
estas sero impressas com seus nomes internos, geralmente consistindo de um
_ seguido de um cdigo interno alfanumrico. Alm de
Prolog o predicado pr-denido
linha na impresso (
newline ).
nl,
write,
existe em
nl:
read,
47
write,
nl
s so sa-
6.2
Como vimos, as constantes do tipo caractere em Prolog so denotadas usandose apstrofes, por exemplo,
'e', '\n', etc. Para a leitura de caracteres, Proget_char(X), que satisfeito unicando
possvel que
em alguns sistemas a entrada s venha a Prolog linha a linha, o que signica que at que seja teclado um ENTER o interpretador no recebe nenhum
read, o caractere lido consumido indeget_char(X) ser satisfeito ou no. O predicado get_char
end_of_file
retornado.
no.
Para escrever caracteres, h o predicado pr-denido
put_char(X),
onde
48
6.3
current_input(X)
que instancia
em Prolog.
H um predicado
user_input.
corrente de sada
instancia
em Prolog.
H um predicado
dispositivo
current_output(X)
que
Nor-
user_output.
open.
arq.txt.
stream
dicados pr-denidos
set_input
set_output,
como argumento e tornam-no o dispositivo corrente de entrada ou sada, respectivamente. Assim, um programa em Prolog que pretenda usar um arquivo
como entrada deve proceder da seguinte forma:
programa :49
Stream,
Atitude
6.4
Ao escrevermos programas em Prolog, geralmente colocamos todas as clusulas dos predicados que queremos denir num arquivo, que depois carregamos
no sistema Prolog. Para carregar arquivos existe um predicado pr-denido
em Prolog chamado
arquivo, a meta
consult
6.5
Operadores
Como dissemos anteriormente, operadores conferem maior legibilidade, permitindo que certos funtores sejam lidos e escritos de forma prexa, inxa ou
50
prexa. Para tanto, necessrio tambm informar a precedncia e a associatividade destes operadores. Apenas funtores de aridade um ou dois podem
ser operadores.
inteiro entre 1 e 1200. Quanto mais alto este nmero, maior a precedncia.
O argumento
mentos.
binrios inxos.
parnteses,
associa.
Para exemplicar, eis a denio de alguns dos operadores em Prolog vistos
at agora.
???????-
????????-
op(700,
op(500,
op(500,
op(400,
op(400,
op(400,
op(400,
op(200,
xfx, 'is').
yfx, '+').
yfx, '-').
yfx, '*').
yfx, '//').
yfx, '/').
yfx, 'mod').
fy, '-').
Exerccios
1. Escreva um predicado
estrelas(N)
que imprime
caracteres * no
dispositivo de sada.
2. Escreva um predicado
nmero
N,
N.
guess(N)
e imprime Muito
conforme
'a'
por
52
'b'.
Captulo 7
Predicados pr-denidos
7.1
true
Verdadeiros
satisfeito sempre, s uma vez.
repeat
7.2
Tipos
var(X)
satisfeito quando
novar(X)
satisfeito quando
contrrio de
atom(X)
var(X).
satisfeito quando
number(X)
satisfeito quando
um nmero.
atomic(X)
satisfeito quando
um tomo ou um nmero.
53
7.3
Banco de dados
listing
listing(P)
P.
retract(X)
7.4
do banco de dados.
Listas
last(X, L)
satisfeito quando
reverse(L, M)
delete(X, L, M)
o de todas as ocorrncias de
7.5
em
L.
L.
a reversa da lista
M.
subset(X, Y)
satisfeito quando
elementos de
esto em
Y.
um subconjunto de
lista
Y,
isto , todos os
54
7.6
Outros
X =.. L
satisfeito se
e os argumentos de
N-1.
findall(X, M, L)
Exemplo:
aleatrio no
instancia
um operador binrio que signica ou. satisfeito quando uma das duas
metas satisfeita. Em geral, pode ser substitudo por duas clusulas.
Por exemplo,
atomic(X) :- atom(X).
atomic(X) :- number(X).
55
Captulo 8
Estilo e depurao
Se uma clusula cabe toda dentro de uma linha (at cerca de 70 caracteres), deixe-a em uma linha. Caso contrrio, coloque apenas a cabea
e o :- na primeira linha, e, nas linhas subseqentes, coloque as submetas do corpo, indentadas com TAB e terminadas por vrgula, exceto
a ltima, que terminada com ponto nal.
Use variveis annimas para variveis que ocorrem apenas uma vez
numa clusula.
56
Ao lado destas recomendaes gerais, bom estar atento aos seguintes cuidados ao denir um predicado:
Verique se seu nome est digitado corretamente em todas as ocorrncias. Erros de digitao so comuns.
Observe o escopo de cada varivel. Observe quais variveis vo compartilhar o mesmo valor quando uma delas car instanciada. Observe
se todas as variveis da cabea de uma regra aparecem no corpo da
regra.
Tente determinar quais argumentos devem vir instanciados ou no instanciados em cada clusula.
Fique atento tambm para certos erros comuns que costumam assolar os
programas feitos s pressas:
newline
No nal do
nal.
57
8.1
Depurao
Programas feitos com cuidado tendem a apresentar menos erros, mas difcil
garantir que no haver erros. Caso seu programa no esteja funcionando,
ou seja, provocando erros de execuo, dando a resposta errada ou simplesmente respondendo no, voc pode usar os potentes recursos de depurao
de Prolog para localizar e corrigir os erros. H predicados pr-denidos para
ajud-lo nesta tarefa. Nesta seo descreveremos os predicados de depurao
existentes na implementao SWI Prolog. Outras implementaes podem ter
predicados ligeiramente diferentes para depurao.
O predicado
trace,
espia
58
Opo
Verbo
Descrio
write
imprime a meta
creep
skip
leap
retry
fail
break
abort
interrompe a depurao
59
Captulo 9
Gramticas
mecanismos.
9.1
Para enteder uma frase numa lngua qualquer, o primeiro passo geralmente
consiste em vericar se a frase segue as regras gramaticais da lngua. Computacionalmente, uma das maneiras mais simples de fazer esta vericao
usando gramticas livres de contexto, como a que especicamos abaixo:
sentenca
sujeito
homem
predicado
verbo
objeto
come
pera
61
log fornecem mecanismos para lidar com estas gramticas e executar anlise
lxica, complementada por vrias funcionalidades extras, como veremos no
restante deste captulo.
9.2
sentenca(X)
X for uma lista de palavras que formam uma sentena
62
est agora sendo umada em dois sentidos diferentes. Um deles so os predicados em Prolog. O outro o predicado que um item, ou seja, uma parte,
de uma frase vlida. Cuidado para no confundir estes dois usos!
Continuando, seria interessante ter predicados (de Prolog) para validar os
sujeito(X) que satisfeito quando X representa um sujeito vlido, e predicado(X) que satisfeito
quando X representa um predicado vlido. Com isto, poderamos escrever o
predicado sentenca em funo de outros, como segue:
outros itens da frase, por exemplo, um predicado
e testa, para cama uma delas, se os pedaos resultantes podem ser vistos
como sujeitos e predicados. Para que o predicado
preciso denir todos os outros dos quais depende. A denio nal caria
algo como:
append
em geral apenas uma ou duas delas sero corretas. O mesmo acontece nos
pedaos de frases passados aos predicados de todos os intens tornando a
busca ineciente.
Mas, como melhorar a performance?
que estudamos na Seo 4.5. Comeamos por fazer com que o predicado de
cada item tenha no um mas
sujeito(X, Y)
sujeito:
satisfeito quando
X
Y.
64
????-
sujeito([o,
sujeito([a,
sujeito([o,
sujeito([a,
append.
sujeito, camos
com:
homem
come
pera
Y
Z
X
Figura 9.2: Valor dos parmetros
append.
65
9.3
66
9.4
Argumentos adicionais
Alm dos dois argumentos que a notao para regras gramaticais automaticamente cria, possvel acrescentar argumentos adicionais para propsitos
especcos. Vamos trabalhar um exemplo onde esta funcionalidade pode ser
til. Trata-se da concordncia em nmero entre sujeito e verbo. Sentenas
como os homens come a pera ou ento o homem comem a pera no so
corretas, mas seriam aceitas pela extenso natural de nossa gramtica inicial
ao incluir o artigo os, o substantivo homens e o verbo comem, ou seja,
as formas plurais de itens terminais j presentes na gramtica.
Para conseguir a concordncia em nmero entre o sujeito e o predicado,
criaremos um argumento adicional para indicar se a frase est no singular
ou no plural. Este argumento ser passado a todos os itens, e servir para
garantir que sujeitos no singular combinem-se apenas com predicados no
plural para constituir frases corretas. A gramtica modicada car assim:
68
Bibliograa
Programming in Prolog:
00678-8.
69