transfer method generalizes over free variables in goal
authorhuffman
Wed, 04 Apr 2012 16:05:52 +0200
changeset 47356 19fb95255ec9
parent 47355 3d9d98e0f1a4
child 47357 15e579392a68
child 47368 4c522dff1f4d
transfer method generalizes over free variables in goal
src/HOL/Tools/transfer.ML
--- a/src/HOL/Tools/transfer.ML	Wed Apr 04 16:03:01 2012 +0200
+++ b/src/HOL/Tools/transfer.ML	Wed Apr 04 16:05:52 2012 +0200
@@ -117,6 +117,14 @@
   @{thms App_def Abs_def transfer_forall_eq [symmetric]
     transfer_implies_eq [symmetric] transfer_bforall_unfold}
 
+fun gen_frees_tac keepers ctxt = SUBGOAL (fn (t, i) =>
+  let
+    val vs = rev (Term.add_frees t [])
+    val vs' = filter_out (member (op =) keepers o fst) vs
+  in
+    Induct.arbitrary_tac ctxt 0 vs' i
+  end)
+
 fun transfer_tac ctxt = SUBGOAL (fn (t, i) =>
   let
     val bs = bnames t
@@ -147,7 +155,7 @@
   end
 
 val transfer_method : (Proof.context -> Method.method) context_parser =
-  Scan.succeed (fn ctxt => SIMPLE_METHOD' (transfer_tac ctxt))
+  Scan.succeed (fn ctxt => SIMPLE_METHOD' (gen_frees_tac [] ctxt THEN' transfer_tac ctxt))
 
 val correspondence_method : (Proof.context -> Method.method) context_parser =
   Scan.succeed (fn ctxt => SIMPLE_METHOD' (correspondence_tac ctxt))