src/Tools/isac/Interpret/solve.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 38034 928cebc9c4aa
permissions -rw-r--r--
tuned error and writeln

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