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