src/Pure/context_tactic.ML
changeset 70521 9ddd66d53130
parent 70520 11d8517d9384
equal deleted inserted replaced
70520:11d8517d9384 70521:9ddd66d53130
    14   val CONTEXT_TACTIC: tactic -> context_tactic
    14   val CONTEXT_TACTIC: tactic -> context_tactic
    15   val NO_CONTEXT_TACTIC: Proof.context -> context_tactic -> tactic
    15   val NO_CONTEXT_TACTIC: Proof.context -> context_tactic -> tactic
    16   val CONTEXT_CASES: Rule_Cases.cases -> tactic -> context_tactic
    16   val CONTEXT_CASES: Rule_Cases.cases -> tactic -> context_tactic
    17   val CONTEXT_SUBGOAL: (term * int -> context_tactic) -> int -> context_tactic
    17   val CONTEXT_SUBGOAL: (term * int -> context_tactic) -> int -> context_tactic
    18   val CONTEXT_THEN_ALL_NEW: (int -> context_tactic) * (int -> tactic) -> int -> context_tactic
    18   val CONTEXT_THEN_ALL_NEW: (int -> context_tactic) * (int -> tactic) -> int -> context_tactic
       
    19   val SUBPROOFS: context_tactic -> context_tactic
    19 end;
    20 end;
    20 
    21 
    21 signature CONTEXT_TACTIC =
    22 signature CONTEXT_TACTIC =
    22 sig
    23 sig
    23   include BASIC_CONTEXT_TACTIC
    24   include BASIC_CONTEXT_TACTIC
    24 end;
    25 end;
    25 
    26 
    26 structure Context_Tactic: CONTEXT_TACTIC =
    27 structure Context_Tactic: CONTEXT_TACTIC =
    27 struct
    28 struct
       
    29 
       
    30 (* type context_tactic *)
    28 
    31 
    29 type context_state = Proof.context * thm;
    32 type context_state = Proof.context * thm;
    30 type context_tactic = context_state -> context_state Seq.result Seq.seq;
    33 type context_tactic = context_state -> context_state Seq.result Seq.seq;
    31 
    34 
    32 fun TACTIC_CONTEXT ctxt : thm Seq.seq -> context_state Seq.result Seq.seq =
    35 fun TACTIC_CONTEXT ctxt : thm Seq.seq -> context_state Seq.result Seq.seq =
    50 fun (tac1 CONTEXT_THEN_ALL_NEW tac2) i : context_tactic =
    53 fun (tac1 CONTEXT_THEN_ALL_NEW tac2) i : context_tactic =
    51   fn (ctxt, st) =>
    54   fn (ctxt, st) =>
    52     (ctxt, st) |> tac1 i |> Seq.maps_results (fn (ctxt', st') =>
    55     (ctxt, st) |> tac1 i |> Seq.maps_results (fn (ctxt', st') =>
    53       TACTIC_CONTEXT ctxt' ((Seq.INTERVAL tac2 i (i + Thm.nprems_of st' - Thm.nprems_of st)) st'));
    56       TACTIC_CONTEXT ctxt' ((Seq.INTERVAL tac2 i (i + Thm.nprems_of st' - Thm.nprems_of st)) st'));
    54 
    57 
       
    58 
       
    59 (* subproofs with closed derivation *)
       
    60 
       
    61 fun SUBPROOFS tac : context_tactic =
       
    62   let
       
    63     fun apply (g :: gs) (SOME (Seq.Result (results, ctxt))) =
       
    64           (case Seq.pull (tac (ctxt, Goal.init g)) of
       
    65             SOME (Seq.Result (ctxt', st'), _) =>
       
    66               apply gs (SOME (Seq.Result (st' :: results, ctxt')))
       
    67           | SOME (Seq.Error msg, _) => SOME (Seq.Error msg)
       
    68           | NONE => NONE)
       
    69       | apply _ x = x;
       
    70   in
       
    71     fn (ctxt, st) =>
       
    72       (case Par_Tactical.strip_goals st of
       
    73         SOME goals =>
       
    74           (case apply goals (SOME (Seq.Result ([], ctxt))) of
       
    75             SOME (Seq.Result (results, ctxt')) =>
       
    76               TACTIC_CONTEXT ctxt' (Par_Tactical.retrofit_tac {close = true} results st)
       
    77           | SOME (Seq.Error msg) => Seq.single (Seq.Error msg)
       
    78           | NONE => Seq.empty)
       
    79       | NONE => Seq.DETERM tac (ctxt, st))
       
    80   end;
       
    81 
    55 end;
    82 end;
    56 
    83 
    57 structure Basic_Context_Tactic: BASIC_CONTEXT_TACTIC = Context_Tactic;
    84 structure Basic_Context_Tactic: BASIC_CONTEXT_TACTIC = Context_Tactic;
    58 open Basic_Context_Tactic;
    85 open Basic_Context_Tactic;