| author | wenzelm | 
| Fri, 07 Mar 2014 20:46:27 +0100 | |
| changeset 55987 | 52c22561996d | 
| parent 55741 | b969263fcf02 | 
| child 59058 | a78612c67ec0 | 
| permissions | -rw-r--r-- | 
| 30559 
e5987a7ac5df
turned structure NetRules into general Item_Net, which is loaded earlier;
 wenzelm parents: 
29606diff
changeset | 1 | (* Title: Pure/item_net.ML | 
| 8298 | 2 | Author: Markus Wenzel, TU Muenchen | 
| 3 | ||
| 30559 
e5987a7ac5df
turned structure NetRules into general Item_Net, which is loaded earlier;
 wenzelm parents: 
29606diff
changeset | 4 | Efficient storage of items indexed by terms; preserves order and | 
| 
e5987a7ac5df
turned structure NetRules into general Item_Net, which is loaded earlier;
 wenzelm parents: 
29606diff
changeset | 5 | prefers later entries. | 
| 8298 | 6 | *) | 
| 7 | ||
| 30559 
e5987a7ac5df
turned structure NetRules into general Item_Net, which is loaded earlier;
 wenzelm parents: 
29606diff
changeset | 8 | signature ITEM_NET = | 
| 8298 | 9 | sig | 
| 10 | type 'a T | |
| 33372 | 11 |   val init: ('a * 'a -> bool) -> ('a -> term list) -> 'a T
 | 
| 30559 
e5987a7ac5df
turned structure NetRules into general Item_Net, which is loaded earlier;
 wenzelm parents: 
29606diff
changeset | 12 | val content: 'a T -> 'a list | 
| 42810 
2425068fe13a
slightly more efficient claset operations, using Item_Net to maintain rules in canonical order;
 wenzelm parents: 
36296diff
changeset | 13 | val length: 'a T -> int | 
| 11776 | 14 | val retrieve: 'a T -> term -> 'a list | 
| 53941 
54874871aa06
Added Item_Net.retrieve_matching
 lammich <lammich@in.tum.de> parents: 
42810diff
changeset | 15 | val retrieve_matching: 'a T -> term -> 'a list | 
| 36296 
5cc547abd995
Item_Net/Named_Thms: export efficient member operation;
 wenzelm parents: 
33721diff
changeset | 16 | val member: 'a T -> 'a -> bool | 
| 8298 | 17 | val merge: 'a T * 'a T -> 'a T | 
| 33372 | 18 | val remove: 'a -> 'a T -> 'a T | 
| 19 | val update: 'a -> 'a T -> 'a T | |
| 8298 | 20 | end; | 
| 21 | ||
| 30559 
e5987a7ac5df
turned structure NetRules into general Item_Net, which is loaded earlier;
 wenzelm parents: 
29606diff
changeset | 22 | structure Item_Net: ITEM_NET = | 
| 8298 | 23 | struct | 
| 24 | ||
| 30559 
e5987a7ac5df
turned structure NetRules into general Item_Net, which is loaded earlier;
 wenzelm parents: 
29606diff
changeset | 25 | (* datatype *) | 
| 8298 | 26 | |
| 27 | datatype 'a T = | |
| 30559 
e5987a7ac5df
turned structure NetRules into general Item_Net, which is loaded earlier;
 wenzelm parents: 
29606diff
changeset | 28 |   Items of {
 | 
| 8298 | 29 | eq: 'a * 'a -> bool, | 
| 33372 | 30 | index: 'a -> term list, | 
| 30559 
e5987a7ac5df
turned structure NetRules into general Item_Net, which is loaded earlier;
 wenzelm parents: 
29606diff
changeset | 31 | content: 'a list, | 
| 8298 | 32 | next: int, | 
| 12385 | 33 | net: (int * 'a) Net.net}; | 
| 8298 | 34 | |
| 30559 
e5987a7ac5df
turned structure NetRules into general Item_Net, which is loaded earlier;
 wenzelm parents: 
29606diff
changeset | 35 | fun mk_items eq index content next net = | 
| 
e5987a7ac5df
turned structure NetRules into general Item_Net, which is loaded earlier;
 wenzelm parents: 
29606diff
changeset | 36 |   Items {eq = eq, index = index, content = content, next = next, net = net};
 | 
| 8298 | 37 | |
| 33372 | 38 | fun init eq index = mk_items eq index [] ~1 Net.empty; | 
| 39 | ||
| 30559 
e5987a7ac5df
turned structure NetRules into general Item_Net, which is loaded earlier;
 wenzelm parents: 
29606diff
changeset | 40 | fun content (Items {content, ...}) = content;
 | 
| 42810 
2425068fe13a
slightly more efficient claset operations, using Item_Net to maintain rules in canonical order;
 wenzelm parents: 
36296diff
changeset | 41 | fun length items = List.length (content items); | 
| 30559 
e5987a7ac5df
turned structure NetRules into general Item_Net, which is loaded earlier;
 wenzelm parents: 
29606diff
changeset | 42 | fun retrieve (Items {net, ...}) = order_list o Net.unify_term net;
 | 
| 53941 
54874871aa06
Added Item_Net.retrieve_matching
 lammich <lammich@in.tum.de> parents: 
42810diff
changeset | 43 | fun retrieve_matching (Items {net, ...}) = order_list o Net.match_term net;
 | 
| 8298 | 44 | |
| 45 | ||
| 33372 | 46 | (* standard operations *) | 
| 8298 | 47 | |
| 33721 
f15c9ded9676
member/cons: slightly more correct treatment of multi-index, notably empty one;
 wenzelm parents: 
33372diff
changeset | 48 | fun member (Items {eq, index, content, net, ...}) x =
 | 
| 
f15c9ded9676
member/cons: slightly more correct treatment of multi-index, notably empty one;
 wenzelm parents: 
33372diff
changeset | 49 | (case index x of | 
| 
f15c9ded9676
member/cons: slightly more correct treatment of multi-index, notably empty one;
 wenzelm parents: 
33372diff
changeset | 50 | [] => Library.member eq content x | 
| 
f15c9ded9676
member/cons: slightly more correct treatment of multi-index, notably empty one;
 wenzelm parents: 
33372diff
changeset | 51 | | t :: _ => exists (fn (_, y) => eq (x, y)) (Net.unify_term net t)); | 
| 8298 | 52 | |
| 33372 | 53 | fun cons x (Items {eq, index, content, next, net}) =
 | 
| 30559 
e5987a7ac5df
turned structure NetRules into general Item_Net, which is loaded earlier;
 wenzelm parents: 
29606diff
changeset | 54 | mk_items eq index (x :: content) (next - 1) | 
| 33721 
f15c9ded9676
member/cons: slightly more correct treatment of multi-index, notably empty one;
 wenzelm parents: 
33372diff
changeset | 55 | (fold (fn t => Net.insert_term (K false) (t, (next, x))) (index x) net); | 
| 33372 | 56 | |
| 55741 
b969263fcf02
optimize special case according to Library.merge (see also 8fbc355100f2);
 wenzelm parents: 
53941diff
changeset | 57 | fun merge | 
| 
b969263fcf02
optimize special case according to Library.merge (see also 8fbc355100f2);
 wenzelm parents: 
53941diff
changeset | 58 |     (items1 as Items {net = net1, ...},
 | 
| 
b969263fcf02
optimize special case according to Library.merge (see also 8fbc355100f2);
 wenzelm parents: 
53941diff
changeset | 59 |      items2 as Items {net = net2, content = content2, ...}) =
 | 
| 
b969263fcf02
optimize special case according to Library.merge (see also 8fbc355100f2);
 wenzelm parents: 
53941diff
changeset | 60 | if pointer_eq (net1, net2) then items1 | 
| 
b969263fcf02
optimize special case according to Library.merge (see also 8fbc355100f2);
 wenzelm parents: 
53941diff
changeset | 61 | else if Net.is_empty net1 then items2 | 
| 
b969263fcf02
optimize special case according to Library.merge (see also 8fbc355100f2);
 wenzelm parents: 
53941diff
changeset | 62 | else fold_rev (fn y => if member items1 y then I else cons y) content2 items1; | 
| 8298 | 63 | |
| 33372 | 64 | fun remove x (items as Items {eq, index, content, next, net}) =
 | 
| 65 | if member items x then | |
| 66 | mk_items eq index (Library.remove eq x content) next | |
| 67 | (fold (fn t => Net.delete_term_safe (eq o pairself #2) (t, (0, x))) (index x) net) | |
| 68 | else items; | |
| 8298 | 69 | |
| 33372 | 70 | fun update x items = cons x (remove x items); | 
| 8298 | 71 | |
| 72 | end; |