|
1 theory Subgoal |
|
2 imports Term_pat |
|
3 begin |
|
4 |
|
5 section {* Monad for goal and subgoal manipulation, useful for debugging tactics *} |
|
6 |
|
7 subsection {* Implementation *} |
|
8 |
|
9 ML {* |
|
10 fun goalM raw_goal = m0M' (fn ((i, _), ctxt) => |
|
11 let |
|
12 val thy = Proof_Context.theory_of ctxt |
|
13 val goal = raw_goal |> cterm_of thy |> Goal.init |
|
14 (* val ctxt' = Variable.auto_fixes raw_goal ctxt *) |
|
15 val ctxt' = ctxt |
|
16 in (s2M ctxt' |-- (s1M (i, goal)) |-- returnM goal) end) |
|
17 |
|
18 local |
|
19 fun pr_goal ctxt goal = Goal_Display.pretty_goals ctxt goal |> |
|
20 Pretty.markup_chunks Markup.state |> Pretty.writeln |
|
21 in |
|
22 fun tacM tac = m1M' (fn (i, goal) => m2M (fn ctxt => |
|
23 let |
|
24 val goal' = (Seq.hd (tac ctxt goal)) |
|
25 val _ = pr_goal ctxt goal' |
|
26 in |
|
27 s1M (i, goal') |-- returnM goal' |
|
28 end)) |
|
29 end |
|
30 |
|
31 fun focusM i = pushM |-- (liftM (m0M (fn ((_, goal), ctxt) => |
|
32 let val (focus as {context = ctxt', ...}, goal') = Subgoal.focus ctxt i goal |
|
33 in |
|
34 setM ((i, goal'), ctxt') |-- returnM focus |
|
35 end))) |
|
36 |
|
37 fun end_focusM x = ( popM |
|
38 :|-- (fn ((i, goal'), _) => topM (fn ((old_i, goal), ctxt) => |
|
39 let val ({context = ctxt', params, asms, ...}, _) = |
|
40 Subgoal.focus ctxt i goal |
|
41 val new_goal = Seq.lifts (Subgoal.retrofit ctxt' ctxt params asms i) |
|
42 (Seq.single goal') goal |> Seq.hd |
|
43 in s1M (old_i, new_goal) |-- returnM new_goal end ))) x |
|
44 *} |
|
45 |
|
46 subsection {* Examples *} |
|
47 |
|
48 lemma init: "A \<Longrightarrow> A" |
|
49 by simp |
|
50 |
|
51 ML {* |
|
52 val r as (result, _)= [((0, @{thm "init"}), @{context})] |> |
|
53 @{fterm "(A \<and> B \<Longrightarrow> A)"} |
|
54 :|-- goalM |
|
55 |-- focusM 1 |
|
56 :|--(fn {prems, ...} => let |
|
57 val conj = hd prems |
|
58 val r = rtac (conj RS @{thm HOL.conjunct1}) 1 |
|
59 in tacM (K r) end ) |
|
60 |-- end_focusM >> Drule.export_without_context |> normVal |
|
61 *} |
|
62 |
|
63 |
|
64 ML {* |
|
65 val r = [((0, @{thm "init"}), @{context})] |> |
|
66 @{fterm "(A \<and> B \<Longrightarrow> A)"} |
|
67 :|-- goalM |
|
68 |-- tacM (fn ctxt => Subgoal.FOCUS (fn {prems, ...} => let |
|
69 val conj = hd prems |
|
70 val r = rtac (conj RS @{thm HOL.conjunct1}) 1 |
|
71 in r end ) ctxt 1) >> Drule.export_without_context |
|
72 |> normVal |
|
73 *} |
|
74 |
|
75 end |
|
76 |