src/Pure/Isar/net_rules.ML
author wenzelm
Sun, 11 Jan 2009 21:49:59 +0100
changeset 29450 ac7f67be7f1f
parent 22360 26ead7ed4f4b
child 29606 fedb8be05f24
permissions -rw-r--r--
tuned categories;
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
9b089bc07f69 added Isar/net_rules.ML;
wenzelm
parents:
diff changeset
     4
9b089bc07f69 added Isar/net_rules.ML;
wenzelm
parents:
diff changeset
     5
Efficient storage of rules: preserves order, prefers later entries.
9b089bc07f69 added Isar/net_rules.ML;
wenzelm
parents:
diff changeset
     6
*)
9b089bc07f69 added Isar/net_rules.ML;
wenzelm
parents:
diff changeset
     7
9b089bc07f69 added Isar/net_rules.ML;
wenzelm
parents:
diff changeset
     8
signature NET_RULES =
9b089bc07f69 added Isar/net_rules.ML;
wenzelm
parents:
diff changeset
     9
sig
9b089bc07f69 added Isar/net_rules.ML;
wenzelm
parents:
diff changeset
    10
  type 'a T
9b089bc07f69 added Isar/net_rules.ML;
wenzelm
parents:
diff changeset
    11
  val rules: 'a T -> 'a list
11776
d4f9de0bde28 support weight;
wenzelm
parents: 11693
diff changeset
    12
  val retrieve: 'a T -> term -> 'a list
12385
389d11fb62c8 removed unused functionality (weight etc.);
wenzelm
parents: 12290
diff changeset
    13
  val init: ('a * 'a -> bool) -> ('a -> term) -> 'a T
8298
9b089bc07f69 added Isar/net_rules.ML;
wenzelm
parents:
diff changeset
    14
  val merge: 'a T * 'a T -> 'a T
9b089bc07f69 added Isar/net_rules.ML;
wenzelm
parents:
diff changeset
    15
  val delete: 'a -> 'a T -> 'a T
9b089bc07f69 added Isar/net_rules.ML;
wenzelm
parents:
diff changeset
    16
  val insert: 'a -> 'a T -> 'a T
11776
d4f9de0bde28 support weight;
wenzelm
parents: 11693
diff changeset
    17
  val intro: thm T
d4f9de0bde28 support weight;
wenzelm
parents: 11693
diff changeset
    18
  val elim: thm T
8298
9b089bc07f69 added Isar/net_rules.ML;
wenzelm
parents:
diff changeset
    19
end;
9b089bc07f69 added Isar/net_rules.ML;
wenzelm
parents:
diff changeset
    20
9b089bc07f69 added Isar/net_rules.ML;
wenzelm
parents:
diff changeset
    21
structure NetRules: NET_RULES =
9b089bc07f69 added Isar/net_rules.ML;
wenzelm
parents:
diff changeset
    22
struct
9b089bc07f69 added Isar/net_rules.ML;
wenzelm
parents:
diff changeset
    23
9b089bc07f69 added Isar/net_rules.ML;
wenzelm
parents:
diff changeset
    24
(* datatype rules *)
9b089bc07f69 added Isar/net_rules.ML;
wenzelm
parents:
diff changeset
    25
9b089bc07f69 added Isar/net_rules.ML;
wenzelm
parents:
diff changeset
    26
datatype 'a T =
9b089bc07f69 added Isar/net_rules.ML;
wenzelm
parents:
diff changeset
    27
  Rules of {
9b089bc07f69 added Isar/net_rules.ML;
wenzelm
parents:
diff changeset
    28
    eq: 'a * 'a -> bool,
9b089bc07f69 added Isar/net_rules.ML;
wenzelm
parents:
diff changeset
    29
    index: 'a -> term,
9b089bc07f69 added Isar/net_rules.ML;
wenzelm
parents:
diff changeset
    30
    rules: 'a list,
9b089bc07f69 added Isar/net_rules.ML;
wenzelm
parents:
diff changeset
    31
    next: int,
12385
389d11fb62c8 removed unused functionality (weight etc.);
wenzelm
parents: 12290
diff changeset
    32
    net: (int * 'a) Net.net};
8298
9b089bc07f69 added Isar/net_rules.ML;
wenzelm
parents:
diff changeset
    33
12385
389d11fb62c8 removed unused functionality (weight etc.);
wenzelm
parents: 12290
diff changeset
    34
fun mk_rules eq index rules next net =
389d11fb62c8 removed unused functionality (weight etc.);
wenzelm
parents: 12290
diff changeset
    35
  Rules {eq = eq, index = index, rules = rules, next = next, net = net};
8298
9b089bc07f69 added Isar/net_rules.ML;
wenzelm
parents:
diff changeset
    36
9b089bc07f69 added Isar/net_rules.ML;
wenzelm
parents:
diff changeset
    37
fun rules (Rules {rules = rs, ...}) = rs;
11776
d4f9de0bde28 support weight;
wenzelm
parents: 11693
diff changeset
    38
12385
389d11fb62c8 removed unused functionality (weight etc.);
wenzelm
parents: 12290
diff changeset
    39
fun retrieve (Rules {rules, net, ...}) tm =
14472
cba7c0a3ffb3 Removing the datatype declaration of "order" allows the standard General.order
paulson
parents: 13105
diff changeset
    40
  Tactic.untaglist 
16512
wenzelm
parents: 15574
diff changeset
    41
     ((Library.sort (int_ord o pairself #1) (Net.unify_term net tm)));
8298
9b089bc07f69 added Isar/net_rules.ML;
wenzelm
parents:
diff changeset
    42
9b089bc07f69 added Isar/net_rules.ML;
wenzelm
parents:
diff changeset
    43
9b089bc07f69 added Isar/net_rules.ML;
wenzelm
parents:
diff changeset
    44
(* build rules *)
9b089bc07f69 added Isar/net_rules.ML;
wenzelm
parents:
diff changeset
    45
12385
389d11fb62c8 removed unused functionality (weight etc.);
wenzelm
parents: 12290
diff changeset
    46
fun init eq index = mk_rules eq index [] ~1 Net.empty;
8298
9b089bc07f69 added Isar/net_rules.ML;
wenzelm
parents:
diff changeset
    47
12385
389d11fb62c8 removed unused functionality (weight etc.);
wenzelm
parents: 12290
diff changeset
    48
fun add rule (Rules {eq, index, rules, next, net}) =
389d11fb62c8 removed unused functionality (weight etc.);
wenzelm
parents: 12290
diff changeset
    49
  mk_rules eq index (rule :: rules) (next - 1)
16800
90eff1b52428 improved Net interface;
wenzelm
parents: 16512
diff changeset
    50
    (Net.insert_term (K false) (index rule, (next, rule)) net);
8298
9b089bc07f69 added Isar/net_rules.ML;
wenzelm
parents:
diff changeset
    51
12385
389d11fb62c8 removed unused functionality (weight etc.);
wenzelm
parents: 12290
diff changeset
    52
fun merge (Rules {eq, index, rules = rules1, ...}, Rules {rules = rules2, ...}) =
18921
f47c46d7d654 canonical member/insert/merge;
wenzelm
parents: 18646
diff changeset
    53
  let val rules = Library.merge eq (rules1, rules2)
17351
wenzelm
parents: 16800
diff changeset
    54
  in fold_rev add rules (init eq index) end;
8298
9b089bc07f69 added Isar/net_rules.ML;
wenzelm
parents:
diff changeset
    55
12385
389d11fb62c8 removed unused functionality (weight etc.);
wenzelm
parents: 12290
diff changeset
    56
fun delete rule (rs as Rules {eq, index, rules, next, net}) =
18646
wenzelm
parents: 17351
diff changeset
    57
  if not (member eq rules rule) then rs
wenzelm
parents: 17351
diff changeset
    58
  else mk_rules eq index (remove eq rule rules) next
16800
90eff1b52428 improved Net interface;
wenzelm
parents: 16512
diff changeset
    59
    (Net.delete_term (eq o pairself #2) (index rule, (0, rule)) net);
8298
9b089bc07f69 added Isar/net_rules.ML;
wenzelm
parents:
diff changeset
    60
12385
389d11fb62c8 removed unused functionality (weight etc.);
wenzelm
parents: 12290
diff changeset
    61
fun insert rule rs = add rule (delete rule rs);    (*ensure that new rule gets precedence*)
8298
9b089bc07f69 added Isar/net_rules.ML;
wenzelm
parents:
diff changeset
    62
9b089bc07f69 added Isar/net_rules.ML;
wenzelm
parents:
diff changeset
    63
9b089bc07f69 added Isar/net_rules.ML;
wenzelm
parents:
diff changeset
    64
(* intro/elim rules *)
9b089bc07f69 added Isar/net_rules.ML;
wenzelm
parents:
diff changeset
    65
22360
26ead7ed4f4b moved eq_thm etc. to structure Thm in Pure/more_thm.ML;
wenzelm
parents: 18921
diff changeset
    66
val intro = init Thm.eq_thm_prop Thm.concl_of;
26ead7ed4f4b moved eq_thm etc. to structure Thm in Pure/more_thm.ML;
wenzelm
parents: 18921
diff changeset
    67
val elim = init Thm.eq_thm_prop Thm.major_prem_of;
8298
9b089bc07f69 added Isar/net_rules.ML;
wenzelm
parents:
diff changeset
    68
9b089bc07f69 added Isar/net_rules.ML;
wenzelm
parents:
diff changeset
    69
9b089bc07f69 added Isar/net_rules.ML;
wenzelm
parents:
diff changeset
    70
end;