src/Tools/isac/Interpret/mathengine.sml
author Walther Neuper <neuper@ist.tugraz.at>
Wed, 11 May 2011 07:28:13 +0200
branchdecompose-isar
changeset 41980 6ec461ac6c76
parent 41975 61f358925792
child 41981 9e2de17e4071
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
use"mathengine.sml";
neuper@37906
     7
*)
neuper@37906
     8
neuper@37906
     9
signature MATHENGINE =
neuper@37906
    10
  sig
neuper@37906
    11
    type nxt_
neuper@37906
    12
    (* datatype nxt_ = HElpless | Nexts of CalcHead.calcstate *)
neuper@37906
    13
    type NEW
neuper@37906
    14
    type lOc_
neuper@37906
    15
    (*datatype
neuper@37906
    16
      lOc_ =
neuper@37906
    17
          ERror of string
neuper@37906
    18
        | UNsafe of CalcHead.calcstate'
neuper@37906
    19
        | Updated of CalcHead.calcstate' *)
neuper@37906
    20
neuper@37906
    21
    val CalcTreeTEST :
neuper@37906
    22
       fmz list ->
neuper@37906
    23
       pos' * NEW * mout * (string * tac) * safe * ptree
neuper@37906
    24
neuper@37906
    25
    val TESTg_form : ptree * (int list * pos_) -> mout
neuper@37906
    26
    val autocalc :
neuper@37906
    27
       pos' list ->
neuper@37906
    28
       pos' ->
neuper@37906
    29
       (ptree * pos') * taci list ->
neuper@37906
    30
       auto -> string * pos' list * (ptree * pos')
neuper@37906
    31
    val detailstep : ptree -> pos' -> string * ptree * pos'
neuper@37906
    32
   (* val e_tac_ : tac_ *)
neuper@37906
    33
    val f2str : mout -> cterm'
neuper@37931
    34
   (* val get_pblID : ptree * pos' -> pblID option *)
neuper@37906
    35
    val initmatch : ptree -> pos' -> ptform
neuper@37906
    36
   (* val loc_solve_ :
neuper@37906
    37
       string * tac_ -> ptree * (int list * pos_) -> lOc_ *)
neuper@37906
    38
   (* val loc_specify_ : tac_ -> ptree * pos' -> lOc_ *)
neuper@37906
    39
    val locatetac :     (*tests only*)
neuper@37906
    40
       tac ->
neuper@37906
    41
       ptree * (posel list * pos_) ->
neuper@37906
    42
       string * (taci list * pos' list * (ptree * (posel list * pos_)))
neuper@37906
    43
    val me :
neuper@37906
    44
       tac'_ ->
neuper@37906
    45
       pos' ->
neuper@37906
    46
       NEW ->
neuper@37906
    47
       ptree -> pos' * NEW * mout * tac'_ * safe * ptree
neuper@37906
    48
neuper@37906
    49
    val nxt_specify_ : ptree * (int list * pos_) -> calcstate'(*tests only*)
neuper@37906
    50
    val set_method : metID -> ptree * pos' -> ptree * ocalhd
neuper@37906
    51
    val set_problem : pblID -> ptree * pos' -> ptree * ocalhd
neuper@37906
    52
    val set_theory : thyID -> ptree * pos' -> ptree * ocalhd
neuper@37906
    53
    val step : pos' -> calcstate -> string * calcstate'
neuper@37906
    54
    val trymatch : pblID -> ptree -> pos' -> ptform
neuper@37906
    55
    val tryrefine : pblID -> ptree -> pos' -> ptform
neuper@37906
    56
  end
neuper@37906
    57
neuper@37906
    58
neuper@37906
    59
neuper@37906
    60
(*------------------------------------------------------------------(**)
neuper@37906
    61
structure MathEngine : MATHENGINE =
neuper@37906
    62
struct
neuper@37906
    63
(**)------------------------------------------------------------------*)
neuper@37906
    64
neuper@37906
    65
fun get_pblID (pt, (p,_):pos') =
neuper@37906
    66
    let val p' = par_pblobj pt p
neuper@37906
    67
	val (_,pI,_) = get_obj g_spec pt p'
neuper@37906
    68
	val (_,(_,oI,_),_) = get_obj g_origin pt p'
neuper@37926
    69
    in if pI <> e_pblID then SOME pI
neuper@37926
    70
       else if oI <> e_pblID then SOME oI
neuper@37926
    71
       else NONE end;
neuper@37906
    72
(*fun get_pblID (pt, (p,_):pos') =
neuper@37906
    73
    ((snd3 o (get_obj g_spec pt)) (par_pblobj pt p));*)
neuper@37906
    74
neuper@37906
    75
neuper@37906
    76
(*--vvv--dummies for test*)
neuper@37906
    77
val e_tac_ = Tac_ (Pure.thy,"","","");
neuper@37906
    78
datatype lOc_ =
neuper@37906
    79
  ERror of string         (*after loc_specify, loc_solve*)
neuper@37906
    80
| UNsafe of calcstate'    (*after loc_specify, loc_solve*)
neuper@37906
    81
| Updated of calcstate';   (*after loc_specify, loc_solve*)
neuper@37906
    82
fun loc_specify_ m (pt,pos) =
neuper@37906
    83
(* val pos = ip;
neuper@37906
    84
   *)
neuper@37906
    85
    let val (p,_,f,_,s,pt) = specify m pos [] pt;
neuper@37906
    86
(*      val (_,_,_,_,_,pt')= specify m pos [] pt;
neuper@37906
    87
   *) 
neuper@37906
    88
   in case f of
neuper@37906
    89
	   (Error' (Error_ e)) => ERror e
neuper@37906
    90
	 | _ => Updated ([], [], (pt,p)) end;
neuper@37906
    91
neuper@37906
    92
(*. TODO push return-value cs' into solve and rename solve->loc_solve?_? .*)
neuper@37906
    93
(* val (m, pos) = ((mI,m), ip);
neuper@37906
    94
   val (m,(pt,pos) ) = ((mI,m), ptp);
neuper@37906
    95
   *)  
neuper@37906
    96
fun loc_solve_ m (pt,pos) =
neuper@37906
    97
    let val (msg, cs') = solve m (pt, pos);
neuper@37906
    98
(* val (tacis,dels,(pt',p')) = cs';
neuper@38015
    99
   (tracing o istate2str) (get_istate pt' p');
neuper@37906
   100
   (term2str o fst) (get_obj g_result pt' (fst p'));
neuper@37906
   101
   *)
neuper@37906
   102
    in case msg of
neuper@37906
   103
	   "ok" => Updated cs' 
neuper@37906
   104
	 | msg => ERror msg 
neuper@37906
   105
    end;
neuper@37906
   106
neuper@37906
   107
datatype nxt_ =
neuper@37906
   108
	 HElpless  (**)
neuper@37906
   109
       | Nexts of calcstate; (**)
neuper@37906
   110
neuper@37906
   111
(*. locate a tactic in a script and apply it if possible .*)
neuper@37906
   112
(*report applicability of tac in tacis; pt is dropped in setNextTactic*)
neuper@37906
   113
fun locatetac _ (ptp as (_,([],Res))) = ("end-of-calculation", ([], [], ptp))
neuper@37906
   114
  | locatetac tac (ptp as (pt, p)) =
neuper@41975
   115
      let val (mI,m) = mk_tac'_ tac;
neuper@41975
   116
      in case applicable_in p pt m of
neuper@41975
   117
	         Notappl e => ("not-applicable", ([],[],  ptp):calcstate')
neuper@41975
   118
	       | Appl m =>
neuper@41975
   119
	           let 
neuper@41975
   120
               val x = if member op = specsteps mI
neuper@41975
   121
		             then loc_specify_ m ptp else loc_solve_ (mI,m) ptp
neuper@41975
   122
	           in case x of 
neuper@41975
   123
		              ERror e => ("failure", ([], [], ptp))
neuper@41975
   124
		              (*FIXXXXXME: loc_specify_, loc_solve_ TOGETHER with dropping meOLD+detail.sml*)
neuper@41975
   125
		            | UNsafe cs' => ("unsafe-ok", cs')
neuper@41975
   126
		            | Updated (cs' as (_,_,(_,p'))) => (*ev.SEVER.tacs like Begin_Trans*)
neuper@41975
   127
		                (if p' = ([],Res) then "end-of-calculation" else "ok", cs')
neuper@41975
   128
                    (*for SEVER.tacs  user to ask ? *)
neuper@41975
   129
	           end
neuper@41975
   130
      end;
neuper@37906
   131
neuper@37906
   132
(*iterated by nxt_me; there (the resulting) ptp dropped
neuper@37906
   133
  may call nxt_solve Apply_Method --- thus evaluated here after solve.sml*)
neuper@37906
   134
fun nxt_specify_ (ptp as (pt, pos as (p,p_))) =
neuper@41973
   135
  let val pblobj as (PblObj{meth,origin=origin as (oris,(dI',pI',mI'),_),
neuper@41973
   136
			  probl,spec=(dI,pI,mI),...}) = get_obj I pt p;
neuper@41973
   137
  in 
neuper@41973
   138
    if just_created_ pblobj (*by Subproblem*) andalso origin <> e_origin
neuper@41973
   139
    then 
neuper@41973
   140
      case mI' of
neuper@41973
   141
	      ["no_met"] => nxt_specif (Refine_Tacitly pI') (pt, (p, Pbl))
neuper@41973
   142
      | _ => nxt_specif Model_Problem (pt, (p,Pbl))
neuper@41973
   143
    else 
neuper@41973
   144
      let 
neuper@41973
   145
        val cpI = if pI = e_pblID then pI' else pI;
neuper@41973
   146
		    val cmI = if mI = e_metID then mI' else mI;
neuper@41973
   147
		    val {ppc, prls, where_, ...} = get_pbt cpI;
neuper@41973
   148
		    val pre = check_preconds "thy 100820" prls where_ probl;
neuper@41973
   149
		    val pb = foldl and_ (true, map fst pre);
neuper@41973
   150
		    (*FIXME.WN0308:    ~~~~~: just check true in itms of pbl/met?*)
neuper@41973
   151
		    val (_,tac) = nxt_spec p_ pb oris (dI',pI',mI') (probl, meth) 
neuper@41973
   152
			    (ppc, (#ppc o get_met) cmI) (dI, pI, mI);
neuper@37906
   153
	    in case tac of
neuper@41973
   154
		       Apply_Method mI => 
neuper@41973
   155
		         nxt_solv (Apply_Method' (mI, NONE, e_istate, e_ctxt)) (e_istate, e_ctxt) ptp
neuper@41973
   156
		     | _ => nxt_specif tac ptp end
neuper@41973
   157
   end;
neuper@37906
   158
neuper@37906
   159
(*.specify a new method;
neuper@37906
   160
   WN0512 impl.incomplete, see 'nxt_specif (Specify_Method ' .*)
neuper@37906
   161
fun set_method (mI:metID) ptp =
neuper@37906
   162
    let val ([(_, Specify_Method' (_, _, mits), _)], [], (pt, pos as (p,_))) = 
neuper@37906
   163
	    nxt_specif (Specify_Method mI) ptp
neuper@37906
   164
	val pre = []        (*...from Specify_Method'*)
neuper@37906
   165
	val complete = true (*...from Specify_Method'*)
neuper@37906
   166
	(*from Specify_Method'  ? vvv,  vvv ?*)
neuper@37906
   167
	val PblObj {origin = (_,_,hdf), spec,...} = get_obj I pt p
neuper@37906
   168
    in (pt, (complete, Met, hdf, mits, pre, spec):ocalhd) end;
neuper@37906
   169
neuper@37906
   170
(*.specify a new problem;
neuper@37906
   171
   WN0512 impl.incomplete, see 'nxt_specif (Specify_Problem ' .*)
neuper@37906
   172
fun set_problem pI (ptp: ptree * pos') =
neuper@37906
   173
    let val ([(_, Specify_Problem' (_, (complete, (pits, pre))),_)],
neuper@37906
   174
	     _, (pt, pos as (p,_))) = nxt_specif (Specify_Problem pI) ptp
neuper@37906
   175
	(*from Specify_Problem' ? vvv,  vvv ?*)
neuper@37906
   176
	val PblObj {origin = (_,_,hdf), spec,...} = get_obj I pt p
neuper@37906
   177
    in (pt, (complete, Pbl, hdf, pits, pre, spec):ocalhd) end;
neuper@37906
   178
neuper@37906
   179
fun set_theory (tI:thyID) (ptp: ptree * pos') =
neuper@37906
   180
    let val ([(_, Specify_Problem' (_, (complete, (pits, pre))),_)],
neuper@37906
   181
	     _, (pt, pos as (p,_))) = nxt_specif (Specify_Theory tI) ptp
neuper@37906
   182
	(*from Specify_Theory'  ? vvv,  vvv ?*)
neuper@37906
   183
	val PblObj {origin = (_,_,hdf), spec,...} = get_obj I pt p
neuper@37906
   184
    in (pt, (complete, Pbl, hdf, pits, pre, spec):ocalhd) end;
neuper@37906
   185
neuper@37906
   186
(*.does a step forward; returns tactic used, ctree updated.
neuper@37906
   187
TODO.WN0512 redesign after specify-phase became more separated from solve-phase
neuper@37906
   188
arg ip: 
neuper@37906
   189
    calcstate
neuper@37906
   190
.*)
neuper@37906
   191
(* val (ip as (_,p_), (ptp as (pt,p), tacis)) = (get_pos 1 1, get_calc 1);
neuper@37906
   192
   val (ip as (_,p_), (ptp as (pt,p), tacis)) = (pos, cs);
neuper@37906
   193
   val (ip as (_,p_), (ptp as (pt,p), tacis)) = (p, ((pt, e_pos'),[]));
neuper@37906
   194
   val (ip as (_,p_), (ptp as (pt,p), tacis)) = (ip,cs);
neuper@37906
   195
   *)
neuper@37906
   196
fun step ((ip as (_,p_)):pos') ((ptp as (pt,p), tacis):calcstate) =
neuper@41972
   197
  let val pIopt = get_pblID (pt,ip);
neuper@41972
   198
  in
neuper@41972
   199
    if (*p = ([],Res) orelse*) ip = ([],Res)
neuper@41972
   200
    then ("end-of-calculation",(tacis, [], ptp):calcstate') 
neuper@41972
   201
    else
neuper@41972
   202
      case tacis of
neuper@41972
   203
	      (_::_) => 
neuper@41972
   204
          if ip = p (*the request is done where ptp waits for*)
neuper@41972
   205
	        then 
neuper@41972
   206
            let val (pt',c',p') = generate tacis (pt,[],p)
neuper@41972
   207
		        in ("ok", (tacis, c', (pt', p'))) end
neuper@41972
   208
	        else (case (if member op = [Pbl,Met] p_
neuper@41972
   209
		                  then nxt_specify_ (pt,ip) else nxt_solve_ (pt,ip))
neuper@41972
   210
		                  handle _ => ([],[],ptp)(*e.g. Add_Given "equality///"*) of
neuper@41972
   211
		              cs as ([],_,_) => ("helpless", cs)
neuper@41972
   212
		            | cs => ("ok", cs))
neuper@41972
   213
	    | _ => (case pIopt of
neuper@41972
   214
		            NONE => ("no-fmz-spec", ([], [], ptp))
neuper@41972
   215
		          | SOME pI =>
neuper@41972
   216
		            (case (if member op = [Pbl,Met] p_
neuper@41972
   217
			                   andalso is_none (get_obj g_env pt (fst p))
neuper@41972
   218
			                        (*^^^^^^^^: Apply_Method without init_form*)
neuper@41972
   219
			                 then nxt_specify_ (pt,ip) 
neuper@41972
   220
                       else nxt_solve_ (pt,ip) )
neuper@41972
   221
			                handle _ => ([],[],ptp)(*e.g.by Add_Giv"equality///"*) of
neuper@41972
   222
		               cs as ([],_,_) =>("helpless", cs)(*FIXXMEdel.handle*)
neuper@41972
   223
			           | cs => ("ok", cs)))
neuper@41972
   224
  end;
neuper@37906
   225
neuper@37906
   226
(*  (nxt_solve_ (pt,ip)) handle e => print_exn e ;
neuper@37906
   227
neuper@37906
   228
   *)
neuper@37906
   229
neuper@37906
   230
neuper@37906
   231
neuper@37906
   232
neuper@37906
   233
(*.does several steps within one calculation as given by "type auto";
neuper@37906
   234
   the steps may arbitrarily go into and leave different phases, 
neuper@37906
   235
   i.e. specify-phase and solve-phase.*)
neuper@37906
   236
(*TODO.WN0512 ? redesign after the phases have been more separated
neuper@37906
   237
  at the fron-end in 05: 
neuper@37906
   238
  eg. CompleteCalcHead could be done by a separate fun !!!*)
neuper@37906
   239
(* val (ip, cs as (ptp as (pt,p),tacis)) = (get_pos cI 1, get_calc cI);
neuper@37906
   240
   val (ip, cs as (ptp as (pt,p),tacis)) = (pold, get_calc cI);
neuper@37906
   241
   val (c, ip, cs as (ptp as (_,p),tacis), Step s) = 
neuper@37906
   242
       ([]:pos' list, pold, get_calc cI, auto);
neuper@37906
   243
   *) 
neuper@37906
   244
fun autocalc c ip (cs as (ptp as (_,p),tacis)) (Step s) =
neuper@37906
   245
    if s <= 1
neuper@37906
   246
    then let val (str, (_, c', ptp)) = step ip cs;(*1*)
neuper@37906
   247
	 (*at least does 1 step, ev.1 too much*)
neuper@37906
   248
	 in (str, c@c', ptp) end
neuper@37906
   249
    else let val (str, (_, c', ptp as (_, p))) = step ip cs;
neuper@37906
   250
	 in if str = "ok" 
neuper@37906
   251
	    then autocalc (c@c') p (ptp,[]) (Step (s-1))
neuper@37906
   252
	    else (str, c@c', ptp) end
neuper@37906
   253
(*handles autoord <= 3, autoord > 3 handled by all_/complete_solve*)
neuper@37906
   254
  | autocalc c (pos as (_,p_)) ((pt,_), _(*tacis would help 1x in solve*))auto=
neuper@37906
   255
(* val (c:pos' list, (pos as (_,p_)),((pt,_),_),auto) = 
neuper@37906
   256
      ([], pold, get_calc cI, auto);
neuper@37906
   257
   *)
neuper@37906
   258
     if autoord auto > 3 andalso just_created (pt, pos)
neuper@37906
   259
     then let val ptp = all_modspec (pt, pos);
neuper@37906
   260
	  in all_solve auto c ptp end
neuper@37906
   261
     else
neuper@37939
   262
	 if member op = [Pbl, Met] p_
neuper@37939
   263
 	 then if not (is_complete_mod (pt, pos))
neuper@37906
   264
	      then let val ptp = complete_mod (pt, pos)
neuper@37906
   265
		   in if autoord auto < 3 then ("ok", c, ptp)
neuper@37906
   266
		      else 
neuper@37906
   267
			  if not (is_complete_spec ptp)
neuper@37906
   268
			  then let val ptp = complete_spec ptp
neuper@37906
   269
			       in if autoord auto = 3 then ("ok", c, ptp)
neuper@37906
   270
				  else all_solve auto c ptp
neuper@37906
   271
			       end
neuper@37906
   272
			  else if autoord auto = 3 then ("ok", c, ptp)
neuper@37906
   273
			  else all_solve auto c ptp 
neuper@37906
   274
		   end
neuper@37906
   275
	      else 
neuper@37906
   276
		  if not (is_complete_spec (pt,pos))
neuper@37906
   277
		  then let val ptp = complete_spec (pt, pos)
neuper@37906
   278
		       in if autoord auto = 3 then ("ok", c, ptp)
neuper@37906
   279
			  else all_solve auto c ptp
neuper@37906
   280
		       end
neuper@37906
   281
		  else if autoord auto = 3 then ("ok", c, (pt, pos))
neuper@37906
   282
		  else all_solve auto c (pt, pos)
neuper@37906
   283
	 else complete_solve auto c (pt, pos);
neuper@37906
   284
(* val pbl = get_obj g_pbl (fst ptp) [];
neuper@37906
   285
   val (oris,_,_) = get_obj g_origin (fst ptp) [];
neuper@37906
   286
*)    
neuper@37906
   287
neuper@37906
   288
neuper@37906
   289
neuper@37906
   290
neuper@37906
   291
neuper@37906
   292
(*.initialiye matching; before 'tryMatch' get the pblID to match with:
neuper@37906
   293
   if no pbl has been specified, take the init from origin.*)
neuper@37906
   294
(*fun initmatch pt (pos as (p,_):pos') =
neuper@37906
   295
    let val PblObj {probl,origin=(os,(_,pI,_),_),spec=(dI',pI',mI'),...} = 
neuper@37906
   296
	    get_obj I pt p
neuper@37906
   297
	val pblID = if pI' = e_pblID 
neuper@37906
   298
		    then (*TODO.WN051125 (#init o get_pbt) pI          <<<*) 
neuper@37906
   299
			takelast (2, pI) (*FIXME.WN051125 a hack, impl.^^^*)
neuper@37906
   300
		    else pI'
neuper@37906
   301
	val spec = (dI',pblID,mI')
neuper@37906
   302
	val {ppc,where_,prls,...} = get_pbt pblID
neuper@37906
   303
	val (model_ok, (pbl, pre)) = 
neuper@38050
   304
	    match_itms_oris (assoc_thy "Isac") probl (ppc,where_,prls) os
neuper@37906
   305
    in ModSpec (ocalhd_complete pbl pre spec,
neuper@37906
   306
		Pbl, e_term, pbl, pre, spec) end;*)
neuper@37906
   307
fun initcontext_pbl pt (pos as (p,_):pos') =
neuper@37906
   308
    let val PblObj {probl,origin=(os,(_,pI,_),hdl),spec=(dI',pI',mI'),...} = 
neuper@37906
   309
	    get_obj I pt p
neuper@37906
   310
	val pblID = if pI' = e_pblID 
neuper@37906
   311
		    then (*TODO.WN051125 (#init o get_pbt) pI          <<<*) 
neuper@37906
   312
			takelast (2, pI) (*FIXME.WN051125 a hack, impl.^^^*)
neuper@37906
   313
		    else pI'
neuper@37906
   314
	val {ppc,where_,prls,...} = get_pbt pblID
neuper@37906
   315
	val (model_ok, (pbl, pre)) = 
neuper@38050
   316
	    match_itms_oris (assoc_thy "Isac") probl (ppc,where_,prls) os
neuper@37906
   317
    in (model_ok, pblID, hdl, pbl, pre) end;
neuper@37906
   318
neuper@37906
   319
fun initcontext_met pt (pos as (p,_):pos') =
neuper@37906
   320
    let val PblObj {meth,origin=(os,(_,_,mI), _),spec=(_, _, mI'),...} = 
neuper@37906
   321
	    get_obj I pt p
neuper@37906
   322
	val metID = if mI' = e_metID 
neuper@37906
   323
		    then (*TODO.WN051125 (#init o get_pbt) pI          <<<*) 
neuper@37906
   324
			takelast (2, mI) (*FIXME.WN051125 a hack, impl.^^^*)
neuper@37906
   325
		    else mI'
neuper@37906
   326
	val {ppc,pre,prls,scr,...} = get_met metID
neuper@37906
   327
	val (model_ok, (pbl, pre)) = 
neuper@38050
   328
	    match_itms_oris (assoc_thy "Isac") meth (ppc,pre,prls) os
neuper@37906
   329
    in (model_ok, metID, scr, pbl, pre) end;
neuper@37906
   330
neuper@37906
   331
(*.match the model of a problem at pos p 
neuper@37906
   332
   with the model-pattern of the problem with pblID*)
neuper@37906
   333
fun context_pbl pI pt (p:pos) =
neuper@37906
   334
    let val PblObj {probl,origin=(os,_,hdl),...} = get_obj I pt p
neuper@37906
   335
	val {ppc,where_,prls,...} = get_pbt pI
neuper@37906
   336
	val (model_ok, (pbl, pre)) = 
neuper@38050
   337
	    match_itms_oris (assoc_thy "Isac") probl (ppc,where_,prls) os
neuper@37906
   338
    in (model_ok, pI, hdl, pbl, pre) end;
neuper@37906
   339
neuper@37906
   340
fun context_met mI pt (p:pos) =
neuper@37906
   341
    let val PblObj {meth,origin=(os,_,hdl),...} = get_obj I pt p
neuper@37906
   342
	val {ppc,pre,prls,scr,...} = get_met mI
neuper@37906
   343
	val (model_ok, (pbl, pre)) = 
neuper@38050
   344
	    match_itms_oris (assoc_thy "Isac") meth (ppc,pre,prls) os
neuper@37906
   345
    in (model_ok, mI, scr, pbl, pre) end
neuper@37906
   346
neuper@37906
   347
neuper@37906
   348
(* val (pI, pt, pos as (p,_)) = (pblID, pt, p);
neuper@37906
   349
   *)
neuper@37906
   350
fun tryrefine pI pt (pos as (p,_):pos') =
neuper@37906
   351
    let val PblObj {probl,origin=(os,_,hdl),...} = get_obj I pt p
neuper@38050
   352
    in case refine_pbl (assoc_thy "Isac") pI probl of
neuper@37926
   353
	   NONE => (*copy from context_pbl*)
neuper@37906
   354
	   let val {ppc,where_,prls,...} = get_pbt pI
neuper@38050
   355
	       val (_, (pbl, pre)) = match_itms_oris (assoc_thy "Isac") 
neuper@37906
   356
						     probl (ppc,where_,prls) os
neuper@37906
   357
	   in (false, pI, hdl, pbl, pre) end
neuper@37926
   358
	 | SOME (pI, (pbl, pre)) => 
neuper@37906
   359
	   (true, pI, hdl, pbl, pre) 
neuper@37906
   360
    end;
neuper@37906
   361
neuper@37906
   362
(* val (pt, (pos as (p,p_):pos')) = (pt, ip);
neuper@37906
   363
   *)
neuper@37906
   364
fun detailstep pt (pos as (p,p_):pos') = 
neuper@37906
   365
    let val nd = get_nd pt p
neuper@37906
   366
	val cn = children nd
neuper@37906
   367
    in if null cn 
neuper@37906
   368
       then if (is_rewset o (get_obj g_tac nd)) [(*root of nd*)]
neuper@37906
   369
	    then detailrls pt pos
neuper@37906
   370
	    else ("no-Rewrite_Set...", EmptyPtree, e_pos')
neuper@37906
   371
       else ("donesteps", pt(*, get_formress [] ((lev_on o lev_dn) p) cn*),
neuper@37906
   372
	     (p @ [length (children (get_nd pt p))], Res) ) 
neuper@37906
   373
    end;
neuper@37906
   374
neuper@37906
   375
neuper@37906
   376
neuper@37906
   377
(***. for mathematics authoring on sml-toplevel; no XML .***)
neuper@37906
   378
neuper@37906
   379
type NEW = int list;
neuper@37906
   380
(* val sp = (dI',pI',mI');
neuper@37906
   381
   *)
neuper@37906
   382
neuper@37906
   383
(*15.8.03 for me with loc_specify/solve, nxt_specify/solve
neuper@37906
   384
 delete as soon as TESTg_form -> _mout_ dropped*)
neuper@37906
   385
fun TESTg_form ptp =
neuper@37906
   386
(* val ptp = (pt,p);
neuper@37906
   387
   *) 
neuper@37906
   388
    let val (form,_,_) = pt_extract ptp
neuper@37906
   389
    in case form of
neuper@37906
   390
	   Form t => Form' (FormKF (~1,EdUndef,0,Nundef,term2str t))
neuper@37906
   391
	 | ModSpec (_,p_, head, gfr, pre, _) => 
neuper@37906
   392
	   Form' (PpcKF (0,EdUndef,0,Nundef,
neuper@37906
   393
			 (case p_ of Pbl => Problem[] | Met => Method[],
neuper@38050
   394
			  itms2itemppc (assoc_thy"Isac") gfr pre)))
neuper@37906
   395
    end;
neuper@37906
   396
neuper@37906
   397
(*.create a calc-tree; for use within sml: thus ^^^ NOT decoded to ^;
neuper@37906
   398
   compare "fun CalcTree" which DOES decode.*)
neuper@37906
   399
fun CalcTreeTEST [(fmz, sp):fmz] = 
neuper@37906
   400
(* val [(fmz, sp):fmz] = [(fmz, (dI',pI',mI'))];
neuper@37906
   401
   val [(fmz, sp):fmz] = [([], ("e_domID", ["e_pblID"], ["e_metID"]))];
neuper@37906
   402
   *)
neuper@37906
   403
    let val cs as ((pt,p), tacis) = nxt_specify_init_calc (fmz, sp)
neuper@37906
   404
	val tac = case tacis of [] => Empty_Tac | _ => (#1 o hd) tacis
neuper@37906
   405
	val f = TESTg_form (pt,p)
neuper@37906
   406
    in (p, []:NEW, f, (tac2IDstr tac, tac), Sundef, pt) end; 
neuper@37906
   407
       
neuper@37906
   408
(*for tests > 15.8.03 after separation setnexttactic / nextTac:
neuper@37906
   409
  external view: me should be used by math-authors as done so far
neuper@37906
   410
  internal view: loc_specify/solve, nxt_specify/solve used
neuper@37906
   411
                 i.e. same as in setnexttactic / nextTac*)
neuper@37906
   412
(*ENDE TESTPHASE 08/10.03:
neuper@37906
   413
  NEW loeschen, eigene Version von locatetac, step
neuper@37906
   414
  meNEW, CalcTreeTEST: tac'_ -replace-> tac, remove [](cid) *)
neuper@37906
   415
neuper@37906
   416
(* val ((_,tac), p, _, pt) = (nxt, p, c, pt);
neuper@37906
   417
   *)
neuper@37906
   418
fun me ((_,tac):tac'_) (p:pos') (_:NEW(*remove*)) (pt:ptree) =
neuper@41972
   419
  let 
neuper@41972
   420
    val (pt, p) = 
neuper@41972
   421
	    (*locatetac is here for testing by me; step would suffice in me*)
neuper@37906
   422
	    case locatetac tac (pt,p) of
neuper@41972
   423
		    ("ok", (_, _, ptp))  => ptp
neuper@41972
   424
	    | ("unsafe-ok", (_, _, ptp)) => ptp
neuper@41972
   425
	    | ("not-applicable",_) => (pt, p)
neuper@41972
   426
	    | ("end-of-calculation", (_, _, ptp)) => ptp
neuper@41972
   427
	    | ("failure",_) => error "sys-error";
neuper@41972
   428
	  val (_, ts) = (*WN101102 NOT tested, if step would create _same_ ptp*)
neuper@37906
   429
	    (case step p ((pt, e_pos'),[]) of
neuper@41972
   430
		    ("ok", (ts as (tac,_,_)::_, _, _)) => ("",ts)
neuper@41972
   431
	    | ("helpless",_) => ("helpless: cannot propose tac", [])
neuper@41972
   432
	    | ("no-fmz-spec",_) => error "no-fmz-spec"
neuper@41972
   433
	    | ("end-of-calculation", (ts, _, _)) => ("",ts))
neuper@38031
   434
	    handle _ => error "sys-error";
neuper@41972
   435
	  val tac = 
neuper@41972
   436
      case ts of 
neuper@41972
   437
        tacis as (_::_) => let val (tac,_,_) = last_elem tacis in tac end 
neuper@41972
   438
		  | _ => if p = ([],Res) then End_Proof' else Empty_Tac;
neuper@37906
   439
      (*form output comes from locatetac*)
neuper@41972
   440
  in (p:pos', []:NEW, TESTg_form (pt, p), 
neuper@41972
   441
	   (tac2IDstr tac, tac):tac'_, Sundef, pt) end;
neuper@37906
   442
neuper@37906
   443
(*for quick test-print-out, until 'type inout' is removed*)
neuper@37906
   444
fun f2str (Form' (FormKF (_, _, _, _, cterm'))) = cterm';
neuper@37906
   445
neuper@37906
   446
neuper@37906
   447
neuper@37906
   448
(*------------------------------------------------------------------(**)
neuper@37906
   449
end
neuper@37906
   450
open MathEngine;
neuper@37906
   451
(**)------------------------------------------------------------------*)
neuper@37906
   452