| author | wenzelm | 
| Tue, 12 Aug 2014 00:23:30 +0200 | |
| changeset 57907 | 7fc36b4c7cce | 
| 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: 
29606 
diff
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: 
29606 
diff
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: 
29606 
diff
changeset
 | 
5  | 
prefers later entries.  | 
| 8298 | 6  | 
*)  | 
7  | 
||
| 
30559
 
e5987a7ac5df
turned structure NetRules into general Item_Net, which is loaded earlier;
 
wenzelm 
parents: 
29606 
diff
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: 
29606 
diff
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: 
36296 
diff
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: 
42810 
diff
changeset
 | 
15  | 
val retrieve_matching: 'a T -> term -> 'a list  | 
| 
36296
 
5cc547abd995
Item_Net/Named_Thms: export efficient member operation;
 
wenzelm 
parents: 
33721 
diff
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: 
29606 
diff
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: 
29606 
diff
changeset
 | 
25  | 
(* datatype *)  | 
| 8298 | 26  | 
|
27  | 
datatype 'a T =  | 
|
| 
30559
 
e5987a7ac5df
turned structure NetRules into general Item_Net, which is loaded earlier;
 
wenzelm 
parents: 
29606 
diff
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: 
29606 
diff
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: 
29606 
diff
changeset
 | 
35  | 
fun mk_items eq index content next net =  | 
| 
 
e5987a7ac5df
turned structure NetRules into general Item_Net, which is loaded earlier;
 
wenzelm 
parents: 
29606 
diff
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: 
29606 
diff
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: 
36296 
diff
changeset
 | 
41  | 
fun length items = List.length (content items);  | 
| 
30559
 
e5987a7ac5df
turned structure NetRules into general Item_Net, which is loaded earlier;
 
wenzelm 
parents: 
29606 
diff
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: 
42810 
diff
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: 
33372 
diff
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: 
33372 
diff
changeset
 | 
49  | 
(case index x of  | 
| 
 
f15c9ded9676
member/cons: slightly more correct treatment of multi-index, notably empty one;
 
wenzelm 
parents: 
33372 
diff
changeset
 | 
50  | 
[] => Library.member eq content x  | 
| 
 
f15c9ded9676
member/cons: slightly more correct treatment of multi-index, notably empty one;
 
wenzelm 
parents: 
33372 
diff
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: 
29606 
diff
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: 
33372 
diff
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: 
53941 
diff
changeset
 | 
57  | 
fun merge  | 
| 
 
b969263fcf02
optimize special case according to Library.merge (see also 8fbc355100f2);
 
wenzelm 
parents: 
53941 
diff
changeset
 | 
58  | 
    (items1 as Items {net = net1, ...},
 | 
| 
 
b969263fcf02
optimize special case according to Library.merge (see also 8fbc355100f2);
 
wenzelm 
parents: 
53941 
diff
changeset
 | 
59  | 
     items2 as Items {net = net2, content = content2, ...}) =
 | 
| 
 
b969263fcf02
optimize special case according to Library.merge (see also 8fbc355100f2);
 
wenzelm 
parents: 
53941 
diff
changeset
 | 
60  | 
if pointer_eq (net1, net2) then items1  | 
| 
 
b969263fcf02
optimize special case according to Library.merge (see also 8fbc355100f2);
 
wenzelm 
parents: 
53941 
diff
changeset
 | 
61  | 
else if Net.is_empty net1 then items2  | 
| 
 
b969263fcf02
optimize special case according to Library.merge (see also 8fbc355100f2);
 
wenzelm 
parents: 
53941 
diff
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;  |