src/Pure/General/table.ML
changeset 15531 08c8dad8e399
parent 15160 394fb9b8908b
child 15570 8d8c70b41bab
equal deleted inserted replaced
15530:6f43714517ee 15531:08c8dad8e399
    87 
    87 
    88 fun dest tab = rev (foldl_table (fn (rev_ps, p) => p :: rev_ps) ([], tab));
    88 fun dest tab = rev (foldl_table (fn (rev_ps, p) => p :: rev_ps) ([], tab));
    89 fun keys tab = rev (foldl_table (fn (rev_ks, (k, _)) => k :: rev_ks) ([], tab));
    89 fun keys tab = rev (foldl_table (fn (rev_ks, (k, _)) => k :: rev_ks) ([], tab));
    90 fun exists P tab = foldl_table (fn (false, e) => P e | (b, _) => b) (false, tab);
    90 fun exists P tab = foldl_table (fn (false, e) => P e | (b, _) => b) (false, tab);
    91 
    91 
    92 fun min_key Empty = None
    92 fun min_key Empty = NONE
    93   | min_key (Branch2 (left, (k, _), _)) = Some (if_none (min_key left) k)
    93   | min_key (Branch2 (left, (k, _), _)) = SOME (if_none (min_key left) k)
    94   | min_key (Branch3 (left, (k, _), _, _, _)) = Some (if_none (min_key left) k);
    94   | min_key (Branch3 (left, (k, _), _, _, _)) = SOME (if_none (min_key left) k);
    95 
    95 
    96 fun max_key Empty = None
    96 fun max_key Empty = NONE
    97   | max_key (Branch2 (_, (k, _), right)) = Some (if_none (max_key right) k)
    97   | max_key (Branch2 (_, (k, _), right)) = SOME (if_none (max_key right) k)
    98   | max_key (Branch3 (_, _, _, (k,_), right)) = Some (if_none (max_key right) k);
    98   | max_key (Branch3 (_, _, _, (k,_), right)) = SOME (if_none (max_key right) k);
    99 
    99 
   100 (* lookup *)
   100 (* lookup *)
   101 
   101 
   102 fun lookup (Empty, _) = None
   102 fun lookup (Empty, _) = NONE
   103   | lookup (Branch2 (left, (k, x), right), key) =
   103   | lookup (Branch2 (left, (k, x), right), key) =
   104       (case Key.ord (key, k) of
   104       (case Key.ord (key, k) of
   105         LESS => lookup (left, key)
   105         LESS => lookup (left, key)
   106       | EQUAL => Some x
   106       | EQUAL => SOME x
   107       | GREATER => lookup (right, key))
   107       | GREATER => lookup (right, key))
   108   | lookup (Branch3 (left, (k1, x1), mid, (k2, x2), right), key) =
   108   | lookup (Branch3 (left, (k1, x1), mid, (k2, x2), right), key) =
   109       (case Key.ord (key, k1) of
   109       (case Key.ord (key, k1) of
   110         LESS => lookup (left, key)
   110         LESS => lookup (left, key)
   111       | EQUAL => Some x1
   111       | EQUAL => SOME x1
   112       | GREATER =>
   112       | GREATER =>
   113           (case Key.ord (key, k2) of
   113           (case Key.ord (key, k2) of
   114             LESS => lookup (mid, key)
   114             LESS => lookup (mid, key)
   115           | EQUAL => Some x2
   115           | EQUAL => SOME x2
   116           | GREATER => lookup (right, key)));
   116           | GREATER => lookup (right, key)));
   117 
   117 
   118 
   118 
   119 (* update *)
   119 (* update *)
   120 
   120 
   173 
   173 
   174 fun extend (table, pairs) =
   174 fun extend (table, pairs) =
   175   let
   175   let
   176     fun add ((tab, dups), (key, x)) =
   176     fun add ((tab, dups), (key, x)) =
   177       (case lookup (tab, key) of
   177       (case lookup (tab, key) of
   178         None => (update ((key, x), tab), dups)
   178         NONE => (update ((key, x), tab), dups)
   179       | _ => (tab, key :: dups));
   179       | _ => (tab, key :: dups));
   180   in
   180   in
   181     (case foldl add ((table, []), pairs) of
   181     (case foldl add ((table, []), pairs) of
   182       (table', []) => table'
   182       (table', []) => table'
   183     | (_, dups) => raise DUPS (rev dups))
   183     | (_, dups) => raise DUPS (rev dups))
   186 fun make pairs = extend (empty, pairs);
   186 fun make pairs = extend (empty, pairs);
   187 
   187 
   188 
   188 
   189 (* delete *)
   189 (* delete *)
   190 
   190 
   191 fun compare' None (k2, _) = LESS
   191 fun compare' NONE (k2, _) = LESS
   192   | compare' (Some k1) (k2, _) = Key.ord (k1, k2);
   192   | compare' (SOME k1) (k2, _) = Key.ord (k1, k2);
   193 
   193 
   194 fun if_eq EQUAL x y = x
   194 fun if_eq EQUAL x y = x
   195   | if_eq _ x y = y;
   195   | if_eq _ x y = y;
   196 
   196 
   197 exception UNDEF of key;
   197 exception UNDEF of key;
   198 
   198 
   199 fun del (Some k) Empty = raise UNDEF k
   199 fun del (SOME k) Empty = raise UNDEF k
   200   | del None (Branch2 (Empty, p, Empty)) = (p, (true, Empty))
   200   | del NONE (Branch2 (Empty, p, Empty)) = (p, (true, Empty))
   201   | del None (Branch3 (Empty, p, Empty, q, Empty)) =
   201   | del NONE (Branch3 (Empty, p, Empty, q, Empty)) =
   202       (p, (false, Branch2 (Empty, q, Empty)))
   202       (p, (false, Branch2 (Empty, q, Empty)))
   203   | del k (Branch2 (Empty, p, Empty)) = (case compare' k p of
   203   | del k (Branch2 (Empty, p, Empty)) = (case compare' k p of
   204       EQUAL => (p, (true, Empty)) | _ => raise UNDEF (the k))
   204       EQUAL => (p, (true, Empty)) | _ => raise UNDEF (the k))
   205   | del k (Branch3 (Empty, p, Empty, q, Empty)) = (case compare' k p of
   205   | del k (Branch3 (Empty, p, Empty, q, Empty)) = (case compare' k p of
   206       EQUAL => (p, (false, Branch2 (Empty, q, Empty)))
   206       EQUAL => (p, (false, Branch2 (Empty, q, Empty)))
   213       | (p', (true, l')) => (p', case r of
   213       | (p', (true, l')) => (p', case r of
   214           Branch2 (rl, rp, rr) =>
   214           Branch2 (rl, rp, rr) =>
   215             (true, Branch3 (l', p, rl, rp, rr))
   215             (true, Branch3 (l', p, rl, rp, rr))
   216         | Branch3 (rl, rp, rm, rq, rr) => (false, Branch2
   216         | Branch3 (rl, rp, rm, rq, rr) => (false, Branch2
   217             (Branch2 (l', p, rl), rp, Branch2 (rm, rq, rr)))))
   217             (Branch2 (l', p, rl), rp, Branch2 (rm, rq, rr)))))
   218     | ord => (case del (if_eq ord None k) r of
   218     | ord => (case del (if_eq ord NONE k) r of
   219         (p', (false, r')) => (p', (false, Branch2 (l, if_eq ord p' p, r')))
   219         (p', (false, r')) => (p', (false, Branch2 (l, if_eq ord p' p, r')))
   220       | (p', (true, r')) => (p', case l of
   220       | (p', (true, r')) => (p', case l of
   221           Branch2 (ll, lp, lr) =>
   221           Branch2 (ll, lp, lr) =>
   222             (true, Branch3 (ll, lp, lr, if_eq ord p' p, r'))
   222             (true, Branch3 (ll, lp, lr, if_eq ord p' p, r'))
   223         | Branch3 (ll, lp, lm, lq, lr) => (false, Branch2
   223         | Branch3 (ll, lp, lm, lq, lr) => (false, Branch2
   232           | (Branch3 (ml, mp, mm, mq, mr), _) =>
   232           | (Branch3 (ml, mp, mm, mq, mr), _) =>
   233               Branch3 (Branch2 (l', p, ml), mp, Branch2 (mm, mq, mr), q, r)
   233               Branch3 (Branch2 (l', p, ml), mp, Branch2 (mm, mq, mr), q, r)
   234           | (Branch2 (ml, mp, mr), Branch3 (rl, rp, rm, rq, rr)) =>
   234           | (Branch2 (ml, mp, mr), Branch3 (rl, rp, rm, rq, rr)) =>
   235               Branch3 (Branch2 (l', p, ml), mp, Branch2 (mr, q, rl), rp,
   235               Branch3 (Branch2 (l', p, ml), mp, Branch2 (mr, q, rl), rp,
   236                 Branch2 (rm, rq, rr)))))
   236                 Branch2 (rm, rq, rr)))))
   237       | ord => (case del (if_eq ord None k) m of
   237       | ord => (case del (if_eq ord NONE k) m of
   238           (p', (false, m')) =>
   238           (p', (false, m')) =>
   239             (p', (false, Branch3 (l, if_eq ord p' p, m', q, r)))
   239             (p', (false, Branch3 (l, if_eq ord p' p, m', q, r)))
   240         | (p', (true, m')) => (p', (false, case (l, r) of
   240         | (p', (true, m')) => (p', (false, case (l, r) of
   241             (Branch2 (ll, lp, lr), Branch2 _) =>
   241             (Branch2 (ll, lp, lr), Branch2 _) =>
   242               Branch2 (Branch3 (ll, lp, lr, if_eq ord p' p, m'), q, r)
   242               Branch2 (Branch3 (ll, lp, lr, if_eq ord p' p, m'), q, r)
   244               Branch3 (Branch2 (ll, lp, lm), lq,
   244               Branch3 (Branch2 (ll, lp, lm), lq,
   245                 Branch2 (lr, if_eq ord p' p, m'), q, r)
   245                 Branch2 (lr, if_eq ord p' p, m'), q, r)
   246           | (_, Branch3 (rl, rp, rm, rq, rr)) =>
   246           | (_, Branch3 (rl, rp, rm, rq, rr)) =>
   247               Branch3 (l, if_eq ord p' p, Branch2 (m', q, rl), rp,
   247               Branch3 (l, if_eq ord p' p, Branch2 (m', q, rl), rp,
   248                 Branch2 (rm, rq, rr))))))
   248                 Branch2 (rm, rq, rr))))))
   249     | ord => (case del (if_eq ord None k) r of
   249     | ord => (case del (if_eq ord NONE k) r of
   250         (q', (false, r')) =>
   250         (q', (false, r')) =>
   251           (q', (false, Branch3 (l, p, m, if_eq ord q' q, r')))
   251           (q', (false, Branch3 (l, p, m, if_eq ord q' q, r')))
   252       | (q', (true, r')) => (q', (false, case (l, m) of
   252       | (q', (true, r')) => (q', (false, case (l, m) of
   253           (Branch2 _, Branch2 (ml, mp, mr)) =>
   253           (Branch2 _, Branch2 (ml, mp, mr)) =>
   254             Branch2 (l, p, Branch3 (ml, mp, mr, if_eq ord q' q, r'))
   254             Branch2 (l, p, Branch3 (ml, mp, mr, if_eq ord q' q, r'))
   257               Branch2 (mr, if_eq ord q' q, r'))
   257               Branch2 (mr, if_eq ord q' q, r'))
   258         | (Branch3 (ll, lp, lm, lq, lr), Branch2 (ml, mp, mr)) =>
   258         | (Branch3 (ll, lp, lm, lq, lr), Branch2 (ml, mp, mr)) =>
   259             Branch3 (Branch2 (ll, lp, lm), lq, Branch2 (lr, p, ml), mp,
   259             Branch3 (Branch2 (ll, lp, lm), lq, Branch2 (lr, p, ml), mp,
   260               Branch2 (mr, if_eq ord q' q, r'))))));
   260               Branch2 (mr, if_eq ord q' q, r'))))));
   261 
   261 
   262 fun delete k t = snd (snd (del (Some k) t));
   262 fun delete k t = snd (snd (del (SOME k) t));
   263 
   263 
   264 
   264 
   265 (* join and merge *)
   265 (* join and merge *)
   266 
   266 
   267 fun join f (table1, table2) =
   267 fun join f (table1, table2) =
   268   let
   268   let
   269     fun add ((tab, dups), (key, x)) =
   269     fun add ((tab, dups), (key, x)) =
   270       (case lookup (tab, key) of
   270       (case lookup (tab, key) of
   271         None => (update ((key, x), tab), dups)
   271         NONE => (update ((key, x), tab), dups)
   272       | Some y =>
   272       | SOME y =>
   273           (case f (y, x) of
   273           (case f (y, x) of
   274             Some z => (update ((key, z), tab), dups)
   274             SOME z => (update ((key, z), tab), dups)
   275           | None => (tab, key :: dups)));
   275           | NONE => (tab, key :: dups)));
   276   in
   276   in
   277     (case foldl_table add ((table1, []), table2) of
   277     (case foldl_table add ((table1, []), table2) of
   278       (table', []) => table'
   278       (table', []) => table'
   279     | (_, dups) => raise DUPS (rev dups))
   279     | (_, dups) => raise DUPS (rev dups))
   280   end;
   280   end;
   281 
   281 
   282 fun merge eq tabs = join (fn (y, x) => if eq (y, x) then Some y else None) tabs;
   282 fun merge eq tabs = join (fn (y, x) => if eq (y, x) then SOME y else NONE) tabs;
   283 
   283 
   284 
   284 
   285 (* tables with multiple entries per key (preserving order) *)
   285 (* tables with multiple entries per key (preserving order) *)
   286 
   286 
   287 fun lookup_multi tab_key = if_none (lookup tab_key) [];
   287 fun lookup_multi tab_key = if_none (lookup tab_key) [];
   288 fun update_multi ((key, x), tab) = update ((key, x :: lookup_multi (tab, key)), tab);
   288 fun update_multi ((key, x), tab) = update ((key, x :: lookup_multi (tab, key)), tab);
   289 
   289 
   290 fun make_multi pairs = foldr update_multi (pairs, empty);
   290 fun make_multi pairs = foldr update_multi (pairs, empty);
   291 fun dest_multi tab = flat (map (fn (key, xs) => map (Library.pair key) xs) (dest tab));
   291 fun dest_multi tab = flat (map (fn (key, xs) => map (Library.pair key) xs) (dest tab));
   292 fun merge_multi eq tabs = join (fn (xs, xs') => Some (gen_merge_lists eq xs xs')) tabs;
   292 fun merge_multi eq tabs = join (fn (xs, xs') => SOME (gen_merge_lists eq xs xs')) tabs;
   293 fun merge_multi' eq tabs = join (fn (xs, xs') => Some (gen_merge_lists' eq xs xs')) tabs;
   293 fun merge_multi' eq tabs = join (fn (xs, xs') => SOME (gen_merge_lists' eq xs xs')) tabs;
   294 
   294 
   295 
   295 
   296 (*final declarations of this structure!*)
   296 (*final declarations of this structure!*)
   297 val map = map_table;
   297 val map = map_table;
   298 val foldl = foldl_table;
   298 val foldl = foldl_table;