src/Pure/subgoal.ML
author wenzelm
Tue, 03 Apr 2007 19:24:13 +0200
changeset 22568 ed7aa5a350ef
parent 21605 4e7307e229b3
child 29606 fedb8be05f24
permissions -rw-r--r--
renamed Variable.import to import_thms (avoid clash with Alice keywords);
wenzelm@20210
     1
(*  Title:      Pure/subgoal.ML
wenzelm@20210
     2
    ID:         $Id$
wenzelm@20210
     3
    Author:     Makarius
wenzelm@20210
     4
wenzelm@20210
     5
Tactical operations depending on local subgoal structure.
wenzelm@20210
     6
*)
wenzelm@20210
     7
wenzelm@20210
     8
signature BASIC_SUBGOAL =
wenzelm@20210
     9
sig
wenzelm@20231
    10
  val SUBPROOF:
wenzelm@20219
    11
    ({context: Proof.context, schematics: ctyp list * cterm list,
wenzelm@20219
    12
      params: cterm list, asms: cterm list, concl: cterm,
wenzelm@20231
    13
      prems: thm list} -> tactic) -> Proof.context -> int -> tactic
wenzelm@20210
    14
end
wenzelm@20210
    15
wenzelm@20210
    16
signature SUBGOAL =
wenzelm@20210
    17
sig
wenzelm@20210
    18
  include BASIC_SUBGOAL
wenzelm@20210
    19
  val focus: Proof.context -> int -> thm ->
wenzelm@20219
    20
   {context: Proof.context, schematics: ctyp list * cterm list,
wenzelm@20219
    21
    params: cterm list, asms: cterm list, concl: cterm, prems: thm list} * thm
wenzelm@20210
    22
wenzelm@20210
    23
end;
wenzelm@20210
    24
wenzelm@20210
    25
structure Subgoal: SUBGOAL =
wenzelm@20210
    26
struct
wenzelm@20210
    27
wenzelm@20210
    28
(* canonical proof decomposition -- similar to fix/assume/show *)
wenzelm@20210
    29
wenzelm@20210
    30
fun focus ctxt i st =
wenzelm@20210
    31
  let
wenzelm@21605
    32
    val ((schematics, [st']), ctxt') =
wenzelm@22568
    33
      Variable.import_thms true [MetaSimplifier.norm_hhf_protect st] ctxt;
wenzelm@20301
    34
    val ((params, goal), ctxt'') = Variable.focus_subgoal i st' ctxt';
wenzelm@20210
    35
    val asms = Drule.strip_imp_prems goal;
wenzelm@20210
    36
    val concl = Drule.strip_imp_concl goal;
wenzelm@20231
    37
    val (prems, context) = Assumption.add_assumes asms ctxt'';
wenzelm@20210
    38
  in
wenzelm@20219
    39
    ({context = context, schematics = schematics, params = params,
wenzelm@20219
    40
      asms = asms, concl = concl, prems = prems}, Goal.init concl)
wenzelm@20210
    41
  end;
wenzelm@20210
    42
wenzelm@20231
    43
fun SUBPROOF tac ctxt i st =
wenzelm@20210
    44
  if Thm.nprems_of st < i then Seq.empty
wenzelm@20210
    45
  else
wenzelm@20210
    46
    let
wenzelm@20219
    47
      val (args as {context, params, ...}, st') = focus ctxt i st;
wenzelm@20219
    48
      fun export_closed th =
wenzelm@20219
    49
        let
wenzelm@20219
    50
          val (th' :: params') = ProofContext.export context ctxt (th :: map Drule.mk_term params);
wenzelm@20579
    51
          val vs = map (Thm.dest_arg o Drule.strip_imp_concl o Thm.cprop_of) params';
wenzelm@20219
    52
        in Drule.forall_intr_list vs th' end;
wenzelm@20219
    53
      fun retrofit th = Thm.compose_no_flatten false (th, 0) i;
wenzelm@20219
    54
    in Seq.lifts retrofit (Seq.map (Goal.finish #> export_closed) (tac args st')) st end
wenzelm@20210
    55
wenzelm@20210
    56
end;
wenzelm@20210
    57
wenzelm@20210
    58
structure BasicSubgoal: BASIC_SUBGOAL = Subgoal;
wenzelm@20210
    59
open BasicSubgoal;