use same order of facts for preplay as for actual reconstruction -- Metis sometimes exhibits very different timings depending on the order of the facts
authorblanchet
Wed, 07 Dec 2011 16:03:05 +0100
changeset 45781 fc2c368b5f54
parent 45780 cef82dc1462d
child 45783 3e8a2464f607
use same order of facts for preplay as for actual reconstruction -- Metis sometimes exhibits very different timings depending on the order of the facts
src/HOL/Tools/Sledgehammer/sledgehammer_provers.ML
--- a/src/HOL/Tools/Sledgehammer/sledgehammer_provers.ML	Wed Dec 07 16:03:05 2011 +0100
+++ b/src/HOL/Tools/Sledgehammer/sledgehammer_provers.ML	Wed Dec 07 16:03:05 2011 +0100
@@ -441,7 +441,7 @@
 
 fun filter_used_facts used = filter (member (op =) used o fst)
 
-fun play_one_line_proof mode debug verbose timeout ths state i preferred
+fun play_one_line_proof mode debug verbose timeout pairs state i preferred
                         reconstrs =
   let
     val _ =
@@ -449,6 +449,7 @@
         Output.urgent_message "Preplaying proof..."
       else
         ()
+    val ths = pairs |> sort_wrt (fst o fst) |> map snd
     fun get_preferred reconstrs =
       if member (op =) reconstrs preferred then preferred
       else List.last reconstrs
@@ -802,12 +803,11 @@
           (used_facts,
            fn () =>
               let
-                val used_ths =
+                val used_pairs =
                   facts |> map untranslated_fact |> filter_used_facts used_facts
-                        |> map snd
               in
-                play_one_line_proof mode debug verbose preplay_timeout used_ths
-                                    state subgoal (hd reconstrs) reconstrs
+                play_one_line_proof mode debug verbose preplay_timeout
+                    used_pairs state subgoal (hd reconstrs) reconstrs
               end,
            fn preplay =>
               let
@@ -978,15 +978,15 @@
     val num_facts = length facts
     val facts = facts ~~ (0 upto num_facts - 1)
                 |> map (smt_weighted_fact ctxt num_facts)
-    val {outcome, used_facts, run_time} =
+    val {outcome, used_facts = used_pairs, run_time} =
       smt_filter_loop ctxt name params state subgoal smt_filter facts
-    val (used_facts, used_ths) = used_facts |> ListPair.unzip
+    val used_facts = used_pairs |> map fst
     val outcome = outcome |> Option.map failure_from_smt_failure
     val (preplay, message, message_tail) =
       case outcome of
         NONE =>
         (fn () =>
-            play_one_line_proof mode debug verbose preplay_timeout used_ths
+            play_one_line_proof mode debug verbose preplay_timeout used_pairs
                 state subgoal SMT
                 (bunch_of_reconstructors false
                      (fn plain =>
@@ -1023,11 +1023,11 @@
         SMT
       else
         raise Fail ("unknown reconstructor: " ^ quote name)
-    val (used_facts, used_ths) =
-      facts |> map untranslated_fact |> ListPair.unzip
+    val used_pairs = facts |> map untranslated_fact
+    val used_facts = used_pairs |> map fst
   in
     case play_one_line_proof (if mode = Minimize then Normal else mode) debug
-                             verbose timeout used_ths state subgoal reconstr
+                             verbose timeout used_pairs state subgoal reconstr
                              [reconstr] of
       play as Played (_, time) =>
       {outcome = NONE, used_facts = used_facts, run_time = time,