Академический Документы
Профессиональный Документы
Культура Документы
Prolog
Aula #7
Estruturas de Dados
Estruturas de Dados
manel
pessoa
silva
01
data
01
1970
emprego
ulp
2000
pessoa
familia
silva
01
data
12
luis
1972
emprego
03
cmp
silva
03
1500
data
2000
pessoa
.
pessoa
desempr
egado
marta
05
silva
05
data
desempr
egado
2003
maria
Estruturas de Dados
Em prolog pode ser representado por
me
filhos
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) ]
).
pai
familia(
pessoa(manel,silva,data(01,01,1970),emprego(ulp,2000) ),
Estruturas de Dados
Estruturas de Dados
Exemplo:
Estruturas de Dados
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).
Estruturas de Dados
E a partir deles colocar questes mais complexas
Estruturas de Dados
Exerccio
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
11
Estruturas de Dados
marido( familia( Marido, _, _), Marido).
mulher( familia( _ , Mulher, _), Mulher).
filhos( familia( _, _, ListaFilhos), ListaFilhos).
primFilho( Familia, Prim) :- filhos( Familia, [ Prim | _ ] ).
segFilho(Familia, Segundo) :- filhos( Familia, [ _, Segundo| _ ] ).
Exemplo
12
Estruturas de Dados
13
Estruturas de Dados
nodo(a,
nodo(b,vazio,vazio),
nodo(c,
nodo(d,vazio,vazio),
nodo(e,vazio,vazio)
)
).
a
b
c
d
14
Estruturas de Dados
15
Estruturas de Dados
Pr-Ordem
write(N), escreveArv( E ), escreveArv( D ).
escreveArv( vazio ).
escreveArv( nodo( N, E, D ) ):-
16
Estruturas de Dados
guardaArv( vazio, [ ] ).
guardaArv( nodo( N, E, D), [ N | EDs ] ) :guardaArv( E, Es ), guardaArv( D, Ds ),
append( Es, Ds, EDs ).
17
Estruturas de Dados
Grafos
18
Estruturas de Dados
19
Estruturas de Dados
Exemplo
Viana
Braga
Porto
estrada(viana,porto).
estrada(viana,braga).
estrada(porto,braga).
estrada(porto,aveiro).
Aveiro
20
Estruturas de Dados
Exemplo
Viana
Braga
Porto
estrada(viana,porto).
estrada(viana,braga).
estrada(porto,braga).
estrada(porto,aveiro).
ligacao(A,B) :- estrada(A,B).
ligacao(A,B) :- estrada(B,A).
Aveiro
21
Estruturas de Dados
22
Estruturas de Dados
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
Viana
Braga
Porto
Aveiro
23
Estruturas de Dados
Como evitar ciclos?
Temos que registar os nodos visitados
Viana
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 ] ).
Porto
Aveiro
Braga
24
Estruturas de Dados
Viana
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 ] ).
Braga
Porto
Aveiro
25
Estruturas de Dados
Exerccio
Braga
Porto
Aveiro
Viana
26
Estruturas de Dados
Exerccio
Viana
Braga
Porto
Aveiro
27
Estruturas de Dados
Exerccio
Viana
Braga
Porto
Aveiro
28
Estruturas de Dados
findall
bagof
setof
Viana
Braga
Porto
Aveiro
29
Estruturas de Dados
?- 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]].
Viana
Braga
Porto
Aveiro
Exemplo
30
Estruturas de Dados
30
Viana
Braga
70
50
Porto
50
Aveiro
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
31
Estruturas de Dados
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).
30
Viana
Braga
70
50
Porto
50
Aveiro
32
Estruturas de Dados
30
Viana
Braga
70
50
Porto
50
Aveiro
33
Estruturas de Dados
30
Viana
Braga
70
50
Porto
50
Aveiro
34