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