src/HOL/Tools/Sledgehammer/sledgehammer.ML
changeset 40181 3788b7adab36
parent 40132 7ee65dbffa31
child 40184 91b4b73dbafb
equal deleted inserted replaced
40179:7ecfa9beef91 40181:3788b7adab36
     6 Sledgehammer's heart.
     6 Sledgehammer's heart.
     7 *)
     7 *)
     8 
     8 
     9 signature SLEDGEHAMMER =
     9 signature SLEDGEHAMMER =
    10 sig
    10 sig
    11   type failure = ATP_Systems.failure
    11   type failure = ATP_Proof.failure
    12   type locality = Sledgehammer_Filter.locality
    12   type locality = Sledgehammer_Filter.locality
    13   type relevance_fudge = Sledgehammer_Filter.relevance_fudge
    13   type relevance_fudge = Sledgehammer_Filter.relevance_fudge
    14   type relevance_override = Sledgehammer_Filter.relevance_override
    14   type relevance_override = Sledgehammer_Filter.relevance_override
    15   type translated_formula = Sledgehammer_ATP_Translate.translated_formula
    15   type translated_formula = Sledgehammer_ATP_Translate.translated_formula
    16   type minimize_command = Sledgehammer_ATP_Reconstruct.minimize_command
    16   type minimize_command = Sledgehammer_ATP_Reconstruct.minimize_command
    97 fun is_prover_available thy name =
    97 fun is_prover_available thy name =
    98   is_smt_prover name orelse member (op =) (available_atps thy) name
    98   is_smt_prover name orelse member (op =) (available_atps thy) name
    99 
    99 
   100 fun is_prover_installed ctxt name =
   100 fun is_prover_installed ctxt name =
   101   let val thy = ProofContext.theory_of ctxt in
   101   let val thy = ProofContext.theory_of ctxt in
   102     if is_smt_prover name then true (* FIXME *)
   102     if is_smt_prover name then SMT_Solver.is_locally_installed ctxt
   103     else is_atp_installed thy name
   103     else is_atp_installed thy name
   104   end
   104   end
   105 
   105 
   106 val smt_default_max_relevant = 300 (* FUDGE (FIXME) *)
   106 val smt_default_max_relevant = 300 (* FUDGE (FIXME) *)
   107 val auto_max_relevant_divisor = 2 (* FUDGE *)
   107 val auto_max_relevant_divisor = 2 (* FUDGE *)
   404   in
   404   in
   405     {outcome = outcome, message = message, used_axioms = used_axioms,
   405     {outcome = outcome, message = message, used_axioms = used_axioms,
   406      run_time_in_msecs = msecs}
   406      run_time_in_msecs = msecs}
   407   end
   407   end
   408 
   408 
   409 (* FIXME: dummy *)
   409 fun failure_from_smt_failure SMT_Solver.Time_Out = TimedOut
   410 fun saschas_run_smt_solver remote timeout state axioms i =
   410   | failure_from_smt_failure (SMT_Solver.Counterexample _) = Unprovable
   411   (OS.Process.sleep (Time.fromMilliseconds 1500);
   411   | failure_from_smt_failure (SMT_Solver.Other_Failure _) = UnknownError
   412    {outcome = NONE, used_axioms = axioms |> take 5 |> map fst,
       
   413     run_time_in_msecs = NONE})
       
   414 
   412 
   415 fun run_smt_solver remote ({timeout, ...} : params) minimize_command
   413 fun run_smt_solver remote ({timeout, ...} : params) minimize_command
   416                    ({state, subgoal, subgoal_count, axioms, ...}
   414                    ({state, subgoal, subgoal_count, axioms, ...}
   417                     : prover_problem) =
   415                     : prover_problem) =
   418   let
   416   let
   419     val {outcome, used_axioms, run_time_in_msecs} =
   417     val {outcome, used_facts, run_time_in_msecs} =
   420       saschas_run_smt_solver remote timeout state
   418       SMT_Solver.smt_filter remote timeout state
   421                              (map_filter (try dest_Untranslated) axioms) subgoal
   419                             (map_filter (try dest_Untranslated) axioms) subgoal
   422     val message =
   420     val message =
   423       if outcome = NONE then
   421       if outcome = NONE then
   424         try_command_line (proof_banner false)
   422         try_command_line (proof_banner false)
   425                          (apply_on_subgoal subgoal subgoal_count ^
   423                          (apply_on_subgoal subgoal subgoal_count ^
   426                           command_call smtN (map fst used_axioms)) ^
   424                           command_call smtN (map fst used_facts)) ^
   427         minimize_line minimize_command (map fst used_axioms)
   425         minimize_line minimize_command (map fst used_facts)
   428       else
   426       else
   429         ""
   427         ""
   430   in
   428   in
   431     {outcome = outcome, used_axioms = used_axioms,
   429     {outcome = outcome |> Option.map failure_from_smt_failure,
   432      run_time_in_msecs = run_time_in_msecs, message = message}
   430      used_axioms = used_facts, run_time_in_msecs = SOME run_time_in_msecs,
       
   431      message = message}
   433   end
   432   end
   434 
   433 
   435 fun get_prover thy auto name =
   434 fun get_prover thy auto name =
   436   if is_smt_prover name then run_smt_solver (String.isPrefix remote_prefix)
   435   if is_smt_prover name then run_smt_solver (String.isPrefix remote_prefix name)
   437   else run_atp auto name (get_atp thy name)
   436   else run_atp auto name (get_atp thy name)
   438 
   437 
   439 fun run_prover (params as {blocking, debug, max_relevant, timeout, expect, ...})
   438 fun run_prover (params as {blocking, debug, max_relevant, timeout, expect, ...})
   440                auto minimize_command
   439                auto minimize_command
   441                (problem as {state, goal, subgoal, subgoal_count, axioms, ...})
   440                (problem as {state, goal, subgoal, subgoal_count, axioms, ...})