refined experimental option of Sledgehammer
authorblanchet
Mon, 28 Mar 2016 12:05:47 +0200
changeset 62718 27333dc58e28
parent 62717 8adf274f5988
child 62719 2e05b5ad6ae1
refined experimental option of Sledgehammer
src/HOL/TPTP/atp_problem_import.ML
src/HOL/Tools/ATP/atp_problem_generate.ML
src/HOL/Tools/Sledgehammer/sledgehammer_prover_atp.ML
--- a/src/HOL/TPTP/atp_problem_import.ML	Sat Mar 26 18:51:58 2016 +0100
+++ b/src/HOL/TPTP/atp_problem_import.ML	Mon Mar 28 12:05:47 2016 +0200
@@ -185,7 +185,7 @@
     val thy = Proof_Context.theory_of ctxt
     val assm_ths0 = map (Skip_Proof.make_thm thy) assms
     val ((assm_name, _), ctxt) = ctxt
-      |> Config.put Sledgehammer_Prover_ATP.atp_completish (completeness > 0)
+      |> Config.put Sledgehammer_Prover_ATP.atp_completish (if completeness > 0 then 2 else 0)
       |> Local_Theory.note ((@{binding thms}, []), assm_ths0)
 
     fun ref_of th = (Facts.named (Thm.derivation_name th), [])
--- a/src/HOL/Tools/ATP/atp_problem_generate.ML	Sat Mar 26 18:51:58 2016 +0100
+++ b/src/HOL/Tools/ATP/atp_problem_generate.ML	Mon Mar 28 12:05:47 2016 +0200
@@ -15,7 +15,7 @@
   type atp_formula_role = ATP_Problem.atp_formula_role
   type 'a atp_problem = 'a ATP_Problem.atp_problem
 
-  datatype mode = Metis | Sledgehammer | Sledgehammer_Completish | Exporter | Translator
+  datatype mode = Metis | Sledgehammer | Sledgehammer_Completish of int | Exporter | Translator
 
   datatype scope = Global | Local | Assum | Chained
   datatype status = General | Induction | Intro | Inductive | Elim | Simp | Non_Rec_Def | Rec_Def
@@ -126,7 +126,7 @@
 open ATP_Util
 open ATP_Problem
 
-datatype mode = Metis | Sledgehammer | Sledgehammer_Completish | Exporter | Translator
+datatype mode = Metis | Sledgehammer | Sledgehammer_Completish of int | Exporter | Translator
 
 datatype scope = Global | Local | Assum | Chained
 datatype status = General | Induction | Intro | Inductive | Elim | Simp | Non_Rec_Def | Rec_Def
@@ -1530,7 +1530,7 @@
 val predicator_iconst = IConst (`(make_fixed_const NONE) predicator_name, @{typ "bool => bool"}, [])
 
 fun predicatify completish tm =
-  if completish then
+  if completish > 0 then
     IApp (IApp (IConst (`I tptp_equal, @{typ "bool => bool => bool"}, []), tm), fTrue_iconst)
   else
     IApp (predicator_iconst, tm)
@@ -1734,14 +1734,14 @@
       fold (fn ((helper_s, needs_sound), ths) =>
                if (needs_sound andalso not sound) orelse
                   (helper_s <> unmangled_s andalso
-                   (not completish orelse could_specialize)) then
+                   (completish < 2 orelse could_specialize)) then
                  I
                else
                  ths ~~ (1 upto length ths)
                  |> maps (dub_and_inst needs_sound o apfst (apsnd Thm.prop_of))
                  |> make_facts
                  |> union (op = o apply2 #iformula))
-           (if completish then completish_helper_table else helper_table)
+           (if completish >= 2 then completish_helper_table else helper_table)
     end
   | NONE => I)
 fun helper_facts_of_sym_table ctxt format type_enc completish sym_tab =
@@ -2169,7 +2169,7 @@
 fun default_mono level completish =
   {maybe_finite_Ts = [@{typ bool}],
    surely_infinite_Ts = (case level of Nonmono_Types (Strict, _) => [] | _ => known_infinite_types),
-   maybe_nonmono_Ts = [if completish then tvar_a else @{typ bool}]}
+   maybe_nonmono_Ts = [if completish >= 2 then tvar_a else @{typ bool}]}
 
 (* This inference is described in section 4 of Blanchette et al., "Encoding
    monomorphic and polymorphic types", TACAS 2013. *)
@@ -2572,13 +2572,13 @@
   let
     val thy = Proof_Context.theory_of ctxt
     val type_enc = type_enc |> adjust_type_enc format
-    val completish = (mode = Sledgehammer_Completish)
+    val completish = (case mode of Sledgehammer_Completish k => k | _ => 0)
     (* Forcing explicit applications is expensive for polymorphic encodings,
        because it takes only one existential variable ranging over "'a => 'b" to
        ruin everything. Hence we do it only if there are few facts (which is
        normally the case for "metis" and the minimizer). *)
     val app_op_level =
-      if completish then
+      if completish > 0 then
         Full_App_Op_And_Predicator
       else if length facts + length hyp_ts >= app_op_and_predicator_threshold then
         if is_type_enc_polymorphic type_enc then Min_App_Op else Sufficient_App_Op
--- a/src/HOL/Tools/Sledgehammer/sledgehammer_prover_atp.ML	Sat Mar 26 18:51:58 2016 +0100
+++ b/src/HOL/Tools/Sledgehammer/sledgehammer_prover_atp.ML	Mon Mar 28 12:05:47 2016 +0200
@@ -13,7 +13,7 @@
 
   val atp_dest_dir : string Config.T
   val atp_problem_prefix : string Config.T
-  val atp_completish : bool Config.T
+  val atp_completish : int Config.T
   val atp_full_names : bool Config.T
 
   val is_ho_atp : Proof.context -> string -> bool
@@ -41,7 +41,7 @@
 val atp_dest_dir = Attrib.setup_config_string @{binding sledgehammer_atp_dest_dir} (K "")
 val atp_problem_prefix =
   Attrib.setup_config_string @{binding sledgehammer_atp_problem_prefix} (K "prob")
-val atp_completish = Attrib.setup_config_bool @{binding sledgehammer_atp_completish} (K false)
+val atp_completish = Attrib.setup_config_int @{binding sledgehammer_atp_completish} (K 0)
 (* In addition to being easier to read, readable names are often much shorter, especially if types
    are mangled in names. This makes a difference for some provers (e.g., E). For these reason, short
    names are enabled by default. *)
@@ -146,7 +146,8 @@
     val waldmeister_new = (local_name = waldmeister_newN)
     val spassy = (local_name = pirateN orelse local_name = spassN)
 
-    val atp_mode = if Config.get ctxt atp_completish then Sledgehammer_Completish else Sledgehammer
+    val completish = Config.get ctxt atp_completish
+    val atp_mode = if completish > 0 then Sledgehammer_Completish completish else Sledgehammer
     val (_, hyp_ts, concl_t) = strip_subgoal goal subgoal ctxt
     val (dest_dir, problem_prefix) =
       if overlord then overlord_file_location_of_prover name