src/HOL/Tools/Mirabelle/mirabelle_sledgehammer.ML
changeset 74981 10df7a627ab6
parent 74967 3f55c5feca58
child 74996 1f4c39ffb116
--- 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 =>