Programação em Lógica
2001/2002
Licenciatura em Ciências Informáticas
Aula prática 8
Manipulação da base de dados (cont.)
Para além dos predicados para manipulação da base de dados, existem em Prolog mais dois
predicados úteis:
• setof(Termo,Objectivo,Instancias): Instancias é o conjunto de todas as instâncias
de Termo para as quais Objectivo é verdadeiro.
• bagof(Termo,Objectivo,Instancias): Instancias é o saco de todas as instâncias de
Termo paras as quais Objectivo é verdadeiro.
Exemplos
?- assert(pai(joao,jose)).
Yes
?- assert(pai(joao,maria)).
Yes
?- assert(pai(jose,ana)).
Yes
?- setof(X,pai(Y,X),L).
X = _G528
Y = joao
L = [jose, maria];
X = _G528
Y = jose
L = [ana];
No
?- setof(X,Y^pai(Y,X),L).
X = _G270
Y = _G269
L = [ana, jose, maria];
No
?- setof(filho(X,Y),pai(Y,X),L).
X = _G270
Y = _G269
L = [filho(ana,jose), filho(jose,joao), filho(maria,joao)];
No
Em relação às duas últimas queries, a primeira consiste em fazer uma quatificação existencial, ou seja, existe algum Y que seja pai X? Em relação à segunda, há apenas a salientar
o facto de o termo de pesquisa não ser uma variável e de a estrutura desse termo se reflectir
na lista de instâncias.
Suponha-se que se define o seguinte predicado:
escreve([]).
escreve([X|L]):-assert(X),escreve(L).
Então, após o objectivo:
?- setof(filho(X,Y),pai(Y,X),L),escreve(L).
X = _G327
Y = _G328
L = [filho(ana,jose), filho(jose,joao), filho(maria,joao)]
Yes
?- filho(X,Y).
X = ana
Y = jose;
X = jose
Y = joao;
X = maria
Y = joao;
No
Um outro tipo de utilização:
?- setof(X,A^B^(X=pai(A,B)),L).
X = _G327
A = _G328
Y = _G329
L = [pai(_G328,_G329)]
Yes
?- ?- setof(X,A^B^(X=pai(A,B),clause(X,true)),L).
X = _G327
A = _G328
Y = _G329
L = [pai(joao,jose), pai(joao,maria), pai(jose,ana)]
2
Suponha-se que se pretende gravar toda a informação sobre o predicado pai num ficheiro
bd.
gravar:-tell(bd),
procura_factos(L),
escreve_factos(L),
told.
procura_factos(L):-setof(X,A^B^(X=pai(A,B),clause(X,true)),L).
escreve_factos([]).
escreve_factos([X|L]):-write(X),
write(’.’),
nl,
escreve_factos(L).
Exemplo: gestão da base de dados de alunos de Programação
em Lógica
Pretende-se definir em Prolog uma aplicação para gerir a base de dados de alunos da cadeira
de Programação em Lógica da Licenciatura em Ciências Informáticas.
3
Download

Programaç˜ao em Lógica Manipulaç˜ao da base de dados (cont.)