src/Tools/isac/MathEngBasic/istate.sml
author Walther Neuper <walther.neuper@jku.at>
Tue, 19 Nov 2019 14:19:44 +0100
changeset 59712 be2ffb0248de
parent 59709 e49fb19892bd
child 59718 bc4b000caa39
permissions -rw-r--r--
lucin: improve naming for constructors in scans
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