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