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