src/HOL/Tools/Sledgehammer/sledgehammer_fact.ML
changeset 53504 9750618c32ed
parent 53503 d2f21e305d0c
child 53506 f99ee3adb81d
equal deleted inserted replaced
53503:d2f21e305d0c 53504:9750618c32ed
   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;