%Ordena uma lista de numeros pelo merge sort merge_sort( [], [] ). merge_sort( [X], [X] ). merge_sort( [X1,X2|Xs], Ys ) :- racha( [X1,X2|Xs], X1s, X2s ), merge_sort( X1s, Y1s ), merge_sort( X2s, Y2s ), intercala( Y1s, Y2s, Ys ). racha( [], [], [] ). racha( [X], [X], [] ). racha( [ X1, X2 | Xs ], [ X1 | X1s ], [ X2 | X2s ] ) :- racha( Xs, X1s, X2s ). intercala( [], Ys, Ys ). intercala( Xs, [], Xs ). intercala( [X|Xs], [Y|Ys], [X|Zs] ) :- X < Y, intercala( Xs, [Y|Ys], Zs ). intercala( [X|Xs], [Y|Ys], [Y|Zs] ) :- X >= Y, intercala( [X|Xs], Ys, Zs ). maior( X, Y, X ) :- X > Y, !. maior( _, Y, Y ). % a logica foi alterada!!! classifica_ordem( X, Y, maior ) :- X > Y. classifica_ordem( X, Y, igual ) :- X == Y. % X, Y instanciados e iguais classifica_ordem( X, Y, menor ) :- X < Y. classifica_ordemX( X, Y, maior ) :- X > Y, !. classifica_ordemX( X, Y, igual ) :- X == Y, !. % X, Y instanciados e iguais classifica_ordemX( _, _, menor ). % Definicao de negacao por falha via cut-fail nao( X ) :- X, !, fail. nao( _ ). % negacao por falha eh \+ X