changeset 20348 | d59364649bcc |
parent 20137 | 6c04453ac1bd |
child 20443 | 84a624a8f773 |
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) |