fix soundness bug in Sledgehammer: distinguish params in goals from fixed variables in context
authorblanchet
Fri, 27 May 2011 10:30:07 +0200
changeset 43004 20e9caff1f86
parent 43003 5a86009366fc
child 43005 c96f06bffd90
fix soundness bug in Sledgehammer: distinguish params in goals from fixed variables in context
src/HOL/Mirabelle/Tools/mirabelle_sledgehammer.ML
src/HOL/Mirabelle/Tools/mirabelle_sledgehammer_filter.ML
src/HOL/Tools/Sledgehammer/sledgehammer_atp_reconstruct.ML
src/HOL/Tools/Sledgehammer/sledgehammer_minimize.ML
src/HOL/Tools/Sledgehammer/sledgehammer_provers.ML
src/HOL/Tools/Sledgehammer/sledgehammer_run.ML
src/HOL/Tools/Sledgehammer/sledgehammer_util.ML
src/HOL/ex/sledgehammer_tactics.ML
--- a/src/HOL/Mirabelle/Tools/mirabelle_sledgehammer.ML	Fri May 27 10:30:07 2011 +0200
+++ b/src/HOL/Mirabelle/Tools/mirabelle_sledgehammer.ML	Fri May 27 10:30:07 2011 +0200
@@ -390,7 +390,7 @@
     val relevance_fudge =
       Sledgehammer_Provers.relevance_fudge_for_prover ctxt prover_name
     val relevance_override = {add = [], del = [], only = false}
-    val (_, hyp_ts, concl_t) = Sledgehammer_Util.strip_subgoal goal i
+    val (_, hyp_ts, concl_t) = Sledgehammer_Util.strip_subgoal ctxt goal i
     val time_limit =
       (case hard_timeout of
         NONE => I
--- a/src/HOL/Mirabelle/Tools/mirabelle_sledgehammer_filter.ML	Fri May 27 10:30:07 2011 +0200
+++ b/src/HOL/Mirabelle/Tools/mirabelle_sledgehammer_filter.ML	Fri May 27 10:30:07 2011 +0200
@@ -128,7 +128,8 @@
                (Sledgehammer_Provers.relevance_fudge_for_prover ctxt prover)
          val relevance_override = {add = [], del = [], only = false}
          val subgoal = 1
-         val (_, hyp_ts, concl_t) = Sledgehammer_Util.strip_subgoal goal subgoal
+         val (_, hyp_ts, concl_t) =
+           Sledgehammer_Util.strip_subgoal ctxt goal subgoal
          val facts =
            Sledgehammer_Filter.relevant_facts ctxt relevance_thresholds
                (the_default default_max_relevant max_relevant)
--- a/src/HOL/Tools/Sledgehammer/sledgehammer_atp_reconstruct.ML	Fri May 27 10:30:07 2011 +0200
+++ b/src/HOL/Tools/Sledgehammer/sledgehammer_atp_reconstruct.ML	Fri May 27 10:30:07 2011 +0200
@@ -1018,7 +1018,7 @@
         (metis_params as (_, _, type_sys, atp_proof, facts_offset, fact_names,
                           typed_helpers, goal, i)) =
   let
-    val (params, hyp_ts, concl_t) = strip_subgoal goal i
+    val (params, hyp_ts, concl_t) = strip_subgoal ctxt goal i
     val frees = fold Term.add_frees (concl_t :: hyp_ts) []
     val tfrees = fold Term.add_tfrees (concl_t :: hyp_ts) []
     val full_types = uses_typed_helpers typed_helpers atp_proof
--- a/src/HOL/Tools/Sledgehammer/sledgehammer_minimize.ML	Fri May 27 10:30:07 2011 +0200
+++ b/src/HOL/Tools/Sledgehammer/sledgehammer_minimize.ML	Fri May 27 10:30:07 2011 +0200
@@ -47,6 +47,7 @@
                  isar_shrink_factor, ...} : params)
         explicit_apply_opt silent (prover : prover) timeout i n state facts =
   let
+    val ctxt = Proof.context_of state
     val thy = Proof.theory_of state
     val _ =
       print silent (fn () =>
@@ -58,7 +59,7 @@
       case explicit_apply_opt of
         SOME explicit_apply => explicit_apply
       | NONE =>
-        let val (_, hyp_ts, concl_t) = strip_subgoal goal i in
+        let val (_, hyp_ts, concl_t) = strip_subgoal ctxt goal i in
           not (forall (Meson.is_fol_term thy)
                       (concl_t :: hyp_ts @ maps (map prop_of o snd) facts))
         end
--- a/src/HOL/Tools/Sledgehammer/sledgehammer_provers.ML	Fri May 27 10:30:07 2011 +0200
+++ b/src/HOL/Tools/Sledgehammer/sledgehammer_provers.ML	Fri May 27 10:30:07 2011 +0200
@@ -479,7 +479,7 @@
   let
     val thy = Proof.theory_of state
     val ctxt = Proof.context_of state
-    val (_, hyp_ts, concl_t) = strip_subgoal goal subgoal
+    val (_, hyp_ts, concl_t) = strip_subgoal ctxt goal subgoal
     val (dest_dir, problem_prefix) =
       if overlord then overlord_file_location_for_prover name
       else (Config.get ctxt dest_dir, Config.get ctxt problem_prefix)
--- a/src/HOL/Tools/Sledgehammer/sledgehammer_run.ML	Fri May 27 10:30:07 2011 +0200
+++ b/src/HOL/Tools/Sledgehammer/sledgehammer_run.ML	Fri May 27 10:30:07 2011 +0200
@@ -184,7 +184,7 @@
         state |> Proof.map_context (Config.put SMT_Config.verbose debug)
       val ctxt = Proof.context_of state
       val {facts = chained_ths, goal, ...} = Proof.goal state
-      val (_, hyp_ts, concl_t) = strip_subgoal goal i
+      val (_, hyp_ts, concl_t) = strip_subgoal ctxt goal i
       val _ = () |> not blocking ? kill_provers
       val _ = case find_first (not o is_prover_supported ctxt) provers of
                 SOME name => error ("No such prover: " ^ name ^ ".")
--- a/src/HOL/Tools/Sledgehammer/sledgehammer_util.ML	Fri May 27 10:30:07 2011 +0200
+++ b/src/HOL/Tools/Sledgehammer/sledgehammer_util.ML	Fri May 27 10:30:07 2011 +0200
@@ -28,7 +28,8 @@
   val transform_elim_prop : term -> term
   val specialize_type : theory -> (string * typ) -> term -> term
   val subgoal_count : Proof.state -> int
-  val strip_subgoal : thm -> int -> (string * typ) list * term list * term
+  val strip_subgoal :
+    Proof.context -> thm -> int -> (string * typ) list * term list * term
   val reserved_isar_keyword_table : unit -> unit Symtab.table
 end;
 
@@ -237,12 +238,14 @@
 
 val subgoal_count = Logic.count_prems o prop_of o #goal o Proof.goal
 
-fun strip_subgoal goal i =
+fun strip_subgoal ctxt goal i =
   let
-    val (t, frees) = Logic.goal_params (prop_of goal) i
+    val (t, (frees, params)) =
+      Logic.goal_params (prop_of goal) i
+      ||> (map dest_Free #> Variable.variant_frees ctxt [] #> `(map Free))
     val hyp_ts = t |> Logic.strip_assums_hyp |> map (curry subst_bounds frees)
     val concl_t = t |> Logic.strip_assums_concl |> curry subst_bounds frees
-  in (rev (map dest_Free frees), hyp_ts, concl_t) end
+  in (rev params, hyp_ts, concl_t) end
 
 fun reserved_isar_keyword_table () =
   union (op =) (Keyword.dest_keywords ()) (Keyword.dest_commands ())
--- a/src/HOL/ex/sledgehammer_tactics.ML	Fri May 27 10:30:07 2011 +0200
+++ b/src/HOL/ex/sledgehammer_tactics.ML	Fri May 27 10:30:07 2011 +0200
@@ -31,7 +31,7 @@
     val relevance_fudge =
       Sledgehammer_Provers.relevance_fudge_for_prover ctxt name
     val relevance_override = {add = [], del = [], only = false}
-    val (_, hyp_ts, concl_t) = Sledgehammer_Util.strip_subgoal goal i
+    val (_, hyp_ts, concl_t) = Sledgehammer_Util.strip_subgoal ctxt goal i
     val facts =
       Sledgehammer_Filter.relevant_facts ctxt relevance_thresholds
           (the_default default_max_relevant max_relevant) (K true)