(* Title: HOL/Tools/Sledgehammer/sledgehammer_prover.ML Author: Fabian Immler, TU Muenchen Author: Makarius Author: Jasmin Blanchette, TU Muenchen
Generic prover abstraction for Sledgehammer.
*)
signature SLEDGEHAMMER_PROVER = sig type atp_failure = ATP_Proof.atp_failure type stature = ATP_Problem_Generate.stature type type_enc = ATP_Problem_Generate.type_enc type fact = Sledgehammer_Fact.fact type proof_method = Sledgehammer_Proof_Methods.proof_method type play_outcome = Sledgehammer_Proof_Methods.play_outcome type base_slice = Sledgehammer_ATP_Systems.base_slice type atp_slice = Sledgehammer_ATP_Systems.atp_slice
datatype induction_rules = Include | Exclude | Instantiate val induction_rules_of_string : string -> induction_rules option val maybe_filter_out_induction_rules : induction_rules -> fact list -> fact list
open ATP_Proof open ATP_Util open ATP_Problem open ATP_Problem_Generate open ATP_Proof_Reconstruct open Sledgehammer_Fact open Sledgehammer_Proof_Methods open Sledgehammer_ATP_Systems
(* Identifier that distinguishes Sledgehammer from other tools that could use "Async_Manager". *) val SledgehammerN = "Sledgehammer"
datatype induction_rules = Include | Exclude | Instantiate
fun induction_rules_of_string "include" = SOME Include
| induction_rules_of_string "exclude" = SOME Exclude
| induction_rules_of_string "instantiate" = SOME Instantiate
| induction_rules_of_string _ = NONE
fun maybe_filter_out_induction_rules induction_rules : fact list -> fact list =
induction_rules = Exclude ?
filter_out (fn ((_, (_, ATP_Problem_Generate.Induction)), _) => true | _ => false)
fun slice_timeout slice_size slices timeout = let val max_threads = Multithreading.max_threads () val batches = (slices + max_threads - 1) div max_threads in
seconds (Real.fromInt slice_size * Time.toReal timeout / Real.fromInt batches) end
type prover = params -> prover_problem -> prover_slice -> prover_result
fun overlord_file_location_of_prover prover = (getenv "ISABELLE_HOME_USER", "prob_" ^ prover)
fun proof_banner mode prover_name =
(case mode of
Auto_Try => "Auto Sledgehammer (" ^ prover_name ^ ") found a proof:"
| Try => "Sledgehammer (" ^ prover_name ^ ") found a proof:"
| _ => "Try this:")
fun bunches_of_metis_methods ctxt needs_full_types needs_lam_defs = let (* metis without options (preferred) *) val preferred_method = Metis_Method (NONE, NONE, [])
(* metis with different options *) val desperate_lam_trans = if needs_lam_defs then liftingN else opaque_liftingN val option_methods =
Metis_Method (SOME full_typesN, NONE, []) ::
Metis_Method (NONE, SOME liftingN, []) ::
Metis_Method (SOME really_full_type_enc, SOME desperate_lam_trans, []) ::
(if needs_full_types then
[Metis_Method (SOME really_full_type_enc, NONE, []),
Metis_Method (SOME full_typesN, SOME desperate_lam_trans, [])] else
[Metis_Method (SOME no_typesN, SOME desperate_lam_trans, [])])
(* metis with extensionality (often needed for lifting) *) val ext_facts = [short_thm_name ctxt ext] val ext_methods =
Metis_Method (NONE, SOME liftingN, ext_facts) ::
(ifnot needs_lam_defs then
[] elseif needs_full_types then
[Metis_Method (SOME full_typesN, SOME liftingN, ext_facts)] else
[Metis_Method (SOME no_typesN, SOME liftingN, ext_facts)]) in
[[preferred_method], option_methods, ext_methods] end
fun bunches_of_smt_methods ctxt =
[map (SMT_Method o SMT_Verit) (Verit_Strategies.all_veriT_stgies (Context.Proof ctxt))]
fun bunches_of_proof_methods ctxt smt_proofs needs_full_types needs_lam_defs = let val misc_methodss =
[[Simp_Method, Auto_Method, Blast_Method, Linarith_Method, Meson_Method,
Metis_Method (NONE, NONE, []), Fastforce_Method, Force_Method, Presburger_Method,
Argo_Method, Order_Method]]
val metis_methodss =
tl (bunches_of_metis_methods ctxt needs_full_types needs_lam_defs)
val smt_methodss = if smt_proofs then
bunches_of_smt_methods ctxt else
[] in
misc_methodss @ metis_methodss @ smt_methodss end
fun facts_of_filter fact_filter factss =
(case AList.lookup (op =) factss fact_filter of
SOME facts => facts
| NONE => snd (hd factss))
fun facts_of_basic_slice (_, _, _, num_facts, fact_filter) factss = let val facts = facts_of_filter fact_filter factss val (goal_facts, nongoal_facts) = List.partition (equal sledgehammer_goal_as_fact o fst o fst) facts in
goal_facts @ take num_facts nongoal_facts end
fun is_fact_chained ((_, (sc, _)), _) = sc = Chained
fun filter_used_facts keep_chained used = filter ((member (eq_fst (op =)) used o fst) orf
(if keep_chained then is_fact_chained else K false))
val max_fact_instances = 10 (* FUDGE *) val max_schematics = 20 (* FUDGE *)
fun supported_provers ctxt = let val local_provers = sort_strings (local_atps @ SMT_Config.available_solvers_of ctxt) val remote_provers = sort_strings remote_atps in
writeln ("Supported provers: " ^ commas (local_provers @ remote_provers)) end
end;
¤ Dauer der Verarbeitung: 0.10 Sekunden
(vorverarbeitet)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung ist noch experimentell.