383 val prop_tab = fold cons_thm facts Termtab.empty |
383 val prop_tab = fold cons_thm facts Termtab.empty |
384 val plain_name_tab = Termtab.fold add_plains prop_tab Symtab.empty |
384 val plain_name_tab = Termtab.fold add_plains prop_tab Symtab.empty |
385 val inclass_name_tab = Symtab.fold add_inclass plain_name_tab Symtab.empty |
385 val inclass_name_tab = Symtab.fold add_inclass plain_name_tab Symtab.empty |
386 in (plain_name_tab, inclass_name_tab) end |
386 in (plain_name_tab, inclass_name_tab) end |
387 |
387 |
388 fun uniquify facts = |
388 fun keyed_distinct key_of xs = |
389 Termtab.fold (cons o snd) |
389 let val tab = fold (Termtab.default o `key_of) xs Termtab.empty in |
390 (fold (Termtab.default o `(normalize_eq_vars o prop_of o snd)) facts |
390 Termtab.fold (cons o snd) tab [] |
391 Termtab.empty) [] |
391 end |
|
392 |
|
393 fun hashed_keyed_distinct hash_of key_of xs = |
|
394 let |
|
395 val ys = map (`hash_of) xs |
|
396 val sorted_ys = sort (int_ord o pairself fst) ys |
|
397 val grouped_ys = AList.coalesce (op =) sorted_ys |
|
398 in maps (keyed_distinct key_of o snd) grouped_ys end |
392 |
399 |
393 fun struct_induct_rule_on th = |
400 fun struct_induct_rule_on th = |
394 case Logic.strip_horn (prop_of th) of |
401 case Logic.strip_horn (prop_of th) of |
395 (prems, @{const Trueprop} |
402 (prems, @{const Trueprop} |
396 $ ((p as Var ((p_name, 0), _)) $ (a as Var (_, ind_T)))) => |
403 $ ((p as Var ((p_name, 0), _)) $ (a as Var (_, ind_T)))) => |
538 else |
545 else |
539 let val (add, del) = pairself (Attrib.eval_thms ctxt) (add, del) in |
546 let val (add, del) = pairself (Attrib.eval_thms ctxt) (add, del) in |
540 all_facts ctxt false ho_atp reserved add chained css |
547 all_facts ctxt false ho_atp reserved add chained css |
541 |> filter_out (member Thm.eq_thm_prop del o snd) |
548 |> filter_out (member Thm.eq_thm_prop del o snd) |
542 |> maybe_filter_no_atps ctxt |
549 |> maybe_filter_no_atps ctxt |
543 |> uniquify |
550 |> hashed_keyed_distinct (size_of_term o prop_of o snd) |
|
551 (normalize_eq_vars o prop_of o snd) |
544 end) |
552 end) |
545 |> maybe_instantiate_inducts ctxt hyp_ts concl_t |
553 |> maybe_instantiate_inducts ctxt hyp_ts concl_t |
546 end |
554 end |
547 |
555 |
548 end; |
556 end; |