| author | Fabian Huch <huch@in.tum.de> | 
| Tue, 04 Jun 2024 09:02:36 +0200 | |
| changeset 80246 | 245dd5f82462 | 
| parent 68126 | 5da8b97d9183 | 
| 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
 | 
| 
68126
 
5da8b97d9183
proper merge of items without term index (amending b969263fcf02);
 
wenzelm 
parents: 
62165 
diff
changeset
 | 
12  | 
val is_empty: 'a T -> bool  | 
| 
30559
 
e5987a7ac5df
turned structure NetRules into general Item_Net, which is loaded earlier;
 
wenzelm 
parents: 
29606 
diff
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: 
36296 
diff
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: 
42810 
diff
changeset
 | 
16  | 
val retrieve_matching: 'a T -> term -> 'a list  | 
| 
36296
 
5cc547abd995
Item_Net/Named_Thms: export efficient member operation;
 
wenzelm 
parents: 
33721 
diff
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: 
29606 
diff
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: 
29606 
diff
changeset
 | 
28  | 
(* datatype *)  | 
| 8298 | 29  | 
|
30  | 
datatype 'a T =  | 
|
| 
30559
 
e5987a7ac5df
turned structure NetRules into general Item_Net, which is loaded earlier;
 
wenzelm 
parents: 
29606 
diff
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: 
29606 
diff
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: 
29606 
diff
changeset
 | 
38  | 
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
 | 
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: 
62165 
diff
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: 
29606 
diff
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: 
36296 
diff
changeset
 | 
45  | 
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
 | 
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: 
42810 
diff
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: 
33372 
diff
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: 
33372 
diff
changeset
 | 
53  | 
(case index x of  | 
| 
 
f15c9ded9676
member/cons: slightly more correct treatment of multi-index, notably empty one;
 
wenzelm 
parents: 
33372 
diff
changeset
 | 
54  | 
[] => Library.member eq content x  | 
| 
 
f15c9ded9676
member/cons: slightly more correct treatment of multi-index, notably empty one;
 
wenzelm 
parents: 
33372 
diff
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: 
29606 
diff
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: 
33372 
diff
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: 
62165 
diff
changeset
 | 
67  | 
fun merge (items1, items2) =  | 
| 
 
5da8b97d9183
proper merge of items without term index (amending b969263fcf02);
 
wenzelm 
parents: 
62165 
diff
changeset
 | 
68  | 
if pointer_eq (items1, items2) then items1  | 
| 
 
5da8b97d9183
proper merge of items without term index (amending b969263fcf02);
 
wenzelm 
parents: 
62165 
diff
changeset
 | 
69  | 
else if is_empty items1 then items2  | 
| 
 
5da8b97d9183
proper merge of items without term index (amending b969263fcf02);
 
wenzelm 
parents: 
62165 
diff
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: 
55741 
diff
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;  |