split option "sledgehammer_atp_dest_dir" into "sledgehammer_atp_prob_dest_dir" and "sledgehammer_atp_proof_dest_dir"
authordesharna
Tue, 11 Jan 2022 22:07:04 +0100
changeset 74981 10df7a627ab6
parent 74980 8dd527e97ddb
child 74982 a10873b3c7d4
split option "sledgehammer_atp_dest_dir" into "sledgehammer_atp_prob_dest_dir" and "sledgehammer_atp_proof_dest_dir"
NEWS
src/Doc/Sledgehammer/document/root.tex
src/HOL/TPTP/mash_eval.ML
src/HOL/Tools/Mirabelle/mirabelle_sledgehammer.ML
src/HOL/Tools/Sledgehammer/sledgehammer_prover_atp.ML
--- a/NEWS	Tue Jan 11 12:08:03 2022 +0100
+++ b/NEWS	Tue Jan 11 22:07:04 2022 +0100
@@ -43,6 +43,15 @@
     INCOMPATIBILITY.
   - Added support for TX0 and TX1 TPTP formats and $ite/$let expressions
     in TH0 and TH1.
+  - Replaced option "sledgehammer_atp_dest_dir" by
+    "sledgehammer_atp_problem_dest_dir", for problem files, and
+    "sledgehammer_atp_proof_dest_dir", for proof files. Minor INCOMPATIBILITY.
+
+* Mirabelle:
+  - Replaced sledgehammer option "keep" by
+    "keep_probs", for problems files, and
+    "keep_proofs" for proof files. Minor INCOMPATIBILITY.
+
 
 
 *** System ***
--- a/src/Doc/Sledgehammer/document/root.tex	Tue Jan 11 12:08:03 2022 +0100
+++ b/src/Doc/Sledgehammer/document/root.tex	Tue Jan 11 22:07:04 2022 +0100
@@ -1328,7 +1328,7 @@
 
 \begin{verbatim}
 isabelle mirabelle -d $AFP -O output \
-  -A "sledgehammer[provers = e, timeout = 5, keep = true]" \
+  -A "sledgehammer[provers = e, timeout = 5, keep_probs = true]" \
   VeriComp
 \end{verbatim}
 
--- a/src/HOL/TPTP/mash_eval.ML	Tue Jan 11 12:08:03 2022 +0100
+++ b/src/HOL/TPTP/mash_eval.ML	Tue Jan 11 22:07:04 2022 +0100
@@ -106,7 +106,7 @@
               let
                 val prob_prefix = "goal_" ^ string_of_int j ^ "__" ^ encode_str name ^ "__" ^ method
               in
-                Config.put atp_dest_dir dir
+                Config.put atp_problem_dest_dir dir
                 #> Config.put atp_problem_prefix (prob_prefix ^ "__")
                 #> Config.put SMT_Config.debug_files (dir ^ "/" ^ prob_prefix)
               end
--- a/src/HOL/Tools/Mirabelle/mirabelle_sledgehammer.ML	Tue Jan 11 12:08:03 2022 +0100
+++ b/src/HOL/Tools/Mirabelle/mirabelle_sledgehammer.ML	Tue Jan 11 22:07:04 2022 +0100
@@ -22,13 +22,15 @@
 val check_trivialK = "check_trivial" (*=BOOL: check if goals are "trivial"*)
 val e_selection_heuristicK = "e_selection_heuristic" (*=STRING: E clause selection heuristic*)
 val force_sosK = "force_sos" (*=BOOL: use set-of-support (in Vampire)*)
-val keepK = "keep" (*=BOOL: keep temporary files created by sledgehammer*)
+val keep_probsK = "keep_probs" (*=BOOL: keep temporary problem files created by sledgehammer*)
+val keep_proofsK = "keep_proofs" (*=BOOL: keep temporary proof files created by ATPs*)
 val proof_methodK = "proof_method" (*=STRING: how to reconstruct proofs (e.g. using metis)*)
 val term_orderK = "term_order" (*=STRING: term order (in E)*)
 
 (*defaults used in this Mirabelle action*)
 val check_trivial_default = false
-val keep_default = false
+val keep_probs_default = false
+val keep_proofs_default = false
 
 datatype sh_data = ShData of {
   calls: int,
@@ -271,23 +273,24 @@
 
 local
 
-fun run_sh params e_selection_heuristic term_order force_sos dir pos state =
+fun run_sh params e_selection_heuristic term_order force_sos keep pos state =
   let
-    fun set_file_name (SOME dir) =
+    fun set_file_name (SOME (dir, keep_probs, keep_proofs)) =
         let
           val filename = "prob_" ^
             StringCvt.padLeft #"0" 5 (str0 (Position.line_of pos)) ^ "_" ^
             StringCvt.padLeft #"0" 6 (str0 (Position.offset_of pos))
         in
-          Config.put Sledgehammer_Prover_ATP.atp_dest_dir dir
-          #> Config.put Sledgehammer_Prover_ATP.atp_problem_prefix (filename ^ "__")
+          Config.put Sledgehammer_Prover_ATP.atp_problem_prefix (filename ^ "__")
+          #> (keep_probs ? Config.put Sledgehammer_Prover_ATP.atp_problem_dest_dir dir)
+          #> (keep_proofs ? Config.put Sledgehammer_Prover_ATP.atp_proof_dest_dir dir)
           #> Config.put SMT_Config.debug_files (dir ^ "/" ^ filename ^ "__" ^ serial_string ())
         end
       | set_file_name NONE = I
     val state' =
       state
       |> Proof.map_context
-           (set_file_name dir
+           (set_file_name keep
             #> (Option.map (Config.put Sledgehammer_ATP_Systems.e_selection_heuristic)
                   e_selection_heuristic |> the_default I)
             #> (Option.map (Config.put Sledgehammer_ATP_Systems.term_order)
@@ -308,27 +311,27 @@
 in
 
 fun run_sledgehammer change_data (params as {provers, ...}) output_dir
-  e_selection_heuristic term_order force_sos keep proof_method_from_msg thy_index trivial
-  proof_method named_thms pos st =
+  e_selection_heuristic term_order force_sos keep_probs keep_proofs proof_method_from_msg thy_index
+  trivial proof_method named_thms pos st =
   let
     val thy = Proof.theory_of st
     val thy_name = Context.theory_name thy
     val triv_str = if trivial then "[T] " else ""
     val _ = change_data inc_sh_calls
     val _ = if trivial then () else change_data inc_sh_nontriv_calls
-    val keep_dir =
-      if keep then
+    val keep =
+      if keep_probs orelse keep_proofs then
         let val subdir = StringCvt.padLeft #"0" 4 (string_of_int thy_index) ^ "_" ^ thy_name in
           Path.append output_dir (Path.basic subdir)
           |> Isabelle_System.make_directory
           |> Path.implode
-          |> SOME
+          |> (fn dir => SOME (dir, keep_probs, keep_proofs))
         end
       else
         NONE
     val prover_name = hd provers
     val (sledgehamer_outcome, msg, cpu_time) =
-      run_sh params e_selection_heuristic term_order force_sos keep_dir pos st
+      run_sh params e_selection_heuristic term_order force_sos keep pos st
     val outcome_msg =
       (case sledgehamer_outcome of
         Sledgehammer.SH_Some {used_facts, run_time, ...} =>
@@ -440,7 +443,8 @@
     (* Parse Mirabelle-specific parameters *)
     val check_trivial =
       Mirabelle.get_bool_argument arguments (check_trivialK, check_trivial_default)
-    val keep = Mirabelle.get_bool_argument arguments (keepK, keep_default)
+    val keep_probs = Mirabelle.get_bool_argument arguments (keep_probsK, keep_probs_default)
+    val keep_proofs = Mirabelle.get_bool_argument arguments (keep_proofsK, keep_proofs_default)
     val e_selection_heuristic = AList.lookup (op =) arguments e_selection_heuristicK
     val term_order = AList.lookup (op =) arguments term_orderK
     val force_sos = AList.lookup (op =) arguments force_sosK
@@ -473,7 +477,8 @@
               handle Timeout.TIMEOUT _ => false
             val (outcome, log1) =
               run_sledgehammer change_data params output_dir e_selection_heuristic term_order
-                force_sos keep proof_method_from_msg theory_index trivial meth named_thms pos pre
+                force_sos keep_probs keep_proofs proof_method_from_msg theory_index trivial meth
+                named_thms pos pre
             val log2 =
               (case !named_thms of
                 SOME thms =>
--- a/src/HOL/Tools/Sledgehammer/sledgehammer_prover_atp.ML	Tue Jan 11 12:08:03 2022 +0100
+++ b/src/HOL/Tools/Sledgehammer/sledgehammer_prover_atp.ML	Tue Jan 11 22:07:04 2022 +0100
@@ -11,7 +11,8 @@
   type mode = Sledgehammer_Prover.mode
   type prover = Sledgehammer_Prover.prover
 
-  val atp_dest_dir : string Config.T
+  val atp_problem_dest_dir : string Config.T
+  val atp_proof_dest_dir : string Config.T
   val atp_problem_prefix : string Config.T
   val atp_completish : int Config.T
   val atp_full_names : bool Config.T
@@ -36,7 +37,10 @@
 open Sledgehammer_Prover
 
 (* Empty string means create files in Isabelle's temporary files directory. *)
-val atp_dest_dir = Attrib.setup_config_string \<^binding>\<open>sledgehammer_atp_dest_dir\<close> (K "")
+val atp_problem_dest_dir =
+  Attrib.setup_config_string \<^binding>\<open>sledgehammer_atp_problem_dest_dir\<close> (K "")
+val atp_proof_dest_dir =
+  Attrib.setup_config_string \<^binding>\<open>sledgehammer_atp_proof_dest_dir\<close> (K "")
 val atp_problem_prefix =
   Attrib.setup_config_string \<^binding>\<open>sledgehammer_atp_problem_prefix\<close> (K "prob")
 val atp_completish = Attrib.setup_config_int \<^binding>\<open>sledgehammer_atp_completish\<close> (K 0)
@@ -144,20 +148,25 @@
     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
-      else (Config.get ctxt atp_dest_dir, Config.get ctxt atp_problem_prefix)
+    val (problem_dest_dir, proof_dest_dir, problem_prefix) =
+      if overlord then
+        overlord_file_location_of_prover name
+        |> (fn (dir, prefix) => (dir, dir, prefix))
+      else
+        (Config.get ctxt atp_problem_dest_dir,
+         Config.get ctxt atp_proof_dest_dir,
+         Config.get ctxt atp_problem_prefix)
     val problem_file_name =
       Path.basic (problem_prefix ^ (if overlord then "" else serial_string ()) ^
         suffix_of_mode mode ^ "_" ^ string_of_int subgoal)
       |> Path.ext "p"
     val prob_path =
-      if dest_dir = "" then
+      if problem_dest_dir = "" then
         File.tmp_path problem_file_name
-      else if File.exists (Path.explode dest_dir) then
-        Path.explode dest_dir + problem_file_name
+      else if File.exists (Path.explode problem_dest_dir) then
+        Path.explode problem_dest_dir + problem_file_name
       else
-        error ("No such directory: " ^ quote dest_dir)
+        error ("No such directory: " ^ quote problem_dest_dir)
     val executable =
       (case find_first (fn var => getenv var <> "") (fst exec) of
         SOME var =>
@@ -340,17 +349,21 @@
 
     (* If the problem file has not been exported, remove it; otherwise, export
        the proof file too. *)
-    fun clean_up () = if dest_dir = "" then (try File.rm prob_path; ()) else ()
+    fun clean_up () = if problem_dest_dir = "" then (try File.rm prob_path; ()) else ()
     fun export (_, (output, _, _, _, _), _) =
       let
-        val make_export_path =
+        val proof_dest_dir_path = Path.explode proof_dest_dir
+        val make_export_file_name =
           Path.split_ext
           #> apfst (Path.explode o suffix "_proof" o Path.implode)
           #> swap
           #> uncurry Path.ext
       in
-        if dest_dir = "" then ()
-        else File.write (make_export_path prob_path) output
+        if proof_dest_dir = "" then Output.system_message "don't export proof"
+        else if File.exists proof_dest_dir_path then
+          File.write (proof_dest_dir_path + make_export_file_name problem_file_name) output
+        else
+          error ("No such directory: " ^ quote proof_dest_dir)
       end
 
     val ((_, (_, pool, lifted, sym_tab)), (output, run_time, used_from, atp_proof, outcome),