src/Pure/Isar/net_rules.ML
changeset 16800 90eff1b52428
parent 16512 1fa048f2a590
child 17351 f7f2f56fcc28
equal deleted inserted replaced
16799:978dcf30c3dd 16800:90eff1b52428
    45 
    45 
    46 fun init eq index = mk_rules eq index [] ~1 Net.empty;
    46 fun init eq index = mk_rules eq index [] ~1 Net.empty;
    47 
    47 
    48 fun add rule (Rules {eq, index, rules, next, net}) =
    48 fun add rule (Rules {eq, index, rules, next, net}) =
    49   mk_rules eq index (rule :: rules) (next - 1)
    49   mk_rules eq index (rule :: rules) (next - 1)
    50     (Net.insert_term ((index rule, (next, rule)), net, K false));
    50     (Net.insert_term (K false) (index rule, (next, rule)) net);
    51 
    51 
    52 fun merge (Rules {eq, index, rules = rules1, ...}, Rules {rules = rules2, ...}) =
    52 fun merge (Rules {eq, index, rules = rules1, ...}, Rules {rules = rules2, ...}) =
    53   let val rules = Library.gen_merge_lists' eq rules1 rules2
    53   let val rules = Library.gen_merge_lists' eq rules1 rules2
    54   in foldr (uncurry add) (init eq index) rules end;
    54   in foldr (uncurry add) (init eq index) rules end;
    55 
    55 
    56 fun delete rule (rs as Rules {eq, index, rules, next, net}) =
    56 fun delete rule (rs as Rules {eq, index, rules, next, net}) =
    57   if not (Library.gen_mem eq (rule, rules)) then rs
    57   if not (Library.gen_mem eq (rule, rules)) then rs
    58   else mk_rules eq index (Library.gen_rem eq (rules, rule)) next
    58   else mk_rules eq index (Library.gen_rem eq (rules, rule)) next
    59     (Net.delete_term ((index rule, (0, rule)), net, eq o pairself #2));
    59     (Net.delete_term (eq o pairself #2) (index rule, (0, rule)) net);
    60 
    60 
    61 fun insert rule rs = add rule (delete rule rs);    (*ensure that new rule gets precedence*)
    61 fun insert rule rs = add rule (delete rule rs);    (*ensure that new rule gets precedence*)
    62 
    62 
    63 
    63 
    64 (* intro/elim rules *)
    64 (* intro/elim rules *)