l(P) :- l(P,L), imprimir_cabeçalho(P), imprimir_lista(P,L), imprimir_cabeçalho(P), !.
l(P,L) :- gera_lista(P,1,L).

lc(P) :- lc(P,L), imprimir_cabeçalho(P), imprimir_lista(P,L), imprimir_cabeçalho(P), !.
lc(P,L) :- gera_lista(P,1,L1), quick_sort(-1,L1,L).

ld(P) :- ld(P,L), imprimir_cabeçalho(P), imprimir_lista(P,L), imprimir_cabeçalho(P), !.
ld(P,L) :- gera_lista(P,1,L1), quick_sort(1,L1,L).

imprimir_cabeçalho(P) :- ajuda(cmd,P,D,_), um(P,UM), nl, format("~s (UM: ~s)",[D,UM]), nl, nl.

gera_lista(P,NA,L) :- NA > 118, L = [], !.
gera_lista(P,NA,L) :- X is NA + 1, gera_lista(P,X,L1), na(S,NA), val(P,S,V), L = [[S,V]|L1].

imprimir_lista(P,[]) :- !.
imprimir_lista(P,[H|T]) :- simbolo_valor_lista(H,S,V), ssnnbna(S,SN,NB,NA), format("~s\t~s\t~d\t",[SN,NB,NA]), write(V), nl, imprimir_lista(P,T).

% valor_lista([A|B],V) :- V = B.
simbolo_valor_lista([A|[B]],S,V) :- S = A, V = B.

pivoting(S,H,[],[],[]).
pivoting(S,H,[X|T],[X|L],G) :- simbolo_valor_lista(H,S1,V1), simbolo_valor_lista(X,S2,V2), (S*V2) =< (S*V1), pivoting(S,H,T,L,G).
pivoting(S,H,[X|T],L,[X|G]) :- simbolo_valor_lista(H,S1,V1), simbolo_valor_lista(X,S2,V2), (S*V2) > (S*V1), pivoting(S,H,T,L,G).

quick_sort(S,L,LO) :- q_sort(S,L,[],LO).
q_sort(S,[],Acc,Acc).
q_sort(S,[H|T],Acc,LO):-
   pivoting(S,H,T,L1,L2),
   q_sort(S,L1,Acc,Sorted1),q_sort(S,L2,[H|Sorted1],LO).

% quick_sort([],[]).
% quick_sort([H|T],LO) :-
%    pivoting(H,T,L1,L2),quick_sort(L1,Sorted1),quick_sort(L2,Sorted2),
%    append(Sorted1,[H|Sorted2]).
   
% pivoting(H,[],[],[]).
% pivoting(H,[X|T],[X|L],G) :- X =< H, pivoting(H,T,L,G).
% pivoting(H,[X|T],L,[X|G]) :- X > H, pivoting(H,T,L,G).

% quick_sort(L,LO) :- q_sort(L,[],LO).
% q_sort([],Acc,Acc).
% q_sort([H|T],Acc,LO):-
%    pivoting(H,T,L1,L2),
%    q_sort(L1,Acc,Sorted1),q_sort(L2,[H|Sorted1],LO).