src/Pure/General/ord_list.ML
author wenzelm
Sat, 18 Jun 2005 22:47:44 +0200
changeset 16467 287514d81763
parent 16464 db2711d07cd8
child 16468 452cd9ad3eda
permissions -rw-r--r--
tuned remove;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
16464
db2711d07cd8 Ordered lists without duplicates.
wenzelm
parents:
diff changeset
     1
(*  Title:      Pure/General/ord_list.ML
db2711d07cd8 Ordered lists without duplicates.
wenzelm
parents:
diff changeset
     2
    ID:         $Id$
db2711d07cd8 Ordered lists without duplicates.
wenzelm
parents:
diff changeset
     3
    Author:     Makarius
db2711d07cd8 Ordered lists without duplicates.
wenzelm
parents:
diff changeset
     4
db2711d07cd8 Ordered lists without duplicates.
wenzelm
parents:
diff changeset
     5
Ordered lists without duplicates -- a light-weight representation of
db2711d07cd8 Ordered lists without duplicates.
wenzelm
parents:
diff changeset
     6
finite sets.
db2711d07cd8 Ordered lists without duplicates.
wenzelm
parents:
diff changeset
     7
*)
db2711d07cd8 Ordered lists without duplicates.
wenzelm
parents:
diff changeset
     8
db2711d07cd8 Ordered lists without duplicates.
wenzelm
parents:
diff changeset
     9
signature ORD_LIST =
db2711d07cd8 Ordered lists without duplicates.
wenzelm
parents:
diff changeset
    10
sig
db2711d07cd8 Ordered lists without duplicates.
wenzelm
parents:
diff changeset
    11
  val member: ('b * 'a -> order) -> 'a list -> 'b -> bool
db2711d07cd8 Ordered lists without duplicates.
wenzelm
parents:
diff changeset
    12
  val insert: ('a * 'a -> order) -> 'a -> 'a list -> 'a list
db2711d07cd8 Ordered lists without duplicates.
wenzelm
parents:
diff changeset
    13
  val remove: ('b * 'a -> order) -> 'b -> 'a list -> 'a list
db2711d07cd8 Ordered lists without duplicates.
wenzelm
parents:
diff changeset
    14
  val union: ('a * 'a -> order) -> 'a list -> 'a list -> 'a list
db2711d07cd8 Ordered lists without duplicates.
wenzelm
parents:
diff changeset
    15
  val inter: ('a * 'a -> order) -> 'a list -> 'a list -> 'a list
db2711d07cd8 Ordered lists without duplicates.
wenzelm
parents:
diff changeset
    16
end;
db2711d07cd8 Ordered lists without duplicates.
wenzelm
parents:
diff changeset
    17
db2711d07cd8 Ordered lists without duplicates.
wenzelm
parents:
diff changeset
    18
structure OrdList: ORD_LIST =
db2711d07cd8 Ordered lists without duplicates.
wenzelm
parents:
diff changeset
    19
struct
db2711d07cd8 Ordered lists without duplicates.
wenzelm
parents:
diff changeset
    20
db2711d07cd8 Ordered lists without duplicates.
wenzelm
parents:
diff changeset
    21
fun member ord list x =
db2711d07cd8 Ordered lists without duplicates.
wenzelm
parents:
diff changeset
    22
  let
db2711d07cd8 Ordered lists without duplicates.
wenzelm
parents:
diff changeset
    23
    fun memb [] = false
db2711d07cd8 Ordered lists without duplicates.
wenzelm
parents:
diff changeset
    24
      | memb (y :: ys) =
db2711d07cd8 Ordered lists without duplicates.
wenzelm
parents:
diff changeset
    25
          (case ord (x, y) of
db2711d07cd8 Ordered lists without duplicates.
wenzelm
parents:
diff changeset
    26
            LESS => false
db2711d07cd8 Ordered lists without duplicates.
wenzelm
parents:
diff changeset
    27
          | EQUAL => true
db2711d07cd8 Ordered lists without duplicates.
wenzelm
parents:
diff changeset
    28
          | GREATER => memb ys);
db2711d07cd8 Ordered lists without duplicates.
wenzelm
parents:
diff changeset
    29
  in memb list end;
db2711d07cd8 Ordered lists without duplicates.
wenzelm
parents:
diff changeset
    30
db2711d07cd8 Ordered lists without duplicates.
wenzelm
parents:
diff changeset
    31
exception SAME;
db2711d07cd8 Ordered lists without duplicates.
wenzelm
parents:
diff changeset
    32
db2711d07cd8 Ordered lists without duplicates.
wenzelm
parents:
diff changeset
    33
fun insert ord x list =
db2711d07cd8 Ordered lists without duplicates.
wenzelm
parents:
diff changeset
    34
  let
db2711d07cd8 Ordered lists without duplicates.
wenzelm
parents:
diff changeset
    35
    fun insrt [] = [x]
db2711d07cd8 Ordered lists without duplicates.
wenzelm
parents:
diff changeset
    36
      | insrt (lst as y :: ys) =
db2711d07cd8 Ordered lists without duplicates.
wenzelm
parents:
diff changeset
    37
          (case ord (x, y) of
db2711d07cd8 Ordered lists without duplicates.
wenzelm
parents:
diff changeset
    38
            LESS => x :: lst
db2711d07cd8 Ordered lists without duplicates.
wenzelm
parents:
diff changeset
    39
          | EQUAL => raise SAME
db2711d07cd8 Ordered lists without duplicates.
wenzelm
parents:
diff changeset
    40
          | GREATER => y :: insrt ys);
db2711d07cd8 Ordered lists without duplicates.
wenzelm
parents:
diff changeset
    41
  in insrt list handle SAME => list end;
db2711d07cd8 Ordered lists without duplicates.
wenzelm
parents:
diff changeset
    42
db2711d07cd8 Ordered lists without duplicates.
wenzelm
parents:
diff changeset
    43
fun remove ord x list =
db2711d07cd8 Ordered lists without duplicates.
wenzelm
parents:
diff changeset
    44
  let
16467
287514d81763 tuned remove;
wenzelm
parents: 16464
diff changeset
    45
    fun rmove [] = raise SAME
16464
db2711d07cd8 Ordered lists without duplicates.
wenzelm
parents:
diff changeset
    46
      | rmove (lst as y :: ys) =
db2711d07cd8 Ordered lists without duplicates.
wenzelm
parents:
diff changeset
    47
          (case ord (x, y) of
db2711d07cd8 Ordered lists without duplicates.
wenzelm
parents:
diff changeset
    48
            LESS => raise SAME
db2711d07cd8 Ordered lists without duplicates.
wenzelm
parents:
diff changeset
    49
          | EQUAL => ys
db2711d07cd8 Ordered lists without duplicates.
wenzelm
parents:
diff changeset
    50
          | GREATER => y :: rmove ys);
db2711d07cd8 Ordered lists without duplicates.
wenzelm
parents:
diff changeset
    51
  in rmove list handle SAME => list end;
db2711d07cd8 Ordered lists without duplicates.
wenzelm
parents:
diff changeset
    52
db2711d07cd8 Ordered lists without duplicates.
wenzelm
parents:
diff changeset
    53
nonfix union;
db2711d07cd8 Ordered lists without duplicates.
wenzelm
parents:
diff changeset
    54
fun union _ xs [] = xs
db2711d07cd8 Ordered lists without duplicates.
wenzelm
parents:
diff changeset
    55
  | union _ [] ys = ys
db2711d07cd8 Ordered lists without duplicates.
wenzelm
parents:
diff changeset
    56
  | union ord (lst1 as x :: xs) (lst2 as y :: ys) =
db2711d07cd8 Ordered lists without duplicates.
wenzelm
parents:
diff changeset
    57
      (case ord (x, y) of
db2711d07cd8 Ordered lists without duplicates.
wenzelm
parents:
diff changeset
    58
        LESS => x :: union ord xs lst2
db2711d07cd8 Ordered lists without duplicates.
wenzelm
parents:
diff changeset
    59
      | EQUAL => x :: union ord xs ys
db2711d07cd8 Ordered lists without duplicates.
wenzelm
parents:
diff changeset
    60
      | GREATER => y :: union ord lst1 ys);
db2711d07cd8 Ordered lists without duplicates.
wenzelm
parents:
diff changeset
    61
db2711d07cd8 Ordered lists without duplicates.
wenzelm
parents:
diff changeset
    62
nonfix inter;
db2711d07cd8 Ordered lists without duplicates.
wenzelm
parents:
diff changeset
    63
fun inter _ _ [] = []
db2711d07cd8 Ordered lists without duplicates.
wenzelm
parents:
diff changeset
    64
  | inter _ [] _ = []
db2711d07cd8 Ordered lists without duplicates.
wenzelm
parents:
diff changeset
    65
  | inter ord (lst1 as x :: xs) (lst2 as y :: ys) =
db2711d07cd8 Ordered lists without duplicates.
wenzelm
parents:
diff changeset
    66
      (case ord (x, y) of
db2711d07cd8 Ordered lists without duplicates.
wenzelm
parents:
diff changeset
    67
        LESS => inter ord xs lst2
db2711d07cd8 Ordered lists without duplicates.
wenzelm
parents:
diff changeset
    68
      | EQUAL => x :: inter ord xs ys
db2711d07cd8 Ordered lists without duplicates.
wenzelm
parents:
diff changeset
    69
      | GREATER => inter ord lst1 ys);
db2711d07cd8 Ordered lists without duplicates.
wenzelm
parents:
diff changeset
    70
db2711d07cd8 Ordered lists without duplicates.
wenzelm
parents:
diff changeset
    71
end;