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