src/Pure/term_items.ML
author wenzelm
Sun, 24 Oct 2021 21:59:36 +0200
changeset 74572 08b4292abe2b
parent 74278 a123db647573
child 77828 6fae9f5157b5
permissions -rw-r--r--
more antiquotations;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
74270
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
     1
(*  Title:      Pure/term_items.ML
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
     2
    Author:     Makarius
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
     3
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
     4
Scalable collections of term items:
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
     5
  - table: e.g. for instantiation
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
     6
  - set with order of addition, e.g. occurrences within term
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
     7
*)
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
     8
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
     9
signature TERM_ITEMS =
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
    10
sig
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
    11
  type key
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
    12
  type 'a table
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
    13
  val empty: 'a table
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
    14
  val build: ('a table -> 'a table) -> 'a table
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
    15
  val size: 'a table -> int
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
    16
  val is_empty: 'a table -> bool
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
    17
  val map: (key -> 'a -> 'b) -> 'a table -> 'b table
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
    18
  val fold: (key * 'b -> 'a -> 'a) -> 'b table -> 'a -> 'a
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
    19
  val fold_rev: (key * 'b -> 'a -> 'a) -> 'b table -> 'a -> 'a
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
    20
  val dest: 'a table -> (key * 'a) list
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
    21
  val keys: 'a table -> key list
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
    22
  val exists: (key * 'a -> bool) -> 'a table -> bool
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
    23
  val forall: (key * 'a -> bool) -> 'a table -> bool
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
    24
  val get_first: (key * 'a -> 'b option) -> 'a table -> 'b option
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
    25
  val lookup: 'a table -> key -> 'a option
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
    26
  val defined: 'a table -> key -> bool
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
    27
  val add: key * 'a -> 'a table -> 'a table
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
    28
  val make: (key * 'a) list -> 'a table
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
    29
  type set = int table
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
    30
  val add_set: key -> set -> set
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
    31
  val make_set: key list -> set
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
    32
  val list_set: set -> key list
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
    33
  val list_set_rev: set -> key list
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
    34
  val subset: set * set -> bool
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
    35
  val eq_set: set * set -> bool
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
    36
end;
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
    37
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
    38
functor Term_Items(Key: KEY): TERM_ITEMS =
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
    39
struct
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
    40
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
    41
(* table with length *)
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
    42
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
    43
structure Table = Table(Key);
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
    44
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
    45
type key = Table.key;
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
    46
datatype 'a table = Items of int * 'a Table.table;
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
    47
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
    48
fun size (Items (n, _)) = n;
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
    49
fun table (Items (_, tab)) = tab;
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
    50
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
    51
val empty = Items (0, Table.empty);
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
    52
fun build (f: 'a table -> 'a table) = f empty;
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
    53
fun is_empty items = size items = 0;
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
    54
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
    55
fun dest items = Table.dest (table items);
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
    56
fun keys items = Table.keys (table items);
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
    57
fun exists pred = Table.exists pred o table;
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
    58
fun forall pred = Table.forall pred o table;
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
    59
fun get_first get = Table.get_first get o table;
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
    60
fun lookup items = Table.lookup (table items);
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
    61
fun defined items = Table.defined (table items);
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
    62
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
    63
fun add (key, x) (items as Items (n, tab)) =
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
    64
  if Table.defined tab key then items
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
    65
  else Items (n + 1, Table.update_new (key, x) tab);
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
    66
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
    67
fun make entries = build (fold add entries);
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
    68
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
    69
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
    70
(* set with order of addition *)
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
    71
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
    72
type set = int table;
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
    73
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
    74
fun add_set x (items as Items (n, tab)) =
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
    75
  if Table.defined tab x then items
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
    76
  else Items (n + 1, Table.update_new (x, n) tab);
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
    77
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
    78
fun make_set xs = build (fold add_set xs);
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
    79
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
    80
fun subset (A: set, B: set) = forall (defined B o #1) A;
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
    81
fun eq_set (A: set, B: set) = size A = size B andalso subset (A, B);
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
    82
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
    83
fun list_set_ord ord items = Table.dest (table items) |> sort (ord o apply2 #2) |> map #1
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
    84
val list_set = list_set_ord int_ord;
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
    85
val list_set_rev = list_set_ord (rev_order o int_ord);
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
    86
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
    87
fun map f (Items (n, tab)) = Items (n, Table.map f tab);
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
    88
fun fold f = Table.fold f o table;
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
    89
fun fold_rev f = Table.fold_rev f o table;
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
    90
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
    91
end;
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
    92
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
    93
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
    94
structure TFrees:
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
    95
sig
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
    96
  include TERM_ITEMS
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
    97
  val add_tfreesT: typ -> set -> set
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
    98
  val add_tfrees: term -> set -> set
74278
a123db647573 clarified signature;
wenzelm
parents: 74270
diff changeset
    99
  val add_tfreesT_unless: (string * sort -> bool) -> typ -> set -> set
a123db647573 clarified signature;
wenzelm
parents: 74270
diff changeset
   100
  val add_tfrees_unless: (string * sort -> bool) -> term -> set -> set
74270
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
   101
end =
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
   102
struct
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
   103
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
   104
structure Items = Term_Items
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
   105
(
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
   106
  type key = string * sort;
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
   107
  val ord = pointer_eq_ord (prod_ord fast_string_ord Term_Ord.sort_ord);
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
   108
);
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
   109
open Items;
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
   110
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
   111
val add_tfreesT = fold_atyps (fn TFree v => add_set v | _ => I);
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
   112
val add_tfrees = fold_types add_tfreesT;
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
   113
74278
a123db647573 clarified signature;
wenzelm
parents: 74270
diff changeset
   114
fun add_tfreesT_unless pred = Term.fold_atyps (fn TFree v => not (pred v) ? add_set v | _ => I);
a123db647573 clarified signature;
wenzelm
parents: 74270
diff changeset
   115
fun add_tfrees_unless pred = fold_types (add_tfreesT_unless pred);
a123db647573 clarified signature;
wenzelm
parents: 74270
diff changeset
   116
74270
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
   117
end;
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
   118
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
   119
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
   120
structure TVars:
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
   121
sig
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
   122
  include TERM_ITEMS
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
   123
  val add_tvarsT: typ -> set -> set
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
   124
  val add_tvars: term -> set -> set
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
   125
end =
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
   126
struct
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
   127
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
   128
structure Term_Items = Term_Items(
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
   129
  type key = indexname * sort;
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
   130
  val ord = pointer_eq_ord (prod_ord Term_Ord.fast_indexname_ord Term_Ord.sort_ord);
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
   131
);
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
   132
open Term_Items;
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
   133
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
   134
val add_tvarsT = fold_atyps (fn TVar v => add_set v | _ => I);
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
   135
val add_tvars = fold_types add_tvarsT;
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
   136
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
   137
end;
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
   138
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
   139
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
   140
structure Frees:
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
   141
sig
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
   142
  include TERM_ITEMS
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
   143
  val add_frees: term -> set -> set
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
   144
end =
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
   145
struct
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
   146
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
   147
structure Term_Items = Term_Items
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
   148
(
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
   149
  type key = string * typ;
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
   150
  val ord = pointer_eq_ord (prod_ord fast_string_ord Term_Ord.typ_ord);
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
   151
);
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
   152
open Term_Items;
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
   153
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
   154
val add_frees = fold_aterms (fn Free v => add_set v | _ => I);
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
   155
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
   156
end;
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
   157
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
   158
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
   159
structure Vars:
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
   160
sig
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
   161
  include TERM_ITEMS
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
   162
  val add_vars: term -> set -> set
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
   163
end =
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
   164
struct
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
   165
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
   166
structure Term_Items = Term_Items
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
   167
(
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
   168
  type key = indexname * typ;
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
   169
  val ord = pointer_eq_ord (prod_ord Term_Ord.fast_indexname_ord Term_Ord.typ_ord)
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
   170
);
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
   171
open Term_Items;
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
   172
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
   173
val add_vars = fold_aterms (fn Var v => add_set v | _ => I);
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
   174
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
   175
end;
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
   176
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
   177
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
   178
structure Names:
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
   179
sig
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
   180
  include TERM_ITEMS
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
   181
  val add_tfree_namesT: typ -> set -> set
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
   182
  val add_tfree_names: term -> set -> set
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
   183
  val add_free_names: term -> set -> set
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
   184
end =
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
   185
struct
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
   186
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
   187
structure Term_Items = Term_Items
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
   188
(
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
   189
  type key = string;
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
   190
  val ord = fast_string_ord
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
   191
);
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
   192
open Term_Items;
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
   193
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
   194
val add_tfree_namesT = fold_atyps (fn TFree (a, _) => add_set a | _ => I);
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
   195
val add_tfree_names = fold_types add_tfree_namesT;
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
   196
val add_free_names = fold_aterms (fn Free (x, _) => add_set x | _ => I);
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
   197
ad2899cdd528 clarified modules;
wenzelm
parents:
diff changeset
   198
end;