clarified prems: full subgoal is imported in any case, to avoid remaining schematic variables;
--- a/src/Pure/subgoal.ML Wed Jul 01 21:57:21 2015 +0200
+++ b/src/Pure/subgoal.ML Wed Jul 01 22:11:23 2015 +0200
@@ -15,11 +15,13 @@
type focus = {context: Proof.context, params: (string * cterm) list, prems: thm list,
asms: cterm list, concl: cterm, schematics: (ctyp * ctyp) list * (cterm * cterm) list}
val focus_params: Proof.context -> int -> thm -> focus * thm
+ val focus_params_fixed: Proof.context -> int -> thm -> focus * thm
val focus_prems: Proof.context -> int -> thm -> focus * thm
val focus: Proof.context -> int -> thm -> focus * thm
val retrofit: Proof.context -> Proof.context -> (string * cterm) list -> cterm list ->
int -> thm -> thm -> thm Seq.seq
val FOCUS_PARAMS: (focus -> tactic) -> Proof.context -> int -> tactic
+ val FOCUS_PARAMS_FIXED: (focus -> tactic) -> Proof.context -> int -> tactic
val FOCUS_PREMS: (focus -> tactic) -> Proof.context -> int -> tactic
val FOCUS: (focus -> tactic) -> Proof.context -> int -> tactic
val SUBPROOF: (focus -> tactic) -> Proof.context -> int -> tactic
@@ -63,6 +65,7 @@
end;
val focus_params = gen_focus (false, false);
+val focus_params_fixed = gen_focus (false, true);
val focus_prems = gen_focus (true, false);
val focus = gen_focus (true, true);
@@ -149,6 +152,7 @@
in Seq.lifts (retrofit ctxt' ctxt params asms i) (tac args st') st end;
val FOCUS_PARAMS = GEN_FOCUS (false, false);
+val FOCUS_PARAMS_FIXED = GEN_FOCUS (false, true);
val FOCUS_PREMS = GEN_FOCUS (true, false);
val FOCUS = GEN_FOCUS (true, true);
@@ -159,7 +163,7 @@
local
-fun gen_focus prep_atts raw_result_binding raw_prems_binding params state =
+fun gen_subgoal prep_atts raw_result_binding raw_prems_binding params state =
let
val _ = Proof.assert_backward state;
val {context = ctxt, facts = facts, goal = st} = Proof.raw_goal state;
@@ -174,7 +178,8 @@
val _ = List.app check_param params;
val _ = if Thm.no_prems st then error "No subgoals!" else ();
- val subgoal_focus = #1 (focus ctxt 1 st); (* FIXME clarify prems/params *)
+ val subgoal_focus =
+ #1 ((if do_prems then focus else focus_params_fixed) ctxt 1 st);
fun after_qed (ctxt'', [[result]]) =
Proof.end_block #> (fn state' =>
@@ -209,8 +214,8 @@
in
-val subgoal = gen_focus Attrib.attribute;
-val subgoal_cmd = gen_focus Attrib.attribute_cmd;
+val subgoal = gen_subgoal Attrib.attribute;
+val subgoal_cmd = gen_subgoal Attrib.attribute_cmd;
end;