1 / 13

5. Processamento de Listas

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.

azure
Download Presentation

5. Processamento de Listas

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  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] [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]]). no 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]; 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

  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 + 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

  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):- conjunto(C1, C2). Introdução à Programação Prolog

  12. 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

  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

More Related