Professional Documents
Culture Documents
IA 1 Programação 3
IA 1 Programação 3
IA 1 Programação 3
CIC 316024
Inteligncia Artificial I
Informtica - CIC
http://www.lpa.co.uk/win.htm
Processamento de Listas
Lista - seqncia ordenada de elementos que pode ter
qualquer comprimento.
Os elementos de uma lista podem ser uma varivel, uma
constante, ou qualquer estrutura do Prolog. Esses elementos
so separados por vrgulas.
Formas de identificao das listas em Prolog:
[X|Y]
[ Cabea | Cauda ]
[ Topo | Cauda ]
[ Primeiro | Resto ]
Cabea
Cauda
[casa]
[casa]
[]
[3, 4, 5]
[3]
[4, 5]
[o]
[gato, morreu,ontem]
Processamento de Listas
Construo de Listas
cons(X,Y,[X|Y]).
?-cons(a,b,Z).
Z=[a,b] ou Z=[a|b]
?-cons(a,[],Z).
Z=[a]
?-cons(a,X,[a,b,c]).
X=[b,c]
?-cons([a,b,c],[d,e],Z).
Z = [[a,b,c],d,e]
O uso de _ indica
que o contedo
no importante.
Processamento de Listas
Unificao de Listas (matching)
Dados dois termos, diz-se que eles se unificam se:
1.
So idnticos ou
2.
Processamento de Listas
Unificao de Listas
se n > 1
se n = 1
Processamento de Listas-Exemplo
Lista 1
Lista 2
Unificao
[mesa]
[X|Y]
X/mesa
Y/ [ ]
[a,b,c,d]
[ X, Y | Z ]
X/a
Y/b
Z/[c,d]
[ano, bissexto]
[ X, Y, Z]
[X, Y | Z]
no unifica
X/ano
Y/bissexto
Z/[ ]
Processamento de Listas
Elementos de uma lista:
pertence(Elemento, Lista)
Processamento de Listas
ltimo elemento de uma lista:
ultimo(Lista, Elemento)
ultimo([Elemento], Elemento).
ultimo([ _ | Cauda], Elemento):- ultimo(Cauda,
Elemento).
Processamento de Listas
Soma dos elementos de uma lista numrica:
soma( Lista, S)
se a Lista vazia, a soma dos elementos zero.
se a Lista [Cabea | Cauda], a soma dos elementos
a soma dos elementos da Cauda mais a Cabea.
soma([ ], 0).
soma([Cabea | Cauda], S):- soma(Cauda, S1),
S is S1 + Cabea.
Processamento de Listas
Elementos consecutivos em uma lista
consecutivos( Elemento1, Elemento2, Lista)
Processamento de Listas
conc(L1,L2,L3)
conc([a,b],[c,d],[a,b,c,d]).
Casos que devem ser considerados para a definio
de conc/3:
1.
2.
Concatenao de Listas
X
X
L1
L2
L3
Exemplo:
conc([ ],L,L).
conc([X|L1],L2,[X|L3]) :- conc(L1,L2,L3).
?-conc([a,b,c],[1,2,3],L).
L=[a,b,c,1,2,3]
?-conc([a,[b,c],d],[a,[],b],L).
L=[a,[b,c],d,a,[ ],b]
Concatenao de Listas
Apesar de muito simples o programa conc/3 pode ser usado
em inmeras aplicaes:
Decomposio:
Exemplo: ?-conc(L1,L2,[a,b,c]).
L1 = [ ] ,
L2 = [a,b,c] ;
L1 = [a] ,
L2 = [b,c] ;
L1 = [a,b] ,
L2 = [c] ;
L1 = [a,b,c] ,
L2 = [] ;
no
Concatenao de Listas
Apagando de uma lista todos os elementos
que se seguem a um determinado padro:
Exemplo:
?-conc(T,[sab|_],[seq,ter,qua,qui,sex,sab,dom]).
T=[seg,ter,qua,qui,sex]
Exemplos de remoo
?-remover(a,[a,b,a,a],L).
L=[b,a,a];
L=[a,b,a];
L=[a,b,a];
no
?-remover(a,L,[b,c,d]).
L=[a,b,c,d];
L=[b,a,c,d];
L=[b,c,a,d];
L=[b,c,d,a];
no
?-membro2(a,[c,b,a]).
yes
Inverso de Listas
inverter([a,b,c],[c,b,a]).
inverter([],[]).
inverter([a,[b,c],d],[d,[b,c],a]).
Inverso ingnua (O(N2))
1. Tomar o primeiro elemento da lista
2. Inverter o restante
3. Concatenar o inverso do restante lista formada pelo
primeiro elemento
inverter([],[]).
inverter([X|Y],Z) :- inverter(Y,Y1),
conc(Y1,[X],Z).
Inverso de Listas
Inverso eficiente (O(N))
inverter(X,Y):-aux([],X,Y).
aux(L,[ ],L).
aux(L,[X|Y],Z) :- aux([X|L],Y,Z).
Sublistas
S uma sublista de L se:
(1) L pode ser decomposta em duas listas L1 e L2
(2) L2 pode ser decomposta em S e L3
sublista(S,L) :- conc(L1,L2,L),
conc(S,L3,L2).
?-sublista(S,[a,b,c]).
Sublistas
Exemplo:
?-sublista(S,[a,b,c]).
S = [ ] ;
S = [a] ;
S = [a,b] ;
S = [a,b,c] ;
S = [ ] ;
S = [b] ;
S = [b,c] ;
S = [ ] ;
S = [c] ;
S = [ ] ;
no
conc([ ],L,L).
conc([X|L1],L2,[X|L3]) :conc(L1,L2,L3).
sublista(S,L) :conc(L1,L2,L),
conc(S,L3,L2).