src/Tools/isac/Interpret/mathengine.sml
author Walther Neuper <neuper@ist.tugraz.at>
Tue, 28 Sep 2010 09:06:56 +0200
branchisac-update-Isa09-2
changeset 38031 460c24a6a6ba
parent 38015 67ba02dffacc
child 38050 4c52ad406c20
permissions -rw-r--r--
tuned error and writeln

# raise error --> error
# writeln in atomtyp, atomty, atomt and xmlsrc
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
(* val ptp as (pt, p) = (pt, p);
neuper@37906
   115
   val ptp as (pt, p) = (pt, ip);
neuper@37906
   116
   *)
neuper@37906
   117
  | locatetac tac (ptp as (pt, p)) =
neuper@37906
   118
    let val (mI,m) = mk_tac'_ tac;
neuper@37906
   119
    in case applicable_in p pt m of
neuper@37906
   120
	   Notappl e => ("not-applicable", ([],[],  ptp):calcstate')
neuper@37906
   121
	 | Appl m =>
neuper@37906
   122
(* val Appl m = applicable_in p pt m;
neuper@37906
   123
    *) 
neuper@37935
   124
	   let val x = if member op = specsteps mI
neuper@37906
   125
		       then loc_specify_ m ptp else loc_solve_ (mI,m) ptp
neuper@37906
   126
	   in case x of 
neuper@37906
   127
		  ERror e => ("failure", ([], [], ptp))
neuper@37906
   128
		(*FIXXXXXME: loc_specify_, loc_solve_ TOGETHER with dropping meOLD+detail.sml*)
neuper@37906
   129
		| UNsafe cs' => ("unsafe-ok", cs')
neuper@37906
   130
		| Updated (cs' as (_,_,(_,p'))) =>
neuper@37906
   131
		  (*ev.SEVER.tacs like Begin_Trans*)
neuper@37906
   132
		  (if p' = ([],Res) then "end-of-calculation" else "ok", 
neuper@37906
   133
		   cs')(*for -"-  user to ask ? *)
neuper@37906
   134
	   end
neuper@37906
   135
    end;
neuper@37906
   136
neuper@37906
   137
neuper@37906
   138
(*------------------------------------------------------------------
neuper@37906
   139
fun init_detail ptp = e_calcstate;(*15.8.03.MISSING-->solve.sml!?*)
neuper@37906
   140
(*----------------------------------------------------from solve.sml*)
neuper@37906
   141
  | nxt_solv (Detail_Set'(thy', rls, t)) (pt, p) =
neuper@37906
   142
    let (*val rls = the (assoc(!ruleset',rls'))
neuper@38031
   143
	    handle _ => error ("solve: '"^rls'^"' not known");*)
neuper@37906
   144
	val thy = assoc_thy thy';
neuper@37906
   145
        val (srls, sc, is) = 
neuper@37906
   146
	    case rls of
neuper@37906
   147
		Rrls {scr=sc as Rfuns {init_state=ii,...},...} => 
neuper@37906
   148
		(e_rls, sc, RrlsState (ii t))
neuper@37906
   149
	      | Rls {srls=srls,scr=sc as Script s,...} => 
neuper@37906
   150
		(srls, sc, ScrState ([(one_scr_arg s,t)], [], 
neuper@37926
   151
			       NONE, e_term, Sundef, true));
neuper@37906
   152
	val pt = update_tac pt (fst p) (Detail_Set (id_rls rls));
neuper@37906
   153
	val (p,cid,_,pt) = generate1 thy (Begin_Trans' t) is p pt;
neuper@37906
   154
	val nx = (tac_2tac o fst3) (next_tac (thy',srls) (pt,p) sc is);
neuper@37906
   155
	val aopt = applicable_in p pt nx;
neuper@37906
   156
    in case aopt of
neuper@38031
   157
	   Notappl s => error ("solve Detail_Set: "^s)
neuper@37906
   158
	 (* val Appl m = aopt;
neuper@37906
   159
	    *)
neuper@37906
   160
	 | Appl m => solve ("discardFIXME",m) p pt end
neuper@37906
   161
------------------------------------------------------------------*)
neuper@37906
   162
neuper@37906
   163
neuper@37906
   164
(*iterated by nxt_me; there (the resulting) ptp dropped
neuper@37906
   165
  may call nxt_solve Apply_Method --- thus evaluated here after solve.sml*)
neuper@37906
   166
(* val (ptp as (pt, pos as (p,p_))) = ptp;
neuper@37906
   167
   val (ptp as (pt, pos as (p,p_))) = (pt,ip);
neuper@37906
   168
   *)
neuper@37906
   169
fun nxt_specify_ (ptp as (pt, pos as (p,p_))) =
neuper@37906
   170
    let val pblobj as (PblObj{meth,origin=origin as (oris,(dI',pI',mI'),_),
neuper@37906
   171
			      probl,spec=(dI,pI,mI),...}) = get_obj I pt p;
neuper@37906
   172
    in if just_created_ pblobj (*by Subproblem*) andalso origin <> e_origin
neuper@37906
   173
       then case mI' of
neuper@37939
   174
	 ["no_met"] => nxt_specif (Refine_Tacitly pI') (pt, (p, Pbl))
neuper@37906
   175
       | _ => nxt_specif Model_Problem (pt, (p,Pbl))
neuper@37906
   176
       else let val cpI = if pI = e_pblID then pI' else pI;
neuper@37906
   177
		val cmI = if mI = e_metID then mI' else mI;
neuper@37906
   178
		val {ppc,prls,where_,...} = get_pbt cpI;
neuper@37939
   179
		val pre = check_preconds "thy 100820" prls where_ probl;
neuper@37906
   180
		val pb = foldl and_ (true, map fst pre);
neuper@37906
   181
		(*FIXME.WN0308:    ~~~~~: just check true in itms of pbl/met?*)
neuper@37906
   182
		val (_,tac) =
neuper@37939
   183
		    nxt_spec p_ pb oris (dI',pI',mI') (probl, meth) 
neuper@37939
   184
			     (ppc, (#ppc o get_met) cmI) (dI, pI, mI);
neuper@37906
   185
	    in case tac of
neuper@37906
   186
		   Apply_Method mI => 
neuper@37906
   187
(* val Apply_Method mI = tac;
neuper@37906
   188
   *)
neuper@37926
   189
		   nxt_solv (Apply_Method' (mI, NONE, e_istate)) e_istate ptp
neuper@37906
   190
		 | _ => nxt_specif tac ptp end
neuper@37906
   191
    end;
neuper@37906
   192
neuper@37906
   193
neuper@37906
   194
(*.specify a new method;
neuper@37906
   195
   WN0512 impl.incomplete, see 'nxt_specif (Specify_Method ' .*)
neuper@37906
   196
fun set_method (mI:metID) ptp =
neuper@37906
   197
    let val ([(_, Specify_Method' (_, _, mits), _)], [], (pt, pos as (p,_))) = 
neuper@37906
   198
	    nxt_specif (Specify_Method mI) ptp
neuper@37906
   199
	val pre = []        (*...from Specify_Method'*)
neuper@37906
   200
	val complete = true (*...from Specify_Method'*)
neuper@37906
   201
	(*from Specify_Method'  ? vvv,  vvv ?*)
neuper@37906
   202
	val PblObj {origin = (_,_,hdf), spec,...} = get_obj I pt p
neuper@37906
   203
    in (pt, (complete, Met, hdf, mits, pre, spec):ocalhd) end;
neuper@37906
   204
neuper@37906
   205
(* val ([(_, Specify_Method' (_, _, mits), _)], [],_) = 
neuper@37906
   206
    nxt_specif (Specify_Method mI) ptp;
neuper@37906
   207
 *)
neuper@37906
   208
neuper@37906
   209
(*.specify a new problem;
neuper@37906
   210
   WN0512 impl.incomplete, see 'nxt_specif (Specify_Problem ' .*)
neuper@37906
   211
(* val (pI, ptp) = (pI, (pt, ip));
neuper@37906
   212
   *)
neuper@37906
   213
fun set_problem pI (ptp: ptree * pos') =
neuper@37906
   214
    let val ([(_, Specify_Problem' (_, (complete, (pits, pre))),_)],
neuper@37906
   215
	     _, (pt, pos as (p,_))) = nxt_specif (Specify_Problem pI) ptp
neuper@37906
   216
	(*from Specify_Problem' ? vvv,  vvv ?*)
neuper@37906
   217
	val PblObj {origin = (_,_,hdf), spec,...} = get_obj I pt p
neuper@37906
   218
    in (pt, (complete, Pbl, hdf, pits, pre, spec):ocalhd) end;
neuper@37906
   219
neuper@37906
   220
fun set_theory (tI:thyID) (ptp: ptree * pos') =
neuper@37906
   221
    let val ([(_, Specify_Problem' (_, (complete, (pits, pre))),_)],
neuper@37906
   222
	     _, (pt, pos as (p,_))) = nxt_specif (Specify_Theory tI) ptp
neuper@37906
   223
	(*from Specify_Theory'  ? vvv,  vvv ?*)
neuper@37906
   224
	val PblObj {origin = (_,_,hdf), spec,...} = get_obj I pt p
neuper@37906
   225
    in (pt, (complete, Pbl, hdf, pits, pre, spec):ocalhd) end;
neuper@37906
   226
neuper@37906
   227
(*.does a step forward; returns tactic used, ctree updated.
neuper@37906
   228
TODO.WN0512 redesign after specify-phase became more separated from solve-phase
neuper@37906
   229
arg ip: 
neuper@37906
   230
    calcstate
neuper@37906
   231
.*)
neuper@37906
   232
(* val (ip as (_,p_), (ptp as (pt,p), tacis)) = (get_pos 1 1, get_calc 1);
neuper@37906
   233
   val (ip as (_,p_), (ptp as (pt,p), tacis)) = (pos, cs);
neuper@37906
   234
   val (ip as (_,p_), (ptp as (pt,p), tacis)) = (p, ((pt, e_pos'),[]));
neuper@37906
   235
   val (ip as (_,p_), (ptp as (pt,p), tacis)) = (ip,cs);
neuper@37906
   236
   *)
neuper@37906
   237
fun step ((ip as (_,p_)):pos') ((ptp as (pt,p), tacis):calcstate) =
neuper@37906
   238
    let val pIopt = get_pblID (pt,ip);
neuper@37906
   239
    in if (*p = ([],Res) orelse*) ip = ([],Res)
neuper@37906
   240
       then ("end-of-calculation",(tacis, [], ptp):calcstate') else
neuper@37906
   241
       case tacis of
neuper@37906
   242
	   (_::_) =>
neuper@37906
   243
(* val((tac,_,_)::_) = tacis;
neuper@37906
   244
   *) 
neuper@37906
   245
	   if ip = p (*the request is done where ptp waits for*)
neuper@37906
   246
	   then let val (pt',c',p') = generate tacis (pt,[],p)
neuper@37906
   247
		in ("ok", (tacis, c', (pt', p'))) end
neuper@37935
   248
	   else (case (if member op = [Pbl,Met] p_
neuper@37906
   249
		       then nxt_specify_ (pt,ip) else nxt_solve_ (pt,ip))
neuper@37906
   250
		      handle _ => ([],[],ptp)(*e.g.by Add_Given "equality///"*)
neuper@37906
   251
		  of cs as ([],_,_) => ("helpless", cs)
neuper@37906
   252
		   | cs => ("ok", cs))
neuper@37906
   253
(* val [] = tacis;
neuper@37906
   254
   *) 
neuper@37906
   255
	 | _ => (case pIopt of
neuper@37926
   256
		     NONE => ("no-fmz-spec", ([], [], ptp))
neuper@37926
   257
		   | SOME pI =>
neuper@37926
   258
(* val SOME pI = pIopt; 
neuper@37935
   259
   val cs=(if member op = [Pbl,Met] p_ andalso is_none(get_obj g_env pt (fst p))
neuper@37906
   260
	     then nxt_specify_ (pt,ip) else nxt_solve_ (pt,ip))
neuper@37906
   261
       handle _ => ([], ptp);
neuper@37906
   262
   *)
neuper@37935
   263
		     (case (if member op = [Pbl,Met] p_
neuper@37906
   264
			       andalso is_none (get_obj g_env pt (fst p))
neuper@37906
   265
			    (*^^^^^^^^: Apply_Method without init_form*)
neuper@37906
   266
			    then nxt_specify_ (pt,ip) else nxt_solve_ (pt,ip) )
neuper@37906
   267
			   handle _ => ([],[],ptp)(*e.g.by Add_Giv"equality/"*)
neuper@37906
   268
		       of cs as ([],_,_) =>("helpless", cs)(*FIXXMEdel.handle*)
neuper@37906
   269
			| cs => ("ok", cs)))
neuper@37906
   270
    end;
neuper@37906
   271
neuper@37906
   272
(*  (nxt_solve_ (pt,ip)) handle e => print_exn e ;
neuper@37906
   273
neuper@37906
   274
   *)
neuper@37906
   275
neuper@37906
   276
neuper@37906
   277
neuper@37906
   278
neuper@37906
   279
(*.does several steps within one calculation as given by "type auto";
neuper@37906
   280
   the steps may arbitrarily go into and leave different phases, 
neuper@37906
   281
   i.e. specify-phase and solve-phase.*)
neuper@37906
   282
(*TODO.WN0512 ? redesign after the phases have been more separated
neuper@37906
   283
  at the fron-end in 05: 
neuper@37906
   284
  eg. CompleteCalcHead could be done by a separate fun !!!*)
neuper@37906
   285
(* val (ip, cs as (ptp as (pt,p),tacis)) = (get_pos cI 1, get_calc cI);
neuper@37906
   286
   val (ip, cs as (ptp as (pt,p),tacis)) = (pold, get_calc cI);
neuper@37906
   287
   val (c, ip, cs as (ptp as (_,p),tacis), Step s) = 
neuper@37906
   288
       ([]:pos' list, pold, get_calc cI, auto);
neuper@37906
   289
   *) 
neuper@37906
   290
fun autocalc c ip (cs as (ptp as (_,p),tacis)) (Step s) =
neuper@37906
   291
    if s <= 1
neuper@37906
   292
    then let val (str, (_, c', ptp)) = step ip cs;(*1*)
neuper@37906
   293
	 (*at least does 1 step, ev.1 too much*)
neuper@37906
   294
	 in (str, c@c', ptp) end
neuper@37906
   295
    else let val (str, (_, c', ptp as (_, p))) = step ip cs;
neuper@37906
   296
	 in if str = "ok" 
neuper@37906
   297
	    then autocalc (c@c') p (ptp,[]) (Step (s-1))
neuper@37906
   298
	    else (str, c@c', ptp) end
neuper@37906
   299
(*handles autoord <= 3, autoord > 3 handled by all_/complete_solve*)
neuper@37906
   300
  | autocalc c (pos as (_,p_)) ((pt,_), _(*tacis would help 1x in solve*))auto=
neuper@37906
   301
(* val (c:pos' list, (pos as (_,p_)),((pt,_),_),auto) = 
neuper@37906
   302
      ([], pold, get_calc cI, auto);
neuper@37906
   303
   *)
neuper@37906
   304
     if autoord auto > 3 andalso just_created (pt, pos)
neuper@37906
   305
     then let val ptp = all_modspec (pt, pos);
neuper@37906
   306
	  in all_solve auto c ptp end
neuper@37906
   307
     else
neuper@37939
   308
	 if member op = [Pbl, Met] p_
neuper@37939
   309
 	 then if not (is_complete_mod (pt, pos))
neuper@37906
   310
	      then let val ptp = complete_mod (pt, pos)
neuper@37906
   311
		   in if autoord auto < 3 then ("ok", c, ptp)
neuper@37906
   312
		      else 
neuper@37906
   313
			  if not (is_complete_spec ptp)
neuper@37906
   314
			  then let val ptp = complete_spec ptp
neuper@37906
   315
			       in if autoord auto = 3 then ("ok", c, ptp)
neuper@37906
   316
				  else all_solve auto c ptp
neuper@37906
   317
			       end
neuper@37906
   318
			  else if autoord auto = 3 then ("ok", c, ptp)
neuper@37906
   319
			  else all_solve auto c ptp 
neuper@37906
   320
		   end
neuper@37906
   321
	      else 
neuper@37906
   322
		  if not (is_complete_spec (pt,pos))
neuper@37906
   323
		  then let val ptp = complete_spec (pt, pos)
neuper@37906
   324
		       in if autoord auto = 3 then ("ok", c, ptp)
neuper@37906
   325
			  else all_solve auto c ptp
neuper@37906
   326
		       end
neuper@37906
   327
		  else if autoord auto = 3 then ("ok", c, (pt, pos))
neuper@37906
   328
		  else all_solve auto c (pt, pos)
neuper@37906
   329
	 else complete_solve auto c (pt, pos);
neuper@37906
   330
(* val pbl = get_obj g_pbl (fst ptp) [];
neuper@37906
   331
   val (oris,_,_) = get_obj g_origin (fst ptp) [];
neuper@37906
   332
*)    
neuper@37906
   333
neuper@37906
   334
neuper@37906
   335
neuper@37906
   336
neuper@37906
   337
neuper@37906
   338
(*.initialiye matching; before 'tryMatch' get the pblID to match with:
neuper@37906
   339
   if no pbl has been specified, take the init from origin.*)
neuper@37906
   340
(*fun initmatch pt (pos as (p,_):pos') =
neuper@37906
   341
    let val PblObj {probl,origin=(os,(_,pI,_),_),spec=(dI',pI',mI'),...} = 
neuper@37906
   342
	    get_obj I pt p
neuper@37906
   343
	val pblID = if pI' = e_pblID 
neuper@37906
   344
		    then (*TODO.WN051125 (#init o get_pbt) pI          <<<*) 
neuper@37906
   345
			takelast (2, pI) (*FIXME.WN051125 a hack, impl.^^^*)
neuper@37906
   346
		    else pI'
neuper@37906
   347
	val spec = (dI',pblID,mI')
neuper@37906
   348
	val {ppc,where_,prls,...} = get_pbt pblID
neuper@37906
   349
	val (model_ok, (pbl, pre)) = 
neuper@37906
   350
	    match_itms_oris (assoc_thy "Isac.thy") probl (ppc,where_,prls) os
neuper@37906
   351
    in ModSpec (ocalhd_complete pbl pre spec,
neuper@37906
   352
		Pbl, e_term, pbl, pre, spec) end;*)
neuper@37906
   353
fun initcontext_pbl pt (pos as (p,_):pos') =
neuper@37906
   354
    let val PblObj {probl,origin=(os,(_,pI,_),hdl),spec=(dI',pI',mI'),...} = 
neuper@37906
   355
	    get_obj I pt p
neuper@37906
   356
	val pblID = if pI' = e_pblID 
neuper@37906
   357
		    then (*TODO.WN051125 (#init o get_pbt) pI          <<<*) 
neuper@37906
   358
			takelast (2, pI) (*FIXME.WN051125 a hack, impl.^^^*)
neuper@37906
   359
		    else pI'
neuper@37906
   360
	val {ppc,where_,prls,...} = get_pbt pblID
neuper@37906
   361
	val (model_ok, (pbl, pre)) = 
neuper@37906
   362
	    match_itms_oris (assoc_thy "Isac.thy") probl (ppc,where_,prls) os
neuper@37906
   363
    in (model_ok, pblID, hdl, pbl, pre) end;
neuper@37906
   364
neuper@37906
   365
fun initcontext_met pt (pos as (p,_):pos') =
neuper@37906
   366
    let val PblObj {meth,origin=(os,(_,_,mI), _),spec=(_, _, mI'),...} = 
neuper@37906
   367
	    get_obj I pt p
neuper@37906
   368
	val metID = if mI' = e_metID 
neuper@37906
   369
		    then (*TODO.WN051125 (#init o get_pbt) pI          <<<*) 
neuper@37906
   370
			takelast (2, mI) (*FIXME.WN051125 a hack, impl.^^^*)
neuper@37906
   371
		    else mI'
neuper@37906
   372
	val {ppc,pre,prls,scr,...} = get_met metID
neuper@37906
   373
	val (model_ok, (pbl, pre)) = 
neuper@37906
   374
	    match_itms_oris (assoc_thy "Isac.thy") meth (ppc,pre,prls) os
neuper@37906
   375
    in (model_ok, metID, scr, pbl, pre) end;
neuper@37906
   376
neuper@37906
   377
(*.match the model of a problem at pos p 
neuper@37906
   378
   with the model-pattern of the problem with pblID*)
neuper@37906
   379
fun context_pbl pI pt (p:pos) =
neuper@37906
   380
    let val PblObj {probl,origin=(os,_,hdl),...} = get_obj I pt p
neuper@37906
   381
	val {ppc,where_,prls,...} = get_pbt pI
neuper@37906
   382
	val (model_ok, (pbl, pre)) = 
neuper@37906
   383
	    match_itms_oris (assoc_thy "Isac.thy") probl (ppc,where_,prls) os
neuper@37906
   384
    in (model_ok, pI, hdl, pbl, pre) end;
neuper@37906
   385
neuper@37906
   386
fun context_met mI pt (p:pos) =
neuper@37906
   387
    let val PblObj {meth,origin=(os,_,hdl),...} = get_obj I pt p
neuper@37906
   388
	val {ppc,pre,prls,scr,...} = get_met mI
neuper@37906
   389
	val (model_ok, (pbl, pre)) = 
neuper@37906
   390
	    match_itms_oris (assoc_thy "Isac.thy") meth (ppc,pre,prls) os
neuper@37906
   391
    in (model_ok, mI, scr, pbl, pre) end
neuper@37906
   392
neuper@37906
   393
neuper@37906
   394
(* val (pI, pt, pos as (p,_)) = (pblID, pt, p);
neuper@37906
   395
   *)
neuper@37906
   396
fun tryrefine pI pt (pos as (p,_):pos') =
neuper@37906
   397
    let val PblObj {probl,origin=(os,_,hdl),...} = get_obj I pt p
neuper@37906
   398
    in case refine_pbl (assoc_thy "Isac.thy") pI probl of
neuper@37926
   399
	   NONE => (*copy from context_pbl*)
neuper@37906
   400
	   let val {ppc,where_,prls,...} = get_pbt pI
neuper@37906
   401
	       val (_, (pbl, pre)) = match_itms_oris (assoc_thy "Isac.thy") 
neuper@37906
   402
						     probl (ppc,where_,prls) os
neuper@37906
   403
	   in (false, pI, hdl, pbl, pre) end
neuper@37926
   404
	 | SOME (pI, (pbl, pre)) => 
neuper@37906
   405
	   (true, pI, hdl, pbl, pre) 
neuper@37906
   406
    end;
neuper@37906
   407
neuper@37906
   408
(* val (pt, (pos as (p,p_):pos')) = (pt, ip);
neuper@37906
   409
   *)
neuper@37906
   410
fun detailstep pt (pos as (p,p_):pos') = 
neuper@37906
   411
    let val nd = get_nd pt p
neuper@37906
   412
	val cn = children nd
neuper@37906
   413
    in if null cn 
neuper@37906
   414
       then if (is_rewset o (get_obj g_tac nd)) [(*root of nd*)]
neuper@37906
   415
	    then detailrls pt pos
neuper@37906
   416
	    else ("no-Rewrite_Set...", EmptyPtree, e_pos')
neuper@37906
   417
       else ("donesteps", pt(*, get_formress [] ((lev_on o lev_dn) p) cn*),
neuper@37906
   418
	     (p @ [length (children (get_nd pt p))], Res) ) 
neuper@37906
   419
    end;
neuper@37906
   420
neuper@37906
   421
neuper@37906
   422
neuper@37906
   423
(***. for mathematics authoring on sml-toplevel; no XML .***)
neuper@37906
   424
neuper@37906
   425
type NEW = int list;
neuper@37906
   426
(* val sp = (dI',pI',mI');
neuper@37906
   427
   *)
neuper@37906
   428
neuper@37906
   429
(*15.8.03 for me with loc_specify/solve, nxt_specify/solve
neuper@37906
   430
 delete as soon as TESTg_form -> _mout_ dropped*)
neuper@37906
   431
fun TESTg_form ptp =
neuper@37906
   432
(* val ptp = (pt,p);
neuper@37906
   433
   *) 
neuper@37906
   434
    let val (form,_,_) = pt_extract ptp
neuper@37906
   435
    in case form of
neuper@37906
   436
	   Form t => Form' (FormKF (~1,EdUndef,0,Nundef,term2str t))
neuper@37906
   437
	 | ModSpec (_,p_, head, gfr, pre, _) => 
neuper@37906
   438
	   Form' (PpcKF (0,EdUndef,0,Nundef,
neuper@37906
   439
			 (case p_ of Pbl => Problem[] | Met => Method[],
neuper@37906
   440
			  itms2itemppc (assoc_thy"Isac.thy") gfr pre)))
neuper@37906
   441
    end;
neuper@37906
   442
neuper@37906
   443
(*.create a calc-tree; for use within sml: thus ^^^ NOT decoded to ^;
neuper@37906
   444
   compare "fun CalcTree" which DOES decode.*)
neuper@37906
   445
fun CalcTreeTEST [(fmz, sp):fmz] = 
neuper@37906
   446
(* val [(fmz, sp):fmz] = [(fmz, (dI',pI',mI'))];
neuper@37906
   447
   val [(fmz, sp):fmz] = [([], ("e_domID", ["e_pblID"], ["e_metID"]))];
neuper@37906
   448
   *)
neuper@37906
   449
    let val cs as ((pt,p), tacis) = nxt_specify_init_calc (fmz, sp)
neuper@37906
   450
	val tac = case tacis of [] => Empty_Tac | _ => (#1 o hd) tacis
neuper@37906
   451
	val f = TESTg_form (pt,p)
neuper@37906
   452
    in (p, []:NEW, f, (tac2IDstr tac, tac), Sundef, pt) end; 
neuper@37906
   453
       
neuper@37906
   454
(*for tests > 15.8.03 after separation setnexttactic / nextTac:
neuper@37906
   455
  external view: me should be used by math-authors as done so far
neuper@37906
   456
  internal view: loc_specify/solve, nxt_specify/solve used
neuper@37906
   457
                 i.e. same as in setnexttactic / nextTac*)
neuper@37906
   458
(*ENDE TESTPHASE 08/10.03:
neuper@37906
   459
  NEW loeschen, eigene Version von locatetac, step
neuper@37906
   460
  meNEW, CalcTreeTEST: tac'_ -replace-> tac, remove [](cid) *)
neuper@37906
   461
neuper@37906
   462
(* val ((_,tac), p, _, pt) = (nxt, p, c, pt);
neuper@37906
   463
   *)
neuper@37906
   464
fun me ((_,tac):tac'_) (p:pos') (_:NEW(*remove*)) (pt:ptree) =
neuper@37906
   465
    let val (pt, p) = 
neuper@37906
   466
(* val (msg, (tacis, pos's, (pt',p'))) = locatetac tac (pt,p);
neuper@37906
   467
   p = ([1, 9], Res);
neuper@38015
   468
   (tracing o istate2str) (get_istate pt p);
neuper@37906
   469
   *)
neuper@37906
   470
	      (*locatetac is here for testing by me; step would suffice in me*)
neuper@37906
   471
	    case locatetac tac (pt,p) of
neuper@37906
   472
		("ok", (_, _, ptp))  => ptp
neuper@37906
   473
	      | ("unsafe-ok", (_, _, ptp)) => ptp
neuper@37906
   474
	      | ("not-applicable",_) => (pt, p)
neuper@37906
   475
	      | ("end-of-calculation", (_, _, ptp)) => ptp
neuper@38031
   476
	      | ("failure",_) => error "sys-error";
neuper@37906
   477
	val (_, ts) = 
neuper@37906
   478
(* val (eee, (ts, _, (pt'',_))) = step p ((pt, e_pos'),[]);
neuper@37906
   479
   *)
neuper@37906
   480
	    (case step p ((pt, e_pos'),[]) of
neuper@37906
   481
		 ("ok", (ts as (tac,_,_)::_, _, _)) => ("",ts)
neuper@37906
   482
	       | ("helpless",_) => ("helpless: cannot propose tac", [])
neuper@38031
   483
	       | ("no-fmz-spec",_) => error "no-fmz-spec"
neuper@37906
   484
	       | ("end-of-calculation", (ts, _, _)) => ("",ts))
neuper@38031
   485
	    handle _ => error "sys-error";
neuper@37906
   486
	val tac = case ts of tacis as (_::_) =>
neuper@37906
   487
(* val tacis as (_::_) = ts;
neuper@37906
   488
   *)
neuper@37906
   489
			     let val (tac,_,_) = last_elem tacis
neuper@37906
   490
			     in tac end 
neuper@37906
   491
			   | _ => if p = ([],Res) then End_Proof'
neuper@37906
   492
				  else Empty_Tac;
neuper@37906
   493
      (*form output comes from locatetac*)
neuper@37906
   494
    in(p:pos',[]:NEW, TESTg_form (pt, p), 
neuper@37906
   495
	(tac2IDstr tac, tac):tac'_, Sundef, pt)  end;
neuper@37906
   496
neuper@37906
   497
(*for quick test-print-out, until 'type inout' is removed*)
neuper@37906
   498
fun f2str (Form' (FormKF (_, _, _, _, cterm'))) = cterm';
neuper@37906
   499
neuper@37906
   500
neuper@37906
   501
neuper@37906
   502
(*------------------------------------------------------------------(**)
neuper@37906
   503
end
neuper@37906
   504
open MathEngine;
neuper@37906
   505
(**)------------------------------------------------------------------*)
neuper@37906
   506