# HG changeset patch # User haftmann # Date 1152716432 -7200 # Node ID 289050bdfff515cade232b3e82b48ccc97d0aaae # Parent 239a0efd38b28cccc065725159d5c1c51c4ab3ff added chop_prefix diff -r 239a0efd38b2 -r 289050bdfff5 src/Pure/library.ML --- a/src/Pure/library.ML Wed Jul 12 17:00:31 2006 +0200 +++ b/src/Pure/library.ML Wed Jul 12 17:00:32 2006 +0200 @@ -145,6 +145,7 @@ val equal_lists: ('a * 'b -> bool) -> 'a list * 'b list -> bool val is_prefix: ('a * 'a -> bool) -> 'a list -> 'a list -> bool val take_prefix: ('a -> bool) -> 'a list -> 'a list * 'a list + val chop_prefix: ('a * 'b -> bool) -> 'a list * 'b list -> 'a list * ('a list * 'b list) val take_suffix: ('a -> bool) -> 'a list -> 'a list * 'a list val prefixes1: 'a list -> 'a list list val prefixes: 'a list -> 'a list list @@ -751,6 +752,14 @@ if pred x then take(x :: rxs, xs) else (rev rxs, x :: xs) in take([], xs) end; +fun chop_prefix eq ([], ys) = ([], ([], ys)) + | chop_prefix eq (xs, []) = ([], (xs, [])) + | chop_prefix eq (xs as x::xs', ys as y::ys') = + if eq (x, y) then + let val (ps', xys'') = chop_prefix eq (xs', ys') + in (x::ps', xys'') end + else ([], (xs, ys)); + (* [x1, ..., xi, ..., xn] ---> ([x1, ..., xi], [x(i+1), ..., xn]) where xi is the last element that does not satisfy the predicate*) fun take_suffix _ [] = ([], [])