src/sml/ME/solve.sml
author neuper
Thu, 15 May 2003 16:22:52 +0200
changeset 711 69bb39e31365
parent 703 751332b50cdc
child 718 da95b11326bc
permissions -rw-r--r--
*** empty log message ***
agriesma@328
     1
(* use"../ME/solve.sml";
agriesma@328
     2
   use"ME/solve.sml";
agriesma@328
     3
   use"solve.sml";
agriesma@328
     4
   W.N.10.12.99
agriesma@328
     5
agriesma@328
     6
   cd ~/Isabelle/Zerlege-Isa98-1/src/HOL/
agriesma@328
     7
   /src/HOL> sml @SMLload=HOL-plus
agriesma@328
     8
   cd"~/MathEngine99/src/";
agriesma@328
     9
   use"ROOT.sml";
agriesma@328
    10
*)
agriesma@328
    11
agriesma@328
    12
fun safe (ScrState (_,_,_,_,s,_)) = s
agriesma@328
    13
  | safe (RrlsState _) = Safe;
agriesma@328
    14
agriesma@328
    15
type mstID = string;
agriesma@328
    16
type mstep_ = mstID * mstep; (*DG <-> ME*)
agriesma@328
    17
val e_mstep_ = ("Empty_Mstep", Empty_Mstep):mstep_;
agriesma@328
    18
agriesma@328
    19
fun mk_mstep_   m = case m of
agriesma@328
    20
  Init_Proof (ppc, spec)    => ("Init_Proof", Init_Proof (ppc, spec )) 
agriesma@328
    21
| Model_Problem pblID       => ("Model_Problem", Model_Problem pblID)
agriesma@328
    22
| Refine_Tacitly pblID      => ("Refine_Tacitly", Refine_Tacitly pblID)
agriesma@328
    23
| Refine_Problem pblID      => ("Refine_Problem", Refine_Problem pblID)
agriesma@328
    24
| Add_Given cterm'          => ("Add_Given", Add_Given cterm') 
agriesma@328
    25
| Del_Given cterm'          => ("Del_Given", Del_Given cterm') 
agriesma@328
    26
| Add_Find cterm'           => ("Add_Find", Add_Find cterm') 
agriesma@328
    27
| Del_Find cterm'           => ("Del_Find", Del_Find cterm') 
agriesma@328
    28
| Add_Relation cterm'       => ("Add_Relation", Add_Relation cterm') 
agriesma@328
    29
| Del_Relation cterm'       => ("Del_Relation", Del_Relation cterm') 
agriesma@328
    30
agriesma@328
    31
| Specify_Domain domID	    => ("Specify_Domain", Specify_Domain domID) 
agriesma@328
    32
| Specify_Problem pblID     => ("Specify_Problem", Specify_Problem pblID)
agriesma@328
    33
| Specify_Method metID	    => ("Specify_Method", Specify_Method metID) 
agriesma@328
    34
| Apply_Method metID	    => ("Apply_Method", Apply_Method metID) 
agriesma@328
    35
| Check_Postcond pblID	    => ("Check_Postcond", Check_Postcond pblID)
agriesma@328
    36
| Free_Solve                => ("Free_Solve",Free_Solve)
agriesma@328
    37
		    
agriesma@328
    38
| Rewrite_Inst (subs, thm') => ("Rewrite_Inst", Rewrite_Inst (subs, thm')) 
agriesma@328
    39
| Rewrite thm'		    => ("Rewrite", Rewrite thm') 
agriesma@328
    40
| Rewrite_Asm thm'	    => ("Rewrite_Asm", Rewrite_Asm thm') 
agriesma@328
    41
| Rewrite_Set_Inst (subs, rls')
agriesma@328
    42
               => ("Rewrite_Set_Inst", Rewrite_Set_Inst (subs, rls')) 
agriesma@328
    43
| Rewrite_Set rls'          => ("Rewrite_Set", Rewrite_Set rls') 
agriesma@328
    44
| End_Ruleset		    => ("End_Ruleset", End_Ruleset)
agriesma@328
    45
agriesma@328
    46
| End_Detail                => ("End_Detail", End_Detail)
agriesma@328
    47
| Detail_Set rls'           => ("Detail_Set", Detail_Set rls')
agriesma@328
    48
| Detail_Set_Inst (s, rls') => ("Detail_Set_Inst", Detail_Set_Inst (s, rls'))
agriesma@328
    49
agriesma@328
    50
| Calculate op_             => ("Calculate", Calculate op_)
agriesma@328
    51
| Substitute subs           => ("Substitute", Substitute subs) 
agriesma@328
    52
| Apply_Assumption cts'	    => ("Apply_Assumption", Apply_Assumption cts')
agriesma@328
    53
agriesma@328
    54
| Take cterm'               => ("Take", Take cterm') 
agriesma@328
    55
| Take_Inst cterm'          => ("Take_Inst", Take_Inst cterm') 
agriesma@328
    56
| Group (con, ints) 	    => ("Group", Group (con, ints)) 
agriesma@328
    57
| Subproblem (domID, pblID) => ("Subproblem", Subproblem (domID, pblID)) 
agriesma@328
    58
(*
agriesma@328
    59
| Subproblem_Full(spec,cts')=> ("Subproblem_Full", Subproblem_Full(spec,cts')) 
agriesma@328
    60
*)
agriesma@328
    61
| End_Subproblem            => ("End_Subproblem",End_Subproblem)
agriesma@328
    62
| CAScmd cterm'		    => ("CAScmd", CAScmd cterm')
agriesma@328
    63
			    
agriesma@328
    64
| Split_And                 => ("Split_And", Split_And) 
agriesma@328
    65
| Conclude_And		    => ("Conclude_And", Conclude_And) 
agriesma@328
    66
| Split_Or                  => ("Split_Or", Split_Or) 
agriesma@328
    67
| Conclude_Or		    => ("Conclude_Or", Conclude_Or) 
agriesma@328
    68
| Begin_Trans               => ("Begin_Trans", Begin_Trans) 
agriesma@328
    69
| End_Trans		    => ("End_Trans", End_Trans) 
agriesma@328
    70
| Begin_Sequ                => ("Begin_Sequ", Begin_Sequ) 
agriesma@328
    71
| End_Sequ                  => ("End_Sequ", Begin_Sequ) 
agriesma@328
    72
| Split_Intersect           => ("Split_Intersect", Split_Intersect) 
agriesma@328
    73
| End_Intersect		    => ("End_Intersect", End_Intersect) 
agriesma@328
    74
| Check_elementwise cterm'  => ("Check_elementwise", Check_elementwise cterm')
agriesma@328
    75
| Or_to_List                => ("Or_to_List", Or_to_List) 
agriesma@328
    76
| Collect_Trues	            => ("Collect_Results", Collect_Trues) 
agriesma@328
    77
			    
agriesma@328
    78
| Empty_Mstep               => ("Empty_Mstep",Empty_Mstep)
agriesma@328
    79
| Mstep string              => ("Mstep",Mstep string)
agriesma@328
    80
| User                      => ("User",User)
agriesma@328
    81
| End_Proof'                => ("End_Proof'",End_Proof'); 
agriesma@328
    82
agriesma@328
    83
(*Detail*)
agriesma@328
    84
val empty_mstep_ = (mk_mstep_ Empty_Mstep):mstep_;
agriesma@328
    85
agriesma@328
    86
fun mk_mstep ((_,m):mstep_) = m; 
agriesma@328
    87
fun mk_mstID ((mI,_):mstep_) = mI;
agriesma@328
    88
agriesma@328
    89
fun mstep_2str ((ID,ms):mstep_) = ID ^ (mstep2str ms);
agriesma@328
    90
(* TODO: mstep2str, mstep_2str NOT tested *)
agriesma@328
    91
agriesma@328
    92
agriesma@328
    93
agriesma@328
    94
type squ = ptree; (* TODO: safe etc. *)
agriesma@328
    95
agriesma@328
    96
(*13.9.02--------------
agriesma@328
    97
type ctr = (loc * pos) list;
agriesma@328
    98
val ops = [("plus","op +"),("minus","op -"),("times","op *"),
agriesma@328
    99
	   ("cancel","cancel"),("pow","pow"),("sqrt","sqrt")];
agriesma@328
   100
fun op_intern op_ =
agriesma@328
   101
  case assoc (ops,op_) of
agriesma@328
   102
    Some op' => op' | None => raise error ("op_intern: no op= "^op_);
agriesma@328
   103
-----------------------*)
agriesma@328
   104
agriesma@328
   105
agriesma@328
   106
agriesma@328
   107
(* use"ME/solve.sml";
agriesma@328
   108
   use"solve.sml";
agriesma@328
   109
agriesma@328
   110
val ttt = (term_of o the o (parse thy))"Substitute [(bdv,x)] g";
agriesma@328
   111
val ttt = (term_of o the o (parse thy))"Rewrite thmid True g";
agriesma@328
   112
agriesma@328
   113
  Const ("Script.Rewrite'_Inst",_) $ sub $ Free (thm',_) $ Const (pa,_) $ f'
agriesma@328
   114
   *)
agriesma@328
   115
agriesma@328
   116
agriesma@328
   117
agriesma@328
   118
val specsteps = ["Init_Proof","Refine_Tacitly","Refine_Problem",
agriesma@328
   119
		 "Model_Problem",(*"Match_Problem",*)
agriesma@328
   120
		 "Add_Given","Del_Given","Add_Find","Del_Find",
agriesma@328
   121
		 "Add_Relation","Del_Relation",
agriesma@328
   122
		 "Specify_Domain","Specify_Problem","Specify_Method"];
agriesma@328
   123
agriesma@328
   124
agriesma@328
   125
fun solve ("Apply_Method",Apply_Method' mI) ((p,_):pos') (pt:ptree) =
agriesma@328
   126
(* val ("Apply_Method",Apply_Method' mI)=(mI,m);
agriesma@328
   127
   *)
agriesma@328
   128
  let val {srls,...} = get_met mI;
agriesma@328
   129
    val PblObj{meth=itms,...} = get_obj I pt p;
agriesma@328
   130
    val thy' = get_obj g_domID pt p;
agriesma@328
   131
    val thy = assoc_thy thy';
agriesma@328
   132
    val (is as ScrState (env,_,_,_,_,_), scr) = init_scrstate thy itms mI;
agriesma@328
   133
    val ini = init_form thy scr env;
agriesma@328
   134
    val (p,p_) = (lev_dn p,Res);
agriesma@328
   135
  in 
agriesma@328
   136
    case ini of
agriesma@328
   137
    Some t => (* val Some t = ini; 
agriesma@328
   138
	         *)
agriesma@328
   139
    let val (p,p_) = (lev_on p,Frm); (*implicit Take*)
agriesma@328
   140
	val f = Sign.string_of_term (sign_of (assoc_thy thy')) t;
agriesma@328
   141
	val (pt,ps) = cappend_form pt p is f
agriesma@328
   142
	val {srls,...} = get_met mI;
agriesma@328
   143
    in ((p,p_), [], Form' (FormKF (~1,EdUndef,(length p), Nundef, f)), 
agriesma@328
   144
	fst (next_tac (thy',srls) (pt,(p,p_)) scr is), Safe, pt) end
agriesma@328
   145
  | None =>
neuper@711
   146
    let val (m,_) = next_tac (thy',srls) (pt,(lev_on p,Frm)) scr is;
agriesma@328
   147
	val f = case m of 
agriesma@328
   148
		    Subproblem (domID, pblID) => 
agriesma@328
   149
		    Form' (FormKF (~1,EdUndef,(length p), Nundef, 
agriesma@328
   150
			   (Sign.string_of_term (sign_of (assoc_thy thy')) 
agriesma@328
   151
						(subpbl domID pblID))))
neuper@711
   152
		  | _ => EmptyMout;
agriesma@328
   153
    (*nothing written to pt !!!*)
agriesma@328
   154
    in ((p,p_), [], f, m, Safe, pt) end
agriesma@328
   155
  end
agriesma@328
   156
agriesma@328
   157
  | solve ("Free_Solve", Free_Solve') (p,_) pt =
agriesma@328
   158
  let val _=writeln"###solve Free_Solve";
agriesma@328
   159
    val p' = lev_dn_ (p,Res);
agriesma@328
   160
    val pt = update_metID pt (par_pblobj pt p) e_metID;
agriesma@328
   161
  in (p', [], EmptyMout, Empty_Mstep, Unsafe, pt) end
agriesma@328
   162
agriesma@328
   163
(* val ("Check_Postcond",Check_Postcond' (pI,_)) = (mI,m);
agriesma@328
   164
   *)
agriesma@328
   165
  | solve ("Check_Postcond",Check_Postcond' (pI,_)) (p,p_) pt =
agriesma@328
   166
    let (*val _=writeln"###solve Check_Postcond";*)
agriesma@328
   167
      val pp = par_pblobj pt p;
agriesma@328
   168
      val metID = get_obj g_metID pt pp;
agriesma@328
   169
      val {srls=srls,scr=sc,...} = get_met metID;
agriesma@328
   170
      val is as ScrState (E,l,a,_,_,b) = get_istate pt (p,p_); 
agriesma@328
   171
     (*val _= writeln("### solve Check_postc, subpbl pos= "^(pos'2str (p,p_)));
agriesma@328
   172
      val _= writeln("### solve Check_postc, is= "^(istate2str is));*)
agriesma@328
   173
      val thy' = get_obj g_domID pt pp;
agriesma@328
   174
      val thy = assoc_thy thy';
agriesma@328
   175
      val (_,(scval,scsaf)) = next_tac (thy',srls) (pt,(p,p_)) sc is;
agriesma@328
   176
      (*val _= writeln("### solve Check_postc, scval= "^(term2str scval));*)
agriesma@328
   177
    in if pp = [] then 
agriesma@328
   178
	   let val ((p,p_),ps,f,pt) = generate1 thy (Check_Postcond'(pI,scval))
agriesma@328
   179
	             (ScrState (E,l,a,scval,scsaf,b)) (pp,Res) pt;
agriesma@328
   180
	   in ((p,p_), ps, f, End_Proof', scsaf, pt) end
agriesma@328
   181
       else
agriesma@328
   182
        let
agriesma@328
   183
	  (*resume script of parpbl, transfer value of subpbl-script*)
agriesma@328
   184
        val ppp = par_pblobj pt ((**)lev_up(**) p);
agriesma@328
   185
	val thy' = get_obj g_domID pt ppp;
agriesma@328
   186
        val thy = assoc_thy thy';
agriesma@328
   187
	val metID = get_obj g_metID pt ppp;
agriesma@328
   188
        val sc = (#scr o get_met) metID;
agriesma@328
   189
        val is as ScrState (E,l,a,_,_,b) = get_istate pt (pp(*!/p/*),Frm); 
agriesma@328
   190
     (*val _=writeln("### solve Check_postc, parpbl pos= "^(pos'2str(pp,Frm)));
agriesma@328
   191
  	val _=writeln("### solve Check_postc, is(pt)= "^(istate2str is));
agriesma@328
   192
  	val _=writeln("### solve Check_postc, is'= "^
agriesma@328
   193
		      (istate2str (E,l,a,scval,scsaf,b)));*)
agriesma@328
   194
        val ((p,p_),ps,f,pt) = generate1 thy (Check_Postcond'(pI,scval))
agriesma@328
   195
		(ScrState (E,l,a,scval,scsaf,b)) (pp,Res) pt;
agriesma@328
   196
	(*val _=writeln("### solve Check_postc, is(pt')= "^
agriesma@328
   197
		      (istate2str (get_istate pt ([3],Res))));*)
agriesma@328
   198
	val (nxt,_) = next_tac (thy',srls) (pt,(p,p_)) sc 
agriesma@328
   199
			       (ScrState (E,l,a,scval,scsaf,b));
agriesma@328
   200
       in ((p,p_), ps, f, nxt, scsaf, pt) end
agriesma@328
   201
    end
agriesma@328
   202
(* writeln(istate2str(get_istate pt (p,p_)));
agriesma@328
   203
   *)
agriesma@328
   204
agriesma@328
   205
  | solve (_,End_Proof'') (p,p_) pt =
agriesma@328
   206
      ((p,p_), [], EmptyMout, Empty_Mstep, Safe, pt)
agriesma@328
   207
agriesma@328
   208
(*.start interpreter and do one rewrite.*)
agriesma@328
   209
(* val (_,Detail_Set'(thy',rls',t)) = (mI,m); val p = (p,p_);
agriesma@328
   210
   solve ("",Detail_Set'(thy', rls',t)) p pt;
agriesma@328
   211
   *)
agriesma@328
   212
  | solve (_,Detail_Set'(thy', rls(*'*),t)) p pt =
agriesma@328
   213
    let (*val rls = the (assoc(!ruleset',rls'))
agriesma@328
   214
	    handle _ => raise error ("solve: '"^rls'^"' not known");*)
agriesma@328
   215
	val thy = assoc_thy thy';
agriesma@328
   216
        val (srls, sc, is) = 
agriesma@328
   217
	    case rls of
agriesma@328
   218
		Rrls {scr=sc as Rfuns {init_state=ii,...},...} => 
agriesma@328
   219
		(e_rls, sc, RrlsState (ii t))
agriesma@328
   220
	      | Rls {srls=srls,scr=sc as Script s,...} => 
agriesma@328
   221
		(srls, sc, ScrState ([(one_scr_arg s,t)], [], 
agriesma@328
   222
			       None, e_term, Sundef, true));
agriesma@328
   223
	val pt = update_mstep pt (fst p) (Detail_Set (id_rls rls));
agriesma@328
   224
	val (p,cid,_,pt) = generate1 thy (Begin_Trans' t) is p pt;
agriesma@328
   225
	val (nx,_) = next_tac (thy',srls) (pt,p) sc is;
agriesma@328
   226
	val aopt = applicable_in p pt nx;
agriesma@328
   227
    in case aopt of
agriesma@328
   228
	   Notappl s => raise error ("solve Detail_Set: "^s)
agriesma@328
   229
	 (* val Appl m = aopt;
agriesma@328
   230
	    *)
agriesma@328
   231
	 | Appl m => solve ("discardFIXME",m) p pt end
agriesma@328
   232
agriesma@328
   233
  | solve (_,End_Detail' t) (p,p_) pt =
agriesma@328
   234
    let val pr as (p',_) = (lev_up p, Res)
agriesma@328
   235
	val pp = par_pblobj pt p
neuper@703
   236
	val r = (fst o (get_obj g_result pt)) p' 
neuper@703
   237
	(*Rewrite_Set* done at Detail_Set**)
agriesma@328
   238
	val thy' = get_obj g_domID pt pp
agriesma@328
   239
	val (srls, is, sc) = from_pblobj' thy' pr pt
agriesma@328
   240
    in (pr, [], Form' (FormKF (~1, EdUndef, length p', Nundef, r)),
agriesma@328
   241
	fst (next_tac (thy',srls)  (pt,pr) sc is), Sundef, pt) end
agriesma@328
   242
(* val (mI,(p,p_)) = ("xxx",p);
agriesma@328
   243
   *)
agriesma@328
   244
  | solve (mI,m) (p,p_) pt =
agriesma@328
   245
    if e_metID = get_obj g_metID pt (par_pblobj pt p)(*29.8.02:
agriesma@328
   246
						      could be detail, too !!*)
agriesma@328
   247
    then let val ((p,p_),ps,f,pt) = 
agriesma@328
   248
		 generate1 (assoc_thy (get_obj g_domID pt (par_pblobj pt p))) 
agriesma@328
   249
			   m e_istate (p,p_) pt;
agriesma@328
   250
	 in ((p,p_),ps,f, Empty_Mstep, Unsafe, pt) end
agriesma@328
   251
    else
neuper@711
   252
	let 
neuper@711
   253
	    val thy' = get_obj g_domID pt (par_pblobj pt p);
agriesma@328
   254
	    val (srls, is, sc) = from_pblobj_or_detail' thy' (p,p_) pt;
agriesma@328
   255
(*val _= writeln("### solve, before locate_gen p="^(pos'2str(p,p_)));*)
agriesma@328
   256
		val d = e_rls; (*FIXME: canon.simplifier for domain is missing
agriesma@328
   257
				8.01: generate from domID?*)
agriesma@328
   258
	in case locate_gen (thy',srls) m  (pt,(p,p_)) (sc,d) is of 
agriesma@328
   259
	       Steps (is', (m',f',pt',p',c')::ss) =>
agriesma@328
   260
	       (* val Steps (is', (m',f',pt',p',c')::ss) =
agriesma@328
   261
		      locate_gen (thy',srls) m  (pt,(p,p_)) (sc,d) is;
neuper@711
   262
neuper@711
   263
val oris = fst (get_obj g_origin pt' [1,1]);writeln(oris2str oris);
neuper@711
   264
neuper@711
   265
val Subproblem' (_,oris,_) = m';
neuper@711
   266
writeln(oris2str oris);
neuper@711
   267
agriesma@328
   268
		*)
agriesma@328
   269
	       let val nxt = 
agriesma@328
   270
		       case p' of (*change from solve to model subprobl*)
agriesma@328
   271
			   (_,Pbl) => nxt_model_pbl m'
agriesma@328
   272
			 | _ => fst (next_tac (thy',srls) (pt',p') sc is'); 
agriesma@328
   273
	       (*27.8.02: next_tac may change to other branches in ptFIXXXXME*)
agriesma@328
   274
	       in (p',c', f', nxt, safe is', pt'(*'*)) end
agriesma@328
   275
	     | NotLocatable =>  
agriesma@328
   276
	       let val (p,ps,f,pt) = 
agriesma@328
   277
		       generate_hard (assoc_thy "Isac.thy") m (p,p_) pt;
agriesma@328
   278
	       in (p,ps,f, Empty_Mstep, Unsafe, pt) end
agriesma@328
   279
	end;
agriesma@328
   280
agriesma@328
   281
agriesma@328
   282
(*                                    unused: _____ 4.4.00 TODO: pos list !!!*)
agriesma@328
   283
fun me ((mI,m):mstep_) (pos' as (p,p_):pos') (c:cid) (pt:ptree) =
agriesma@328
   284
(* val (pos' as (p,p_),pt) = (p,EmptyPtree);
agriesma@328
   285
   
agriesma@328
   286
   val (mI,m) = nxt; val pos' as (p,p_) = p;
agriesma@328
   287
   *)
agriesma@328
   288
  case applicable_in (p,p_) pt m of
agriesma@328
   289
    Appl m => (* val Appl m = applicable_in (p,p_) pt m;
agriesma@328
   290
                 *)
agriesma@328
   291
    (case m of
agriesma@328
   292
	( Refine_Problem' ms) => 
agriesma@328
   293
	 (pos',c, Problems (RefinedKF ms), 
agriesma@328
   294
	  ("Specify_Problem", Specify_Problem (refined ms)), Safe, pt)
agriesma@328
   295
agriesma@328
   296
       | _ => (if mI mem specsteps
agriesma@328
   297
	       then let val (p',c,f,m,s,pt) = specify m (p,p_) c pt;
agriesma@328
   298
		   in (p',c,f,mk_mstep_ m,s,pt)
agriesma@328
   299
		    end
agriesma@328
   300
	       else let val ((p,p_),c,f,m,s,pt) = solve (mI,m) (p,p_) pt;
agriesma@328
   301
		   in ((p,p_),c,f,mk_mstep_ m,s,pt) end))
agriesma@328
   302
  | Notappl e => ((p,p_),c, Error' (Error_ e),
agriesma@328
   303
		  mk_mstep_ Empty_Mstep (*nxtstep ??*), Unsafe,pt);
agriesma@328
   304
agriesma@328
   305
(* val(mI,m)=m;val ppp=p;(*!!!*)val(p,p_)=pos;val(_,pt,_)=ppp(*!!!*);
agriesma@328
   306
   get_form ((mI,m):mstep_) ((p,p_):pos') ppp;
agriesma@328
   307
   *)
agriesma@328
   308
fun get_form ((mI,m):mstep_) ((p,p_):pos') pt = 
agriesma@328
   309
  case applicable_in (p,p_) pt m of
agriesma@328
   310
    Notappl e => Error' (Error_ e)
agriesma@328
   311
  | Appl m => 
agriesma@328
   312
      (* val Appl m=applicable_in (p,p_) pt m;
agriesma@328
   313
         *)
agriesma@328
   314
      if mI mem specsteps
agriesma@328
   315
	then let val (_,_,f,_,_,_) = specify m (p,p_) [] pt
agriesma@328
   316
	     in f end
agriesma@328
   317
      else let val (_,_,f,_,_,_) = solve (mI,m) (p,p_) pt
agriesma@328
   318
	   in f end;
agriesma@328
   319
    
agriesma@328
   320
agriesma@328
   321
(* use"ME/solve.sml";
agriesma@328
   322
   use"solve.sml";
agriesma@328
   323
   *)
agriesma@328
   324