| author | bulwahn | 
| Fri, 11 Mar 2011 08:13:00 +0100 | |
| changeset 41903 | 39fd77f0ae59 | 
| parent 36296 | 5cc547abd995 | 
| child 42810 | 2425068fe13a | 
| 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  | 
| 11776 | 13  | 
val retrieve: 'a T -> term -> 'a list  | 
| 
36296
 
5cc547abd995
Item_Net/Named_Thms: export efficient member operation;
 
wenzelm 
parents: 
33721 
diff
changeset
 | 
14  | 
val member: 'a T -> 'a -> bool  | 
| 8298 | 15  | 
val merge: 'a T * 'a T -> 'a T  | 
| 33372 | 16  | 
val remove: 'a -> 'a T -> 'a T  | 
17  | 
val update: 'a -> 'a T -> 'a T  | 
|
| 8298 | 18  | 
end;  | 
19  | 
||
| 
30559
 
e5987a7ac5df
turned structure NetRules into general Item_Net, which is loaded earlier;
 
wenzelm 
parents: 
29606 
diff
changeset
 | 
20  | 
structure Item_Net: ITEM_NET =  | 
| 8298 | 21  | 
struct  | 
22  | 
||
| 
30559
 
e5987a7ac5df
turned structure NetRules into general Item_Net, which is loaded earlier;
 
wenzelm 
parents: 
29606 
diff
changeset
 | 
23  | 
(* datatype *)  | 
| 8298 | 24  | 
|
25  | 
datatype 'a T =  | 
|
| 
30559
 
e5987a7ac5df
turned structure NetRules into general Item_Net, which is loaded earlier;
 
wenzelm 
parents: 
29606 
diff
changeset
 | 
26  | 
  Items of {
 | 
| 8298 | 27  | 
eq: 'a * 'a -> bool,  | 
| 33372 | 28  | 
index: 'a -> term list,  | 
| 
30559
 
e5987a7ac5df
turned structure NetRules into general Item_Net, which is loaded earlier;
 
wenzelm 
parents: 
29606 
diff
changeset
 | 
29  | 
content: 'a list,  | 
| 8298 | 30  | 
next: int,  | 
| 12385 | 31  | 
net: (int * 'a) Net.net};  | 
| 8298 | 32  | 
|
| 
30559
 
e5987a7ac5df
turned structure NetRules into general Item_Net, which is loaded earlier;
 
wenzelm 
parents: 
29606 
diff
changeset
 | 
33  | 
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
 | 
34  | 
  Items {eq = eq, index = index, content = content, next = next, net = net};
 | 
| 8298 | 35  | 
|
| 33372 | 36  | 
fun init eq index = mk_items eq index [] ~1 Net.empty;  | 
37  | 
||
| 
30559
 
e5987a7ac5df
turned structure NetRules into general Item_Net, which is loaded earlier;
 
wenzelm 
parents: 
29606 
diff
changeset
 | 
38  | 
fun content (Items {content, ...}) = content;
 | 
| 
 
e5987a7ac5df
turned structure NetRules into general Item_Net, which is loaded earlier;
 
wenzelm 
parents: 
29606 
diff
changeset
 | 
39  | 
fun retrieve (Items {net, ...}) = order_list o Net.unify_term net;
 | 
| 8298 | 40  | 
|
41  | 
||
| 33372 | 42  | 
(* standard operations *)  | 
| 8298 | 43  | 
|
| 
33721
 
f15c9ded9676
member/cons: slightly more correct treatment of multi-index, notably empty one;
 
wenzelm 
parents: 
33372 
diff
changeset
 | 
44  | 
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
 | 
45  | 
(case index x of  | 
| 
 
f15c9ded9676
member/cons: slightly more correct treatment of multi-index, notably empty one;
 
wenzelm 
parents: 
33372 
diff
changeset
 | 
46  | 
[] => Library.member eq content x  | 
| 
 
f15c9ded9676
member/cons: slightly more correct treatment of multi-index, notably empty one;
 
wenzelm 
parents: 
33372 
diff
changeset
 | 
47  | 
| t :: _ => exists (fn (_, y) => eq (x, y)) (Net.unify_term net t));  | 
| 8298 | 48  | 
|
| 33372 | 49  | 
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
 | 
50  | 
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
 | 
51  | 
(fold (fn t => Net.insert_term (K false) (t, (next, x))) (index x) net);  | 
| 33372 | 52  | 
|
53  | 
fun merge (items1, Items {content = content2, ...}) =
 | 
|
54  | 
fold_rev (fn y => if member items1 y then I else cons y) content2 items1;  | 
|
| 8298 | 55  | 
|
| 33372 | 56  | 
fun remove x (items as Items {eq, index, content, next, net}) =
 | 
57  | 
if member items x then  | 
|
58  | 
mk_items eq index (Library.remove eq x content) next  | 
|
59  | 
(fold (fn t => Net.delete_term_safe (eq o pairself #2) (t, (0, x))) (index x) net)  | 
|
60  | 
else items;  | 
|
| 8298 | 61  | 
|
| 33372 | 62  | 
fun update x items = cons x (remove x items);  | 
| 8298 | 63  | 
|
64  | 
end;  |