Upload
martin-spyyd-pridal
View
218
Download
0
Tags:
Embed Size (px)
DESCRIPTION
sggn
Citation preview
Prolog Aula #7
Hu
go P
ire
s @
Un
ive
rsid
ade
Lu
sfo
na
do
Po
rto
1
Estruturas de Dados
J vimos que os termos compostos em prolog podem servir para representarem estruturas de dados
Aliado s noes de unificao (matching), retrocesso (backtracking) e s operaes aritmticas temos uma ferramenta de programao poderosa
Hu
go P
ire
s @
Un
ive
rsid
ade
Lu
sfo
na
do
Po
rto
2
Estruturas de Dados
Consideremos a seguinte estrutura para representar uma famlia (Bratko, 1986)
Cada famlia tem um pai, uma me, e um conjunto de filhos (representado por uma lista)
Cada pessoa pode ser visto como tendo: nome prprio, apelido, data de nascimento e situao profissional
A situao profissional indica o empregador e o salrio ou se a pessoa est desempregada
Hu
go P
ire
s @
Un
ive
rsid
ade
Lu
sfo
na
do
Po
rto
3
Hu
go P
ire
s @
Un
ive
rsid
ade
Lu
sfo
na
do
Po
rto
4
familia
pessoa
manel
silva
data
01
01
1970
emprego ulp
2000
pessoa
maria
silva
data
01
12
1972
emprego cmp
1500
.
pessoa
luis
silva
data
03
03
2000
desempregado
pessoa
marta
silva
data
05
05
2003 desempr
egado
Estruturas de Dados
Em prolog pode ser representado por
familia(
pessoa(manel,silva,data(01,01,1970),emprego(ulp,2000) ),
pessoa(maria,silva,data(01,12,1972),emprego(cmp,1500) ),
[ pessoa(luis,silva,data(03,03,2000),desempregado),
pessoa(marta,silva,data(05,05,2003),desempregado) ]
).
Hu
go P
ire
s @
Un
ive
rsid
ade
Lu
sfo
na
do
Po
rto
5
pai
me
filhos
Estruturas de Dados
Desta forma podemos representar todas as famlias
E como obter a informao desta BC?
Muito simples!...
Em prolog podemos referir facilmente um objecto sem termos de especificar particularmente todos os outros
Basta descrever a estrutura!
Hu
go P
ire
s @
Un
ive
rsid
ade
Lu
sfo
na
do
Po
rto
6
Estruturas de Dados
Exemplo:
Como que nos podemos referir as famlias Silva?
familia( pessoa( _ , silva, _ , _ ), _ , _ ).
E famlias com 3 filhos?
familia( _ , _ , [ _ , _ , _ ] ).
E o nome de todas as mulheres com 2 filhos?
familia( _ , pessoa( Nome, Apelido, _ , _ ) , [ _ , _ ]).
Hu
go P
ire
s @
Un
ive
rsid
ade
Lu
sfo
na
do
Po
rto
7
Estruturas de Dados
Assim podemos facilmente definir predicados para obter informao:
marido(X) :- familia( X, _ , _ ).
mulher(X) :- familia( _ , X, _ ).
filho(X) :- familia( _ , _ , Filhos), membro(X, Filhos).
existe(Pessoa) :- marido(Pessoa); mulher(Pessoa); filho(Pessoa).
dataNascimento( pessoa( _ , _ , Data, _ ), Data).
salario( pessoa( _ , _ , _ , emprego( _, S) ), S).
salario( pessoa( _ , _ , _ , desempregado ), 0).
Hu
go P
ire
s @
Un
ive
rsid
ade
Lu
sfo
na
do
Po
rto
8
Estruturas de Dados
E a partir deles colocar questes mais complexas
O nome de todas as pessoas
?- existe( pessoa( Nome, Apelido, _ , _ ) ).
Todos os desempregados que nasceram antes de 1970
?- existe( pessoa( Nome, Apelido, data( _ , _ , Ano), desempregado), Ano < 1970.
Pessoas nascidas antes de 1950 com salario superior a 5000
?- existe(Pessoa), dataNascimento(Pessoa, data( _ , _ , Ano) ),
Ano < 1950, salario( Pessoa, Salario), Salario > 5000.
Hu
go P
ire
s @
Un
ive
rsid
ade
Lu
sfo
na
do
Po
rto
9
Estruturas de Dados
Exerccio
Definir o predicado que calcula o total dos rendimentos de uma lista de pessoas
total( Lista_Pessoas, Total_Rendimentos).
Hu
go P
ire
s @
Un
ive
rsid
ade
Lu
sfo
na
do
Po
rto
10
Estruturas de Dados
Podemos criar um nvel superior de abstraco que torne transparente a forma como a informao est representada
Para tal podemos definir selectores da forma selectorRelacao( Objecto, ComponenteSeleccionado)
A utilizao de selectores facilita a alterao da estrutura que representa a informao
Hu
go P
ire
s @
Un
ive
rsid
ade
Lu
sfo
na
do
Po
rto
11
Estruturas de Dados
Exemplo
marido( familia( Marido, _, _), Marido).
mulher( familia( _ , Mulher, _), Mulher).
filhos( familia( _, _, ListaFilhos), ListaFilhos).
primFilho( Familia, Prim) :- filhos( Familia, [ Prim | _ ] ).
segFilho(Familia, Segundo) :- filhos( Familia, [ _, Segundo| _ ] ).
Hu
go P
ire
s @
Un
ive
rsid
ade
Lu
sfo
na
do
Po
rto
12
Estruturas de Dados
Suponhamos que cada casal poderia ter inmeros filhos
A representao dos filhos (conjuntos) ineficiente em termos de procura quando temos um elevado nmero de elementos
Nestes casos podemos optar pela representao dos dados numa rvore
As estruturas em rvore so frequentes para armazenar informao e representar problemas
Vamos generalizar a sua representao e definir alguns predicados
Hu
go P
ire
s @
Un
ive
rsid
ade
Lu
sfo
na
do
Po
rto
13
Estruturas de Dados
Podemos representar a rvore como
nodo(a,
nodo(b,vazio,vazio),
nodo(c,
nodo(d,vazio,vazio),
nodo(e,vazio,vazio)
)
).
Hu
go P
ire
s @
Un
ive
rsid
ade
Lu
sfo
na
do
Po
rto
14
a
b c
d e
Estruturas de Dados
Vamos ento definir um predicado que percorre a rvore a imprime o seu contedo
Qual a ordem:
Pr-ordem: escreve o nodo, e depois visita a rvore esquerda e depois a direita.
In-ordem: visita a rvore esquerda, escreve o nodo e depois visita a rvore direita.
Ps-ordem: visita a rvore esquerda, depois a direita e depois escreve o nodo.
Hu
go P
ire
s @
Un
ive
rsid
ade
Lu
sfo
na
do
Po
rto
15
Estruturas de Dados
Pr-Ordem escreveArv( vazio ).
escreveArv( nodo( N, E, D ) ):- write(N), escreveArv( E ), escreveArv( D ).
Podemos tornar a impresso mais legvel escreveArv( A ) :- escreveArv1( 0 , A ).
escreveArv1( _ , vazio ).
escreveArv1( NEsp , nodo( N, E, D ) ) :- tab( NEsp ), write(N), nl, N1 is NEsp+1,
escreveArv1( N1, E ), escreveArv1( N1, D ).
Hu
go P
ire
s @
Un
ive
rsid
ade
Lu
sfo
na
do
Po
rto
16
Estruturas de Dados
Vamos agora guardar numa lista os nodos da rvore guardaArv( vazio, [ ] ).
guardaArv( nodo( N, E, D), [ N | EDs ] ) :-
guardaArv( E, Es ), guardaArv( D, Ds ), append( Es, Ds, EDs ).
E se fossem s os nodos folhas guardaArv( vazio, [ ] ) :- !.
guardaArv( nodo( N, vazio, vazio), [ N ] ) :- !.
guardaArv( nodo( _, E, D), EDs ) :-
guardaArv( E, Es ), guardaArv( D, Ds ), append( Es, Ds, EDs ).
Hu
go P
ire
s @
Un
ive
rsid
ade
Lu
sfo
na
do
Po
rto
17
Estruturas de Dados
Grafos
Os grafos so generalizaes de rvores
Um grafo definido por um conjunto de nodos e um conjunto de ligaes entre nodos.
Os grafos so estruturas de dados tpicas para a representao de mltiplos problemas
Hu
go P
ire
s @
Un
ive
rsid
ade
Lu
sfo
na
do
Po
rto
18
Estruturas de Dados
Consideremos o problema de procurar um caminho entre duas cidades
A informao relativa ligao entre as cidades pode ser vista como um grafo em que cada nodo uma cidade e a existncia de uma estrada entre elas define uma ligao
Hu
go P
ire
s @
Un
ive
rsid
ade
Lu
sfo
na
do
Po
rto
19
Estruturas de Dados
Exemplo
estrada(viana,porto).
estrada(viana,braga).
estrada(porto,braga).
estrada(porto,aveiro).
Hu
go P
ire
s @
Un
ive
rsid
ade
Lu
sfo
na
do
Po
rto
20
Viana
Porto
Aveiro
Braga
Estruturas de Dados
Exemplo
estrada(viana,porto).
estrada(viana,braga).
estrada(porto,braga).
estrada(porto,aveiro).
ligacao(A,B) :- estrada(A,B).
ligacao(A,B) :- estrada(B,A).
Hu
go P
ire
s @
Un
ive
rsid
ade
Lu
sfo
na
do
Po
rto
21
Viana
Porto
Aveiro
Braga
Estruturas de Dados
H caminho entre a cidade A e a cidade B?
A cidade inicial pode ser vista como o estado inicial dum problema e a cidade destino como o estado final
Existe a possibilidade de transitarmos de um estado para o seguinte at atingirmos o estado final?
A soluo obtida atravs da pesquisa nos possveis estados do sistema
Hu
go P
ire
s @
Un
ive
rsid
ade
Lu
sfo
na
do
Po
rto
22
Estruturas de Dados
H caminho entre viana e aveiro?
caminho(A,B) :- ligacao(A,B),!. caminho(A,B) :- ligacao(A,X), caminho(X,B). PROBLEMAS: 1. No verifica se temos ciclos! 2. Quanto existe ligao direta ignora
restantes ligaes
Hu
go P
ire
s @
Un
ive
rsid
ade
Lu
sfo
na
do
Po
rto
23
Viana
Porto
Aveiro
Braga
Estruturas de Dados
Como evitar ciclos? Temos que registar os nodos visitados
caminho( A, B ) :- caminho( A, B, [ A ] ).
caminho( A, B, _ ) :- ligacao( A, B ),!.
caminho( A, B, C ) :-
ligacao( A, X ),
\+ member( X, C ),
caminho( X, B, [ X | C ] ).
Hu
go P
ire
s @
Un
ive
rsid
ade
Lu
sfo
na
do
Po
rto
24
Viana
Porto
Aveiro
Braga
Estruturas de Dados
Como considerar todas as solues? Reformular a procura
caminho( A, B ) :- caminho( A, B, [ A ] ).
caminho( B, B, _ ) :- !.
caminho( A, B, C ) :-
ligacao( A, X ),
\+ member( X, C ),
caminho( X, B, [ X | C ] ).
Hu
go P
ire
s @
Un
ive
rsid
ade
Lu
sfo
na
do
Po
rto
25
Viana
Porto
Aveiro
Braga
Estruturas de Dados
Exerccio
Alterar o predicado para retornar o caminho percorrido
Hu
go P
ire
s @
Un
ive
rsid
ade
Lu
sfo
na
do
Po
rto
26
Viana
Porto
Aveiro
Braga
Estruturas de Dados
Exerccio Alterar o predicado para retornar
o caminho percorrido (aproveitamos a lista j utilizada)
caminho( A, B, R ) :- caminho( A, B, [A], R ).
caminho( B, B, CPerc, CPerc ) :- !.
caminho( A, B, CPerc, R ) :-
ligacao( A, X ),
\+ member( X, CPerc ),
cam( X, B, [ X | CPerc ], R ).
Hu
go P
ire
s @
Un
ive
rsid
ade
Lu
sfo
na
do
Po
rto
27
Viana
Porto
Aveiro
Braga
Estruturas de Dados
Exerccio Alterar o predicado para retornar
o caminho percorrido (construindo o percurso de novo)
caminho( A, B, R ) :- caminho( A, B, [A], R ).
caminho( B, B, _, [B] ) :- !.
caminho( A, B, CPerc, [A|R] ) :-
ligacao( A, X ),
\+ member( X, CPerc ),
caminho( X, B, [ X | CPerc ], R ).
Hu
go P
ire
s @
Un
ive
rsid
ade
Lu
sfo
na
do
Po
rto
28
Viana
Porto
Aveiro
Braga
Estruturas de Dados
Podemos obter todos os percursos numa s lista utilizando os seguintes predicados pr-definidos do prolog:
findall
bagof
setof
Hu
go P
ire
s @
Un
ive
rsid
ade
Lu
sfo
na
do
Po
rto
29
Viana
Porto
Aveiro
Braga
Estruturas de Dados
Exemplo ?- caminho(aveiro,braga,C).
C = [aveiro, porto, viana, braga] ;
C = [aveiro, porto, braga] ;
false.
?-findall(C,caminho(aveiro,braga,C),R).
R = [[aveiro, porto, viana, braga], [aveiro, porto, braga]].
Hu
go P
ire
s @
Un
ive
rsid
ade
Lu
sfo
na
do
Po
rto
30
Viana
Porto
Aveiro
Braga
Estruturas de Dados
Em aplicaes com grafos comum associamos a cada ligao um determinado custo que, no nosso caso, poder ser visto como a distncia ou o custo da viagem
Hu
go P
ire
s @
Un
ive
rsid
ade
Lu
sfo
na
do
Po
rto
31
Viana
Porto
Aveiro
Braga 70
50
30
50
Estruturas de Dados
Essa informao teria de ser parte integrante da BC
custo(viana,porto,70). custo(viana,braga,30). custo(porto,braga,50). custo(porto,aveiro,50). ligacao(A,B,Custo) :- custo(A,B,Custo). ligacao(A,B,Custo) :- custo(B,A,Custo).
Hu
go P
ire
s @
Un
ive
rsid
ade
Lu
sfo
na
do
Po
rto
32
Viana
Porto
Aveiro
Braga 70
50
30
50
Estruturas de Dados
Vamos agora reescrever o predicado caminho com vista a calcularmos o custo de cada viagem
caminho( A, B, R, V ) :- caminho( A, B, [A], R, V ). caminho( B, B, _, [B], 0 ) :- !. caminho( A, B, CPerc, [A|R], V ) :- ligacao( A, X, Vd ), \+ member( X, CPerc ), caminho( X, B, [ X | CPerc ], R, Vc ), V is Vc + Vd.
Hu
go P
ire
s @
Un
ive
rsid
ade
Lu
sfo
na
do
Po
rto
33
Viana
Porto
Aveiro
Braga 70
50
30
50
Estruturas de Dados
Escreva agora o predicado que limita as solues a custos inferiores a um determinado valor
caminho( A, B, R, V, Max ) :- caminho( A, B, [A], R, V, Max ). caminho( B, B, _, [B], V , _ ) :- !. caminho( A, B, CPerc, [A|R], V , NMax ) :- ligacao( A, X, Vd ), NMax is Max Vd, Max >= 0, \+ member( X, CPerc ), caminho( X, B, [ X | CPerc ], R, V , NMax ).
Hu
go P
ire
s @
Un
ive
rsid
ade
Lu
sfo
na
do
Po
rto
34
Viana
Porto
Aveiro
Braga 70
50
30
50