2
Base de Dados Dedutivas
• Um conjunto de fatos e regras definem uma Base de Dados Dedutivo,
com a mesma funcionalidade de uma Base de Dados Relacional.
• Exemplo:
% país(Nome, Área, População)
país(brasil, 9, 130).
país(china, 12, 1800).
país(eua, 9, 230).
país(índia, 3, 450).
• Exemplos:
joga(pelé,futebol).
joga(guga,tênis).
desporto(X) :- joga(_,X).
Base de Dados Dinâmicas
joga(pelé,futebol).
joga(guga,tênis).
esporte(X) :- joga(_,X).
• ?- listing(joga).
joga(pelé,futebol).
joga(guga,tênis).
Base de Dados Dinâmicas:
Inserir Fatos Dinamicamente
• Para adicionar uma nova cláusula à base de dados podemos utilizar o
predicado ASSERTA ou ASSERTZ.
%Ao remover:
?- retract(joga(X,basquete)).
%Base de dados inicial:
X = hortência ;
joga(hortência,basquete).
X = oscar ;
joga(pelé,futebol).
No
joga(guga,tênis).
%base de dados final
joga(oscar,basquete).
?- listing(joga).
Yes
joga(pelé, futebol).
joga(guga, tênis).
Yes
Base de Dados Dinâmicas: Aprendizagem
• Com a possibilidade de adicionar ou remover fatos da base
de conhecimento, os programas em Prolog pode adoptar um
principio fundamental da inteligência que é a aprendizagem
e adaptação ao contexto.
• Contudo, o SWI-Prolog compila o código de forma que não é
possível modificar fatos durante a execução do programa.
• Para indicar ao Prolog que determinada sentença pode
ser modificado durante a execução do programa temos de
utilizar o predicado dynamic.
• Exemplo:
:- dynamic homem/1.
Base de Dados Dinâmicas:
Aprendizagem por memorização
Considere o seguinte programa:
:- dynamic estou/1. % declara modificação dinâmica
estou(paulista).
ando(Destino) :-
retract(estou(Origem)),
asserta(estou(Destino)),
format('Ando da ~w até a ~w',[Origem,Destino]).
Query’s:
?- estou(Onde). OBS: Para satisfazer o objetivo
Onde = paulista ando(augusta), o sistema
Yes precisa remover o fato
?- ando(augusta). estou(paulista) e adicionar o
Ando da paulista até a augusta fato estou(augusta).
Yes Assim, quando a primeira consulta
?- estou(Onde). é feita novamente, o sistema
Onde = augusta encontra uma nova resposta.
Yes
Base de Dados Dinâmicas : Aprendizagem por
memorização
• As alterações feitas pela execução dos predicados asserta e
retract são efetuadas apenas na memória.
• Próxima vez que o programa for carregado, a base de dados
estará inalterada e o programa terá "esquecido" que
aprendeu.
• Para guardar em disco as alterações realizadas numa base
de dados, podemos utilizar os predicados tell e told.
salva(Predicado,Ficheiro) :-
tell(Ficheiro),
listing(Predicado),
told.
OBS: Para recuperar uma base guardada em disco, utilizados o predicado consult.
Leitura e Escrita de Termo
•Exemplo:
leia :-
repeat,
read(N),
N=5.
Fonte: http://edirlei.3dgb.com.br/aulas/ia_2012_2/IA_Aula_09_Prolog_2012.pdf