src/sml/ME/solve.sml
author wneuper
Fri, 02 Jun 2006 18:20:21 +0200
branchstart_Take
changeset 542 12d6b74007a9
parent 535 02c72e35ea98
child 543 de1f810f89db
permissions -rw-r--r--
for interSteps added to ruleset' and corrected fun lev_pred'
wneuper@339
     1
(* solve an example by interpreting a method's script
wneuper@339
     2
   (c) Walther Neuper 1999
wneuper@339
     3
wneuper@470
     4
use"ME/solve.sml";
wneuper@470
     5
use"solve.sml";
wneuper@339
     6
*)
wneuper@339
     7
wneuper@339
     8
fun safe (ScrState (_,_,_,_,s,_)) = s
wneuper@339
     9
  | safe (RrlsState _) = Safe;
wneuper@339
    10
wneuper@339
    11
type mstID = string;
wneuper@339
    12
type tac'_ = mstID * tac; (*DG <-> ME*)
wneuper@339
    13
val e_tac'_ = ("Empty_Tac", Empty_Tac):tac'_;
wneuper@339
    14
wneuper@339
    15
fun mk_tac'_   m = case m of
wneuper@339
    16
  Init_Proof (ppc, spec)    => ("Init_Proof", Init_Proof (ppc, spec )) 
wneuper@515
    17
| Model_Problem             => ("Model_Problem", Model_Problem)
wneuper@339
    18
| Refine_Tacitly pblID      => ("Refine_Tacitly", Refine_Tacitly pblID)
wneuper@339
    19
| Refine_Problem pblID      => ("Refine_Problem", Refine_Problem pblID)
wneuper@339
    20
| Add_Given cterm'          => ("Add_Given", Add_Given cterm') 
wneuper@339
    21
| Del_Given cterm'          => ("Del_Given", Del_Given cterm') 
wneuper@339
    22
| Add_Find cterm'           => ("Add_Find", Add_Find cterm') 
wneuper@339
    23
| Del_Find cterm'           => ("Del_Find", Del_Find cterm') 
wneuper@339
    24
| Add_Relation cterm'       => ("Add_Relation", Add_Relation cterm') 
wneuper@339
    25
| Del_Relation cterm'       => ("Del_Relation", Del_Relation cterm') 
wneuper@339
    26
wneuper@339
    27
| Specify_Theory domID	    => ("Specify_Theory", Specify_Theory domID) 
wneuper@339
    28
| Specify_Problem pblID     => ("Specify_Problem", Specify_Problem pblID)
wneuper@339
    29
| Specify_Method metID	    => ("Specify_Method", Specify_Method metID) 
wneuper@339
    30
| Apply_Method metID	    => ("Apply_Method", Apply_Method metID) 
wneuper@339
    31
| Check_Postcond pblID	    => ("Check_Postcond", Check_Postcond pblID)
wneuper@339
    32
| Free_Solve                => ("Free_Solve",Free_Solve)
wneuper@339
    33
		    
wneuper@339
    34
| Rewrite_Inst (subs, thm') => ("Rewrite_Inst", Rewrite_Inst (subs, thm')) 
wneuper@339
    35
| Rewrite thm'		    => ("Rewrite", Rewrite thm') 
wneuper@339
    36
| Rewrite_Asm thm'	    => ("Rewrite_Asm", Rewrite_Asm thm') 
wneuper@339
    37
| Rewrite_Set_Inst (subs, rls')
wneuper@339
    38
               => ("Rewrite_Set_Inst", Rewrite_Set_Inst (subs, rls')) 
wneuper@339
    39
| Rewrite_Set rls'          => ("Rewrite_Set", Rewrite_Set rls') 
wneuper@339
    40
| End_Ruleset		    => ("End_Ruleset", End_Ruleset)
wneuper@339
    41
wneuper@339
    42
| End_Detail                => ("End_Detail", End_Detail)
wneuper@339
    43
| Detail_Set rls'           => ("Detail_Set", Detail_Set rls')
wneuper@339
    44
| Detail_Set_Inst (s, rls') => ("Detail_Set_Inst", Detail_Set_Inst (s, rls'))
wneuper@339
    45
wneuper@339
    46
| Calculate op_             => ("Calculate", Calculate op_)
wneuper@381
    47
| Substitute sube           => ("Substitute", Substitute sube) 
wneuper@339
    48
| Apply_Assumption cts'	    => ("Apply_Assumption", Apply_Assumption cts')
wneuper@339
    49
wneuper@339
    50
| Take cterm'               => ("Take", Take cterm') 
wneuper@339
    51
| Take_Inst cterm'          => ("Take_Inst", Take_Inst cterm') 
wneuper@339
    52
| Group (con, ints) 	    => ("Group", Group (con, ints)) 
wneuper@339
    53
| Subproblem (domID, pblID) => ("Subproblem", Subproblem (domID, pblID)) 
wneuper@339
    54
(*
wneuper@339
    55
| Subproblem_Full(spec,cts')=> ("Subproblem_Full", Subproblem_Full(spec,cts')) 
wneuper@339
    56
*)
wneuper@339
    57
| End_Subproblem            => ("End_Subproblem",End_Subproblem)
wneuper@339
    58
| CAScmd cterm'		    => ("CAScmd", CAScmd cterm')
wneuper@339
    59
			    
wneuper@339
    60
| Split_And                 => ("Split_And", Split_And) 
wneuper@339
    61
| Conclude_And		    => ("Conclude_And", Conclude_And) 
wneuper@339
    62
| Split_Or                  => ("Split_Or", Split_Or) 
wneuper@339
    63
| Conclude_Or		    => ("Conclude_Or", Conclude_Or) 
wneuper@339
    64
| Begin_Trans               => ("Begin_Trans", Begin_Trans) 
wneuper@339
    65
| End_Trans		    => ("End_Trans", End_Trans) 
wneuper@339
    66
| Begin_Sequ                => ("Begin_Sequ", Begin_Sequ) 
wneuper@339
    67
| End_Sequ                  => ("End_Sequ", Begin_Sequ) 
wneuper@339
    68
| Split_Intersect           => ("Split_Intersect", Split_Intersect) 
wneuper@339
    69
| End_Intersect		    => ("End_Intersect", End_Intersect) 
wneuper@339
    70
| Check_elementwise cterm'  => ("Check_elementwise", Check_elementwise cterm')
wneuper@339
    71
| Or_to_List                => ("Or_to_List", Or_to_List) 
wneuper@339
    72
| Collect_Trues	            => ("Collect_Results", Collect_Trues) 
wneuper@339
    73
			    
wneuper@339
    74
| Empty_Tac               => ("Empty_Tac",Empty_Tac)
wneuper@339
    75
| Tac string              => ("Tac",Tac string)
wneuper@339
    76
| User                      => ("User",User)
wneuper@339
    77
| End_Proof'                => ("End_Proof'",End_Proof'); 
wneuper@339
    78
wneuper@339
    79
(*Detail*)
wneuper@339
    80
val empty_tac'_ = (mk_tac'_ Empty_Tac):tac'_;
wneuper@339
    81
wneuper@339
    82
fun mk_tac ((_,m):tac'_) = m; 
wneuper@339
    83
fun mk_mstID ((mI,_):tac'_) = mI;
wneuper@339
    84
wneuper@339
    85
fun tac'_2str ((ID,ms):tac'_) = ID ^ (tac2str ms);
wneuper@339
    86
(* TODO: tac2str, tac'_2str NOT tested *)
wneuper@339
    87
wneuper@339
    88
wneuper@339
    89
wneuper@339
    90
type squ = ptree; (* TODO: safe etc. *)
wneuper@339
    91
wneuper@339
    92
(*13.9.02--------------
wneuper@339
    93
type ctr = (loc * pos) list;
wneuper@339
    94
val ops = [("plus","op +"),("minus","op -"),("times","op *"),
wneuper@339
    95
	   ("cancel","cancel"),("pow","pow"),("sqrt","sqrt")];
wneuper@339
    96
fun op_intern op_ =
wneuper@339
    97
  case assoc (ops,op_) of
wneuper@339
    98
    Some op' => op' | None => raise error ("op_intern: no op= "^op_);
wneuper@339
    99
-----------------------*)
wneuper@339
   100
wneuper@339
   101
wneuper@339
   102
wneuper@339
   103
(* use"ME/solve.sml";
wneuper@339
   104
   use"solve.sml";
wneuper@339
   105
wneuper@339
   106
val ttt = (term_of o the o (parse thy))"Substitute [(bdv,x)] g";
wneuper@339
   107
val ttt = (term_of o the o (parse thy))"Rewrite thmid True g";
wneuper@339
   108
wneuper@339
   109
  Const ("Script.Rewrite'_Inst",_) $ sub $ Free (thm',_) $ Const (pa,_) $ f'
wneuper@339
   110
   *)
wneuper@339
   111
wneuper@339
   112
wneuper@339
   113
wneuper@339
   114
val specsteps = ["Init_Proof","Refine_Tacitly","Refine_Problem",
wneuper@339
   115
		 "Model_Problem",(*"Match_Problem",*)
wneuper@339
   116
		 "Add_Given","Del_Given","Add_Find","Del_Find",
wneuper@339
   117
		 "Add_Relation","Del_Relation",
wneuper@339
   118
		 "Specify_Theory","Specify_Problem","Specify_Method"];
wneuper@339
   119
wneuper@339
   120
"-----------------------------------------------------------------------";
wneuper@339
   121
wneuper@339
   122
wneuper@339
   123
fun step2taci ((tac_, _, pt, p, _):step) = (*FIXXME.040312: redesign step*)
wneuper@339
   124
    (tac_2tac tac_, tac_, (p, get_istate pt p)):taci;
wneuper@339
   125
wneuper@339
   126
wneuper@339
   127
(*FIXME.WN050821 compare solve ... nxt_solv*)
wneuper@339
   128
(* val ("Apply_Method",Apply_Method' (mI,_))=(mI,m);
wneuper@339
   129
   val (("Apply_Method",Apply_Method' (mI,_,_)),pt, pos as (p,_))=(m,pt, pos);
wneuper@339
   130
   *)
wneuper@339
   131
fun solve ("Apply_Method", m as Apply_Method' (mI, _, _)) 
wneuper@339
   132
	  (pt:ptree, (pos as (p,_))) =
wneuper@339
   133
  let val {srls,...} = get_met mI;
wneuper@339
   134
    val PblObj{meth=itms,...} = get_obj I pt p;
wneuper@339
   135
    val thy' = get_obj g_domID pt p;
wneuper@339
   136
    val thy = assoc_thy thy';
wneuper@339
   137
    val (is as ScrState (env,_,_,_,_,_), sc) = init_scrstate thy itms mI;
wneuper@339
   138
    val ini = init_form thy sc env;
wneuper@339
   139
    val p = lev_dn p;
wneuper@339
   140
  in 
wneuper@339
   141
      case ini of
wneuper@339
   142
	  Some t => (* val Some t = ini; 
wneuper@339
   143
	             *)
wneuper@339
   144
	  let val (pos,c,_,pt) = 
wneuper@339
   145
		  generate1 thy (Apply_Method' (mI, Some t, is))
wneuper@339
   146
			    is (lev_on p, Frm)(*implicit Take*) pt;
wneuper@339
   147
	  in ("ok",([(Apply_Method mI, Apply_Method' (mI, Some t, is), 
wneuper@339
   148
		      ((lev_on p, Frm), is))], c, (pt,pos)):calcstate') 
wneuper@339
   149
	  end	      
wneuper@339
   150
	| None => (*execute the first tac in the Script, compare solve m*)
wneuper@341
   151
	  let val (m', is', _) = next_tac (thy', srls) (pt, (p, Res)) sc is;
wneuper@372
   152
	      val d = e_rls (*FIXME: get simplifier from domID*);
wneuper@339
   153
	  in 
wneuper@341
   154
	      case locate_gen (thy',srls) m' (pt,(p, Res))(sc,d) is' of 
wneuper@339
   155
		  Steps (is'', ss as (m'',f',pt',p',c')::_) =>
wneuper@339
   156
(* val Steps (is'', ss as (m'',f',pt',p',c')::_) =
wneuper@341
   157
       locate_gen (thy',srls) m'  (pt,(p,Res)) (sc,d) is';
wneuper@339
   158
 *)
wneuper@339
   159
		  ("ok", (map step2taci ss, c', (pt',p')))
wneuper@339
   160
		| NotLocatable =>  
wneuper@339
   161
		  let val (p,ps,f,pt) = 
wneuper@339
   162
			  generate_hard (assoc_thy "Isac.thy") m (p,Frm) pt;
wneuper@339
   163
		  in ("not-found-in-script",
wneuper@339
   164
		      ([(tac_2tac m, m, (pos, is))], ps, (pt,p))) end
wneuper@339
   165
    (*just-before------------------------------------------------------
wneuper@339
   166
	      ("ok",([(Apply_Method mI,Apply_Method'(mI,None,e_istate),
wneuper@339
   167
		       (pos, is))],
wneuper@339
   168
		     [], (update_env pt (fst pos) (Some is),pos)))
wneuper@339
   169
     -----------------------------------------------------------------*)
wneuper@339
   170
	  end
wneuper@339
   171
  end
wneuper@339
   172
wneuper@339
   173
  | solve ("Free_Solve", Free_Solve')  (pt,po as (p,_)) =
wneuper@339
   174
  let (*val _=writeln"###solve Free_Solve";*)
wneuper@339
   175
    val p' = lev_dn_ (p,Res);
wneuper@339
   176
    val pt = update_metID pt (par_pblobj pt p) e_metID;
wneuper@339
   177
  in ("ok", ((*(p',Uistate,Empty_Tac_), EmptyMout, Empty_Tac, Unsafe,*)
wneuper@339
   178
      [(Empty_Tac, Empty_Tac_, (po, Uistate))], [], (pt,p'))) end
wneuper@339
   179
wneuper@390
   180
(* val (("Check_Postcond",Check_Postcond' (pI,_)), (pt,(pos as (p,p_)))) =
wneuper@390
   181
       (  m,                                       (pt, pos));
wneuper@339
   182
   *)
wneuper@339
   183
  | solve ("Check_Postcond",Check_Postcond' (pI,_)) (pt,(pos as (p,p_))) =
wneuper@339
   184
    let (*val _=writeln"###solve Check_Postcond";*)
wneuper@339
   185
      val pp = par_pblobj pt p
wneuper@339
   186
      val asm = (case get_obj g_tac pt p of
wneuper@339
   187
		    Check_elementwise _ => (*collects and instantiates asms*)
wneuper@339
   188
		    (snd o (get_obj g_result pt)) p
wneuper@339
   189
		  | _ => ((map fst) o (get_assumptions_ pt)) (p,p_))
wneuper@339
   190
	  handle _ => [] (*WN.27.5.03 asms in subpbls not completely clear*)
wneuper@339
   191
      val metID = get_obj g_metID pt pp;
wneuper@339
   192
      val {srls=srls,scr=sc,...} = get_met metID;
wneuper@339
   193
      val is as ScrState (E,l,a,_,_,b) = get_istate pt (p,p_); 
wneuper@339
   194
     (*val _= writeln("### solve Check_postc, subpbl pos= "^(pos'2str (p,p_)));
wneuper@339
   195
      val _= writeln("### solve Check_postc, is= "^(istate2str is));*)
wneuper@339
   196
      val thy' = get_obj g_domID pt pp;
wneuper@339
   197
      val thy = assoc_thy thy';
wneuper@339
   198
      val (_,_,(scval,scsaf)) = next_tac (thy',srls) (pt,(p,p_)) sc is;
wneuper@339
   199
      (*val _= writeln("### solve Check_postc, scval= "^(term2str scval));*)
wneuper@339
   200
wneuper@339
   201
    in if pp = [] then
wneuper@339
   202
	   let val is = ScrState (E,l,a,scval,scsaf,b)
wneuper@339
   203
	       val tac_ = Check_Postcond'(pI,(scval, map term2str asm))
wneuper@339
   204
	       val (pos,ps,f,pt) = generate1 thy tac_ is (pp,Res) pt;
wneuper@339
   205
	   in ("ok", ((*(([],Res),is,End_Proof''), f, End_Proof', scsaf,*)
wneuper@339
   206
	       [(Check_Postcond pI, tac_, ((pp,Res),is))], ps,(pt,pos))) end
wneuper@339
   207
       else
wneuper@339
   208
        let
wneuper@339
   209
	  (*resume script of parpbl, transfer value of subpbl-script*)
wneuper@339
   210
        val ppp = par_pblobj pt (lev_up p);
wneuper@339
   211
	val thy' = get_obj g_domID pt ppp;
wneuper@339
   212
        val thy = assoc_thy thy';
wneuper@339
   213
	val metID = get_obj g_metID pt ppp;
wneuper@339
   214
        val sc = (#scr o get_met) metID;
wneuper@339
   215
        val is as ScrState (E,l,a,_,_,b) = get_istate pt (pp(*!/p/*),Frm); 
wneuper@339
   216
     (*val _=writeln("### solve Check_postc, parpbl pos= "^(pos'2str(pp,Frm)));
wneuper@339
   217
  	val _=writeln("### solve Check_postc, is(pt)= "^(istate2str is));
wneuper@339
   218
  	val _=writeln("### solve Check_postc, is'= "^
wneuper@339
   219
		      (istate2str (E,l,a,scval,scsaf,b)));*)
wneuper@339
   220
        val ((p,p_),ps,f,pt) = 
wneuper@339
   221
	    generate1 thy (Check_Postcond' (pI, (scval, map term2str asm)))
wneuper@339
   222
		(ScrState (E,l,a,scval,scsaf,b)) (pp,Res) pt;
wneuper@339
   223
	(*val _=writeln("### solve Check_postc, is(pt')= "^
wneuper@339
   224
		      (istate2str (get_istate pt ([3],Res))));
wneuper@339
   225
	val (nx,is',_) = next_tac (thy',srls) (pt,(p,p_)) sc 
wneuper@339
   226
				(ScrState (E,l,a,scval,scsaf,b));*)
wneuper@339
   227
       in ("ok",(*((pp,Res),is',nx), f, tac_2tac nx, scsaf,*)
wneuper@339
   228
	   ([(Check_Postcond pI, Check_Postcond'(pI,(scval, map term2str asm)),
wneuper@339
   229
	      ((pp,Res), ScrState (E,l,a,scval,scsaf,b)))],ps,(pt,(p,p_))))
wneuper@339
   230
	end
wneuper@339
   231
    end
wneuper@339
   232
(* val (msg, cs') = 
wneuper@339
   233
    ("ok",([(Check_Postcond pI,Check_Postcond'(pI, (scval, map term2str asm))),
wneuper@339
   234
	    ((pp,Res),(ScrState (E,l,a,scval,scsaf,b)))], (pt,(p,p_))));
wneuper@339
   235
    val (_,(pt',p')) = cs';
wneuper@339
   236
   (writeln o istate2str) (get_istate pt' p');
wneuper@339
   237
   (term2str o fst) (get_obj g_result pt' (fst p'));
wneuper@339
   238
   *)
wneuper@339
   239
wneuper@339
   240
(* writeln(istate2str(get_istate pt (p,p_)));
wneuper@339
   241
   *)
wneuper@339
   242
  | solve (_,End_Proof'') (pt, (p,p_)) =
wneuper@339
   243
      ("end-proof",
wneuper@339
   244
       ((*(([],Res),Uistate,Empty_Tac_), EmptyMout, Empty_Tac, Safe,*)
wneuper@339
   245
       [(Empty_Tac,Empty_Tac_,(([],Res),Uistate))],[],(pt,(p,p_))))
wneuper@339
   246
wneuper@339
   247
(*-----------vvvvvvvvvvv could be done by generate1 ?!?*)
wneuper@339
   248
  | solve (_,End_Detail' t) (pt,(p,p_)) =
wneuper@339
   249
    let val pr as (p',_) = (lev_up p, Res)
wneuper@339
   250
	val pp = par_pblobj pt p
wneuper@339
   251
	val r = (fst o (get_obj g_result pt)) p' 
wneuper@339
   252
	(*Rewrite_Set* done at Detail_Set*: this result is already in ptree*)
wneuper@339
   253
	val thy' = get_obj g_domID pt pp
wneuper@339
   254
	val (srls, is, sc) = from_pblobj' thy' pr pt
wneuper@339
   255
	val (tac_,is',_) = next_tac (thy',srls)  (pt,pr) sc is
wneuper@339
   256
    in ("ok", ((*((pp,Frm(*???*)),is,tac_), 
wneuper@339
   257
	Form' (FormKF (~1, EdUndef, length p', Nundef, term2str r)),
wneuper@339
   258
	tac_2tac tac_, Sundef,*)
wneuper@339
   259
	[(End_Detail, End_Detail' t , 
wneuper@339
   260
	  ((p,p_), get_istate pt (p,p_)))], [], (pt,pr))) end
wneuper@339
   261
wneuper@339
   262
  | solve (mI,m) (pt, po as (p,p_)) =
wneuper@431
   263
(* val ((mI,m), (pt, po as (p,p_))) = (m, (pt, pos));
wneuper@339
   264
   *)
wneuper@339
   265
    if e_metID = get_obj g_metID pt (par_pblobj pt p)(*29.8.02:
wneuper@339
   266
						      could be detail, too !!*)
wneuper@339
   267
    then let val ((p,p_),ps,f,pt) = 
wneuper@339
   268
		 generate1 (assoc_thy (get_obj g_domID pt (par_pblobj pt p))) 
wneuper@339
   269
			   m e_istate (p,p_) pt;
wneuper@339
   270
	 in ("no-method-specified", (*Free_Solve*)
wneuper@339
   271
	     ((*((p,p_),Uistate,Empty_Tac_),f, Empty_Tac, Unsafe,*)
wneuper@339
   272
	     [(Empty_Tac,Empty_Tac_, ((p,p_),Uistate))], ps, (pt,(p,p_)))) end
wneuper@339
   273
    else
wneuper@339
   274
	let 
wneuper@339
   275
	    val thy' = get_obj g_domID pt (par_pblobj pt p);
wneuper@339
   276
	    val (srls, is, sc) = from_pblobj_or_detail' thy' (p,p_) pt;
wneuper@339
   277
(*val _= writeln("### solve, before locate_gen p="^(pos'2str(p,p_)));*)
wneuper@339
   278
		val d = e_rls; (*FIXME: canon.simplifier for domain is missing
wneuper@339
   279
				8.01: generate from domID?*)
wneuper@339
   280
	in case locate_gen (thy',srls) m  (pt,(p,p_)) (sc,d) is of 
wneuper@339
   281
	       Steps (is', ss as (m',f',pt',p',c')::_) =>
wneuper@339
   282
(* val Steps (is', ss as (m',f',pt',p',c')::_) =
wneuper@339
   283
       locate_gen (thy',srls) m  (pt,(p,p_)) (sc,d) is;
wneuper@339
   284
 *)
wneuper@339
   285
	       let (*val _= writeln("### solve, after locate_gen: is= ")
wneuper@339
   286
		       val _= writeln(istate2str is')*)
wneuper@339
   287
		   (*val nxt_ = 
wneuper@339
   288
		       case p' of (*change from solve to model subpbl*)
wneuper@339
   289
			   (_,Pbl) => nxt_model_pbl m' (pt',p')
wneuper@339
   290
			 | _ => fst3 (next_tac (thy',srls) (pt',p') sc is');*) 
wneuper@339
   291
	       (*27.8.02:next_tac may change to other branches in pt FIXXXXME*)
wneuper@339
   292
	       in ("ok", ((*(p',is',nxt_), f', tac_2tac nxt_, safe is',*)
wneuper@339
   293
		   map step2taci ss, c', (pt',p'))) end
wneuper@339
   294
	     | NotLocatable =>  
wneuper@339
   295
	       let val (p,ps,f,pt) = 
wneuper@339
   296
		       generate_hard (assoc_thy "Isac.thy") m (p,p_) pt;
wneuper@339
   297
	       in ("not-found-in-script",
wneuper@339
   298
		   ((*(p,Uistate,Empty_Tac_),f, Empty_Tac, Unsafe,*) 
wneuper@339
   299
		   [(tac_2tac m, m, (po,is))], ps, (pt,p))) end
wneuper@339
   300
	end;
wneuper@339
   301
wneuper@339
   302
wneuper@461
   303
(*FIXME.WN050821 compare solve ... nxt_solv*)
wneuper@461
   304
(* nxt_solv (Apply_Method'     vvv FIXME: get args in applicable_in *)
wneuper@461
   305
fun nxt_solv (Apply_Method' (mI,_,_)) _ (pt:ptree, pos as (p,_)) =
wneuper@461
   306
(* val ((Apply_Method' (mI,_,_)),             _,    (pt:ptree, pos as (p,_))) =
wneuper@461
   307
       ((Apply_Method' (mI, None, e_istate)), e_istate, ptp);
wneuper@461
   308
   *)
wneuper@461
   309
  let val {srls,ppc,...} = get_met mI;
wneuper@461
   310
    val PblObj{meth=itms,origin=(oris,_,_),probl,...} = get_obj I pt p;
wneuper@461
   311
    val itms = if itms <> [] then itms
wneuper@461
   312
	       else complete_metitms oris probl [] ppc
wneuper@461
   313
    val thy' = get_obj g_domID pt p;
wneuper@461
   314
    val thy = assoc_thy thy';
wneuper@461
   315
    val (is as ScrState (env,_,_,_,_,_), scr) = init_scrstate thy itms mI;
wneuper@461
   316
    val ini = init_form thy scr env;
wneuper@461
   317
  in 
wneuper@461
   318
    case ini of
wneuper@461
   319
    Some t => (* val Some t = ini; 
wneuper@461
   320
	         *)
wneuper@463
   321
    let val pos = ((lev_on o lev_dn) p, Frm)
wneuper@461
   322
	val tac_ = Apply_Method' (mI, Some t, is);
wneuper@461
   323
	val (pos,c,_,pt) = (*implicit Take*)
wneuper@461
   324
	    generate1 thy tac_ is pos pt
wneuper@461
   325
      (*val _= ("### nxt_solv Apply_Method, pos= "^pos'2str (lev_on p,Frm));*)
wneuper@461
   326
    in ([(Apply_Method mI, tac_, (pos, is))], 
wneuper@461
   327
	c, (pt, pos)):calcstate' end
wneuper@461
   328
  | None =>
wneuper@470
   329
    let val pt = update_env pt (fst pos) (Some is)
wneuper@470
   330
	val (tacis, c, ptp) = nxt_solve_ (pt, pos)
wneuper@470
   331
    in (tacis @ 
wneuper@470
   332
	[(Apply_Method mI, Apply_Method' (mI, None, e_istate), (pos, is))],
wneuper@470
   333
	c, ptp) end
wneuper@461
   334
  end
wneuper@339
   335
(* val ("Check_Postcond",Check_Postcond' (pI,_)) = (mI,m);
wneuper@388
   336
   val (Check_Postcond' (pI,_), _, (pt, pos as (p,p_))) = 
wneuper@388
   337
       (tac_,                  is,  ptp);
wneuper@339
   338
   *)
wneuper@389
   339
  (*TODO.WN050913 remove unnecessary code below*)
wneuper@339
   340
  | nxt_solv (Check_Postcond' (pI,_)) _ (pt, pos as (p,p_))  =
wneuper@339
   341
    let (*val _=writeln"###solve Check_Postcond";*)
wneuper@339
   342
      val pp = par_pblobj pt p
wneuper@339
   343
      val asm = (case get_obj g_tac pt p of
wneuper@339
   344
		    Check_elementwise _ => (*collects and instantiates asms*)
wneuper@339
   345
		    (snd o (get_obj g_result pt)) p
wneuper@339
   346
		  | _ => ((map fst) o (get_assumptions_ pt)) (p,p_))
wneuper@339
   347
	  handle _ => [] (*WN.27.5.03 asms in subpbls not completely clear*)
wneuper@339
   348
      val metID = get_obj g_metID pt pp;
wneuper@339
   349
      val {srls=srls,scr=sc,...} = get_met metID;
wneuper@339
   350
      val is as ScrState (E,l,a,_,_,b) = get_istate pt (p,p_); 
wneuper@339
   351
     (*val _= writeln("### solve Check_postc, subpbl pos= "^(pos'2str (p,p_)));
wneuper@339
   352
      val _= writeln("### solve Check_postc, is= "^(istate2str is));*)
wneuper@339
   353
      val thy' = get_obj g_domID pt pp;
wneuper@339
   354
      val thy = assoc_thy thy';
wneuper@339
   355
      val (_,_,(scval,scsaf)) = next_tac (thy',srls) (pt,(p,p_)) sc is;
wneuper@339
   356
      (*val _= writeln("### solve Check_postc, scval= "^(term2str scval));*)
wneuper@339
   357
    in if pp = [] then 
wneuper@339
   358
	   let val is = ScrState (E,l,a,scval,scsaf,b)
wneuper@339
   359
	       val tac_ = Check_Postcond'(pI,(scval, map term2str asm))
wneuper@339
   360
           (*val _= writeln"### nxt_solv2 Apply_Method: stored is =";
wneuper@339
   361
               val _= writeln(istate2str is);*)
wneuper@339
   362
	       val ((p,p_),ps,f,pt) = 
wneuper@339
   363
		   generate1 thy tac_ is (pp,Res) pt;
wneuper@339
   364
	   in ([(Check_Postcond pI, tac_, ((pp,Res), is))],ps,(pt, (p,p_))) end
wneuper@339
   365
       else
wneuper@339
   366
        let
wneuper@339
   367
	  (*resume script of parpbl, transfer value of subpbl-script*)
wneuper@339
   368
        val ppp = par_pblobj pt (lev_up p);
wneuper@339
   369
	val thy' = get_obj g_domID pt ppp;
wneuper@339
   370
        val thy = assoc_thy thy';
wneuper@339
   371
	val metID = get_obj g_metID pt ppp;
wneuper@389
   372
	val {scr,...} = get_met metID;
wneuper@339
   373
        val is as ScrState (E,l,a,_,_,b) = get_istate pt (pp(*!/p/*),Frm)
wneuper@339
   374
        val tac_ = Check_Postcond' (pI, (scval, map term2str asm))
wneuper@339
   375
	val is = ScrState (E,l,a,scval,scsaf,b)
wneuper@339
   376
    (*val _= writeln"### nxt_solv3 Apply_Method: stored is =";
wneuper@339
   377
        val _= writeln(istate2str is);*)
wneuper@339
   378
        val ((p,p_),ps,f,pt) = generate1 thy tac_ is (pp, Res) pt;
wneuper@389
   379
	(*val (nx,is',_) = next_tac (thy',srls) (pt,(p,p_)) scr is;WN050913*)
wneuper@339
   380
       in ([(Check_Postcond pI, tac_, ((pp, Res), is))], ps, (pt, (p,p_))) end
wneuper@339
   381
    end
wneuper@339
   382
(* writeln(istate2str(get_istate pt (p,p_)));
wneuper@339
   383
   *)
wneuper@339
   384
wneuper@339
   385
(*.start interpreter and do one rewrite.*)
wneuper@339
   386
(* val (_,Detail_Set'(thy',rls,t)) = (mI,m); val p = (p,p_);
wneuper@339
   387
   solve ("",Detail_Set'(thy', rls, t)) p pt;
wneuper@339
   388
  | nxt_solv (Detail_Set'(thy', rls, t)) _ (pt, p) = **********
wneuper@339
   389
---> FE-interface/sml.sml
wneuper@339
   390
wneuper@339
   391
  | nxt_solv (End_Detail' t) _ (pt, (p,p_)) = **********
wneuper@339
   392
    let val pr as (p',_) = (lev_up p, Res)
wneuper@339
   393
	val pp = par_pblobj pt p
wneuper@339
   394
	val r = (fst o (get_obj g_result pt)) p' 
wneuper@339
   395
	(*Rewrite_Set* done at Detail_Set*: this result is already in ptree*)
wneuper@339
   396
	val thy' = get_obj g_domID pt pp
wneuper@339
   397
	val (srls, is, sc) = from_pblobj' thy' pr pt
wneuper@339
   398
	val (tac_,is',_) = next_tac (thy',srls)  (pt,pr) sc is
wneuper@339
   399
    in (pr, ((pp,Frm(*???*)),is,tac_), 
wneuper@339
   400
	Form' (FormKF (~1, EdUndef, length p', Nundef, term2str r)),
wneuper@339
   401
	tac_2tac tac_, Sundef, pt) end
wneuper@339
   402
*)
wneuper@339
   403
  | nxt_solv (End_Proof'') _ ptp = ([], [], ptp)
wneuper@339
   404
wneuper@339
   405
  | nxt_solv tac_ is (pt, pos as (p,p_)) =
wneuper@339
   406
(* val (pt, pos as (p,p_)) = ptp;
wneuper@339
   407
   *)
wneuper@463
   408
    let val pos = case pos of
wneuper@463
   409
		      (p, Met) => ((lev_on o lev_dn) p, Frm)(*begin script*)
wneuper@463
   410
		    | (p, Res) => (lev_on p,Res) (*somewhere in script*)
wneuper@463
   411
		    | _ => pos  (*somewhere in script*)
wneuper@339
   412
    (*val _= writeln"### nxt_solv4 Apply_Method: stored is =";
wneuper@339
   413
        val _= writeln(istate2str is);*)
wneuper@339
   414
	val (pos',c,_,pt) = generate1 (assoc_thy "Isac.thy") tac_ is pos pt;
wneuper@470
   415
    in ([(tac_2tac tac_, tac_, (pos,is))], c, (pt, pos')) end
wneuper@339
   416
wneuper@339
   417
wneuper@339
   418
  (*(p,p_), (([],Res),Uistate,Empty_Tac_), EmptyMout, Empty_Tac, Safe, pt*)
wneuper@339
   419
wneuper@339
   420
wneuper@339
   421
(*.find the next tac from the script, nxt_solv will update the ptree.*)
wneuper@470
   422
and nxt_solve_ (ptp as (pt, pos as (p,p_))) =
wneuper@339
   423
(* val (pt,pos as (p,p_)) = ptp;
wneuper@339
   424
   val (pt,pos as (p,p_)) = ptp';
wneuper@339
   425
   val (pt,pos as (p,p_)) = ptp'';
wneuper@342
   426
   val (ptp as (pt, pos as (p,p_))) = (pt,ip);
wneuper@339
   427
   *)
wneuper@339
   428
    if e_metID = get_obj g_metID pt (par_pblobj pt p)
wneuper@339
   429
    then ([], [], (pt,(p,p_))):calcstate'
wneuper@339
   430
    else let val thy' = get_obj g_domID pt (par_pblobj pt p);
wneuper@339
   431
	     val (srls, is, sc) = from_pblobj_or_detail' thy' (p,p_) pt;
wneuper@339
   432
	     val (tac_,is,(t,_)) = next_tac (thy',srls) (pt,pos) sc is;
wneuper@373
   433
	 (*TODO here ^^^  return finished/helpless/ok !*)
wneuper@339
   434
	 (* val (tac_',is',_) = next_tac (thy',srls) (pt,pos) sc is;
wneuper@339
   435
	    *)
wneuper@339
   436
	 in case tac_ of
wneuper@339
   437
		End_Detail' _ => ([(End_Detail, 
wneuper@339
   438
				    End_Detail' (t,[(*FIXME.040215*)]), 
wneuper@339
   439
				    (pos, is))], [], (pt, pos))
wneuper@339
   440
	      | _ => nxt_solv tac_ is ptp end;
wneuper@339
   441
wneuper@469
   442
(*.says how may steps of a calculation should be done by "fun autocalc".*)
wneuper@469
   443
(*TODO.WN0512 redesign togehter with autocalc ?*)
wneuper@339
   444
datatype auto = 
wneuper@339
   445
  Step of int      (*1 do #int steps; may stop in model/specify:
wneuper@339
   446
		     IS VERY INEFFICIENT IN MODEL/SPECIY*)
wneuper@339
   447
| CompleteModel    (*2 complete modeling
wneuper@339
   448
                     if model complete, finish specifying + start solving*)
wneuper@339
   449
| CompleteCalcHead (*3 complete model/specify in one go + start solving*)
wneuper@339
   450
| CompleteToSubpbl (*4 stop at the next begin of a subproblem,
wneuper@339
   451
                     if none, complete the actual (sub)problem*)
wneuper@339
   452
| CompleteSubpbl   (*5 complete the actual (sub)problem (incl.ev.subproblems)*)
wneuper@339
   453
| CompleteCalc;    (*6 complete the calculation as a whole*)	
wneuper@339
   454
fun autoord (Step _ ) = 1
wneuper@339
   455
  | autoord CompleteModel = 2
wneuper@339
   456
  | autoord CompleteCalcHead = 3
wneuper@339
   457
  | autoord CompleteToSubpbl = 4
wneuper@339
   458
  | autoord CompleteSubpbl = 5
wneuper@339
   459
  | autoord CompleteCalc = 6;
wneuper@339
   460
(* val ptp as (_, p) = ptp;
wneuper@339
   461
   val ptp as (_, p) = (pt, pos); val auto = CompleteSubpbl;
wneuper@339
   462
   val (auto, ptp as (_, p)) = (CompleteSubpbl, (pt', pos'));
wneuper@339
   463
wneuper@339
   464
 val (c, (ptp as (_, p))) = ((c@c'), ptp);
wneuper@542
   465
 val (auto, c, (ptp as (_, p))) = (CompleteSubpbl, [], (pt', pos'));
wneuper@339
   466
   *)
wneuper@339
   467
fun complete_solve auto c (ptp as (_, p): ptree * pos') =
wneuper@339
   468
    if p = ([], Res) then ("end-of-calculation", [], ptp) else
wneuper@339
   469
    case nxt_solve_ ptp of
wneuper@339
   470
	((Subproblem _, tac_, (_, is))::_, c', ptp') =>
wneuper@339
   471
(* val ptp' = ptp''';
wneuper@339
   472
   *)
wneuper@339
   473
	if autoord auto < 5 then ("ok", c@c', ptp)
wneuper@339
   474
	else let val ptp = all_modspec ptp';
wneuper@339
   475
	         val (_, c'', ptp) = all_solve auto (c@c') ptp;
wneuper@339
   476
	     in complete_solve auto (c@c'@c'') ptp end
wneuper@339
   477
      | ((Check_Postcond _, tac_, (_, is))::_, c', ptp' as (_, p')) =>
wneuper@339
   478
	if autoord auto < 6 orelse p' = ([],Res) then ("ok", c@c', ptp')
wneuper@339
   479
	else complete_solve auto (c@c') ptp'
wneuper@339
   480
      | ((End_Detail, _, _)::_, c', ptp') => 
wneuper@339
   481
	if autoord auto < 6 then ("ok", c@c', ptp')
wneuper@339
   482
	else complete_solve auto (c@c') ptp'
wneuper@542
   483
(* val (_, c', ptp') = nxt_solve_ ptp;
wneuper@542
   484
   *)
wneuper@339
   485
      | (_, c', ptp') => complete_solve auto (c@c') ptp'
wneuper@339
   486
(* val (tacis, c', ptp') = nxt_solve_ ptp;
wneuper@339
   487
   val (tacis, c', ptp'') = nxt_solve_ ptp';
wneuper@339
   488
   val (tacis, c', ptp''') = nxt_solve_ ptp'';
wneuper@339
   489
   val (tacis, c', ptp'''') = nxt_solve_ ptp''';
wneuper@339
   490
   val (tacis, c', ptp''''') = nxt_solve_ ptp'''';
wneuper@339
   491
   *)
wneuper@339
   492
and all_solve auto c (ptp as (pt, (p,_)): ptree * pos') = 
wneuper@339
   493
(* val (ptp as (pt, (p,_))) = ptp;
wneuper@339
   494
   val (ptp as (pt, (p,_))) = ptp';
wneuper@339
   495
   val (ptp as (pt, (p,_))) = (pt, pos);
wneuper@339
   496
   *)
wneuper@339
   497
    let val (_,_,mI) = get_obj g_spec pt p;
wneuper@339
   498
        val (_, c', ptp) = nxt_solv (Apply_Method' (mI, None, e_istate))
wneuper@339
   499
				e_istate ptp;
wneuper@339
   500
    in complete_solve auto (c@c') ptp end;
wneuper@339
   501
wneuper@339
   502
wneuper@339
   503
(*. detail steps done internally by Rewrite_Set* 
wneuper@339
   504
    into ctree by use of a script .*)
wneuper@535
   505
(* val (pt, (p,p_)) = (pt, pos);
wneuper@339
   506
   *)
wneuper@339
   507
fun detailrls pt ((p,p_):pos') = 
wneuper@339
   508
    let val t = get_obj g_form pt p
wneuper@535
   509
	val is = init_istate (get_obj g_tac pt p)
wneuper@542
   510
	(*TODO.WN060602 ScrState (["(t_, Problem (Isac,[equation,univar]))"]
wneuper@542
   511
				      is wrong for simpl, but working ?!? *)
wneuper@542
   512
	val tac_ = Apply_Method' (e_metID(*WN0402: see generate1 !?!*), 
wneuper@339
   513
				  Some t, is);
wneuper@339
   514
	val pos' = ((lev_on o lev_dn) p, Frm);
wneuper@339
   515
	val (_,_,_,pt') = (*implicit Take*) generate1 thy tac_ is pos' pt;
wneuper@339
   516
	val (_, _, (pt'',_)) = complete_solve CompleteSubpbl [] (pt', pos');
wneuper@339
   517
        val newnds =children (get_nd pt'' p)
wneuper@339
   518
	val pt''' = ins_chn newnds pt p (*complete_solve cuts branches after*)
wneuper@339
   519
      (*val nd = get_nd pt p; val cn = children nd;*)
wneuper@339
   520
in ("detailrls", pt'''(*, get_formress [] ((lev_on o lev_dn) p) cn*),
wneuper@339
   521
    (p @ [length newnds], Res):pos') end;
wneuper@339
   522
wneuper@339
   523
wneuper@339
   524
wneuper@339
   525
(* val(mI,m)=m;val ppp=p;(*!!!*)val(p,p_)=pos;val(_,pt,_)=ppp(*!!!*);
wneuper@339
   526
   get_form ((mI,m):tac'_) ((p,p_):pos') ppp;
wneuper@339
   527
   *)
wneuper@339
   528
fun get_form ((mI,m):tac'_) ((p,p_):pos') pt = 
wneuper@339
   529
  case applicable_in (p,p_) pt m of
wneuper@339
   530
    Notappl e => Error' (Error_ e)
wneuper@339
   531
  | Appl m => 
wneuper@339
   532
      (* val Appl m=applicable_in (p,p_) pt m;
wneuper@339
   533
         *)
wneuper@339
   534
      if mI mem specsteps
wneuper@339
   535
	then let val (_,_,f,_,_,_) = specify m (p,p_) [] pt
wneuper@339
   536
	     in f end
wneuper@339
   537
      else let val (*_,_,f,_,_,_*)_ = solve (mI,m) (pt,(p,p_))
wneuper@339
   538
	   in (*f*) EmptyMout end;
wneuper@339
   539