keep formula right before skolemization, because the universal variables might be different (or differently ordered) as in the original axiom or negated conjecture from which it was skolemized
authorblanchet
Thu, 30 Jan 2014 15:01:40 +0100
changeset 55184 6e2295db4cf8
parent 55183 17ec4a29ef71
child 55185 a0bd8d6414e6
keep formula right before skolemization, because the universal variables might be different (or differently ordered) as in the original axiom or negated conjecture from which it was skolemized
src/HOL/Tools/Sledgehammer/sledgehammer_reconstruct.ML
--- a/src/HOL/Tools/Sledgehammer/sledgehammer_reconstruct.ML	Thu Jan 30 14:37:53 2014 +0100
+++ b/src/HOL/Tools/Sledgehammer/sledgehammer_reconstruct.ML	Thu Jan 30 15:01:40 2014 +0100
@@ -95,17 +95,24 @@
 
 fun add_lines_pass3 res [] = rev res
   | add_lines_pass3 res ((name, role, t, rule, deps) :: lines) =
-    if role <> Plain orelse is_skolemize_rule rule orelse is_arith_rule rule orelse
-       is_datatype_rule rule orelse
-       (* the last line must be kept *)
-       null lines orelse
-       (not (is_only_type_information t) andalso null (Term.add_tvars t [])
-        andalso length deps >= 2 andalso
-        (* don't keep next to last line, which usually results in a trivial step *)
-        not (can the_single lines)) then
-      add_lines_pass3 ((name, role, t, rule, deps) :: res) lines
-    else
-      add_lines_pass3 res (map (replace_dependencies_in_line (name, deps)) lines)
+    let
+      val is_last_line = null lines
+
+      fun looks_interesting () =
+        not (is_only_type_information t) andalso null (Term.add_tvars t [])
+        andalso length deps >= 2 andalso not (can the_single lines)
+
+      fun is_skolemizing_line (_, _, _, rule', deps') =
+        is_skolemize_rule rule' andalso member (op =) deps' name
+      fun is_before_skolemize_rule () = exists is_skolemizing_line lines
+    in
+      if role <> Plain orelse is_skolemize_rule rule orelse is_arith_rule rule orelse
+         is_datatype_rule rule orelse is_last_line orelse looks_interesting () orelse
+         is_before_skolemize_rule () then
+        add_lines_pass3 ((name, role, t, rule, deps) :: res) lines
+      else
+        add_lines_pass3 res (map (replace_dependencies_in_line (name, deps)) lines)
+    end
 
 val add_labels_of_proof =
   steps_of_proof