// Quick sort QS(ret) >< [] => ret~[]; QS(ret) >< (int x):xs => Part(x, left, right)~xs, QS(cntl)~left, QS(cntr)~right, Append(ret, x:cntl)~cntr; // Note: `Append' is implemented as built-in. // Apnd(ret, a)~b --> ret ~ b@a //Apnd(ret, a) >< [] => ret~a; //Apnd(ret, a) >< x:xs => ret~(x:cnt), Apnd(cnt, a)~xs; Part(int x, a, b) >< [] => a~[], b~[]; Part(int x, a, b) >< (int y):ys | y b~(y:cnt), Part(x, a, cnt)~ys | _ => a~(y:cnt), Part(x, cnt, b)~ys; const LIST_ELEM=800000; MkRandList(ret) >< (int n) | n>0 => ret~(rd:cnt), MkRandList(cnt)~(n-1) where rd=rand(10000) | _ => ret~[]; MkRandList(cnt)~(LIST_ELEM), QS(ret)~cnt; ret;