Você está na página 1de 17

Hugo Pires @ Universidade Lusfona do Porto

Prolog

Aula #4

uma estrutura de dados simples que representa uma


sequncia ordenada de elementos
Em Prolog escrita como
[E1,E2,,En]
Esta , no entanto, uma representao externa
Temos 2 casos
Lista vazia
Lista no vazia

Hugo Pires @ Universidade


Lusfona do Porto

Listas

Listas
Lista vazia representada pelo tomo []
Lista no vazia pode ser vista como tendo:

Exemplo
[maria,jose,manuel,filipe]

Cabea: maria
Cauda: [jose,manuel,filipe]

Hugo Pires @ Universidade


Lusfona do Porto

Cabea (o primeiro elemento)


Cauda (os restantes elementos)

Listas

.(Cabeca,Cauda)

Como a cauda tambm ela uma lista pode ser representada


da mesma forma
No exemplo
.(maria,.(jose,.(manuel,.(filipe,[]))))

Hugo Pires @ Universidade


Lusfona do Porto

A cabea pode ser qualquer termo


A cauda tem de ser uma lista
A cabea e a cauda so compostas pelo functor . da seguinte
forma

Listas
.

maria

jose

Hugo Pires @ Universidade


Lusfona do Porto

A representao
grfica deste
exemplo seria dada
pelo esquema
direita
As listas so, de
facto, representadas
internamente como
uma rvore binria

manuel

filipe

Listas
Cada elemento de uma lista pode, por sua vez, ser um termo
composto, incluindo uma outra lista
ainda possvel representar uma lista separando
explicitamente a cabea da cauda
[Cabea | Cauda ]

Exemplo
[a,b,c] = [a | [b,c] ] = [a,b | [c] ] = [a,b,c | [] ]

Hugo Pires @ Universidade


Lusfona do Porto

[maria, jose, [joao, filipe], pedro]

Operaes sobre Listas


Declarar a operao pertence na forma do predicado
Sendo X um termo e L uma lista.
O predicado verdadeiro se X pertence lista L
Exemplos verdadeiros
pertence(a,[b,a,c]).
pertence([a,b],[f,r,[a,b]]).

Hugo Pires @ Universidade


Lusfona do Porto

pertence(X,L)

Operaes sobre Listas


Podemos descrever o predicado com base nas seguintes
observaes
X igual cabea da lista L ou
X pertence cauda da lista L

Em prolog
pertence(X,[X|_]).
pertence(X,[H|T]):-pertence(X,T).

Hugo Pires @ Universidade


Lusfona do Porto

X pertence lista L se

Operaes sobre Listas


Definir a operao prefixo que verifica se uma dada lista prefixo
de outra lista
prefixo([],_).
prefixo([X|T1],[X|T2]) :- prefixo(T1,T2).
Esta soluo pode ser lida como
A lista vazia um prefixo de qualquer lista
Uma lista A com a mesma cabea de outra B s prefixo se a cauda
de A for prefixo da cauda de B

Hugo Pires @ Universidade


Lusfona do Porto

Exerccio

Operaes sobre Listas


Definir a operao sufixo que verifica se uma dada lista sufixo
de outra lista
sufixo(L,L).
sufixo(X,[H|T]) :- sufixo(X,T).
Esta soluo pode ser lida como
Qualquer lista sufixo dela prpria
Uma lista A sufixo de outra B se, tendo cabeas diferentes, A
sufixo da cauda de B

Hugo Pires @ Universidade


Lusfona do Porto

Exerccio

10

Operaes sobre Listas


Declarar a operao concatena na forma do predicado
Sendo L3 o resultado da concatenao das listas L1 e L2
Exemplos
concatena( [a,b], [c,d], [a,b,c,d] ) true
concatena( [a,b], [c,d], [a,b,a,c,d] ) false

Hugo Pires @ Universidade


Lusfona do Porto

concatena(L1,L2,L3)

11

Operaes sobre Listas


Se o primeiro elemento vazio o segundo e terceiros so iguais
concatena([],L,L).
Se o primeiro elemento no vazio ele composto por uma
cabea e uma cauda
[X|L1]

Hugo Pires @ Universidade


Lusfona do Porto

Da definio da operao podemos observar duas situaes

12

Como podemos observar o resultado da concatenao seria


[X|L3]

se concatenar L1 com L2 resulta em L3

Hugo Pires @ Universidade


Lusfona do Porto

Operaes sobre Listas

13

Operaes sobre Listas


O predicado seria definido por

Este predicado pode ainda ser utilizado com outras


finalidades...

Hugo Pires @ Universidade


Lusfona do Porto

concatena([],L,L).
concatena([X|L1],L2,[X|L3]) :- concatena(L1,L2,L3).

14

Operaes sobre Listas


Decomposio de uma lista em duas:

Procura de um padro numa lista:


?- concatena( Antes,
[mai I Depois],
[jan,fev,mar,abr,mai,jun,jul,ago,set,out,nov,dez]).
Antes = [jan,fev,mar,abr]
Depois = [jun jul,ago,set,out,nov,dez]

Hugo Pires @ Universidade


Lusfona do Porto

?-concatena(L1,L2,[a,b,c]).

15

Operaes sobre Listas


?- concatena( _, [Antes,mai,Depois I _],
[jan,fev,mar,abr,mai,jun,jul,ago,set,out,nov,dez]).
Antes = abr
Depois = jun

Hugo Pires @ Universidade


Lusfona do Porto

Encontrar o antecessor e predecessor imediato de um


elemento

16

Operaes sobre Listas


Exerccio

Pode ser lido como: X pertence a L se L puder ser decomposto


em duas listas sendo X a cabea da segunda.
Exerccio: compare o significado procedimental de ambas as
solues

Hugo Pires @ Universidade


Lusfona do Porto

Definir o predicado pertence com base no predicado concatena


pertence( X, L) :- concatena( _, [X I _], L).

17

Você também pode gostar