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@59680
|
8 |
datatype asap = Aundef | AssOnly | AssGen;
|
walther@59675
|
9 |
datatype appy_ = AppUndef_ | Napp_ | Skip_
|
walther@59667
|
10 |
type pstate
|
walther@59667
|
11 |
val e_scrstate: pstate
|
walther@59680
|
12 |
val scrstate2str: pstate -> string
|
wneuper@59572
|
13 |
|
walther@59667
|
14 |
datatype T = RrlsState of Rule.rrlsstate | Pstate of pstate | Uistate
|
walther@59664
|
15 |
val istate2str: T -> string
|
walther@59664
|
16 |
val istates2str: T option * T option -> string
|
walther@59664
|
17 |
val e_istate: T
|
walther@59685
|
18 |
val the_pstate: T -> pstate
|
wneuper@59572
|
19 |
|
walther@59667
|
20 |
val get_act_env: pstate -> (term * Env.T)
|
walther@59667
|
21 |
val get_subst: pstate -> (Env.T * (term option * term))
|
walther@59660
|
22 |
|
walther@59679
|
23 |
val trans_scan_down2: pstate -> pstate
|
walther@59679
|
24 |
val trans_scan_up2: pstate -> pstate
|
walther@59667
|
25 |
val trans_ass: pstate -> pstate -> pstate
|
walther@59667
|
26 |
val trans_env_act: pstate -> pstate -> pstate
|
walther@59659
|
27 |
|
walther@59687
|
28 |
val path_down: Celem.path -> pstate -> pstate
|
walther@59687
|
29 |
val path_down_form: (Celem.path * term) -> pstate -> pstate
|
walther@59687
|
30 |
val path_up': Celem.path -> Celem.path
|
walther@59667
|
31 |
val path_up: pstate -> pstate
|
walther@59687
|
32 |
val path_up_down: Celem.path -> pstate -> pstate
|
walther@59660
|
33 |
|
walther@59698
|
34 |
val set_form: term -> pstate -> pstate
|
walther@59698
|
35 |
val set_path: Celem.path -> pstate -> pstate
|
walther@59698
|
36 |
val set_eval: Rule.rls -> pstate -> pstate
|
walther@59698
|
37 |
val set_act: term -> pstate -> pstate
|
walther@59698
|
38 |
val set_or: asap -> pstate -> pstate
|
walther@59698
|
39 |
val set_appy: appy_ -> pstate -> pstate
|
walther@59698
|
40 |
|
walther@59698
|
41 |
val set_subst: Env.T -> (term * term) -> pstate -> pstate
|
walther@59709
|
42 |
val set_subst': (term * term) -> pstate -> pstate
|
walther@59698
|
43 |
val set_subst_true: (term option * term) -> pstate -> pstate
|
walther@59698
|
44 |
val set_subst_false: (term option * term) -> pstate -> pstate
|
walther@59698
|
45 |
val set_subst_reset: (term option * term) -> pstate -> pstate
|
walther@59698
|
46 |
|
walther@59698
|
47 |
val set_env: Env.T -> pstate -> pstate
|
walther@59698
|
48 |
val set_env_true: Env.T -> pstate -> pstate
|
walther@59698
|
49 |
val set_form_env: (term * Env.T) -> pstate -> pstate
|
walther@59698
|
50 |
val set_act_env: (term * Env.T) -> pstate -> pstate
|
walther@59698
|
51 |
val upd_env: term -> pstate -> pstate
|
walther@59698
|
52 |
val upd_env': Env.T * (term * term) -> pstate -> pstate
|
walther@59709
|
53 |
val upd_env'': (term * term) -> pstate -> pstate
|
walther@59659
|
54 |
|
wneuper@59572
|
55 |
end
|
wneuper@59572
|
56 |
|
walther@59668
|
57 |
(**)
|
wneuper@59572
|
58 |
structure Istate(**): INTERPRETER_STATE(**) =
|
wneuper@59572
|
59 |
struct
|
walther@59659
|
60 |
(**)
|
wneuper@59572
|
61 |
|
walther@59682
|
62 |
open Celem
|
walther@59679
|
63 |
|
walther@59691
|
64 |
datatype asap = (* arg. of scan_dn1 _only_ for distinction w.r.t. Or *)
|
walther@59680
|
65 |
Aundef (* undefined: set only by (topmost) Or *)
|
walther@59703
|
66 |
| AssOnly (* do not execute applicable Prog_Tac - there could be an associated
|
walther@59680
|
67 |
in parallel Or-branch *)
|
walther@59703
|
68 |
| AssGen; (* no Ass(Weak) found within Or, thus continue scan
|
walther@59680
|
69 |
search for _applicable_ stacs, execute and generate pt *)
|
walther@59680
|
70 |
(*this constructions doesnt allow arbitrary nesting of Or !!! *)
|
walther@59680
|
71 |
fun asap2str Aundef = "Aundef"
|
walther@59680
|
72 |
| asap2str AssOnly = "AssOnly"
|
walther@59680
|
73 |
| asap2str AssGen = "AssGen"
|
walther@59680
|
74 |
|
walther@59712
|
75 |
datatype appy_ = (* as argument in scan_up2, go_scan_up2, from scan_dn2 *)
|
walther@59712
|
76 |
(*Ackn_Tac2 is only (final) returnvalue, not argument during search *)
|
walther@59675
|
77 |
AppUndef_
|
walther@59675
|
78 |
| Napp_ (* ev. detects 'script is not appropriate for this example' *)
|
walther@59675
|
79 |
| Skip_; (* detects 'script successfully finished'
|
walther@59675
|
80 |
also used as init-value for resuming; this works,
|
walther@59712
|
81 |
because 'nxt_up Or e1' treats as Ackn_Tac2 *)
|
walther@59675
|
82 |
fun appy_2str AppUndef_ = "AppUndef_"
|
walther@59675
|
83 |
| appy_2str Napp_ = "Napp_"
|
walther@59675
|
84 |
| appy_2str Skip_ = "Skip_"
|
wneuper@59572
|
85 |
|
walther@59688
|
86 |
type pstate =
|
walther@59688
|
87 |
{env: Env.T, (* environment for variables in a program *)
|
walther@59688
|
88 |
path: Celem.path, (* to the current location in a program *)
|
walther@59688
|
89 |
eval: Rule.rls, (* rule-set for evaluating a Prog_Expr *)
|
walther@59688
|
90 |
form_arg: term option,(* argument of a curried function *)
|
walther@59688
|
91 |
act_arg: term, (* value for the curried argument *)
|
walther@59688
|
92 |
or: asap, (* flag for scanning tactical "Or" *)
|
walther@59688
|
93 |
finish: appy_, (* flag set after execution of a tactic *)
|
walther@59688
|
94 |
assoc: bool} (* is the tactic associated to input *)
|
wneuper@59572
|
95 |
val e_scrstate =
|
walther@59682
|
96 |
{env = [], path = [], eval = Rule.e_rls, form_arg = NONE, act_arg = Rule.e_term,
|
walther@59682
|
97 |
or = Aundef, finish = AppUndef_, assoc = false}
|
wneuper@59572
|
98 |
fun topt2str NONE = "NONE"
|
wneuper@59572
|
99 |
| topt2str (SOME t) = "SOME" ^ Rule.term2str t;
|
walther@59682
|
100 |
fun scrstate2str {env, path, eval, form_arg, act_arg, or, finish, assoc} = (* for tests only *)
|
walther@59687
|
101 |
"(" ^ Env.env2str env ^ ", " ^ Celem.path2str path ^ ", " ^ Rule.id_rls eval ^ ", " ^
|
walther@59682
|
102 |
topt2str form_arg ^ ", \n" ^ Rule.term2str act_arg ^ ", " ^ asap2str or ^ ", " ^
|
walther@59682
|
103 |
appy_2str finish ^ ", " ^ bool2str assoc ^ ")";
|
wneuper@59572
|
104 |
|
wneuper@59572
|
105 |
(* for handling type T see fun from_pblobj_or_detail', +? *)
|
wneuper@59572
|
106 |
datatype T = (*interpreter state*)
|
wneuper@59572
|
107 |
Uistate (*undefined in modspec, in '_deriv'ation*)
|
walther@59667
|
108 |
| Pstate of pstate (*for script interpreter*)
|
wneuper@59572
|
109 |
| RrlsState of Rule.rrlsstate; (*for reverse rewriting*)
|
walther@59680
|
110 |
val e_istate = Pstate e_scrstate;
|
walther@59685
|
111 |
fun the_pstate (Pstate pst) = pst
|
walther@59685
|
112 |
| the_pstate _ = raise ERROR ("the_pstate called for RrlsStated")
|
wneuper@59572
|
113 |
|
wneuper@59572
|
114 |
fun rta2str (r, (t, a)) = "\n(" ^ Rule.rule2str r ^ ",(" ^ Rule.term2str t ^", " ^ Rule.terms2str a ^ "))";
|
wneuper@59572
|
115 |
fun istate2str Uistate = "Uistate"
|
walther@59676
|
116 |
| istate2str (Pstate pst) =
|
walther@59676
|
117 |
"Pstate " ^ scrstate2str pst
|
wneuper@59572
|
118 |
| istate2str (RrlsState (t, t1, rss, rtas)) =
|
wneuper@59572
|
119 |
"RrlsState (" ^ Rule.term2str t ^ ", " ^ Rule.term2str t1 ^ ", " ^
|
wneuper@59572
|
120 |
(strs2str o (map (strs2str o (map Rule.rule2str)))) rss ^ ", " ^
|
wneuper@59572
|
121 |
(strs2str o (map rta2str)) rtas ^ ")";
|
wneuper@59572
|
122 |
fun istates2str (NONE, NONE) = "(#NONE, #NONE)" (* for tests only *)
|
wneuper@59572
|
123 |
| istates2str (NONE, SOME ist) = "(#NONE,\n#SOME " ^ istate2str ist ^ ")"
|
wneuper@59572
|
124 |
| istates2str (SOME ist, NONE) = "(#SOME " ^ istate2str ist ^ ",\n #NONE)"
|
wneuper@59572
|
125 |
| istates2str (SOME i1, SOME i2) = "(#SOME " ^ istate2str i1 ^ ",\n #SOME " ^ istate2str i2 ^ ")";
|
wneuper@59572
|
126 |
|
walther@59682
|
127 |
fun get_act_env {env, act_arg, ...} = (act_arg, env)
|
walther@59682
|
128 |
fun get_subst {env, form_arg, act_arg, ...} = (env, (form_arg, act_arg))
|
walther@59659
|
129 |
|
walther@59682
|
130 |
fun trans_scan_down2 {env, eval, act_arg, or, ...} =
|
walther@59682
|
131 |
{env = env, path = [R], eval = eval, form_arg = NONE, act_arg = act_arg,
|
walther@59682
|
132 |
or = or, finish = AppUndef_, assoc = false}
|
walther@59682
|
133 |
fun trans_scan_up2 {env, path, eval, form_arg, act_arg, or, ...} =
|
walther@59682
|
134 |
{env = env, path = path, eval = eval, form_arg = form_arg, act_arg = act_arg,
|
walther@59682
|
135 |
or = or, finish = AppUndef_, assoc = false}
|
walther@59682
|
136 |
fun trans_ass {assoc, ...} {env, path, eval, form_arg, act_arg, or, finish, ...} =
|
walther@59682
|
137 |
{env = env, path = path, eval = eval, form_arg = form_arg, act_arg = act_arg,
|
walther@59682
|
138 |
or = or, finish = finish, assoc = assoc}
|
walther@59682
|
139 |
fun trans_env_act {env, act_arg, ...} {path, eval, form_arg, or, finish, assoc, ...} =
|
walther@59682
|
140 |
{env = env, path = path, eval = eval, form_arg = form_arg, act_arg = act_arg,
|
walther@59682
|
141 |
or = or, finish = finish, assoc = assoc}
|
walther@59660
|
142 |
|
walther@59664
|
143 |
|
walther@59682
|
144 |
fun path_down p {env, path, eval, form_arg, act_arg, or, finish, assoc} =
|
walther@59682
|
145 |
{env = env, path = path @ p, eval = eval, form_arg = form_arg, act_arg = act_arg,
|
walther@59682
|
146 |
or = or, finish = finish, assoc = assoc}
|
walther@59682
|
147 |
fun path_down_form (p, fa) {env, path, eval, act_arg, or, finish, assoc, ...} =
|
walther@59682
|
148 |
{env = env, path = path @ p, eval = eval, form_arg = SOME fa, act_arg = act_arg,
|
walther@59682
|
149 |
or = or, finish = finish, assoc = assoc}
|
walther@59685
|
150 |
fun path_up' path = drop_last path
|
walther@59682
|
151 |
fun path_up {env, path, eval, form_arg, act_arg, or, finish, assoc} =
|
walther@59682
|
152 |
{env = env, path = drop_last path, eval = eval, form_arg = form_arg, act_arg = act_arg,
|
walther@59682
|
153 |
or = or, finish = finish, assoc = assoc}
|
walther@59682
|
154 |
fun path_up_down p {env, path, eval, form_arg, act_arg, or, finish, assoc} =
|
walther@59682
|
155 |
{env = env, path = (drop_last path) @ p, eval = eval, form_arg = form_arg, act_arg = act_arg,
|
walther@59682
|
156 |
or = or, finish = finish, assoc = assoc}
|
walther@59664
|
157 |
|
walther@59698
|
158 |
fun set_form f {env, path, eval, act_arg, or, finish, assoc, ...} =
|
walther@59682
|
159 |
{env = env, path = path, eval = eval, form_arg = SOME f, act_arg = act_arg,
|
walther@59682
|
160 |
or = or, finish = finish, assoc = assoc}
|
walther@59698
|
161 |
fun set_path p {env, eval, form_arg, act_arg, or, finish, assoc, ...} =
|
walther@59682
|
162 |
{env = env, path = p, eval = eval, form_arg = form_arg, act_arg = act_arg,
|
walther@59682
|
163 |
or = or, finish = finish, assoc = assoc}
|
walther@59698
|
164 |
fun set_eval e {env, path, form_arg, act_arg, or, finish, assoc, ...} =
|
walther@59682
|
165 |
{env = env, path = path, eval = e, form_arg = form_arg, act_arg = act_arg,
|
walther@59682
|
166 |
or = or, finish = finish, assoc = assoc}
|
walther@59698
|
167 |
fun set_act act {env, path, eval, form_arg, or, finish, assoc, ...} =
|
walther@59682
|
168 |
{env = env, path = path, eval = eval, form_arg = form_arg, act_arg = act,
|
walther@59682
|
169 |
or = or, finish = finish, assoc = assoc}
|
walther@59698
|
170 |
fun set_or or {env, path, eval, form_arg, act_arg, finish, assoc, ...} =
|
walther@59684
|
171 |
{env = env, path = path, eval = eval, form_arg = form_arg, act_arg = act_arg,
|
walther@59684
|
172 |
or = or, finish = finish, assoc = assoc}
|
walther@59698
|
173 |
fun set_appy fin {env, path, eval, form_arg, act_arg, or, assoc, ...} =
|
walther@59682
|
174 |
{env = env, path = path, eval = eval, form_arg = form_arg, act_arg = act_arg,
|
walther@59682
|
175 |
or = or, finish = fin, assoc = assoc}
|
walther@59664
|
176 |
|
walther@59698
|
177 |
fun set_subst env (form_arg, act_arg) {path, eval, or, finish, assoc, ...} =
|
walther@59698
|
178 |
{env = env, path = path, eval = eval, form_arg = SOME form_arg, act_arg = act_arg,
|
walther@59698
|
179 |
or = or, finish = finish, assoc = assoc}
|
walther@59709
|
180 |
fun set_subst' (form_arg, act_arg) {env, path, eval, or, finish, assoc, ...} =
|
walther@59709
|
181 |
{env = env, path = path, eval = eval, form_arg = SOME form_arg, act_arg = act_arg,
|
walther@59709
|
182 |
or = or, finish = finish, assoc = assoc}
|
walther@59698
|
183 |
fun set_subst_true (form_arg, act_arg) {env, path, eval, or, finish, ...} =
|
walther@59698
|
184 |
{env = env, path = path, eval = eval, form_arg = form_arg, act_arg = act_arg,
|
walther@59698
|
185 |
or = or, finish = finish, assoc = true}
|
walther@59698
|
186 |
fun set_subst_false (form_arg, act_arg) {env, path, eval, or, finish, ...} =
|
walther@59698
|
187 |
{env = env, path = path, eval = eval, form_arg = form_arg, act_arg = act_arg,
|
walther@59698
|
188 |
or = or, finish = finish, assoc = false}
|
walther@59698
|
189 |
fun set_subst_reset (form_arg, act_arg) {env, path, eval, ...} = (*compare NEW OLD usage*)
|
walther@59698
|
190 |
{env = env, path = path, eval = eval, form_arg = form_arg, act_arg = act_arg,
|
walther@59698
|
191 |
or = Aundef, finish = AppUndef_, assoc = false}
|
walther@59698
|
192 |
|
walther@59698
|
193 |
fun set_env env {path, eval, form_arg, act_arg, or, finish, assoc, ...} =
|
walther@59682
|
194 |
{env = env, path = path, eval = eval, form_arg = form_arg, act_arg = act_arg,
|
walther@59682
|
195 |
or = or, finish = finish, assoc = assoc}
|
walther@59698
|
196 |
fun set_env_true env {path, eval, form_arg, act_arg, or, finish, ...} =
|
walther@59682
|
197 |
{env = env, path = path, eval = eval, form_arg = form_arg, act_arg = act_arg,
|
walther@59682
|
198 |
or = or, finish = finish, assoc = true}
|
walther@59698
|
199 |
fun set_form_env (form_arg, env) {path, eval, act_arg, or, finish, assoc, ...} =
|
walther@59698
|
200 |
{env = env, path = path, eval = eval, form_arg = SOME form_arg, act_arg = act_arg,
|
walther@59698
|
201 |
or = or, finish = finish, assoc = assoc}
|
walther@59698
|
202 |
fun set_act_env (act_arg, env) {path, eval, form_arg, or, finish, assoc, ...} =
|
walther@59698
|
203 |
{env = env, path = path, eval = eval, form_arg = form_arg, act_arg = act_arg,
|
walther@59698
|
204 |
or = or, finish = finish, assoc = assoc}
|
walther@59698
|
205 |
fun upd_env form {env, path, eval, form_arg, act_arg, or, finish, assoc} =
|
walther@59697
|
206 |
{env = Env.update env (form, act_arg), path = path, eval = eval, form_arg = form_arg,
|
walther@59682
|
207 |
act_arg = act_arg, or = or, finish = finish, assoc = assoc}
|
walther@59698
|
208 |
fun upd_env' (env, (form, act)) {path, eval, or, finish, assoc, ...} =
|
walther@59697
|
209 |
{env = Env.update env (form, act), path = path, eval = eval, form_arg = SOME form, act_arg = act,
|
walther@59682
|
210 |
or = or, finish = finish, assoc = assoc}
|
walther@59709
|
211 |
fun upd_env'' (form, act) {env, path, eval, or, finish, assoc, ...} =
|
walther@59709
|
212 |
{env = Env.update env (form, act), path = path, eval = eval, form_arg = SOME form, act_arg = act,
|
walther@59709
|
213 |
or = or, finish = finish, assoc = assoc}
|
walther@59682
|
214 |
|
walther@59682
|
215 |
(*
|
walther@59682
|
216 |
{env = env, path = path, eval = eval, form_arg = form_arg, act_arg = act_arg,
|
walther@59682
|
217 |
or = or, finish = finish, assoc = assoc}
|
walther@59682
|
218 |
*)
|
wneuper@59572
|
219 |
|
walther@59674
|
220 |
(**)end(**)
|
wneuper@59572
|
221 |
|