src/Pure/library.ML
changeset 18330 444f16d232a2
parent 18286 7273cf5085ed
child 18333 b356f7837921
--- a/src/Pure/library.ML	Thu Dec 01 22:43:15 2005 +0100
+++ b/src/Pure/library.ML	Fri Dec 02 08:06:59 2005 +0100
@@ -97,7 +97,6 @@
   val fold: ('a -> 'b -> 'b) -> 'a list -> 'b -> 'b
   val fold_rev: ('a -> 'b -> 'b) -> 'a list -> 'b -> 'b
   val fold_map: ('a -> 'b -> 'c * 'b) -> 'a list -> 'b -> 'c list * 'b
-  val fold2: ('a -> 'b -> 'c -> 'c) -> 'a list -> 'b list -> 'c -> 'c
   val fold_index: (int * 'a -> 'b -> 'b) -> 'a list -> 'b -> 'b
   val foldr1: ('a * 'a -> 'a) -> 'a list -> 'a
   val foldl_map: ('a * 'b -> 'a * 'c) -> 'a * 'b list -> 'a * 'c list
@@ -113,18 +112,16 @@
   val find_index_eq: ''a -> ''a list -> int
   val find_first: ('a -> bool) -> 'a list -> 'a option
   val get_first: ('a -> 'b option) -> 'a list -> 'b option
+  val map2: ('a -> 'b -> 'c) -> 'a list -> 'b list -> 'c list
+  val fold2: ('a -> 'b -> 'c -> 'c) -> 'a list -> 'b list -> 'c -> 'c
+  val ~~ : 'a list * 'b list -> ('a * 'b) list
+  val split_list: ('a * 'b) list -> 'a list * 'b list
   val separate: 'a -> 'a list -> 'a list
   val replicate: int -> 'a -> 'a list
   val multiply: 'a list -> 'a list list -> 'a list list
   val product: 'a list -> 'b list -> ('a * 'b) list
   val filter: ('a -> bool) -> 'a list -> 'a list
   val filter_out: ('a -> bool) -> 'a list -> 'a list
-  val map2: ('a * 'b -> 'c) -> 'a list * 'b list -> 'c list
-  val exists2: ('a * 'b -> bool) -> 'a list * 'b list -> bool
-  val forall2: ('a * 'b -> bool) -> 'a list * 'b list -> bool
-  val seq2: ('a * 'b -> unit) -> 'a list * 'b list -> unit
-  val ~~ : 'a list * 'b list -> ('a * 'b) list
-  val split_list: ('a * 'b) list -> 'a list * 'b list
   val equal_lists: ('a * 'b -> bool) -> 'a list * 'b list -> bool
   val prefix: ''a list * ''a list -> bool
   val take_prefix: ('a -> bool) -> 'a list -> 'a list * 'a list
@@ -467,13 +464,6 @@
       | fold_aux (x :: xs) y = fold_aux xs (f x y);
   in fold_aux end;
 
-fun fold2 f =
-  let
-    fun fold_aux [] [] z = z
-      | fold_aux (x :: xs) (y :: ys) z = fold_aux xs ys (f x y z)
-      | fold_aux _ _ _ = raise UnequalLengths;
-  in fold_aux end;
-
 fun fold_rev f =
   let
     fun fold_aux [] y = y
@@ -643,21 +633,17 @@
 
 exception UnequalLengths;
 
-fun map2 _ ([], []) = []
-  | map2 f (x :: xs, y :: ys) = f (x, y) :: map2 f (xs, ys)
-  | map2 _ _ = raise UnequalLengths;
-
-fun exists2 _ ([], []) = false
-  | exists2 pred (x :: xs, y :: ys) = pred (x, y) orelse exists2 pred (xs, ys)
-  | exists2 _ _ = raise UnequalLengths;
+fun map2 _ [] [] = []
+  | map2 f (x :: xs) (y :: ys) = f x y :: map2 f xs ys
+  | map2 _ _ _ = raise UnequalLengths;
 
-fun forall2 _ ([], []) = true
-  | forall2 pred (x :: xs, y :: ys) = pred (x, y) andalso forall2 pred (xs, ys)
-  | forall2 _ _ = raise UnequalLengths;
+fun fold2 f =
+  let
+    fun fold_aux [] [] z = z
+      | fold_aux (x :: xs) (y :: ys) z = fold_aux xs ys (f x y z)
+      | fold_aux _ _ _ = raise UnequalLengths;
+  in fold_aux end;
 
-fun seq2 _ ([], []) = ()
-  | seq2 f (x :: xs, y :: ys) = (f (x, y); seq2 f (xs, ys))
-  | seq2 _ _ = raise UnequalLengths;
 
 (*combine two lists forming a list of pairs:
   [x1, ..., xn] ~~ [y1, ..., yn]  ===>  [(x1, y1), ..., (xn, yn)]*)
@@ -669,7 +655,11 @@
   [(x1, y1), ..., (xn, yn)]  ===>  ([x1, ..., xn], [y1, ..., yn])*)
 val split_list = ListPair.unzip;
 
-fun equal_lists eq (xs, ys) = length xs = length ys andalso forall2 eq (xs, ys);
+fun equal_lists eq (xs, ys) =
+  let
+    fun eq' [] [] = true
+      | eq' (x :: xs) (y :: ys) = eq (x, y) andalso eq' xs ys
+  in length xs = length ys andalso eq' xs ys end;
 
 
 (* prefixes, suffixes *)