src/HOL/Tools/Sledgehammer/sledgehammer_prover_minimize.ML
changeset 55205 8450622db0c5
parent 55202 824c48a539c9
child 55212 5832470d956e
--- a/src/HOL/Tools/Sledgehammer/sledgehammer_prover_minimize.ML	Fri Jan 31 10:34:20 2014 +0100
+++ b/src/HOL/Tools/Sledgehammer/sledgehammer_prover_minimize.ML	Fri Jan 31 12:30:54 2014 +0100
@@ -14,6 +14,11 @@
   type params = Sledgehammer_Prover.params
   type prover = Sledgehammer_Prover.prover
 
+  val is_prover_supported : Proof.context -> string -> bool
+  val is_prover_installed : Proof.context -> string -> bool
+  val default_max_facts_of_prover : Proof.context -> string -> int
+  val get_prover : Proof.context -> mode -> string -> prover
+
   val binary_min_facts : int Config.T
   val auto_minimize_min_facts : int Config.T
   val auto_minimize_max_time : real Config.T
@@ -24,6 +29,7 @@
     * ((reconstructor * play_outcome) Lazy.lazy * ((reconstructor * play_outcome) -> string)
        * string)
   val get_minimizing_prover : Proof.context -> mode -> (thm list -> unit) -> string -> prover
+
   val run_minimize : params -> (thm list -> unit) -> int -> (Facts.ref * Attrib.src list) list ->
     Proof.state -> unit
 end;
@@ -40,6 +46,36 @@
 open Sledgehammer_Reconstructor
 open Sledgehammer_Isar
 open Sledgehammer_Prover
+open Sledgehammer_Prover_ATP
+open Sledgehammer_Prover_SMT
+
+fun is_prover_supported ctxt =
+  let val thy = Proof_Context.theory_of ctxt in
+    is_reconstructor orf is_atp thy orf is_smt_prover ctxt
+  end
+
+fun is_prover_installed ctxt =
+  is_reconstructor orf is_smt_prover ctxt orf is_atp_installed (Proof_Context.theory_of ctxt)
+
+val reconstructor_default_max_facts = 20
+
+fun default_max_facts_of_prover ctxt name =
+  let val thy = Proof_Context.theory_of ctxt in
+    if is_reconstructor name then
+      reconstructor_default_max_facts
+    else if is_atp thy name then
+      fold (Integer.max o fst o #1 o fst o snd) (#best_slices (get_atp thy name ()) ctxt) 0
+    else (* is_smt_prover ctxt name *)
+      SMT_Solver.default_max_relevant ctxt name
+  end
+
+fun get_prover ctxt mode name =
+  let val thy = Proof_Context.theory_of ctxt in
+    if is_reconstructor name then run_reconstructor mode name
+    else if is_atp thy name then run_atp mode name
+    else if is_smt_prover ctxt name then run_smt_solver mode name
+    else error ("No such prover: " ^ name ^ ".")
+  end
 
 (* wrapper for calling external prover *)
 
@@ -234,16 +270,17 @@
      timeout = timeout, preplay_timeout = preplay_timeout, expect = expect}
   end
 
-fun maybe_minimize ctxt mode do_learn name
-        (params as {verbose, isar_proofs, minimize, ...})
-        ({state, goal, subgoal, subgoal_count, ...} : prover_problem)
-        (result as {outcome, used_facts, used_from, run_time, preplay, message,
-                    message_tail} : prover_result) =
+fun maybe_minimize ctxt mode do_learn name (params as {verbose, isar_proofs, minimize, ...})
+    ({state, goal, subgoal, subgoal_count, ...} : prover_problem)
+    (result as {outcome, used_facts, used_from, run_time, preplay, message, message_tail} :
+     prover_result) =
   if is_some outcome orelse null used_facts then
     result
   else
     let
+      val thy = Proof_Context.theory_of ctxt
       val num_facts = length used_facts
+
       val ((perhaps_minimize, (minimize_name, params)), preplay) =
         if mode = Normal then
           if num_facts >= Config.get ctxt auto_minimize_min_facts then
@@ -261,7 +298,7 @@
                  if isar_proofs = SOME true then
                    (* Cheat: Assume the selected ATP is as fast as "metis" for the goal it proved
                       itself. *)
-                   (can_min_fast_enough timeout, (isar_proof_reconstructor ctxt name, params))
+                   (can_min_fast_enough timeout, (isar_supported_prover_of thy name, params))
                  else if can_min_fast_enough timeout then
                    (true, extract_reconstructor params reconstr
                           ||> (fn override_params =>