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, ...}) |