src/Pure/subgoal.ML
changeset 20219 3bff4719f3d6
parent 20210 8fe4ae4360eb
child 20231 dcdd565a7fbe
--- a/src/Pure/subgoal.ML	Wed Jul 26 19:37:41 2006 +0200
+++ b/src/Pure/subgoal.ML	Wed Jul 26 19:37:42 2006 +0200
@@ -8,16 +8,17 @@
 signature BASIC_SUBGOAL =
 sig
   val SUBPROOF: Proof.context ->
-    ({context: Proof.context, asms: cterm list, concl: cterm,
-      params: (string * typ) list, prems: thm list} -> tactic) -> int -> tactic
+    ({context: Proof.context, schematics: ctyp list * cterm list,
+      params: cterm list, asms: cterm list, concl: cterm,
+      prems: thm list} -> tactic) -> int -> tactic
 end
 
 signature SUBGOAL =
 sig
   include BASIC_SUBGOAL
   val focus: Proof.context -> int -> thm ->
-   {context: Proof.context, asms: cterm list, concl: cterm,
-    params: (string * typ) list, prems: thm list} * thm
+   {context: Proof.context, schematics: ctyp list * cterm list,
+    params: cterm list, asms: cterm list, concl: cterm, prems: thm list} * thm
 
 end;
 
@@ -28,23 +29,28 @@
 
 fun focus ctxt i st =
   let
-    val ([st'], ctxt') = Variable.import true [Goal.norm_hhf st] ctxt;
+    val ((schematics, [st']), ctxt') = Variable.import true [Goal.norm_hhf st] ctxt;
     val ((params, goal), ctxt'') = Variable.focus (Thm.cprem_of st' i) ctxt';
     val asms = Drule.strip_imp_prems goal;
     val concl = Drule.strip_imp_concl goal;
     val (prems, context) = ProofContext.add_assumes asms ctxt'';
   in
-    ({context = context, asms = asms, concl = concl, params = params, prems = prems},
-      Goal.init concl)
+    ({context = context, schematics = schematics, params = params,
+      asms = asms, concl = concl, prems = prems}, Goal.init concl)
   end;
 
 fun SUBPROOF ctxt tac i st =
   if Thm.nprems_of st < i then Seq.empty
   else
     let
-      val (args as {context, ...}, st') = focus ctxt i st
-      val result = Goal.conclude #> Seq.singleton (ProofContext.goal_exports context ctxt);
-    in Seq.lifts (fn res => Proof.goal_tac res i) (Seq.maps result (tac args st')) st end
+      val (args as {context, params, ...}, st') = focus ctxt i st;
+      fun export_closed th =
+        let
+          val (th' :: params') = ProofContext.export context ctxt (th :: map Drule.mk_term params);
+          val vs = map (#2 o Thm.dest_comb o Drule.strip_imp_concl o Thm.cprop_of) params';
+        in Drule.forall_intr_list vs th' end;
+      fun retrofit th = Thm.compose_no_flatten false (th, 0) i;
+    in Seq.lifts retrofit (Seq.map (Goal.finish #> export_closed) (tac args st')) st end
 
 end;