src/HOL/Tools/Sledgehammer/sledgehammer_mash.ML
changeset 51134 d03ded5dcf65
parent 51133 fb16c4276620
child 51135 e32114b25551
equal deleted inserted replaced
51133:fb16c4276620 51134:d03ded5dcf65
    48       -> string list * (string * real) list * string list -> string list
    48       -> string list * (string * real) list * string list -> string list
    49   end
    49   end
    50 
    50 
    51   val mash_unlearn : Proof.context -> unit
    51   val mash_unlearn : Proof.context -> unit
    52   val nickname_of_thm : thm -> string
    52   val nickname_of_thm : thm -> string
    53   val find_suggested_facts : ('b * thm) list -> string list -> ('b * thm) list
    53   val find_suggested_facts :
       
    54     Proof.context -> ('b * thm) list -> string list -> ('b * thm) list
    54   val mesh_facts :
    55   val mesh_facts :
    55     ('a * 'a -> bool) -> int -> (real * (('a * real) list * 'a list)) list
    56     ('a * 'a -> bool) -> int -> (real * (('a * real) list * 'a list)) list
    56     -> 'a list
    57     -> 'a list
    57   val theory_ord : theory * theory -> order
    58   val theory_ord : theory * theory -> order
    58   val thm_ord : thm * thm -> order
    59   val thm_ord : thm * thm -> order
    70     -> string Symtab.table * string Symtab.table -> thm
    71     -> string Symtab.table * string Symtab.table -> thm
    71     -> bool * string list
    72     -> bool * string list
    72   val weight_mepo_facts : 'a list -> ('a * real) list
    73   val weight_mepo_facts : 'a list -> ('a * real) list
    73   val weight_mash_facts : 'a list -> ('a * real) list
    74   val weight_mash_facts : 'a list -> ('a * real) list
    74   val find_mash_suggestions :
    75   val find_mash_suggestions :
    75     int -> string list -> ('b * thm) list -> ('b * thm) list -> ('b * thm) list
    76     Proof.context -> int -> string list -> ('b * thm) list -> ('b * thm) list
    76     -> ('b * thm) list * ('b * thm) list
    77     -> ('b * thm) list -> ('b * thm) list * ('b * thm) list
    77   val mash_suggested_facts :
    78   val mash_suggested_facts :
    78     Proof.context -> params -> string -> int -> term list -> term
    79     Proof.context -> params -> string -> int -> term list -> term
    79     -> raw_fact list -> fact list * fact list
    80     -> raw_fact list -> fact list * fact list
    80   val mash_learn_proof :
    81   val mash_learn_proof :
    81     Proof.context -> params -> string -> term -> ('a * thm) list -> thm list
    82     Proof.context -> params -> string -> term -> ('a * thm) list -> thm list
   448       | NONE => hint
   449       | NONE => hint
   449     end
   450     end
   450   else
   451   else
   451     elided_backquote_thm 200 th
   452     elided_backquote_thm 200 th
   452 
   453 
   453 fun find_suggested_facts facts =
   454 fun find_suggested_facts ctxt facts =
   454   let
   455   let
   455     fun add_fact (fact as (_, th)) = Symtab.default (nickname_of_thm th, fact)
   456     fun add (fact as (_, th)) = Symtab.default (nickname_of_thm th, fact)
   456     val tab = fold add_fact facts Symtab.empty
   457     val tab = fold add facts Symtab.empty
   457   in map_filter (Symtab.lookup tab) end
   458     fun lookup nick =
       
   459       Symtab.lookup tab nick
       
   460       |> tap (fn NONE => trace_msg ctxt (fn () => "Cannot find " ^ quote nick)
       
   461                | _ => ())
       
   462   in map_filter lookup end
   458 
   463 
   459 fun scaled_avg [] = 0
   464 fun scaled_avg [] = 0
   460   | scaled_avg xs =
   465   | scaled_avg xs =
   461     Real.ceil (100000000.0 * fold (curry (op +)) xs 0.0) div length xs
   466     Real.ceil (100000000.0 * fold (curry (op +)) xs 0.0) div length xs
   462 
   467 
   787 fun weight_proximity_facts facts =
   792 fun weight_proximity_facts facts =
   788   facts ~~ map weight_of_proximity_fact (0 upto length facts - 1)
   793   facts ~~ map weight_of_proximity_fact (0 upto length facts - 1)
   789 
   794 
   790 val max_proximity_facts = 100
   795 val max_proximity_facts = 100
   791 
   796 
   792 fun find_mash_suggestions _ [] _ _ raw_unknown = ([], raw_unknown)
   797 fun find_mash_suggestions _ _ [] _ _ raw_unknown = ([], raw_unknown)
   793   | find_mash_suggestions max_facts suggs facts chained raw_unknown =
   798   | find_mash_suggestions ctxt max_facts suggs facts chained raw_unknown =
   794     let
   799     let
   795       val raw_mash = find_suggested_facts facts suggs
   800       val raw_mash = find_suggested_facts ctxt facts suggs
   796       val unknown_chained =
   801       val unknown_chained =
   797         inter (Thm.eq_thm_prop o pairself snd) chained raw_unknown
   802         inter (Thm.eq_thm_prop o pairself snd) chained raw_unknown
   798       val proximity =
   803       val proximity =
   799         facts |> sort (thm_ord o pairself snd o swap)
   804         facts |> sort (thm_ord o pairself snd o swap)
   800               |> take max_proximity_facts
   805               |> take max_proximity_facts
   829               (access_G, MaSh.query ctxt overlord learn max_facts
   834               (access_G, MaSh.query ctxt overlord learn max_facts
   830                                     (parents, feats, hints))
   835                                     (parents, feats, hints))
   831             end)
   836             end)
   832     val unknown = facts |> filter_out (is_fact_in_graph access_G snd)
   837     val unknown = facts |> filter_out (is_fact_in_graph access_G snd)
   833   in
   838   in
   834     find_mash_suggestions max_facts suggs facts chained unknown
   839     find_mash_suggestions ctxt max_facts suggs facts chained unknown
   835     |> pairself (map fact_of_raw_fact)
   840     |> pairself (map fact_of_raw_fact)
   836   end
   841   end
   837 
   842 
   838 fun learn_wrt_access_graph ctxt (name, parents, feats, deps) (learns, graph) =
   843 fun learn_wrt_access_graph ctxt (name, parents, feats, deps) (learns, graph) =
   839   let
   844   let