renamed Variable.import_thms to Variable.import (back again cf. ed7aa5a350ef -- Alice is no longer supported);
renamed Variable.importT_thms to Variable.importT (again);
1 (* Title: Pure/subgoal.ML
4 Tactical operations depending on local subgoal structure.
7 signature BASIC_SUBGOAL =
10 ({context: Proof.context, schematics: ctyp list * cterm list,
11 params: cterm list, asms: cterm list, concl: cterm,
12 prems: thm list} -> tactic) -> Proof.context -> int -> tactic
18 val focus: Proof.context -> int -> thm ->
19 {context: Proof.context, schematics: ctyp list * cterm list,
20 params: cterm list, asms: cterm list, concl: cterm, prems: thm list} * thm
24 structure Subgoal: SUBGOAL =
27 (* canonical proof decomposition -- similar to fix/assume/show *)
31 val ((schematics, [st']), ctxt') =
32 Variable.import true [Simplifier.norm_hhf_protect st] ctxt;
33 val ((params, goal), ctxt'') = Variable.focus_subgoal i st' ctxt';
34 val asms = Drule.strip_imp_prems goal;
35 val concl = Drule.strip_imp_concl goal;
36 val (prems, context) = Assumption.add_assumes asms ctxt'';
38 ({context = context, schematics = schematics, params = params,
39 asms = asms, concl = concl, prems = prems}, Goal.init concl)
42 fun SUBPROOF tac ctxt i st =
43 if Thm.nprems_of st < i then Seq.empty
46 val (args as {context, params, ...}, st') = focus ctxt i st;
47 fun export_closed th =
49 val (th' :: params') = ProofContext.export context ctxt (th :: map Drule.mk_term params);
50 val vs = map (Thm.dest_arg o Drule.strip_imp_concl o Thm.cprop_of) params';
51 in Drule.forall_intr_list vs th' end;
52 fun retrofit th = Thm.compose_no_flatten false (th, 0) i;
53 in Seq.lifts retrofit (Seq.map (Goal.finish #> export_closed) (tac args st')) st end
57 structure BasicSubgoal: BASIC_SUBGOAL = Subgoal;