src/HOL/Tools/Sledgehammer/sledgehammer_mash.ML
changeset 53099 5c7780d21d24
parent 53098 db5e1b53bbfc
child 53101 54f3c94c5ec1
equal deleted inserted replaced
53098:db5e1b53bbfc 53099:5c7780d21d24
   143 fun write_file banner (xs, f) path =
   143 fun write_file banner (xs, f) path =
   144   (case banner of SOME s => File.write path s | NONE => ();
   144   (case banner of SOME s => File.write path s | NONE => ();
   145    xs |> chunk_list 500 |> List.app (File.append path o implode o map f))
   145    xs |> chunk_list 500 |> List.app (File.append path o implode o map f))
   146   handle IO.Io _ => ()
   146   handle IO.Io _ => ()
   147 
   147 
   148 fun run_mash_tool ctxt overlord save max_suggs write_cmds read_suggs =
   148 fun run_mash_tool ctxt overlord save write_cmds read_suggs =
   149   let
   149   let
   150     val (temp_dir, serial) =
   150     val (temp_dir, serial) =
   151       if overlord then (getenv "ISABELLE_HOME_USER", "")
   151       if overlord then (getenv "ISABELLE_HOME_USER", "")
   152       else (getenv "ISABELLE_TMP", serial_string ())
   152       else (getenv "ISABELLE_TMP", serial_string ())
   153     val log_file = if overlord then temp_dir ^ "/mash_log" else "/dev/null"
   153     val log_file = if overlord then temp_dir ^ "/mash_log" else "/dev/null"
   224   encode_features feats ^ "; " ^ encode_strs deps ^ "\n"
   224   encode_features feats ^ "; " ^ encode_strs deps ^ "\n"
   225 
   225 
   226 fun str_of_relearn (name, deps) =
   226 fun str_of_relearn (name, deps) =
   227   "p " ^ encode_str name ^ ": " ^ encode_strs deps ^ "\n"
   227   "p " ^ encode_str name ^ ": " ^ encode_strs deps ^ "\n"
   228 
   228 
   229 fun str_of_query (learns, hints, parents, feats) =
   229 fun str_of_query max_suggs (learns, hints, parents, feats) =
   230   implode (map str_of_learn learns) ^
   230   implode (map str_of_learn learns) ^
   231   "? " ^ encode_strs parents ^ "; " ^ encode_features feats ^
   231   "? " ^ string_of_int max_suggs ^ " # " ^ encode_strs parents ^ "; " ^
       
   232   encode_features feats ^
   232   (if null hints then "" else "; " ^ encode_strs hints) ^ "\n"
   233   (if null hints then "" else "; " ^ encode_strs hints) ^ "\n"
   233 
   234 
   234 (* The suggested weights don't make much sense. *)
   235 (* The suggested weights don't make much sense. *)
   235 fun extract_suggestion sugg =
   236 fun extract_suggestion sugg =
   236   case space_explode "=" sugg of
   237   case space_explode "=" sugg of
   259 
   260 
   260 fun learn _ _ [] = ()
   261 fun learn _ _ [] = ()
   261   | learn ctxt overlord learns =
   262   | learn ctxt overlord learns =
   262     (trace_msg ctxt (fn () => "MaSh learn " ^
   263     (trace_msg ctxt (fn () => "MaSh learn " ^
   263          elide_string 1000 (space_implode " " (map #1 learns)));
   264          elide_string 1000 (space_implode " " (map #1 learns)));
   264      run_mash_tool ctxt overlord true 0 (learns, str_of_learn) (K ()))
   265      run_mash_tool ctxt overlord true (learns, str_of_learn) (K ()))
   265 
   266 
   266 fun relearn _ _ [] = ()
   267 fun relearn _ _ [] = ()
   267   | relearn ctxt overlord relearns =
   268   | relearn ctxt overlord relearns =
   268     (trace_msg ctxt (fn () => "MaSh relearn " ^
   269     (trace_msg ctxt (fn () => "MaSh relearn " ^
   269          elide_string 1000 (space_implode " " (map #1 relearns)));
   270          elide_string 1000 (space_implode " " (map #1 relearns)));
   270      run_mash_tool ctxt overlord true 0 (relearns, str_of_relearn) (K ()))
   271      run_mash_tool ctxt overlord true (relearns, str_of_relearn) (K ()))
   271 
   272 
   272 fun query ctxt overlord max_suggs (query as (learns, hints, _, feats)) =
   273 fun query ctxt overlord max_suggs (query as (learns, hints, _, feats)) =
   273   (trace_msg ctxt (fn () => "MaSh query " ^ encode_features feats);
   274   (trace_msg ctxt (fn () => "MaSh query " ^ encode_features feats);
   274    run_mash_tool ctxt overlord false max_suggs ([query], str_of_query)
   275    run_mash_tool ctxt overlord false ([query], str_of_query max_suggs)
   275        (fn suggs =>
   276        (fn suggs =>
   276            case suggs () of
   277            case suggs () of
   277              [] => []
   278              [] => []
   278            | suggs => snd (extract_suggestions (List.last suggs)))
   279            | suggs => snd (extract_suggestions (List.last suggs)))
   279    handle List.Empty => [])
   280    handle List.Empty => [])