Agradeço comentários, sugestões ou correccões. O meu endereço de correio electrónico é < delfim@mat.ua.pt > . Desde já obrigado.
Manipulação de listas:
concatena([],L,L). concatena([X|R],L,[X|C]) :- concatena(R,L,C). adiciona(X,L,[X|L]). tira(_,[],[]). tira(X,[X|R],R). tira(X,[Y|R],[Y|R1]) :- tira(X,R,R1). adiciona_fim(X,L,NL) :- concatena(L,[X],NL).
Implemente os predicados tira_todos/3, pertence/2, ultimo/2, sublista/2, permutacao/2 e ordena/2 (fazer uma versão para ordenar uma lista de números por ordem crescente, e uma outra para ordenar por ordem decrescente).
tira_todos(_,[],[]). tira_todos(X,[X|R],NR) :- tira_todos(X,R,NR). tira_todos(X,[Y|R],[Y|R1]) :- tira_todos(X,R,R1). pertence(X,[X|_]). pertence(X,[_|R]) :- pertence(X,R). ultimo([U],U). ultimo([_|R],U) :- ultimo(R,U). sublista(S,L) :- concatena(_,S,L1), concatena(L1,_,L). permutacao([],[]). permutacao(L,[X|P]) :- tira(X,L,L1), permutacao(L1,P). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% Predicados de ordena,c~ao. %% Recebem sempre dois argumentos. Retornam %% ''yes'' se o primeiro e' %% ''menor'' que o segundo %% e ''no'' caso contra'ario. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% antes_c(X,Y) :- % serve para ordenar uma lista de nu'meros X =< Y. % por ordem crescente antes_d(X,Y) :- % serve para ordenar uma lista de nu'meros X >= Y. % por ordem decrescente %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
ordenada(_,[]). ordenada(_,[_]). ordenada(P,[X,Y|R]) :- ordenada(P,[Y|R]), C =..[P,X,Y], call(C). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% ORDENA usando um algoritmo do tipo Bubble Sort %% bubble_sort/3 %% ordena_c/2 %% ordena_d/2 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% bubble(_,[X],[X]). bubble(P,[X,Y|R],[X|O]) :- C =.. [P,X,Y], call(C), bubble(P,[Y|R],O). bubble(P,[X,Y|R],[Y|O]) :- bubble(P,[X|R],O). bubble_sort(P,L,L) :- ordenada(P,L). bubble_sort(P,L,LO) :- bubble(P,L,L1), bubble_sort(P,L1,LO). ordena_c(L,LO) :- bubble_sort(antes_c,L,LO). ordena_d(L,LO) :- bubble_sort(antes_d,L,LO).