merge_a([X|LX],[Y|LY],[X|LZ]) :- X =< Y, !, merge_a(LX,[Y|LY],LZ). merge_a([X|LX],[Y|LY],[Y|LZ]) :- X > Y, !, merge_a([X|LX],LY,LZ). merge_a(LX,[],LX). merge_a([],LY,LY). split([H|T],[H|U],Z,N) :- N > 0, !, M is N-1, split(T,U,Z,M). split(X,[],X,_) :- !. len([_|T],N) :- !, len(T,M), N is M + 1. len([],0) :- !. split(X,Y,Z) :- len(X,N), M is (N / 2), split(X,Y,Z,M). merge_sort([],[]) :- !. merge_sort([X|[]],[X|[]]) :- !. merge_sort(X,Y) :- split(X,U,T),merge_sort(U,U1),merge_sort(T,T1),merge_a(U1,T1,Y). listgen(0,[]) :- !. listgen(N,[H|T]) :- H is (N * N) mod 100, M is N-1, listgen(M,T). merge_test(N,Y) :- listgen(N,X), merge_sort(X,Y).