5. processamento de listas - hudson costa · introdução à programação prolog 10 mais...
TRANSCRIPT
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([], _, [], []). % ?-