src/HOL/Tools/Sledgehammer/sledgehammer_isar.ML
changeset 40941 a3e6f8634a11
parent 40931 061b8257ab9f
child 41087 d7b5fd465198
equal deleted inserted replaced
40940:ff805bb109d8 40941:a3e6f8634a11
   128   type T = raw_param list
   128   type T = raw_param list
   129   val empty = default_default_params |> map (apsnd single)
   129   val empty = default_default_params |> map (apsnd single)
   130   val extend = I
   130   val extend = I
   131   fun merge p : T = AList.merge (op =) (K true) p)
   131   fun merge p : T = AList.merge (op =) (K true) p)
   132 
   132 
   133 fun remotify_prover_if_available_and_not_already_remote thy name =
   133 fun remotify_prover_if_available_and_not_already_remote ctxt name =
   134   if String.isPrefix remote_prefix name then
   134   if String.isPrefix remote_prefix name then
   135     SOME name
   135     SOME name
   136   else
   136   else
   137     let val remote_name = remote_prefix ^ name in
   137     let val remote_name = remote_prefix ^ name in
   138       if is_prover_available thy remote_name then SOME remote_name else NONE
   138       if is_prover_available ctxt remote_name then SOME remote_name else NONE
   139     end
   139     end
   140 
   140 
   141 fun remotify_prover_if_not_installed ctxt name =
   141 fun remotify_prover_if_not_installed ctxt name =
   142   let val thy = ProofContext.theory_of ctxt in
   142   if is_prover_available ctxt name andalso is_prover_installed ctxt name then
   143     if is_prover_available thy name andalso is_prover_installed ctxt name then
   143     SOME name
   144       SOME name
   144   else
   145     else
   145     remotify_prover_if_available_and_not_already_remote ctxt name
   146       remotify_prover_if_available_and_not_already_remote thy name
       
   147   end
       
   148 
   146 
   149 fun avoid_too_many_local_threads _ _ [] = []
   147 fun avoid_too_many_local_threads _ _ [] = []
   150   | avoid_too_many_local_threads thy 0 provers =
   148   | avoid_too_many_local_threads ctxt 0 provers =
   151     map_filter (remotify_prover_if_available_and_not_already_remote thy) provers
   149     map_filter (remotify_prover_if_available_and_not_already_remote ctxt)
   152   | avoid_too_many_local_threads thy n (prover :: provers) =
   150                provers
       
   151   | avoid_too_many_local_threads ctxt n (prover :: provers) =
   153     let val n = if String.isPrefix remote_prefix prover then n else n - 1 in
   152     let val n = if String.isPrefix remote_prefix prover then n else n - 1 in
   154       prover :: avoid_too_many_local_threads thy n provers
   153       prover :: avoid_too_many_local_threads ctxt n provers
   155     end
   154     end
   156 
   155 
   157 (* The first ATP of the list is used by Auto Sledgehammer. Because of the low
   156 (* The first ATP of the list is used by Auto Sledgehammer. Because of the low
   158    timeout, it makes sense to put SPASS first. *)
   157    timeout, it makes sense to put SPASS first. *)
   159 fun default_provers_param_value ctxt =
   158 fun default_provers_param_value ctxt =
   160   let val thy = ProofContext.theory_of ctxt in
   159   [spassN, eN, vampireN, sine_eN, SMT_Solver.solver_name_of ctxt]
   161     [spassN, eN, vampireN, sine_eN, smtN]
   160   |> map_filter (remotify_prover_if_not_installed ctxt)
   162     |> map_filter (remotify_prover_if_not_installed ctxt)
   161   |> avoid_too_many_local_threads ctxt (Multithreading.max_threads_value ())
   163     |> avoid_too_many_local_threads thy (Multithreading.max_threads_value ())
   162   |> space_implode " "
   164     |> space_implode " "
       
   165   end
       
   166 
   163 
   167 val set_default_raw_param = Data.map o AList.update (op =) o unalias_raw_param
   164 val set_default_raw_param = Data.map o AList.update (op =) o unalias_raw_param
   168 fun default_raw_params ctxt =
   165 fun default_raw_params ctxt =
   169   let val thy = ProofContext.theory_of ctxt in
   166   let val thy = ProofContext.theory_of ctxt in
   170     Data.get thy
   167     Data.get thy
   268   (if i = 1 then "" else " " ^ string_of_int i)
   265   (if i = 1 then "" else " " ^ string_of_int i)
   269 
   266 
   270 fun hammer_away override_params subcommand opt_i relevance_override state =
   267 fun hammer_away override_params subcommand opt_i relevance_override state =
   271   let
   268   let
   272     val ctxt = Proof.context_of state
   269     val ctxt = Proof.context_of state
   273     val thy = Proof.theory_of state
       
   274     val _ = app check_raw_param override_params
   270     val _ = app check_raw_param override_params
   275   in
   271   in
   276     if subcommand = runN then
   272     if subcommand = runN then
   277       let val i = the_default 1 opt_i in
   273       let val i = the_default 1 opt_i in
   278         run_sledgehammer (get_params false ctxt override_params) false i
   274         run_sledgehammer (get_params false ctxt override_params) false i
   284       run_minimize (get_params false ctxt override_params) (the_default 1 opt_i)
   280       run_minimize (get_params false ctxt override_params) (the_default 1 opt_i)
   285                    (#add relevance_override) state
   281                    (#add relevance_override) state
   286     else if subcommand = messagesN then
   282     else if subcommand = messagesN then
   287       messages opt_i
   283       messages opt_i
   288     else if subcommand = available_proversN then
   284     else if subcommand = available_proversN then
   289       available_provers thy
   285       available_provers ctxt
   290     else if subcommand = running_proversN then
   286     else if subcommand = running_proversN then
   291       running_provers ()
   287       running_provers ()
   292     else if subcommand = kill_proversN then
   288     else if subcommand = kill_proversN then
   293       kill_provers ()
   289       kill_provers ()
   294     else if subcommand = refresh_tptpN then
   290     else if subcommand = refresh_tptpN then