5. Processamento de Listas - Hudson Costa · Introdução à Programação Prolog 10 Mais...

13
5. Processamento de Listas

Transcript of 5. Processamento de Listas - Hudson Costa · Introdução à Programação Prolog 10 Mais...

5. Processamento de Listas

Introdução à Programação Prolog

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

L1 L2X

X L3

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

Introdução à Programação Prolog

7

Exemplos com conc ?- 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 em função de conc.

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 em função de remover.

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:

1. Listas possuem uma ordenação implícita que não existe em conjuntos, e

2. 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 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).

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

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([], _, [], []). % ?-