A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

5. Processamento de Listas

Apresentações semelhantes


Apresentação em tema: "5. Processamento de Listas"— Transcrição da apresentação:

1 5. Processamento de Listas

2 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

3 Exemplos com Listas [X | Y] = [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

4 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

5 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]]). Introdução à Programação Prolog

6 Concatenação de Listas
conc([], L, L). conc([X | L1], L2, [X | L3]):- conc(L1, L2, L3). Introdução à Programação Prolog

7 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

8 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]; ?- 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]; Introdução à Programação Prolog

9 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

10 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 % 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

11 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):- Introdução à Programação Prolog

12 Operações sobre Conjuntos
conjunto([X|C1], [X|C2]):- not member(X, C1), !, 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]):- intersec([], _, []):- !. intersec([X|C1], C2, [X|C3]):- member(X, C2), !, 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):- Introdução à Programação Prolog

13 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


Carregar ppt "5. Processamento de Listas"

Apresentações semelhantes


Anúncios Google