src/Pure/Isar/net_rules.ML
author wenzelm
Mon, 22 Oct 2001 18:07:30 +0200
changeset 11896 1ff33f896720
parent 11776 d4f9de0bde28
child 12290 29b1a4ef4d9f
permissions -rw-r--r--
moved locale.ML to Isar/locale.ML;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
8298
9b089bc07f69 added Isar/net_rules.ML;
wenzelm
parents:
diff changeset
     1
(*  Title:      Pure/Isar/net_rules.ML
9b089bc07f69 added Isar/net_rules.ML;
wenzelm
parents:
diff changeset
     2
    ID:         $Id$
9b089bc07f69 added Isar/net_rules.ML;
wenzelm
parents:
diff changeset
     3
    Author:     Markus Wenzel, TU Muenchen
8807
wenzelm
parents: 8635
diff changeset
     4
    License:    GPL (GNU GENERAL PUBLIC LICENSE)
8298
9b089bc07f69 added Isar/net_rules.ML;
wenzelm
parents:
diff changeset
     5
9b089bc07f69 added Isar/net_rules.ML;
wenzelm
parents:
diff changeset
     6
Efficient storage of rules: preserves order, prefers later entries.
9b089bc07f69 added Isar/net_rules.ML;
wenzelm
parents:
diff changeset
     7
*)
9b089bc07f69 added Isar/net_rules.ML;
wenzelm
parents:
diff changeset
     8
9b089bc07f69 added Isar/net_rules.ML;
wenzelm
parents:
diff changeset
     9
signature NET_RULES =
9b089bc07f69 added Isar/net_rules.ML;
wenzelm
parents:
diff changeset
    10
sig
9b089bc07f69 added Isar/net_rules.ML;
wenzelm
parents:
diff changeset
    11
  type 'a T
9b089bc07f69 added Isar/net_rules.ML;
wenzelm
parents:
diff changeset
    12
  val rules: 'a T -> 'a list
11776
d4f9de0bde28 support weight;
wenzelm
parents: 11693
diff changeset
    13
  val retrieve: 'a T -> term -> 'a list
d4f9de0bde28 support weight;
wenzelm
parents: 11693
diff changeset
    14
  val retrieve_weighted: 'a T -> term -> 'a list
d4f9de0bde28 support weight;
wenzelm
parents: 11693
diff changeset
    15
  val init: ('a * 'a -> bool) -> ('a -> int) -> ('a -> term) -> 'a T
8298
9b089bc07f69 added Isar/net_rules.ML;
wenzelm
parents:
diff changeset
    16
  val merge: 'a T * 'a T -> 'a T
9b089bc07f69 added Isar/net_rules.ML;
wenzelm
parents:
diff changeset
    17
  val delete: 'a -> 'a T -> 'a T
9b089bc07f69 added Isar/net_rules.ML;
wenzelm
parents:
diff changeset
    18
  val insert: 'a -> 'a T -> 'a T
9b089bc07f69 added Isar/net_rules.ML;
wenzelm
parents:
diff changeset
    19
  val deletes: 'a list -> 'a T -> 'a T
9b089bc07f69 added Isar/net_rules.ML;
wenzelm
parents:
diff changeset
    20
  val inserts: 'a list -> 'a T -> 'a T
11776
d4f9de0bde28 support weight;
wenzelm
parents: 11693
diff changeset
    21
  val intro: thm T
d4f9de0bde28 support weight;
wenzelm
parents: 11693
diff changeset
    22
  val elim: thm T
8298
9b089bc07f69 added Isar/net_rules.ML;
wenzelm
parents:
diff changeset
    23
end;
9b089bc07f69 added Isar/net_rules.ML;
wenzelm
parents:
diff changeset
    24
9b089bc07f69 added Isar/net_rules.ML;
wenzelm
parents:
diff changeset
    25
structure NetRules: NET_RULES =
9b089bc07f69 added Isar/net_rules.ML;
wenzelm
parents:
diff changeset
    26
struct
9b089bc07f69 added Isar/net_rules.ML;
wenzelm
parents:
diff changeset
    27
9b089bc07f69 added Isar/net_rules.ML;
wenzelm
parents:
diff changeset
    28
(* datatype rules *)
9b089bc07f69 added Isar/net_rules.ML;
wenzelm
parents:
diff changeset
    29
9b089bc07f69 added Isar/net_rules.ML;
wenzelm
parents:
diff changeset
    30
datatype 'a T =
9b089bc07f69 added Isar/net_rules.ML;
wenzelm
parents:
diff changeset
    31
  Rules of {
9b089bc07f69 added Isar/net_rules.ML;
wenzelm
parents:
diff changeset
    32
    eq: 'a * 'a -> bool,
11776
d4f9de0bde28 support weight;
wenzelm
parents: 11693
diff changeset
    33
    weight: 'a -> int,
8298
9b089bc07f69 added Isar/net_rules.ML;
wenzelm
parents:
diff changeset
    34
    index: 'a -> term,
9b089bc07f69 added Isar/net_rules.ML;
wenzelm
parents:
diff changeset
    35
    rules: 'a list,
9b089bc07f69 added Isar/net_rules.ML;
wenzelm
parents:
diff changeset
    36
    next: int,
11776
d4f9de0bde28 support weight;
wenzelm
parents: 11693
diff changeset
    37
    net: ((int * int) * 'a) Net.net};
8298
9b089bc07f69 added Isar/net_rules.ML;
wenzelm
parents:
diff changeset
    38
11776
d4f9de0bde28 support weight;
wenzelm
parents: 11693
diff changeset
    39
fun mk_rules eq weight index rules next net =
d4f9de0bde28 support weight;
wenzelm
parents: 11693
diff changeset
    40
  Rules {eq = eq, weight = weight, index = index, rules = rules, next = next, net = net};
8298
9b089bc07f69 added Isar/net_rules.ML;
wenzelm
parents:
diff changeset
    41
9b089bc07f69 added Isar/net_rules.ML;
wenzelm
parents:
diff changeset
    42
fun rules (Rules {rules = rs, ...}) = rs;
11776
d4f9de0bde28 support weight;
wenzelm
parents: 11693
diff changeset
    43
d4f9de0bde28 support weight;
wenzelm
parents: 11693
diff changeset
    44
d4f9de0bde28 support weight;
wenzelm
parents: 11693
diff changeset
    45
(* retrieve rules *)
d4f9de0bde28 support weight;
wenzelm
parents: 11693
diff changeset
    46
d4f9de0bde28 support weight;
wenzelm
parents: 11693
diff changeset
    47
fun gen_retrieve order (Rules {rules, net, ...}) tm =
d4f9de0bde28 support weight;
wenzelm
parents: 11693
diff changeset
    48
  Tactic.untaglist (map (fn ((_, k), x) => (k, x))
d4f9de0bde28 support weight;
wenzelm
parents: 11693
diff changeset
    49
    (sort (order o pairself #1) (Net.unify_term net tm)));
d4f9de0bde28 support weight;
wenzelm
parents: 11693
diff changeset
    50
d4f9de0bde28 support weight;
wenzelm
parents: 11693
diff changeset
    51
fun retrieve x = gen_retrieve (int_ord o pairself snd) x;
d4f9de0bde28 support weight;
wenzelm
parents: 11693
diff changeset
    52
fun retrieve_weighted x = gen_retrieve (prod_ord int_ord int_ord) x;
8298
9b089bc07f69 added Isar/net_rules.ML;
wenzelm
parents:
diff changeset
    53
9b089bc07f69 added Isar/net_rules.ML;
wenzelm
parents:
diff changeset
    54
9b089bc07f69 added Isar/net_rules.ML;
wenzelm
parents:
diff changeset
    55
(* build rules *)
9b089bc07f69 added Isar/net_rules.ML;
wenzelm
parents:
diff changeset
    56
11776
d4f9de0bde28 support weight;
wenzelm
parents: 11693
diff changeset
    57
fun init eq weight index = mk_rules eq weight index [] ~1 Net.empty;
8298
9b089bc07f69 added Isar/net_rules.ML;
wenzelm
parents:
diff changeset
    58
11776
d4f9de0bde28 support weight;
wenzelm
parents: 11693
diff changeset
    59
fun add rule (Rules {eq, weight, index, rules, next, net}) =
d4f9de0bde28 support weight;
wenzelm
parents: 11693
diff changeset
    60
  mk_rules eq weight index (rule :: rules) (next - 1)
d4f9de0bde28 support weight;
wenzelm
parents: 11693
diff changeset
    61
    (Net.insert_term ((index rule, ((weight rule, next), rule)), net, K false));
8298
9b089bc07f69 added Isar/net_rules.ML;
wenzelm
parents:
diff changeset
    62
11776
d4f9de0bde28 support weight;
wenzelm
parents: 11693
diff changeset
    63
fun make eq weight index rules = foldr (uncurry add) (rules, init eq weight index);
8298
9b089bc07f69 added Isar/net_rules.ML;
wenzelm
parents:
diff changeset
    64
9b089bc07f69 added Isar/net_rules.ML;
wenzelm
parents:
diff changeset
    65
11776
d4f9de0bde28 support weight;
wenzelm
parents: 11693
diff changeset
    66
fun merge (Rules {eq, weight, index, rules = rules1, ...}, Rules {rules = rules2, ...}) =
d4f9de0bde28 support weight;
wenzelm
parents: 11693
diff changeset
    67
  make eq weight index (Library.generic_merge eq I I rules1 rules2);
8298
9b089bc07f69 added Isar/net_rules.ML;
wenzelm
parents:
diff changeset
    68
11776
d4f9de0bde28 support weight;
wenzelm
parents: 11693
diff changeset
    69
fun delete rule (rs as Rules {eq, weight, index, rules, next, net}) =
8298
9b089bc07f69 added Isar/net_rules.ML;
wenzelm
parents:
diff changeset
    70
  if not (Library.gen_mem eq (rule, rules)) then rs
11776
d4f9de0bde28 support weight;
wenzelm
parents: 11693
diff changeset
    71
  else mk_rules eq weight index (Library.gen_rem eq (rules, rule)) next
d4f9de0bde28 support weight;
wenzelm
parents: 11693
diff changeset
    72
    (Net.delete_term ((index rule, ((0, 0), rule)), net, eq o pairself #2));
8298
9b089bc07f69 added Isar/net_rules.ML;
wenzelm
parents:
diff changeset
    73
9b089bc07f69 added Isar/net_rules.ML;
wenzelm
parents:
diff changeset
    74
fun insert rule rs = add rule (delete rule rs);    (*ensure new rule gets precedence*)
9b089bc07f69 added Isar/net_rules.ML;
wenzelm
parents:
diff changeset
    75
9b089bc07f69 added Isar/net_rules.ML;
wenzelm
parents:
diff changeset
    76
fun deletes rules rs = foldr (uncurry delete) (rules, rs);
9b089bc07f69 added Isar/net_rules.ML;
wenzelm
parents:
diff changeset
    77
fun inserts rules rs = foldr (uncurry insert) (rules, rs);
9b089bc07f69 added Isar/net_rules.ML;
wenzelm
parents:
diff changeset
    78
9b089bc07f69 added Isar/net_rules.ML;
wenzelm
parents:
diff changeset
    79
9b089bc07f69 added Isar/net_rules.ML;
wenzelm
parents:
diff changeset
    80
(* intro/elim rules *)
9b089bc07f69 added Isar/net_rules.ML;
wenzelm
parents:
diff changeset
    81
11776
d4f9de0bde28 support weight;
wenzelm
parents: 11693
diff changeset
    82
val intro = init Thm.eq_thm Thm.nprems_of Thm.concl_of;
d4f9de0bde28 support weight;
wenzelm
parents: 11693
diff changeset
    83
val elim = init Thm.eq_thm Thm.nprems_of Thm.major_prem_of;
8298
9b089bc07f69 added Isar/net_rules.ML;
wenzelm
parents:
diff changeset
    84
9b089bc07f69 added Isar/net_rules.ML;
wenzelm
parents:
diff changeset
    85
9b089bc07f69 added Isar/net_rules.ML;
wenzelm
parents:
diff changeset
    86
end;