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