src/Pure/library.ML
changeset 20348 d59364649bcc
parent 20137 6c04453ac1bd
child 20443 84a624a8f773
equal deleted inserted replaced
20347:1ffbe17cef38 20348:d59364649bcc
   140   val multiply: 'a list -> 'a list list -> 'a list list
   140   val multiply: 'a list -> 'a list list -> 'a list list
   141   val product: 'a list -> 'b list -> ('a * 'b) list
   141   val product: 'a list -> 'b list -> ('a * 'b) list
   142   val filter: ('a -> bool) -> 'a list -> 'a list
   142   val filter: ('a -> bool) -> 'a list -> 'a list
   143   val filter_out: ('a -> bool) -> 'a list -> 'a list
   143   val filter_out: ('a -> bool) -> 'a list -> 'a list
   144   val map_filter: ('a -> 'b option) -> 'a list -> 'b list
   144   val map_filter: ('a -> 'b option) -> 'a list -> 'b list
   145   val equal_lists: ('a * 'b -> bool) -> 'a list * 'b list -> bool
       
   146   val is_prefix: ('a * 'a -> bool) -> 'a list -> 'a list -> bool
   145   val is_prefix: ('a * 'a -> bool) -> 'a list -> 'a list -> bool
   147   val take_prefix: ('a -> bool) -> 'a list -> 'a list * 'a list
   146   val take_prefix: ('a -> bool) -> 'a list -> 'a list * 'a list
   148   val chop_prefix: ('a * 'b -> bool) -> 'a list * 'b list -> 'a list * ('a list * 'b list)
   147   val chop_prefix: ('a * 'b -> bool) -> 'a list * 'b list -> 'a list * ('a list * 'b list)
   149   val take_suffix: ('a -> bool) -> 'a list -> 'a list * 'a list
   148   val take_suffix: ('a -> bool) -> 'a list -> 'a list * 'a list
   150   val prefixes1: 'a list -> 'a list list
   149   val prefixes1: 'a list -> 'a list list
   566   in fold_aux end;
   565   in fold_aux end;
   567 
   566 
   568 
   567 
   569 (* basic list functions *)
   568 (* basic list functions *)
   570 
   569 
       
   570 fun eq_list eq (xs, ys) =
       
   571   let
       
   572     fun eq' [] [] = true
       
   573       | eq' (x :: xs) (y :: ys) = eq (x, y) andalso eq' xs ys
       
   574   in length xs = length ys andalso eq' xs ys end;
       
   575 
   571 fun maps f [] = []
   576 fun maps f [] = []
   572   | maps f (x :: xs) = f x @ maps f xs;
   577   | maps f (x :: xs) = f x @ maps f xs;
   573 
   578 
   574 fun chop 0 xs = ([], xs)
   579 fun chop 0 xs = ([], xs)
   575   | chop _ [] = ([], [])
   580   | chop _ [] = ([], [])
   643       | get i (x :: xs) =
   648       | get i (x :: xs) =
   644           case f x
   649           case f x
   645            of NONE => get (i + 1) xs
   650            of NONE => get (i + 1) xs
   646             | SOME y => SOME (i, y)
   651             | SOME y => SOME (i, y)
   647   in get 0 end;
   652   in get 0 end;
   648 
       
   649 fun eq_list _ ([], []) = true
       
   650   | eq_list eq (x :: xs, y :: ys) = eq (x, y) andalso eq_list eq (xs, ys)
       
   651   | eq_list _ _ = false;
       
   652 
   653 
   653 val flat = List.concat;
   654 val flat = List.concat;
   654 
   655 
   655 fun unflat (xs :: xss) ys =
   656 fun unflat (xs :: xss) ys =
   656       let val (ps, qs) = chop (length xs) ys
   657       let val (ps, qs) = chop (length xs) ys
   728   | _ ~~ _ = raise UnequalLengths;
   729   | _ ~~ _ = raise UnequalLengths;
   729 
   730 
   730 (*inverse of ~~; the old 'split':
   731 (*inverse of ~~; the old 'split':
   731   [(x1, y1), ..., (xn, yn)]  ===>  ([x1, ..., xn], [y1, ..., yn])*)
   732   [(x1, y1), ..., (xn, yn)]  ===>  ([x1, ..., xn], [y1, ..., yn])*)
   732 val split_list = ListPair.unzip;
   733 val split_list = ListPair.unzip;
   733 
       
   734 fun equal_lists eq (xs, ys) =
       
   735   let
       
   736     fun eq' [] [] = true
       
   737       | eq' (x :: xs) (y :: ys) = eq (x, y) andalso eq' xs ys
       
   738   in length xs = length ys andalso eq' xs ys end;
       
   739 
   734 
   740 
   735 
   741 (* prefixes, suffixes *)
   736 (* prefixes, suffixes *)
   742 
   737 
   743 fun is_prefix _ [] _ = true
   738 fun is_prefix _ [] _ = true
  1032   xs = ys orelse (xs subset_string ys andalso ys subset_string xs);
  1027   xs = ys orelse (xs subset_string ys andalso ys subset_string xs);
  1033 
  1028 
  1034 fun gen_subset eq (xs, ys) = forall (member eq ys) xs;
  1029 fun gen_subset eq (xs, ys) = forall (member eq ys) xs;
  1035 
  1030 
  1036 fun gen_eq_set eq (xs, ys) =
  1031 fun gen_eq_set eq (xs, ys) =
  1037   equal_lists eq (xs, ys) orelse
  1032   eq_list eq (xs, ys) orelse
  1038     (gen_subset eq (xs, ys) andalso gen_subset (eq o swap) (ys, xs));
  1033     (gen_subset eq (xs, ys) andalso gen_subset (eq o swap) (ys, xs));
  1039 
  1034 
  1040 
  1035 
  1041 (*removing an element from a list WITHOUT duplicates*)
  1036 (*removing an element from a list WITHOUT duplicates*)
  1042 fun (y :: ys) \ x = if x = y then ys else y :: (ys \ x)
  1037 fun (y :: ys) \ x = if x = y then ys else y :: (ys \ x)