%listas.pro - Claudio Eduardo Storti Lago%
%webmaster@computersorcerer.com%

pertence(X,[X|Cauda]).
pertence(X,[Cabeca|Cauda]):-pertence(X,Cauda).

soma(0,[]).
soma(X,[Cabeca|Cauda]):-soma(Y,Cauda),X is Y + Cabeca.

subtrai(0,[]).
subtrai(X,[Cabeca|Cauda]):-subtrai(Y,Cauda),X is Y - Cabeca.

primeiro(X,[X|Cauda]).

ultimo(X,[X]).
ultimo(X,[Cabeca|Cauda]):-ultimo(X,Cauda).

maior(X,[X]).
maior(X,[Y,Z]):-Y<Z->X is Z; Y>=Z->X is Y.
maior(X,[Cabeca|Cauda]:-maior(Y,Cauda), Y<Cabeca-> X is Cabeca.
maior(X,[Cabeca|Cauda]:-maior(Y,Cauda), Y>=Cabeca-> X is Y.

menor(X,[X]).
menor(X,[Y,Z]):-Y>Z->X is Z; Y=<Z->X is Y.
menor(X,[Cabeca|Cauda]:-menor(Y,Cauda), Y>Cabeca-> X is Cabeca.
menor(X,[Cabeca|Cauda]:-menor(Y,Cauda), Y=<Cabeca-> X is Y.

conta(0,[]).
conta(X,[Cabeca|Cauda]):-conta(Y,Cauda), X is Y + 1.

encontra(-1,Y,[]).
encontra(0,Y,[Y|Cauda]).
encontra(X,Y,[Cabeca|Cauda]):-encontra(Z,Y,Cauda), X is Z + 1, pertence(Y,[Cabeca|Cauda]).

retira(-1,Y,[],[]).
retira(0,Y,[Y|Cauda],Cauda).
retira(X,Y,[Cabeca|Cauda],[Cabeca|W]):-retira(A,Y,Cauda,W), X is A+1, pertence(Y,[Cabeca|Cauda]).

insere(X,Y,Z,[],[X]).
insere(X,Y,Y,Lista,[X|Lista]).
insere(X,Y,Z,[Cabeca|Cauda],[Cabeca|Cauda1]):-W is Z+1,insere(X,Y,W,Cauda,Cauda1).

concatena([],X,X).
concatena([Elem|Lista1],Lista2,[Elem|Lista3]):-concatena(Lista1,Lista2,Lista3).

inverte([],Lista,Lista).
inverte([Cabeca|Cauda],Lista,Resp):-inverte(Cauda,[Cabeca|Lista],Resp).
