| author | wenzelm | 
| Sun, 24 Mar 2024 19:14:56 +0100 | |
| changeset 79980 | ee04ce2ac13f | 
| parent 68126 | 5da8b97d9183 | 
| 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
 | 
| 68126 
5da8b97d9183
proper merge of items without term index (amending b969263fcf02);
 wenzelm parents: 
62165diff
changeset | 12 | val is_empty: 'a T -> bool | 
| 30559 
e5987a7ac5df
turned structure NetRules into general Item_Net, which is loaded earlier;
 wenzelm parents: 
29606diff
changeset | 13 | 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 | 14 | val length: 'a T -> int | 
| 11776 | 15 | val retrieve: 'a T -> term -> 'a list | 
| 53941 
54874871aa06
Added Item_Net.retrieve_matching
 lammich <lammich@in.tum.de> parents: 
42810diff
changeset | 16 | val retrieve_matching: 'a T -> term -> 'a list | 
| 36296 
5cc547abd995
Item_Net/Named_Thms: export efficient member operation;
 wenzelm parents: 
33721diff
changeset | 17 | val member: 'a T -> 'a -> bool | 
| 60946 | 18 | val lookup: 'a T -> 'a -> 'a list | 
| 8298 | 19 | val merge: 'a T * 'a T -> 'a T | 
| 33372 | 20 | val remove: 'a -> 'a T -> 'a T | 
| 21 | val update: 'a -> 'a T -> 'a T | |
| 62165 | 22 |   val filter: ('a -> bool) -> 'a T -> 'a T
 | 
| 8298 | 23 | end; | 
| 24 | ||
| 30559 
e5987a7ac5df
turned structure NetRules into general Item_Net, which is loaded earlier;
 wenzelm parents: 
29606diff
changeset | 25 | structure Item_Net: ITEM_NET = | 
| 8298 | 26 | struct | 
| 27 | ||
| 30559 
e5987a7ac5df
turned structure NetRules into general Item_Net, which is loaded earlier;
 wenzelm parents: 
29606diff
changeset | 28 | (* datatype *) | 
| 8298 | 29 | |
| 30 | datatype 'a T = | |
| 30559 
e5987a7ac5df
turned structure NetRules into general Item_Net, which is loaded earlier;
 wenzelm parents: 
29606diff
changeset | 31 |   Items of {
 | 
| 8298 | 32 | eq: 'a * 'a -> bool, | 
| 33372 | 33 | index: 'a -> term list, | 
| 30559 
e5987a7ac5df
turned structure NetRules into general Item_Net, which is loaded earlier;
 wenzelm parents: 
29606diff
changeset | 34 | content: 'a list, | 
| 8298 | 35 | next: int, | 
| 12385 | 36 | net: (int * 'a) Net.net}; | 
| 8298 | 37 | |
| 30559 
e5987a7ac5df
turned structure NetRules into general Item_Net, which is loaded earlier;
 wenzelm parents: 
29606diff
changeset | 38 | fun mk_items eq index content next net = | 
| 
e5987a7ac5df
turned structure NetRules into general Item_Net, which is loaded earlier;
 wenzelm parents: 
29606diff
changeset | 39 |   Items {eq = eq, index = index, content = content, next = next, net = net};
 | 
| 8298 | 40 | |
| 33372 | 41 | fun init eq index = mk_items eq index [] ~1 Net.empty; | 
| 68126 
5da8b97d9183
proper merge of items without term index (amending b969263fcf02);
 wenzelm parents: 
62165diff
changeset | 42 | fun is_empty (Items {content, ...}) = null content;
 | 
| 33372 | 43 | |
| 30559 
e5987a7ac5df
turned structure NetRules into general Item_Net, which is loaded earlier;
 wenzelm parents: 
29606diff
changeset | 44 | 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 | 45 | fun length items = List.length (content items); | 
| 30559 
e5987a7ac5df
turned structure NetRules into general Item_Net, which is loaded earlier;
 wenzelm parents: 
29606diff
changeset | 46 | 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 | 47 | fun retrieve_matching (Items {net, ...}) = order_list o Net.match_term net;
 | 
| 8298 | 48 | |
| 49 | ||
| 33372 | 50 | (* standard operations *) | 
| 8298 | 51 | |
| 33721 
f15c9ded9676
member/cons: slightly more correct treatment of multi-index, notably empty one;
 wenzelm parents: 
33372diff
changeset | 52 | 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 | 53 | (case index x of | 
| 
f15c9ded9676
member/cons: slightly more correct treatment of multi-index, notably empty one;
 wenzelm parents: 
33372diff
changeset | 54 | [] => Library.member eq content x | 
| 
f15c9ded9676
member/cons: slightly more correct treatment of multi-index, notably empty one;
 wenzelm parents: 
33372diff
changeset | 55 | | t :: _ => exists (fn (_, y) => eq (x, y)) (Net.unify_term net t)); | 
| 8298 | 56 | |
| 60946 | 57 | fun lookup (Items {eq, index, content, net, ...}) x =
 | 
| 58 | (case index x of | |
| 59 | [] => content | |
| 60 | | t :: _ => map #2 (Net.unify_term net t)) | |
| 61 | |> filter (fn y => eq (x, y)); | |
| 62 | ||
| 33372 | 63 | 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 | 64 | 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 | 65 | (fold (fn t => Net.insert_term (K false) (t, (next, x))) (index x) net); | 
| 33372 | 66 | |
| 68126 
5da8b97d9183
proper merge of items without term index (amending b969263fcf02);
 wenzelm parents: 
62165diff
changeset | 67 | fun merge (items1, items2) = | 
| 
5da8b97d9183
proper merge of items without term index (amending b969263fcf02);
 wenzelm parents: 
62165diff
changeset | 68 | if pointer_eq (items1, items2) then items1 | 
| 
5da8b97d9183
proper merge of items without term index (amending b969263fcf02);
 wenzelm parents: 
62165diff
changeset | 69 | else if is_empty items1 then items2 | 
| 
5da8b97d9183
proper merge of items without term index (amending b969263fcf02);
 wenzelm parents: 
62165diff
changeset | 70 | else fold_rev (fn y => if member items1 y then I else cons y) (content items2) items1; | 
| 8298 | 71 | |
| 33372 | 72 | fun remove x (items as Items {eq, index, content, next, net}) =
 | 
| 73 | if member items x then | |
| 74 | mk_items eq index (Library.remove eq x content) next | |
| 59058 
a78612c67ec0
renamed "pairself" to "apply2", in accordance to @{apply 2};
 wenzelm parents: 
55741diff
changeset | 75 | (fold (fn t => Net.delete_term_safe (eq o apply2 #2) (t, (0, x))) (index x) net) | 
| 33372 | 76 | else items; | 
| 8298 | 77 | |
| 33372 | 78 | fun update x items = cons x (remove x items); | 
| 8298 | 79 | |
| 62165 | 80 | fun filter pred items = | 
| 81 | fold (fn x => not (pred x) ? remove x) (content items) items; | |
| 82 | ||
| 8298 | 83 | end; |