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; |