src/Tools/isac/ME/calchead.sml
author Walther Neuper <neuper@ist.tugraz.at>
Wed, 18 Aug 2010 13:40:09 +0200
branchisac-update-Isa09-2
changeset 37924 6c53fe2519e5
parent 37906 e2b23ba9df13
child 37926 e6fc98fbcb85
permissions -rw-r--r--
established thy-ctxt strategy (1..2) for ME/mstools.sml

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