src/sml/ME/ctree.sml
author wneuper
Sat, 05 Mar 2005 17:26:21 +0100
changeset 2152 a863de293415
parent 2151 8df2ab3d17c9
child 2153 539d0ec8bab3
permissions -rw-r--r--
sml-050305b-cut_tree: after sticky tags
wneuper@2146
     1
(* use"../ME/ctree.sml";
wneuper@2146
     2
   use"ME/ctree.sml";
wneuper@856
     3
   use"ctree.sml";
wneuper@839
     4
   W.N.26.10.99
wneuper@839
     5
wneuper@839
     6
writeln (pr_ptree pr_short pt);
wneuper@1250
     7
wneuper@1250
     8
val Nd ( _, ns) = pt;
wneuper@1250
     9
wneuper@839
    10
*)
wneuper@839
    11
wneuper@839
    12
wneuper@839
    13
signature PTREE =
wneuper@839
    14
sig
wneuper@839
    15
  type ptree
wneuper@839
    16
  type envp
wneuper@839
    17
  val e_ptree : ptree
wneuper@839
    18
  exception PTREE of string
wneuper@839
    19
  type branch
wneuper@839
    20
  type ostate
wneuper@839
    21
  type cellID
wneuper@839
    22
  type cid
wneuper@839
    23
  type posel
wneuper@839
    24
  type pos
wneuper@839
    25
  type pos'
wneuper@839
    26
  type loc
wneuper@839
    27
  type domID
wneuper@839
    28
  type pblID
wneuper@839
    29
  type metID
wneuper@839
    30
  type spec
wneuper@839
    31
  type 'a ppc
wneuper@839
    32
  type con
wneuper@839
    33
  type subs
wneuper@839
    34
  type subst
wneuper@839
    35
  type env
wneuper@839
    36
  type ets
wneuper@839
    37
  val ets2str : ets -> string
wneuper@839
    38
  type item
wneuper@839
    39
  type tac
wneuper@839
    40
  type tac_
wneuper@839
    41
  val tac_2str : tac_ -> string
wneuper@839
    42
  type safe
wneuper@839
    43
  val safe2str : safe -> string
wneuper@839
    44
wneuper@839
    45
  type meth
wneuper@839
    46
  val cappend_atomic : ptree -> pos -> loc -> cterm' -> tac
wneuper@839
    47
    -> cterm' -> ostate -> cid -> ptree * posel list * cid
wneuper@839
    48
  val cappend_form : ptree
wneuper@839
    49
    -> pos -> loc -> cterm' -> cid -> ptree * pos * cid
wneuper@839
    50
  val cappend_parent : ptree -> pos -> loc -> cterm' -> tac
wneuper@839
    51
    -> branch -> cid -> ptree * int list * cid
wneuper@839
    52
  val cappend_problem : ptree -> posel list(*FIXME*) -> loc
wneuper@839
    53
    -> cterm' list * spec -> cid -> ptree * int list * cellID list
wneuper@839
    54
  val append_result : ptree -> pos -> cterm' -> ostate -> ptree * pos
wneuper@839
    55
wneuper@839
    56
  type ppobj
wneuper@839
    57
  val g_branch : ppobj -> branch
wneuper@839
    58
  val g_cell : ppobj -> cid
wneuper@839
    59
  val g_args : ppobj -> (int * (term list)) list (*args of scr*)
wneuper@839
    60
  val g_form : ppobj -> cterm'
wneuper@839
    61
  val g_loc : ppobj -> loc
wneuper@839
    62
  val g_met : ppobj -> meth
wneuper@839
    63
  val g_domID : ppobj -> domID
wneuper@839
    64
  val g_metID : ppobj -> metID
wneuper@839
    65
  val g_model : ppobj -> cterm' ppc
wneuper@839
    66
  val g_tac : ppobj -> tac
wneuper@839
    67
  val g_origin : ppobj -> cterm' list * spec
wneuper@839
    68
  val g_ostate : ppobj -> ostate
wneuper@839
    69
  val g_pbl : ppobj -> pblID * item ppc
wneuper@839
    70
  val g_result : ppobj -> cterm'
wneuper@839
    71
  val g_spec : ppobj -> spec
wneuper@839
    72
(*  val get_all : (ppobj -> 'a) -> ptree -> 'a list
wneuper@839
    73
  val get_alls : (ppobj -> 'a) -> ptree list -> 'a list *)
wneuper@839
    74
  val get_obj : (ppobj -> 'a) -> ptree -> pos -> 'a     
wneuper@839
    75
  val gpt_cell : ptree -> cid
wneuper@839
    76
  val par_pblobj : ptree -> pos -> pos
wneuper@839
    77
  val pre_pos : pos -> pos
wneuper@839
    78
  val lev_dn : int list -> int list
wneuper@839
    79
  val lev_on : pos -> posel list
wneuper@839
    80
  val lev_pred : pos -> pos
wneuper@839
    81
  val lev_up : pos -> pos
wneuper@839
    82
(*  val pr_cell : pos -> ppobj -> string
wneuper@839
    83
  val pr_pos : int list -> string        *)
wneuper@839
    84
  val pr_ptree : (pos -> ppobj -> string) -> ptree -> string
wneuper@839
    85
  val pr_short : pos -> ppobj -> string
wneuper@839
    86
(*  val repl : 'a list -> int -> 'a -> 'a list
wneuper@839
    87
  val repl_app : 'a list -> int -> 'a -> 'a list
wneuper@839
    88
  val repl_branch : branch -> ppobj -> ppobj
wneuper@839
    89
  val repl_domID : domID -> ppobj -> ppobj
wneuper@839
    90
  val repl_form : cterm' -> ppobj -> ppobj
wneuper@839
    91
  val repl_met : item ppc -> ppobj -> ppobj
wneuper@839
    92
  val repl_metID : metID -> ppobj -> ppobj
wneuper@839
    93
  val repl_model : cterm' list -> ppobj -> ppobj
wneuper@839
    94
  val repl_tac : tac -> ppobj -> ppobj
wneuper@839
    95
  val repl_pbl : item ppc -> ppobj -> ppobj
wneuper@839
    96
  val repl_pblID : pblID -> ppobj -> ppobj
wneuper@839
    97
  val repl_result : cterm' -> ostate -> ppobj -> ppobj
wneuper@839
    98
  val repl_spec : spec -> ppobj -> ppobj
wneuper@839
    99
  val repl_subs : (string * string) list -> ppobj -> ppobj
wneuper@839
   100
  val test_trans : ppobj -> bool
wneuper@839
   101
  val uni__asm : (string * pos) list -> ppobj -> ppobj
wneuper@839
   102
  val uni__cid : cellID list -> ppobj -> ppobj                 *)
wneuper@839
   103
  val union_asm : ptree -> pos -> (string * pos) list -> ptree
wneuper@839
   104
  val union_cid : ptree -> pos -> cellID list -> ptree
wneuper@839
   105
  val update_branch : ptree -> pos -> branch -> ptree
wneuper@839
   106
  val update_domID : ptree -> pos -> domID -> ptree
wneuper@839
   107
  val update_met : ptree -> pos -> meth -> ptree
wneuper@839
   108
  val update_metppc : ptree -> pos -> item ppc -> ptree
wneuper@839
   109
  val update_metID : ptree -> pos -> metID -> ptree
wneuper@839
   110
  val update_tac : ptree -> pos -> tac -> ptree
wneuper@839
   111
  val update_pbl : ptree -> pos -> pblID * item ppc -> ptree
wneuper@839
   112
  val update_pblppc : ptree -> pos -> item ppc -> ptree
wneuper@839
   113
  val update_pblID : ptree -> pos -> pblID -> ptree
wneuper@839
   114
  val update_spec : ptree -> pos -> spec -> ptree
wneuper@839
   115
  val update_subs : ptree -> pos -> (string * string) list -> ptree
wneuper@839
   116
wneuper@839
   117
  val rep_pblobj : ppobj
wneuper@839
   118
    -> {branch:branch, cell:cid, env:envp, loc:loc, meth:meth, model:cterm' ppc,
wneuper@839
   119
        origin:cterm' list * spec, ostate:ostate, probl:pblID * item ppc,
wneuper@839
   120
        result:cterm', spec:spec}
wneuper@839
   121
  val rep_prfobj : ppobj
wneuper@839
   122
    -> {branch:branch, cell:cid, form:cterm', loc:loc, tac:tac,
wneuper@839
   123
        ostate:ostate, result:cterm'}
wneuper@839
   124
end 
wneuper@839
   125
wneuper@839
   126
(* -------------- 
wneuper@839
   127
structure Ptree (**): PTREE (**) =
wneuper@839
   128
struct
wneuper@839
   129
 -------------- *)
wneuper@839
   130
wneuper@839
   131
type env = (term * term) list;
wneuper@839
   132
wneuper@839
   133
   
wneuper@839
   134
datatype branch = 
wneuper@839
   135
	 NoBranch | AndB | OrB 
wneuper@1360
   136
       | TransitiveB  (* FIXXXME.8.03: set branch from met in Apply_Method
wneuper@1360
   137
                         FIXXXME.0402: -"- in Begin_Trans'*)
wneuper@839
   138
       | SequenceB | IntersectB | CollectB | MapB;
wneuper@839
   139
fun branch2str NoBranch = "NoBranch"
wneuper@839
   140
  | branch2str AndB = "AndB"
wneuper@839
   141
  | branch2str OrB = "OrB"
wneuper@839
   142
  | branch2str TransitiveB = "TransitiveB" 
wneuper@839
   143
  | branch2str SequenceB = "SequenceB"
wneuper@839
   144
  | branch2str IntersectB = "IntersectB"
wneuper@839
   145
  | branch2str CollectB = "CollectB"
wneuper@839
   146
  | branch2str MapB = "MapB";
wneuper@839
   147
wneuper@839
   148
datatype ostate = 
wneuper@1967
   149
    Incomplete | Complete | Inconsistent(*WN041020 latter unused*);
wneuper@839
   150
wneuper@839
   151
type cellID = int;     
wneuper@839
   152
type cid = cellID list;
wneuper@839
   153
wneuper@839
   154
type posel = int;     (* roundabout for (some of) nice signatures *)
wneuper@839
   155
type pos = posel list;
wneuper@2107
   156
val pos2str = ints2str';
wneuper@839
   157
datatype pos_ = 
wneuper@839
   158
    Pbl    (*PblObj-position: problem-type*)
wneuper@839
   159
  | Met    (*PblObj-position: method*)
wneuper@1250
   160
  | Frm    (*PblObj-position: -> Pbl in ME (not by moveDown !)
wneuper@1250
   161
           | PrfObj-position: formula*)
wneuper@839
   162
  | Res    (*PblObj | PrfObj-position: result*)
wneuper@839
   163
  | Und;   (*undefined*)
wneuper@839
   164
fun pos_2str Pbl = "Pbl"
wneuper@839
   165
  | pos_2str Met = "Met"
wneuper@839
   166
  | pos_2str Frm = "Frm"
wneuper@839
   167
  | pos_2str Res = "Res"
wneuper@839
   168
  | pos_2str Und = "Und";
wneuper@839
   169
wneuper@839
   170
type pos' = pos * pos_;
wneuper@1250
   171
(*WN.12.03 remembering interator (pos * pos_) for ptree 
wneuper@1250
   172
	   pos : lev_on, lev_dn, lev_up, 
wneuper@1250
   173
                 lev_onFrm, lev_dnRes (..see solve Apply_Method !) 
wneuper@1250
   174
           pos_:
wneuper@2109
   175
# generate1 sets pos_ if possible  ...?WN0502?NOT...
wneuper@1250
   176
# generate1 does NOT set pos, because certain nodes can be lev_on OR lev_dn
wneuper@1250
   177
                     exceptions: Begin/End_Trans
wneuper@2109
   178
# thus generate(1) called in
wneuper@2109
   179
.# assy, locate_gen 
wneuper@2109
   180
.# nxt_solv (tac_ -cases); general case: 
wneuper@1250
   181
  val pos' = case pos' of (p,Res) => (lev_on p',Res) | _ => pos'
wneuper@2109
   182
# WN050220, S(604):
wneuper@2109
   183
  generate1...(Rewrite(f,..,res))..(pos, pos_)
wneuper@2109
   184
     cappend_atomic.................pos //////  gets f+res always!!!
wneuper@2109
   185
        cut_tree....................pos, pos_ 
wneuper@1250
   186
*)
wneuper@2035
   187
fun pos'2str (p,p_) = pair2str (ints2str' p, pos_2str p_);
wneuper@1967
   188
fun pos's2str ps = (strs2str' o (map pos'2str)) ps;
wneuper@839
   189
val e_pos' = ([],Und):pos';
wneuper@839
   190
wneuper@839
   191
fun res2str (t, ts) = pair2str (term2str t, terms2str ts);
wneuper@839
   192
fun asm2str (t, p:pos) = pair2str (term2str t, ints2str' p);
wneuper@839
   193
fun asms2str asms = (strs2str' o (map asm2str)) asms;
wneuper@839
   194
wneuper@839
   195
wneuper@839
   196
wneuper@839
   197
datatype lrd = (*elements of a path (=loc_) into an Isabelle term*)
wneuper@839
   198
	 L     (*go left at $*) 
wneuper@839
   199
       | R     (*go right at $*)
wneuper@839
   200
       | D;     (*go down at Abs*)
wneuper@839
   201
type loc_ = lrd list;
wneuper@839
   202
fun ldr2str L = "L"
wneuper@839
   203
  | ldr2str R = "R"
wneuper@839
   204
  | ldr2str D = "D";
wneuper@839
   205
fun loc_2str (k:loc_) = (strs2str' o (map ldr2str)) k;
wneuper@839
   206
wneuper@2150
   207
(*26.4.02: never used after introduction of scripts !!!
wneuper@839
   208
type loc =  loc_ *        (* + interpreter-state          *)
wneuper@839
   209
	    (loc_ * rls') (* -"- for script of the ruleset*)
wneuper@839
   210
		option;
wneuper@839
   211
val e_loc = ([],None):loc;
wneuper@2150
   212
val ee_loc = (e_loc,e_loc);*)
wneuper@839
   213
wneuper@839
   214
wneuper@839
   215
datatype safe = Sundef | Safe | Unsafe | Helpless;
wneuper@839
   216
fun safe2str Sundef   = "Sundef"
wneuper@839
   217
  | safe2str Safe     = "Safe"
wneuper@839
   218
  | safe2str Unsafe   = "Unsafe" 
wneuper@839
   219
  | safe2str Helpless = "Helpless";
wneuper@839
   220
wneuper@839
   221
type subs = cterm' list; (*16.11.00 for FE-KE*)
wneuper@839
   222
fun subst2str' thy' (s:subst) =
wneuper@839
   223
  (strs2str o 
wneuper@839
   224
   (map (pair2str o
wneuper@839
   225
	 (apsnd (Sign.string_of_term (sign_of (assoc_thy thy')))) o 
wneuper@839
   226
	 (apfst (Sign.string_of_term (sign_of (assoc_thy thy'))))))) s;
wneuper@839
   227
wneuper@839
   228
type scrstate =       (*state for script interpreter*)
wneuper@1250
   229
	 env(*stack*) (*used to instantiate tac for checking assod
wneuper@1250
   230
		       12.03.noticed: e_ not updated during execution ?!?*)
wneuper@839
   231
	 * loc_       (*location of tac in script*)
wneuper@839
   232
	 * term option(*argument of curried functions*)
wneuper@1399
   233
	 * term       (*value obtained by tac executed
wneuper@1399
   234
		       updated also after a derivation by 'new_val'*)
wneuper@839
   235
	 * safe       (*estimation of how result will be obtained*)
wneuper@839
   236
	 * bool;      (*true = strongly .., false = weakly associated: 
wneuper@839
   237
					    only used during ass_dn/up*)
wneuper@856
   238
val e_scrstate = ([],[],None,e_term,Sundef,false):scrstate;
wneuper@856
   239
wneuper@1399
   240
wneuper@839
   241
(*21.8.02 ---> definitions.sml for datatype scr 
wneuper@839
   242
type rrlsstate =      (*state for reverse rewriting*)
wneuper@839
   243
     (term *          (*the current formula*)
wneuper@839
   244
      rule list      (*of reverse rewrite set (#1#)*)
wneuper@839
   245
	    list *    (*may be serveral, eg. in norm_rational*)
wneuper@839
   246
      (rule *         (*Thm (+ Thm generated from Calc) resulting in ...*)
wneuper@839
   247
       (term *        (*... rewrite with ...*)
wneuper@839
   248
	term list))   (*... assumptions*)
wneuper@839
   249
	  list);      (*derivation from given term to normalform
wneuper@839
   250
		       in reverse order with sym_thm; 
wneuper@839
   251
                       (#1#) could be extracted from here #1*) --------*)
wneuper@839
   252
     
wneuper@839
   253
datatype istate =     (*interpreter state*)
wneuper@1360
   254
	 Uistate                 (*undefined in modspec, in '_deriv'ation*)
wneuper@839
   255
       | ScrState of scrstate    (*for script interpreter*)
wneuper@839
   256
       | RrlsState of rrlsstate; (*for reverse rewriting*)
wneuper@839
   257
type iist = istate option * istate option;
wneuper@839
   258
val e_istate = (ScrState ([],[],None,e_term,Sundef,false)):istate;
wneuper@839
   259
(*val e_iist = (e_istate, e_istate); --- sinnlos f"ur NICHT-equality-type*) 
wneuper@839
   260
fun rta2str (r,(t,a)) = "\n("^(rule2str r)^",("^(term2str t)^", "^
wneuper@839
   261
		      (terms2str a)^"))";
wneuper@1360
   262
fun istate2str Uistate = "Uistate"
wneuper@1360
   263
  | istate2str (ScrState (e,l,to,t,s,b):istate) =
wneuper@839
   264
    "ScrState ("^ subst2str e ^",\n "^ 
wneuper@839
   265
    loc_2str l ^", "^ termopt2str to ^",\n "^
wneuper@839
   266
    term2str t ^", "^ safe2str s ^", "^ bool2str b ^")"
wneuper@839
   267
  | istate2str (RrlsState (t,t1,rss,rtas)) = 
wneuper@839
   268
    "RrlsState ("^(term2str t)^", "^(term2str t1)^", "^
wneuper@839
   269
    ((strs2str o (map (strs2str o (map rule2str)))) rss)^", "^
wneuper@839
   270
    ((strs2str o (map rta2str)) rtas)^")";
wneuper@1399
   271
fun istates2str (None, None) = "(#None, #None)"
wneuper@1399
   272
  | istates2str (None, Some ist) = "(#None,\n#Some "^istate2str ist^")"
wneuper@1399
   273
  | istates2str (Some ist, None) = "(#Some "^istate2str ist^",\n #None)"
wneuper@1399
   274
  | istates2str (Some i1, Some i2) = "(#Some "^istate2str i1^",\n #Some "^
wneuper@1399
   275
				     istate2str i2^")";
wneuper@839
   276
wneuper@1399
   277
fun new_val v (ScrState (env, loc_, topt, _, safe, bool)) =
wneuper@1399
   278
    (ScrState (env, loc_, topt, v, safe, bool))
wneuper@1399
   279
  | new_val _ _ = raise error "new_val: only for ScrState";
wneuper@839
   280
wneuper@839
   281
datatype con = land | lor;
wneuper@839
   282
wneuper@839
   283
wneuper@839
   284
fun subst2subs s = map (pair2str o 
wneuper@839
   285
			(apfst (Sign.string_of_term (sign_of thy))) o
wneuper@839
   286
			(apsnd (Sign.string_of_term (sign_of thy)))) s;
wneuper@839
   287
fun subst2subs' s = map ((apfst (Sign.string_of_term (sign_of thy))) o
wneuper@839
   288
			 (apsnd (Sign.string_of_term (sign_of thy)))) s;
wneuper@839
   289
wneuper@839
   290
wneuper@839
   291
wneuper@839
   292
fun isapair2pair (Const ("Pair",_) $ a $ b) = (a,b);
wneuper@839
   293
fun subs2subst thy s = map (isapair2pair o term_of o the o (parse thy)) s;
wneuper@839
   294
(*> subs2subst thy ["(bdv,x)","(err,#0)"];
wneuper@839
   295
val it =
wneuper@839
   296
  [(Free ("bdv","RealDef.real"),Free ("x","RealDef.real")),
wneuper@839
   297
   (Free ("err","RealDef.real"),Free ("#0","RealDef.real"))] 
wneuper@839
   298
   : (term * term) list*)
wneuper@839
   299
wneuper@839
   300
wneuper@839
   301
wneuper@839
   302
wneuper@839
   303
wneuper@839
   304
wneuper@839
   305
(*FE <-> KE: strings*)
wneuper@839
   306
datatype tac = 
wneuper@839
   307
  Init_Proof of ((cterm' list) * spec) 
wneuper@839
   308
(*Init_Proo_Hid of (dgmode * (cterm' list) * spec) 
wneuper@839
   309
| Init_Proof                                       7.6.02java-sml*)
wneuper@839
   310
| Model_Problem of pblID
wneuper@839
   311
| Refine_Problem of pblID              | Refine_Tacitly of pblID
wneuper@839
   312
(*| Match_Problem of pblID*)
wneuper@839
   313
| Add_Given of cterm'                  | Del_Given of cterm'
wneuper@839
   314
| Add_Find of cterm'                   | Del_Find of cterm'
wneuper@839
   315
| Add_Relation of cterm'               | Del_Relation of cterm'
wneuper@839
   316
wneuper@839
   317
| Specify_Theory of domID              | Specify_Problem of pblID
wneuper@839
   318
| Specify_Method of metID
wneuper@839
   319
| Apply_Method of metID                | Check_Postcond of pblID
wneuper@839
   320
| Free_Solve
wneuper@839
   321
wneuper@839
   322
| Rewrite_Inst of ( subs * thm')       | Rewrite of thm'
wneuper@839
   323
                                       | Rewrite_Asm of thm'
wneuper@839
   324
| Rewrite_Set_Inst of ( subs * rls')   | Rewrite_Set of rls'        
wneuper@1408
   325
| Detail_Set_Inst of ( subs * rls')    | Detail_Set of rls'
wneuper@1327
   326
| End_Detail  (*end of script from next_tac, 
wneuper@1327
   327
                in solve: switches back to parent script*)
wneuper@1360
   328
| Derive of rls' (*an input formula using rls*)
wneuper@839
   329
| Calculate of string                  | End_Ruleset
wneuper@839
   330
            (* plus | minus | times | cancel | pow | sqrt *)
wneuper@839
   331
| Substitute of subs                   | Apply_Assumption of cterm' list
wneuper@839
   332
wneuper@839
   333
| Take of cterm'                       | Take_Inst of cterm'  
wneuper@839
   334
| Group of (con * int list ) 
wneuper@839
   335
(*| Subproblem_Full of (spec * (cterm' list))   *)
wneuper@839
   336
| Subproblem of (domID * pblID)
wneuper@839
   337
| CAScmd of cterm'  (*6.6.02 URD: Function formula *)                   
wneuper@839
   338
| End_Subproblem
wneuper@839
   339
wneuper@839
   340
| Split_And                            | Conclude_And
wneuper@839
   341
| Split_Or                             | Conclude_Or
wneuper@839
   342
| Begin_Trans                          | End_Trans
wneuper@839
   343
| Begin_Sequ                           | End_Sequ(* substitute root.env *)
wneuper@839
   344
| Split_Intersect                      | End_Intersect
wneuper@839
   345
| Check_elementwise of cterm'          | Collect_Trues
wneuper@839
   346
| Or_to_List
wneuper@839
   347
wneuper@839
   348
| Empty_Tac (*TODO.11.6.03 ... of string: could carry msg of (Notappl msg)
wneuper@839
   349
	       in 'helpless'*)
wneuper@839
   350
| Tac of string(* eg.'repeat'*)
wneuper@839
   351
| User (*internal, for ets*)           | End_Proof';(* inout*)
wneuper@839
   352
wneuper@839
   353
wneuper@839
   354
(* tac2str /--> library.sml: needed in dialog.sml for 'separable *)
wneuper@839
   355
fun tac2str (ma:tac) = case ma of
wneuper@839
   356
    Init_Proof (ppc, spec)  => 
wneuper@839
   357
      "Init_Proof "^(pair2str (strs2str ppc, spec2str spec))
wneuper@839
   358
  | Model_Problem pblID     => "Model_Problem "^(strs2str pblID)
wneuper@839
   359
  | Refine_Tacitly pblID    => "Refine_Tacitly "^(strs2str pblID)
wneuper@839
   360
  | Refine_Problem pblID    => "Refine_Problem "^(strs2str pblID)
wneuper@839
   361
(*| Match_Problem pblID     => "Match_Problem "^(strs2str pblID)*)
wneuper@839
   362
  | Add_Given cterm'        => "Add_Given "^cterm'
wneuper@839
   363
  | Del_Given cterm'        => "Del_Given "^cterm'
wneuper@839
   364
  | Add_Find cterm'         => "Add_Find "^cterm'
wneuper@839
   365
  | Del_Find cterm'         => "Del_Find "^cterm'
wneuper@839
   366
  | Add_Relation cterm'     => "Add_Relation "^cterm'
wneuper@839
   367
  | Del_Relation cterm'     => "Del_Relation "^cterm'
wneuper@839
   368
wneuper@839
   369
  | Specify_Theory domID    => "Specify_Theory "^(quote domID    )
wneuper@839
   370
  | Specify_Problem pblID   => "Specify_Problem "^(strs2str pblID )
wneuper@839
   371
  | Specify_Method metID    => "Specify_Method "^(strs2str metID)
wneuper@839
   372
  | Apply_Method metID      => "Apply_Method "^(strs2str metID)
wneuper@839
   373
  | Check_Postcond pblID    => "Check_Postcond "^(strs2str pblID)
wneuper@839
   374
  | Free_Solve              => "Free_Solve"
wneuper@839
   375
wneuper@839
   376
  | Rewrite_Inst (subs,thm')=> 
wneuper@839
   377
      "Rewrite_Inst "^(pair2str (subs2str subs, spair2str thm'))
wneuper@839
   378
  | Rewrite thm'            => "Rewrite "^(spair2str thm')
wneuper@839
   379
  | Rewrite_Asm thm'        => "Rewrite_Asm "^(spair2str thm')
wneuper@839
   380
  | Rewrite_Set_Inst (subs, rls) => 
wneuper@839
   381
      "Rewrite_Set_Inst "^(pair2str (subs2str subs, quote rls))
wneuper@839
   382
  | Rewrite_Set rls         => "Rewrite_Set "^(quote rls    )
wneuper@839
   383
  | Detail_Set rls          => "Detail_Set "^(quote rls    )
wneuper@839
   384
  | Detail_Set_Inst (subs, rls) => 
wneuper@839
   385
      "Detail_Set_Inst "^(pair2str (subs2str subs, quote rls))
wneuper@1408
   386
  | End_Detail              => "End_Detail"
wneuper@1360
   387
  | Derive rls'             => "Derive "^rls' 
wneuper@839
   388
  | Calculate op_           => "Calculate "^op_ 
wneuper@839
   389
  | Substitute subs         => "Substitute "^(subs2str subs)	     
wneuper@839
   390
  | Apply_Assumption ct's   => "Apply_Assumption "^(strs2str ct's)
wneuper@839
   391
wneuper@839
   392
  | Take cterm'             => "Take "^(quote cterm'	)
wneuper@839
   393
  | Take_Inst cterm'        => "Take_Inst "^(quote cterm' )
wneuper@839
   394
  | Group (con, ints)       => 
wneuper@839
   395
      "Group "^(pair2str (con2str con, ints2str ints))
wneuper@839
   396
  | Subproblem (domID, pblID) => 
wneuper@839
   397
      "Subproblem "^(pair2str (domID, strs2str pblID))
wneuper@839
   398
(*| Subproblem_Full (spec, cts') => 
wneuper@839
   399
      "Subproblem_Full "^(pair2str (spec2str spec, strs2str cts'))*)
wneuper@839
   400
  | End_Subproblem          => "End_Subproblem"
wneuper@839
   401
  | CAScmd cterm'           => "CAScmd "^(quote cterm')
wneuper@839
   402
wneuper@839
   403
  | Check_elementwise cterm'=> "Check_elementwise "^(quote cterm') 
wneuper@839
   404
  | Or_to_List              => "Or_to_List "
wneuper@839
   405
  | Collect_Trues           => "Collect_Trues"
wneuper@839
   406
wneuper@839
   407
  | Empty_Tac             => "Empty_Tac"
wneuper@839
   408
  | Tac string            => "Tac "^string
wneuper@839
   409
  | User                    => "User"
wneuper@839
   410
  | End_Proof'              => "tac End_Proof'"
wneuper@839
   411
  | _                       => "tac2str not impl. for ?!";
wneuper@839
   412
wneuper@1327
   413
fun is_rewset (Rewrite_Set_Inst _) = true 
wneuper@1327
   414
  | is_rewset (Rewrite_Set _) = true 
wneuper@1327
   415
  | is_rewset _ = false;
wneuper@839
   416
wneuper@839
   417
fun tac2IDstr (ma:tac) = case ma of
wneuper@839
   418
    Model_Problem _     => "Model_Problem"
wneuper@839
   419
  | Refine_Tacitly pblID    => "Refine_Tacitly"
wneuper@839
   420
  | Refine_Problem pblID    => "Refine_Problem"
wneuper@839
   421
  | Add_Given cterm'        => "Add_Given"
wneuper@839
   422
  | Del_Given cterm'        => "Del_Given"
wneuper@839
   423
  | Add_Find cterm'         => "Add_Find"
wneuper@839
   424
  | Del_Find cterm'         => "Del_Find"
wneuper@839
   425
  | Add_Relation cterm'     => "Add_Relation"
wneuper@839
   426
  | Del_Relation cterm'     => "Del_Relation"
wneuper@839
   427
wneuper@839
   428
  | Specify_Theory domID    => "Specify_Theory"
wneuper@839
   429
  | Specify_Problem pblID   => "Specify_Problem"
wneuper@839
   430
  | Specify_Method metID    => "Specify_Method"
wneuper@839
   431
  | Apply_Method metID      => "Apply_Method"
wneuper@839
   432
  | Check_Postcond pblID    => "Check_Postcond"
wneuper@839
   433
  | Free_Solve              => "Free_Solve"
wneuper@839
   434
wneuper@839
   435
  | Rewrite_Inst (subs,thm')=> "Rewrite_Inst"
wneuper@839
   436
  | Rewrite thm'            => "Rewrite"
wneuper@839
   437
  | Rewrite_Asm thm'        => "Rewrite_Asm"
wneuper@839
   438
  | Rewrite_Set_Inst (subs, rls) => "Rewrite_Set_Inst"
wneuper@839
   439
  | Rewrite_Set rls         => "Rewrite_Set"
wneuper@839
   440
  | Detail_Set rls          => "Detail_Set"
wneuper@839
   441
  | Detail_Set_Inst (subs, rls) => "Detail_Set_Inst"
wneuper@1360
   442
  | Derive rls'             => "Derive "
wneuper@839
   443
  | Calculate op_           => "Calculate "
wneuper@839
   444
  | Substitute subs         => "Substitute" 
wneuper@839
   445
  | Apply_Assumption ct's   => "Apply_Assumption"
wneuper@839
   446
wneuper@839
   447
  | Take cterm'             => "Take"
wneuper@839
   448
  | Take_Inst cterm'        => "Take_Inst"
wneuper@839
   449
  | Group (con, ints)       => "Group"
wneuper@839
   450
  | Subproblem (domID, pblID) => "Subproblem"
wneuper@839
   451
  | End_Subproblem          => "End_Subproblem"
wneuper@839
   452
  | CAScmd cterm'           => "CAScmd"
wneuper@839
   453
wneuper@839
   454
  | Check_elementwise cterm'=> "Check_elementwise"
wneuper@839
   455
  | Or_to_List              => "Or_to_List "
wneuper@839
   456
  | Collect_Trues           => "Collect_Trues"
wneuper@839
   457
wneuper@839
   458
  | Empty_Tac             => "Empty_Tac"
wneuper@839
   459
  | Tac string            => "Tac "
wneuper@839
   460
  | User                    => "User"
wneuper@839
   461
  | End_Proof'              => "End_Proof'"
wneuper@839
   462
  | _                       => "tac2str not impl. for ?!";
wneuper@839
   463
wneuper@839
   464
wneuper@1122
   465
type fmz_ = cterm' list;
wneuper@1122
   466
type fmz = fmz_ * spec;
wneuper@1122
   467
val e_fmz = ([],e_spec);
wneuper@839
   468
wneuper@839
   469
(*tac_ is made from tac in applicable_in,
wneuper@839
   470
  and carries all data necessary for generate;*)
wneuper@839
   471
datatype tac_ = 
wneuper@839
   472
(* datatype tac = *)
wneuper@839
   473
  Init_Proof' of ((cterm' list) * spec)
wneuper@839
   474
                (* ori list !: code specify -> applicable*)
wneuper@856
   475
| Model_Problem' of pblID * 
wneuper@856
   476
		    itm list   (*the 'untouched' pbl*)
wneuper@839
   477
| Refine_Tacitly' of pblID *    (*input*)
wneuper@839
   478
		     pblID *    (*the refined from applicable_in*)
wneuper@839
   479
		     domID *    (*from new pbt?! filled in specify*)
wneuper@839
   480
		     metID *    (*from new pbt?! filled in specify*)
wneuper@856
   481
		     itm list   (*drop ! 9.03: remains [] for
wneuper@856
   482
                                  Model_Problem recognizing its activation*)
wneuper@1050
   483
| Refine_Problem' of (pblID * (itm list * (bool * Term.term) list))
wneuper@1360
   484
 (*FIXME?040215 drop: done automatically in init_proof + Subproblem'*)
wneuper@839
   485
| Add_Given'    of cterm' *
wneuper@839
   486
		   itm list (*updated with input in fun specify_additem*)
wneuper@839
   487
| Add_Find'     of cterm' *
wneuper@839
   488
		   itm list (*updated with input in fun specify_additem*)
wneuper@839
   489
| Add_Relation' of cterm' *
wneuper@839
   490
		 itm list (*updated with input in fun specify_additem*)
wneuper@839
   491
| Del_Given' of cterm'   | Del_Find' of cterm'   | Del_Relation' of cterm'
wneuper@839
   492
  (*4.00.: all..    term: in applicable_in ..? Syn ?only for FormFK?*)
wneuper@839
   493
wneuper@839
   494
| Specify_Theory' of domID              
wneuper@839
   495
| Specify_Problem' of (pblID *        (*               *)
wneuper@839
   496
		       (bool *        (* matches	     *)
wneuper@839
   497
			(itm list *   (* ppc	     *)
wneuper@839
   498
			 (bool * term) list))) (* preconditions *)
wneuper@839
   499
| Specify_Method' of metID *
wneuper@839
   500
		     ori list * (*repl. "#undef"*)
wneuper@839
   501
		     itm list   (*... updated from pbl to met*)
wneuper@1590
   502
| Apply_Method' of metID * 
wneuper@1590
   503
		   (term option) * (*init_form*)
wneuper@1590
   504
		   istate		        
wneuper@839
   505
| Check_Postcond' of 
wneuper@839
   506
  pblID * 
wneuper@839
   507
  (term *      (*returnvalue of script in solve*)
wneuper@839
   508
   cterm' list)(*collect by get_assumptions_ in applicable_in, except if 
wneuper@839
   509
                 butlast tac is Check_elementwise: take only these asms*)
wneuper@839
   510
| Free_Solve'
wneuper@839
   511
wneuper@839
   512
| Rewrite_Inst' of theory' * rew_ord' * rls
wneuper@839
   513
  * bool * subst * thm' * term * (term  * term list)
wneuper@839
   514
                    (*... form * (result* asumpts  ), saves time*)
wneuper@839
   515
| Rewrite' of theory' * rew_ord' * rls * bool * thm' * 
wneuper@839
   516
  term * (term * term list)
wneuper@839
   517
| Rewrite_Asm' of theory' * rew_ord' * rls * bool * thm' * 
wneuper@839
   518
  term * (term * term list)
wneuper@839
   519
| Rewrite_Set_Inst' of theory' * bool * subst * rls * 
wneuper@1408
   520
		       term * (term * term list)
wneuper@1408
   521
| Detail_Set_Inst' of theory' * bool * subst * rls * 
wneuper@1408
   522
		      term * (term * term list)
wneuper@839
   523
| Rewrite_Set' of theory' * bool * rls * term * (term * term list)
wneuper@1408
   524
| Detail_Set' of theory' * bool * rls * term * (term * term list)
wneuper@1360
   525
| End_Detail' of (term * (term list)) (*see End_Trans'*)
wneuper@839
   526
| End_Ruleset' of term
wneuper@1360
   527
| Derive' of rls
wneuper@839
   528
| Calculate' of theory' * string * term * (term * thm') 
wneuper@839
   529
	      (*WN.29.4.03 asm?: * term list??*)
wneuper@839
   530
| Substitute' of subst * term (*10.8.00+..*)* term              
wneuper@839
   531
| Apply_Assumption' of term list * term
wneuper@839
   532
wneuper@839
   533
| Take' of term                         | Take_Inst' of term  
wneuper@839
   534
| Group' of (con * int list * term)
wneuper@839
   535
| Subproblem' of (spec * 
wneuper@1122
   536
		  (ori list) * (*filled in assod Subproblem'*)
wneuper@1122
   537
		  term *       (*-"-, headline of calc-head *)
wneuper@1122
   538
		  fmz_ * 
wneuper@839
   539
		  term)        (*Subproblem(dom,pbl)*)  
wneuper@839
   540
| CAScmd' of term
wneuper@839
   541
| End_Subproblem' of term (*???*)
wneuper@839
   542
| Split_And' of term                    | Conclude_And' of term
wneuper@839
   543
| Split_Or' of term                     | Conclude_Or' of term
wneuper@1360
   544
| Begin_Trans' of term                  | End_Trans' of (term * (term list))
wneuper@839
   545
| Begin_Sequ'                           | End_Sequ'(* substitute root.env*)
wneuper@839
   546
| Split_Intersect' of term              | End_Intersect' of term
wneuper@839
   547
| Check_elementwise' of (*special case:*)
wneuper@839
   548
  term *   (*(1)the current formula: [x=1,x=...]*)
wneuper@839
   549
  string * (*(2)the pred from Check_elementwise   *)
wneuper@839
   550
  (term *  (*(3)composed from (1) and (2): {x. pred}*)
wneuper@839
   551
   term list) (*20.5.03 assumptions*)
wneuper@839
   552
wneuper@839
   553
| Or_to_List' of term * term            (* (a | b, [a,b]) *)
wneuper@839
   554
| Collect_Trues' of term
wneuper@839
   555
wneuper@839
   556
| Empty_Tac_                          | Tac_ of  (*for dummies*)
wneuper@839
   557
                                            theory *
wneuper@839
   558
                                            string * (*form*)
wneuper@839
   559
					    string * (*in Tac*)
wneuper@839
   560
					    string   (*result of Tac".."*)
wneuper@839
   561
| User' (*internal for ets*)            | End_Proof'';(*End_Proof:inout*)
wneuper@839
   562
(*TODO?: done partially for tests*)
wneuper@839
   563
fun tac_2str ma = case ma of
wneuper@839
   564
    Init_Proof' (ppc, spec)  => 
wneuper@839
   565
      "Init_Proof' "^(pair2str (strs2str ppc, spec2str spec))
wneuper@856
   566
  | Model_Problem' (pblID,_)     => "Model_Problem' "^(strs2str pblID )
wneuper@839
   567
  | Refine_Tacitly'(p,prefin,domID,metID,itms)=> 
wneuper@839
   568
    "Refine_Tacitly' ("
wneuper@839
   569
    ^(strs2str p)^", "^(strs2str prefin)^", "
wneuper@839
   570
    ^domID^", "^(strs2str metID)^", pbl-itms)"
wneuper@1050
   571
  | Refine_Problem' ms       => "Refine_Problem' ("^(*matchs2str ms*)"..."^")"
wneuper@839
   572
(*| Match_Problem' (pI, (ok, (itms, pre))) => 
wneuper@839
   573
    "Match_Problem' "^(spair2str (strs2str pI,
wneuper@839
   574
				  spair2str (bool2str ok,
wneuper@839
   575
					     spair2str ("itms2str itms", 
wneuper@839
   576
							"items2str pre"))))*)
wneuper@839
   577
  | Add_Given' cterm'        => "Add_Given' "(*^cterm'*)
wneuper@839
   578
  | Del_Given' cterm'        => "Del_Given' "(*^cterm'*)
wneuper@839
   579
  | Add_Find' cterm'         => "Add_Find' "(*^cterm'*)
wneuper@839
   580
  | Del_Find' cterm'         => "Del_Find' "(*^cterm'*)
wneuper@839
   581
  | Add_Relation' cterm'     => "Add_Relation' "(*^cterm'*)
wneuper@839
   582
  | Del_Relation' cterm'     => "Del_Relation' "(*^cterm'*)
wneuper@839
   583
wneuper@839
   584
  | Specify_Theory' domID    => "Specify_Theory' "^(quote domID    )
wneuper@839
   585
  | Specify_Problem' (pI, (ok, (itms, pre))) => 
wneuper@839
   586
    "Specify_Problem' "^(spair2str (strs2str pI,
wneuper@839
   587
				  spair2str (bool2str ok,
wneuper@839
   588
					     spair2str ("itms2str itms", 
wneuper@839
   589
							"items2str pre"))))
wneuper@839
   590
  | Specify_Method' (pI,oris,itms) => 
wneuper@839
   591
    "Specify_Method' ("^metID2str pI^", "^oris2str oris^", )"
wneuper@839
   592
wneuper@1590
   593
  | Apply_Method' (metID,_,_)      => "Apply_Method' "^(strs2str metID)
wneuper@839
   594
  | Check_Postcond' (pblID,(scval,asm)) => 
wneuper@839
   595
      "Check_Postcond' "^(spair2str(strs2str pblID, 
wneuper@839
   596
				    spair2str (term2str scval, strs2str asm)))
wneuper@839
   597
wneuper@839
   598
  | Free_Solve'              => "Free_Solve'"
wneuper@839
   599
wneuper@839
   600
  | Rewrite_Inst' (*subs,thm'*) _ => 
wneuper@839
   601
      "Rewrite_Inst' "(*^(pair2str (subs2str subs, spair2str thm'))*)
wneuper@839
   602
  | Rewrite' thm'            => "Rewrite' "(*^(spair2str thm')*)
wneuper@839
   603
  | Rewrite_Asm' thm'        => "Rewrite_Asm' "(*^(spair2str thm')*)
wneuper@839
   604
  | Rewrite_Set_Inst' (*subs,thm'*) _ => 
wneuper@839
   605
      "Rewrite_Set_Inst' "(*^(pair2str (subs2str subs, quote rls))*)
wneuper@839
   606
  | Rewrite_Set'(thy',pasm,rls',f,(f',asm))          
wneuper@839
   607
    => "Rewrite_Set' ("^thy'^","^(bool2str pasm)^","^(id_rls rls')^","
wneuper@839
   608
    ^(Sign.string_of_term (sign_of thy) f)^",("^(Sign.string_of_term (sign_of thy) f')
wneuper@839
   609
    ^","^((strs2str o (map (Sign.string_of_term (sign_of thy)))) asm)^"))"
wneuper@839
   610
wneuper@839
   611
  | End_Detail' _             => "End_Detail' xxx"
wneuper@839
   612
  | Detail_Set' _             => "Detail_Set' xxx"
wneuper@839
   613
  | Detail_Set_Inst' _        => "Detail_Set_Inst' xxx"
wneuper@839
   614
wneuper@1360
   615
  | Derive' rls              => "Derive' "^id_rls rls
wneuper@839
   616
  | Calculate'  _            => "Calculate' "
wneuper@839
   617
  | Substitute' subs         => "Substitute' "(*^(subs2str subs)*)    
wneuper@839
   618
  | Apply_Assumption' ct's   => "Apply_Assumption' "(*^(strs2str ct's)*)
wneuper@839
   619
wneuper@839
   620
  | Take' cterm'             => "Take' "(*^(quote cterm'	)*)
wneuper@839
   621
  | Take_Inst' cterm'        => "Take_Inst' "(*^(quote cterm' )*)
wneuper@839
   622
  | Group' (con, ints, _)     => 
wneuper@839
   623
      "Group' "^(pair2str (con2str con, ints2str ints))
wneuper@1122
   624
  | Subproblem' (spec, oris, _,_,pbl_form) => 
wneuper@839
   625
      "Subproblem' "(*^(pair2str (domID, strs2str ,...))*)
wneuper@839
   626
  | End_Subproblem'  _       => "End_Subproblem'"
wneuper@839
   627
  | CAScmd' cterm'           => "CAScmd' "(*^(quote cterm')*)
wneuper@839
   628
wneuper@839
   629
  | Empty_Tac_             => "Empty_Tac_"
wneuper@839
   630
  | User'                    => "User'"
wneuper@839
   631
  | Tac_ (_,form,id,result) => "Tac_ (thy,"^form^","^id^","^result^")"
wneuper@1250
   632
  | _                       => "tac_2str not impl. for arg";
wneuper@839
   633
wneuper@839
   634
(*'executed tactics' (tac_s) with local environment etc.;
wneuper@839
   635
  used for continuing eval script + for generate*)
wneuper@839
   636
type ets =
wneuper@839
   637
    (loc_ *      (* of tactic in scr, tactic (weakly) associated with tac_*)
wneuper@839
   638
     (tac_ * 	 (* (for generate)  *)
wneuper@839
   639
      env *      (* with 'tactic=result' as a rule, tactic ev. _not_ ready:
wneuper@839
   640
		  for handling 'parallel let'*)
wneuper@839
   641
      env *      (* with results of (ready) tacs        *)
wneuper@839
   642
      term *     (* itr_arg of tactic, for upd. env at Repeat, Try*)
wneuper@839
   643
      term * 	 (* result value of the tac         *)
wneuper@839
   644
      safe))
wneuper@839
   645
    list;
wneuper@839
   646
val Ets = []:ets;
wneuper@839
   647
wneuper@839
   648
wneuper@839
   649
fun ets2s (l,(m,eno,env,iar,res,s)) = 
wneuper@839
   650
  "\n("^(loc_2str l)^",("^(tac_2str m)^
wneuper@839
   651
  ",\n  ens= "^(subst2str eno)^
wneuper@839
   652
  ",\n  env= "^(subst2str env)^
wneuper@839
   653
  ",\n  iar= "^(Sign.string_of_term (sign_of thy) iar)^
wneuper@839
   654
  ",\n  res= "^(Sign.string_of_term (sign_of thy) res)^
wneuper@839
   655
  ",\n  "^(safe2str s)^"))";
wneuper@839
   656
fun ets2str (ets:ets) = (strs2str o (map ets2s)) ets;
wneuper@839
   657
wneuper@839
   658
wneuper@2082
   659
type envp =(*9.5.03: unused, delete with field in ptree.PblObj FIXXXME*)
wneuper@839
   660
   (int * term list) list * (*assoc-list: args of met*)
wneuper@839
   661
   (int * rls) list *       (*assoc-list: tacs already done ///15.9.00*)
wneuper@839
   662
   (int * ets) list *       (*assoc-list: tacs etc. already done*)
wneuper@839
   663
   (string * pos) list;     (*asms * from where*)
wneuper@839
   664
val empty_envp = ([],[],[],[]):envp; 
wneuper@839
   665
wneuper@839
   666
datatype ppobj = 
wneuper@839
   667
    PrfObj of {cell  : cid,    (* 4.00 superfluous: use cid in DG only!!*)
wneuper@839
   668
	       form  : term,    
wneuper@1590
   669
	       tac : tac,         (* also in istate*)
wneuper@839
   670
	       loc   : istate option * istate option, (*for form, result 
wneuper@839
   671
13.8.02: (None,None) <==> e_istate ! see update_loc, get_loc*)
wneuper@839
   672
	       branch: branch,
wneuper@839
   673
	       result: term * term list,    
wneuper@839
   674
	                          (*FIXX@ME result:term * term list
wneuper@839
   675
				   => applicable_in =..rewrite_set_
wneuper@839
   676
			           => rls = {erls: rls (NOT rls'),...}*)
wneuper@839
   677
	       ostate: ostate}    (*Complete <=> result is OK*)
wneuper@1104
   678
  | PblObj of {cell  : cid,       (*unused*)
wneuper@1136
   679
	       fmz   : fmz,       (*from init:FIXME never use this spec;-drop*)
wneuper@1122
   680
	       origin: (ori list) * (*representation from fmz+pbt
wneuper@1104
   681
                                  for efficiently adding items in probl, meth*)
wneuper@1122
   682
		       spec *     (*updated by Refine_Tacitly*)
wneuper@1271
   683
		       term,      (*headline of calc-head*)
wneuper@1297
   684
	       spec  : spec,      (*explicitly input*)
wneuper@1104
   685
	       probl : itm list,  (*itms explicitly input*)
wneuper@1104
   686
	       meth  : itm list,  (*itms automatically added to copy of probl*)
wneuper@1590
   687
	       env   : istate option,(*for _sub_problem, if no init_form*)
wneuper@1297
   688
	       loc   : istate option * istate option, (*for pbl+met, result*)
wneuper@839
   689
	       branch: branch,
wneuper@839
   690
	       result: term * term list,
wneuper@1297
   691
	       ostate: ostate};   (*Complete <=> result is _proven_ OK*)
wneuper@839
   692
datatype ptree = 
wneuper@839
   693
    EmptyPtree
wneuper@839
   694
  | Nd of ppobj * (ptree list);
wneuper@839
   695
val e_ptree = EmptyPtree;
wneuper@839
   696
wneuper@839
   697
fun rep_prfobj (PrfObj {cell,form,tac,loc,branch,result,ostate}) =
wneuper@839
   698
  {cell=cell,form=form,tac=tac,loc=loc,branch=branch,result=result,ostate=ostate};
wneuper@1122
   699
fun rep_pblobj (PblObj {cell,origin,fmz,spec,probl,meth,env,
wneuper@839
   700
			loc,branch,result,ostate}) =
wneuper@1122
   701
  {cell=cell,origin=origin,fmz=fmz,spec=spec,probl=probl,meth=meth,
wneuper@839
   702
   env=env,loc=loc,branch=branch,result=result,ostate=ostate};
wneuper@839
   703
fun is_prfobj (PrfObj _) = true
wneuper@839
   704
  | is_prfobj _ =false;
wneuper@839
   705
(*val is_prfobj' = get_obj is_prfobj; *)
wneuper@839
   706
fun is_pblobj (PblObj _) = true
wneuper@839
   707
  | is_pblobj _ = false;
wneuper@839
   708
(*val is_pblobj' = get_obj is_pblobj; 'Error: unbound constructor get_obj'*)
wneuper@839
   709
wneuper@839
   710
wneuper@839
   711
exception PTREE of string;
wneuper@839
   712
fun nth _ []      = raise PTREE "nth _ []"
wneuper@839
   713
  | nth 1 (x::xs) = x
wneuper@839
   714
  | nth n (x::xs) = nth (n-1) xs;
wneuper@839
   715
(*> nth 2 [11,22,33]; -->> val it = 22 : int*)
wneuper@839
   716
wneuper@839
   717
fun lev_up ([]:pos) = raise PTREE "lev_up []"
wneuper@839
   718
  | lev_up p = (drop_last p):pos;
wneuper@839
   719
fun lev_on ([]:pos) = raise PTREE "lev_on []"
wneuper@839
   720
  | lev_on pos = 
wneuper@839
   721
    let val len = length pos
wneuper@839
   722
    in (drop_last pos) @ [(nth len pos)+1] end;
wneuper@839
   723
fun lev_onFrm ((p,_):pos') = (lev_on p,Frm):pos'
wneuper@839
   724
  | lev_onFrm p = raise PTREE ("*** lev_onFrm: pos'="^(pos'2str p));
wneuper@1360
   725
(*040216: for inform --> embed_deriv: remains on same level*)
wneuper@1360
   726
fun lev_back (([],_):pos') = raise PTREE "lev_on_back: called by ([],_)"
wneuper@1360
   727
  | lev_back (p,_) =
wneuper@1360
   728
    if last_elem p <= 1 then (p, Frm):pos' 
wneuper@1360
   729
    else ((drop_last p) @ [(nth (length p) p) - 1], Res);
wneuper@1360
   730
(*.increase pos by n within a level.*)
wneuper@1360
   731
fun pos_plus 0 pos = pos
wneuper@1360
   732
  | pos_plus n ((p,Frm):pos') = pos_plus (n-1) (p, Res)
wneuper@1360
   733
  | pos_plus n ((p,  _):pos') = pos_plus (n-1) (lev_on p, Res);
wneuper@1360
   734
wneuper@1360
   735
wneuper@839
   736
wneuper@839
   737
fun lev_pred ([]:pos) = raise PTREE "lev_pred []"
wneuper@839
   738
  | lev_pred (pos:pos) = 
wneuper@839
   739
    let val len = length pos
wneuper@839
   740
    in ((drop_last pos) @ [(nth len pos)-1]):pos end;
wneuper@839
   741
(*lev_pred [1,2,3];
wneuper@839
   742
val it = [1,2,2] : pos
wneuper@839
   743
> lev_pred [1];
wneuper@839
   744
val it = [0] : pos          *)
wneuper@2090
   745
wneuper@839
   746
fun lev_dn p = p @ [0];
wneuper@839
   747
(*> (lev_dn o lev_on) [1,2,3];
wneuper@839
   748
val it = [1,2,4,0] : pos    *)
wneuper@1250
   749
(*fun lev_dn' ((p,p_):pos') = (lev_dn p, Frm):pos'; WN.3.12.03: never used*)
wneuper@839
   750
fun lev_dnRes ((p,_):pos') = (lev_dn p, Res):pos';
wneuper@839
   751
wneuper@839
   752
(*4.4.00*)
wneuper@839
   753
fun lev_up_ ((p,Res):pos') = (lev_up p,Res):pos'
wneuper@839
   754
  | lev_up_ p' = raise error ("lev_up_: called for "^(pos'2str p'));
wneuper@839
   755
fun lev_dn_ ((p,_):pos') = (lev_dn p,Res):pos'
wneuper@2035
   756
fun ind ((p,_):pos') = length p; (*WN050108 deprecated in favour of lev_of*)
wneuper@2035
   757
fun lev_of ((p,_):pos') = length p;
wneuper@839
   758
wneuper@839
   759
wneuper@839
   760
(** convert ptree to a string **)
wneuper@839
   761
wneuper@839
   762
(* convert a pos from list to string *)
wneuper@839
   763
fun pr_pos ps = (space_implode "." (map string_of_int ps))^".   ";
wneuper@839
   764
(* show hd origin or form only *)
wneuper@1122
   765
fun pr_short (p:pos) (PblObj {origin = (ori,_,_),...}) = 
wneuper@839
   766
  ((pr_pos p) ^ " ----- pblobj -----\n")
wneuper@839
   767
(*   ((((Sign.string_of_term (sign_of thy)) o #4 o hd) ori)^" "^
wneuper@839
   768
    (((Sign.string_of_term (sign_of thy)) o hd(*!?!*) o #5 o hd) ori))^
wneuper@839
   769
   "\n") *)
wneuper@839
   770
  | pr_short p (PrfObj {form = form,...}) =
wneuper@839
   771
  ((pr_pos p) ^ (term2str form) ^ "\n");
wneuper@1122
   772
fun pr_cell (p:pos) (PblObj {cell = c, origin = (ori,_,_),...}) = 
wneuper@839
   773
  ((ints2str c) ^"   "^ 
wneuper@839
   774
   ((((Sign.string_of_term (sign_of thy)) o #4 o hd) ori)^" "^
wneuper@839
   775
    (((Sign.string_of_term (sign_of thy)) o hd(*!?!*) o #5 o hd) ori))^
wneuper@839
   776
   "\n")
wneuper@839
   777
  | pr_cell p (PrfObj {cell = c, form = form,...}) =
wneuper@839
   778
  ((ints2str c) ^"   "^ (term2str form) ^ "\n");
wneuper@839
   779
wneuper@839
   780
wneuper@839
   781
(* convert ptree *)
wneuper@839
   782
fun pr_ptree f pt =
wneuper@839
   783
  let
wneuper@839
   784
    fun pr_pt pfn _  EmptyPtree = ""
wneuper@839
   785
      | pr_pt pfn ps (Nd (b, [])) = pfn ps b
wneuper@839
   786
      | pr_pt pfn ps (Nd (b, ts)) = (pfn ps b)^
wneuper@839
   787
      (prts pfn (ps:pos) 1 ts)
wneuper@839
   788
    and prts pfn ps p [] = ""
wneuper@839
   789
      | prts pfn ps p (t::ts) = (pr_pt pfn (ps @ [p]) t)^
wneuper@839
   790
      (prts pfn ps (p+1) ts)
wneuper@839
   791
  in pr_pt f [] pt end;
wneuper@839
   792
(*
wneuper@839
   793
> fun prfn ps b = (pr_pos ps)^"   "^b(*TODO*)^"\n";
wneuper@839
   794
> val pt = ref EmptyPtree;
wneuper@839
   795
> pt:=Nd("root",
wneuper@839
   796
       [Nd("xx1",[]),
wneuper@839
   797
	Nd("xx2",
wneuper@839
   798
	   [Nd("xx2.1.",[]),
wneuper@839
   799
	    Nd("xx2.2.",[])]),
wneuper@839
   800
	Nd("xx3",[])]);
wneuper@839
   801
> writeln (pr_ptree prfn (!pt));
wneuper@839
   802
*)
wneuper@839
   803
wneuper@839
   804
wneuper@839
   805
(** access the branches of ptree **)
wneuper@839
   806
wneuper@839
   807
fun ins_nth 1 e l  = e::l
wneuper@839
   808
  | ins_nth n e [] = raise PTREE "ins_nth n e []"
wneuper@839
   809
  | ins_nth n e (l::ls) = l::(ins_nth (n-1) e ls);
wneuper@839
   810
fun repl []      _ _ = raise PTREE "repl [] _ _"
wneuper@839
   811
  | repl (l::ls) 1 e = e::ls
wneuper@839
   812
  | repl (l::ls) n e = l::(repl ls (n-1) e);
wneuper@839
   813
fun repl_app ls n e = 
wneuper@839
   814
    let val lim = 1 + length ls
wneuper@839
   815
    in if n > lim then raise PTREE "repl_app: n > lim"
wneuper@839
   816
       else if n = lim then ls @ [e]
wneuper@839
   817
	    else repl ls n e end;
wneuper@839
   818
(*  
wneuper@839
   819
> repl [1,2,3] 2 22222;
wneuper@839
   820
val it = [1,22222,3] : int list
wneuper@839
   821
> repl_app [1,2,3,4] 5 5555;
wneuper@839
   822
val it = [1,2,3,4,5555] : int list
wneuper@839
   823
> repl_app [1,2,3] 2 22222;
wneuper@839
   824
val it = [1,22222,3] : int list
wneuper@839
   825
> repl_app [1] 2 22222 ;
wneuper@839
   826
val it = [1,22222] : int list
wneuper@839
   827
*)
wneuper@839
   828
wneuper@839
   829
wneuper@1967
   830
(*.get from obj at pos by f : ppobj -> 'a.*)
wneuper@839
   831
fun get_obj f EmptyPtree    _      = raise PTREE "get_obj f EmptyPtree"
wneuper@839
   832
  | get_obj f (Nd (b,  _)) []      = f b
wneuper@2108
   833
  | get_obj f (Nd (b, bs)) (p::ps) =
wneuper@2108
   834
(* val (f, Nd (b, bs), (p::ps)) = (I, pt, p);
wneuper@2108
   835
   *)
wneuper@839
   836
  let val _ = (nth p bs) handle _ => raise PTREE ("get_obj: pos = "^
wneuper@839
   837
			   (ints2str' (p::ps))^" does not exist");
wneuper@839
   838
  in (get_obj f (nth p bs) (ps:pos)) 
wneuper@2108
   839
      (*before WN050419: 'wrong type..' raised also if pos doesn't exist*)
wneuper@2108
   840
    handle _ => raise PTREE (*"get_obj: at pos = "^
wneuper@2108
   841
			     (ints2str' (p::ps))^" wrong type of ppobj"*)
wneuper@2108
   842
			  ("get_obj: pos = "^
wneuper@2108
   843
			   (ints2str' (p::ps))^" does not exist")
wneuper@839
   844
  end;
wneuper@839
   845
fun get_nd EmptyPtree _ = raise PTREE "get_nd EmptyPtree"
wneuper@839
   846
  | get_nd n [] = n
wneuper@839
   847
  | get_nd (Nd (_,nds)) (pos as p::(ps:pos)) = (get_nd (nth p nds) ps)
wneuper@839
   848
    handle _ => raise PTREE ("get_nd: not existent pos = "^(ints2str' pos));
wneuper@839
   849
wneuper@839
   850
wneuper@839
   851
(* for use by get_obj *)
wneuper@839
   852
fun g_cell   (PblObj {cell = c,...}) = c
wneuper@839
   853
  | g_cell   (PrfObj {cell = c,...}) = c;
wneuper@839
   854
fun g_form   (PrfObj {form = f,...}) = f
wneuper@2143
   855
  | g_form   (PblObj {origin=(_,_,f),...}) = f;
wneuper@2143
   856
(*  | g_form   _ = raise PTREE "g_form not for PblObj";*)
wneuper@839
   857
fun g_origin (PblObj {origin = ori,...}) = ori
wneuper@839
   858
  | g_origin _ = raise PTREE "g_origin not for PrfObj";
wneuper@1122
   859
fun g_fmz (PblObj {fmz = f,...}) = f
wneuper@1122
   860
  | g_fmz _ = raise PTREE "g_fmz not for PrfObj";
wneuper@839
   861
fun g_spec   (PblObj {spec = s,...}) = s
wneuper@839
   862
  | g_spec _   = raise PTREE "g_spec not for PrfObj";
wneuper@839
   863
fun g_pbl    (PblObj {probl = p,...}) = p
wneuper@839
   864
  | g_pbl  _   = raise PTREE "g_pbl not for PrfObj";
wneuper@839
   865
fun g_met    (PblObj {meth = p,...}) = p
wneuper@839
   866
  | g_met  _   = raise PTREE "g_met not for PrfObj";
wneuper@839
   867
fun g_domID  (PblObj {spec = (d,_,_),...}) = d
wneuper@839
   868
  | g_domID  _ = raise PTREE "g_metID not for PrfObj";
wneuper@839
   869
fun g_metID  (PblObj {spec = (_,_,m),...}) = m
wneuper@839
   870
  | g_metID  _ = raise PTREE "g_metID not for PrfObj";
wneuper@1590
   871
fun g_env    (PblObj {env,...}) = env
wneuper@1590
   872
  | g_env    _ = raise PTREE "g_env not for PrfObj"; 
wneuper@839
   873
fun g_loc    (PblObj {loc = l,...}) = l
wneuper@839
   874
  | g_loc    (PrfObj {loc = l,...}) = l;
wneuper@839
   875
fun g_branch (PblObj {branch = b,...}) = b
wneuper@839
   876
  | g_branch (PrfObj {branch = b,...}) = b;
wneuper@839
   877
fun g_tac  (PblObj {spec = (d,p,m),...}) = Apply_Method m
wneuper@839
   878
  | g_tac  (PrfObj {tac = m,...}) = m;
wneuper@839
   879
fun g_result (PblObj {result = r,...}) = r
wneuper@839
   880
  | g_result (PrfObj {result = r,...}) = r;
wneuper@839
   881
fun g_ostate (PblObj {ostate = r,...}) = r
wneuper@839
   882
  | g_ostate (PrfObj {ostate = r,...}) = r;
wneuper@1600
   883
fun g_ostate' (Nd (PblObj {ostate = r,...}, _)) = r
wneuper@1600
   884
  | g_ostate' (Nd (PrfObj {ostate = r,...}, _)) = r;
wneuper@839
   885
wneuper@839
   886
fun gpt_cell (Nd (PblObj {cell = c,...},_)) = c
wneuper@839
   887
  | gpt_cell (Nd (PrfObj {cell = c,...},_)) = c;
wneuper@839
   888
wneuper@1250
   889
(*in CalcTree/Subproblem an 'just_created_' model is created;
wneuper@1250
   890
  this is filled to 'untouched' by Model/Refine_Problem*)
wneuper@1250
   891
fun just_created_ (PblObj {meth, probl, spec, ...}) = 
wneuper@1250
   892
    null meth andalso null probl andalso spec = e_spec;
wneuper@1250
   893
val e_origin = ([],e_spec,e_term): (ori list) * spec * term;
wneuper@1250
   894
wneuper@1250
   895
fun just_created (pt,(p,_):pos') =
wneuper@1250
   896
    let val ppobj = get_obj I pt p
wneuper@1250
   897
    in is_pblobj ppobj andalso just_created_ ppobj end;
wneuper@1250
   898
wneuper@839
   899
fun existpt pos pt = can (get_obj I pt) pos;
wneuper@839
   900
fun existpt' ((p,p_):pos') pt = 
wneuper@839
   901
    if can (get_obj I pt) p 
wneuper@839
   902
    then case p_ of 
wneuper@839
   903
	     Res => get_obj g_ostate pt p = Complete
wneuper@839
   904
	   | _ => true
wneuper@839
   905
    else false;
wneuper@839
   906
wneuper@2082
   907
fun fst_onlev (([], Frm):pos') = true
wneuper@2090
   908
  | fst_onlev (([], Pbl):pos') = true
wneuper@2090
   909
  | fst_onlev (([], Met):pos') = true
wneuper@2082
   910
  | fst_onlev (pos, Frm) = last_elem pos = 1
wneuper@2082
   911
  | fst_onlev _ = false;
wneuper@2082
   912
fun last_onlev pt pos = not (existpt (lev_on pos) pt);
wneuper@2082
   913
wneuper@2082
   914
wneuper@839
   915
(*.find the position of the next parent which is a PblObj in ptree.*)
wneuper@839
   916
fun par_pblobj pt ([]:pos) = ([]:pos)
wneuper@839
   917
  | par_pblobj pt p =
wneuper@839
   918
    let fun par pt [] = []
wneuper@839
   919
	  | par pt p = if is_pblobj (get_obj I pt p) then p
wneuper@839
   920
		       else par pt (lev_up p)
wneuper@839
   921
    in par pt (lev_up p) end; 
wneuper@839
   922
(* lev_up for hard_gen operating with pos = [...,0] *)
wneuper@839
   923
wneuper@839
   924
(*.find the position and the children of the next parent which is a PblObj.*)
wneuper@839
   925
fun par_children (Nd (PblObj _, children)) ([]:pos) = (children, []:pos)
wneuper@839
   926
  | par_children (pt as Nd (PblObj _, children)) p =
wneuper@839
   927
    let fun par [] = (children, [])
wneuper@839
   928
	  | par p = let val Nd (obj, children) = get_nd pt p
wneuper@839
   929
		    in if is_pblobj obj then (children, p) else par (lev_up p)
wneuper@839
   930
		    end;
wneuper@839
   931
    in par (lev_up p) end; 
wneuper@839
   932
wneuper@839
   933
(*.get the children of a node in ptree.*)
wneuper@839
   934
fun children (Nd (PblObj _, cn)) = cn
wneuper@839
   935
  | children (Nd (PrfObj _, cn)) = cn;
wneuper@839
   936
wneuper@839
   937
wneuper@839
   938
(*.find the next parent, which is either a PblObj (return true)
wneuper@839
   939
  or a PrfObj with tac = Detail_Set (return false).*)
wneuper@839
   940
(*FIXME.3.4.03:re-organize par_pbl_det after rls' --> rls*)
wneuper@839
   941
fun par_pbl_det pt ([]:pos) = (true, []:pos, Erls)
wneuper@839
   942
  | par_pbl_det pt p =
wneuper@839
   943
    let fun par pt [] = (true, [], Erls)
wneuper@839
   944
	  | par pt p = if is_pblobj (get_obj I pt p) then (true, p, Erls)
wneuper@839
   945
		       else case get_obj g_tac pt p of
wneuper@1408
   946
				(*Detail_Set rls' => (false, p, assoc_rls rls')
wneuper@1327
   947
			      (*^^^--- before 040206 after ---vvv*)
wneuper@1408
   948
			      |*)Rewrite_Set rls' => (false, p, assoc_rls rls')
wneuper@1327
   949
			      | Rewrite_Set_Inst (_, rls') => 
wneuper@1327
   950
				(false, p, assoc_rls rls')
wneuper@839
   951
			      | _ => par pt (lev_up p)
wneuper@839
   952
    in par pt (lev_up p) end; 
wneuper@839
   953
wneuper@839
   954
wneuper@839
   955
wneuper@839
   956
wneuper@1967
   957
(*.get from the whole ptree by f : ppobj -> 'a.*)
wneuper@839
   958
fun get_all f EmptyPtree   = []
wneuper@839
   959
  | get_all f (Nd (b, [])) = [f b]
wneuper@839
   960
  | get_all f (Nd (b, bs)) = [f b] @ (get_alls f bs)
wneuper@839
   961
and get_alls f [] = []
wneuper@839
   962
  | get_alls f pts = flat (map (get_all f) pts);
wneuper@839
   963
wneuper@839
   964
wneuper@1408
   965
(*.insert obj b into ptree at pos, ev.overwriting this pos.*)
wneuper@1408
   966
fun insert b EmptyPtree   ([]:pos)  = Nd (b, [])
wneuper@839
   967
  | insert b EmptyPtree    _        = raise PTREE "insert b Empty _"
wneuper@839
   968
  | insert b (Nd ( _,  _)) []       = raise PTREE "insert b _ []"
wneuper@839
   969
  | insert b (Nd (b', bs)) (p::[])  = 
wneuper@839
   970
     Nd (b', repl_app bs p (Nd (b,[]))) 
wneuper@839
   971
  | insert b (Nd (b', bs)) (p::ps)  =
wneuper@1408
   972
     Nd (b', repl_app bs p (insert b (nth p bs) ps));
wneuper@839
   973
(*
wneuper@839
   974
> type ppobj = string;
wneuper@839
   975
> writeln (pr_ptree prfn (!pt));
wneuper@839
   976
  val pt = ref Empty;
wneuper@839
   977
  pt:= insert ("root":ppobj) EmptyPtree [];
wneuper@839
   978
  pt:= insert ("xx1":ppobj) (!pt) [1];
wneuper@839
   979
  pt:= insert ("xx2":ppobj) (!pt) [2];
wneuper@839
   980
  pt:= insert ("xx3":ppobj) (!pt) [3];
wneuper@839
   981
  pt:= insert ("xx2.1":ppobj) (!pt) [2,1];
wneuper@839
   982
  pt:= insert ("xx2.2":ppobj) (!pt) [2,2];
wneuper@839
   983
  pt:= insert ("xx2.1.1":ppobj) (!pt) [2,1,1];
wneuper@839
   984
  pt:= insert ("xx2.1.2":ppobj) (!pt) [2,1,2];
wneuper@839
   985
  pt:= insert ("xx2.1.3":ppobj) (!pt) [2,1,3];
wneuper@839
   986
*)
wneuper@839
   987
wneuper@1408
   988
(*.insert children to a node without children.*)
wneuper@1408
   989
(*compare: fun insert*)
wneuper@1408
   990
fun ins_chn _  EmptyPtree   (_:pos) = raise PTREE "ins_chn: EmptyPtree"
wneuper@1408
   991
  | ins_chn ns (Nd _)       []      = raise PTREE "ins_chn: pos = []"
wneuper@1408
   992
  | ins_chn ns (Nd (b, bs)) (p::[]) =
wneuper@1408
   993
    if p > length bs then raise PTREE "ins_chn: pos not existent"
wneuper@1408
   994
    else let val Nd (b', bs') = nth p bs
wneuper@1408
   995
	 in if null bs' then Nd (b, repl_app bs p (Nd (b', ns)))
wneuper@1408
   996
	    else raise PTREE "ins_chn: pos mustNOT be overwritten" end
wneuper@1408
   997
  | ins_chn ns (Nd (b, bs)) (p::ps) =
wneuper@1408
   998
     Nd (b, repl_app bs p (ins_chn ns (nth p bs) ps));
wneuper@1408
   999
wneuper@1408
  1000
print_depth 11;ins_chn;print_depth 3 (*###insert#########################*);
wneuper@1408
  1001
wneuper@839
  1002
wneuper@839
  1003
(** apply f to obj at pos, f: ppobj -> ppobj **)
wneuper@839
  1004
wneuper@839
  1005
fun appl_to_node f (Nd (b,bs)) = Nd (f b, bs);
wneuper@839
  1006
fun appl_obj f EmptyPtree    []      = EmptyPtree
wneuper@839
  1007
  | appl_obj f EmptyPtree    _       = raise PTREE "appl_obj f Empty _"
wneuper@839
  1008
  | appl_obj f (Nd (b, bs)) []       = Nd (f b, bs)
wneuper@839
  1009
  | appl_obj f (Nd (b, bs)) (p::[])  = 
wneuper@839
  1010
     Nd (b, repl_app bs p (((appl_to_node f) o (nth p)) bs))
wneuper@839
  1011
  | appl_obj f (Nd (b, bs)) (p::ps)  =
wneuper@839
  1012
     Nd (b, repl_app bs p (appl_obj f (nth p bs) (ps:pos)));
wneuper@839
  1013
 
wneuper@839
  1014
(* for use by appl_obj *) 
wneuper@839
  1015
fun repl_form f (PrfObj {cell=c,form= _,tac=tac,loc=loc,
wneuper@839
  1016
			 branch=branch,result=result,ostate=ostate}) =
wneuper@839
  1017
    PrfObj {cell=c,form= f,tac=tac,loc=loc,
wneuper@839
  1018
	    branch=branch,result=result,ostate=ostate}
wneuper@839
  1019
  | repl_form _ _ = raise PTREE "repl_form takes no PblObj";
wneuper@1122
  1020
fun repl_pbl x    (PblObj {cell=cell,origin=origin,fmz=fmz,
wneuper@839
  1021
			   spec=spec,probl=_,meth=meth,env=env,loc=loc,
wneuper@839
  1022
			   branch=branch,result=result,ostate=ostate}) =
wneuper@1122
  1023
  PblObj {cell=cell,origin=origin,fmz=fmz,spec=spec,probl= x,
wneuper@839
  1024
	  meth=meth,env=env,loc=loc,branch=branch,result=result,ostate=ostate}
wneuper@839
  1025
  | repl_pbl _ _ = raise PTREE "repl_pbl takes no PrfObj";
wneuper@1122
  1026
fun repl_met x    (PblObj {cell=cell,origin=origin,fmz=fmz,
wneuper@839
  1027
			   spec=spec,probl=probl,meth=_,env=env,loc=loc,
wneuper@839
  1028
			   branch=branch,result=result,ostate=ostate}) =
wneuper@1122
  1029
  PblObj {cell=cell,origin=origin,fmz=fmz,spec=spec,probl=probl,
wneuper@839
  1030
	  meth= x,env=env,loc=loc,branch=branch,result=result,ostate=ostate}
wneuper@839
  1031
  | repl_met _ _ = raise PTREE "repl_pbl takes no PrfObj";
wneuper@839
  1032
wneuper@1122
  1033
fun repl_spec  x    (PblObj {cell=cell,origin=origin,fmz=fmz,
wneuper@839
  1034
			   spec= _,probl=probl,meth=meth,env=env,loc=loc,
wneuper@839
  1035
			   branch=branch,result=result,ostate=ostate}) =
wneuper@1122
  1036
  PblObj {cell=cell,origin=origin,fmz=fmz,spec= x,probl=probl,
wneuper@839
  1037
	  meth=meth,env=env,loc=loc,branch=branch,result=result,ostate=ostate}
wneuper@839
  1038
  | repl_spec  _ _ = raise PTREE "repl_domID takes no PrfObj";
wneuper@1122
  1039
fun repl_domID x    (PblObj {cell=cell,origin=origin,fmz=fmz,
wneuper@839
  1040
			   spec=(_,p,m),probl=probl,meth=meth,env=env,loc=loc,
wneuper@839
  1041
			   branch=branch,result=result,ostate=ostate}) =
wneuper@1122
  1042
  PblObj {cell=cell,origin=origin,fmz=fmz,spec=(x,p,m),probl=probl,
wneuper@839
  1043
	  meth=meth,env=env,loc=loc,branch=branch,result=result,ostate=ostate}
wneuper@839
  1044
  | repl_domID _ _ = raise PTREE "repl_domID takes no PrfObj";
wneuper@1122
  1045
fun repl_pblID x    (PblObj {cell=cell,origin=origin,fmz=fmz,
wneuper@839
  1046
			   spec=(d,_,m),probl=probl,meth=meth,env=env,loc=loc,
wneuper@839
  1047
			   branch=branch,result=result,ostate=ostate}) =
wneuper@1122
  1048
  PblObj {cell=cell,origin=origin,fmz=fmz,spec=(d,x,m),probl=probl,
wneuper@839
  1049
	  meth=meth,env=env,loc=loc,branch=branch,result=result,ostate=ostate}
wneuper@839
  1050
  | repl_pblID _ _ = raise PTREE "repl_pblID takes no PrfObj";
wneuper@1122
  1051
fun repl_metID x (PblObj {cell=cell,origin=origin,fmz=fmz,
wneuper@839
  1052
			   spec=(d,p,_),probl=probl,meth=meth,env=env,loc=loc,
wneuper@839
  1053
			   branch=branch,result=result,ostate=ostate}) =
wneuper@1122
  1054
  PblObj {cell=cell,origin=origin,fmz=fmz,spec=(d,p,x),probl=probl,
wneuper@839
  1055
	  meth=meth,env=env,loc=loc,branch=branch,result=result,ostate=ostate}
wneuper@839
  1056
  | repl_metID _ _ = raise PTREE "repl_metID takes no PrfObj";
wneuper@839
  1057
wneuper@839
  1058
fun repl_result l f' s (PrfObj {cell=cell,form=form,tac=tac,loc=_,
wneuper@839
  1059
			     branch=branch,result = _ ,ostate = _}) =
wneuper@839
  1060
    PrfObj {cell=cell,form=form,tac=tac,loc= l,
wneuper@839
  1061
	    branch=branch,result = f',ostate = s}
wneuper@1122
  1062
  | repl_result l f' s (PblObj {cell=cell,origin=origin,fmz=fmz,
wneuper@839
  1063
			     spec=spec,probl=probl,meth=meth,env=env,loc=_,
wneuper@839
  1064
			     branch=branch,result= _ ,ostate= _}) =
wneuper@1122
  1065
    PblObj {cell=cell,origin=origin,fmz=fmz,
wneuper@839
  1066
	    spec=spec,probl=probl,meth=meth,env=env,loc= l,
wneuper@839
  1067
	    branch=branch,result= f',ostate= s};
wneuper@839
  1068
wneuper@839
  1069
fun repl_tac x (PrfObj {cell=cell,form=form,tac= _,loc=loc,
wneuper@839
  1070
			  branch=branch,result=result,ostate=ostate}) =
wneuper@839
  1071
    PrfObj {cell=cell,form=form,tac= x,loc=loc,
wneuper@839
  1072
	    branch=branch,result=result,ostate=ostate}
wneuper@839
  1073
  | repl_tac _ _ = raise PTREE "repl_tac takes no PblObj";
wneuper@839
  1074
wneuper@1122
  1075
fun repl_branch b (PblObj {cell=cell,origin=origin,fmz=fmz,
wneuper@839
  1076
			   spec=spec,probl=probl,meth=meth,env=env,loc=loc,
wneuper@839
  1077
			   branch= _,result=result,ostate=ostate}) =
wneuper@1122
  1078
  PblObj {cell=cell,origin=origin,fmz=fmz,spec=spec,probl=probl,
wneuper@839
  1079
	  meth=meth,env=env,loc=loc,branch= b,result=result,ostate=ostate}
wneuper@839
  1080
  | repl_branch b (PrfObj {cell=cell,form=form,tac=tac,loc=loc,
wneuper@839
  1081
			  branch= _,result=result,ostate=ostate}) =
wneuper@839
  1082
    PrfObj {cell=cell,form=form,tac=tac,loc=loc,
wneuper@839
  1083
	    branch= b,result=result,ostate=ostate};
wneuper@839
  1084
wneuper@1590
  1085
fun repl_env e
wneuper@1122
  1086
  (PblObj {cell=cell,origin=origin,fmz=fmz,
wneuper@1590
  1087
	   spec=spec,probl=probl,meth=meth,env=_,loc=loc,
wneuper@839
  1088
	   branch=branch,result=result,ostate=ostate}) =
wneuper@1122
  1089
  PblObj {cell=cell,origin=origin,fmz=fmz,spec=spec,probl=probl,
wneuper@1590
  1090
	  meth=meth,env=e,loc=loc,branch=branch,
wneuper@839
  1091
	  result=result,ostate=ostate}
wneuper@1590
  1092
  | repl_env _ _ = raise PTREE "repl_ets takes no PrfObj";
wneuper@839
  1093
wneuper@839
  1094
fun repl_oris oris
wneuper@1122
  1095
  (PblObj {cell=cell,origin=(_,spe,hdf),fmz=fmz,
wneuper@839
  1096
	   spec=spec,probl=probl,meth=meth,env=env,loc=loc,
wneuper@839
  1097
	   branch=branch,result=result,ostate=ostate}) =
wneuper@1122
  1098
  PblObj{cell=cell,origin=(oris,spe,hdf),fmz=fmz,spec=spec,probl=probl,
wneuper@839
  1099
	  meth=meth,env=env,loc=loc,branch=branch,
wneuper@839
  1100
	  result=result,ostate=ostate}
wneuper@839
  1101
  | repl_oris _ _ = raise PTREE "repl_oris takes no PrfObj";
wneuper@839
  1102
fun repl_orispec spe
wneuper@1122
  1103
  (PblObj {cell=cell,origin=(oris,_,hdf),fmz=fmz,
wneuper@839
  1104
	   spec=spec,probl=probl,meth=meth,env=env,loc=loc,
wneuper@839
  1105
	   branch=branch,result=result,ostate=ostate}) =
wneuper@1122
  1106
  PblObj{cell=cell,origin=(oris,spe,hdf),fmz=fmz,spec=spec,probl=probl,
wneuper@839
  1107
	  meth=meth,env=env,loc=loc,branch=branch,
wneuper@839
  1108
	  result=result,ostate=ostate}
wneuper@839
  1109
  | repl_orispec _ _ = raise PTREE "repl_orispec takes no PrfObj";
wneuper@839
  1110
wneuper@1122
  1111
fun repl_loc l (PblObj {cell=cell,origin=origin,fmz=fmz,
wneuper@839
  1112
			spec=spec,probl=probl,meth=meth,env=env,loc=_,
wneuper@839
  1113
			branch=branch,result=result,ostate=ostate}) =
wneuper@1122
  1114
  PblObj {cell=cell,origin=origin,fmz=fmz,spec=spec,probl=probl,
wneuper@839
  1115
	  meth=meth,env=env,loc=l,branch=branch,result=result,ostate=ostate}
wneuper@839
  1116
  | repl_loc l (PrfObj {cell=cell,form=form,tac=tac,loc=_,
wneuper@839
  1117
			branch=branch,result=result,ostate=ostate}) =
wneuper@839
  1118
  PrfObj {cell=cell,form=form,tac=tac,loc= l,
wneuper@839
  1119
	  branch=branch,result=result,ostate=ostate};
wneuper@839
  1120
wneuper@839
  1121
fun uni__cid cell' 
wneuper@1122
  1122
  (PblObj {cell=cell,origin=origin,fmz=fmz,
wneuper@839
  1123
	   spec=spec,probl=probl,meth=meth,env=env,loc=loc,
wneuper@839
  1124
	   branch=branch,result=result,ostate=ostate}) =
wneuper@1122
  1125
  PblObj {cell=cell union cell',origin=origin,fmz=fmz,spec=spec,probl=probl,
wneuper@839
  1126
	  meth=meth,env=env,loc=loc,branch=branch,
wneuper@839
  1127
	  result=result,ostate=ostate}
wneuper@839
  1128
  | uni__cid cell'
wneuper@839
  1129
  (PrfObj {cell=cell,form=form,tac=tac,loc=loc,
wneuper@839
  1130
	   branch=branch,result=result,ostate=ostate}) =
wneuper@839
  1131
  PrfObj {cell=cell union cell',form=form,tac=tac,loc=loc,
wneuper@839
  1132
	  branch=branch,result=result,ostate=ostate};
wneuper@839
  1133
wneuper@2107
  1134
(*WN050219 put here for interpreting code for cut_tree below...*)
wneuper@2107
  1135
type ocalhd =
wneuper@2107
  1136
     bool *                (*ALL itms+preconds true*)
wneuper@2107
  1137
     pos_ *                (*model belongs to Problem | Method*)
wneuper@2107
  1138
     term *                (*header: Problem... or Cas
wneuper@2107
  1139
				FIXXXME.12.03: item! for marking syntaxerrors*)
wneuper@2107
  1140
     itm list *            (*model: given, find, relate*)
wneuper@2107
  1141
     ((bool * term) list) *(*model: preconds*)
wneuper@2107
  1142
     spec;                 (*specification*)
wneuper@2107
  1143
val e_ocalhd = (false, Und, e_term, [e_itm], [(false, e_term)], e_spec);
wneuper@2107
  1144
wneuper@2107
  1145
datatype ptform =
wneuper@2107
  1146
	 Form of term
wneuper@2107
  1147
       | ModSpec of ocalhd;
wneuper@2107
  1148
val e_ptform = Form e_term;
wneuper@2107
  1149
val e_ptform' = ModSpec e_ocalhd;
wneuper@2107
  1150
wneuper@839
  1151
wneuper@839
  1152
wneuper@1967
  1153
(*.applies (snd f) to the branches at a pos if ((fst f) b),
wneuper@1967
  1154
   f : (ppobj -> bool) * (int -> ptree list -> ptree list).*)
wneuper@839
  1155
wneuper@839
  1156
fun appl_branch f EmptyPtree [] = (EmptyPtree, false)
wneuper@839
  1157
  | appl_branch f EmptyPtree _  = raise PTREE "appl_branch f Empty _"
wneuper@839
  1158
  | appl_branch f (Nd ( _, _)) [] = raise PTREE "appl_branch f _ []"
wneuper@839
  1159
  | appl_branch f (Nd (b, bs)) (p::[]) = 
wneuper@839
  1160
    if (fst f) b then (Nd (b, (snd f) (p:posel) bs), true)
wneuper@839
  1161
    else (Nd (b, bs), false)
wneuper@839
  1162
  | appl_branch f (Nd (b, bs)) (p::ps) =
wneuper@839
  1163
	let val (b',bool) = appl_branch f (nth p bs) ps
wneuper@839
  1164
	in (Nd (b, repl_app bs p b'), bool) end;
wneuper@839
  1165
wneuper@1967
  1166
(* for cut_level;  appl_branch(deprecated) *)
wneuper@839
  1167
fun test_trans (PrfObj{branch = Transitive,...}) = true
wneuper@839
  1168
  | test_trans (PblObj{branch = Transitive,...}) = true
wneuper@839
  1169
  | test_trans _ = false;
wneuper@2112
  1170
wneuper@2077
  1171
fun is_pblobj' pt (p:pos) =
wneuper@2077
  1172
    let val ppobj = get_obj I pt p
wneuper@2077
  1173
    in is_pblobj ppobj end;
wneuper@839
  1174
wneuper@1967
  1175
wneuper@2035
  1176
fun delete_result pt (p:pos) =
wneuper@2035
  1177
    (appl_obj (repl_result (fst (get_obj g_loc pt p), None) 
wneuper@2035
  1178
			   (e_term,[]) Incomplete) pt p);
wneuper@1967
  1179
wneuper@2139
  1180
fun del_res (PblObj {cell, fmz, origin, spec, probl, meth, 
wneuper@2139
  1181
		     env, loc=(l1,_), branch, result, ostate}) =
wneuper@2139
  1182
    PblObj {cell=cell,fmz=fmz,origin=origin,spec=spec,probl=probl,meth=meth,
wneuper@2139
  1183
	    env=env, loc=(l1,None), branch=branch, result=(e_term,[]), 
wneuper@2139
  1184
	    ostate=Incomplete}
wneuper@2107
  1185
wneuper@2139
  1186
  | del_res (PrfObj {cell, form, tac, loc=(l1,_), branch, result, ostate}) =
wneuper@2139
  1187
    PrfObj {cell=cell,form=form,tac=tac, loc=(l1,None), branch=branch, 
wneuper@2139
  1188
	    result=(e_term,[]), ostate=Incomplete};
wneuper@2107
  1189
wneuper@2107
  1190
wneuper@839
  1191
(*
wneuper@1122
  1192
fun update_fmz  pt pos x = appl_obj (repl_fmz  x) pt pos;
wneuper@839
  1193
                                       1.00 not used anymore*)
wneuper@1297
  1194
wneuper@1297
  1195
(*FIXME.WN.12.03: update_X X pos pt -> pt could be chained by o (efficiency?)*)
wneuper@1590
  1196
fun update_env    pt pos x = appl_obj (repl_env    x) pt pos;
wneuper@839
  1197
fun update_domID  pt pos x = appl_obj (repl_domID  x) pt pos;
wneuper@839
  1198
fun update_pblID  pt pos x = appl_obj (repl_pblID  x) pt pos;
wneuper@839
  1199
fun update_metID  pt pos x = appl_obj (repl_metID  x) pt pos;
wneuper@839
  1200
fun update_spec   pt pos x = appl_obj (repl_spec   x) pt pos;
wneuper@839
  1201
wneuper@839
  1202
fun update_pbl    pt pos x = appl_obj (repl_pbl    x) pt pos;
wneuper@839
  1203
fun update_pblppc pt pos x = appl_obj (repl_pbl    x) pt pos;
wneuper@839
  1204
wneuper@839
  1205
fun update_met    pt pos x = appl_obj (repl_met    x) pt pos;
wneuper@839
  1206
(*1.09.01 ----
wneuper@839
  1207
fun update_metppc pt pos x = 
wneuper@839
  1208
  let val {rew_ord'=od,rls'=rs,asm_thm=at,asm_rls=ar,...} =
wneuper@839
  1209
    get_obj g_met pt pos
wneuper@839
  1210
  in appl_obj (repl_met 
wneuper@839
  1211
     {rew_ord'=od,rls'=rs,asm_thm=at,asm_rls=ar,ppc=x}) 
wneuper@839
  1212
    pt pos end;*)
wneuper@839
  1213
fun update_metppc pt pos x = appl_obj (repl_met    x) pt pos;
wneuper@839
  1214
			 			   
wneuper@839
  1215
fun union_cid     pt pos x = appl_obj (uni__cid    x) pt pos;
wneuper@839
  1216
wneuper@839
  1217
fun update_branch pt pos x = appl_obj (repl_branch x) pt pos;
wneuper@839
  1218
fun update_tac  pt pos x = appl_obj (repl_tac  x) pt pos;
wneuper@839
  1219
wneuper@839
  1220
fun update_oris   pt pos x = appl_obj (repl_oris   x) pt pos;
wneuper@839
  1221
fun update_orispec   pt pos x = appl_obj (repl_orispec   x) pt pos;
wneuper@839
  1222
wneuper@839
  1223
 (*done by append_* !! 3.5.02*)
wneuper@839
  1224
fun update_loc pt (p,_) (ScrState ([],[],None,
wneuper@839
  1225
				   Const ("empty",_),Sundef,false)) = 
wneuper@839
  1226
    appl_obj (repl_loc (None,None)) pt p
wneuper@839
  1227
  | update_loc pt (p,Res) x =  
wneuper@839
  1228
    let val (lform,_) = get_obj g_loc pt p
wneuper@839
  1229
    in appl_obj (repl_loc (lform,Some x)) pt p end
wneuper@839
  1230
wneuper@839
  1231
  | update_loc pt (p,_) x = 
wneuper@839
  1232
    let val (_,lres) = get_obj g_loc pt p
wneuper@839
  1233
    in appl_obj (repl_loc (Some x,lres)) pt p end;
wneuper@2152
  1234
(*WN050305 for handling cut_tree in cappend_atomic -- TODO redesign !*)
wneuper@2152
  1235
fun update_loc' pt p iss = appl_obj (repl_loc iss) pt p;
wneuper@839
  1236
wneuper@839
  1237
(*13.8.02---------------------------
wneuper@839
  1238
fun get_loc EmptyPtree _ = None
wneuper@839
  1239
  | get_loc pt (p,Res) =
wneuper@839
  1240
  let val (lfrm,lres) = get_obj g_loc pt p
wneuper@839
  1241
  in if lres = e_istate then lfrm else lres end
wneuper@839
  1242
  | get_loc pt (p,_) =
wneuper@839
  1243
  let val (lfrm,lres) = get_obj g_loc pt p
wneuper@839
  1244
  in if lfrm = e_istate then lres else lfrm end;  5.10.00: too liberal ?*)
wneuper@839
  1245
(*13.8.02: options, because istate is no equalitype any more*)
wneuper@839
  1246
fun get_loc EmptyPtree _ = e_istate
wneuper@839
  1247
  | get_loc pt (p,Res) =
wneuper@839
  1248
    (case get_obj g_loc pt p of
wneuper@839
  1249
	 (Some i, None) => i
wneuper@839
  1250
       | (None  , None) => e_istate
wneuper@839
  1251
       | (_     , Some i) => i)
wneuper@839
  1252
  | get_loc pt (p,_) =
wneuper@839
  1253
    (case get_obj g_loc pt p of
wneuper@839
  1254
	 (None  , Some i) => i (*13.8.02 just copied from ^^^: too liberal ?*)
wneuper@839
  1255
       | (None  , None) => e_istate
wneuper@839
  1256
       | (Some i, _) => i);
wneuper@839
  1257
val get_istate = get_loc; (*3.5.02*)
wneuper@839
  1258
wneuper@839
  1259
(*.collect the assumptions within a problem up to a certain position.*)
wneuper@2082
  1260
type asms = (term * pos) list;(*WN0502 should be (pos' * term) list
wneuper@2082
  1261
				       ...........===^===*)
wneuper@2082
  1262
wneuper@839
  1263
fun get_asm (b:pos, p:pos) (Nd (PblObj {result=(_,asm),...},_)) = 
wneuper@839
  1264
    ((*writeln ("### get_asm PblObj:(b,p)= "^
wneuper@839
  1265
		(pair2str(ints2str b, ints2str p)));*)
wneuper@2082
  1266
     (map (rpair b) asm):asms)
wneuper@839
  1267
  | get_asm (b, p) (Nd (PrfObj {result=(_,asm),...}, [])) = 
wneuper@839
  1268
    ((*writeln ("### get_asm PrfObj []:(b,p)= "^
wneuper@839
  1269
	      (pair2str(ints2str b, ints2str p)));*)
wneuper@839
  1270
     (map (rpair b) asm))
wneuper@839
  1271
  | get_asm (b, p:pos) (Nd (PrfObj _, nds)) = 
wneuper@839
  1272
    let (*val _= writeln ("### get_asm PrfObj nds:(b,p)= "^
wneuper@839
  1273
	      (pair2str(ints2str b, ints2str p)));*)
wneuper@839
  1274
	val levdn = 
wneuper@839
  1275
	    if p <> [] then (b @ [hd p]:pos, tl p:pos) 
wneuper@839
  1276
	    else (b @ [1], [99999]) (*_deeper_ nesting is always _before_ p*)
wneuper@839
  1277
    in gets_asm levdn 1 nds end
wneuper@839
  1278
and gets_asm _ _ [] = []
wneuper@839
  1279
  | gets_asm (b, p' as p::ps) i (nd::nds) = 
wneuper@839
  1280
    if p < i then [] 
wneuper@839
  1281
    else ((*writeln ("### gets_asm: (b,p')= "^(pair2str(ints2str b,
wneuper@839
  1282
						      ints2str p')));*)
wneuper@839
  1283
	  (get_asm (b @ [i], ps) nd) @ (gets_asm (b, p') (i + 1) nds));
wneuper@839
  1284
wneuper@839
  1285
fun get_assumptions_ (Nd (PblObj {result=(r,asm),...}, cn)) (([], _):pos') = 
wneuper@2082
  1286
    if r = e_term then gets_asm ([], [99999]) 1 cn
wneuper@839
  1287
    else map (rpair []) asm
wneuper@839
  1288
  | get_assumptions_ pt (p,p_) =
wneuper@839
  1289
    let val (cn, base) = par_children pt p
wneuper@839
  1290
	val offset = drop (length base, p)
wneuper@839
  1291
	val base' = replicate (length base) 1
wneuper@839
  1292
	val offset' = case p_ of 
wneuper@839
  1293
			 Frm => let val (qs,q) = split_last offset
wneuper@839
  1294
				in qs @ [q - 1] end
wneuper@839
  1295
		       | _ => offset
wneuper@839
  1296
        (*val _= writeln ("... get_assumptions: (b,o)= "^
wneuper@839
  1297
			(pair2str(ints2str base',ints2str offset)))*)
wneuper@839
  1298
    in gets_asm (base', offset) 1 cn end;
wneuper@839
  1299
wneuper@839
  1300
wneuper@839
  1301
(*---------
wneuper@839
  1302
end
wneuper@839
  1303
wneuper@839
  1304
open Ptree;
wneuper@839
  1305
----------*)
wneuper@839
  1306
wneuper@839
  1307
(*pos of the formula on FE relative to the current pos,
wneuper@839
  1308
  which is the next writepos*)
wneuper@839
  1309
fun pre_pos ([]:pos) = []:pos
wneuper@839
  1310
  | pre_pos pp =
wneuper@839
  1311
  let val (ps,p) = split_last pp
wneuper@839
  1312
  in case p of 1 => ps | n => ps @ [n-1] end;
wneuper@839
  1313
wneuper@839
  1314
(*WN.20.5.03 ... but not used*)
wneuper@839
  1315
fun posless [] (_::_) = true
wneuper@839
  1316
  | posless (_::_) [] = false
wneuper@839
  1317
  | posless (p::ps) (q::qs) = if p = q then posless ps qs else p < q;
wneuper@839
  1318
(* posless [2,3,4] [3,4,5];
wneuper@839
  1319
true
wneuper@839
  1320
>  posless [2,3,4] [1,2,3];
wneuper@839
  1321
false
wneuper@839
  1322
>  posless [2,3] [2,3,4];
wneuper@839
  1323
true
wneuper@839
  1324
>  posless [2,3,4] [2,3];
wneuper@839
  1325
false                    
wneuper@839
  1326
>  posless [6] [6,5,2];
wneuper@839
  1327
true
wneuper@839
  1328
+++ see Isabelle/../library.ML*)
wneuper@839
  1329
wneuper@839
  1330
wneuper@2035
  1331
(**.development for extracting an 'interval' from ptree.**)
wneuper@2035
  1332
wneuper@2035
  1333
(*version 1 stopped 8.03 in favour of get_interval with !!!move_dn
wneuper@2035
  1334
  actually used (inefficient) version with move_dn: see modspec.sml*)
wneuper@839
  1335
local
wneuper@839
  1336
wneuper@2035
  1337
fun hdp [] = 1     | hdp [0] = 1     | hdp x = hd x;(*start with first*)
wneuper@2035
  1338
fun hdq	[] = 99999 | hdq [0] = 99999 | hdq x = hd x;(*take until last*)
wneuper@839
  1339
fun tlp [] = [0]     | tlp [_] = [0]     | tlp x = tl x;
wneuper@839
  1340
fun tlq [] = [99999] | tlq [_] = [99999] | tlq x = tl x;
wneuper@839
  1341
wneuper@2035
  1342
fun getnd i (b,p) q (Nd (po, nds)) =
wneuper@2035
  1343
    (if  i <= 0 then [[b]] else []) @
wneuper@2035
  1344
    (getnds (i-1) true (b@[hdp p], tlp p) (tlq q)
wneuper@2035
  1345
	   (take_fromto (hdp p) (hdq q) nds))
wneuper@839
  1346
wneuper@2035
  1347
and getnds _ _ _ _ [] = []                         (*no children*)
wneuper@2035
  1348
  | getnds i _ (b,p) q [nd] = (getnd i (b,p) q nd) (*l+r-margin*)
wneuper@839
  1349
wneuper@2035
  1350
  | getnds i true (b,p) q [n1, n2] =               (*l-margin,  r-margin*)
wneuper@2035
  1351
    (getnd i      (       b, p ) [99999] n1) @
wneuper@2035
  1352
    (getnd ~99999 (lev_on b,[0]) q       n2)
wneuper@839
  1353
wneuper@2035
  1354
  | getnds i _    (b,p) q [n1, n2] =               (*intern,  r-margin*)
wneuper@2035
  1355
    (getnd i      (       b,[0]) [99999] n1) @
wneuper@2035
  1356
    (getnd ~99999 (lev_on b,[0]) q       n2)
wneuper@839
  1357
wneuper@2035
  1358
  | getnds i true (b,p) q (nd::(nds as _::_)) =    (*l-margin, intern*)
wneuper@2035
  1359
    (getnd i             (       b, p ) [99999] nd) @
wneuper@2035
  1360
    (getnds ~99999 false (lev_on b,[0]) q nds)
wneuper@839
  1361
wneuper@2035
  1362
  | getnds i _ (b,p) q (nd::(nds as _::_)) =       (*intern, ...*)
wneuper@2035
  1363
    (getnd i             (       b,[0]) [99999] nd) @
wneuper@2035
  1364
    (getnds ~99999 false (lev_on b,[0]) q nds); 
wneuper@2035
  1365
in
wneuper@2035
  1366
(*get an 'interval from to' from a ptree as 'intervals f t' of respective nodes
wneuper@2035
  1367
  where 'from' are pos, i.e. a key as int list, 'f' an int (to,t analoguous)
wneuper@2035
  1368
(1) the 'f' are given 
wneuper@2035
  1369
(1a) by 'from' if 'f' = the respective element of 'from' (left margin)
wneuper@2035
  1370
(1b) -inifinity, if 'f' > the respective element of 'from' (internal node)
wneuper@2035
  1371
(2) the 't' ar given
wneuper@2035
  1372
(2a) by 'to' if 't' = the respective element of 'to' (right margin)
wneuper@2035
  1373
(2b) inifinity, if 't' < the respective element of 'to (internal node)'
wneuper@2035
  1374
the 'f' and 't' are set by hdp,... *)
wneuper@2035
  1375
fun get_trace pt p q =
wneuper@2035
  1376
    (flat o (getnds ((length p) -1) true ([hdp p], tlp p) (tlq q))) 
wneuper@2035
  1377
	(take_fromto (hdp p) (hdq q) (children pt));
wneuper@2035
  1378
end;
wneuper@2035
  1379
(*WN0510 stoppde this development;
wneuper@2035
  1380
 actually used (inefficient) version with move_dn: getElementsFromTo*)
wneuper@839
  1381
wneuper@839
  1382
wneuper@839
  1383
wneuper@839
  1384
wneuper@839
  1385
fun get_somespec ((dI,pI,mI):spec) ((dI',pI',mI'):spec) =
wneuper@839
  1386
    let val domID = if dI = e_domID
wneuper@839
  1387
		    then if dI' = e_domID 
wneuper@839
  1388
			 then raise error"pt_extract: no domID in probl,origin"
wneuper@839
  1389
			 else dI'
wneuper@839
  1390
		    else dI
wneuper@839
  1391
	val pblID = if pI = e_pblID
wneuper@839
  1392
		    then if pI' = e_pblID 
wneuper@839
  1393
			 then raise error"pt_extract: no pblID in probl,origin"
wneuper@839
  1394
			 else pI'
wneuper@839
  1395
		    else pI
wneuper@839
  1396
	val metID = if mI = e_metID
wneuper@839
  1397
		    then if pI' = e_metID 
wneuper@839
  1398
			 then raise error"pt_extract: no metID in probl,origin"
wneuper@839
  1399
			 else mI'
wneuper@839
  1400
		    else mI
wneuper@839
  1401
    in (domID, pblID, metID):spec end;
wneuper@1399
  1402
fun get_somespec' ((dI,pI,mI):spec) ((dI',pI',mI'):spec) =
wneuper@1399
  1403
    let val domID = if dI = e_domID then dI' else dI
wneuper@1399
  1404
	val pblID = if pI = e_pblID then pI' else pI
wneuper@1399
  1405
	val metID = if mI = e_metID then mI' else mI
wneuper@1399
  1406
    in (domID, pblID, metID):spec end;
wneuper@839
  1407
wneuper@839
  1408
(*extract a formula or model from ptree for itms2itemppc or model2xml*)
wneuper@1171
  1409
fun preconds2str bts = 
wneuper@1171
  1410
    (strs2str o (map (linefeed o pair2str o
wneuper@1171
  1411
		      (apsnd term2str) o 
wneuper@1171
  1412
		      (apfst bool2str)))) bts;
wneuper@1630
  1413
fun ocalhd2str ((b, p, hdf, itms, prec, spec):ocalhd) =
wneuper@1630
  1414
    "("^bool2str b^", "^pos_2str p^", "^term2str hdf^
wneuper@1630
  1415
    ", "^itms2str (assoc_thy "Isac.thy") itms^
wneuper@1171
  1416
    ", "^preconds2str prec^", \n"^spec2str spec^" )";
wneuper@1122
  1417
wneuper@839
  1418
wneuper@839
  1419
wneuper@1327
  1420
fun is_pblnd (Nd (ppobj, _)) = is_pblobj ppobj;
wneuper@839
  1421
wneuper@839
  1422
rgradisc@1162
  1423
(**.functions for the 'ptree iterator' as seen from the FE-Kernel interface.**)
wneuper@839
  1424
wneuper@839
  1425
(*.move one step down into existing nodes of ptree; regard TransitiveB.*)
wneuper@839
  1426
fun move_dn _ (Nd (c, ns)) ([],p_) = (*root problem*)
wneuper@969
  1427
(* val (Nd (c, ns), ([],p_)) = (pt, get_pos cI uI);
wneuper@969
  1428
   *)
wneuper@839
  1429
    if is_pblobj c 
wneuper@1250
  1430
    then case p_ of (*Frm => ([], Pbl) 1.12.03
wneuper@2117
  1431
		  |*) Res => raise PTREE "move_dn: end of calculation"
wneuper@839
  1432
		  | _ => if null ns (*go down from Pbl + Met*)
wneuper@2117
  1433
			 then raise PTREE "move_dn: solve problem not started"
wneuper@839
  1434
			 else ([1], Frm)
wneuper@2117
  1435
    else (case p_ of Res => raise PTREE "move_dn: end of (sub-)tree"
wneuper@2117
  1436
		  | _ => if null ns
wneuper@2117
  1437
			 then raise PTREE "move_dn: pos not existent 1"
wneuper@2117
  1438
			 else ([1], Frm))
wneuper@839
  1439
wneuper@839
  1440
  (*iterate towards end of pos*)
wneuper@1399
  1441
(* val (P,(Nd (_, ns)),(p::(ps as (_::_)),p_)) = ([]:pos, pt, get_pos cI uI);
wneuper@1399
  1442
   val (P,(Nd (_, ns)),(p::(ps as (_::_)),p_)) = ((P@[p]),(nth p ns),(ps, p_));
wneuper@1399
  1443
   *) 
wneuper@1399
  1444
 | move_dn P  (Nd (_, ns)) (p::(ps as (_::_)),p_) =
wneuper@2117
  1445
    if p > length ns then raise PTREE "move_dn: pos not existent 2"
wneuper@856
  1446
    else move_dn ((P@[p]): pos) (nth p ns) (ps, p_)
wneuper@1399
  1447
(* val (P, (Nd (c, ns)), ([p], p_)) = ((P@[p]), (nth p ns), (ps, p_));
wneuper@1590
  1448
   val (P, (Nd (c, ns)), ([p], p_)) = ([],pt,get_pos cI uI);
wneuper@1399
  1449
   *)
wneuper@839
  1450
  | move_dn P (Nd (c, ns)) ([p], p_) = (*act on last element of pos*)
wneuper@2117
  1451
    if p > length ns then raise PTREE "move_dn: pos not existent 3"
wneuper@839
  1452
    else if is_pblnd (nth p ns)  then
wneuper@1267
  1453
	((*writeln("### move_dn: is_pblnd (nth p ns), P= "^ints2str' P^", \n"^
wneuper@856
  1454
		 "length ns= "^((string_of_int o length) ns)^
wneuper@1267
  1455
		 ", p= "^string_of_int p^", p_= "^pos_2str p_);*)
wneuper@1250
  1456
	 case p_ of Res => if p = length ns 
wneuper@1250
  1457
			   then if g_ostate c = Complete then (P, Res)
wneuper@2035
  1458
				else raise PTREE (ints2str' P^" not complete")
wneuper@1327
  1459
			   (*FIXME here handle not-sequent-branches*)
wneuper@1250
  1460
			   else if g_branch c = TransitiveB 
wneuper@1250
  1461
				   andalso (not o is_pblnd o (nth (p+1))) ns
wneuper@1399
  1462
			   then (P@[p+1], Res)
wneuper@1250
  1463
			   else (P@[p+1], if is_pblnd (nth (p+1) ns) 
wneuper@1250
  1464
					  then Pbl else Frm)
wneuper@1250
  1465
		  | _ => if (null o children o (nth p)) ns (*go down from Pbl*)
wneuper@2117
  1466
			 then raise PTREE "move_dn: solve subproblem not started"
wneuper@1250
  1467
			 else (P @ [p, 1], 
wneuper@1250
  1468
			       if (is_pblnd o hd o children o (nth p)) ns
wneuper@1250
  1469
			       then Pbl else Frm)
wneuper@1250
  1470
			      )
wneuper@1600
  1471
    (* val (P, Nd (c, ns), ([p], p_)) = ([], pt, ([1], Frm));
wneuper@1600
  1472
        *)
wneuper@1590
  1473
    else case p_ of Frm => if (null o children o (nth p)) ns 
wneuper@1600
  1474
			 (*then if g_ostate c = Complete then (P@[p],Res)*)
wneuper@1600
  1475
			   then if g_ostate' (nth p ns) = Complete 
wneuper@1600
  1476
				then (P@[p],Res)
wneuper@2117
  1477
				else raise PTREE "move_dn: pos not existent 4"
wneuper@1250
  1478
			   else (P @ [p, 1], (*go down*) 
wneuper@1250
  1479
				 if (is_pblnd o hd o children o (nth p)) ns
wneuper@1250
  1480
				 then Pbl else Frm)
wneuper@856
  1481
		  | Res => if p = length ns 
wneuper@856
  1482
			   then 
wneuper@856
  1483
			      if g_ostate c = Complete then (P, Res)
wneuper@2035
  1484
			      else raise PTREE (ints2str' P^" not complete")
wneuper@856
  1485
			   else 
wneuper@856
  1486
			       if g_branch c = TransitiveB 
wneuper@856
  1487
				  andalso (not o is_pblnd o (nth (p+1))) ns
wneuper@1399
  1488
			       then if (null o children o (nth (p+1))) ns
wneuper@1399
  1489
				    then (P@[p+1], Res)
wneuper@1399
  1490
				    else (P@[p+1,1], Frm)(*040221*)
wneuper@1250
  1491
			       else (P@[p+1], if is_pblnd (nth (p+1) ns) 
wneuper@1250
  1492
					      then Pbl else Frm); 
wneuper@839
  1493
wneuper@1250
  1494
wneuper@1250
  1495
wneuper@1250
  1496
(*.go one level down into ptree.*)
wneuper@839
  1497
fun movelevel_dn [] (Nd (c, ns)) ([],p_) = (*root problem*)
wneuper@839
  1498
    if is_pblobj c 
wneuper@839
  1499
    then if null ns 
wneuper@839
  1500
	 then raise PTREE "solve problem not started"
wneuper@1250
  1501
	 else ([1], if (is_pblnd o hd) ns then Pbl else Frm)
wneuper@839
  1502
    else raise PTREE "pos not existent 1"
wneuper@839
  1503
wneuper@839
  1504
  (*iterate towards end of pos*)
wneuper@839
  1505
  | movelevel_dn P (Nd (_, ns)) (p::(ps as (_::_)),p_) =
wneuper@839
  1506
    if p > length ns then raise PTREE "pos not existent 2"
wneuper@839
  1507
    else movelevel_dn (P@[p]) (nth p ns) (ps, p_)
wneuper@839
  1508
wneuper@839
  1509
  | movelevel_dn P (Nd (c, ns)) ([p], p_) = (*act on last element of pos*)
wneuper@1250
  1510
    if p > length ns then raise PTREE "pos not existent 3" else
wneuper@1250
  1511
    case p_ of Res => 
wneuper@1250
  1512
	       if p = length ns 
wneuper@1250
  1513
	       then raise PTREE "no children"
wneuper@1250
  1514
	       else 
wneuper@1250
  1515
		   if g_branch c = TransitiveB
wneuper@1250
  1516
		   then if (null o children o (nth (p+1))) ns
wneuper@1250
  1517
			then raise PTREE "no children"
wneuper@1250
  1518
			else (P @ [p+1, 1], 
wneuper@1250
  1519
			      if (is_pblnd o hd o children o (nth (p+1))) ns
wneuper@1250
  1520
			      then Pbl else Frm)
wneuper@1250
  1521
		   else if (null o children o (nth p)) ns
wneuper@1250
  1522
		   then raise PTREE "no children"
wneuper@1250
  1523
		   else (P @ [p, 1], if (is_pblnd o hd o children o (nth p)) ns
wneuper@1250
  1524
				     then Pbl else Frm)
wneuper@1250
  1525
	     | _ => if (null o children o (nth p)) ns 
wneuper@1250
  1526
		    then raise PTREE "no children"
wneuper@1250
  1527
		    else (P @ [p, 1], (*go down*)
wneuper@1250
  1528
			  if (is_pblnd o hd o children o (nth p)) ns
wneuper@1250
  1529
			  then Pbl else Frm);
wneuper@1250
  1530
wneuper@1250
  1531
wneuper@839
  1532
wneuper@839
  1533
(*.go to the previous position in ptree; regard TransitiveB.*)
wneuper@839
  1534
fun move_up _ (Nd (c, ns)) (([],p_):pos') = (*root problem*)
wneuper@839
  1535
    if is_pblobj c 
wneuper@1250
  1536
    then case p_ of Res => if null ns then ([], Pbl) (*Res -> Pbl (not Met)!*)
wneuper@839
  1537
			   else ([length ns], Res)
wneuper@1250
  1538
		  | _  => raise PTREE "begin of calculation"
wneuper@839
  1539
    else raise PTREE "pos not existent"
wneuper@839
  1540
wneuper@839
  1541
  | move_up P  (Nd (_, ns)) (p::(ps as (_::_)),p_) = (*iterate to end of pos*)
wneuper@839
  1542
    if p > length ns then raise PTREE "pos not existent"
wneuper@839
  1543
    else move_up (P@[p]) (nth p ns) (ps,p_)
wneuper@839
  1544
wneuper@839
  1545
  | move_up P (Nd (c, ns)) ([p], p_) = (*act on last element of pos*)
wneuper@839
  1546
    if p > length ns then raise PTREE "pos not existent"
wneuper@839
  1547
    else if is_pblnd (nth p ns)  then
wneuper@1250
  1548
	case p_ of Res => 
wneuper@1250
  1549
		   let val nc = (length o children o (nth p)) ns
wneuper@1250
  1550
		   in if nc = 0 then (P@[p], Pbl) (*Res -> Pbl (not Met)!*)
wneuper@1250
  1551
		      else (P @ [p, nc], Res) end (*go down*)
wneuper@1250
  1552
		 | _ => if p = 1 then (P, Pbl) else (P@[p-1], Res) 
wneuper@839
  1553
    else case p_ of Frm => if p <> 1 then (P, Frm) 
wneuper@839
  1554
			  else if is_pblobj c then (P, Pbl) else (P, Frm)
wneuper@839
  1555
		  | Res => 
wneuper@839
  1556
		    let val nc = (length o children o (nth p)) ns
wneuper@839
  1557
		    in if nc = 0 (*cannot go down*)
wneuper@839
  1558
		       then if g_branch c = TransitiveB andalso p <> 1
wneuper@839
  1559
			    then (P@[p-1], Res) else (P@[p], Frm)
wneuper@839
  1560
		       else (P @ [p, nc], Res) end; (*go down*)
wneuper@839
  1561
wneuper@1250
  1562
wneuper@1250
  1563
wneuper@839
  1564
(*.go one level up in ptree; sets the position on Frm.*)
wneuper@839
  1565
fun movelevel_up _ (Nd (c, ns)) (([],p_):pos') = (*root problem*)
wneuper@839
  1566
    raise PTREE "pos not existent"
wneuper@839
  1567
wneuper@839
  1568
  (*iterate towards end of pos*)
wneuper@839
  1569
  | movelevel_up P  (Nd (_, ns)) (p::(ps as (_::_)),p_) = 
wneuper@839
  1570
    if p > length ns then raise PTREE "pos not existent"
wneuper@839
  1571
    else movelevel_up (P@[p]) (nth p ns) (ps,p_)
wneuper@839
  1572
wneuper@839
  1573
  | movelevel_up P (Nd (c, ns)) ([p], p_) = (*act on last element of pos*)
wneuper@839
  1574
    if p > length ns then raise PTREE "pos not existent"
wneuper@839
  1575
    else if is_pblobj c then (P, Pbl) else (P, Frm);
wneuper@839
  1576
wneuper@839
  1577
wneuper@1176
  1578
(*.go to the next calc-head up in the calc-tree.*)
wneuper@1176
  1579
fun movecalchd_up pt ((p, Res):pos') =
wneuper@1176
  1580
    (par_pblobj pt p, Pbl):pos'
wneuper@1176
  1581
  | movecalchd_up pt (p, _) =
wneuper@1176
  1582
    if is_pblobj (get_obj I pt p) 
wneuper@1176
  1583
    then (p, Pbl) else (par_pblobj pt p, Pbl);
wneuper@1176
  1584
 
wneuper@2107
  1585
(*WN0502 made for interSteps; _only_ works for branch TransitiveB*)
wneuper@2090
  1586
fun lev_pred' pt (pos:pos' as (p,Res)) =
wneuper@2090
  1587
    if (is_pblobj o (get_obj I pt)) p then (p,Pbl):pos' else move_up [] pt pos
wneuper@2090
  1588
  | lev_pred' pt p = move_up [] pt p;
wneuper@2090
  1589
wneuper@839
  1590
wneuper@2139
  1591
(**.insert into ctree and cut branches accordingly.**)
wneuper@2139
  1592
  
wneuper@2139
  1593
(*.get all positions of certain intervals on the ctree.*)
wneuper@2139
  1594
(*OLD VERSION without move_dn; kept for occasional redesign
wneuper@2139
  1595
   get all pos's to be cut in a ptree
wneuper@2139
  1596
   below a pos or from a ptree list after i-th element (NO level_up).*)
wneuper@2139
  1597
fun get_allpos' (_:pos, _:posel) EmptyPtree   = ([]:pos' list)
wneuper@2139
  1598
  | get_allpos' (p, 1) (Nd (b, bs)) = (*p is pos of Nd*)
wneuper@2139
  1599
    if g_ostate b = Incomplete 
wneuper@2139
  1600
    then (writeln("get_allpos' (p, 1) Incomplete: p="^ints2str' p);
wneuper@2139
  1601
	  [(p,Frm)] @ (get_allpos's (p, 1) bs)
wneuper@2139
  1602
	  )
wneuper@2139
  1603
    else (writeln("get_allpos' (p, 1) else: p="^ints2str' p);
wneuper@2139
  1604
	  [(p,Frm)] @ (get_allpos's (p, 1) bs) @ [(p,Res)]
wneuper@2139
  1605
	  )
wneuper@2139
  1606
    (*WN041020 here we assume what is presented on the worksheet ?!*)
wneuper@2139
  1607
  | get_allpos' (p, i) (Nd (b, bs)) = (*p is pos of Nd*)
wneuper@2139
  1608
    if length bs > 0 orelse is_pblobj b
wneuper@2139
  1609
    then if g_ostate b = Incomplete 
wneuper@2139
  1610
	 then [(p,Frm)] @ (get_allpos's (p, 1) bs)
wneuper@2139
  1611
	 else [(p,Frm)] @ (get_allpos's (p, 1) bs) @ [(p,Res)]
wneuper@2139
  1612
    else 
wneuper@2139
  1613
	if g_ostate b = Incomplete 
wneuper@2139
  1614
	then []
wneuper@2139
  1615
	else [(p,Res)]
wneuper@2139
  1616
(*WN041020 here we assume what is presented on the worksheet ?!*)
wneuper@2139
  1617
and get_allpos's _ [] = []
wneuper@2139
  1618
  | get_allpos's (p, i) (pt::pts) = (*p is pos of parent-Nd*)
wneuper@2139
  1619
    (get_allpos' (p@[i], i) pt) @ (get_allpos's (p, i+1) pts);
wneuper@839
  1620
wneuper@2139
  1621
(*.get all positions of certain intervals on the ctree.*)
wneuper@2139
  1622
(*NEW version WN050225*)
wneuper@2139
  1623
wneuper@2139
  1624
wneuper@2139
  1625
(*.cut branches.*)
wneuper@2139
  1626
(*before WN041019......
wneuper@2139
  1627
val cut_branch = (test_trans, curry take):
wneuper@2139
  1628
    (ppobj -> bool) * (int -> ptree list -> ptree list);
wneuper@2139
  1629
.. formlery used for ...
wneuper@2139
  1630
fun cut_tree''' _ [] = EmptyPtree
wneuper@2139
  1631
  | cut_tree''' pt pos = 
wneuper@2139
  1632
  let val (pt',cut) = appl_branch cut_branch pt pos
wneuper@2139
  1633
  in if cut andalso length pos > 1 then cut_tree''' pt' (lev_up pos)
wneuper@2139
  1634
     else pt' end;
wneuper@2139
  1635
*)
wneuper@2139
  1636
(*OLD version before WN050225*)
wneuper@2139
  1637
(*WN050106 like cut_level, but deletes exactly 1 node --- for tests ONLY*)
wneuper@2139
  1638
fun cut_level_'_ (_:pos' list) (_:pos) EmptyPtree (_:pos') =
wneuper@2139
  1639
    raise PTREE "cut_level_'_ Empty _"
wneuper@2139
  1640
  | cut_level_'_ _ _ (Nd ( _, _)) ([],_) = raise PTREE "cut_level_'_ _ []"
wneuper@2139
  1641
  | cut_level_'_ cuts P (Nd (b, bs)) (p::[],p_) = 
wneuper@2139
  1642
    if test_trans b 
wneuper@2139
  1643
    then (Nd (b, drop_nth [] (p:posel, bs)),
wneuper@2139
  1644
	  (*     ~~~~~~~~~~~*)
wneuper@2139
  1645
	  cuts @ 
wneuper@2139
  1646
	  (if p_ = Frm then [(P@[p],Res)] else ([]:pos' list)) @
wneuper@2139
  1647
	  (*WN041020 here we assume what is presented on the worksheet ?!*)
wneuper@2139
  1648
	  (get_allpos's (P, p+1) (drop_nth [] (p, bs))))
wneuper@2139
  1649
    (*                            ~~~~~~~~~~~*)
wneuper@2139
  1650
    else (Nd (b, bs), cuts)
wneuper@2139
  1651
  | cut_level_'_ cuts P (Nd (b, bs)) ((p::ps),p_) =
wneuper@2139
  1652
    let val (bs',cuts') = cut_level_'_ cuts P (nth p bs) (ps, p_)
wneuper@2139
  1653
    in (Nd (b, repl_app bs p bs'), cuts @ cuts') end;
wneuper@2139
  1654
wneuper@2139
  1655
(*before WN050219*)
wneuper@2139
  1656
fun cut_level (_:pos' list) (_:pos) EmptyPtree (_:pos') =
wneuper@2139
  1657
    raise PTREE "cut_level EmptyPtree _"
wneuper@2139
  1658
  | cut_level _ _ (Nd ( _, _)) ([],_) = raise PTREE "cut_level _ []"
wneuper@2139
  1659
wneuper@2139
  1660
  | cut_level cuts P (Nd (b, bs)) (p::[],p_) = 
wneuper@2139
  1661
    if test_trans b 
wneuper@2139
  1662
    then (Nd (b, take (p:posel, bs)),
wneuper@2139
  1663
	  cuts @ 
wneuper@2139
  1664
	  (if p_ = Frm andalso (*#*) g_ostate b = Complete
wneuper@2139
  1665
	   then [(P@[p],Res)] else ([]:pos' list)) @
wneuper@2139
  1666
	  (*WN041020 here we assume what is presented on the worksheet ?!*)
wneuper@2139
  1667
	  (get_allpos's (P, p+1) (takerest (p, bs))))
wneuper@2139
  1668
    else (Nd (b, bs), cuts)
wneuper@2139
  1669
wneuper@2139
  1670
  | cut_level cuts P (Nd (b, bs)) ((p::ps),p_) =
wneuper@2139
  1671
    let val (bs',cuts') = cut_level cuts P (nth p bs) (ps, p_)
wneuper@2139
  1672
    in (Nd (b, repl_app bs p bs'), cuts @ cuts') end;
wneuper@2139
  1673
wneuper@2146
  1674
(*OLD version before WN050219, overwritten below*)
wneuper@2139
  1675
fun cut_tree _ (([],_):pos') = raise PTREE "cut_tree _ ([],_)"
wneuper@2139
  1676
  | cut_tree pt (pos as ([p],_)) =
wneuper@2139
  1677
    let	val (pt', cuts) = cut_level ([]:pos' list) [] pt pos
wneuper@2139
  1678
    in (pt', cuts @ (if get_obj g_ostate pt [] = Incomplete 
wneuper@2139
  1679
		     then [] else [([],Res)])) end
wneuper@2139
  1680
  | cut_tree pt (p,p_) =
wneuper@2139
  1681
    let	
wneuper@2139
  1682
	fun cutfn pt cuts (p,p_) = 
wneuper@2139
  1683
	    let val (pt', cuts') = cut_level [] (lev_up p) pt (p,p_)
wneuper@2139
  1684
		val cuts'' = if get_obj g_ostate pt (lev_up p) = Incomplete 
wneuper@2139
  1685
			     then [] else [(lev_up p, Res)]
wneuper@2139
  1686
	    in if length cuts' > 0 andalso length p > 1
wneuper@2139
  1687
	       then cutfn pt' (cuts @ cuts') (lev_up p, Frm(*-->(p,Res)*))
wneuper@2139
  1688
	       else (pt',cuts @ cuts') end
wneuper@2139
  1689
	val (pt', cuts) = cutfn pt [] (p,p_)
wneuper@2139
  1690
    in (pt', cuts @ (if get_obj g_ostate pt [] = Incomplete 
wneuper@2139
  1691
		     then [] else [([], Res)])) end;
wneuper@2139
  1692
wneuper@2139
  1693
wneuper@2151
  1694
(*########/ inserted from ctreeNEW.sml \#################################(**)
wneuper@2139
  1695
wneuper@2146
  1696
(*.get all positions in a ptree until ([],Res) or ostate=Incomplete
wneuper@2146
  1697
val get_allp = fn : 
wneuper@2146
  1698
  pos' list -> : accumulated, start with []
wneuper@2146
  1699
  pos ->       : the offset for subtrees wrt the root
wneuper@2146
  1700
  ptree ->     : (sub)tree
wneuper@2146
  1701
  pos'         : initialization (the last pos' before ...)
wneuper@2146
  1702
  -> pos' list : of positions in this (sub) tree (relative to the root)
wneuper@2146
  1703
.*)
wneuper@2146
  1704
(* val (cuts, P, pt, pos) = ([], [3], get_nd pt [3], ([], Frm):pos');
wneuper@2146
  1705
   val (cuts, P, pt, pos) = ([], [2], get_nd pt [2], ([], Frm):pos');
wneuper@2146
  1706
   length (children pt);
wneuper@2146
  1707
   *)
wneuper@2146
  1708
fun get_allp (cuts:pos' list) (P:pos, pos:pos') pt =
wneuper@2146
  1709
    (let val nxt = move_dn [] pt pos (*exn if Incomplete reached*)
wneuper@2146
  1710
     in if nxt <> ([],Res) 
wneuper@2146
  1711
	then get_allp (cuts @ [nxt]) (P, nxt) pt
wneuper@2146
  1712
	else (map (apfst (curry op@ P)) (cuts @ [nxt])): pos' list
wneuper@2146
  1713
     end) handle PTREE _ => (map (apfst (curry op@ P)) cuts);
wneuper@2139
  1714
wneuper@2139
  1715
wneuper@2146
  1716
(*the pts are assumed to be on the same level*)
wneuper@2146
  1717
fun get_allps (cuts: pos' list) (P:pos) [] = cuts
wneuper@2146
  1718
  | get_allps cuts P (pt::pts) =
wneuper@2146
  1719
    let val below = get_allp [] (P, ([], Frm)) pt
wneuper@2146
  1720
	val levfrm = 
wneuper@2146
  1721
	    if is_pblnd pt 
wneuper@2146
  1722
	    then (P, Pbl)::below
wneuper@2146
  1723
	    else if last_elem P = 1 
wneuper@2146
  1724
	    then (P, Frm)::below
wneuper@2146
  1725
	    else (*Trans*) below
wneuper@2146
  1726
	val levres = levfrm @ (if null below then [(P, Res)] else [])
wneuper@2146
  1727
    in get_allps (cuts @ levres) (lev_on P) pts end;
wneuper@2146
  1728
wneuper@2146
  1729
wneuper@2146
  1730
(**.these 2 funs decide on how far cut_tree goes.**)
wneuper@2146
  1731
(*.shall the nodes _after_ the pos to be inserted at be deleted?.*)
wneuper@2146
  1732
fun test_trans (PrfObj{branch = Transitive,...}) = true
wneuper@2146
  1733
  | test_trans (PrfObj{branch = NoBranch,...}) = true
wneuper@2146
  1734
  | test_trans (PblObj{branch = Transitive,...}) = true 
wneuper@2146
  1735
  | test_trans (PblObj{branch = NoBranch,...}) = true 
wneuper@2146
  1736
  | test_trans _ = false;
wneuper@2146
  1737
(*.shall cutting be continued on the higher level(s)?
wneuper@2146
  1738
   the Nd regarded will NOT be changed.*)
wneuper@2146
  1739
fun cutlevup (PblObj _) = false (*for tests of LK0502*)
wneuper@2146
  1740
  | cutlevup _ = true;
wneuper@2146
  1741
    
wneuper@2146
  1742
(*cut_bottom new S(603)..(608)
wneuper@2146
  1743
cut the level at the bottom of the pos (used by cappend_...)
wneuper@2146
  1744
and handle the parent in order to avoid extra case for root
wneuper@2146
  1745
fn: ptree ->         : the _whole_ ptree for cut_levup
wneuper@2146
  1746
    pos * posel ->   : the pos after split_last
wneuper@2146
  1747
    ptree ->         : the parent of the Nd to be cut
wneuper@2146
  1748
return
wneuper@2146
  1749
    (ptree *         : the updated ptree
wneuper@2146
  1750
     pos' list) *    : the pos's cut
wneuper@2146
  1751
     bool            : cutting shall be continued on the higher level(s)
wneuper@2146
  1752
*)
wneuper@2146
  1753
fun cut_bottom _ (pt' as Nd (b, [])) = ((pt', []), cutlevup b)
wneuper@2146
  1754
  | cut_bottom (P:pos, p:posel) (Nd (b, bs)) =
wneuper@2146
  1755
    let (*divide level into 3 parts...*)
wneuper@2146
  1756
	val keep = take (p - 1, bs)
wneuper@2146
  1757
	val pt' as Nd (_,bs') = nth p bs
wneuper@2146
  1758
	(*^^^^^_here_ will be 'insert'ed by 'append_..'*)
wneuper@2146
  1759
	val (tail, tp) = (takerest (p, bs), 
wneuper@2146
  1760
			  if null (takerest (p, bs)) then 0 else p + 1)
wneuper@2146
  1761
	val (children, cuts) = 
wneuper@2146
  1762
	    if test_trans b
wneuper@2146
  1763
	    then (keep,
wneuper@2146
  1764
		  (if is_pblnd pt' then [(P @ [p], Pbl)] else [])
wneuper@2146
  1765
		  @ (get_allp  [] (P @ [p], (P, Frm)) pt')
wneuper@2146
  1766
		  @ (get_allps [] (P @ [p+1]) tail))
wneuper@2146
  1767
	    else (keep @ [(*'insert'ed by 'append_..'*)] @ tail,
wneuper@2146
  1768
		  get_allp  [] (P @ [p], (P, Frm)) pt')
wneuper@2146
  1769
	val (pt'', cuts) = 
wneuper@2146
  1770
	    if cutlevup b
wneuper@2146
  1771
	    then (Nd (del_res b, children), 
wneuper@2146
  1772
		  cuts @ (if g_ostate b = Incomplete then [] else [(P,Res)]))
wneuper@2146
  1773
	    else (Nd (b, children), cuts)
wneuper@2146
  1774
	(*val _= writeln("####cut_bottom (P, p)="^pos2str (P @ [p])^
wneuper@2146
  1775
		       ", Nd=.............................................")
wneuper@2146
  1776
	val _= show_pt pt''
wneuper@2146
  1777
	val _= writeln("####cut_bottom form='"^
wneuper@2146
  1778
		       term2str (get_obj g_form pt'' []))
wneuper@2146
  1779
	val _= writeln("####cut_bottom cuts#="^string_of_int (length cuts)^
wneuper@2146
  1780
		       ", cuts="^pos's2str cuts)*)
wneuper@2146
  1781
    in ((pt'', cuts:pos' list), cutlevup b) end;
wneuper@2146
  1782
print_depth 3;
wneuper@2146
  1783
wneuper@2146
  1784
wneuper@2146
  1785
(*.go all levels from the bottom of 'pos' up to the root, 
wneuper@2146
  1786
 on each level compose the children of a node and accumulate the cut Nds
wneuper@2146
  1787
args
wneuper@2146
  1788
   pos' list ->      : for accumulation
wneuper@2146
  1789
   bool -> 	     : cutting shall be continued on the higher level(s)
wneuper@2146
  1790
   ptree -> 	     : the whole ptree for 'get_nd pt P' on each level
wneuper@2146
  1791
   ptree -> 	     : the Nd from the lower level for insertion at path
wneuper@2146
  1792
   pos * posel ->    : pos=path split for convenience
wneuper@2146
  1793
   ptree -> 	     : Nd the children of are under consideration on this call 
wneuper@2146
  1794
returns		     :
wneuper@2146
  1795
   ptree * pos' list : the updated parent-Nd and the pos's of the Nds cut
wneuper@2146
  1796
.*)
wneuper@2146
  1797
print_depth 99;
wneuper@2146
  1798
fun cut_levup (cuts:pos' list) clevup pt pt' (P:pos, p:posel) (Nd (b, bs)) =
wneuper@2146
  1799
    let (*divide level into 3 parts...*)
wneuper@2146
  1800
	val keep = take (p - 1, bs)
wneuper@2146
  1801
	(*val pt' comes as argument from below*)
wneuper@2146
  1802
	val (tail, tp) = (takerest (p, bs), 
wneuper@2146
  1803
			  if null (takerest (p, bs)) then 0 else p + 1)
wneuper@2146
  1804
	val (children, cuts') = 
wneuper@2146
  1805
	    if clevup
wneuper@2146
  1806
	    then (keep @ [pt'], get_allps [] (P @ [p+1]) tail)
wneuper@2146
  1807
	    else (keep @ [pt'] @ tail, [])
wneuper@2146
  1808
	val clevup' = if clevup then cutlevup b else false 
wneuper@2146
  1809
	(*the first Nd with false stops cutting on all levels above*)
wneuper@2146
  1810
	val (pt'', cuts') = 
wneuper@2146
  1811
	    if clevup'
wneuper@2146
  1812
	    then (Nd (del_res b, children), 
wneuper@2146
  1813
		  cuts' @ (if g_ostate b = Incomplete then [] else [(P,Res)]))
wneuper@2146
  1814
	    else (Nd (b, children), cuts')
wneuper@2146
  1815
	(*val _= writeln("#####cut_levup clevup= "^bool2str clevup)
wneuper@2146
  1816
	val _= writeln("#####cut_levup cutlevup b= "^bool2str (cutlevup b))
wneuper@2146
  1817
	val _= writeln("#####cut_levup (P, p)="^pos2str (P @ [p])^
wneuper@2146
  1818
		       ", Nd=.............................................")
wneuper@2146
  1819
	val _= show_pt pt''
wneuper@2146
  1820
	val _= writeln("#####cut_levup form='"^
wneuper@2146
  1821
		       term2str (get_obj g_form pt'' []))
wneuper@2146
  1822
	val _= writeln("#####cut_levup cuts#="^string_of_int (length cuts)^
wneuper@2146
  1823
		       ", cuts="^pos's2str cuts)*)
wneuper@2146
  1824
    in if null P then (pt'', (cuts @ cuts'):pos' list)
wneuper@2146
  1825
       else let val (P, p) = split_last P
wneuper@2146
  1826
	    in cut_levup (cuts @ cuts') clevup' pt pt'' (P, p) (get_nd pt P)
wneuper@2146
  1827
	    end
wneuper@2146
  1828
    end;
wneuper@2152
  1829
 
wneuper@2146
  1830
wneuper@2146
  1831
fun cut_tree pt (pos,_) =
wneuper@2146
  1832
    if not (existpt pos pt) 
wneuper@2146
  1833
    then (pt,[]) (*appending a formula never cuts anything*)
wneuper@2146
  1834
    else let val (P, p) = split_last pos
wneuper@2146
  1835
	     val ((pt', cuts), clevup) = cut_bottom (P, p) (get_nd pt P)
wneuper@2146
  1836
	 (*        pt' is the updated parent of the Nd to cappend_..*)
wneuper@2146
  1837
	 in if null P then (pt', cuts)
wneuper@2146
  1838
	    else let val (P, p) = split_last P
wneuper@2146
  1839
		 in cut_levup cuts clevup pt pt' (P, p) (get_nd pt P)
wneuper@2146
  1840
		 end
wneuper@2146
  1841
	 end;
wneuper@2146
  1842
print_depth 3;
wneuper@2151
  1843
(**)########\ inserted from ctreeNEW.sml /#################################**)
wneuper@2139
  1844
wneuper@2139
  1845
fun append_atomic p l f r f' s pt = 
wneuper@2146
  1846
  let (**)val _= writeln("#@append_atomic: pos ="^pos2str p)(**)
wneuper@2146
  1847
	val (iss, f) = if existpt p pt andalso get_obj g_tac pt p=Empty_Tac
wneuper@2139
  1848
		     then (*after Take*)
wneuper@2139
  1849
			 ((fst (get_obj g_loc pt p), Some l), 
wneuper@2139
  1850
			  get_obj g_form pt p) 
wneuper@2139
  1851
(*040223	     else ((Some l, None), f)*)
wneuper@2139
  1852
		     else ((None, Some l), f)
wneuper@2139
  1853
  in insert (PrfObj {cell = [(*3.00. unused*)],
wneuper@2139
  1854
		     form  = f,
wneuper@2139
  1855
		     tac  = r,
wneuper@2139
  1856
		     loc   = iss,
wneuper@2139
  1857
		     branch= NoBranch,
wneuper@2139
  1858
		     result= f',
wneuper@2139
  1859
		     ostate= s}) pt p end;
wneuper@2139
  1860
wneuper@2139
  1861
(*20.8.02: cappend_* FIXXXXME cut branches below cannot be decided here:
wneuper@2139
  1862
  detail - generate - cappend: inserted, not appended !!!
wneuper@2139
  1863
wneuper@2139
  1864
  cut decided in applicable_in !?!
wneuper@2139
  1865
*)
wneuper@2139
  1866
fun cappend_atomic pt p loc f r f' s = 
wneuper@2139
  1867
(* val (pt, p, loc, f, r, f', s) = 
wneuper@2139
  1868
       (pt,p,l,f,Rewrite_Set_Inst (subst2subs subs',id_rls rls'),
wneuper@2139
  1869
	(f',asm),Complete);
wneuper@2139
  1870
   *)
wneuper@2146
  1871
(writeln("##@cappend_atomic: pos ="^pos2str p);
wneuper@2139
  1872
  apfst (append_atomic p loc f r f' s) (cut_tree pt (p,Frm))
wneuper@2139
  1873
);
wneuper@2150
  1874
fun cappend_atomic pt p loc f r f' s = 
wneuper@2152
  1875
let val _= writeln("##@cappend_atomic: pos ="^pos2str p);
wneuper@2152
  1876
    val _= writeln("##@cappend_atomic arg loc ="^istate2str loc);
wneuper@2152
  1877
    val _= if existpt  p pt
wneuper@2152
  1878
	   then writeln("##@cappend_atomic before cut_ loc ="^
wneuper@2152
  1879
			istates2str (get_obj g_loc pt p))
wneuper@2152
  1880
	   else  writeln("##@cappend_atomic pos not existent before cut_");
wneuper@2152
  1881
    val (pt', cs) = cut_tree pt (p,Frm);
wneuper@2152
  1882
    val _= if existpt  p pt'
wneuper@2152
  1883
	   then writeln("##@cappend_atomic after cut_ loc ="^
wneuper@2152
  1884
		   istates2str (get_obj g_loc pt' p))
wneuper@2152
  1885
	   else  writeln("##@cappend_atomic pos not existent after cut_");
wneuper@2152
  1886
    val pt'' = append_atomic p loc f r f' s pt';
wneuper@2152
  1887
    val _= writeln("##@cappend_atomic after append: loc ="^
wneuper@2152
  1888
		   istates2str (get_obj g_loc pt'' p));
wneuper@2152
  1889
in (pt'', cs) end;
wneuper@2152
  1890
wneuper@2152
  1891
fun cappend_atomic pt p loc f r f' s = 
wneuper@2152
  1892
let val (pt', cs) = cut_tree pt (p,Frm)
wneuper@2150
  1893
    val pt'' = append_atomic p loc f r f' s pt'
wneuper@2150
  1894
in (pt'', cs) end;
wneuper@2139
  1895
wneuper@2152
  1896
fun cappend_atomic pt p ist_res f r f' s = 
wneuper@2152
  1897
    if existpt p pt andalso get_obj g_tac pt p=Empty_Tac
wneuper@2152
  1898
    then (*after Take: transfer Frm and respective istate*)
wneuper@2152
  1899
	let val (ist_form, f) = (get_loc pt (p,Frm), 
wneuper@2152
  1900
				 get_obj g_form pt p)
wneuper@2152
  1901
	    val (pt, cs) = cut_tree pt (p,Frm)
wneuper@2152
  1902
	    val pt = append_atomic p e_istate f r f' s pt
wneuper@2152
  1903
	    val pt = update_loc' pt p (Some ist_form, Some ist_res)
wneuper@2152
  1904
	in (pt, cs) end
wneuper@2152
  1905
    else apfst (append_atomic p ist_res f r f' s) (cut_tree pt (p,Frm));
wneuper@2152
  1906
wneuper@2152
  1907
wneuper@2139
  1908
(* called by Take *)
wneuper@2139
  1909
fun append_form p l f pt = 
wneuper@2146
  1910
(writeln("##@append_form: pos ="^pos2str p);
wneuper@2139
  1911
  insert (PrfObj {cell = [(*3.00. unused*)],
wneuper@2139
  1912
		  form  = (*if existpt p pt 
wneuper@2139
  1913
		  andalso get_obj g_tac pt p = Empty_Tac 
wneuper@2139
  1914
			    (*distinction from 'old' (+complete!) pobjs*)
wneuper@2139
  1915
			    then get_obj g_form pt p else*) f,
wneuper@2139
  1916
		  tac  = Empty_Tac,
wneuper@2139
  1917
		  loc   = (Some l, None),
wneuper@2139
  1918
		  branch= NoBranch,
wneuper@2139
  1919
		  result= (e_term,[]),
wneuper@2139
  1920
		  ostate= Incomplete}) pt p
wneuper@2139
  1921
);
wneuper@2139
  1922
(* val (p,loc,f) = ([1], e_istate, str2term "x + 1 = 2");
wneuper@2139
  1923
   val (p,loc,f) = (fst p, e_istate, str2term "-1 + x = 0");
wneuper@2139
  1924
   *)
wneuper@2139
  1925
fun cappend_form pt p loc f =
wneuper@2146
  1926
(writeln("##@cappend_form: pos ="^pos2str p);
wneuper@2139
  1927
  apfst (append_form p loc f) (cut_tree pt (p,Frm))
wneuper@2139
  1928
);
wneuper@2150
  1929
fun cappend_form pt p loc f =
wneuper@2150
  1930
let val _= writeln("##@cappend_form: pos ="^pos2str p)
wneuper@2150
  1931
    val _= writeln("##@cappend_form before cut_tree: loc ="^istate2str loc)
wneuper@2150
  1932
    val (pt', cs) = cut_tree pt (p,Frm)
wneuper@2150
  1933
    val pt'' = append_form p loc f pt'
wneuper@2150
  1934
    val _= writeln("##@cappend_form after append: loc ="^
wneuper@2150
  1935
		   istates2str (get_obj g_loc pt'' p))
wneuper@2150
  1936
in (pt'', cs) end;
wneuper@2139
  1937
wneuper@2139
  1938
wneuper@2139
  1939
    
wneuper@2139
  1940
fun append_result pt p l f s =
wneuper@2146
  1941
(writeln("##@append_result: pos ="^pos2str p);
wneuper@2139
  1942
    (appl_obj (repl_result (fst (get_obj g_loc pt p),
wneuper@2139
  1943
			    Some l) f s) pt p, [])
wneuper@2139
  1944
);
wneuper@2139
  1945
wneuper@2139
  1946
wneuper@2139
  1947
(*WN041022 deprecated, still for kbtest/diffapp.sml, /systest/root-equ.sml*)
wneuper@2139
  1948
fun append_parent p l f r b pt = 
wneuper@2139
  1949
  let val _= writeln("###append_parent: pos ="^pos2str p);
wneuper@2139
  1950
    val (ll,f) = if existpt p pt andalso get_obj g_tac pt p=Empty_Tac
wneuper@2139
  1951
		  then ((fst (get_obj g_loc pt p), Some l), 
wneuper@2139
  1952
			get_obj g_form pt p) 
wneuper@2139
  1953
		 else ((Some l, None), f)
wneuper@2139
  1954
  in insert (PrfObj 
wneuper@2139
  1955
	  {cell = [(*unused*)],
wneuper@2139
  1956
	   form  = f,
wneuper@2139
  1957
	   tac  = r,
wneuper@2139
  1958
	   loc   = ll,
wneuper@2139
  1959
	   branch= b,
wneuper@2139
  1960
	   result= (e_term,[]),
wneuper@2139
  1961
	   ostate= Incomplete}) pt p end;
wneuper@2139
  1962
fun cappend_parent pt p loc f r b =
wneuper@2139
  1963
(writeln("###cappend_parent: pos ="^pos2str p);
wneuper@2139
  1964
  apfst (append_parent p loc f r b) (cut_tree pt (p,Und))
wneuper@2139
  1965
);
wneuper@2139
  1966
wneuper@2139
  1967
wneuper@2139
  1968
fun append_problem [] l fmz (strs,spec,hdf) _ =
wneuper@2139
  1969
(writeln("###append_problem: pos = []");
wneuper@2139
  1970
  (Nd (PblObj 
wneuper@2139
  1971
	       {cell  = [(*3.00. unused*)],
wneuper@2139
  1972
		origin= (strs,spec,hdf),
wneuper@2139
  1973
		fmz   = fmz,
wneuper@2139
  1974
		spec  = empty_spec,
wneuper@2139
  1975
		probl = []:itm list,
wneuper@2139
  1976
		meth  = []:itm list,
wneuper@2139
  1977
		env   = None,
wneuper@2139
  1978
		loc   = (Some l, None),
wneuper@2139
  1979
		branch= TransitiveB,(*FIXXXXXME.27.8.03: for equations only*)
wneuper@2139
  1980
		result= (e_term,[]),
wneuper@2139
  1981
		ostate= Incomplete},[]))
wneuper@2139
  1982
)
wneuper@2139
  1983
  | append_problem p l fmz (strs,spec,hdf) pt =
wneuper@2139
  1984
(writeln("###append_problem: pos ="^pos2str p);
wneuper@2139
  1985
  insert (PblObj 
wneuper@2139
  1986
	  {cell  = [(*3.00. unused*)],
wneuper@2139
  1987
	   origin= (strs,spec,hdf),
wneuper@2139
  1988
	   fmz   = fmz,
wneuper@2139
  1989
	   spec  = empty_spec,
wneuper@2139
  1990
	   probl = []:itm list,
wneuper@2139
  1991
	   meth  = []:itm list,
wneuper@2139
  1992
	   env   = None,
wneuper@2139
  1993
	   loc   = (Some l, None),
wneuper@2139
  1994
	   branch= TransitiveB,
wneuper@2139
  1995
	   result= (e_term,[]),
wneuper@2139
  1996
	   ostate= Incomplete}) pt p
wneuper@2139
  1997
);
wneuper@2139
  1998
fun cappend_problem _ [] loc fmz ori =
wneuper@2139
  1999
(writeln("###cappend_problem: pos = []");
wneuper@2139
  2000
  (append_problem [] loc fmz ori EmptyPtree,[])
wneuper@2139
  2001
)
wneuper@2139
  2002
  | cappend_problem pt p loc fmz ori = 
wneuper@2139
  2003
(writeln("###cappend_problem: pos ="^pos2str p);
wneuper@2139
  2004
  apfst (append_problem p (loc:istate) fmz ori) (cut_tree pt (p,Frm))
wneuper@2139
  2005
);
wneuper@2139
  2006