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