src/Tools/isac/Interpret/calchead.sml
author Walther Neuper <neuper@ist.tugraz.at>
Fri, 15 Jul 2011 13:51:50 +0200
branchdecompose-isar
changeset 42090 908dfde7cf75
parent 42011 6a9ba30ab6bc
child 42092 1a6d6089e594
permissions -rw-r--r--
updated phst11/* Isabelle2009-2 --> Isabelle2011

(*show_brackets := true; TODO*)
CAUTION: errors due to
intermed: make autocalc..CompleteCalc run with x+1=2
     1 (* Title:  Specify-phase: specifying and modeling a problem or a subproblem. The
     2            most important types are declared in mstools.sml.
     3    Author: Walther Neuper 991122, Mathias Lehnfeld
     4    (c) due to copyright terms
     5 
     6 12345678901234567890123456789012345678901234567890123456789012345678901234567890
     7         10        20        30        40        50        60        70        80
     8 *)
     9 
    10 (* TODO interne Funktionen aus sig entfernen *)
    11 signature CALC_HEAD =
    12   sig
    13     datatype additm = Add of SpecifyTools.itm | Err of string
    14     val all_dsc_in : SpecifyTools.itm_ list -> Term.term list
    15     val all_modspec : ptree * pos' -> ptree * pos'
    16     datatype appl = Appl of tac_ | Notappl of string
    17     val appl_add :
    18        Proof.context ->
    19        string ->
    20        SpecifyTools.ori list ->
    21        SpecifyTools.itm list ->
    22        (string * (Term.term * Term.term)) list -> cterm' -> additm
    23     type calcstate
    24     type calcstate'
    25     val chk_vars : term ppc -> string * Term.term list
    26     val chktyp :
    27        theory -> int * term list * term list -> term
    28     val chktyps :
    29        theory -> term list * term list -> term list
    30     val complete_metitms :
    31    SpecifyTools.ori list ->
    32    SpecifyTools.itm list ->
    33    SpecifyTools.itm list -> pat list -> SpecifyTools.itm list
    34     val complete_mod_ : ori list * pat list * pat list * itm list ->
    35 			itm list * itm list
    36     val complete_mod : ptree * pos' -> ptree * (pos * pos_)
    37     val complete_spec : ptree * pos' -> ptree * pos'
    38     val cpy_nam :
    39        pat list -> preori list -> pat -> preori
    40     val e_calcstate : calcstate
    41     val e_calcstate' : calcstate'
    42     val eq1 : ''a -> 'b * (''a * 'c) -> bool
    43     val eq3 :
    44        ''a -> Term.term -> 'b * 'c * 'd * ''a * SpecifyTools.itm_ -> bool
    45     val eq4 : ''a -> 'b * ''a list * 'c * 'd * 'e -> bool
    46     val eq5 :
    47        'a * 'b * 'c * 'd * SpecifyTools.itm_ ->
    48        'e * 'f * 'g * Term.term * 'h -> bool
    49     val eq_dsc : SpecifyTools.itm * SpecifyTools.itm -> bool
    50     val eq_pos' : ''a * pos_ -> ''a * pos_ -> bool
    51     val f_mout : theory -> mout -> Term.term
    52     val filter_outs :
    53        SpecifyTools.ori list ->
    54        SpecifyTools.itm list -> SpecifyTools.ori list
    55     val filter_pbt :
    56        SpecifyTools.ori list ->
    57        ('a * (Term.term * 'b)) list -> SpecifyTools.ori list
    58     val foldl1 : ('a * 'a -> 'a) -> 'a list -> 'a
    59     val foldr1 : ('a * 'a -> 'a) -> 'a list -> 'a
    60     val form : 'a -> ptree -> (string * ('a * pos_) * Term.term) list
    61     val formres : 'a -> ptree -> (string * ('a * pos_) * Term.term) list
    62     val gen_ins' : ('a * 'a -> bool) -> 'a * 'a list -> 'a list
    63     val get_formress :
    64        (string * (pos * pos_) * Term.term) list list ->
    65        pos -> ptree list -> (string * (pos * pos_) * Term.term) list
    66     val get_forms :
    67        (string * (pos * pos_) * Term.term) list list ->
    68        posel list -> ptree list -> (string * (pos * pos_) * Term.term) list
    69     val get_interval : pos' -> pos' -> int -> ptree -> (pos' * term) list
    70     val get_ocalhd : ptree * pos' -> ocalhd
    71     val get_spec_form : tac_ -> pos' -> ptree -> mout
    72     val geti_ct :
    73        theory ->
    74        SpecifyTools.ori -> SpecifyTools.itm -> string * cterm'
    75     val getr_ct : theory -> SpecifyTools.ori -> string * cterm'
    76     val has_list_type : Term.term -> bool
    77     val header : pos_ -> pblID -> metID -> pblmet
    78     val insert_ppc :
    79        theory ->
    80        int * SpecifyTools.vats * bool * string * SpecifyTools.itm_ ->
    81        SpecifyTools.itm list -> SpecifyTools.itm list
    82     val insert_ppc' :
    83        SpecifyTools.itm -> SpecifyTools.itm list -> SpecifyTools.itm list
    84     val is_complete_mod : ptree * pos' -> bool
    85     val is_complete_mod_ : SpecifyTools.itm list -> bool
    86     val is_complete_modspec : ptree * pos' -> bool
    87     val is_complete_spec : ptree * pos' -> bool
    88     val is_copy_named : 'a * ('b * Term.term) -> bool
    89     val is_copy_named_idstr : string -> bool
    90     val is_error : SpecifyTools.itm_ -> bool
    91     val is_field_correct : ''a -> ''b -> (''a * ''b list) list -> bool
    92     val is_known :
    93        Proof.context ->
    94        string ->
    95        SpecifyTools.ori list ->
    96        Term.term -> string * SpecifyTools.ori * Term.term list
    97     val is_list_type : Term.typ -> bool
    98     val is_notyet_input :
    99        Proof.context ->
   100        SpecifyTools.itm list ->
   101        Term.term list ->
   102        SpecifyTools.ori ->
   103        ('a * (Term.term * Term.term)) list -> string * SpecifyTools.itm
   104     val is_parsed : SpecifyTools.itm_ -> bool
   105     val is_untouched : SpecifyTools.itm -> bool
   106     val matc :
   107        theory ->
   108        pat list ->
   109        Term.term list ->
   110        (int list * string * Term.term * Term.term list) list ->
   111        (int list * string * Term.term * Term.term list) list
   112     val match_ags :
   113        theory -> pat list -> Term.term list -> SpecifyTools.ori list
   114     val maxl : int list -> int
   115     val match_ags_msg : string list -> Term.term -> Term.term list -> unit
   116     val memI : ''a list -> ''a -> bool
   117     val mk_additem : string -> cterm' -> tac
   118     val mk_delete : theory -> string -> SpecifyTools.itm_ -> tac
   119     val mtc :
   120        theory -> pat -> Term.term -> SpecifyTools.preori option
   121     val nxt_add :
   122        theory ->
   123        SpecifyTools.ori list ->
   124        (string * (Term.term * 'a)) list ->
   125        SpecifyTools.itm list -> (string * cterm') option
   126     val nxt_model_pbl : tac_ -> ptree * (int list * pos_) -> tac_
   127     val nxt_spec :
   128        pos_ ->
   129        bool ->
   130        SpecifyTools.ori list ->
   131        spec ->
   132        SpecifyTools.itm list * SpecifyTools.itm list ->
   133        (string * (Term.term * 'a)) list * (string * (Term.term * 'b)) list ->
   134        spec -> pos_ * tac
   135     val nxt_specif : tac -> ptree * (int list * pos_) -> calcstate'
   136     val nxt_specif_additem :
   137        string -> cterm' -> ptree * (int list * pos_) -> calcstate'
   138     val nxt_specify_init_calc : fmz -> calcstate
   139     val ocalhd_complete :
   140        SpecifyTools.itm list ->
   141        (bool * Term.term) list -> domID * pblID * metID -> bool
   142     val ori2Coritm :
   143 	pat list -> ori -> itm
   144     val ori_2itm :
   145        SpecifyTools.itm_ ->
   146        Term.term -> Term.term list -> SpecifyTools.ori -> SpecifyTools.itm
   147     val overwrite_ppc :
   148        theory ->
   149        int * SpecifyTools.vats * bool * string * SpecifyTools.itm_ ->
   150        SpecifyTools.itm list ->
   151        (int * SpecifyTools.vats * bool * string * SpecifyTools.itm_) list
   152     val parse_ok : SpecifyTools.itm_ list -> bool
   153     val posform2str : pos' * ptform -> string
   154     val posforms2str : (pos' * ptform) list -> string
   155     val posterms2str : (pos' * term) list -> string (*tests only*)
   156     val ppc135list : 'a SpecifyTools.ppc -> 'a list
   157     val ppc2list : 'a SpecifyTools.ppc -> 'a list
   158     val pt_extract :
   159        ptree * (int list * pos_) ->
   160        ptform * tac option * Term.term list
   161     val pt_form : ppobj -> ptform
   162     val pt_model : ppobj -> pos_ -> ptform
   163     val reset_calchead : ptree * pos' -> ptree * pos'
   164     val seek_oridts :
   165        Proof.context ->
   166        string ->
   167        Term.term * Term.term list ->
   168        (int * SpecifyTools.vats * string * Term.term * Term.term list) list
   169        -> string * SpecifyTools.ori * Term.term list
   170     val seek_orits :
   171        Proof.context ->
   172        string ->
   173        Term.term list ->
   174        (int * SpecifyTools.vats * string * Term.term * Term.term list) list
   175        -> string * SpecifyTools.ori * Term.term list
   176     val seek_ppc :
   177        int -> SpecifyTools.itm list -> SpecifyTools.itm option
   178     val show_pt : ptree -> unit
   179     val some_spec : spec -> spec -> spec
   180     val specify :
   181        tac_ ->
   182        pos' ->
   183        cid ->
   184        ptree ->
   185        (posel list * pos_) * ((posel list * pos_) * istate) * mout * tac *
   186        safe * ptree
   187     val specify_additem :
   188        string ->
   189        cterm' * 'a ->
   190        int list * pos_ ->
   191        'b ->
   192        ptree ->
   193        (pos * pos_) * ((pos * pos_) * istate) * mout * tac * safe * ptree
   194     val tag_form : theory -> term * term -> term
   195     val test_types : Proof.context -> Term.term * Term.term list -> string
   196     val typeless : Term.term -> Term.term
   197     val unbound_ppc : term SpecifyTools.ppc -> Term.term list
   198     val vals_of_oris : SpecifyTools.ori list -> Term.term list
   199     val variants_in : Term.term list -> int
   200     val vars_of_pbl_ : ('a * ('b * Term.term)) list -> Term.term list
   201     val vars_of_pbl_' : ('a * ('b * Term.term)) list -> Term.term list
   202   end
   203  
   204 
   205 
   206 
   207 
   208 structure CalcHead (**): CALC_HEAD(**) =
   209 
   210 struct
   211 
   212 (* datatypes *)
   213 
   214 (*.the state wich is stored after each step of calculation; it contains
   215    the calc-state and a list of [tac,istate](="tacis") to be applied next.
   216    the last_elem tacis is the first to apply to the calc-state and
   217    the (only) one shown to the front-end as the 'proposed tac'.
   218    the calc-state resulting from the application of tacis is not stored,
   219    because the tacis hold enough information for efficiently rebuilding
   220    this state just by "fun generate ".*)
   221 type calcstate = 
   222      (ptree * pos') *    (*the calc-state to which the tacis could be applied*)
   223      (taci list);        (*ev. several (hidden) steps; 
   224                            in REVERSE order: first tac_ to apply is last_elem*)
   225 val e_calcstate = ((EmptyPtree, e_pos'), [e_taci]):calcstate;
   226 
   227 (*the state used during one calculation within the mathengine; it contains
   228   a list of [tac,istate](="tacis") which generated the the calc-state;
   229   while this state's tacis are extended by each (internal) step,
   230   the calc-state is used for creating new nodes in the calc-tree
   231   (eg. applicable_in requires several particular nodes of the calc-tree)
   232   and then replaced by the the newly created;
   233   on leave of the mathengine the resuing calc-state is dropped anyway,
   234   because the tacis hold enought information for efficiently rebuilding
   235   this state just by "fun generate ".*)
   236 type calcstate' = 
   237      taci list *        (*cas. several (hidden) steps; 
   238                           in REVERSE order: first tac_ to apply is last_elem*)
   239      pos' list *        (*a "continuous" sequence of pos',
   240 			 deleted by application of taci list*)     
   241      (ptree * pos');    (*the calc-state resulting from the application of tacis*)
   242 val e_calcstate' = ([e_taci], [e_pos'], (EmptyPtree, e_pos')):calcstate';
   243 
   244 (*FIXXXME.WN020430 intermediate hack for fun ass_up*)
   245 fun f_mout thy (Form' (FormKF (_,_,_,_,f))) = (term_of o the o (parse thy)) f
   246   | f_mout thy _ = error "f_mout: not called with formula";
   247 
   248 
   249 (*.is the calchead complete ?.*)
   250 fun ocalhd_complete (its: itm list) (pre: (bool * term) list) (dI,pI,mI) = 
   251     foldl and_ (true, map #3 its) andalso 
   252     foldl and_ (true, map #1 pre) andalso 
   253     dI<>e_domID andalso pI<>e_pblID andalso mI<>e_metID;
   254 
   255 
   256 (* make a term 'typeless' for comparing with another 'typeless' term;
   257    'type-less' usually is illtyped                                  *)
   258 fun typeless (Const(s,_)) = (Const(s,e_type)) 
   259   | typeless (Free(s,_)) = (Free(s,e_type))
   260   | typeless (Var(n,_)) = (Var(n,e_type))
   261   | typeless (Bound i) = (Bound i)
   262   | typeless (Abs(s,_,t)) = Abs(s,e_type, typeless t)
   263   | typeless (t1 $ t2) = (typeless t1) $ (typeless t2);
   264 (*
   265 > val (SOME ct) = parse thy "max_relation (A=#2*a*b - a^^^#2)";
   266 > val (_,t1) = split_dsc_t hs (term_of ct);
   267 > val (SOME ct) = parse thy "A=#2*a*b - a^^^#2";
   268 > val (_,t2) = split_dsc_t hs (term_of ct);
   269 > typeless t1 = typeless t2;
   270 val it = true : bool
   271 *)
   272 
   273 
   274 
   275 (*.to an input (d,ts) find the according ori and insert the ts.*)
   276 (*WN.11.03: + dont take first inter<>[]*)
   277 fun seek_oridts ctxt sel (d,ts) [] =
   278     ("seek_oridts: input ('" ^
   279         (Print_Mode.setmp [] (Syntax.string_of_term ctxt) (comp_dts (d,ts))) ^
   280         "') not found in oris (typed)",
   281       (0, [], sel, d, ts),
   282       [])
   283   | seek_oridts ctxt sel (d,ts) ((id, vat, sel', d', ts')::oris) =
   284     if sel = sel' andalso d = d' andalso (inter op = ts ts') <> [] then
   285       ("", (id, vat, sel, d, inter op = ts ts'), ts') else
   286       seek_oridts ctxt sel (d, ts) oris;
   287 
   288 (*.to an input (_,ts) find the according ori and insert the ts.*)
   289 fun seek_orits ctxt sel ts [] = 
   290   ("seek_orits: input (_, '" ^ strs2str (map (Print_Mode.setmp [](Syntax.string_of_term 
   291                                            ctxt)) ts) ^
   292    "') not found in oris (typed)", e_ori_, [])
   293   | seek_orits ctxt sel ts ((id,vat,sel',d,ts')::(oris:ori list)) =
   294     if sel = sel' andalso (inter op = ts ts') <> [] 
   295     then if sel = sel' 
   296 	 then ("",
   297                (id,vat,sel,d, inter op = ts ts'):ori, 
   298                ts')
   299 	 else (((strs2str' o map (Print_Mode.setmp [] (Syntax.string_of_term
   300                                                            ctxt))) ts)
   301                ^ " not for " ^ sel, 
   302                e_ori_, 
   303                [])
   304     else seek_orits ctxt sel ts oris;
   305 (* false
   306 > val ((id,vat,sel',d,ts')::(ori':ori)) = ori;
   307 > seek_orits thy sel ts [(id,vat,sel',d,ts')];
   308 uncaught exception TYPE
   309 > seek_orits thy sel ts [];
   310 uncaught exception TYPE
   311 *)
   312 
   313 (*find_first item with #1 equal to id*)
   314 fun seek_ppc id [] = NONE
   315   | seek_ppc id (p::(ppc:itm list)) =
   316     if id = #1 p then SOME p else seek_ppc id ppc;
   317 
   318 
   319 
   320 (*---------------------------------------------(3) nach ptyps.sml 23.3.02*)
   321 
   322 
   323 datatype appl = Appl of tac_ | Notappl of string;
   324 
   325 fun ppc2list ({Given=gis,Where=whs,Find=fis,
   326 	       With=wis,Relate=res}: 'a ppc) =
   327   gis @ whs @ fis @ wis @ res;
   328 fun ppc135list ({Given=gis,Find=fis,Relate=res,...}: 'a ppc) =
   329   gis @ fis @ res;
   330 
   331 
   332 
   333 
   334 (* get the number of variants in a problem in 'original',
   335    assumes equal descriptions in immediate sequence    *)
   336 fun variants_in ts =
   337   let fun eq(x,y) = head_of x = head_of y;
   338     fun cnt eq [] y n = ([n],[])
   339       | cnt eq (x::xs) y n = if eq(x,y) then cnt eq xs y (n+1)
   340 			     else ([n], x::xs);
   341     fun coll eq  xs [] = xs
   342       | coll eq  xs (y::ys) = 
   343       let val (n,ys') = cnt eq (y::ys) y 0;
   344       in if ys' = [] then xs @ n else coll eq  (xs @ n) ys' end;
   345     val vts = subtract op = [1] (distinct (coll eq [] ts));
   346   in case vts of [] => 1 | [n] => n
   347       | _ => error "different variants in formalization" end;
   348 (*
   349 > cnt (op=) [2,2,2,4,5,5,5,5,5] 2 0;
   350 val it = ([3],[4,5,5,5,5,5]) : int list * int list
   351 > coll (op=) [] [1,2,2,2,4,5,5,5,5,5];
   352 val it = [1,3,1,5] : int list
   353 *)
   354 
   355 fun is_list_type (Type("List.list",_)) = true
   356   | is_list_type _ = false;
   357 (* fun destr (Type(str,sort)) = (str,sort);
   358 > val (SOME ct) = parse thy "lll::real list";
   359 > val ty = (#T o rep_cterm) ct;
   360 > is_list_type ty;
   361 val it = true : bool 
   362 > destr ty;
   363 val it = ("List.list",["RealDef.real"]) : string * typ list
   364 > atomty ((#t o rep_cterm) ct);
   365 *** -------------
   366 *** Free ( lll, real list)
   367 val it = () : unit
   368  
   369 > val (SOME ct) = parse thy "[lll::real]";
   370 > val ty = (#T o rep_cterm) ct;
   371 > is_list_type ty;
   372 val it = true : bool 
   373 > destr ty;
   374 val it = ("List.list",["'a"]) : string * typ list
   375 > atomty ((#t o rep_cterm) ct);
   376 *** -------------
   377 *** Const ( List.list.Cons, [real, real list] => real list)
   378 ***   Free ( lll, real)
   379 ***   Const ( List.list.Nil, real list) 
   380 
   381 > val (SOME ct) = parse thy "lll";
   382 > val ty = (#T o rep_cterm) ct;
   383 > is_list_type ty;
   384 val it = false : bool  *)
   385 
   386 
   387 fun has_list_type (Free(_,T)) = is_list_type T
   388   | has_list_type _ = false;
   389 (*
   390 > val (SOME ct) = parse thy "lll::real list";
   391 > has_list_type (term_of ct);
   392 val it = true : bool
   393 > val (SOME ct) = parse thy "[lll::real]";
   394 > has_list_type (term_of ct);
   395 val it = false : bool *)
   396 
   397 fun is_parsed (Syn _) = false
   398   | is_parsed _ = true;
   399 fun parse_ok its = foldl and_ (true, map is_parsed its);
   400 
   401 fun all_dsc_in itm_s =
   402   let    
   403     fun d_in (Cor ((d,_),_)) = [d]
   404       | d_in (Syn c) = []
   405       | d_in (Typ c) = []
   406       | d_in (Inc ((d,_),_)) = [d]
   407       | d_in (Sup (d,_)) = [d]
   408       | d_in (Mis (d,_)) = [d];
   409   in (flat o (map d_in)) itm_s end;  
   410 
   411 (* 30.1.00 ---
   412 fun is_Syn (Syn _) = true
   413   | is_Syn (Typ _) = true
   414   | is_Syn _ = false;
   415  --- *)
   416 fun is_error (Cor (_,ts)) = false
   417   | is_error (Sup (_,ts)) = false
   418   | is_error (Inc (_,ts)) = false
   419   | is_error (Mis (_,ts)) = false
   420   | is_error _ = true;
   421 
   422 (* 30.1.00 ---
   423 fun ct_in (Syn (c)) = c
   424   | ct_in (Typ (c)) = c
   425   | ct_in _ = error "ct_in called for Cor .. Sup";
   426  --- *)
   427 
   428 (*#############################################################*)
   429 (*#############################################################*)
   430 (* vvv--- aus nnewcode.sml am 30.1.00 ---vvv *)
   431 
   432 
   433 (* testdaten besorgen:
   434    use"test-coil-kernel.sml";
   435    val (PblObj{origin=(oris,_,_),meth={ppc=itms,...},...}) = 
   436         get_obj I pt p;
   437   *)
   438 
   439 (* given oris, ppc, 
   440    variant V: oris union ppc => int, id ID: oris union ppc => int
   441 
   442    ppc is_complete == 
   443      EX vt:V. ALL r:oris --> EX i:ppc. ID r = ID i  &  complete i
   444 
   445    and
   446      @vt = max sum(i : ppc) V i
   447 *)
   448 
   449 
   450 
   451 (*
   452 > ((vts_cnt (vts_in itms))) itms;
   453 
   454 
   455 
   456 ---^^--test 10.3.
   457 > val vts = vts_in itms;
   458 val vts = [1,2,3] : int list
   459 > val nvts = vts_cnt vts itms;
   460 val nvts = [(1,6),(2,5),(3,7)] : (int * int) list
   461 > val mx = max2 nvts;
   462 val mx = (3,7) : int * int
   463 > val v = max_vt itms;
   464 val v = 3 : int
   465 --------------------------
   466 > 
   467 *)
   468 
   469 (*.get the first term in ts from ori.*)
   470 (* val (_,_,fd,d,ts) = hd miss;
   471    *)
   472 fun getr_ct thy ((_, _, fd, d, ts) : ori) =
   473     (fd, (Print_Mode.setmp [] (Syntax.string_of_term (thy2ctxt thy)) o 
   474           comp_dts) (d,[hd ts]) : cterm');
   475 (* val t = comp_dts (d,[hd ts]);
   476    *)
   477 
   478 (* get a term from ori, notyet input in itm.
   479    the term from ori is thrown back to a string in order to reuse
   480    machinery for immediate input by the user. *)
   481 fun geti_ct thy ((_, _, _, d, ts) : ori) ((_, _, _, fd, itm_) : itm) =  
   482     (fd, Print_Mode.setmp [] ((Syntax.string_of_term (thy2ctxt thy)) o comp_dts) 
   483                           (d, subtract op = (ts_in itm_) ts) : cterm');
   484 fun geti_ct thy ((_, _, _, d, ts) : ori) ((_, _, _, fd, itm_) : itm) =  
   485     (fd, Print_Mode.setmp [] ((Syntax.string_of_term (thy2ctxt thy)) o comp_dts) 
   486                           (d, subtract op = (ts_in itm_) ts) : cterm');
   487 
   488 (* in FE dsc, not dat: this is in itms ...*)
   489 fun is_untouched ((_,_,false,_,Inc((_,[]),_)):itm) = true
   490   | is_untouched _ = false;
   491 
   492 
   493 (* select an item in oris, notyet input in itms 
   494    (precondition: in itms are only Cor, Sup, Inc) *)
   495 local infix mem;
   496 fun x mem [] = false
   497   | x mem (y :: ys) = x = y orelse x mem ys;
   498 in 
   499 fun nxt_add thy ([]:ori list) pbt itms = (*root (only) ori...fmz=[]*)
   500   let
   501     fun test_d d ((i,_,_,_,itm_):itm) = (d = (d_in itm_)) andalso i<>0; 
   502     fun is_elem itms (f,(d,t)) = 
   503       case find_first (test_d d) itms of 
   504 	SOME _ => true | NONE => false;
   505   in case filter_out (is_elem itms) pbt of
   506 (* val ((f,(d,_))::itms) = filter_out (is_elem itms) pbt;
   507    *)
   508     (f,(d,_))::itms => 
   509     SOME (f : string, 
   510           ((Print_Mode.setmp [] (Syntax.string_of_term (thy2ctxt thy))) o
   511            comp_dts) (d, []) : cterm')
   512   | _ => NONE end
   513 
   514 (* val (thy,itms) = (assoc_thy (if dI=e_domID then dI' else dI),pbl);
   515    *)
   516   | nxt_add thy oris pbt itms =
   517   let
   518     fun testr_vt v ori = (curry (op mem) v) (#2 (ori:ori))
   519       andalso (#3 ori) <>"#undef";
   520     fun testi_vt v itm = (curry (op mem) v) (#2 (itm:itm));
   521     fun test_id ids r = curry (op mem) (#1 (r:ori)) ids;
   522     fun test_subset (itm:itm) ((_,_,_,d,ts):ori) = 
   523 	(d_in (#5 itm)) = d andalso subset op = (ts_in (#5 itm), ts);
   524     fun false_and_not_Sup((i,v,false,f,Sup _):itm) = false
   525       | false_and_not_Sup (i,v,false,f, _) = true
   526       | false_and_not_Sup  _ = false;
   527 
   528     val v = if itms = [] then 1 else max_vt itms;
   529     val vors = if v = 0 then oris else filter (testr_vt v) oris;(*oris..vat*)
   530     val vits = if v = 0 then itms (*because of dsc without dat*)
   531 	       else filter (testi_vt v) itms;                   (*itms..vat*)
   532     val icl = filter false_and_not_Sup vits; (* incomplete *)
   533   in if icl = [] 
   534      then case filter_out (test_id (map #1 vits)) vors of
   535 	      [] => NONE
   536 	    (* val miss = filter_out (test_id (map #1 vits)) vors;
   537 	       *)
   538 	    | miss => SOME (getr_ct thy (hd miss))
   539      else
   540 	 case find_first (test_subset (hd icl)) vors of
   541 	     (* val SOME ori = find_first (test_subset (hd icl)) vors;
   542 	      *)
   543 	     NONE => error "nxt_add: EX itm. not(dat(itm)<=dat(ori))"
   544 	   | SOME ori => SOME (geti_ct thy ori (hd icl))
   545   end
   546 end;
   547 
   548 
   549 
   550 fun mk_delete thy "#Given"  itm_ = Del_Given   (itm_out thy itm_)
   551   | mk_delete thy "#Find"   itm_ = Del_Find    (itm_out thy itm_)
   552   | mk_delete thy "#Relate" itm_ = Del_Relation(itm_out thy itm_)
   553   | mk_delete thy str _ = 
   554   error ("mk_delete: called with field '"^str^"'");
   555 fun mk_additem "#Given" ct = Add_Given ct
   556   | mk_additem "#Find"  ct = Add_Find ct    
   557   | mk_additem "#Relate"ct = Add_Relation ct
   558   | mk_additem str _ = 
   559   error ("mk_additem: called with field '"^str^"'");
   560 
   561 
   562 (* determine the next step of specification;
   563    not done here: Refine_Tacitly (otherwise *** unknown method: (..., no_met))
   564    eg. in rootpbl 'no_met': 
   565 args:
   566   preok          predicates are _all_ ok (and problem matches completely)
   567   oris           immediately from formalization 
   568   (dI',pI',mI')  specification coming from author/parent-problem
   569   (pbl,          item lists specified by user
   570    met)          -"-, tacitly completed by copy_probl
   571   (dI,pI,mI)     specification explicitly done by the user
   572   (pbt, mpc)     problem type, guard of method
   573 *)
   574 fun nxt_spec Pbl preok (oris : ori list) ((dI', pI', mI') : spec)
   575   ((pbl : itm list), (met : itm list)) (pbt, mpc) ((dI, pI, mI) : spec) = 
   576     ((*tracing"### nxt_spec Pbl";*)
   577      if dI' = e_domID andalso dI = e_domID then (Pbl, Specify_Theory dI')
   578      else if pI' = e_pblID andalso pI = e_pblID then (Pbl, Specify_Problem pI')
   579      else case find_first (is_error o #5) (pbl:itm list) of
   580 	      SOME (_, _, _, fd, itm_) => 
   581 	      (Pbl, mk_delete 
   582 	                (assoc_thy (if dI = e_domID then dI' else dI)) fd itm_)
   583 	    | NONE => 
   584 	      ((*tracing"### nxt_spec is_error NONE";*)
   585 	       case nxt_add (assoc_thy (if dI = e_domID then dI' else dI)) 
   586 		            oris pbt pbl of
   587 	           SOME (fd,ct') => ((*tracing"### nxt_spec nxt_add SOME";*)
   588 				     (Pbl, mk_additem fd ct'))
   589 	         | NONE => (*pbl-items complete*)
   590 	           if not preok then (Pbl, Refine_Problem pI')
   591 	           else
   592 		       if dI = e_domID then (Pbl, Specify_Theory dI')
   593 		       else if pI = e_pblID then (Pbl, Specify_Problem pI')
   594 		       else if mI = e_metID then (Pbl, Specify_Method mI')
   595 		       else
   596 			   case find_first (is_error o #5) met of
   597 			       SOME (_,_,_,fd,itm_) => 
   598 			       (Met, mk_delete (assoc_thy dI) fd itm_)
   599 			     | NONE => 
   600 			       (case nxt_add (assoc_thy dI) oris mpc met of
   601 				    SOME (fd,ct') => (*30.8.01: pre?!?*)
   602 				    (Met, mk_additem fd ct')
   603 				  | NONE => 
   604 				    ((*Solv 3.4.00*)Met, Apply_Method mI))))
   605 
   606   | nxt_spec Met preok oris (dI',pI',mI') (pbl, met) (pbt,mpc) (dI,pI,mI) = 
   607   ((*tracing"### nxt_spec Met"; *)
   608    case find_first (is_error o #5) met of
   609      SOME (_,_,_,fd,itm_) => 
   610 	 (Met, mk_delete (assoc_thy (if dI=e_domID then dI' else dI)) fd itm_)
   611    | NONE => 
   612        case nxt_add (assoc_thy (if dI=e_domID then dI' else dI))oris mpc met of
   613 	 SOME (fd,ct') => (Met, mk_additem fd ct')
   614        | NONE => 
   615 	   ((*tracing"### nxt_spec Met: nxt_add NONE";*)
   616 	    if dI = e_domID then (Met, Specify_Theory dI')
   617 	    else if pI = e_pblID then (Met, Specify_Problem pI')
   618 		 else if not preok then (Met, Specify_Method mI)
   619 		      else (Met, Apply_Method mI)));
   620 	  
   621 (* di_ pI_ mI_ pos_
   622 val itms = [(1,[1],true,"#Find",Cor(e_term,[e_term])):itm,
   623 	    (2,[2],true,"#Find",Syn("empty"))];
   624 *)
   625 
   626 fun is_field_correct sel d dscpbt =
   627   case assoc (dscpbt, sel) of
   628     NONE => false
   629   | SOME ds => member op = ds d;
   630 
   631 (*. update the itm_ already input, all..from ori .*)
   632 (* val (id,vt,fd,d,ts) = (i,v,f,d,ts\\ts');
   633    *)
   634 fun ori_2itm itm_ pid all ((id,vt,fd,d,ts):ori) = 
   635   let 
   636     val ts' = union op = (ts_in itm_) ts;
   637     val pval = pbl_ids' d ts'
   638 	(*WN.9.5.03: FIXXXME [#0, epsilon]
   639 	  here would upd_penv be called for [#0, epsilon] etc. *)
   640     val complete = if eq_set op = (ts', all) then true else false;
   641   in case itm_ of
   642     (Cor _) => 
   643 	(if fd = "#undef" then (id,vt,complete,fd,Sup(d,ts')) 
   644 	 else (id,vt,complete,fd,Cor((d,ts'),(pid, pval)))):itm
   645   | (Syn c)     => error ("ori_2itm wants to overwrite "^c)
   646   | (Typ c)     => error ("ori_2itm wants to overwrite "^c)
   647   | (Inc _) => if complete
   648 	       then (id,vt,true ,fd, Cor ((d,ts'),(pid, pval)))
   649 	       else (id,vt,false,fd, Inc ((d,ts'),(pid, pval)))
   650   | (Sup ((*_,_*)d,ts')) => (*4.9.01 lost env*)
   651 	 (*if fd = "#undef" then*) (id,vt,complete,fd,Sup(d,ts'))
   652 	 (*else (id,vt,complete,fd,Cor((d,ts'),e))*)
   653 (* 28.1.00: not completely clear ---^^^ etc.*)
   654 (* 4.9.01: Mis just copied---vvv *)
   655   | (Mis _) => if complete
   656 		     then (id,vt,true ,fd, Cor ((d,ts'),(pid, pval)))
   657 		     else (id,vt,false,fd, Inc ((d,ts'),(pid, pval)))
   658   end;
   659 
   660 
   661 fun eq1 d (_,(d',_)) = (d = d');
   662 fun eq3 f d (_,_,_,f',itm_) = f = f' andalso d = (d_in itm_); 
   663 
   664 
   665 (* 'all' ts from ori; ts is the input; (ori carries rest of info)
   666    9.01: this + ori_2itm is _VERY UNCLEAR_ ? overhead ?
   667    pval: value for problem-environment _NOT_ checked for 'inter' --
   668    -- FIXXME.WN.11.03 the generation of penv has to go to insert_ppc
   669   (as it has been done for input_icalhd+insert_ppc' in 11.03)*)
   670 (*. is_input ori itms <=> 
   671     EX itm. (1) ori(field,dsc) = itm(field,dsc) & (2..4)
   672             (2) ori(ts) subset itm(ts)        --- Err "already input"       
   673 	    (3) ori(ts) inter itm(ts) = empty --- new: ori(ts)
   674 	    (4) -"- <> empty                  --- new: ori(ts) \\ inter .*)
   675 (* val(itms,(i,v,f,d,ts)) = (ppc,ori');
   676    *)
   677 fun is_notyet_input ctxt (itms:itm list) all ((i,v,f,d,ts):ori) pbt =
   678   case find_first (eq1 d) pbt of
   679       SOME (_,(_,pid)) =>(* val SOME (_,(_,pid)) = find_first (eq1 d) pbt;
   680                             val SOME (_,_,_,_,itm_)=find_first (eq3 f d) itms;
   681 			   *)
   682       (case find_first (eq3 f d) itms of
   683 	   SOME (_,_,_,_,itm_) =>
   684 	   let 
   685 	       val ts' = inter op = (ts_in itm_) ts;
   686 	   in if subset op = (ts, ts') 
   687 	      then (((strs2str' o 
   688 		      map (Print_Mode.setmp [] (Syntax.string_of_term ctxt))) ts') ^
   689 		    " already input", e_itm)                            (*2*)
   690 	      else ("", 
   691                     ori_2itm itm_ pid all (i,v,f,d,
   692                                                subtract op = ts' ts))   (*3,4*)
   693 	   end
   694 	 | NONE => ("", ori_2itm (Inc ((e_term,[]),(pid,[]))) 
   695 				 pid all (i,v,f,d,ts))                  (*1*)
   696 	)
   697     | NONE => ("", ori_2itm (Sup (d,ts)) 
   698 			      e_term all (i,v,f,d,ts));
   699 
   700 fun test_types ctxt (d,ts) =
   701   let 
   702     (*val s = !show_types; val _ = show_types:= true;*)
   703     val opt = (try comp_dts) (d,ts);
   704     val msg = case opt of 
   705       SOME _ => "" 
   706     | NONE => ((Print_Mode.setmp [] (Syntax.string_of_term ctxt) d) ^
   707                " " ^
   708 	       ((strs2str' o map (Print_Mode.setmp [] (Syntax.string_of_term
   709                                                            ctxt))) ts)
   710 	     ^ " is illtyped");
   711     (*val _ = show_types:= s*)
   712   in msg end;
   713 
   714 
   715 
   716 fun maxl [] = error "maxl of []"
   717   | maxl (y::ys) =
   718   let fun mx x [] = x
   719 	| mx x (y::ys) = if x < (y:int) then mx y ys else mx x ys
   720   in mx y ys end;
   721 
   722 
   723 (*. is the input term t known in oris ? 
   724     give feedback on all(?) strange input;
   725     return _all_ terms already input to this item (e.g. valuesFor a,b) .*)
   726 fun is_known ctxt sel ori t =
   727   let
   728     val _ = tracing ("RM is_known: t=" ^ term2str t);
   729     val ots = (distinct o flat o (map #5)) (ori:ori list);
   730     val oids = ((map (fst o dest_Free)) o distinct o 
   731 		  flat o (map vars)) ots;
   732     val (d, ts) = split_dts t;
   733     val ids = map (fst o dest_Free) 
   734       ((distinct o (flat o (map vars))) ts);
   735   in if (subtract op = oids ids) <> []
   736      then (("identifiers "^(strs2str' (subtract op = oids ids)) ^
   737 	     " not in example"), e_ori_, [])
   738      else 
   739 	     if d = e_term 
   740 	     then 
   741 	       if not (subset op = (map typeless ts, map typeless ots))
   742 	       then (("terms '" ^ ((strs2str' o 
   743            (map (Print_Mode.setmp [] (Syntax.string_of_term ctxt)))) ts) ^
   744 		       "' not in example (typeless)"), e_ori_, [])
   745 	       else 
   746            (case seek_orits ctxt sel ts ori of
   747 		          ("", ori_ as (_,_,_,d,ts), all) =>
   748 		             (case test_types ctxt (d,ts) of
   749 			              "" => ("", ori_, all)
   750 			            | msg => (msg, e_ori_, []))
   751 		        | (msg,_,_) => (msg, e_ori_, []))
   752 	     else 
   753 	       if member op = (map #4 ori) d
   754 	       then seek_oridts ctxt sel (d,ts) ori
   755 	       else ((Print_Mode.setmp [] (Syntax.string_of_term ctxt) d) ^
   756 		       " not in example", (0, [], sel, d, ts), [])
   757   end;
   758 
   759 
   760 (*. for return-value of appl_add .*)
   761 datatype additm =
   762 	 Add of itm
   763        | Err of string;    (*error-message*)
   764 
   765 
   766 (** add an item to the model; check wrt. oris and pbt **)
   767 (* in contrary to oris<>[] below, this part handles user-input
   768    extremely acceptive, i.e. accept input instead error-msg *)
   769 fun appl_add ctxt sel [] ppc pbt ct =
   770       let
   771         val i = 1 + (if ppc = [] then 0 else map #1 ppc |> maxl);
   772         in 
   773           case parseNEW ctxt ct of
   774             NONE => Add (i, [], false, sel, Syn ct)
   775           | SOME t =>
   776               let val (d, ts) = split_dts t;
   777               in 
   778                 if d = e_term 
   779                 then Add (i, [], false, sel, Mis (dsc_unknown, hd ts)) 
   780                 else
   781                   (case find_first (eq1 d) pbt of
   782                      NONE => Add (i, [], true, sel, Sup (d,ts))
   783                    | SOME (f, (_, id)) =>
   784                        let fun eq2 d (i, _, _, _, itm_) =
   785                              d = (d_in itm_) andalso i <> 0;
   786                        in case find_first (eq2 d) ppc of
   787                             NONE => Add (i, [], true, f,Cor ((d, ts), (id, pbl_ids' d ts)))
   788                           | SOME (i', _, _, _, itm_) => 
   789                               if is_list_dsc d 
   790                               then 
   791                                 let
   792                                   val in_itm = ts_in itm_;
   793                                   val ts' = union op = ts in_itm;
   794                                   val i'' = if in_itm = [] then i else i';
   795                                 in Add (i'', [], true, f, Cor ((d, ts'), (id, pbl_ids' d ts'))) end
   796                               else Add (i', [], true, f, Cor ((d, ts),(id, pbl_ids' d ts)))
   797                        end)
   798               end
   799       end
   800   | appl_add ctxt sel oris ppc pbt str =
   801       case parseNEW ctxt str of
   802         NONE => Err ("appl_add: syntax error in '" ^ str ^ "'")
   803       | SOME t => 
   804           case is_known ctxt sel oris t of
   805             ("", ori', all) => 
   806               (case is_notyet_input ctxt ppc all ori' pbt of
   807                  ("", itm) => Add itm
   808                | (msg, _) => Err ("[error] appl_add: is_notyet_input: " ^ msg))
   809           | (msg, _, _) => Err ("[error] appl_add: is_known: " ^ msg);
   810 
   811 
   812 (** make oris from args of the stac SubProblem and from pbt **)
   813 (* can this formal argument (of a model-pattern) be omitted in the arg-list
   814    of a SubProblem ? see ME/ptyps.sml 'type met ' *)
   815 fun is_copy_named_idstr str =
   816     case (rev o Symbol.explode) str of
   817 	"'":: _ ::"'"::_ => (tracing ((strs2str o (rev o Symbol.explode)) 
   818                                   "is_copy_named_idstr: " ^ str ^ " T"); true)
   819       | _ => (tracing ((strs2str o (rev o Symbol.explode)) 
   820                                   "is_copy_named_idstr: " ^ str ^ " F"); false);
   821 fun is_copy_named (_, (_, t)) = (is_copy_named_idstr o free2str) t;
   822 
   823 (*.should this formal argument (of a model-pattern) create a new identifier?.*)
   824 fun is_copy_named_generating_idstr str =
   825     if is_copy_named_idstr str
   826     then case (rev o Symbol.explode) str of
   827 	"'"::"'"::"'"::_ => false
   828       | _ => true
   829     else false;
   830 fun is_copy_named_generating (_, (_, t)) = 
   831     (is_copy_named_generating_idstr o free2str) t;
   832 
   833 (*.split type-wrapper from scr-arg and build part of an ori;
   834    an type-error is reported immediately, raises an exn, 
   835    subsequent handling of exn provides 2nd part of error message.*)
   836 fun mtc thy ((str, (dsc, _)):pat) (ty $ var) =
   837     (* val (thy, (str, (dsc, _)), (ty $ var)) =
   838 	   (thy,  p,               a);
   839        *)
   840     (cterm_of thy (dsc $ var);(*type check*)
   841      SOME ((([1], str, dsc, (*[var]*)
   842 	    split_dts' (dsc, var))): preori)(*:ori without leading #*))
   843     handle e as TYPE _ => 
   844 	   (tracing (dashs 70 ^ "\n"
   845 	^"*** ERROR while creating the items for the model of the ->problem\n"
   846 	^"*** from the ->stac with ->typeconstructor in arglist:\n"
   847 	^"*** item (->description ->value): "^term2str dsc^" "^term2str var^"\n"
   848 	^"*** description: "^(term_detail2str dsc)
   849 	^"*** value: "^(term_detail2str var)
   850 	^"*** typeconstructor in script: "^(term_detail2str ty)
   851 	^"*** checked by theory: "^(theory2str thy)^"\n"
   852 	^"*** " ^ dots 66);
   853 	    (*OldGoals.print_exn e; raises exn again*)
   854             writeln (PolyML.makestring e);
   855             reraise e;
   856 	(*raise ERROR "actual args do not match formal args";FIXXXME.WN100916*)
   857 	NONE);
   858 
   859 (*.match each pat of the model-pattern with an actual argument;
   860    precondition: copy-named vars are filtered out.*)
   861 fun matc thy ([]:pat list)  _  (oris:preori list) = oris
   862   | matc thy pbt [] _ =
   863     (tracing (dashs 70);
   864      error ("actual arg(s) missing for '"^pats2str pbt
   865 		 ^"' i.e. should be 'copy-named' by '*_._'"))
   866   | matc thy ((p as (s,(d,t)))::pbt) (a::ags) oris =
   867     (* val (thy, ((p as (s,(d,t)))::pbt), (a::ags), oris) =
   868 	   (thy,  pbt',                    ags,     []);
   869        (*recursion..*)
   870        val (thy, ((p as (s,(d,t)))::pbt), (a::ags), oris) =
   871 	   (thy,  pbt,                     ags,    (oris @ [ori]));
   872        *)
   873     (*del?..*)if (is_copy_named_idstr o free2str) t then oris
   874     else(*..del?*) let val opt = mtc thy p a;  
   875 	 in case opt of
   876 		(* val SOME ori = mtc thy p a;
   877 		   *)
   878 		SOME ori => matc thy pbt ags (oris @ [ori])
   879 	      | NONE => [](*WN050903 skipped by exn handled in match_ags*)
   880 	 end; 
   881 (* run subp-rooteq.sml until Init_Proof before ...
   882 > val Nd (PblObj {origin=(oris,_,_),...},_) = pt;(*from test/subp-rooteq.sml*)
   883 > fun xxxfortest (_,a,b,c,d) = (a,b,c,d);val oris = map xxxfortest oris;
   884 
   885  other vars as in mtc ..
   886 > matc thy (drop_last pbt) ags [];
   887 val it = ([[1],"#Given",Const #,[#]),(0,[#],"#Given",Const #,[#])],2)*)
   888 
   889 
   890 (* generate a new variable "x_i" name from a related given one "x"
   891    by use of oris relating "v_i_" (is_copy_named!) to "v_"
   892    e.g. (v_, x) & (v_i_, ?) --> (v_i_, x_i) *)
   893 
   894 (* generate a new variable "x_i" name from a related given one "x"
   895    by use of oris relating "v_v'i'" (is_copy_named!) to "v_v"
   896    e.g. (v_v, x) & (v_v'i', ?) --> (v_v'i', x_i),
   897    but leave is_copy_named_generating as is, e.t. ss''' *)
   898 fun cpy_nam (pbt:pat list) (oris:preori list) (p as (field,(dsc,t)):pat) =
   899   (if is_copy_named_generating p
   900    then (*WN051014 kept strange old code ...*)
   901        let fun sel (_,_,d,ts) = comp_ts (d, ts) 
   902 	   val cy' = (implode o (drop_last_n 3) o Symbol.explode o free2str) t
   903 	   val ext = (last_elem o drop_last o Symbol.explode o free2str) t
   904 	   val vars' = map (free2str o snd o snd) pbt (*cpy-nam filtered_out*)
   905 	   val vals = map sel oris
   906 	   val cy_ext = (free2str o the) (assoc (vars'~~vals, cy'))^"_"^ext
   907        in ([1], field, dsc, [mk_free (type_of t) cy_ext]):preori end
   908    else ([1], field, dsc, [t])
   909 	)
   910   handle _ => error ("cpy_nam: for "^(term2str t));
   911 
   912 (*.match the actual arguments of a SubProblem with a model-pattern
   913    and create an ori list (in root-pbl created from formalization).
   914    expects ags:pats = 1:1, while copy-named are filtered out of pats;
   915    if no 1:1 the exn raised by matc/mtc and handled at call.
   916    copy-named pats are appended in order to get them into the model-items.*)
   917 fun match_ags thy (pbt:pat list) ags =
   918     let fun flattup (i,(var,bool,str,itm_)) = (i,var,bool,str,itm_);
   919 	val pbt' = filter_out is_copy_named pbt;
   920 	val cy = filter is_copy_named pbt;
   921 	val oris' = matc thy pbt' ags [];
   922 	val cy' = map (cpy_nam pbt' oris') cy;
   923 	val ors = add_id (oris' @ cy'); 
   924     (*appended in order to get ^^^^^ into the model-items*)
   925     in (map flattup ors):ori list end;
   926 
   927 (*.report part of the error-msg which is not available in match_args.*)
   928 fun match_ags_msg pI stac ags =
   929     let (*val s = !show_types
   930 	val _ = show_types:= true*)
   931 	val pats = (#ppc o get_pbt) pI
   932 	val msg = (dots 70^"\n"
   933 		 ^"*** problem "^strs2str pI^" has the ...\n"
   934 		 ^"*** model-pattern "^pats2str pats^"\n"
   935 		 ^"*** stac   '"^term2str stac^"' has the ...\n"
   936 		 ^"*** arg-list "^terms2str ags^"\n"
   937 		 ^dashs 70)
   938 	(*WN100921 ^^^^ expect TYPE errormsg below; lost with Isa09*)
   939 	(*val _ = show_types:= s*)
   940     in tracing msg end;
   941 
   942 
   943 (*get the variables out of a pbl_; FIXME.WN.0311: is_copy_named ...obscure!!!*)
   944 fun vars_of_pbl_ pbl_ = 
   945     let fun var_of_pbl_ (gfr,(dsc,t)) = t
   946     in ((map var_of_pbl_) o (filter_out is_copy_named)) pbl_ end;
   947 fun vars_of_pbl_' pbl_ = 
   948     let fun var_of_pbl_ (gfr,(dsc,t)) = t:term
   949     in ((map var_of_pbl_)(* o (filter_out is_copy_named)*)) pbl_ end;
   950 
   951 fun overwrite_ppc thy itm ppc =
   952   let 
   953     fun repl ppc' (_,_,_,_,itm_) [] =
   954       error ("overwrite_ppc: " ^ (itm_2str_ (thy2ctxt thy) itm_) ^ 
   955                    " not found")
   956       | repl ppc' itm (p::ppc) =
   957 	if (#1 itm) = (#1 (p:itm)) then ppc' @ [itm] @ ppc
   958 	else repl (ppc' @ [p]) itm ppc
   959   in repl [] itm ppc end;
   960 
   961 (*10.3.00: insert the already compiled itm into model;
   962    ev. filter_out  untouched (in FE: (0,...)) item related to insert-item *)
   963 (* val ppc=pbl;
   964    *)
   965 fun insert_ppc thy itm ppc =
   966     let 
   967 	fun eq_untouched d ((0,_,_,_,itm_):itm) = (d = d_in itm_)
   968 	  | eq_untouched _ _ = false;
   969 	    val ppc' = 
   970 		(
   971 		 (*tracing("### insert_ppc: itm= "^(itm2str_ itm));*)       
   972 		 case seek_ppc (#1 itm) ppc of
   973 		     (* val SOME xxx = seek_ppc (#1 itm) ppc;
   974 		        *)
   975 		     SOME _ => (*itm updated in is_notyet_input WN.11.03*)
   976 		     overwrite_ppc thy itm ppc
   977 		   | NONE => (ppc @ [itm]));
   978     in filter_out (eq_untouched ((d_in o #5) itm)) ppc' end;
   979 
   980 (*from Isabelle/src/Pure/library.ML, _appends_ a new element*)
   981 fun gen_ins' eq (x, xs) = if gen_mem eq (x, xs) then xs else xs @ [x];
   982 
   983 fun eq_dsc ((_,_,_,_,itm_):itm, (_,_,_,_,iitm_):itm) = 
   984     (d_in itm_) = (d_in iitm_);
   985 (*insert_ppc = insert_ppc' for appl_add', input_icalhd 11.03,
   986     handles superfluous items carelessly*)
   987 fun insert_ppc' itm itms = gen_ins' eq_dsc (itm, itms);
   988 (* val eee = op=;
   989  > gen_ins' eee (4,[1,3,5,7]);
   990 val it = [1, 3, 5, 7, 4] : int list*)
   991 
   992 
   993 (*. output the headline to a ppc .*)
   994 fun header p_ pI mI =
   995     case p_ of Pbl => Problem (if pI = e_pblID then [] else pI) 
   996 	     | Met => Method mI
   997 	     | pos => error ("header called with "^ pos_2str pos);
   998 
   999 
  1000 fun specify_additem sel (ct,_) (p, Met) c pt = 
  1001       let
  1002         val (PblObj{meth=met,origin=(oris,(dI',pI',mI'),_),
  1003   		    probl=pbl,spec=(dI,pI,mI), ctxt, ...}) = get_obj I pt p;
  1004         val thy = if dI = e_domID then assoc_thy dI' else assoc_thy dI;
  1005         val cpI = if pI = e_pblID then pI' else pI;
  1006         val cmI = if mI = e_metID then mI' else mI;
  1007         val {ppc,pre,prls,...} = get_met cmI;
  1008       in 
  1009         case appl_add ctxt sel oris met ppc ct of
  1010           Add itm (*..union old input *) =>
  1011   	        let
  1012               val met' = insert_ppc thy itm met;
  1013   	          val ((p, Met), _, _, pt') = 
  1014   	            generate1 thy (case sel of
  1015   				                       "#Given" => Add_Given'   (ct, met')
  1016   			                       | "#Find"  => Add_Find'    (ct, met')
  1017   			                       | "#Relate"=> Add_Relation'(ct, met')) 
  1018   			        (Uistate, ctxt) (p, Met) pt
  1019   	          val pre' = check_preconds thy prls pre met'
  1020   	          val pb = foldl and_ (true, map fst pre')
  1021   	          val (p_, nxt) =
  1022   	            nxt_spec Met pb oris (dI',pI',mI') (pbl,met') 
  1023   	              ((#ppc o get_pbt) cpI,ppc) (dI,pI,mI);
  1024   	        in ((p, p_), ((p, p_), Uistate),
  1025   	          Form' (PpcKF (0,EdUndef,(length p),Nundef,
  1026   			        (Method cmI, itms2itemppc thy met' pre'))), nxt,Safe,pt')
  1027             end
  1028         | Err msg =>
  1029   	        let
  1030               val pre' = check_preconds thy prls pre met
  1031   	          val pb = foldl and_ (true, map fst pre')
  1032   	          val (p_, nxt) =
  1033   	            nxt_spec Met pb oris (dI',pI',mI') (pbl,met) 
  1034   	              ((#ppc o get_pbt) cpI,(#ppc o get_met) cmI) (dI,pI,mI);
  1035   	        in ((p,p_), ((p,p_),Uistate), Error' (Error_ msg), nxt, Safe,pt) end
  1036       end
  1037 
  1038   | specify_additem sel (ct,_) (pos as (p,_(*Frm, Pbl*))) c pt = 
  1039       let
  1040         val (PblObj{meth=met,origin=(oris,(dI',pI',mI'),_),
  1041 		      probl=pbl,spec=(dI,pI,mI), ctxt, ...}) = get_obj I pt p;
  1042         val thy = if dI = e_domID then assoc_thy dI' else assoc_thy dI;
  1043         val cpI = if pI = e_pblID then pI' else pI;
  1044         val cmI = if mI = e_metID then mI' else mI;
  1045         val {ppc,where_,prls,...} = get_pbt cpI;
  1046       in
  1047         case appl_add ctxt sel oris pbl ppc ct of
  1048           Add itm (*..union old input *) =>
  1049 	          let
  1050 	            val pbl' = insert_ppc thy itm pbl
  1051 	            val ((p, Pbl), _, _, pt') = 
  1052 	              generate1 thy (case sel of
  1053 				                         "#Given" => Add_Given'   (ct, pbl')
  1054 			                         | "#Find"  => Add_Find'    (ct, pbl')
  1055 			                         | "#Relate"=> Add_Relation'(ct, pbl')) 
  1056 			           (Uistate, ctxt) (p,Pbl) pt
  1057 	            val pre = check_preconds thy prls where_ pbl'
  1058 	            val pb = foldl and_ (true, map fst pre)
  1059 	            val (p_, nxt) =
  1060 	              nxt_spec Pbl pb oris (dI',pI',mI') (pbl',met) 
  1061 		              (ppc,(#ppc o get_met) cmI) (dI,pI,mI);
  1062 	            val ppc = if p_= Pbl then pbl' else met;
  1063 	          in ((p,p_), ((p,p_),Uistate),
  1064 	            Form' (PpcKF (0,EdUndef,(length p),Nundef,
  1065 			          (header p_ pI cmI, itms2itemppc thy ppc pre))), nxt,Safe,pt')
  1066             end
  1067         | Err msg =>
  1068 	          let
  1069               val pre = check_preconds thy prls where_ pbl
  1070 	            val pb = foldl and_ (true, map fst pre)
  1071 	            val (p_, nxt) =
  1072 	              nxt_spec Pbl pb oris (dI',pI',mI') (pbl,met) 
  1073 	                (ppc,(#ppc o get_met) cmI) (dI,pI,mI);
  1074 	          in ((p,p_), ((p,p_),Uistate), Error' (Error_ msg), nxt, Safe,pt) end
  1075       end;
  1076 
  1077 fun specify (Init_Proof' (fmz,(dI',pI',mI'))) (_:pos') (_:cid) (_:ptree)= 
  1078     let          (* either """"""""""""""" all empty or complete *)
  1079       val thy = assoc_thy dI';
  1080       val (oris, ctxt) = 
  1081         if dI' = e_domID orelse pI' = e_pblID  (*andalso? WN110511*)
  1082         then ([], e_ctxt)
  1083   	    else pI' |> #ppc o get_pbt |> prep_ori fmz thy
  1084       val (pt,c) = cappend_problem e_ptree [] (e_istate, ctxt) (fmz,(dI',pI',mI'))
  1085   			(oris, (dI',pI',mI'),e_term)
  1086       val pt = update_ctxt pt [] ctxt
  1087       val {ppc, prls, where_, ...} = get_pbt pI'
  1088       val (pbl, pre, pb) = ([], [], false)
  1089     in 
  1090       case mI' of
  1091   	    ["no_met"] => 
  1092   	      (([], Pbl), (([], Pbl), Uistate),
  1093   	        Form' (PpcKF (0, EdUndef, (length []), Nundef,
  1094 			        (Problem [], itms2itemppc (assoc_thy dI') pbl pre))),
  1095   	        Refine_Tacitly pI', Safe, pt)
  1096        | _ => 
  1097   	      (([], Pbl), (([], Pbl), Uistate),
  1098   	        Form' (PpcKF (0, EdUndef, (length []), Nundef,
  1099   			      (Problem [], itms2itemppc (assoc_thy dI') pbl pre))),
  1100   	        Model_Problem, Safe, pt)
  1101   end
  1102 
  1103     (*ONLY for STARTING modeling phase*)
  1104   | specify (Model_Problem' (_,pbl,met)) (pos as (p,p_)) c pt =
  1105       let 
  1106         val (PblObj{origin=(oris,(dI',pI',mI'),_), spec=(dI,_,_), ctxt, ...}) = get_obj I pt p
  1107         val thy' = if dI = e_domID then dI' else dI
  1108         val thy = assoc_thy thy'
  1109         val {ppc,prls,where_,...} = get_pbt pI'
  1110         val pre = check_preconds thy prls where_ pbl
  1111         val pb = foldl and_ (true, map fst pre)
  1112         val ((p,_),_,_,pt) =
  1113           generate1 thy (Model_Problem'([],pbl,met)) (Uistate, ctxt) pos pt
  1114         val (_,nxt) = nxt_spec Pbl pb oris (dI',pI',mI') (pbl,met) 
  1115 		      (ppc,(#ppc o get_met) mI') (dI',pI',mI');
  1116       in ((p, Pbl), ((p, p_), Uistate), 
  1117           Form' (PpcKF (0, EdUndef, length p, Nundef,
  1118 		       (Problem pI', itms2itemppc (assoc_thy dI') pbl pre))),
  1119           nxt, Safe, pt)
  1120       end
  1121 
  1122     (*. called only if no_met is specified .*)     
  1123   | specify (Refine_Tacitly' (pI,pIre,_,_,_)) (pos as (p,_)) c pt =
  1124       let
  1125         val (PblObj{origin=(oris,(dI',pI',mI'),_), meth=met, ctxt, ...}) = get_obj I pt p;
  1126         val {prls,met,ppc,thy,where_,...} = get_pbt pIre
  1127         val (domID, metID) = 
  1128           (string_of_thy thy, if length met = 0 then e_metID else hd met)
  1129         val ((p,_),_,_,pt) = 
  1130 	        generate1 thy (Refine_Tacitly'(pI,pIre,domID,metID,(*pbl*)[])) 
  1131 		        (Uistate, ctxt) pos pt
  1132         val (pbl, pre, pb) = ([], [], false)
  1133       in ((p, Pbl), (pos, Uistate),
  1134         Form' (PpcKF (0,EdUndef,(length p),Nundef,
  1135 		      (Problem pIre, itms2itemppc (assoc_thy dI') pbl pre))),
  1136         Model_Problem, Safe, pt)
  1137       end
  1138 
  1139   | specify (Refine_Problem' (rfd as (pI,_))) pos c pt =
  1140       let
  1141         val ctxt = get_ctxt pt pos
  1142         val (pos,_,_,pt) =
  1143           generate1 (assoc_thy "Isac") (Refine_Problem' rfd) (Uistate, ctxt) pos pt
  1144       in (pos(*p,Pbl*), (pos(*p,Pbl*),Uistate), Problems (RefinedKF rfd), 
  1145 	      Model_Problem, Safe, pt)
  1146       end
  1147     (*WN110515 initialise ctxt again from itms and add preconds*)
  1148   | specify (Specify_Problem' (pI, (ok, (itms, pre)))) (pos as (p,_)) c pt =
  1149       let
  1150         val (PblObj {origin=(oris,(dI',pI',mI'),_), spec=(dI,_,mI), 
  1151 		      meth=met, ctxt, ...}) = get_obj I pt p;
  1152         val thy = assoc_thy dI
  1153         val ((p,Pbl),_,_,pt)= 
  1154 	        generate1 thy (Specify_Problem' (pI, (ok, (itms, pre)))) (Uistate, ctxt) pos pt
  1155         val dI'' = assoc_thy (if dI=e_domID then dI' else dI);
  1156         val mI'' = if mI=e_metID then mI' else mI;
  1157         val (_, nxt) =
  1158           nxt_spec Pbl ok oris (dI',pI',mI') (itms, met) 
  1159 		        ((#ppc o get_pbt) pI,(#ppc o get_met) mI'') (dI,pI,mI);
  1160       in ((p,Pbl), (pos,Uistate),
  1161         Form' (PpcKF (0,EdUndef,(length p),Nundef, (Problem pI, itms2itemppc dI'' itms pre))),
  1162           nxt, Safe, pt)
  1163       end    
  1164     (*WN110515 initialise ctxt again from itms and add preconds*)
  1165   | specify (Specify_Method' (mID,_,_)) (pos as (p,_)) c pt =
  1166       let
  1167         val (PblObj {origin=(oris,(dI',pI',mI'),_), probl=pbl, spec=(dI,pI,mI), 
  1168 		      meth=met, ctxt, ...}) = get_obj I pt p;
  1169         val {ppc,pre,prls,...} = get_met mID
  1170         val thy = assoc_thy dI
  1171         val oris = add_field' thy ppc oris;
  1172         val dI'' = if dI=e_domID then dI' else dI;
  1173         val pI'' = if pI = e_pblID then pI' else pI;
  1174         val met = if met=[] then pbl else met;
  1175         val (ok, (itms, pre')) = match_itms_oris thy met (ppc,pre,prls ) oris;
  1176         val (pos, _, _, pt) = 
  1177 	        generate1 thy (Specify_Method' (mID, oris, itms)) (Uistate, ctxt) pos pt
  1178         val (_,nxt) =
  1179           nxt_spec Met (*ok*)true oris (dI',pI',mI') (pbl, itms) 
  1180 		        ((#ppc o get_pbt) pI'',ppc) (dI'',pI'',mID);
  1181       in (pos, (pos,Uistate),
  1182         Form' (PpcKF (0,EdUndef,(length p),Nundef,
  1183 		      (Method mID, itms2itemppc (assoc_thy dI'') itms pre'))),
  1184            nxt, Safe, pt)
  1185       end    
  1186 
  1187   | specify (Add_Given' ct) p c pt = specify_additem "#Given" ct p c pt
  1188   | specify (Add_Find'  ct) p c pt = specify_additem "#Find"  ct p c pt
  1189   | specify (Add_Relation' ct) p c pt=specify_additem"#Relate"ct p c pt
  1190 
  1191   | specify (Specify_Theory' domID) (pos as (p,p_)) c pt =
  1192       let
  1193         val p_ = case p_ of Met => Met | _ => Pbl
  1194         val thy = assoc_thy domID;
  1195         val (PblObj{origin=(oris,(dI',pI',mI'),_), meth=met,
  1196 		      probl=pbl, spec=(dI,pI,mI), ctxt, ...}) = get_obj I pt p;
  1197         val mppc = case p_ of Met => met | _ => pbl;
  1198         val cpI = if pI = e_pblID then pI' else pI;
  1199         val {prls=per,ppc,where_=pwh,...} = get_pbt cpI
  1200         val cmI = if mI = e_metID then mI' else mI;
  1201         val {prls=mer,ppc=mpc,pre=mwh,...} = get_met cmI
  1202         val pre = 
  1203 	        case p_ of
  1204 	          Met => (check_preconds thy mer mwh met)
  1205 	        | _ => (check_preconds thy per pwh pbl)
  1206         val pb = foldl and_ (true, map fst pre)
  1207       in
  1208         if domID = dI
  1209         then
  1210           let val (p_,nxt) = nxt_spec p_ pb oris (dI',pI',mI') 
  1211 				    (pbl,met) (ppc,mpc) (dI,pI,mI);
  1212 	        in ((p,p_), (pos,Uistate), 
  1213 		        Form'(PpcKF (0,EdUndef,(length p), Nundef,
  1214 			        (header p_ pI cmI, itms2itemppc thy mppc pre))),
  1215 		        nxt,Safe,pt)
  1216           end
  1217         else (*FIXME: check ppc wrt. (new!) domID ..? still parsable?*)
  1218 	        let 
  1219 	          val ((p,p_),_,_,pt) =
  1220               generate1 thy (Specify_Theory' domID) (Uistate, ctxt) (p,p_) pt
  1221 	          val (p_,nxt) =
  1222               nxt_spec p_ pb oris (dI',pI',mI') (pbl,met) (ppc,mpc) (domID,pI,mI);
  1223 	        in ((p,p_), (pos,Uistate), 
  1224 	          Form' (PpcKF (0, EdUndef, (length p),Nundef,
  1225 			        (header p_ pI cmI, itms2itemppc thy mppc pre))),
  1226 	          nxt, Safe,pt)
  1227           end
  1228       end
  1229 
  1230   | specify m' _ _ _ = 
  1231       error ("specify: not impl. for " ^ tac_2str m');
  1232 
  1233 (*FIXME.WN110515 declare_constraints for ct (without dsc) into PblObj{ctxt, ...}
  1234   -- for input from scratch*)
  1235 fun nxt_specif_additem sel ct (ptp as (pt, (p, Pbl))) = 
  1236       let
  1237         val (PblObj{meth=met,origin=(oris,(dI',pI',_),_),
  1238 		      probl=pbl,spec=(dI,pI,_), ctxt, ...}) = get_obj I pt p;
  1239         val thy = if dI = e_domID then assoc_thy dI' else assoc_thy dI;
  1240         val cpI = if pI = e_pblID then pI' else pI;
  1241       in
  1242         case appl_add ctxt sel oris pbl ((#ppc o get_pbt) cpI) ct of
  1243 	        Add itm (*..union old input *) =>
  1244 	          let
  1245 	            (*val _=tracing("###nxt_specif_additem: itm= "^(itm2str_ itm));*)
  1246 	            val pbl' = insert_ppc thy itm pbl
  1247 	            val (tac,tac_) = 
  1248 		            case sel of
  1249 		              "#Given" => (Add_Given    ct, Add_Given'   (ct, pbl'))
  1250 		            | "#Find"  => (Add_Find     ct, Add_Find'    (ct, pbl'))
  1251 		            | "#Relate"=> (Add_Relation ct, Add_Relation'(ct, pbl'))
  1252 	            val ((p,Pbl),c,_,pt') = 
  1253 		            generate1 thy tac_ (Uistate, ctxt) (p,Pbl) pt
  1254 	          in ([(tac,tac_,((p,Pbl),(Uistate, ctxt)))], c, (pt',(p,Pbl))):calcstate' 
  1255             end	       
  1256 	      | Err msg => (*TODO.WN03 pass error-msgs to the frontend..
  1257                        FIXME ..and dont abuse a tactic for that purpose*)
  1258 	          ([(Tac msg, Tac_ (Thy_Info.get_theory "Pure", msg,msg,msg),
  1259 	            (e_pos', (e_istate, e_ctxt)))], [], ptp) 
  1260       end
  1261 
  1262   | nxt_specif_additem sel ct (ptp as (pt,(p,Met))) = 
  1263       let
  1264         val (PblObj{meth=met,origin=(oris,(dI',pI',mI'),_),
  1265 		      probl=pbl,spec=(dI,pI,mI), ctxt, ...}) = get_obj I pt p;
  1266         val thy = if dI = e_domID then assoc_thy dI' else assoc_thy dI;
  1267         val cmI = if mI = e_metID then mI' else mI;
  1268       in 
  1269         case appl_add ctxt sel oris met ((#ppc o get_met) cmI) ct of
  1270           Add itm (*..union old input *) =>
  1271 	          let
  1272 	            val met' = insert_ppc thy itm met;
  1273 	            val (tac,tac_) = 
  1274 	              case sel of
  1275 		              "#Given" => (Add_Given    ct, Add_Given'   (ct, met'))
  1276 		            | "#Find"  => (Add_Find     ct, Add_Find'    (ct, met'))
  1277 		            | "#Relate"=> (Add_Relation ct, Add_Relation'(ct, met'))
  1278 	            val ((p,Met),c,_,pt') = 
  1279 	              generate1 thy tac_ (Uistate, ctxt) (p,Met) pt
  1280 	          in ([(tac,tac_,((p,Met), (Uistate, ctxt)))], c, (pt',(p,Met))) end
  1281         | Err msg => ([(*tacis*)], [], ptp) 
  1282           (*nxt_me collects tacis until not hide; here just no progress*)
  1283       end;
  1284 
  1285 fun ori2Coritm pbt ((i,v,f,d,ts):ori) =
  1286     (i,v,true,f, Cor ((d,ts),(((snd o snd o the o (find_first (eq1 d))) pbt) 
  1287 			      handle _ => error ("ori2Coritm: dsc "^
  1288 						term2str d^
  1289 						"in ori, but not in pbt")
  1290 			      ,ts))):itm;
  1291 fun ori2Coritm (pbt:pat list) ((i,v,f,d,ts):ori) =
  1292     ((i,v,true,f, Cor ((d,ts),((snd o snd o the o 
  1293 			       (find_first (eq1 d))) pbt,ts))):itm)
  1294     handle _ => (*dsc in oris, but not in pbl pat list: keep this dsc*)
  1295     ((i,v,true,f, Cor ((d,ts),(d,ts))):itm);
  1296 
  1297 
  1298 (*filter out oris which have same description in itms*)
  1299 fun filter_outs oris [] = oris
  1300   | filter_outs oris (i::itms) = 
  1301     let val ors = filter_out ((curry op= ((d_in o #5) (i:itm))) o 
  1302 			      (#4:ori -> term)) oris;
  1303     in filter_outs ors itms end;
  1304 
  1305 fun memI a b = member op = a b;
  1306 (*filter oris which are in pbt, too*)
  1307 fun filter_pbt oris pbt =
  1308     let val dscs = map (fst o snd) pbt
  1309     in filter ((memI dscs) o (#4: ori -> term)) oris end;
  1310 
  1311 (*.combine itms from pbl + met and complete them wrt. pbt.*)
  1312 (*FIXXXME.WN031205 complete_metitms doesnt handle incorrect itms !*)
  1313 local infix mem;
  1314 fun x mem [] = false
  1315   | x mem (y :: ys) = x = y orelse x mem ys;
  1316 in 
  1317 fun complete_metitms (oris:ori list) (pits:itm list) (mits:itm list) met = 
  1318 (* val met = (#ppc o get_met) ["DiffApp","max_by_calculus"];
  1319    *)
  1320     let val vat = max_vt pits;
  1321         val itms = pits @ 
  1322 		   (filter ((curry (op mem) vat) o (#2:itm -> int list)) mits);
  1323 	val ors = filter ((curry (op mem) vat) o (#2:ori -> int list)) oris;
  1324         val os = filter_outs ors itms;
  1325     (*WN.12.03?: does _NOT_ add itms from met ?!*)
  1326     in itms @ (map (ori2Coritm met) os) end
  1327 end;
  1328 
  1329 
  1330 
  1331 (*.complete model and guard of a calc-head .*)
  1332 local infix mem;
  1333 fun x mem [] = false
  1334   | x mem (y :: ys) = x = y orelse x mem ys;
  1335 in 
  1336 fun complete_mod_ (oris, mpc, ppc, probl) =
  1337     let	val pits = filter_out ((curry op= false) o (#3: itm -> bool)) probl
  1338 	val vat = if probl = [] then 1 else max_vt probl
  1339 	val pors = filter ((curry (op mem) vat) o (#2:ori -> int list)) oris
  1340 	val pors = filter_outs pors pits (*which are in pbl already*)
  1341         val pors = (filter_pbt pors ppc) (*which are in pbt, too*)
  1342 
  1343 	val pits = pits @ (map (ori2Coritm ppc) pors)
  1344 	val mits = complete_metitms oris pits [] mpc
  1345     in (pits, mits) end
  1346 end;
  1347 
  1348 fun some_spec ((odI, opI, omI):spec) ((dI, pI, mI):spec) =
  1349     (if dI = e_domID then odI else dI,
  1350      if pI = e_pblID then opI else pI,
  1351      if mI = e_metID then omI else mI):spec;
  1352 
  1353 
  1354 (*.find a next applicable tac (for calcstate) and update ptree
  1355  (for ev. finding several more tacs due to hide).*)
  1356 (*FIXXXME: unify ... fun nxt_specif = nxt_spec + applicable_in + specify !!*)
  1357 (*WN.24.10.03        ~~~~~~~~~~~~~~   -> tac     -> tac_      -> -"- as arg*)
  1358 (*WN.24.10.03        fun nxt_solv   = ...................................??*)
  1359 fun nxt_specif (tac as Model_Problem) (pt, pos as (p,p_)) =
  1360     let
  1361       val PblObj {origin = (oris, ospec, _), probl, spec, ctxt, ...} = get_obj I pt p
  1362       val (dI, pI, mI) = some_spec ospec spec
  1363       val thy = assoc_thy dI
  1364       val mpc = (#ppc o get_met) mI (* just for reuse complete_mod_ *)
  1365       val {cas, ppc, ...} = get_pbt pI
  1366       val pbl = init_pbl ppc (* fill in descriptions *)
  1367       (*----------------if you think, this should be done by the Dialog 
  1368        in the java front-end, search there for WN060225-modelProblem----*)
  1369       val (pbl, met) = 
  1370         case cas of NONE => (pbl, [])
  1371   			| _ => complete_mod_ (oris, mpc, ppc, probl)
  1372       (*----------------------------------------------------------------*)
  1373       val tac_ = Model_Problem' (pI, pbl, met)
  1374       val (pos,c,_,pt) = generate1 thy tac_ (Uistate, ctxt) pos pt
  1375     in ([(tac,tac_, (pos, (Uistate, e_ctxt)))], c, (pt,pos)):calcstate' end
  1376 
  1377   | nxt_specif (Add_Given ct) ptp = nxt_specif_additem "#Given" ct ptp
  1378   | nxt_specif (Add_Find  ct) ptp = nxt_specif_additem "#Find"  ct ptp
  1379   | nxt_specif (Add_Relation ct) ptp = nxt_specif_additem"#Relate" ct ptp
  1380 
  1381     (*. called only if no_met is specified .*)     
  1382   | nxt_specif (Refine_Tacitly pI) (ptp as (pt, pos as (p,_))) =
  1383       let 
  1384         val (PblObj {origin = (oris, (dI,_,_),_), ctxt, ...}) = get_obj I pt p
  1385         val opt = refine_ori oris pI
  1386       in 
  1387         case opt of
  1388 	        SOME pI' => 
  1389 	          let 
  1390               val {met,ppc,...} = get_pbt pI'
  1391 	            val pbl = init_pbl ppc
  1392 	            (*val pt = update_pbl pt p pbl ..done by Model_Problem*)
  1393 	            val mI = if length met = 0 then e_metID else hd met
  1394               val thy = assoc_thy dI
  1395 	            val (pos,c,_,pt) = 
  1396 		            generate1 thy (Refine_Tacitly' (pI,pI',dI,mI,(*pbl*)[])) 
  1397 			            (Uistate, ctxt) pos pt
  1398 	          in ([(Refine_Tacitly pI, Refine_Tacitly' (pI,pI',dI,mI,(*pbl*)[]),
  1399 		          (pos, (Uistate, e_ctxt)))], c, (pt,pos)) 
  1400             end
  1401 	      | NONE => ([], [], ptp)
  1402       end
  1403 
  1404   | nxt_specif (Refine_Problem pI) (ptp as (pt, pos as (p,_))) =
  1405       let
  1406         val (PblObj {origin=(_,(dI,_,_),_),spec=(dI',_,_), probl, ctxt, ...}) = get_obj I pt p
  1407 	      val thy = if dI' = e_domID then dI else dI'
  1408       in 
  1409         case refine_pbl (assoc_thy thy) pI probl of
  1410 	        NONE => ([], [], ptp)
  1411 	      | SOME (rfd as (pI',_)) => 
  1412 	          let 
  1413               val (pos,c,_,pt) = generate1 (assoc_thy thy) 
  1414 			          (Refine_Problem' rfd) (Uistate, ctxt) pos pt
  1415 	          in ([(Refine_Problem pI, Refine_Problem' rfd,
  1416 			        (pos, (Uistate, e_ctxt)))], c, (pt,pos))
  1417             end
  1418       end
  1419 
  1420   | nxt_specif (Specify_Problem pI) (pt, pos as (p,_)) =
  1421       let
  1422         val (PblObj {origin=(oris,(dI,_,_),_),spec=(dI',pI',_), probl, ctxt, ...}) = get_obj I pt p;
  1423 	      val thy = assoc_thy (if dI' = e_domID then dI else dI');
  1424         val {ppc,where_,prls,...} = get_pbt pI
  1425 	      val pbl as (_,(itms,_)) = 
  1426 	        if pI'=e_pblID andalso pI=e_pblID
  1427 	        then (false, (init_pbl ppc, []))
  1428 	        else match_itms_oris thy probl (ppc,where_,prls) oris(*FIXXXXXME?*)
  1429 	        (*FIXXXME~~~~~~~~~~~~~~~: take pbl and compare with new pI WN.8.03*)
  1430 	      val ((p,Pbl),c,_,pt) = 
  1431 	        generate1 thy (Specify_Problem' (pI, pbl)) (Uistate, ctxt) pos pt
  1432       in ([(Specify_Problem pI, Specify_Problem' (pI, pbl),
  1433 		    (pos,(Uistate, e_ctxt)))], c, (pt,pos))
  1434       end
  1435 
  1436   (*transfers oris (not required in pbl) to met-model for script-env
  1437     FIXME.WN.8.03: application of several mIDs to SAME model?*)
  1438   | nxt_specif (Specify_Method mID) (ptp as (pt, pos as (p,_))) = 
  1439       let
  1440         val (PblObj {origin=(oris,(dI',pI',mI'),_), probl=pbl, spec=(dI,pI,mI), 
  1441           meth=met, ctxt, ...}) = get_obj I pt p;
  1442         val {ppc,pre,prls,...} = get_met mID
  1443         val thy = assoc_thy dI
  1444         val oris = add_field' thy ppc oris;
  1445         val dI'' = if dI=e_domID then dI' else dI;
  1446         val pI'' = if pI = e_pblID then pI' else pI;
  1447         val met = if met=[] then pbl else met;(*WN0602 what if more itms in met?*)
  1448         val (ok, (itms, pre')) = match_itms_oris thy met (ppc,pre,prls ) oris;
  1449         val (pos,c,_,pt)= 
  1450 	        generate1 thy (Specify_Method' (mID, oris, itms)) (Uistate, ctxt) pos pt
  1451       in ([(Specify_Method mID, Specify_Method' (mID, oris, itms),
  1452 		    (pos,(Uistate, e_ctxt)))], c, (pt,pos)) 
  1453       end    
  1454 
  1455   | nxt_specif (Specify_Theory dI) (pt, pos as (p,Pbl)) =
  1456       let
  1457         val ctxt = get_ctxt pt pos
  1458         val (dI',_,_) = get_obj g_spec pt p
  1459 	      val (pos,c,_,pt) = 
  1460 	        generate1 (assoc_thy "Isac") (Specify_Theory' dI)  (Uistate, ctxt) pos pt
  1461       in  (*FIXXXME: check if pbl can still be parsed*)
  1462 	      ([(Specify_Theory dI, Specify_Theory' dI, (pos,(Uistate, ctxt)))], c,
  1463 	        (pt, pos))
  1464       end
  1465 
  1466   | nxt_specif (Specify_Theory dI) (pt, pos as (p,Met)) =
  1467       let
  1468         val ctxt = get_ctxt pt pos
  1469         val (dI',_,_) = get_obj g_spec pt p
  1470 	      val (pos,c,_,pt) = 
  1471 	        generate1 (assoc_thy "Isac") (Specify_Theory' dI) (Uistate, ctxt) pos pt
  1472       in  (*FIXXXME: check if met can still be parsed*)
  1473 	      ([(Specify_Theory dI, Specify_Theory' dI, (pos,(Uistate, ctxt)))], c,
  1474 	        (pt, pos))
  1475       end
  1476 
  1477   | nxt_specif m' _ = 
  1478     error ("nxt_specif: not impl. for "^tac2str m');
  1479 
  1480 (* get the values from oris; handle the term list w.r.t. penv *)
  1481 local infix mem;
  1482 fun x mem [] = false
  1483   | x mem (y :: ys) = x = y orelse x mem ys;
  1484 in 
  1485 fun vals_of_oris oris =
  1486     ((map (mkval' o (#5:ori -> term list))) o 
  1487      (filter ((curry (op mem) 1) o (#2:ori -> int list)))) oris
  1488 end;
  1489 
  1490 (* create a calc-tree with oris via an cas.refined pbl *)
  1491 fun nxt_specify_init_calc (([], (dI, pI, mI)) : fmz) =
  1492       if pI <> [] 
  1493       then (* from pbl-browser or from CAS cmd with pI=[e_pblID] *)
  1494 	      let 
  1495           val {cas, met, ppc, thy, ...} = get_pbt pI
  1496 	        val dI = if dI = "" then theory2theory' thy else dI
  1497 	        val thy = assoc_thy dI
  1498 	        val mI = if mI = [] then hd met else mI
  1499 	        val hdl = case cas of NONE => pblterm dI pI | SOME t => t
  1500 	        val (pt,_) = cappend_problem e_ptree [] (Uistate, e_ctxt) ([], (dI,pI,mI))
  1501 					  ([], (dI,pI,mI), hdl)
  1502 	        val pt = update_spec pt [] (dI,pI,mI)
  1503 	        val pits = init_pbl' ppc
  1504 	        val pt = update_pbl pt [] pits
  1505 	      in ((pt, ([] ,Pbl)), []) : calcstate end
  1506       else 
  1507         if mI <> [] 
  1508         then (* from met-browser *)
  1509 	        let 
  1510             val {ppc,...} = get_met mI
  1511 	          val dI = if dI = "" then "Isac" else dI
  1512 	          val thy = assoc_thy dI;
  1513 	          val (pt,_) = cappend_problem e_ptree [] (e_istate, e_ctxt) ([], (dI,pI,mI))
  1514 					    ([], (dI,pI,mI), e_term(*FIXME met*));
  1515 	          val pt = update_spec pt [] (dI,pI,mI);
  1516 	          val mits = init_pbl' ppc;
  1517 	          val pt = update_met pt [] mits;
  1518 	        in ((pt, ([], Met)), []) : calcstate end
  1519         else (* new example, pepare for interactive modeling *)
  1520 	        let val (pt,_) = cappend_problem e_ptree [] (e_istate, e_ctxt) ([], e_spec)
  1521 					  ([], e_spec, e_term)
  1522 	        in ((pt, ([], Pbl)), []) : calcstate end
  1523 
  1524   | nxt_specify_init_calc (fmz : fmz_, (dI, pI, mI) : spec) = 
  1525       let           (* both """"""""""""""""""""""""" either empty or complete *)
  1526 	      val thy = assoc_thy dI
  1527 	      val (pI, (pors, pctxt), mI) = 
  1528 	        if mI = ["no_met"] 
  1529 	        then 
  1530             let 
  1531               val (pors, pctxt) = get_pbt pI |> #ppc |> prep_ori fmz thy;
  1532 		          val pI' = refine_ori' pors pI;
  1533 		        in (pI', (pors(*refinement over models with diff.precond only*), pctxt),
  1534 		          (hd o #met o get_pbt) pI') end
  1535 	        else (pI, get_pbt pI |> #ppc |> prep_ori fmz thy, mI)
  1536 	      val {cas, ppc, thy=thy',...} = get_pbt pI (*take dI from _refined_ pbl*)
  1537 	      val dI = theory2theory' (maxthy thy thy')
  1538 	      val hdl = 
  1539           case cas of
  1540 		        NONE => pblterm dI pI
  1541 		      | SOME t => subst_atomic ((vars_of_pbl_' ppc) ~~~ vals_of_oris pors) t;
  1542         val (pt, _) = cappend_problem e_ptree [] (e_istate, pctxt) (fmz, (dI, pI, mI))
  1543 				  (pors, (dI, pI, mI), hdl)
  1544         val pt = update_ctxt pt [] pctxt
  1545       in ((pt, ([], Pbl)), 
  1546         fst3 (nxt_specif Model_Problem (pt, ([], Pbl)))) : calcstate
  1547       end;
  1548 
  1549 
  1550 
  1551 (*18.12.99*)
  1552 fun get_spec_form (m:tac_) ((p,p_):pos') (pt:ptree) = 
  1553 (*  case appl_spec p pt m of           /// 19.1.00
  1554     Notappl e => Error' (Error_ e)
  1555   | Appl => 
  1556 *)    let val (_,_,f,_,_,_) = specify m (p,p_) [] pt
  1557       in f end;
  1558 
  1559 
  1560 (*fun tag_form thy (formal, given) = cterm_of thy
  1561 	      (((head_of o term_of) given) $ (term_of formal)); WN100819*)
  1562 fun tag_form thy (formal, given) =
  1563     (let val gf = (head_of given) $ formal;
  1564          val _ = cterm_of thy gf
  1565      in gf end)
  1566     handle _ =>
  1567            error ("calchead.tag_form: " ^ 
  1568                   Print_Mode.setmp [] (Syntax.string_of_term
  1569                                            (thy2ctxt thy)) given ^ " .. " ^
  1570                   Print_Mode.setmp [] (Syntax.string_of_term
  1571                                            (thy2ctxt thy)) formal ^
  1572                   " ..types do not match");
  1573 (* val formal = (the o (parse thy)) "[R::real]";
  1574 > val given = (the o (parse thy)) "fixed_values (cs::real list)";
  1575 > tag_form thy (formal, given);
  1576 val it = "fixed_values [R]" : cterm
  1577 *)
  1578 
  1579 fun chktyp thy (n, fs, gs) = 
  1580   ((writeln o (Print_Mode.setmp [] (Syntax.string_of_term (thy2ctxt thy))) o
  1581     (nth n)) fs;
  1582    (writeln o (Print_Mode.setmp [] (Syntax.string_of_term (thy2ctxt thy))) o
  1583     (nth n)) gs;
  1584    tag_form thy (nth n fs, nth n gs));
  1585 fun chktyps thy (fs, gs) = map (tag_form thy) (fs ~~ gs);
  1586 
  1587 (* #####################################################
  1588    find the failing item:
  1589 > val n = 2;
  1590 > val tag__form = chktyp (n,formals,givens);
  1591 > (type_of o term_of o (nth n)) formals; 
  1592 > (type_of o term_of o (nth n)) givens;
  1593 > atomty ((term_of o (nth n)) formals);
  1594 > atomty ((term_of o (nth n)) givens);
  1595 > atomty (term_of tag__form);
  1596 > use_thy"isa-98-1-HOL-plus/knowl-base/DiffAppl";
  1597  ##################################################### *)
  1598 
  1599 (* #####################################################
  1600    testdata setup
  1601 val origin = ["sqrt(9+4*x)=sqrt x + sqrt(5+x)","x::rat","(+0)"];
  1602 val formals = map (the o (parse thy)) origin;
  1603 
  1604 val given  = ["equation (lhs=rhs)",
  1605 	     "bound_variable bdv",   (* TODO type *) 
  1606 	     "error_bound apx"];
  1607 val where_ = ["e is_root_equation_in bdv",
  1608 	      "bdv is_var",
  1609 	      "apx is_const_expr"];
  1610 val find   = ["L::rat set"];
  1611 val with_  = ["L = {bdv. || ((%x. lhs) bdv) - ((%x. rhs) bdv) || < apx}"];
  1612 val chkpbl = map (the o (parse thy)) (given @ where_ @ find @ with_);
  1613 val givens = map (the o (parse thy)) given;
  1614 
  1615 val tag__forms = chktyps (formals, givens);
  1616 map ((atomty) o term_of) tag__forms;
  1617  ##################################################### *)
  1618 
  1619 
  1620 (* check pbltypes, announces one failure a time *)
  1621 (*fun chk_vars ctppc = 
  1622   let val {Given=gi,Where=wh,Find=fi,With=wi,Relate=re} = 
  1623     appc flat (mappc (vars o term_of) ctppc)
  1624   in if (wh\\gi) <> [] then ("wh\\gi",wh\\gi)
  1625      else if (re\\(gi union fi)) <> [] 
  1626 	    then ("re\\(gi union fi)",re\\(gi union fi))
  1627 	  else ("ok",[]) end;*)
  1628 fun chk_vars ctppc = 
  1629   let val {Given=gi,Where=wh,Find=fi,With=wi,Relate=re} = 
  1630           appc flat (mappc vars ctppc)
  1631       val chked = subtract op = gi wh
  1632   in if chked <> [] then ("wh\\gi", chked)
  1633      else let val chked = subtract op = (union op = gi fi) re
  1634           in if chked  <> []
  1635 	     then ("re\\(gi union fi)", chked)
  1636 	     else ("ok", []) 
  1637           end
  1638   end;
  1639 
  1640 (* check a new pbltype: variables (Free) unbound by given, find*) 
  1641 fun unbound_ppc ctppc =
  1642   let val {Given=gi,Find=fi,Relate=re,...} = 
  1643     appc flat (mappc vars ctppc)
  1644   in distinct (*re\\(gi union fi)*) 
  1645               (subtract op = (union op = gi fi) re) end;
  1646 (*
  1647 > val org = {Given=["[R=(R::real)]"],Where=[],
  1648 	   Find=["[A::real]"],With=[],
  1649 	   Relate=["[A=#2*a*b - a^^^#2, (a//#2)^^^#2 + (b//#2)^^^#2 = R^^^#2]"]
  1650 	   }:string ppc;
  1651 > val ctppc = mappc (the o (parse thy)) org;
  1652 > unbound_ppc ctppc;
  1653 val it = [("a","RealDef.real"),("b","RealDef.real")] : (string * typ) list
  1654 *)
  1655 
  1656 
  1657 (* f, a binary operator, is nested rightassociative *)
  1658 fun foldr1 f xs =
  1659   let
  1660     fun fld f (x::[]) = x
  1661       | fld f (x::x'::[]) = f (x',x)
  1662       | fld f (x::x'::xs) = f (fld f (x'::xs),x);
  1663   in ((fld f) o rev) xs end;
  1664 (*
  1665 > val (SOME ct) = parse thy "[a=b,c=d,e=f]";
  1666 > val ces = map (cterm_of thy) (isalist2list (term_of ct));
  1667 > val conj = foldr1 HOLogic.mk_conj (isalist2list (term_of ct));
  1668 > cterm_of thy conj;
  1669 val it = "(a = b & c = d) & e = f" : cterm
  1670 *)
  1671 
  1672 (* f, a binary operator, is nested leftassociative *)
  1673 fun foldl1 f (x::[]) = x
  1674   | foldl1 f (x::x'::[]) = f (x,x')
  1675   | foldl1 f (x::x'::xs) = f (x,foldl1 f (x'::xs));
  1676 (*
  1677 > val (SOME ct) = parse thy "[a=b,c=d,e=f,g=h]";
  1678 > val ces = map (cterm_of thy) (isalist2list (term_of ct));
  1679 > val conj = foldl1 HOLogic.mk_conj (isalist2list (term_of ct));
  1680 > cterm_of thy conj;
  1681 val it = "a = b & c = d & e = f & g = h" : cterm
  1682 *)
  1683 
  1684 
  1685 (* called only once, if a Subproblem has been located in the script*)
  1686 fun nxt_model_pbl (Subproblem'((_,pblID,metID),_,_,_,_,_)) ptp =
  1687      (case metID of
  1688 	      ["no_met"] => 
  1689 	        (snd3 o hd o fst3) (nxt_specif (Refine_Tacitly pblID) ptp)
  1690       | _ => (snd3 o hd o fst3) (nxt_specif Model_Problem ptp))
  1691         (*all stored in tac_ itms^^^^^^^^^^*)
  1692   | nxt_model_pbl tac_ _ = 
  1693       error ("nxt_model_pbl: called by tac= " ^ tac_2str tac_);
  1694 
  1695 (*fun eq1 d (_,(d',_)) = (d = d'); ---modspec.sml*)
  1696 fun eq4 v (_,vts,_,_,_) = member op = vts v;
  1697 fun eq5 (_,_,_,_,itm_) (_,_,_,d,_) = d_in itm_ = d;
  1698 
  1699  
  1700 (*.complete _NON_empty calc-head for autocalc (sub-)pbl from oris
  1701   + met from fmz; assumes pos on PblObj, meth = [].*)
  1702 fun complete_mod (pt, pos as (p, p_):pos') =
  1703 (* val (pt, (p, _)) = (pt, p);
  1704    val (pt, (p, _)) = (pt, pos);
  1705    *)
  1706     let val _= if p_ <> Pbl 
  1707 	       then tracing("###complete_mod: only impl.for Pbl, called with "^
  1708 			    pos'2str pos) else ()
  1709 	val (PblObj{origin=(oris, ospec, hdl), probl, spec, ...}) =
  1710 	    get_obj I pt p
  1711 	val (dI,pI,mI) = some_spec ospec spec
  1712 	val mpc = (#ppc o get_met) mI
  1713 	val ppc = (#ppc o get_pbt) pI
  1714 	val (pits, mits) = complete_mod_ (oris, mpc, ppc, probl)
  1715         val pt = update_pblppc pt p pits
  1716 	val pt = update_metppc pt p mits
  1717     in (pt, (p,Met):pos') end
  1718 ;
  1719 (*| complete_mod (pt, pos as (p, Met):pos') =
  1720     error ("###complete_mod: only impl.for Pbl, called with "^
  1721 		 pos'2str pos);*)
  1722 
  1723 (*.complete _EMPTY_ calc-head for autocalc (sub-)pbl from oris(+met from fmz);
  1724    oris and spec (incl. pbl-refinement) given from init_calc or SubProblem .*)
  1725 fun all_modspec (pt, (p,_):pos') =
  1726   let 
  1727     val (PblObj {fmz = (fmz_, _), origin = (pors, spec as (dI,pI,mI), hdl), ...}) = get_obj I pt p;
  1728     val thy = assoc_thy dI;
  1729 	  val {ppc, ...} = get_met mI;
  1730 	  val mors = prep_ori fmz_ thy ppc |> #1;
  1731     val pt = update_pblppc pt p (map (ori2Coritm ppc) pors);
  1732 	  val pt = update_metppc pt p (map (ori2Coritm ppc) mors);
  1733 	  val pt = update_spec pt p (dI,pI,mI);
  1734   in (pt, (p,Met): pos') end;
  1735 
  1736 (*WN0312: use in nxt_spec, too ? what about variants ???*)
  1737 fun is_complete_mod_ ([]: itm list) = false
  1738   | is_complete_mod_ itms = 
  1739     foldl and_ (true, (map #3 itms));
  1740 
  1741 fun is_complete_mod (pt, pos as (p, Pbl): pos') =
  1742       if (is_pblobj o (get_obj I pt)) p 
  1743       then (is_complete_mod_ o (get_obj g_pbl pt)) p
  1744       else error ("is_complete_mod: called by PrfObj at "^pos'2str pos)
  1745   | is_complete_mod (pt, pos as (p, Met)) = 
  1746       if (is_pblobj o (get_obj I pt)) p 
  1747       then (is_complete_mod_ o (get_obj g_met pt)) p
  1748       else error ("is_complete_mod: called by PrfObj at "^pos'2str pos)
  1749   | is_complete_mod (_, pos) =
  1750       error ("is_complete_mod called by " ^ pos'2str pos ^
  1751 		    " (should be Pbl or Met)");
  1752 
  1753 (*.have (thy, pbl, met) _all_ been specified explicitly ?.*)
  1754 fun is_complete_spec (pt, pos as (p,_): pos') = 
  1755     if (not o is_pblobj o (get_obj I pt)) p 
  1756     then error ("is_complete_spec: called by PrfObj at "^pos'2str pos)
  1757     else let val (dI,pI,mI) = get_obj g_spec pt p
  1758 	 in dI<>e_domID andalso pI<>e_pblID andalso mI<>e_metID end;
  1759 (*.complete empty items in specification from origin (pbl, met ev.refined);
  1760   assumes 'is_complete_mod'.*)
  1761 fun complete_spec (pt, pos as (p,_): pos') = 
  1762     let val PblObj {origin = (_,ospec,_), spec,...} = get_obj I pt p
  1763 	val pt = update_spec pt p (some_spec ospec spec)
  1764     in (pt, pos) end;
  1765 
  1766 fun is_complete_modspec ptp = 
  1767     is_complete_mod ptp andalso is_complete_spec ptp;
  1768 
  1769 
  1770 
  1771 
  1772 fun pt_model (PblObj {meth,spec,origin=(_,spec',hdl),...}) Met =
  1773 (* val ((PblObj {meth,spec,origin=(_,spec',hdl),...}), Met) = (ppobj, p_);
  1774    *)
  1775     let val (_,_,metID) = get_somespec' spec spec'
  1776 	val pre = 
  1777 	    if metID = e_metID then []
  1778 	    else let val {prls,pre=where_,...} = get_met metID
  1779 		     val pre = check_preconds' prls where_ meth 0
  1780 		 in pre end
  1781 	val allcorrect = is_complete_mod_ meth
  1782 			 andalso foldl and_ (true, (map #1 pre))
  1783     in ModSpec (allcorrect, Met, hdl, meth, pre, spec) end
  1784   | pt_model (PblObj {probl,spec,origin=(_,spec',hdl),...}) _(*Frm,Pbl*) =
  1785 (* val ((PblObj {probl,spec,origin=(_,spec',hdl),...}),_) = (ppobj, p_);
  1786    *)
  1787     let val (_,pI,_) = get_somespec' spec spec'
  1788 	val pre =
  1789 	    if pI = e_pblID then []
  1790 	    else let val {prls,where_,cas,...} = get_pbt pI
  1791 		     val pre = check_preconds' prls where_ probl 0
  1792 		 in pre end
  1793 	val allcorrect = is_complete_mod_ probl
  1794 			 andalso foldl and_ (true, (map #1 pre))
  1795     in ModSpec (allcorrect, Pbl, hdl, probl, pre, spec) end;
  1796 
  1797 
  1798 fun pt_form (PrfObj {form,...}) = Form form
  1799   | pt_form (PblObj {probl,spec,origin=(_,spec',_),...}) =
  1800     let val (dI, pI, _) = get_somespec' spec spec'
  1801 	val {cas,...} = get_pbt pI
  1802     in case cas of
  1803 	   NONE => Form (pblterm dI pI)
  1804 	 | SOME t => Form (subst_atomic (mk_env probl) t)
  1805     end;
  1806 (*vvv takes the tac _generating_ the formula=result, asm ok....
  1807 fun pt_result (PrfObj {result=(t,asm), tac,...}) = 
  1808     (Form t, 
  1809      if null asm then NONE else SOME asm, 
  1810      SOME tac)
  1811   | pt_result (PblObj {result=(t,asm), origin = (_,ospec,_), spec,...}) =
  1812     let val (_,_,metID) = some_spec ospec spec
  1813     in (Form t, 
  1814 	if null asm then NONE else SOME asm, 
  1815 	if metID = e_metID then NONE else SOME (Apply_Method metID)) end;
  1816 -------------------------------------------------------------------------*)
  1817 
  1818 
  1819 (*.pt_extract returns
  1820       # the formula at pos
  1821       # the tactic applied to this formula
  1822       # the list of assumptions generated at this formula
  1823 	(by application of another tac to the preceding formula !)
  1824    pos is assumed to come from the frontend, ie. generated by moveDown.*)
  1825 (*cannot be in ctree.sml, because ModSpec has to be calculated*)
  1826 fun pt_extract (pt,([],Res)) =
  1827 (* val (pt,([],Res)) = ptp;
  1828    *)
  1829     (* ML_TODO 110417 get assumptions from ctxt !? *)
  1830     let val (f, asm) = get_obj g_result pt []
  1831     in (Form f, NONE, asm) end
  1832 (* val p = [3,2];
  1833    *)
  1834   | pt_extract (pt,(p,Res)) =
  1835 (* val (pt,(p,Res)) = ptp;
  1836    *)
  1837     let val (f, asm) = get_obj g_result pt p
  1838 	val tac = if last_onlev pt p
  1839 		  then if is_pblobj' pt (lev_up p)
  1840 		       then let val (PblObj{spec=(_,pI,_),...}) = 
  1841 				    get_obj I pt (lev_up p)
  1842 			    in if pI = e_pblID then NONE 
  1843 			       else SOME (Check_Postcond pI) end
  1844 		       else SOME End_Trans (*WN0502 TODO for other branches*)
  1845 		  else let val p' = lev_on p
  1846 		       in if is_pblobj' pt p'
  1847 			  then let val (PblObj{origin = (_,(dI,pI,_),_),...}) =
  1848 				       get_obj I pt p'
  1849 			       in SOME (Subproblem (dI, pI)) end
  1850 			  else if f = get_obj g_form pt p'
  1851 			  then SOME (get_obj g_tac pt p')
  1852 			  (*because this Frm          ~~~is not on worksheet*)
  1853 			  else SOME (Take (term2str (get_obj g_form pt p')))
  1854 		       end
  1855     in (Form f, tac, asm) end
  1856 	
  1857   | pt_extract (pt, pos as (p,p_(*Frm,Pbl*))) =
  1858 (* val (pt, pos as (p,p_(*Frm,Pbl*))) = ptp;
  1859    val (pt, pos as (p,p_(*Frm,Pbl*))) = (pt, p);
  1860    *)
  1861     let val ppobj = get_obj I pt p
  1862 	val f = if is_pblobj ppobj then pt_model ppobj p_
  1863 		else get_obj pt_form pt p
  1864 	val tac = g_tac ppobj
  1865     in (f, SOME tac, []) end;
  1866 
  1867 
  1868 (**. get the formula from a ctree-node:
  1869  take form+res from PblObj and 1.PrfObj and (PrfObj after PblObj)
  1870  take res from all other PrfObj's .**)
  1871 (*designed for interSteps, outcommented 04 in favour of calcChangedEvent*)
  1872 fun formres p (Nd (PblObj {origin = (_,_, h), result = (r, _),...}, _)) =
  1873     [("headline", (p, Frm), h), 
  1874      ("stepform", (p, Res), r)]
  1875   | formres p (Nd (PrfObj {form, result = (r, _),...}, _)) = 
  1876     [("stepform", (p, Frm), form), 
  1877      ("stepform", (p, Res), r)];
  1878 
  1879 fun form p (Nd (PrfObj {result = (r, _),...}, _)) = 
  1880     [("stepform", (p, Res), r)]
  1881 
  1882 (*assumes to take whole level, in particular hd -- for use in interSteps*)
  1883 fun get_formress fs p [] = flat fs
  1884   | get_formress fs p (nd::nds) =
  1885     (* start with   'form+res'       and continue with trying 'res' only*)
  1886     get_forms (fs @ [formres p nd]) (lev_on p) nds
  1887 and get_forms fs p [] = flat fs
  1888   | get_forms fs p (nd::nds) =
  1889     if is_pblnd nd
  1890     (* start again with      'form+res' ///ugly repeat with Check_elementwise
  1891     then get_formress (fs @ [formres p nd]) (lev_on p) nds                   *)
  1892     then get_forms    (fs @ [formres p nd]) (lev_on p) nds
  1893     (* continue with trying 'res' only*)
  1894     else get_forms    (fs @ [form    p nd]) (lev_on p) nds;
  1895 
  1896 (**.get an 'interval' 'from' 'to' of formulae from a ptree.**)
  1897 (*WN050219 made robust against _'to' below or after Complete nodes
  1898 	   by handling exn caused by move_dn*)
  1899 (*WN0401 this functionality belongs to ctree.sml, 
  1900 but fetching a calc_head requires calculations defined in modspec.sml
  1901 transfer to ME/me.sml !!!
  1902 WN051224 ^^^ doesnt hold any longer, since only the headline of a calc_head
  1903 is returned !!!!!!!!!!!!!
  1904 *)
  1905 fun eq_pos' (p1,Frm) (p2,Frm) = p1 = p2
  1906   | eq_pos' (p1,Res) (p2,Res) = p1 = p2
  1907   | eq_pos' (p1,Pbl) (p2,p2_) = p1 = p2 andalso (case p2_ of
  1908 						     Pbl => true
  1909 						   | Met => true
  1910 						   | _ => false)
  1911   | eq_pos' (p1,Met) (p2,p2_) = p1 = p2 andalso (case p2_ of
  1912 						     Pbl => true
  1913 						   | Met => true
  1914 						   | _ => false)
  1915   | eq_pos' _ _ = false;
  1916 
  1917 (*.get an 'interval' from the ctree; 'interval' is w.r.t. the 
  1918    total ordering Position#compareTo(Position p) in the java-code
  1919 val get_interval = fn
  1920     : pos' ->     : from is "move_up 1st-element" to return
  1921       pos' -> 	  : to the last element to be returned; from < to
  1922       int -> 	  : level: 0 gets the flattest sub-tree possible
  1923 			   >999 gets the deepest sub-tree possible
  1924       ptree -> 	  : 
  1925       (pos' * 	  : of the formula
  1926        Term.term) : the formula
  1927 	  list
  1928 .*)
  1929 fun get_interval from to level pt =
  1930 (* val (from,level) = (f,lev);
  1931    val (from, to, level) = (([3, 2, 1], Res), ([],Res), 9999);
  1932    *)
  1933     let fun get_inter c (from:pos') (to:pos') lev pt =
  1934 (* val (c, from, to, lev) = ([], from, to, level);
  1935    ------for recursion.......
  1936    val (c, from:pos', to:pos') = (c @ [(from, f)], move_dn [] pt from, to);
  1937    *)
  1938 	    if eq_pos' from to orelse from = ([],Res)
  1939 	    (*orelse ... avoids Exception- PTREE "end of calculation" raised,
  1940 	     if 'to' has values NOT generated by move_dn, see systest/me.sml
  1941              TODO.WN0501: introduce an order on pos' and check "from > to"..
  1942              ...there is an order in Java! 
  1943              WN051224 the hack got worse with returning term instead ptform*)
  1944 	    then let val (f,_,_) = pt_extract (pt, from)
  1945 		 in case f of
  1946 			ModSpec (_,_,headline,_,_,_) => c @ [(from, headline)] 
  1947 		      | Form t => c @ [(from, t)]
  1948 		 end
  1949 	    else 
  1950 		if lev < lev_of from
  1951 		then (get_inter c (move_dn [] pt from) to lev pt)
  1952 		     handle (PTREE _(*from move_dn too far*)) => c
  1953 		else let val (f,_,_) = pt_extract (pt, from)
  1954 			 val term = case f of
  1955 					ModSpec (_,_,headline,_,_,_)=> headline
  1956 				      | Form t => t
  1957 		     in (get_inter (c @ [(from, term)]) 
  1958 				   (move_dn [] pt from) to lev pt)
  1959 			handle (PTREE _(*from move_dn too far*)) 
  1960 			       => c @ [(from, term)] end
  1961     in get_inter [] from to level pt end;
  1962 
  1963 (*for tests*)
  1964 fun posform2str (pos:pos', form) =
  1965     "("^ pos'2str pos ^", "^
  1966     (case form of 
  1967 	 Form f => term2str f
  1968        | ModSpec c => term2str (#3 c(*the headline*)))
  1969     ^")";
  1970 fun posforms2str pfs = (strs2str' o (map (curry op ^ "\n")) o 
  1971 			(map posform2str)) pfs;
  1972 fun posterm2str (pos:pos', t) =
  1973     "("^ pos'2str pos ^", "^term2str t^")";
  1974 fun posterms2str pfs = (strs2str' o (map (curry op ^ "\n")) o 
  1975 			(map posterm2str)) pfs;
  1976 
  1977 
  1978 (*WN050225 omits the last step, if pt is incomplete*)
  1979 fun show_pt pt = 
  1980     tracing (posterms2str (get_interval ([],Frm) ([],Res) 99999 pt));
  1981 
  1982 (*.get a calchead from a PblObj-node in the ctree; 
  1983    preconditions must be calculated.*)
  1984 fun get_ocalhd (pt, pos' as (p,Pbl):pos') = 
  1985     let val PblObj {origin = (oris, ospec, hdf'), spec, probl,...} = 
  1986 	    get_obj I pt p
  1987 	val {prls,where_,...} = get_pbt (#2 (some_spec ospec spec))
  1988 	val pre = check_preconds (assoc_thy"Isac") prls where_ probl
  1989     in (ocalhd_complete probl pre spec, Pbl, hdf', probl, pre, spec):ocalhd end
  1990 | get_ocalhd (pt, pos' as (p,Met):pos') = 
  1991     let val PblObj {fmz = fmz as (fmz_,_), origin = (oris, ospec, hdf'), 
  1992 		    spec, meth, ...} = 
  1993 	    get_obj I pt p
  1994 	val {prls,pre,...} = get_met (#3 (some_spec ospec spec))
  1995 	val pre = check_preconds (assoc_thy"Isac") prls pre meth
  1996     in (ocalhd_complete meth pre spec, Met, hdf', meth, pre, spec):ocalhd end;
  1997 
  1998 (*.at the activeFormula set the Model, the Guard and the Specification 
  1999    to empty and return a CalcHead;
  2000    the 'origin' remains (for reconstructing all that).*)
  2001 fun reset_calchead (pt, pos' as (p,_):pos') = 
  2002     let val PblObj {origin = (_, _, hdf'),...} = get_obj I pt p
  2003 	val pt = update_pbl pt p []
  2004 	val pt = update_met pt p []
  2005 	val pt = update_spec pt p e_spec
  2006     in (pt, (p,Pbl):pos') end;
  2007 
  2008 end
  2009 
  2010 open CalcHead;