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 *) |