src/Tools/isac/Interpret/generate.sml
author Walther Neuper <wneuper@ist.tugraz.at>
Wed, 14 Dec 2016 10:45:41 +0100
changeset 59267 aab874fdd910
parent 59266 56762e8a672e
child 59268 c988bdecd7be
permissions -rw-r--r--
redesigned inout, mout (since 2003 for interface Kernel - Java)

cf 56762e8a672e note (1)
neuper@37906
     1
(* use"ME/generate.sml";
neuper@37906
     2
   use"generate.sml";
neuper@37906
     3
   *)
wneuper@59266
     4
signature CALC_TREE =
wneuper@59266
     5
sig (*vvv request into signature is incremental *)
wneuper@59266
     6
  (* for calchead.sml *)
wneuper@59266
     7
  type taci
wneuper@59266
     8
  val e_taci : taci
wneuper@59266
     9
  datatype edit = EdUndef | Protect | Write
wneuper@59266
    10
  eqtype indent
wneuper@59266
    11
  datatype nest = Closed | Nundef | Open
wneuper@59266
    12
  datatype pblmet = Method of metID | Problem of pblID | Upblmet
wneuper@59267
    13
  datatype inout =
wneuper@59267
    14
     Error_ of string
wneuper@59267
    15
  | FormKF of cellID * edit * indent * nest * cterm'
wneuper@59267
    16
  | PpcKF of cellID * edit * indent * nest * (pblmet * item ppc) 
wneuper@59267
    17
  | RefineKF of match list
wneuper@59267
    18
  | RefinedKF of pblID * (itm list * (bool * term) list)
wneuper@59266
    19
  datatype mout = EmptyMout | Error' of inout | Form' of inout | Problems of inout
wneuper@59266
    20
  val generate1 : theory -> tac_ -> istate * Proof.context ->
wneuper@59266
    21
    posel list * pos_ -> ptree -> pos' * pos' list * mout * ptree
wneuper@59266
    22
  val init_pbl : (string * (term * 'a)) list -> itm list
wneuper@59266
    23
  val init_pbl' : (string * (term * term)) list -> itm list
wneuper@59266
    24
  (* for appl.sml *)
wneuper@59266
    25
  (* for script.sml *)
wneuper@59266
    26
  (* for solve.sml *)
wneuper@59266
    27
  val generate_hard : theory -> tac_ -> pos * pos_ -> ptree -> pos' * pos' list * mout * ptree
wneuper@59266
    28
  val init_istate : tac -> term -> istate
wneuper@59266
    29
  (* for inform.sml *)
wneuper@59266
    30
  val embed_deriv : taci list -> ptree * pos' -> pos' list * (ptree * pos')
wneuper@59266
    31
  (* for mathengine.sml *)
wneuper@59266
    32
  val generate : (tac * tac_ * ((posel list * pos_) * (istate * Proof.context))) list ->
wneuper@59266
    33
     ptree * pos' list * pos' -> ptree * pos' list * pos'
wneuper@59266
    34
  (* for interface.sml *)
wneuper@59266
    35
  val generate_inconsistent_rew :
wneuper@59266
    36
     subs option * thm'' ->
wneuper@59266
    37
     term -> istate * Proof.context -> pos * pos_ -> ptree -> ptree * (posel list * pos_)
wneuper@59266
    38
(*/-------------------------------------------------------- ! aktivate for Test_Isac BEGIN ---\* )
wneuper@59266
    39
( *\--- ! aktivate for Test_Isac END ----------------------------------------------------------/*)
wneuper@59266
    40
end
neuper@37906
    41
wneuper@59266
    42
(**)
wneuper@59267
    43
structure Ctree(*: CALC_TREE*) =
wneuper@59266
    44
(**)
wneuper@59266
    45
struct
wneuper@59266
    46
(* initialize istate for Detail_Set *)
neuper@37906
    47
fun init_istate (Rewrite_Set rls) t =
neuper@37906
    48
    (case assoc_rls rls of
wneuper@59266
    49
      Rrls {scr = Rfuns {init_state = ii, ...}, ...} => RrlsState (ii t)
wneuper@59266
    50
    | Rls {scr = EmptyScr, ...} => 
wneuper@59266
    51
      error ("interSteps>..>init_istate: \"" ^ rls ^ "\" has EmptyScr." ^
wneuper@59266
    52
        "use prep_rls' for storing rule-sets !")
wneuper@59266
    53
    | Rls {scr = Prog s, ...} => (ScrState ([(one_scr_arg s, t)], [], NONE, e_term, Sundef, true))
wneuper@59266
    54
    | Seq {scr=EmptyScr,...} => 
wneuper@59266
    55
      error ("interSteps>..>init_istate: \"" ^ rls ^ "\" has EmptyScr." ^
wneuper@59266
    56
		    "use prep_rls' for storing rule-sets !")
wneuper@59266
    57
    | Seq {scr = Prog s,...} => (ScrState ([(one_scr_arg s, t)], [], NONE, e_term, Sundef, true))
wneuper@59266
    58
    | _ => error "init_istate Rewrite_Set: uncovered case assoc_rls")
neuper@37906
    59
  | init_istate (Rewrite_Set_Inst (subs, rls)) t =
wneuper@59266
    60
    let
wneuper@59266
    61
      val v = case subs2subst (assoc_thy "Isac") subs of
wneuper@59266
    62
        (_, v) :: _ => v
wneuper@59266
    63
      | _ => error "init_istate: uncovered case "
neuper@37906
    64
    (*...we suppose the substitution of only _one_ bound variable*)
neuper@37906
    65
    in case assoc_rls rls of
wneuper@59266
    66
      Rls {scr = EmptyScr, ...} => 
wneuper@59266
    67
        error ("interSteps>..>init_istate: \""^rls^"\" has EmptyScr." ^
wneuper@59266
    68
          "use prep_rls' for storing rule-sets !")
wneuper@59266
    69
	  | Rls {scr = Prog s, ...} =>
wneuper@59266
    70
	    let val (form, bdv) = two_scr_arg s
wneuper@59266
    71
	    in (ScrState ([(form, t), (bdv, v)], [], NONE, e_term, Sundef,true))
wneuper@59266
    72
	    end
wneuper@59266
    73
	  | Seq {scr = EmptyScr, ...} => 
wneuper@59266
    74
	    error ("interSteps>..>init_istate: \""^rls^"\" has EmptyScr." ^
wneuper@59266
    75
	      "use prep_rls' for storing rule-sets !")
wneuper@59266
    76
	  | Seq {scr = Prog s,...} =>
wneuper@59266
    77
	    let val (form, bdv) = two_scr_arg s
wneuper@59266
    78
	    in (ScrState ([(form, t), (bdv, v)],[], NONE, e_term, Sundef,true))
wneuper@59266
    79
	    end
wneuper@59266
    80
    | _ => error "init_istate Rewrite_Set_Inst: uncovered case assoc_rls"
wneuper@59266
    81
    end
wneuper@59266
    82
  | init_istate tac _ = error ("init_istate: uncovered definition for " ^ tac2str tac)
neuper@37906
    83
wneuper@59266
    84
(* a taci holds alle information required to build a node in the calc-tree;
neuper@37906
    85
   a taci is assumed to be used efficiently such that the calc-tree
neuper@37906
    86
   resulting from applying a taci need not be stored separately;
wneuper@59266
    87
   see "type calcstate" *)
neuper@37906
    88
(*TODO.WN0504 redesign ??? or redesign generate ?? see "fun generate"
neuper@37906
    89
  TODO.WN0512 ? redesign this _list_:
neuper@37906
    90
  # only used for [Apply_Method + (Take or Subproblem)], i.e. for initacs
neuper@37906
    91
  # the latter problem may be resolved automatically if "fun autocalc" is 
neuper@37906
    92
    not any more used for the specify-phase and for changing the phases*)
neuper@37906
    93
type taci = 
wneuper@59266
    94
  (tac *                        (* for comparison with input tac             *)      
wneuper@59266
    95
   tac_ *                       (* for ptree generation                      *)
wneuper@59266
    96
   (pos' *                      (* after applying tac_, for ptree generation *)
wneuper@59266
    97
    (istate * Proof.context)))  (* after applying tac_, for ptree generation *)
wneuper@59266
    98
val e_taci = (Empty_Tac, Empty_Tac_, (e_pos', (e_istate, e_ctxt))): taci
bonzai@41948
    99
fun taci2str ((tac, tac_, (pos', (istate, _))):taci) =
wneuper@59266
   100
  "( " ^ tac2str tac ^ ", " ^ tac_2str tac_ ^ ", ( " ^ pos'2str pos' ^ ", " ^
wneuper@59266
   101
  istate2str istate ^ " ))"
wneuper@59266
   102
fun tacis2str tacis = (strs2str o (map (linefeed o taci2str))) tacis
neuper@37906
   103
wneuper@59266
   104
datatype pblmet =     (*%^%*)
wneuper@59266
   105
  Upblmet             (*undefined*)
wneuper@59266
   106
| Problem of pblID    (*%^%*)
wneuper@59266
   107
| Method of metID;    (*%^%*)
wneuper@59266
   108
fun pblmet2str (Problem pblID) = "Problem " ^ strs2str pblID (*%^%*)
wneuper@59266
   109
  | pblmet2str (Method metID) = "Method " ^ metID2str metID (*%^%*)
wneuper@59266
   110
  | pblmet2str x = error ("pblmet2str: uncovered definition " ^ pblmet2str x)
neuper@37906
   111
neuper@37906
   112
(*3.5.00: TODO: foppFK eliminated in interface FE-KE !!!*)
neuper@37906
   113
datatype foppFK =                  (* in DG cases div 2 *)
neuper@37906
   114
  EmptyFoppFK         (*DG internal*)
neuper@37906
   115
| FormFK of cterm'
wneuper@59266
   116
| PpcFK of cterm' ppc
wneuper@59266
   117
fun foppFK2str (FormFK ct') ="FormFK " ^ ct'
wneuper@59266
   118
  | foppFK2str (PpcFK  ppc) ="PpcFK " ^ ppc2str ppc
wneuper@59266
   119
  | foppFK2str EmptyFoppFK  ="EmptyFoppFK"
neuper@37906
   120
neuper@37906
   121
datatype nest = Open | Closed | Nundef;
neuper@37906
   122
fun nest2str Open = "Open"
neuper@37906
   123
  | nest2str Closed = "Closed"
wneuper@59266
   124
  | nest2str Nundef = "Nundef"
neuper@37906
   125
neuper@37906
   126
type indent = int;
neuper@37906
   127
datatype edit = EdUndef | Write | Protect;
neuper@37906
   128
                                   (* bridge --> kernel *)
neuper@37906
   129
                                   (* bridge <-> kernel *)
neuper@37906
   130
(* needed in dialog.sml *)         (* bridge <-- kernel *)
neuper@37906
   131
fun edit2str EdUndef = "EdUndef"
neuper@37906
   132
  | edit2str Write = "Write"
neuper@37906
   133
  | edit2str Protect = "Protect";
neuper@37906
   134
neuper@42023
   135
datatype inout = (*FIXME.WN1105 drop this: was required for proto0 with dialog in sml*)
wneuper@59266
   136
  Error_ of string                                             (*<--*)
neuper@37906
   137
| FormKF of cellID * edit * indent * nest * cterm'             (*<--*)
neuper@37906
   138
| PpcKF of cellID * edit * indent * nest * (pblmet * item ppc) (*<--*)
neuper@37906
   139
| RefineKF of match list                                       (*<--*)
wneuper@59266
   140
| RefinedKF of (pblID * ((itm list) * ((bool * term) list)))   (*<--*)
neuper@37906
   141
neuper@37906
   142
fun inout2str End_Proof = "End_Proof"
neuper@37906
   143
  | inout2str (Error_  s) = "Error_ "^s
neuper@37906
   144
  | inout2str (FormKF (cellID, edit, indent, nest, ct')) =  
neuper@37906
   145
	       "FormKF ("^(string_of_int cellID)^","
neuper@37906
   146
	       ^(edit2str edit)^","^(string_of_int indent)^","
neuper@37906
   147
	       ^(nest2str nest)^",("
neuper@37906
   148
	       ^ct' ^")"
neuper@37906
   149
  | inout2str (PpcKF (cellID, edit, indent, nest, (pm,itemppc))) =
neuper@37906
   150
	       "PpcKF ("^(string_of_int cellID)^","
neuper@37906
   151
	       ^(edit2str edit)^","^(string_of_int indent)^","
neuper@37906
   152
	       ^(nest2str nest)^",("
neuper@37906
   153
	       ^(pblmet2str pm)^","^(itemppc2str itemppc)^"))"
neuper@37906
   154
  | inout2str (RefineKF ms)  = "RefineKF "^(matchs2str ms)
wneuper@59266
   155
  | inout2str _ = error "inout2str: uncovered definition"
wneuper@59266
   156
fun inouts2str ios = (strs2str' o (map inout2str)) ios
neuper@37906
   157
wneuper@59267
   158
(*
wneuper@59267
   159
  datatype mout = EmptyMout | Error' of inout | Form' of inout | Problems of inout
wneuper@59267
   160
*)
neuper@37906
   161
datatype mout =
wneuper@59267
   162
  FormKF of cterm'
wneuper@59267
   163
| PpcKF of (pblmet * item ppc) 
wneuper@59267
   164
| RefinedKF of pblID * (itm list * (bool * term) list)
wneuper@59267
   165
| Error' of string
wneuper@59267
   166
| EmptyMout
neuper@37906
   167
wneuper@59267
   168
fun mout2str (FormKF cterm') = "FormKF " ^ cterm'
wneuper@59267
   169
  | mout2str (PpcKF  (pm, itemppc)) = "PpcKF (" ^ pblmet2str pm ^ "," ^ itemppc2str itemppc ^ ")"
wneuper@59267
   170
  | mout2str (RefinedKF  (pblID, ls)) = "mout2str: RefinedKF not impl."
wneuper@59267
   171
  | mout2str (Error'  str) = "Error' " ^ str
wneuper@59267
   172
  | mout2str (EmptyMout    ) = "EmptyMout"
neuper@37906
   173
neuper@37906
   174
(* init pbl with ...,dsc,empty | [] *)
neuper@37906
   175
fun init_pbl pbt = 
wneuper@59266
   176
  let
wneuper@59266
   177
    fun pbt2itm (f, (d, _)) = ((0, [], false, f, Inc ((d, []), (e_term, []))) : itm)
wneuper@59266
   178
  in map pbt2itm pbt end
wneuper@59266
   179
wneuper@59266
   180
(* take formal parameters from pbt, for transfer from pbl/met-hierarchy *)
neuper@37906
   181
fun init_pbl' pbt = 
neuper@37906
   182
  let 
wneuper@59266
   183
    fun pbt2itm (f, (d, t)) = ((0, [], false, f, Inc((d, [t]), (e_term, []))) : itm)
wneuper@59266
   184
  in map pbt2itm pbt end
neuper@37906
   185
neuper@37906
   186
(*generate 1 ppobj in ptree*)
neuper@37906
   187
(*TODO.WN0501: take calcstate as an argument (see embed_derive etc.)?specify?*)
wneuper@59266
   188
fun generate1 thy (Add_Given' (_, itmlist)) _ (pos as (p, p_)) pt = 
wneuper@59267
   189
    (pos: pos', [], PpcKF (Upblmet, itms2itemppc thy [][]),
wneuper@59266
   190
       case p_ of
wneuper@59266
   191
         Pbl => update_pbl pt p itmlist
wneuper@59266
   192
	     | Met => update_met pt p itmlist
wneuper@59266
   193
       | _ => error ("uncovered case " ^ pos_2str p_))
wneuper@59266
   194
    (* WN110515 probably declare_constraints with input item (without dsc) --
wneuper@59266
   195
      -- important when specifying without formalisation *)
wneuper@59266
   196
  | generate1 thy (Add_Find' (_, itmlist)) _ (pos as (p, p_)) pt = 
wneuper@59267
   197
    (pos, [], (PpcKF (Upblmet, itms2itemppc thy [] [])),
wneuper@59266
   198
       case p_ of
wneuper@59266
   199
         Pbl => update_pbl pt p itmlist
wneuper@59266
   200
	     | Met => update_met pt p itmlist
wneuper@59266
   201
       | _ => error ("uncovered case " ^ pos_2str p_))
neuper@41994
   202
    (*WN110515 probably declare_constraints with input item (without dsc)*)
wneuper@59266
   203
  | generate1 thy (Add_Relation' (_, itmlist)) _ (pos as (p, p_)) pt = 
wneuper@59267
   204
    (pos, [],  PpcKF (Upblmet, itms2itemppc thy [] []),
wneuper@59266
   205
       case p_ of
wneuper@59266
   206
         Pbl => update_pbl pt p itmlist
wneuper@59266
   207
	     | Met => update_met pt p itmlist
wneuper@59266
   208
       | _ => error ("uncovered case " ^ pos_2str p_))
bonzai@41948
   209
  | generate1 thy (Specify_Theory' domID) _ (pos as (p,_)) pt = 
wneuper@59267
   210
    (pos, [] , PpcKF  (Upblmet, itms2itemppc thy [] []),
wneuper@59266
   211
      update_domID pt p domID)
wneuper@59266
   212
  | generate1 thy (Specify_Problem' (pI, (_, (itms, _)))) _ (p, _) pt = 
wneuper@59266
   213
    let
wneuper@59266
   214
      val pt = update_pbl pt p itms
wneuper@59266
   215
      val pt = update_pblID pt p pI
wneuper@59266
   216
    in
wneuper@59267
   217
      ((p, Pbl), [], PpcKF (Upblmet, itms2itemppc thy [] []), pt)
wneuper@59266
   218
    end
wneuper@59266
   219
  | generate1 thy (Specify_Method' (mID, oris, itms)) _ (p, _) pt = 
wneuper@59266
   220
    let
wneuper@59266
   221
      val pt = update_oris pt p oris
wneuper@59266
   222
      val pt = update_met pt p itms
wneuper@59266
   223
      val pt = update_metID pt p mID
wneuper@59266
   224
    in
wneuper@59267
   225
      ((p, Met), [], PpcKF (Upblmet, itms2itemppc thy [] []), pt)
wneuper@59266
   226
    end
bonzai@41948
   227
  | generate1 thy (Model_Problem' (_, itms, met)) _ (pos as (p,_)) pt =
wneuper@59266
   228
    let 
wneuper@59266
   229
      val pt = update_pbl pt p itms
wneuper@59266
   230
	    val pt = update_met pt p met
wneuper@59266
   231
    in
wneuper@59267
   232
      (pos, [], PpcKF (Upblmet, itms2itemppc thy [] []), pt)
neuper@37906
   233
    end
wneuper@59266
   234
  | generate1 thy (Refine_Tacitly' (_, pIre, domID, metID, pbl)) _ (pos as (p, _)) pt = 
wneuper@59266
   235
    let
wneuper@59266
   236
      val pt = update_pbl pt p pbl
wneuper@59266
   237
      val pt = update_orispec pt p (domID, pIre, metID)
wneuper@59266
   238
    in
wneuper@59267
   239
      (pos, [], PpcKF (Upblmet, itms2itemppc thy [] []), pt)
wneuper@59266
   240
    end
wneuper@59266
   241
  | generate1 thy (Refine_Problem' (pI, _)) _ (pos as (p, _)) pt =
wneuper@59266
   242
    let
wneuper@59266
   243
      val (dI, _, mI) = get_obj g_spec pt p
wneuper@59266
   244
      val pt = update_spec pt p (dI, pI, mI)
wneuper@59266
   245
    in
wneuper@59267
   246
      (pos, [], PpcKF (Upblmet, itms2itemppc thy [] []), pt)
wneuper@59266
   247
    end
wneuper@59266
   248
  | generate1 _ (Apply_Method' (_, topt, is, ctxt)) _ (pos as (p, _)) pt = 
wneuper@59266
   249
    (case topt of 
wneuper@59266
   250
      SOME t => 
wneuper@59266
   251
        let val (pt, c) = cappend_form pt p (is, ctxt) t
wneuper@59266
   252
        in (pos, c, EmptyMout, pt) end
wneuper@59266
   253
    | NONE => (pos, [], EmptyMout, update_env pt p (SOME (is, ctxt))))
wneuper@59266
   254
  | generate1 _ (Take' t) l (p, _) pt = (* val (Take' t) = m; *)
wneuper@59266
   255
    let
wneuper@59266
   256
      val p =
wneuper@59266
   257
        let val (ps, p') = split_last p (* no connex to prev.ppobj *)
wneuper@59266
   258
	      in if p' = 0 then ps @ [1] else p end
wneuper@59266
   259
      val (pt, c) = cappend_form pt p l t
wneuper@59266
   260
    in
wneuper@59267
   261
      ((p, Frm): pos', c, FormKF (term2str t), pt)
wneuper@59266
   262
    end
wneuper@59266
   263
  | generate1 _ (Begin_Trans' t) l (p, Frm) pt =
wneuper@59266
   264
    let
wneuper@59266
   265
      val (pt, c) = cappend_form pt p l t
neuper@37906
   266
      val pt = update_branch pt p TransitiveB (*040312*)
wneuper@59266
   267
      (* replace the old PrfOjb ~~~~~ *)
wneuper@59266
   268
      val p = (lev_on o lev_dn (* starts with [...,0] *)) p
wneuper@59266
   269
      val (pt, c') = cappend_form pt p l t (*FIXME.0402 same istate ???*)
wneuper@59266
   270
    in
wneuper@59267
   271
      ((p, Frm), c @ c', FormKF (term2str t), pt)
wneuper@59266
   272
    end
wneuper@59266
   273
  | generate1 thy (Begin_Trans' t) l (p, Res) pt = 
wneuper@59266
   274
    (*append after existing PrfObj    vvvvvvvvvvvvv*)
wneuper@59266
   275
    generate1 thy (Begin_Trans' t) l (lev_on p, Frm) pt
wneuper@59266
   276
  | generate1 _ (End_Trans' tasm) l (p, _) pt =
wneuper@59266
   277
    let
wneuper@59266
   278
      val p' = lev_up p
wneuper@59266
   279
      val (pt, c) = append_result pt p' l tasm Complete
wneuper@59266
   280
    in
wneuper@59267
   281
      ((p', Res), c, FormKF (term2str t), pt)
wneuper@59266
   282
    end
wneuper@59266
   283
  | generate1 _ (Rewrite_Inst' (_, _, _, _, subs', thm', f, (f', asm))) (is, ctxt) (p, _) pt =
wneuper@59266
   284
    let
wneuper@59266
   285
      val (pt, c) = cappend_atomic pt p (is, insert_assumptions asm ctxt) f
wneuper@59266
   286
        (Rewrite_Inst (subst2subs subs', thm')) (f',asm) Complete;
wneuper@59266
   287
      val pt = update_branch pt p TransitiveB
wneuper@59267
   288
    in
wneuper@59267
   289
      ((p, Res), c, FormKF (term2str f'), pt)
wneuper@59267
   290
    end
wneuper@59266
   291
 | generate1 _ (Rewrite' (_, _, _, _, thm', f, (f', asm))) (is, ctxt) (p, _) pt =
wneuper@59266
   292
   let
wneuper@59266
   293
     val (pt, c) = cappend_atomic pt p (is, insert_assumptions asm ctxt) f
wneuper@59266
   294
       (Rewrite thm') (f', asm) Complete
wneuper@59266
   295
     val pt = update_branch pt p TransitiveB
wneuper@59266
   296
   in
wneuper@59267
   297
    ((p, Res), c, FormKF (term2str f'), pt)
wneuper@59266
   298
   end
wneuper@59266
   299
  | generate1 thy (Rewrite_Asm' all) l p pt = generate1 thy (Rewrite' all) l p pt
wneuper@59266
   300
  | generate1 _ (Rewrite_Set_Inst' (_, _, subs', rls', f, (f', asm))) (is, ctxt) (p, _) pt =
wneuper@59266
   301
    let
wneuper@59266
   302
      val (pt, c) = cappend_atomic pt p (is, insert_assumptions asm ctxt) f 
wneuper@59266
   303
        (Rewrite_Set_Inst (subst2subs subs', id_rls rls')) (f', asm) Complete
wneuper@59266
   304
      val pt = update_branch pt p TransitiveB
wneuper@59266
   305
    in
wneuper@59267
   306
      ((p, Res), c, FormKF (term2str f'), pt)
wneuper@59266
   307
    end
wneuper@59266
   308
  | generate1 thy (Detail_Set_Inst' (_, _, subs, rls, f, (_, asm))) (is, ctxt) (p, _) pt =
wneuper@59266
   309
    let
wneuper@59266
   310
      val ctxt' = insert_assumptions asm ctxt
wneuper@59266
   311
      val (pt, _) = cappend_form pt p (is, ctxt') f 
wneuper@59266
   312
      val pt = update_branch pt p TransitiveB
wneuper@59266
   313
      val is = init_istate (Rewrite_Set_Inst (subst2subs subs, id_rls rls)) f 
wneuper@59266
   314
      val tac_ = Apply_Method' (e_metID, SOME t, is, ctxt')
wneuper@59266
   315
      val pos' = ((lev_on o lev_dn) p, Frm)
wneuper@59266
   316
    in
wneuper@59266
   317
      generate1 thy tac_ (is, ctxt') pos' pt (*implicit Take*)
wneuper@59266
   318
    end
wneuper@59266
   319
  | generate1 _ (Rewrite_Set' (_, _, rls', f, (f', asm))) (is, ctxt) (p, _) pt =
wneuper@59266
   320
    let
wneuper@59266
   321
      val (pt, c) = cappend_atomic pt p (is, insert_assumptions asm ctxt) f 
wneuper@59266
   322
        (Rewrite_Set (id_rls rls')) (f',asm) Complete
wneuper@59266
   323
      val pt = update_branch pt p TransitiveB
wneuper@59266
   324
    in
wneuper@59267
   325
      ((p, Res), c, FormKF (term2str f'), pt)
wneuper@59266
   326
    end
wneuper@59266
   327
  | generate1 thy (Detail_Set' (_, _, rls, f, (_, asm))) (is, ctxt) (p, _) pt =
wneuper@59266
   328
    let
wneuper@59266
   329
      val ctxt' = insert_assumptions asm ctxt
wneuper@59266
   330
      val (pt, _) = cappend_form pt p (is, ctxt') f 
wneuper@59266
   331
      val pt = update_branch pt p TransitiveB
wneuper@59266
   332
      val is = init_istate (Rewrite_Set (id_rls rls)) f
wneuper@59266
   333
      val tac_ = Apply_Method' (e_metID, SOME t, is, ctxt')
wneuper@59266
   334
      val pos' = ((lev_on o lev_dn) p, Frm)
wneuper@59266
   335
    in
wneuper@59266
   336
      generate1 thy tac_ (is, ctxt') pos' pt (*implicit Take*)
wneuper@59266
   337
    end
wneuper@59266
   338
  | generate1 _ (Check_Postcond' (_, (scval, asm))) l (p, _) pt =
neuper@42394
   339
      let
wneuper@59266
   340
        val (pt, c) = append_result pt p l (scval, asm) Complete
wneuper@59266
   341
      in
wneuper@59267
   342
        ((p, Res), c, FormKF (term2str scval), pt)
wneuper@59266
   343
      end
wneuper@59266
   344
  | generate1 _ (Calculate' (_, op_, f, (f', _))) l (p, _) pt =
neuper@42394
   345
      let
wneuper@59266
   346
        val (pt,c) = cappend_atomic pt p l f (Calculate op_) (f', []) Complete
wneuper@59266
   347
      in
wneuper@59267
   348
        ((p, Res), c, FormKF (term2str f'), pt)
wneuper@59266
   349
      end
wneuper@59266
   350
  | generate1 _ (Check_elementwise' (consts, pred, (f', asm))) l (p, _) pt =
neuper@42394
   351
      let
wneuper@59266
   352
        val (pt,c) = cappend_atomic pt p l consts (Check_elementwise pred) (f',asm) Complete
wneuper@59266
   353
      in
wneuper@59267
   354
        ((p, Res), c, FormKF (term2str f'), pt)
wneuper@59266
   355
      end
wneuper@59266
   356
  | generate1 _ (Or_to_List' (ors, list)) l (p, _) pt =
neuper@42394
   357
      let
wneuper@59266
   358
        val (pt,c) = cappend_atomic pt p l ors Or_to_List (list, []) Complete
wneuper@59266
   359
      in
wneuper@59267
   360
        ((p, Res), c, FormKF (term2str list), pt)
wneuper@59266
   361
      end
wneuper@59266
   362
  | generate1 _ (Substitute' (_, _, subte, t, t')) l (p, _) pt =
neuper@41983
   363
      let
neuper@41983
   364
        val (pt,c) =
wneuper@59266
   365
          cappend_atomic pt p l t (Substitute (subte2sube subte)) (t',[]) Complete
wneuper@59267
   366
        in ((p, Res), c, FormKF (term2str t'), pt) 
wneuper@59266
   367
        end
wneuper@59266
   368
  | generate1 _ (Tac_ (_, f, id, f')) l (p, _) pt =
neuper@42394
   369
      let
wneuper@59266
   370
        val (pt, c) = cappend_atomic pt p l (str2term f) (Tac id) (str2term f', []) Complete
wneuper@59266
   371
      in
wneuper@59267
   372
        ((p,Res), c, FormKF f', pt)
wneuper@59266
   373
      end
wneuper@59266
   374
  | generate1 thy (Subproblem' ((domID, pblID, metID), oris, hdl, fmz_, ctxt, f)) l (p, _) pt =
wneuper@59266
   375
    let
wneuper@59266
   376
	    val (pt, c) = cappend_problem pt p l (fmz_, (domID, pblID, metID)) (oris, (domID, pblID, metID), hdl)
wneuper@59266
   377
      val pt = update_ctxt pt p ctxt
wneuper@59266
   378
	    val f = Syntax.string_of_term (thy2ctxt thy) f
wneuper@59266
   379
    in
wneuper@59267
   380
      ((p, Pbl), c, FormKF f, pt)
wneuper@59266
   381
    end
wneuper@59266
   382
  | generate1 _ m' _ _ _ = error ("generate1: not impl.for " ^ tac_2str m')
bonzai@41951
   383
neuper@42437
   384
fun generate_inconsistent_rew (subs_opt, thm') f' (is, ctxt) (pos as (p,_)) pt =
neuper@42434
   385
  let
wneuper@59266
   386
    val f = get_curr_formula (pt, pos)
wneuper@59266
   387
    val pos' as (p', _) = (lev_on p, Res)
wneuper@59266
   388
    val (pt, _) = case subs_opt of
wneuper@59266
   389
      NONE => cappend_atomic pt p' (is, insert_assumptions [] ctxt) f
wneuper@59266
   390
        (Rewrite thm') (f', []) Inconsistent
wneuper@59266
   391
    | SOME subs => cappend_atomic pt p' (is, insert_assumptions [] ctxt) f
wneuper@59266
   392
        (Rewrite_Inst (subs, thm')) (f', []) Inconsistent
wneuper@59266
   393
    val pt = update_branch pt p' TransitiveB
neuper@42437
   394
  in (pt, pos') end
neuper@42432
   395
neuper@37906
   396
fun generate_hard thy m' (p,p_) pt =
neuper@37906
   397
  let  
wneuper@59266
   398
    val p = case p_ of
wneuper@59266
   399
      Frm => p | Res => lev_on p
wneuper@59266
   400
    | _ => error ("generate_hard: call by " ^ pos'2str (p,p_))
wneuper@59266
   401
  in generate1 thy m' (e_istate, e_ctxt) (p,p_) pt end
neuper@37906
   402
wneuper@59266
   403
(* tacis are in reverse order from nxt_solve_/specify_: last = fst to insert *)
neuper@37906
   404
fun generate ([]: taci list) ptp = ptp
wneuper@59266
   405
  | generate tacis (pt, c, _: pos'(*!dropped!WN0504redesign generate/tacis?*))= 
wneuper@59266
   406
    let
wneuper@59266
   407
      val (tacis', (_, tac_, (p, is))) = split_last tacis
wneuper@59266
   408
	    val (p',c',_,pt') = generate1 (assoc_thy "Isac") tac_ is p pt
wneuper@59266
   409
    in
wneuper@59266
   410
      generate tacis' (pt', c@c', p')
wneuper@59266
   411
    end
neuper@37906
   412
wneuper@59266
   413
(* update pos in tacis for embedding by generate *)
wneuper@59266
   414
fun insert_pos (_: pos) [] = []
wneuper@59266
   415
  | insert_pos (p: pos) (((tac, tac_, (_, ist)): taci) :: tacis) = 
wneuper@59266
   416
    ((tac, tac_, ((p, Res), ist)): taci) :: (insert_pos (lev_on p) tacis)
neuper@37906
   417
wneuper@59266
   418
fun res_from_taci (_, Rewrite' (_, _, _, _, _, _,(res, asm)), _) = (res, asm)
wneuper@59266
   419
  | res_from_taci (_, Rewrite_Set' (_, _, _, _, (res, asm)), _) = (res, asm)
wneuper@59266
   420
  | res_from_taci (_, tac_, _) = error ("res_from_taci: called with" ^ tac_2str tac_)
neuper@37906
   421
wneuper@59266
   422
(* embed the tacis created by a '_deriv'ation; sys.form <> input.form
wneuper@59266
   423
  tacis are in order, thus are reverted for generate *)
wneuper@59266
   424
fun embed_deriv (tacis: taci list) (pt, pos as (p, Frm): pos') =
neuper@37906
   425
  (*inform at Frm: replace the whole PrfObj by a Transitive-ProfObj FIXME?0402
neuper@37906
   426
    and transfer the istate (from _after_ compare_deriv) from Frm to Res*)
wneuper@59266
   427
    let
wneuper@59266
   428
      val (res, asm) = (res_from_taci o last_elem) tacis
wneuper@59266
   429
    	val (ist, ctxt) = case get_obj g_loc pt p of
wneuper@59266
   430
    	  (SOME (ist, ctxt), _) => (ist, ctxt)
wneuper@59266
   431
      | (NONE, _) => error "embed_deriv Frm: uncovered case get_obj"
wneuper@59266
   432
    	val form = get_obj g_form pt p
wneuper@59266
   433
          (*val p = lev_on p; ---------------only difference to (..,Res) below*)
wneuper@59266
   434
    	val tacis = (Begin_Trans, Begin_Trans' form, (pos, (Uistate, ctxt))) ::
wneuper@59266
   435
    		(insert_pos ((lev_on o lev_dn) p) tacis) @ [(End_Trans, End_Trans' (res, asm),
wneuper@59266
   436
    			(pos_plus (length tacis) (lev_dn p, Res), (new_val res ist, ctxt)))]
wneuper@59266
   437
    	val {nrls, ...} = get_met (get_obj g_metID pt (par_pblobj pt p))
wneuper@59266
   438
    	val (pt, c, pos as (p, _)) = generate (rev tacis) (pt, [], (p, Res))
wneuper@59266
   439
    	val pt = update_tac pt p (Derive (id_rls nrls))
wneuper@59266
   440
    	val pt = update_branch pt p TransitiveB
wneuper@59266
   441
    in (c, (pt, pos: pos')) end
wneuper@59266
   442
  | embed_deriv tacis (pt, (p, Res)) =
wneuper@59266
   443
    (*inform at Res: append a Transitive-PrfObj FIXME?0402 other branch-types ?
wneuper@59266
   444
      and transfer the istate (from _after_ compare_deriv) from Res to new Res*)
neuper@37906
   445
    let val (res, asm) = (res_from_taci o last_elem) tacis
wneuper@59266
   446
    	val (ist, ctxt) = case get_obj g_loc pt p of
wneuper@59266
   447
    	  (_, SOME (ist, ctxt)) => (ist, ctxt)
wneuper@59266
   448
      | (_, NONE) => error "embed_deriv Frm: uncovered case get_obj"
wneuper@59266
   449
    	val (f, _) = get_obj g_result pt p
wneuper@59266
   450
    	val p = lev_on p(*---------------only difference to (..,Frm) above*);
wneuper@59266
   451
    	val tacis = (Begin_Trans, Begin_Trans' f, ((p, Frm), (Uistate, ctxt))) ::
wneuper@59266
   452
    		(insert_pos ((lev_on o lev_dn) p) tacis) @ [(End_Trans, End_Trans' (res, asm), 
wneuper@59266
   453
    			(pos_plus (length tacis) (lev_dn p, Res), (new_val res ist, ctxt)))];
wneuper@59266
   454
    	val {nrls, ...} = get_met (get_obj g_metID pt (par_pblobj pt p))
wneuper@59266
   455
    	val (pt, c, pos as (p, _)) = generate (rev tacis) (pt, [], (p, Res))
wneuper@59266
   456
    	val pt = update_tac pt p (Derive (id_rls nrls))
wneuper@59266
   457
    	val pt = update_branch pt p TransitiveB
wneuper@59266
   458
    in (c, (pt, pos)) end
wneuper@59266
   459
  | embed_deriv _ _ = error "embed_deriv: uncovered definition"
wneuper@59266
   460
end