% Sort... coming inOrder([_]). inOrder([A, B | T]) :- A =< B, inOrder([B | T]). sorted(List, List) :- inOrder(List). sorted(List, SortedList) :- append(Start, [E1, E2 | Tail], List), E1 > E2, !, append(Start, [E2, E1 | Tail], Partial), sorted(Partial, SortedList). split([], [], []). split([A], [A], []). split([A, B | T], [A | L1], [B | L2]) :- split(T, L1, L2). myMerge([],L,L). myMerge(L,[],L). myMerge([A|X],[B|Y],[A|Z]) :- A=B, myMerge([A|X], Y, Z). mergeSort([],[]). mergeSort([A],[A]) :- !. mergeSort(List,Answer) :- split(List,L1,L2),mergeSort(L1,A1),mergeSort(L2,A2), myMerge(A1,A2,Answer).