src/Pure/library.ML
changeset 15760 1ca99038c847
parent 15745 33bb955b2e73
child 15965 f422f8283491
equal deleted inserted replaced
15759:144c9f9a8ade 15760:1ca99038c847
    81   exception UnequalLengths
    81   exception UnequalLengths
    82   val cons: 'a -> 'a list -> 'a list
    82   val cons: 'a -> 'a list -> 'a list
    83   val single: 'a -> 'a list
    83   val single: 'a -> 'a list
    84   val append: 'a list -> 'a list -> 'a list
    84   val append: 'a list -> 'a list -> 'a list
    85   val apply: ('a -> 'a) list -> 'a -> 'a
    85   val apply: ('a -> 'a) list -> 'a -> 'a
    86   val foldr1: ('a * 'a -> 'a) -> 'a list -> 'a
       
    87   val fold: ('a -> 'b -> 'b) -> 'a list -> 'b -> 'b
    86   val fold: ('a -> 'b -> 'b) -> 'a list -> 'b -> 'b
    88   val fold_rev: ('a -> 'b -> 'b) -> 'a list -> 'b -> 'b
    87   val fold_rev: ('a -> 'b -> 'b) -> 'a list -> 'b -> 'b
    89   val foldl_map: ('a * 'b -> 'a * 'c) -> 'a * 'b list -> 'a * 'c list
    88   val foldl_map: ('a * 'b -> 'a * 'c) -> 'a * 'b list -> 'a * 'c list
       
    89   val foldr1: ('a * 'a -> 'a) -> 'a list -> 'a
    90   val foldln: ('a * int -> 'b -> 'b) -> 'a list -> 'b -> 'b
    90   val foldln: ('a * int -> 'b -> 'b) -> 'a list -> 'b -> 'b
    91   val unflat: 'a list list -> 'b list -> 'b list list
    91   val unflat: 'a list list -> 'b list -> 'b list list
    92   val splitAt: int * 'a list -> 'a list * 'a list
    92   val splitAt: int * 'a list -> 'a list * 'a list
    93   val dropwhile: ('a -> bool) -> 'a list -> 'a list
    93   val dropwhile: ('a -> bool) -> 'a list -> 'a list
    94   val map_nth_elem: int -> ('a -> 'a) -> 'a list -> 'a list
    94   val map_nth_elem: int -> ('a -> 'a) -> 'a list -> 'a list
   172   val gen_mem: ('a * 'b -> bool) -> 'a * 'b list -> bool
   172   val gen_mem: ('a * 'b -> bool) -> 'a * 'b list -> bool
   173   val ins: ''a * ''a list -> ''a list
   173   val ins: ''a * ''a list -> ''a list
   174   val ins_int: int * int list -> int list
   174   val ins_int: int * int list -> int list
   175   val ins_string: string * string list -> string list
   175   val ins_string: string * string list -> string list
   176   val gen_ins: ('a * 'a -> bool) -> 'a * 'a list -> 'a list
   176   val gen_ins: ('a * 'a -> bool) -> 'a * 'a list -> 'a list
       
   177   val insert: ('a * 'a -> bool) -> 'a -> 'a list -> 'a list
       
   178   val remove: ('a * 'a -> bool) -> 'a -> 'a list -> 'a list
   177   val union: ''a list * ''a list -> ''a list
   179   val union: ''a list * ''a list -> ''a list
   178   val union_int: int list * int list -> int list
   180   val union_int: int list * int list -> int list
   179   val union_string: string list * string list -> string list
   181   val union_string: string list * string list -> string list
   180   val gen_union: ('a * 'a -> bool) -> 'a list * 'a list -> 'a list
   182   val gen_union: ('a * 'a -> bool) -> 'a list * 'a list -> 'a list
   181   val gen_inter: ('a * 'b -> bool) -> 'a list * 'b list -> 'a list
   183   val gen_inter: ('a * 'b -> bool) -> 'a list * 'b list -> 'a list
   190   val gen_subset: ('a * 'b -> bool) -> 'a list * 'b list -> bool
   192   val gen_subset: ('a * 'b -> bool) -> 'a list * 'b list -> bool
   191   val \ : ''a list * ''a -> ''a list
   193   val \ : ''a list * ''a -> ''a list
   192   val \\ : ''a list * ''a list -> ''a list
   194   val \\ : ''a list * ''a list -> ''a list
   193   val gen_rem: ('a * 'b -> bool) -> 'a list * 'b -> 'a list
   195   val gen_rem: ('a * 'b -> bool) -> 'a list * 'b -> 'a list
   194   val gen_rems: ('a * 'b -> bool) -> 'a list * 'b list -> 'a list
   196   val gen_rems: ('a * 'b -> bool) -> 'a list * 'b list -> 'a list
   195   val gen_remove: ('a * 'b -> bool) -> 'b -> 'a list -> 'a list
       
   196   val remove: ''a -> ''a list -> ''a list
       
   197   val gen_distinct: ('a * 'a -> bool) -> 'a list -> 'a list
   197   val gen_distinct: ('a * 'a -> bool) -> 'a list -> 'a list
   198   val distinct: ''a list -> ''a list
   198   val distinct: ''a list -> ''a list
   199   val findrep: ''a list -> ''a list
   199   val findrep: ''a list -> ''a list
   200   val gen_duplicates: ('a * 'a -> bool) -> 'a list -> 'a list
   200   val gen_duplicates: ('a * 'a -> bool) -> 'a list -> 'a list
   201   val duplicates: ''a list -> ''a list
   201   val duplicates: ''a list -> ''a list
   443 fun cons x xs = x :: xs;
   443 fun cons x xs = x :: xs;
   444 fun single x = [x];
   444 fun single x = [x];
   445 
   445 
   446 fun append xs ys = xs @ ys;
   446 fun append xs ys = xs @ ys;
   447 
   447 
   448 (* tail recursive version *)
   448 fun rev_append xs ys = List.revAppend (xs, ys);
   449 fun rev_append xs ys = List.revAppend(xs,ys);
       
   450 
   449 
   451 fun apply [] x = x
   450 fun apply [] x = x
   452   | apply (f :: fs) x = apply fs (f x);
   451   | apply (f :: fs) x = apply fs (f x);
   453 
   452 
   454 
   453 
   455 (* fold *)
   454 (* fold *)
       
   455 
       
   456 fun fold _ [] y = y
       
   457   | fold f (x :: xs) y = fold f xs (f x y);
       
   458 
       
   459 fun fold_rev _ [] y = y
       
   460   | fold_rev f (x :: xs) y = f x (fold_rev f xs y);
       
   461 
       
   462 fun foldl_map _ (x, []) = (x, [])
       
   463   | foldl_map f (x, y :: ys) =
       
   464       let
       
   465         val (x', y') = f (x, y);
       
   466         val (x'', ys') = foldl_map f (x', ys);
       
   467       in (x'', y' :: ys') end;
   456 
   468 
   457 (*the following versions of fold are designed to fit nicely with infixes*)
   469 (*the following versions of fold are designed to fit nicely with infixes*)
   458 
   470 
   459 (*  (op @) (e, [x1, ..., xn])  ===>  ((e @ x1) @ x2) ... @ xn
   471 (*  (op @) (e, [x1, ..., xn])  ===>  ((e @ x1) @ x2) ... @ xn
   460     for operators that associate to the left (TAIL RECURSIVE)*)
   472     for operators that associate to the left (TAIL RECURSIVE)*)
   475 fun foldr1 f l =
   487 fun foldr1 f l =
   476   let fun itr [x] = x
   488   let fun itr [x] = x
   477         | itr (x::l) = f(x, itr l)
   489         | itr (x::l) = f(x, itr l)
   478   in  itr l  end;
   490   in  itr l  end;
   479 
   491 
   480 fun fold f xs y = foldl (fn (y', x) => f x y') (y, xs);
       
   481 fun fold_rev f xs y = foldr (fn (x, y') => f x y') (xs, y);
       
   482 
       
   483 fun foldl_map _ (x, []) = (x, [])
       
   484   | foldl_map f (x, y :: ys) =
       
   485       let
       
   486         val (x', y') = f (x, y);
       
   487         val (x'', ys') = foldl_map f (x', ys);
       
   488       in (x'', y' :: ys') end;
       
   489 
       
   490 fun foldln f xs e = fst (foldl (fn ((e,i), x) => (f (x,i) e, i+1)) ((e,1),xs));
   492 fun foldln f xs e = fst (foldl (fn ((e,i), x) => (f (x,i) e, i+1)) ((e,1),xs));
       
   493 
   491 
   494 
   492 (* basic list functions *)
   495 (* basic list functions *)
   493 
   496 
   494 (*take the first n elements from a list*)
   497 (*take the first n elements from a list*)
   495 fun take (n, []) = []
   498 fun take (n, []) = []
   843 
   846 
   844 (*generalized membership test*)
   847 (*generalized membership test*)
   845 fun gen_mem eq (x, []) = false
   848 fun gen_mem eq (x, []) = false
   846   | gen_mem eq (x, y :: ys) = eq (x, y) orelse gen_mem eq (x, ys);
   849   | gen_mem eq (x, y :: ys) = eq (x, y) orelse gen_mem eq (x, ys);
   847 
   850 
       
   851 (*insert and remove*)
       
   852 fun insert eq x xs = if gen_mem eq (x, xs) then xs else x :: xs;
       
   853 fun remove eq x xs = if gen_mem eq (x, xs) then filter_out (fn y => eq (x, y)) xs else xs;
   848 
   854 
   849 (*insertion into list if not already there*)
   855 (*insertion into list if not already there*)
   850 fun (x ins xs) = if x mem xs then xs else x :: xs;
   856 fun (x ins xs) = if x mem xs then xs else x :: xs;
   851 
   857 
   852 (*insertion into list, optimized version for ints*)
   858 (*insertion into list, optimized version for ints*)
   854 
   860 
   855 (*insertion into list, optimized version for strings*)
   861 (*insertion into list, optimized version for strings*)
   856 fun (x ins_string xs) = if x mem_string xs then xs else x :: xs;
   862 fun (x ins_string xs) = if x mem_string xs then xs else x :: xs;
   857 
   863 
   858 (*generalized insertion*)
   864 (*generalized insertion*)
   859 fun gen_ins eq (x, xs) = if gen_mem eq (x, xs) then xs else x :: xs;
   865 fun gen_ins eq (x, xs) = insert eq x xs;
   860 
       
   861 
   866 
   862 (*union of sets represented as lists: no repetitions*)
   867 (*union of sets represented as lists: no repetitions*)
   863 fun xs union [] = xs
   868 fun xs union [] = xs
   864   | [] union ys = ys
   869   | [] union ys = ys
   865   | (x :: xs) union ys = xs union (x ins ys);
   870   | (x :: xs) union ys = xs union (x ins ys);
   932 fun ys \\ xs = foldl (op \) (ys,xs);
   937 fun ys \\ xs = foldl (op \) (ys,xs);
   933 
   938 
   934 (*removing an element from a list -- possibly WITH duplicates*)
   939 (*removing an element from a list -- possibly WITH duplicates*)
   935 fun gen_rem eq (xs, y) = filter_out (fn x => eq (x, y)) xs;
   940 fun gen_rem eq (xs, y) = filter_out (fn x => eq (x, y)) xs;
   936 fun gen_rems eq (xs, ys) = filter_out (fn x => gen_mem eq (x, ys)) xs;
   941 fun gen_rems eq (xs, ys) = filter_out (fn x => gen_mem eq (x, ys)) xs;
   937 
       
   938 fun gen_remove eq x xs = gen_rem eq (xs, x);
       
   939 fun remove x xs = gen_rem (op =) (xs, x);
       
   940 
   942 
   941 (*makes a list of the distinct members of the input; preserves order, takes
   943 (*makes a list of the distinct members of the input; preserves order, takes
   942   first of equal elements*)
   944   first of equal elements*)
   943 fun gen_distinct eq lst =
   945 fun gen_distinct eq lst =
   944   let
   946   let