130 likes | 212 Views
5. Processamento de Listas. Representação de Listas. [a, b, c, d]. . (Cabeça, Corpo). . (a, . (b, . (c, . (d, . ([])))). [a] = . (a, []). [Cabeça | Corpo]. ·. ·. brasil. ·. uruguai. ·. argentina. [ ]. paraguai. [brasil, uruguai, argentina, paraguai] . Qualquer termo Prolog.
E N D
Representação de Listas [a, b, c, d]. .(Cabeça, Corpo). .(a, .(b, .(c, .(d, .([])))). [a] = .(a, []). [Cabeça | Corpo] · · brasil · uruguai · argentina [ ] paraguai [brasil, uruguai, argentina, paraguai] Qualquer termo Prolog Sempre uma Lista Introdução à Programação Prolog
Exemplos com Listas [X | Y] = [X | [Y | Z]] = [a, b, c, d] [X, Y, Z] \= [a, b, c, d] [a, b, c] = [a | [b | [c]]] = [a | [b, c]] = [a, b | [c]] = [a, b, c | []] As consultas abaixo também são elucidativas: ?-[X | Y] = [a, b, c]. X=a, Y=[b, c] ?-[X, Y, Z] = [a, b, c, d]. no ?-[X | [Y | Z]] = [a, b, c, d]. X=a, Y=b, Z=[c, d] Introdução à Programação Prolog
Construção de Listas lista([]). % Uma lista, ou é vazia ou é lista([_|_]). % formada por uma cabeça e um corpo. cons(X, Y, [X|Y]). % Constrói (ou decompõe) uma lista. ?- cons(a, [b, c], X). % Observar que o corpo de uma lista X = [a, b, c] % é sempre uma lista. ?- cons(X, Y, [a, b, c]). % A lista dada [a, b, c] se X = a, Y = [b, c] % decompõe em cabeça e corpo. ?- cons(a, X, [a, b, c]). % Prolog permite também resultados X = [b, c] % implícitos, como este. Introdução à Programação Prolog
O Predicado membro/2 membro(X, [X|_]). % X é membro de uma lista se X é a membro(X, [_|Y]):- % cabeça da lista. Ou então se X é membro(X,Y). % membro do corpo da lista. ?- membro(c, [a, b, c]). yes ?- membro(X, [a, b, c]). X = a; X = b; X = c; no ?- membro(b, [a, [b, c]]). no Introdução à Programação Prolog
Concatenação de Listas conc([], L, L). conc([X | L1], L2, [X | L3]):- conc(L1, L2, L3). Introdução à Programação Prolog
Exemplos com conc/3 ?- 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] ?- conc([a, b], [c | R], L). L = [a, b, c | R] ?- 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 Introdução à Programação Prolog
Mais Exemplos com conc/3 ?- conc(_, [X, g, Y | _], [a, b, c, d, e, f, g, h]). X = f, Y = h; no ?- conc(Trab, [sab | _], [seg, ter, qua, qui, sex, sab, dom]). Trab = [seg, ter, qua, qui, sex]; no ?- M=[jan, fev, mar, abr, mai, jun, jul, ago, set, out, nov, dez], conc(Antes, [mai | Depois], M). Antes = [jan, fev, mar, abr], Depois = [jun, jul, ago, set, out, nov, dez]; no Introdução à Programação Prolog
Outros Predicados com Listas membro1(X, L):- % membro/2 em função de conc/3. conc(_, [X|_], L). remover(X, [X|C], C). % Pode-se remover um elemento X de uma lista onde remover(X, [Y|C], [Y|D]):- % X é a cabeça. Se X não é a cabeça da lista, então remover(X, C, D). % X deve ser removido do corpo da lista. inserir(X, L, L1):- % inserir/3 em função de remover/3. remover(X, L1, L). % A inserção é sempre feita na cabeça de L. inverter([], []). % A inversão de uma lista vazia é a própria lista vazia. inverter([X|Y], Z):- % A inversão de uma lista não-vazia é a inversão de inverter(Y, Y1), % seu corpo e a concatenação deste corpo invertido conc(Y1, [X], Z). % com a cabeça da lista original. Introdução à Programação Prolog
Mais Predicados com Listas sublista(S, L):- % S é sublista de L se L pode ser decomposta em duas conc(_, L1, L), % listas, uma das quais é L1, e L1 pode ser decomposta conc(S, _, L1). % em outras duas listas, uma das quais é S. tamanho([], 0). % O tamanho de uma lista vazia é zero. O tamanho de tamanho([_|R], N):- % uma lista não-vazia é obtido acrescentando-se uma tamanho(R, N1), % unidade ao tamanho de seu corpo. N is N1 + 1. enesimo(1, X, [X | _]). % Este predicado devolve em X o enésimo elemento de enesimo(N, X, [_ | Y]):- % uma lista. Pode ser usado no sentido inverso para enesimo(M, X, Y), % informar a posição de um determinado elemento N is M + 1. % na lista. soma([], 0). % A soma dos elementos de uma lista de números é soma([X | Y], S):- % obtida somando o valor da cabeça á soma dos soma(Y, R), % elementos do corpo da lista. S is R + X. Introdução à Programação Prolog
Conjuntos como Listas Conjuntos e operações sobre conjuntos podem ser representados como listas em Prolog, considerando-se que: • Listas possuem uma ordenação implícita que não existe em conjuntos, e • Listas podem apresentar elementos repetidos, o que não acontece nos conjuntos. conjunto([], []):- !. conjunto([X|C1], [X|C2]):- not member(X, C1), !, conjunto(C1, C2). conjunto([_|C1], C2):- conjunto(C1, C2). Introdução à Programação Prolog
Operações sobre Conjuntos intersec([], _, []):- !. intersec([X|C1], C2, [X|C3]):- member(X, C2), !, intersec(C1, C2, C3). intersec([_|C1], C2, C3):- intersec(C1, C2, C3). difer([], _, []):-!. difer([X|C1], C2, [X|C3]):- not member(X, C2), !, difer(C1, C2, C3). difer([_|C1], C2, C3):- difer(C1, C2, C3). conjunto([], []):- !. conjunto([X|C1], [X|C2]):- not member(X, C1), !, conjunto(C1, C2). conjunto([_|C1], C2):- conjunto(C1, C2). união([], C, C):- !. união([X|C1], C2, C3):- member(X, C2), !, união(C1, C2, C3). união([X|C1], C2, [X|C3]):- união(C1, C2, C3). Introdução à Programação Prolog
Quicksort em Prolog quick([X|Y], Z):- % Classifica uma lista [X|Y] resultando em Z se, part(Y, X, Peqs, Grds), % usando X como pivô, particiona Y em Peqs e Grds e quick(Peqs, P), % classifica Peqs resultando em P e quick(Grds, G), % classifica Grds resultando em G e append(P, [X|G], Z). % append/3 é o mesmo predicado conc/3 no SWI-Prolog. quick([ ], [ ]). % Classifica [ ] para si própria (caso básico). % part([X|XX], Y, [X|P], G):- % Por exemplo: X=<Y, part(XX, Y, P, G). % ?-quick([9,2,6,5,8,1],L). part([X|XX], Y, P, [X|G]):- % L = [1,2,5,6,8,9] X >Y, part(XX, Y, P, G). % yes part([], _, [], []). % ?- Introdução à Programação Prolog