wneuper@59572
|
1 |
(* Title: interpreter-state for Lucas-Interpretation
|
wneuper@59572
|
2 |
Author: Walther Neuper 190724
|
wneuper@59572
|
3 |
(c) due to copyright terms
|
wneuper@59572
|
4 |
*)
|
wneuper@59572
|
5 |
signature INTERPRETER_STATE =
|
wneuper@59572
|
6 |
sig
|
wneuper@59572
|
7 |
|
walther@59737
|
8 |
datatype asap = datatype Istate_Def.asap
|
walther@59777
|
9 |
val asap2str: asap -> string
|
walther@59737
|
10 |
type pstate = Istate_Def.pstate
|
walther@59777
|
11 |
val e_pstate: pstate
|
walther@59777
|
12 |
val pstate2str: pstate -> string
|
wneuper@59572
|
13 |
|
walther@59737
|
14 |
datatype T = datatype Istate_Def.T
|
walther@59846
|
15 |
val empty: T
|
walther@59844
|
16 |
val string_of: T -> string
|
walther@59844
|
17 |
val string_of': T -> string
|
walther@59664
|
18 |
val istates2str: T option * T option -> string
|
walther@59685
|
19 |
val the_pstate: T -> pstate
|
wneuper@59572
|
20 |
|
walther@59935
|
21 |
val init_detail: Tactic.input -> term -> Istate_Def.T
|
walther@59935
|
22 |
|
walther@59667
|
23 |
val get_act_env: pstate -> (term * Env.T)
|
walther@59667
|
24 |
val get_subst: pstate -> (Env.T * (term option * term))
|
walther@59660
|
25 |
|
walther@59784
|
26 |
val trans_scan_dn: pstate -> pstate
|
walther@59783
|
27 |
val trans_scan_up: pstate -> pstate
|
walther@59667
|
28 |
val trans_ass: pstate -> pstate -> pstate
|
walther@59667
|
29 |
val trans_env_act: pstate -> pstate -> pstate
|
walther@59659
|
30 |
|
walther@59767
|
31 |
val path_down: TermC.path -> pstate -> pstate
|
walther@59767
|
32 |
val path_down_form: (TermC.path * term) -> pstate -> pstate
|
walther@59767
|
33 |
val path_up': TermC.path -> TermC.path
|
walther@59667
|
34 |
val path_up: pstate -> pstate
|
walther@59767
|
35 |
val path_up_down: TermC.path -> pstate -> pstate
|
walther@59660
|
36 |
|
walther@59698
|
37 |
val set_form: term -> pstate -> pstate
|
walther@59767
|
38 |
val set_path: TermC.path -> pstate -> pstate
|
walther@59851
|
39 |
val set_eval: Rule_Set.T -> pstate -> pstate
|
walther@59698
|
40 |
val set_act: term -> pstate -> pstate
|
walther@59698
|
41 |
val set_or: asap -> pstate -> pstate
|
walther@59785
|
42 |
val set_found: pstate -> pstate
|
walther@59698
|
43 |
|
walther@59698
|
44 |
val set_subst: Env.T -> (term * term) -> pstate -> pstate
|
walther@59709
|
45 |
val set_subst': (term * term) -> pstate -> pstate
|
walther@59698
|
46 |
val set_subst_true: (term option * term) -> pstate -> pstate
|
walther@59698
|
47 |
val set_subst_false: (term option * term) -> pstate -> pstate
|
walther@59782
|
48 |
val set_subst_found: (term option * term) -> pstate -> pstate
|
walther@59698
|
49 |
|
walther@59698
|
50 |
val set_env: Env.T -> pstate -> pstate
|
walther@59698
|
51 |
val set_env_true: Env.T -> pstate -> pstate
|
walther@59698
|
52 |
val set_form_env: (term * Env.T) -> pstate -> pstate
|
walther@59698
|
53 |
val set_act_env: (term * Env.T) -> pstate -> pstate
|
walther@59698
|
54 |
val upd_env: term -> pstate -> pstate
|
walther@59698
|
55 |
val upd_env': Env.T * (term * term) -> pstate -> pstate
|
walther@59709
|
56 |
val upd_env'': (term * term) -> pstate -> pstate
|
walther@59659
|
57 |
|
wneuper@59572
|
58 |
end
|
wneuper@59572
|
59 |
|
walther@59668
|
60 |
(**)
|
wneuper@59572
|
61 |
structure Istate(**): INTERPRETER_STATE(**) =
|
wneuper@59572
|
62 |
struct
|
walther@59659
|
63 |
(**)
|
wneuper@59572
|
64 |
|
walther@59935
|
65 |
(** types **)
|
walther@59935
|
66 |
|
walther@59737
|
67 |
datatype asap = datatype Istate_Def.asap
|
walther@59777
|
68 |
val asap2str = Istate_Def.asap2str
|
walther@59680
|
69 |
|
walther@59737
|
70 |
type pstate = Istate_Def.pstate
|
walther@59777
|
71 |
val e_pstate = Istate_Def.e_pstate
|
walther@59777
|
72 |
val pstate2str = Istate_Def.pstate2str
|
wneuper@59572
|
73 |
|
walther@59737
|
74 |
datatype T = datatype Istate_Def.T
|
walther@59846
|
75 |
val empty = Istate_Def.empty
|
walther@59685
|
76 |
fun the_pstate (Pstate pst) = pst
|
walther@59685
|
77 |
| the_pstate _ = raise ERROR ("the_pstate called for RrlsStated")
|
wneuper@59572
|
78 |
|
walther@59935
|
79 |
|
walther@59935
|
80 |
(** access functions **)
|
walther@59935
|
81 |
|
walther@59844
|
82 |
val string_of = Istate_Def.string_of
|
walther@59844
|
83 |
val string_of' = Istate_Def.string_of'
|
walther@59777
|
84 |
val istates2str = Istate_Def.istates2str
|
wneuper@59572
|
85 |
|
walther@59682
|
86 |
fun get_act_env {env, act_arg, ...} = (act_arg, env)
|
walther@59682
|
87 |
fun get_subst {env, form_arg, act_arg, ...} = (env, (form_arg, act_arg))
|
walther@59659
|
88 |
|
walther@59784
|
89 |
fun trans_scan_dn {env, eval, act_arg, or, found_accept, ...} =
|
walther@59767
|
90 |
{env = env, path = [TermC.R], eval = eval, form_arg = NONE, act_arg = act_arg,
|
walther@59784
|
91 |
or = or, found_accept = found_accept, assoc = false}
|
walther@59784
|
92 |
fun trans_scan_up {env, path, eval, form_arg, act_arg, or, found_accept, ...} =
|
walther@59682
|
93 |
{env = env, path = path, eval = eval, form_arg = form_arg, act_arg = act_arg,
|
walther@59784
|
94 |
or = or, found_accept = found_accept, assoc = false(*the only update*)}
|
walther@59784
|
95 |
fun trans_ass {assoc, ...} {env, path, eval, form_arg, act_arg, or, found_accept, ...} =
|
walther@59682
|
96 |
{env = env, path = path, eval = eval, form_arg = form_arg, act_arg = act_arg,
|
walther@59784
|
97 |
or = or, found_accept = found_accept, assoc = assoc}
|
walther@59784
|
98 |
fun trans_env_act {env, act_arg, ...} {path, eval, form_arg, or, found_accept, assoc, ...} =
|
walther@59682
|
99 |
{env = env, path = path, eval = eval, form_arg = form_arg, act_arg = act_arg,
|
walther@59784
|
100 |
or = or, found_accept = found_accept, assoc = assoc}
|
walther@59660
|
101 |
|
walther@59784
|
102 |
fun path_down p {env, path, eval, form_arg, act_arg, or, found_accept, assoc} =
|
walther@59682
|
103 |
{env = env, path = path @ p, eval = eval, form_arg = form_arg, act_arg = act_arg,
|
walther@59784
|
104 |
or = or, found_accept = found_accept, assoc = assoc}
|
walther@59784
|
105 |
fun path_down_form (p, fa) {env, path, eval, act_arg, or, found_accept, assoc, ...} =
|
walther@59682
|
106 |
{env = env, path = path @ p, eval = eval, form_arg = SOME fa, act_arg = act_arg,
|
walther@59784
|
107 |
or = or, found_accept = found_accept, assoc = assoc}
|
walther@59723
|
108 |
fun path_up' [] = raise ERROR "path_up' []"
|
walther@59723
|
109 |
| path_up' path = drop_last path
|
walther@59784
|
110 |
fun path_up {env, path, eval, form_arg, act_arg, or, found_accept, assoc} =
|
walther@59723
|
111 |
{env = env, path = path_up' path, eval = eval, form_arg = form_arg, act_arg = act_arg,
|
walther@59784
|
112 |
or = or, found_accept = found_accept, assoc = assoc}
|
walther@59784
|
113 |
fun path_up_down p {env, path, eval, form_arg, act_arg, or, found_accept, assoc} =
|
walther@59723
|
114 |
{env = env, path = (path_up' path) @ p, eval = eval, form_arg = form_arg, act_arg = act_arg,
|
walther@59784
|
115 |
or = or, found_accept = found_accept, assoc = assoc}
|
walther@59664
|
116 |
|
walther@59784
|
117 |
fun set_form f {env, path, eval, act_arg, or, found_accept, assoc, ...} =
|
walther@59682
|
118 |
{env = env, path = path, eval = eval, form_arg = SOME f, act_arg = act_arg,
|
walther@59784
|
119 |
or = or, found_accept = found_accept, assoc = assoc}
|
walther@59784
|
120 |
fun set_path p {env, eval, form_arg, act_arg, or, found_accept, assoc, ...} =
|
walther@59682
|
121 |
{env = env, path = p, eval = eval, form_arg = form_arg, act_arg = act_arg,
|
walther@59784
|
122 |
or = or, found_accept = found_accept, assoc = assoc}
|
walther@59737
|
123 |
val set_eval = Istate_Def.set_eval
|
walther@59737
|
124 |
val set_act = Istate_Def.set_act
|
walther@59784
|
125 |
fun set_or or {env, path, eval, form_arg, act_arg, found_accept, assoc, ...} =
|
walther@59684
|
126 |
{env = env, path = path, eval = eval, form_arg = form_arg, act_arg = act_arg,
|
walther@59784
|
127 |
or = or, found_accept = found_accept, assoc = assoc}
|
walther@59785
|
128 |
fun set_found {env, path, eval, form_arg, act_arg, or, assoc, ...} =
|
walther@59682
|
129 |
{env = env, path = path, eval = eval, form_arg = form_arg, act_arg = act_arg,
|
walther@59784
|
130 |
or = or, found_accept = true, assoc = assoc}
|
walther@59664
|
131 |
|
walther@59784
|
132 |
fun set_subst env (form_arg, act_arg) {path, eval, or, found_accept, assoc, ...} =
|
walther@59698
|
133 |
{env = env, path = path, eval = eval, form_arg = SOME form_arg, act_arg = act_arg,
|
walther@59784
|
134 |
or = or, found_accept = found_accept, assoc = assoc}
|
walther@59784
|
135 |
fun set_subst' (form_arg, act_arg) {env, path, eval, or, found_accept, assoc, ...} =
|
walther@59709
|
136 |
{env = env, path = path, eval = eval, form_arg = SOME form_arg, act_arg = act_arg,
|
walther@59784
|
137 |
or = or, found_accept = found_accept, assoc = assoc}
|
walther@59784
|
138 |
fun set_subst_true (form_arg, act_arg) {env, path, eval, or, found_accept, ...} =
|
walther@59698
|
139 |
{env = env, path = path, eval = eval, form_arg = form_arg, act_arg = act_arg,
|
walther@59784
|
140 |
or = or, found_accept = found_accept, assoc = true}
|
walther@59784
|
141 |
fun set_subst_false (form_arg, act_arg) {env, path, eval, or, found_accept, ...} =
|
walther@59698
|
142 |
{env = env, path = path, eval = eval, form_arg = form_arg, act_arg = act_arg,
|
walther@59784
|
143 |
or = or, found_accept = found_accept, assoc = false}
|
walther@59782
|
144 |
fun set_subst_found (form_arg, act_arg) {env, path, eval, ...} =
|
walther@59698
|
145 |
{env = env, path = path, eval = eval, form_arg = form_arg, act_arg = act_arg,
|
walther@59784
|
146 |
or = ORundef, found_accept = true, assoc = false}
|
walther@59698
|
147 |
|
walther@59784
|
148 |
fun set_env env {path, eval, form_arg, act_arg, or, found_accept, assoc, ...} =
|
walther@59682
|
149 |
{env = env, path = path, eval = eval, form_arg = form_arg, act_arg = act_arg,
|
walther@59784
|
150 |
or = or, found_accept = found_accept, assoc = assoc}
|
walther@59737
|
151 |
val set_env_true = Istate_Def.set_env_true
|
walther@59784
|
152 |
fun set_form_env (form_arg, env) {path, eval, act_arg, or, found_accept, assoc, ...} =
|
walther@59698
|
153 |
{env = env, path = path, eval = eval, form_arg = SOME form_arg, act_arg = act_arg,
|
walther@59784
|
154 |
or = or, found_accept = found_accept, assoc = assoc}
|
walther@59784
|
155 |
fun set_act_env (act_arg, env) {path, eval, form_arg, or, found_accept, assoc, ...} =
|
walther@59698
|
156 |
{env = env, path = path, eval = eval, form_arg = form_arg, act_arg = act_arg,
|
walther@59784
|
157 |
or = or, found_accept = found_accept, assoc = assoc}
|
walther@59784
|
158 |
fun upd_env form {env, path, eval, form_arg, act_arg, or, found_accept, assoc} =
|
walther@59697
|
159 |
{env = Env.update env (form, act_arg), path = path, eval = eval, form_arg = form_arg,
|
walther@59784
|
160 |
act_arg = act_arg, or = or, found_accept = found_accept, assoc = assoc}
|
walther@59784
|
161 |
fun upd_env' (env, (form, act)) {path, eval, or, found_accept, assoc, ...} =
|
walther@59697
|
162 |
{env = Env.update env (form, act), path = path, eval = eval, form_arg = SOME form, act_arg = act,
|
walther@59784
|
163 |
or = or, found_accept = found_accept, assoc = assoc}
|
walther@59784
|
164 |
fun upd_env'' (form, act) {env, path, eval, or, found_accept, assoc, ...} =
|
walther@59709
|
165 |
{env = Env.update env (form, act), path = path, eval = eval, form_arg = SOME form, act_arg = act,
|
walther@59784
|
166 |
or = or, found_accept = found_accept, assoc = assoc}
|
walther@59682
|
167 |
|
walther@59935
|
168 |
(* initialize istate for Detail_Set *)
|
walther@59935
|
169 |
fun init_detail (Tactic.Rewrite_Set rls) t =
|
walther@59935
|
170 |
let
|
walther@59935
|
171 |
val thy = ThyC.get_theory "Isac_Knowledge"
|
walther@59935
|
172 |
val args = Auto_Prog.gen thy t (assoc_rls rls) |> Program.formal_args
|
walther@59935
|
173 |
in
|
walther@59935
|
174 |
Istate_Def.Pstate (Istate_Def.e_pstate |> Istate_Def.set_env_true [(hd args, t)])
|
walther@59935
|
175 |
end
|
walther@59935
|
176 |
| init_detail (Tactic.Rewrite_Set_Inst (subs, rls)) t =
|
walther@59935
|
177 |
let
|
Walther@60500
|
178 |
val ctxt = Proof_Context.init_global (ThyC.get_theory "Isac_Knowledge")
|
walther@59935
|
179 |
val rls' = assoc_rls rls
|
Walther@60500
|
180 |
val v = case Subst.T_from_input ctxt subs of
|
walther@59935
|
181 |
(_, v) :: _ => v (*...we suppose the substitution of only ONE bound variable*)
|
walther@59935
|
182 |
| _ => raise ERROR "init_detail: uncovered case"
|
Walther@60500
|
183 |
val prog = Auto_Prog.gen (Proof_Context.theory_of ctxt) t rls'
|
walther@59935
|
184 |
val args = Program.formal_args prog
|
walther@59935
|
185 |
in
|
walther@59935
|
186 |
Istate_Def.Pstate (Istate_Def.e_pstate |> Istate_Def.set_env_true (args ~~ [t, v]))
|
walther@59935
|
187 |
end
|
walther@59935
|
188 |
| init_detail tac _ = raise ERROR ("init_detail: uncovered definition for " ^ Tactic.input_to_string tac)
|
walther@59935
|
189 |
|
walther@59935
|
190 |
(** initialisation **)
|
walther@59935
|
191 |
|
walther@59935
|
192 |
|
wneuper@59572
|
193 |
|
walther@59674
|
194 |
(**)end(**)
|
wneuper@59572
|
195 |
|