Você está na página 1de 15

Programação em Lógica

Aula 07 –Base de dados dedutivos Entrada e Saída em Prolog


Sumário

•Base de Dados Dedutivas;


•Entrada e saída de dados padrão;
•Estrutura de repetição;

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).

O Programa representa uma tabela que relaciona a cada país sua


área em Km2 e sua população em milhões de habitantes.

"Qual a diferença entre a população da China e da Índia?".

?- país(china,_,X), país(índia,_,Y), Z is X-Y.


X = 1800
Y = 450
Z = 1350
Base de Dados Dedutivas

• Relação dos funcionários da empresa seu código, salário e dependentes/filhos.

Como representar esse modelo relacional em Prolog


% func(Código, Nome, Salário) Query: Quem são os dependentes de ivo?
func(1, ana, 1000.90).
func(2, bia, 1200.00).
?- func(C,ivo,_), dep(C,N).
func(3, ivo, 903.50).
C = 3
N = raí ;
% dep(Código, Nome)
C = 3
dep(1, ary).
N = eva
dep(3, raí).
dep(3, eva).
Base de Dados Dinâmicas

• Em Prolog, uma base de dados é a especificação de


um conjunto de fatos e regras.
• Um programa em Prolog é uma base de dados em
que a especificação das relações é parcialmente
explícita (fatos) e parcialmente implícita (regras).

• Exemplos:

joga(pelé,futebol).
joga(guga,tênis).
desporto(X) :- joga(_,X).
Base de Dados Dinâmicas

• Para listar as cláusulas da base de dados, utilizamos o


predicado LISTING.
• Exemplos:

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.

• asserta – adiciona no inicio.


• assertz – adiciona no fim.
• Considere a base de dados inicial:
joga(pelé,futebol).
joga(guga,tênis).
?- listing(joga).
• Ao fazer: joga(hortência,basquete).
• ?- assertz(joga(oscar,basquete)). joga(pelé,futebol).
• Yes joga(guga,tênis).
• ?- asserta(joga(hortência,basquete)). joga(oscar,basquete).
• Yes Yes
Base de Dados Dinâmicas

Remover Fatos Dinamicamente


• Para remover uma cláusula da base de dados,
utilizamos o predicado retract.
• Remove também as cláusulas (por retrocesso) que
unificam com essa estrutura.

%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

• O Prolog tem diversos predicados pré-definidos


para input/output de termos.
• read(?Term) - lê o próximo termo de entrada.
• write(?Term) - escreve o termo Term na saída.
• writeq(?Term) - escreve o termo Term na de
saída, e coloca pelicas sempre que necessário
• Um termo escrito com writeq depois pode ser
lido com read

É expressamente proibida a utilização, alteração ou


reprodução deste documento sem o consentimento do 12
seu autor (Porf. Juvenal Pereira).
Leitura e Escrita de Termo

•Exemplo:

É expressamente proibida a utilização, alteração ou


reprodução deste documento sem o consentimento do 13
seu autor (Porf. Juvenal Pereira).
Estruturas com repetição
• repeat - provoca a repetição da execução da próxima
cláusula até que a condição seja verificada.
• Exemplo:

leia :-
repeat,
read(N),
N=5.

% neste caso a condição é N=5.

Isto implica que leia vai ser repetida até que o


utilizador entrar o valor 5. 14
Bibliografia Complementar
• Bratko, I., “Prolog Programming for
Artificial Intelligence” (3rd edition),
Addison Wesley, 2000.

• Clocksin, W.F., Mellish, C.S.,


“Programming in Prolog” (5th
edition), Springer, 2003.

• Sterling, L., Shapiro, E., “The Art of


Prolog” (2th edition), MIT Press, 1994.

Fonte: http://edirlei.3dgb.com.br/aulas/ia_2012_2/IA_Aula_09_Prolog_2012.pdf

Você também pode gostar