/************************************************************************* * * * YAP Prolog * * * * Yap Prolog was developed at NCCUP - Universidade do Porto * * * * Copyright L.Damas, V.S.Costa and Universidade do Porto 1985-1997 * * * ************************************************************************** * * * File: sort.pl * * Last rev: * * mods: * * comments: sorting in Prolog * * * *************************************************************************/ /* The three sorting routines are all variations of merge-sort, done by bisecting the list, sorting the nearly equal halves, and merging the results. The half-lists aren't actually constructed, the number of elements is counted instead (which is why 'length' is in this file). */ % length of a list. length(L,M) :- var(M), !, '$$_length1'(L,0,M). length(L,M) :- '$$_length2'(M,L). '$$_length1'([], M, M). '$$_length1'([_|L], N, O) :- M is N + 1, '$$_length1'(L, M, O). '$$_length2'(N, L) :- ( N =:= 0 -> L = [] ; L = [_|L1], N1 is N - 1, '$$_length2'(N1, L1) ). sort(L,O) :- '$sort'(L,O). msort(L,O) :- '$msort'(L,O). keysort(L,O) :- '$keysort'(L,O).