src/Tools/isac/MathEngine/mathengine-stateless.sml
author Walther Neuper <walther.neuper@jku.at>
Thu, 14 Nov 2019 12:08:05 +0100
changeset 59702 501a4ae08275
parent 59701 24273e0a6739
child 59722 b73e64a8a329
permissions -rw-r--r--
tuned
neuper@37906
     1
(* The _functional_ mathematics engine, ie. without a state.
neuper@37906
     2
   Input and output are Isabelle's formulae as strings.
neuper@37906
     3
   authors: Walther Neuper 2000
neuper@37906
     4
   (c) due to copyright terms
neuper@37906
     5
*)
neuper@37906
     6
wneuper@59261
     7
signature MATH_ENGINE =
wneuper@59261
     8
sig
wneuper@59261
     9
  type NEW (* TODO: refactor "fun me" with calcstate and remove *)
wneuper@59411
    10
  val me : Solve.tac'_ -> Ctree.pos' -> NEW ->
walther@59675
    11
    Ctree.ctree -> Ctree.pos' * NEW * Generate.mout * Solve.tac'_ * Telem.safe * Ctree.ctree
wneuper@59411
    12
  val autocalc : Ctree.pos' list -> Ctree.pos' -> (Ctree.state) * Generate.taci list ->
wneuper@59411
    13
    Solve.auto -> string * Ctree.pos' list * (Ctree.state)
wneuper@59261
    14
  val locatetac :
wneuper@59571
    15
    Tactic.input -> Ctree.state -> string * (Generate.taci list * Ctree.pos' list * (Ctree.state))
wneuper@59276
    16
  val step : Ctree.pos' -> Chead.calcstate -> string * Chead.calcstate'
wneuper@59411
    17
  val detailstep : Ctree.ctree -> Ctree.pos' -> string * Ctree.ctree * Ctree.pos'
wneuper@59405
    18
  val get_pblID : Ctree.state -> Celem.pblID option
neuper@37906
    19
wneuper@59563
    20
  val initcontext_met : Ctree.ctree -> Ctree.pos' -> bool * string list * Rule.program * Model.itm list * (bool * term) list
wneuper@59316
    21
  val initcontext_pbl : Ctree.ctree -> Ctree.pos' -> bool * string list * term * Model.itm list * (bool * term) list
wneuper@59563
    22
  val context_met : Celem.metID -> Ctree.ctree -> Ctree.pos -> bool * Celem.metID * Rule.program * Model.itm list * (bool * term) list
wneuper@59405
    23
  val context_pbl : Celem.pblID -> Ctree.ctree -> Ctree.pos -> bool * Celem.pblID * term * Model.itm list * (bool * term) list
wneuper@59405
    24
  val set_method : Celem.metID -> Ctree.state -> Ctree.ctree * Ctree.ocalhd
wneuper@59405
    25
  val set_problem : Celem.pblID -> Ctree.state -> Ctree.ctree * Ctree.ocalhd
wneuper@59416
    26
  val set_theory : Rule.thyID -> Ctree.state -> Ctree.ctree * Ctree.ocalhd
wneuper@59405
    27
  val tryrefine : Celem.pblID -> Ctree.ctree -> Ctree.pos' -> bool * Celem.pblID * term * Model.itm list * (bool * term) list
wneuper@59310
    28
(* ---- for tests only: shifted from below to remove the Warning "unused" at fun.def. --------- *)
walther@59675
    29
  val CalcTreeTEST : Selem.fmz list -> Ctree.pos' * NEW * Generate.mout * (string * Tactic.input) * Telem.safe * Ctree.ctree
wneuper@59416
    30
  val f2str : Generate.mout -> Rule.cterm'
walther@59702
    31
(*/-------------------------------------------------------- ! aktivate for Test_Isac BEGIN ---\* )
wneuper@59261
    32
  type nxt_
wneuper@59533
    33
  datatype lOc_ = ERror of string | UNsafe of Chead.calcstate' | Updated of Chead.calcstate'
wneuper@59571
    34
  val loc_solve_ : string * Tactic.T -> Ctree.ctree *  Ctree.pos' -> lOc_
wneuper@59571
    35
  val loc_specify_ : Tactic.T -> Ctree.state -> lOc_
wneuper@59395
    36
  val nxt_specify_: Ctree.ctree * Ctree.pos' -> Chead.calcstate'
wneuper@59395
    37
  val TESTg_form : Ctree.state -> Generate.mout
walther@59702
    38
( *\--- ! aktivate for Test_Isac END ----------------------------------------------------------/*)
wneuper@59310
    39
wneuper@59310
    40
(*----- unused code, kept as hints to design ideas ---------------------------------------------*)
wneuper@59310
    41
  (* NONE *)
wneuper@59261
    42
end
neuper@37906
    43
wneuper@59261
    44
(**)
wneuper@59261
    45
structure Math_Engine(**): MATH_ENGINE(**) =
wneuper@59261
    46
struct
wneuper@59261
    47
(**)
neuper@37906
    48
wneuper@59276
    49
fun get_pblID (pt, (p, _): Ctree.pos') =
wneuper@59276
    50
  let val p' = Ctree.par_pblobj pt p
wneuper@59276
    51
  	val (_, pI, _) = Ctree.get_obj Ctree.g_spec pt p'
wneuper@59276
    52
  	val (_, (_, oI, _), _) = Ctree.get_obj Ctree.g_origin pt p'
wneuper@59261
    53
  in
wneuper@59405
    54
    if pI <> Celem.e_pblID
wneuper@59261
    55
    then SOME pI
wneuper@59261
    56
    else
wneuper@59405
    57
      if oI <> Celem.e_pblID then SOME oI else NONE end;
neuper@37906
    58
neuper@37906
    59
datatype lOc_ =
wneuper@59265
    60
  ERror of string              (*after loc_specify, loc_solve*)
wneuper@59265
    61
| UNsafe of Chead.calcstate'   (*after loc_specify, loc_solve*)
wneuper@59265
    62
| Updated of Chead.calcstate'  (*after loc_specify, loc_solve*)
wneuper@59261
    63
wneuper@59533
    64
fun loc_specify_ m (pt, pos) =
wneuper@59261
    65
  let
wneuper@59265
    66
    val (p, _, f, _, _, pt) = Chead.specify m pos [] pt;
wneuper@59261
    67
  in
wneuper@59271
    68
    case f of (Generate.Error' e) => ERror e | _ => Updated ([], [], (pt,p))
wneuper@59261
    69
  end
neuper@37906
    70
wneuper@59261
    71
(* TODO push return-value cs' into solve and rename solve->loc_solve?_? *)
wneuper@59261
    72
fun loc_solve_ m (pt, pos) =
wneuper@59261
    73
  let
wneuper@59273
    74
    val (msg, cs') = Solve.solve m (pt, pos);
wneuper@59261
    75
  in
wneuper@59261
    76
    case msg of "ok" => Updated cs' | msg => ERror msg 
wneuper@59261
    77
  end
neuper@37906
    78
neuper@37906
    79
datatype nxt_ =
wneuper@59261
    80
	HElpless  (**)
wneuper@59265
    81
| Nexts of Chead.calcstate (**)
neuper@37906
    82
wneuper@59261
    83
(* locate a tactic in a script and apply it if possible;
wneuper@59261
    84
   report of tacs' applicability in tacis; pt is dropped in setNextTactic*)
walther@59694
    85
fun locatetac _ (ptp as (_, ([], Pos.Res))) = ("end-of-calculation", ([], [], ptp))
neuper@37906
    86
  | locatetac tac (ptp as (pt, p)) =
wneuper@59261
    87
    let
wneuper@59273
    88
      val (mI, m) = Solve.mk_tac'_ tac;
wneuper@59261
    89
    in
wneuper@59272
    90
      case Applicable.applicable_in p pt m of
wneuper@59265
    91
	      Chead.Notappl _ => ("not-applicable", ([],[],  ptp): Chead.calcstate')
wneuper@59265
    92
	    | Chead.Appl m =>
wneuper@59261
    93
	      let 
wneuper@59273
    94
          val x = if member op = Solve.specsteps mI
wneuper@59569
    95
		        then loc_specify_ m ptp else loc_solve_ (mI, m) ptp
wneuper@59261
    96
	      in 
wneuper@59261
    97
	        case x of 
wneuper@59261
    98
		        ERror _ => ("failure", ([], [], ptp))
wneuper@59261
    99
		        (*FIXXXXXME: loc_specify_, loc_solve_ TOGETHER with dropping meOLD+detail.sml*)
wneuper@59261
   100
		      | UNsafe cs' => ("unsafe-ok", cs')
wneuper@59261
   101
		      | Updated (cs' as (_, _, (_, p'))) => (*ev.SEVER.tacs like Begin_Trans*)
walther@59694
   102
		        (if p' = ([], Pos.Res) then "end-of-calculation" else "ok", cs')
wneuper@59261
   103
            (*for SEVER.tacs user to ask ? *)
wneuper@59261
   104
	      end
wneuper@59261
   105
    end
neuper@37906
   106
wneuper@59261
   107
(* iterated by nxt_me; there (the resulting) ptp dropped
wneuper@59261
   108
   may call nxt_solve Apply_Method --- thus evaluated here after solve.sml *)
wneuper@59261
   109
fun nxt_specify_ (ptp as (pt, (p, p_))) =
wneuper@59261
   110
  let
wneuper@59261
   111
    val (pblobj, meth, origin, oris, dI', pI', mI', probl, dI, pI, mI) = 
wneuper@59276
   112
  	  case Ctree.get_obj I pt p of
wneuper@59276
   113
  	    pblobj as (Ctree.PblObj {meth, origin = origin as (oris, (dI', pI', mI'), _),
wneuper@59261
   114
  		  probl, spec = (dI, pI, mI), ...}) => (pblobj, meth, origin, oris, dI', pI', mI', probl, dI, pI, mI)
wneuper@59276
   115
      | Ctree.PrfObj _ => error "nxt_specify_: not on PrfObj"
neuper@41973
   116
  in 
wneuper@59276
   117
    if Ctree.just_created_ pblobj (*by Subproblem*) andalso origin <> Ctree.e_origin
neuper@41973
   118
    then 
neuper@41973
   119
      case mI' of
walther@59694
   120
        ["no_met"] => Chead.nxt_specif (Tactic.Refine_Tacitly pI') (pt, (p, Pos.Pbl))
walther@59694
   121
      | _ => Chead.nxt_specif Tactic.Model_Problem (pt, (p, Pos.Pbl))
neuper@41973
   122
    else 
neuper@41973
   123
      let 
wneuper@59405
   124
        val cpI = if pI = Celem.e_pblID then pI' else pI;
wneuper@59405
   125
  	    val cmI = if mI = Celem.e_metID then mI' else mI;
wneuper@59269
   126
  	    val {ppc, prls, where_, ...} = Specify.get_pbt cpI;
wneuper@59308
   127
  	    val pre = Stool.check_preconds "thy 100820" prls where_ probl;
wneuper@59261
   128
  	    val pb = foldl and_ (true, map fst pre);
wneuper@59261
   129
  	    (*FIXME.WN0308:    ~~~~~: just check true in itms of pbl/met?*)
wneuper@59261
   130
  	    val (_, tac) =
wneuper@59269
   131
  	      Chead.nxt_spec p_ pb oris (dI', pI', mI') (probl, meth) (ppc, (#ppc o Specify.get_met) cmI) (dI, pI, mI)
wneuper@59261
   132
      in
wneuper@59261
   133
        case tac of
wneuper@59571
   134
  	      Tactic.Apply_Method mI => 
wneuper@59581
   135
  	        LucinNEW.begin_end_prog (Tactic.Apply_Method' (mI, NONE, Istate.e_istate, ContextC.e_ctxt)) (Istate.e_istate, ContextC.e_ctxt) ptp
wneuper@59265
   136
  	    | _ => Chead.nxt_specif tac ptp
wneuper@59261
   137
  	  end
wneuper@59261
   138
  end
neuper@37906
   139
wneuper@59261
   140
(* specify a new method; WN0512 impl.incomplete, see 'nxt_specif (Specify_Method ' *)
wneuper@59276
   141
fun set_method mI ptp =
wneuper@59261
   142
  let
wneuper@59261
   143
    val (mits, pt, p) =
wneuper@59571
   144
      case Chead.nxt_specif (Tactic.Specify_Method mI) ptp of
wneuper@59571
   145
        ([(_, Tactic.Specify_Method' (_, _, mits), _)], [], (pt, (p, _))) => (mits, pt, p)
wneuper@59261
   146
      | _ => error "set_method: case 1 uncovered"
wneuper@59261
   147
  	val pre = []        (*...from Specify_Method'*)
wneuper@59261
   148
  	val complete = true (*...from Specify_Method'*)
wneuper@59261
   149
  	(*from Specify_Method'  ?   vvv,  vvv ?*)
wneuper@59261
   150
    val (hdf, spec) =
wneuper@59276
   151
      case Ctree.get_obj I pt p of
wneuper@59276
   152
        Ctree.PblObj {origin = (_, _, hdf), spec, ...} => (hdf, spec)
wneuper@59276
   153
      | Ctree.PrfObj _ => error "set_method: case 2 uncovered"
wneuper@59261
   154
  in
walther@59694
   155
    (pt, (complete, Pos.Met, hdf, mits, pre, spec) : Ctree.ocalhd)
wneuper@59261
   156
  end
neuper@37906
   157
wneuper@59261
   158
(* specify a new problem; WN0512 impl.incomplete, see 'nxt_specif (Specify_Problem ' *)
wneuper@59276
   159
fun set_problem pI ptp =
wneuper@59261
   160
  let
wneuper@59261
   161
    val (complete, pits, pre, pt, p) =
wneuper@59571
   162
      case Chead.nxt_specif (Tactic.Specify_Problem pI) ptp of
wneuper@59571
   163
        ([(_, Tactic.Specify_Problem' (_, (complete, (pits, pre))),_)], _, (pt, (p,_)))
wneuper@59261
   164
          => (complete, pits, pre, pt, p)
wneuper@59261
   165
      | _ => error "set_problem: case 1 uncovered"
wneuper@59261
   166
    (*from Specify_Problem' ?   vvv,  vvv ?*)
wneuper@59261
   167
    val (hdf, spec) =
wneuper@59276
   168
      case Ctree.get_obj I pt p of
wneuper@59276
   169
        Ctree.PblObj {origin = (_, _, hdf), spec, ...} => (hdf, spec)
wneuper@59276
   170
      | Ctree.PrfObj _ => error "set_problem: case 2 uncovered"
wneuper@59261
   171
  in
walther@59694
   172
    (pt, (complete, Pos.Pbl, hdf, pits, pre, spec) : Ctree.ocalhd)
wneuper@59261
   173
  end
neuper@37906
   174
wneuper@59276
   175
fun set_theory tI ptp =
wneuper@59261
   176
  let
wneuper@59261
   177
    val (complete, pits, pre, pt, p) =
wneuper@59571
   178
      case Chead.nxt_specif (Tactic.Specify_Theory tI) ptp of  
wneuper@59571
   179
        ([(_, Tactic.Specify_Problem' (_, (complete, (pits, pre))), _)], _, (pt, (p, _)))
wneuper@59261
   180
          => (complete, pits, pre, pt, p)
wneuper@59261
   181
      | _ => error "set_theory: case 1 uncovered"
wneuper@59261
   182
  	(*from Specify_Theory'  ?   vvv,  vvv ?*)
wneuper@59261
   183
    val (hdf, spec) =
wneuper@59276
   184
      case Ctree.get_obj I pt p of
wneuper@59276
   185
        Ctree.PblObj {origin = (_, _, hdf), spec, ...} => (hdf, spec)
wneuper@59276
   186
      | Ctree.PrfObj _ => error "set_theory: case 2 uncovered"
walther@59694
   187
  in (pt, (complete, Pos.Pbl, hdf, pits, pre, spec) : Ctree.ocalhd) end;
neuper@37906
   188
neuper@41981
   189
(* does a step forward; returns tactic used, ctree updated.
wneuper@59261
   190
   TODO.WN0512 redesign after specify-phase became more separated from solve-phase *)
wneuper@59276
   191
fun step (ip as (_, p_)) (ptp as (pt,p), tacis) =
neuper@41972
   192
  let val pIopt = get_pblID (pt,ip);
neuper@41972
   193
  in
walther@59694
   194
    if ip = ([], Pos.Res)
wneuper@59265
   195
    then ("end-of-calculation", (tacis, [], ptp): Chead.calcstate') 
neuper@41972
   196
    else
neuper@41972
   197
      case tacis of
wneuper@59261
   198
        (_::_) => 
neuper@41972
   199
          if ip = p (*the request is done where ptp waits for*)
wneuper@59261
   200
          then 
wneuper@59271
   201
            let val (pt',c',p') = Generate.generate tacis (pt,[],p)
wneuper@59261
   202
  	        in ("ok", (tacis, c', (pt', p'))) end
walther@59694
   203
          else (case (if member op = [Pos.Pbl, Pos.Met] p_
wneuper@59562
   204
  	                  then nxt_specify_ (pt, ip) else LucinNEW.do_solve_step (pt, ip))
wneuper@59261
   205
  	                  handle ERROR msg => (writeln ("*** " ^ msg);
wneuper@59261
   206
  	                    ([], [], ptp)) (*e.g. Add_Given "equality///"*) of
wneuper@59261
   207
  	              cs as ([],_,_) => ("helpless", cs)
wneuper@59261
   208
  	            | cs => ("ok", cs))
wneuper@59261
   209
      | _ => (case pIopt of
wneuper@59261
   210
  	            NONE => ("no-fmz-spec", ([], [], ptp))
wneuper@59261
   211
  	          | SOME _ =>                         (*vvvvvv: Apply_Method without init_form*)
walther@59694
   212
  	            (case if member op = [Pos.Pbl, Pos.Met] p_ 
wneuper@59395
   213
  	                    andalso is_none (Ctree.get_obj Ctree.g_env pt (fst p))
wneuper@59395
   214
  		                then nxt_specify_ (pt, ip)
wneuper@59582
   215
                      else (LucinNEW.do_solve_step (pt, ip))
wneuper@59261
   216
  	                    handle ERROR msg => (writeln ("*** " ^ msg);
wneuper@59261
   217
  	                      ([],[],ptp)) (*e.g. Add_Given "equality///"*) of
wneuper@59261
   218
  	               cs as ([],_,_) =>("helpless", cs) (*FIXXME del.handle*)
wneuper@59261
   219
  		           | cs => ("ok", cs)))
wneuper@59261
   220
  end
neuper@37906
   221
wneuper@59261
   222
(* does several steps within one calculation as given by "type auto";
neuper@37906
   223
   the steps may arbitrarily go into and leave different phases, 
wneuper@59569
   224
   i.e. specify-phase and solve-phase *)
wneuper@59273
   225
fun autocalc c ip cs (Solve.Step s) =
neuper@37906
   226
    if s <= 1
wneuper@59261
   227
    then
wneuper@59261
   228
      let val (str, (_, c', ptp)) = step ip cs;      (* autoord = 1, probably does 1 step too much*)
wneuper@59261
   229
	    in (str, c@c', ptp) end
wneuper@59261
   230
    else
wneuper@59261
   231
      let val (str, (_, c', ptp as (_, p))) = step ip cs;
wneuper@59261
   232
      in
wneuper@59261
   233
        if str = "ok" 
wneuper@59273
   234
        then autocalc (c@c') p (ptp, []) (Solve.Step (s - 1))
wneuper@59261
   235
        else (str, c@c', ptp) end
wneuper@59261
   236
    (* handles autoord <= 3, autoord > 3 handled by all_solve, complete_solve *)
wneuper@59261
   237
  | autocalc c (pos as (_, p_)) ((pt, _), _(*tacis could help 1x in solve*)) auto =
wneuper@59276
   238
    if Solve.autoord auto > 3 andalso Ctree.just_created (pt, pos)
wneuper@59261
   239
    then
wneuper@59265
   240
      let val ptp = Chead.all_modspec (pt, pos);
wneuper@59273
   241
      in Solve.all_solve auto c ptp end                    (*... auto = 4 | 5 | 6 *)
wneuper@59261
   242
    else
walther@59694
   243
      if member op = [Pos.Pbl, Pos.Met] p_
wneuper@59261
   244
      then
wneuper@59265
   245
        if not (Chead.is_complete_mod (pt, pos))
wneuper@59261
   246
   	    then
wneuper@59265
   247
   	      let val ptp = Chead.complete_mod (pt, pos)      (*... auto = 2 | 3 *)
wneuper@59261
   248
   		    in
wneuper@59273
   249
   		      if Solve.autoord auto < 3 then ("ok", c, ptp)
wneuper@59261
   250
   		      else
wneuper@59265
   251
   		       if not (Chead.is_complete_spec ptp)
wneuper@59261
   252
   			     then
wneuper@59265
   253
   			       let val ptp = Chead.complete_spec ptp
wneuper@59261
   254
   			       in
wneuper@59273
   255
   			         if Solve.autoord auto = 3 then ("ok", c, ptp) else Solve.all_solve auto c ptp
wneuper@59261
   256
   			       end
wneuper@59273
   257
   			     else if Solve.autoord auto = 3 then ("ok", c, ptp) else Solve.all_solve auto c ptp 
wneuper@59261
   258
   		    end
wneuper@59261
   259
   	    else 
wneuper@59265
   260
   		    if not (Chead.is_complete_spec (pt,pos))
wneuper@59261
   261
   		    then
wneuper@59265
   262
   		      let val ptp = Chead.complete_spec (pt, pos)
wneuper@59261
   263
   		      in
wneuper@59273
   264
   		        if Solve.autoord auto = 3 then ("ok", c, ptp) else Solve.all_solve auto c ptp
wneuper@59261
   265
   		      end
wneuper@59261
   266
   		    else
wneuper@59273
   267
   		      if Solve.autoord auto = 3 then ("ok", c, (pt, pos)) else Solve.all_solve auto c (pt, pos)
wneuper@59273
   268
   	  else Solve.complete_solve auto c (pt, pos);
neuper@37906
   269
neuper@37906
   270
(*.initialiye matching; before 'tryMatch' get the pblID to match with:
neuper@37906
   271
   if no pbl has been specified, take the init from origin.*)
wneuper@59261
   272
fun initcontext_pbl pt (p, _) =
wneuper@59261
   273
  let
wneuper@59261
   274
    val (probl, os, pI, hdl, pI') =
wneuper@59276
   275
      case Ctree.get_obj I pt p of
wneuper@59276
   276
        Ctree.PblObj {probl, origin = (os, (_, pI, _), hdl), spec=(_, pI', _), ...}
wneuper@59261
   277
          => (probl, os, pI, hdl, pI')
wneuper@59276
   278
      | Ctree.PrfObj _ => error "initcontext_pbl: uncovered case"
wneuper@59261
   279
  	val pblID =
wneuper@59405
   280
  	  if pI' = Celem.e_pblID 
wneuper@59261
   281
  		then (* TODO.WN051125 (#init o get_pbt) pI *) takelast (2, pI)
wneuper@59261
   282
  		else pI'
wneuper@59269
   283
  	val {ppc, where_, prls, ...} = Specify.get_pbt pblID
wneuper@59592
   284
  	val (model_ok, (pbl, pre)) = Specify.match_itms_oris (Celem.assoc_thy "Isac_Knowledge") probl (ppc, where_, prls) os
wneuper@59261
   285
  in
wneuper@59261
   286
    (model_ok, pblID, hdl, pbl, pre)
wneuper@59261
   287
  end
neuper@37906
   288
wneuper@59261
   289
fun initcontext_met pt (p,_) =
wneuper@59261
   290
  let
wneuper@59261
   291
    val (meth, os, mI, mI') =
wneuper@59276
   292
      case Ctree.get_obj I pt p of
wneuper@59276
   293
        Ctree.PblObj {meth, origin = (os, (_, _, mI), _), spec=(_, _, mI'), ...} => (meth, os, mI, mI')
wneuper@59276
   294
      | Ctree.PrfObj _ => error "initcontext_met: uncovered case"
wneuper@59405
   295
  	val metID = if mI' = Celem.e_metID 
wneuper@59261
   296
  		    then (*TODO.WN051125 (#init o get_pbt) pI *) takelast (2, mI)
wneuper@59261
   297
  		    else mI'
wneuper@59269
   298
  	val {ppc, pre, prls, scr, ...} = Specify.get_met metID
wneuper@59592
   299
  	val (model_ok, (pbl, pre)) = Specify.match_itms_oris (Celem.assoc_thy "Isac_Knowledge") meth (ppc,pre,prls) os
wneuper@59261
   300
  in
wneuper@59261
   301
    (model_ok, metID, scr, pbl, pre)
wneuper@59261
   302
  end
neuper@37906
   303
wneuper@59261
   304
(* match the model of a problem at pos p with the model-pattern of the problem with pblID *)
wneuper@59276
   305
fun context_pbl pI pt p =
wneuper@59261
   306
  let
wneuper@59261
   307
    val (probl, os, hdl) =
wneuper@59276
   308
      case Ctree.get_obj I pt p of
wneuper@59276
   309
        Ctree.PblObj {probl,origin = (os, _, hdl),...} => (probl, os, hdl)
wneuper@59276
   310
      | Ctree.PrfObj _ => error "context_pbl: uncovered case"
wneuper@59269
   311
  	val {ppc,where_,prls,...} = Specify.get_pbt pI
wneuper@59592
   312
  	val (model_ok, (pbl, pre)) = Specify.match_itms_oris (Celem.assoc_thy "Isac_Knowledge") probl (ppc,where_,prls) os
wneuper@59261
   313
  in
wneuper@59261
   314
    (model_ok, pI, hdl, pbl, pre)
wneuper@59261
   315
  end
neuper@37906
   316
wneuper@59276
   317
fun context_met mI pt p =
wneuper@59261
   318
  let
wneuper@59261
   319
    val (meth, os) =
wneuper@59276
   320
      case Ctree.get_obj I pt p of
wneuper@59276
   321
        Ctree.PblObj {meth, origin = (os, _, _),...} => (meth, os)
wneuper@59276
   322
      | Ctree.PrfObj _ => error "context_met: uncovered case"
wneuper@59269
   323
  	val {ppc,pre,prls,scr,...} = Specify.get_met mI
wneuper@59592
   324
  	val (model_ok, (pbl, pre)) = Specify.match_itms_oris (Celem.assoc_thy "Isac_Knowledge") meth (ppc,pre,prls) os
wneuper@59261
   325
  in
wneuper@59261
   326
    (model_ok, mI, scr, pbl, pre)
wneuper@59261
   327
  end
neuper@37906
   328
wneuper@59261
   329
fun tryrefine pI pt (p,_) =
wneuper@59261
   330
  let
wneuper@59261
   331
    val (probl, os, hdl) =
wneuper@59276
   332
      case Ctree.get_obj I pt p of
wneuper@59276
   333
        Ctree.PblObj {probl, origin = (os, _, hdl), ...} => (probl, os, hdl)
wneuper@59276
   334
      | Ctree.PrfObj _ => error "context_met: uncovered case"
wneuper@59261
   335
  in
wneuper@59592
   336
    case Specify.refine_pbl (Celem.assoc_thy "Isac_Knowledge") pI probl of
wneuper@59261
   337
  	  NONE => (*copy from context_pbl*)
wneuper@59261
   338
  	    let
wneuper@59269
   339
  	      val {ppc,where_,prls,...} = Specify.get_pbt pI
wneuper@59592
   340
  	      val (_, (pbl, pre)) = Specify.match_itms_oris (Celem.assoc_thy "Isac_Knowledge") probl (ppc,where_,prls) os
wneuper@59261
   341
        in
wneuper@59261
   342
          (false, pI, hdl, pbl, pre)
wneuper@59261
   343
        end
wneuper@59261
   344
  	| SOME (pI, (pbl, pre)) => (true, pI, hdl, pbl, pre) 
wneuper@59261
   345
  end
neuper@37906
   346
wneuper@59276
   347
fun detailstep pt (pos as (p, _)) = 
neuper@55471
   348
  let 
wneuper@59276
   349
    val nd = Ctree.get_nd pt p
wneuper@59276
   350
    val cn = Ctree.children nd
neuper@55471
   351
  in 
neuper@55471
   352
    if null cn 
wneuper@59261
   353
    then
wneuper@59571
   354
      if (Tactic.is_rewset o (Ctree.get_obj Ctree.g_tac nd)) [(*root of nd*)]
wneuper@59273
   355
      then Solve.detailrls pt pos
walther@59694
   356
      else ("no-Rewrite_Set...", Ctree.EmptyPtree, Pos.e_pos')
walther@59694
   357
    else ("donesteps", pt, (p @ [length (Ctree.children (Ctree.get_nd pt p))], Pos.Res)) 
neuper@55471
   358
  end;
neuper@37906
   359
neuper@37906
   360
wneuper@59261
   361
(*** for mathematics authoring on sml-toplevel; no XML ***)
neuper@37906
   362
neuper@37906
   363
type NEW = int list;
neuper@37906
   364
wneuper@59261
   365
(* 15.8.03 for me with loc_specify/solve, nxt_specify/solve
wneuper@59261
   366
   delete as soon as TESTg_form -> _mout_ dropped           *)
neuper@37906
   367
fun TESTg_form ptp =
wneuper@59261
   368
  let
wneuper@59265
   369
    val (form, _, _) = Chead.pt_extract ptp
wneuper@59261
   370
  in
wneuper@59261
   371
    case form of
wneuper@59416
   372
      Ctree.Form t => Generate.FormKF (Rule.term2str t)
wneuper@59276
   373
    | Ctree.ModSpec (_, p_, _, gfr, pre, _) =>
wneuper@59271
   374
      Generate.PpcKF (
walther@59694
   375
        (case p_ of Pos.Pbl => Generate.Problem []
walther@59694
   376
          | Pos.Met => Generate.Method []
wneuper@59313
   377
          | _ => error "TESTg_form: uncovered case",
wneuper@59592
   378
 			Specify.itms2itemppc (Celem.assoc_thy"Isac_Knowledge") gfr pre))
wneuper@59267
   379
   end
neuper@37906
   380
wneuper@59261
   381
(* create a calc-tree; for use within sml: thus "^^^" NOT decoded to "^" etc;
wneuper@59261
   382
   compare "fun CalcTree" which DOES decode                        *)
wneuper@59261
   383
fun CalcTreeTEST [(fmz, sp)] = 
neuper@42011
   384
  let
wneuper@59265
   385
    val ((pt, p), tacis) = Chead.nxt_specify_init_calc (fmz, sp)
wneuper@59571
   386
	  val tac = case tacis of [] => Tactic.Empty_Tac | _ => (#1 o hd) tacis
neuper@42011
   387
	  val f = TESTg_form (pt,p)
walther@59675
   388
  in (p, []:NEW, f, (Tactic.tac2IDstr tac, tac), Telem.Sundef, pt) end
wneuper@59261
   389
| CalcTreeTEST _ = error "CalcTreeTEST: uncovered case"
neuper@37906
   390
       
neuper@37906
   391
(*for tests > 15.8.03 after separation setnexttactic / nextTac:
neuper@37906
   392
  external view: me should be used by math-authors as done so far
neuper@37906
   393
  internal view: loc_specify/solve, nxt_specify/solve used
neuper@37906
   394
                 i.e. same as in setnexttactic / nextTac*)
neuper@37906
   395
(*ENDE TESTPHASE 08/10.03:
neuper@37906
   396
  NEW loeschen, eigene Version von locatetac, step
neuper@37906
   397
  meNEW, CalcTreeTEST: tac'_ -replace-> tac, remove [](cid) *)
neuper@37906
   398
wneuper@59592
   399
fun me (*(_, Empty_Tac) p _ _ = raise ERROR ("me:  Empty_Tac at " ^ pos'2str p)
wneuper@59592
   400
  | me*) (_, tac) p _(*NEW remove*) pt =
wneuper@59592
   401
    let 
wneuper@59592
   402
      val (pt, p) = 
wneuper@59592
   403
  	    (*locatetac is here for testing by me; step would suffice in me*)
wneuper@59592
   404
  	    case locatetac tac (pt, p) of
wneuper@59592
   405
  		    ("ok", (_, _, ptp)) => ptp
wneuper@59592
   406
  	    | ("unsafe-ok", (_, _, ptp)) => ptp
wneuper@59592
   407
  	    | ("not-applicable",_) => (pt, p)
wneuper@59592
   408
  	    | ("end-of-calculation", (_, _, ptp)) => ptp
wneuper@59592
   409
  	    | ("failure", _) => error "sys-error"
wneuper@59592
   410
  	    | _ => error "me: uncovered case"
wneuper@59592
   411
  	  val (_, ts) =
walther@59655
   412
        (*step's correct ctree is not tested in me, but in autocalc*)
walther@59694
   413
  	    (case step p ((pt, Pos.e_pos'), []) of
wneuper@59592
   414
  		    ("ok", (ts as (_, _, _) :: _, _, _)) => ("", ts)
wneuper@59592
   415
  	    | ("helpless", _) => ("helpless: cannot propose tac", [])
wneuper@59592
   416
  	    | ("no-fmz-spec", _) => error "no-fmz-spec"
wneuper@59592
   417
  	    | ("end-of-calculation", (ts, _, _)) => ("", ts)
wneuper@59592
   418
  	    | _ => error "me: uncovered case")
wneuper@59592
   419
  	      handle ERROR msg => raise ERROR msg
wneuper@59592
   420
  	  val tac = 
wneuper@59592
   421
        case ts of 
wneuper@59592
   422
          tacis as (_::_) => let val (tac, _, _) = last_elem tacis in tac end 
walther@59694
   423
  		  | _ => if p = ([], Pos.Res) then Tactic.End_Proof' else Tactic.Empty_Tac;
walther@59654
   424
    in
walther@59654
   425
      (p, [] : NEW, TESTg_form (pt, p) (* form output comes from locatetac *), 
walther@59675
   426
  	    (Tactic.tac2IDstr tac, tac), Telem.Sundef, pt)
wneuper@59592
   427
    end
neuper@37906
   428
wneuper@59261
   429
(* for quick test-print-out, until 'type inout' is removed *)
wneuper@59313
   430
fun f2str (Generate.FormKF cterm') = cterm'
wneuper@59313
   431
  | f2str _ = error "f2str: uncovered case in fun.def.";
neuper@37906
   432
neuper@37906
   433
end