src/Pure/library.ML
changeset 4445 de74b549f976
parent 4363 b449831f03f4
child 4479 708d7c26db5b
equal deleted inserted replaced
4444:fa05a79b3e97 4445:de74b549f976
   723 
   723 
   724 (** orders **)
   724 (** orders **)
   725 
   725 
   726 datatype order = LESS | EQUAL | GREATER;
   726 datatype order = LESS | EQUAL | GREATER;
   727 
   727 
       
   728 fun rev_order LESS = GREATER
       
   729   | rev_order EQUAL = EQUAL
       
   730   | rev_order GREATER = LESS;
       
   731 
       
   732 fun make_ord rel (x, y) =
       
   733   if rel (x, y) then LESS
       
   734   else if rel (y, x) then GREATER
       
   735   else EQUAL;
       
   736 
   728 fun int_ord (i, j: int) =
   737 fun int_ord (i, j: int) =
   729   if i < j then LESS
   738   if i < j then LESS
   730   else if i = j then EQUAL
   739   else if i = j then EQUAL
   731   else GREATER;
   740   else GREATER;
   732 
   741 
   885   in  part i end;
   894   in  part i end;
   886 
   895 
   887 
   896 
   888 (* sorting *)
   897 (* sorting *)
   889 
   898 
   890 (*insertion sort; stable (does not reorder equal elements)
   899 (*quicksort (stable, i.e. does not reorder equal elements)*)
   891   'less' is less-than test on type 'a*)
   900 fun sort ord =
   892 fun sort (less: 'a*'a -> bool) =
   901   let
   893   let fun insert (x, []) = [x]
   902     fun qsort xs =
   894         | insert (x, y::ys) =
   903       let val len = length xs in
   895               if less(y, x) then y :: insert (x, ys) else x::y::ys;
   904         if len <= 1 then xs
   896       fun sort1 [] = []
   905         else
   897         | sort1 (x::xs) = insert (x, sort1 xs)
   906           let val (lts, eqs, gts) = part (nth_elem (len div 2, xs)) xs in
   898   in  sort1  end;
   907             qsort lts @ eqs @ qsort gts
       
   908           end
       
   909       end
       
   910     and part _ [] = ([], [], [])
       
   911       | part pivot (x :: xs) = add (ord (x, pivot)) x (part pivot xs)
       
   912     and add LESS x (lts, eqs, gts) = (x :: lts, eqs, gts)
       
   913       | add EQUAL x (lts, eqs, gts) = (lts, x :: eqs, gts)
       
   914       | add GREATER x (lts, eqs, gts) = (lts, eqs, x :: gts);
       
   915   in qsort end;
   899 
   916 
   900 (*sort strings*)
   917 (*sort strings*)
   901 fun sort_wrt sel xs = sort (op <= o pairself (sel: 'a -> string)) xs;
   918 val sort_strings = sort string_ord;
   902 val sort_strings = sort_wrt I;
   919 fun sort_wrt sel xs = sort (string_ord o pairself sel) xs;
   903 
   920 
   904 
   921 
   905 (* transitive closure (not Warshall's algorithm) *)
   922 (* transitive closure (not Warshall's algorithm) *)
   906 
   923 
   907 fun transitive_closure [] = []
   924 fun transitive_closure [] = []