src/Tools/isac/Interpret/tactic.sml
author Walther Neuper <wneuper@ist.tugraz.at>
Sat, 21 Jan 2017 14:53:45 +0100
changeset 59302 91564a5be356
parent 59299 bf6e43b9ce92
child 59304 185c1f9c844b
permissions -rw-r--r--
--- prep 5 for structure Tac : TACTIC

Note: here we have the same errors as in dead branch 669931c853cc
wneuper@59298
     1
signature TACTIC =
wneuper@59298
     2
sig
wneuper@59302
     3
  datatype tac_ =
wneuper@59302
     4
    Add_Find' of cterm' * itm list | Add_Given' of cterm' * itm list | Add_Relation' of cterm' * itm list
wneuper@59302
     5
  | Apply_Assumption' of term list * term
wneuper@59302
     6
  | Apply_Method' of metID * term option * Selem.istate * Proof.context
wneuper@59302
     7
wneuper@59302
     8
  | Begin_Sequ' | Begin_Trans' of term
wneuper@59302
     9
  | Split_And' of term | Split_Or' of term | Split_Intersect' of term
wneuper@59302
    10
  | Conclude_And' of term | Conclude_Or' of term | Collect_Trues' of term
wneuper@59302
    11
  | End_Sequ' | End_Trans' of Selem.result
wneuper@59302
    12
  | End_Ruleset' of term | End_Subproblem' of term | End_Intersect' of term | End_Proof''
wneuper@59302
    13
wneuper@59302
    14
  | CAScmd' of term
wneuper@59302
    15
  | Calculate' of theory' * string * term * (term * thm')
wneuper@59302
    16
  | Check_Postcond' of pblID * Selem.result
wneuper@59302
    17
  | Check_elementwise' of term * cterm' * Selem.result
wneuper@59302
    18
  | Del_Find' of cterm' | Del_Given' of cterm' | Del_Relation' of cterm'
wneuper@59302
    19
wneuper@59302
    20
  | Derive' of rls
wneuper@59302
    21
  | Detail_Set' of theory' * bool * rls * term * Selem.result
wneuper@59302
    22
  | Detail_Set_Inst' of theory' * bool * subst * rls * term * Selem.result
wneuper@59302
    23
  | End_Detail' of Selem.result
wneuper@59302
    24
wneuper@59302
    25
  | Empty_Tac_
wneuper@59302
    26
  | Free_Solve'
wneuper@59302
    27
wneuper@59302
    28
  | Init_Proof' of cterm' list * spec
wneuper@59302
    29
  | Model_Problem' of pblID * itm list * itm list
wneuper@59302
    30
  | Or_to_List' of term * term
wneuper@59302
    31
  | Refine_Problem' of pblID * (itm list * (bool * term) list)
wneuper@59302
    32
  | Refine_Tacitly' of pblID * pblID * domID * metID * itm list
wneuper@59302
    33
wneuper@59302
    34
  | Rewrite' of theory' * rew_ord' * rls * bool * thm'' * term * Selem.result
wneuper@59302
    35
  | Rewrite_Asm' of theory' * rew_ord' * rls * bool * thm'' * term * Selem.result
wneuper@59302
    36
  | Rewrite_Inst' of theory' * rew_ord' * rls * bool * subst * thm'' * term * Selem.result
wneuper@59302
    37
  | Rewrite_Set' of theory' * bool * rls * term * Selem.result
wneuper@59302
    38
  | Rewrite_Set_Inst' of theory' * bool * subst * rls * term * Selem.result
wneuper@59302
    39
wneuper@59302
    40
  | Specify_Method' of metID * ori list * itm list
wneuper@59302
    41
  | Specify_Problem' of pblID * (bool * (itm list * (bool * term) list))
wneuper@59302
    42
  | Specify_Theory' of domID
wneuper@59302
    43
  | Subproblem' of spec * ori list * term * Selem.fmz_ * Proof.context * term
wneuper@59302
    44
  | Substitute' of rew_ord_ * rls * Selem.subte * term * term
wneuper@59302
    45
  | Tac_ of theory * string * string * string
wneuper@59302
    46
  | Take' of term | Take_Inst' of term
wneuper@59302
    47
  val tac_2str : tac_ -> string
wneuper@59302
    48
wneuper@59302
    49
  datatype tac =
wneuper@59302
    50
    Add_Find of cterm' | Add_Given of cterm' | Add_Relation of cterm'
wneuper@59302
    51
  | Apply_Assumption of cterm' list
wneuper@59302
    52
  | Apply_Method of metID
wneuper@59302
    53
  (*/--- TODO: re-design ? -----------------------------------------------------------------\*)
wneuper@59302
    54
  | Begin_Sequ | Begin_Trans
wneuper@59302
    55
  | Split_And | Split_Or | Split_Intersect
wneuper@59302
    56
  | Conclude_And | Conclude_Or | Collect_Trues
wneuper@59302
    57
  | End_Sequ | End_Trans
wneuper@59302
    58
  | End_Ruleset | End_Subproblem | End_Intersect | End_Proof'
wneuper@59302
    59
  (*\--- TODO: re-design ? -----------------------------------------------------------------/*)
wneuper@59302
    60
  | CAScmd of cterm'
wneuper@59302
    61
  | Calculate of string
wneuper@59302
    62
  | Check_Postcond of pblID
wneuper@59302
    63
  | Check_elementwise of cterm'
wneuper@59302
    64
  | Del_Find of cterm' | Del_Given of cterm' | Del_Relation of cterm'
wneuper@59302
    65
wneuper@59302
    66
  | Derive of rls'
wneuper@59302
    67
  | Detail_Set of rls'
wneuper@59302
    68
  | Detail_Set_Inst of Selem.subs * rls'
wneuper@59302
    69
  | End_Detail
wneuper@59302
    70
wneuper@59302
    71
  | Empty_Tac
wneuper@59302
    72
  | Free_Solve
wneuper@59302
    73
wneuper@59302
    74
  | Init_Proof of cterm' list * spec
wneuper@59302
    75
  | Model_Problem
wneuper@59302
    76
  | Or_to_List
wneuper@59302
    77
  | Refine_Problem of pblID
wneuper@59302
    78
  | Refine_Tacitly of pblID
wneuper@59302
    79
wneuper@59302
    80
  | Rewrite of thm''
wneuper@59302
    81
  | Rewrite_Asm of thm''
wneuper@59302
    82
  | Rewrite_Inst of Selem.subs * thm''
wneuper@59302
    83
  | Rewrite_Set of rls'
wneuper@59302
    84
  | Rewrite_Set_Inst of Selem.subs * rls'
wneuper@59302
    85
wneuper@59302
    86
  | Specify_Method of metID
wneuper@59302
    87
  | Specify_Problem of pblID
wneuper@59302
    88
  | Specify_Theory of domID
wneuper@59302
    89
  | Subproblem of domID * pblID
wneuper@59302
    90
wneuper@59302
    91
  | Substitute of Selem.sube
wneuper@59302
    92
  | Tac of string
wneuper@59302
    93
  | Take of cterm' | Take_Inst of cterm'
wneuper@59302
    94
  val tac2str : tac -> string
wneuper@59302
    95
wneuper@59302
    96
  val eq_tac : tac * tac -> bool                                              (* for script.sml *)
wneuper@59302
    97
  val is_empty_tac : tac -> bool                                              (* also for tests *)
wneuper@59302
    98
  val is_rewtac : tac -> bool                                              (* for interface.sml *)
wneuper@59302
    99
  val is_rewset : tac -> bool                                             (* for mathengine.sml *)
wneuper@59302
   100
  val rls_of : tac -> rls'                                                     (* for solve.sml *)
wneuper@59302
   101
  val tac2IDstr : tac -> string
wneuper@59302
   102
  val rule2tac : theory -> (term * term) list -> rule -> tac                (* for rewtools.sml *)
wneuper@59298
   103
wneuper@59298
   104
(* ---- for tests only: made visible in order to remove the warning --------------------------- *)
wneuper@59298
   105
wneuper@59299
   106
(*/-------------------------------------------------------- ! aktivate for Test_Isac BEGIN ---\* )
wneuper@59298
   107
wneuper@59299
   108
( *\--- ! aktivate for Test_Isac END ----------------------------------------------------------/*)
wneuper@59298
   109
end
wneuper@59298
   110
wneuper@59298
   111
structure Tac(**): TACTIC(**) =
wneuper@59298
   112
struct
wneuper@59298
   113
wneuper@59302
   114
(* tactics for user at front-end.
wneuper@59302
   115
   tac propagates the construction of the calc-tree;
wneuper@59302
   116
   there are
wneuper@59302
   117
   (a) 'specsteps' for the specify-phase, and others for the solve-phase
wneuper@59302
   118
   (b) those of the solve-phase are 'initac's and others;
wneuper@59302
   119
       initacs start with a formula different from the preceding formula.
wneuper@59302
   120
   see 'type tac_' for the internal representation of tactics
wneuper@59302
   121
   TODO.WN161219: replace *every* cterm' by term
wneuper@59302
   122
*)
wneuper@59302
   123
datatype tac =
wneuper@59302
   124
    Add_Find of cterm' | Add_Given of cterm' | Add_Relation of cterm'
wneuper@59302
   125
  | Apply_Assumption of cterm' list
wneuper@59302
   126
  | Apply_Method of metID
wneuper@59302
   127
    (* creates an "istate" in PblObj.env; in case of "init_form" 
wneuper@59302
   128
      creates a formula at ((lev_on o lev_dn) p, Frm) and in this "ppobj.loc"
wneuper@59302
   129
      a "SOME istate" at fst of "loc".
wneuper@59302
   130
      As each step (in the solve-phase) has a resulting formula (at the front-end)
wneuper@59302
   131
      Apply_Method also does the 1st step in the script (an "initac") if there is no "init_form" *)  
wneuper@59302
   132
  (*/--- TODO: re-design ? -----------------------------------------------------------------\*)
wneuper@59302
   133
  | Begin_Sequ | Begin_Trans
wneuper@59302
   134
  | Split_And | Split_Or | Split_Intersect
wneuper@59302
   135
  | Conclude_And | Conclude_Or | Collect_Trues
wneuper@59302
   136
  | End_Sequ | End_Trans
wneuper@59302
   137
  | End_Ruleset | End_Subproblem (* WN0509 drop *) | End_Intersect | End_Proof'
wneuper@59302
   138
  (*\--- TODO: re-design ? -----------------------------------------------------------------/*)
wneuper@59302
   139
  | CAScmd of cterm'
wneuper@59302
   140
  | Calculate of string
wneuper@59302
   141
  | Check_Postcond of pblID
wneuper@59302
   142
  | Check_elementwise of cterm'
wneuper@59302
   143
  | Del_Find of cterm' | Del_Given of cterm' | Del_Relation of cterm'
wneuper@59302
   144
wneuper@59302
   145
  | Derive of rls'                 (* WN0509 drop *)
wneuper@59302
   146
  | Detail_Set of rls'             (* WN0509 drop *)
wneuper@59302
   147
  | Detail_Set_Inst of Selem.subs * rls' (* WN0509 drop *)
wneuper@59302
   148
  | End_Detail                     (* WN0509 drop *)
wneuper@59302
   149
wneuper@59302
   150
  | Empty_Tac
wneuper@59302
   151
  | Free_Solve
wneuper@59302
   152
wneuper@59302
   153
  | Init_Proof of cterm' list * spec
wneuper@59302
   154
  | Model_Problem
wneuper@59302
   155
  | Or_to_List
wneuper@59302
   156
  | Refine_Problem of pblID
wneuper@59302
   157
  | Refine_Tacitly of pblID
wneuper@59302
   158
wneuper@59302
   159
   (* rewrite-tactics can transport a (thmID, thm) to and (!) from the java-front-end
wneuper@59302
   160
     because there all the thms are present with both (thmID, thm)
wneuper@59302
   161
     (where user-views can show both or only one of (thmID, thm)),
wneuper@59302
   162
     and thm is created from ThmID by assoc_thm'' when entering isabisac *)
wneuper@59302
   163
  | Rewrite of thm''
wneuper@59302
   164
  | Rewrite_Asm of thm''
wneuper@59302
   165
  | Rewrite_Inst of Selem.subs * thm''
wneuper@59302
   166
  | Rewrite_Set of rls'
wneuper@59302
   167
  | Rewrite_Set_Inst of Selem.subs * rls'
wneuper@59302
   168
wneuper@59302
   169
  | Specify_Method of metID
wneuper@59302
   170
  | Specify_Problem of pblID
wneuper@59302
   171
  | Specify_Theory of domID
wneuper@59302
   172
  | Subproblem of domID * pblID (* WN0509 drop *)
wneuper@59302
   173
wneuper@59302
   174
  | Substitute of Selem.sube
wneuper@59302
   175
  | Tac of string               (* WN0509 drop *)
wneuper@59302
   176
  | Take of cterm' | Take_Inst of cterm'
wneuper@59302
   177
wneuper@59302
   178
fun tac2str ma = case ma of
wneuper@59302
   179
    Init_Proof (ppc, spec)  => 
wneuper@59302
   180
      "Init_Proof "^(pair2str (strs2str ppc, spec2str spec))
wneuper@59302
   181
  | Model_Problem           => "Model_Problem "
wneuper@59302
   182
  | Refine_Tacitly pblID    => "Refine_Tacitly " ^ strs2str pblID 
wneuper@59302
   183
  | Refine_Problem pblID    => "Refine_Problem " ^ strs2str pblID 
wneuper@59302
   184
  | Add_Given cterm'        => "Add_Given " ^ cterm'
wneuper@59302
   185
  | Del_Given cterm'        => "Del_Given " ^ cterm'
wneuper@59302
   186
  | Add_Find cterm'         => "Add_Find " ^ cterm'
wneuper@59302
   187
  | Del_Find cterm'         => "Del_Find " ^ cterm'
wneuper@59302
   188
  | Add_Relation cterm'     => "Add_Relation " ^ cterm'
wneuper@59302
   189
  | Del_Relation cterm'     => "Del_Relation " ^ cterm'
wneuper@59302
   190
wneuper@59302
   191
  | Specify_Theory domID    => "Specify_Theory " ^ quote domID
wneuper@59302
   192
  | Specify_Problem pblID   => "Specify_Problem " ^ strs2str pblID
wneuper@59302
   193
  | Specify_Method metID    => "Specify_Method " ^ strs2str metID
wneuper@59302
   194
  | Apply_Method metID      => "Apply_Method " ^ strs2str metID
wneuper@59302
   195
  | Check_Postcond pblID    => "Check_Postcond " ^ strs2str pblID
wneuper@59302
   196
  | Free_Solve              => "Free_Solve"
wneuper@59302
   197
wneuper@59302
   198
  | Rewrite_Inst (subs, (id, thm)) =>
wneuper@59302
   199
    "Rewrite_Inst " ^ (pair2str (subs2str subs, spair2str (id, thm |> Thm.prop_of |> term2str)))
wneuper@59302
   200
  | Rewrite (id, thm) => "Rewrite " ^ spair2str (id, thm |> Thm.prop_of |> term2str)
wneuper@59302
   201
  | Rewrite_Asm (id, thm) => "Rewrite_Asm " ^ spair2str (id, thm |> Thm.prop_of |> term2str)
wneuper@59302
   202
  | Rewrite_Set_Inst (subs, rls) => 
wneuper@59302
   203
    "Rewrite_Set_Inst " ^ pair2str (subs2str subs, quote rls)
wneuper@59302
   204
  | Rewrite_Set rls         => "Rewrite_Set " ^ quote rls
wneuper@59302
   205
  | Detail_Set rls          => "Detail_Set " ^ quote rls
wneuper@59302
   206
  | Detail_Set_Inst (subs, rls) =>  "Detail_Set_Inst " ^ pair2str (subs2str subs, quote rls)
wneuper@59302
   207
  | End_Detail              => "End_Detail"
wneuper@59302
   208
  | Derive rls'             => "Derive " ^ rls' 
wneuper@59302
   209
  | Calculate op_           => "Calculate " ^ op_ 
wneuper@59302
   210
  | Substitute sube         => "Substitute " ^ Selem.sube2str sube	     
wneuper@59302
   211
  | Apply_Assumption ct's   => "Apply_Assumption " ^ strs2str ct's
wneuper@59302
   212
wneuper@59302
   213
  | Take cterm'             => "Take " ^ quote cterm'
wneuper@59302
   214
  | Take_Inst cterm'        => "Take_Inst " ^ quote cterm'
wneuper@59302
   215
  | Subproblem (domID, pblID) => "Subproblem " ^ pair2str (domID, strs2str pblID)
wneuper@59302
   216
  | End_Subproblem          => "End_Subproblem"
wneuper@59302
   217
  | CAScmd cterm'           => "CAScmd " ^ quote cterm'
wneuper@59302
   218
wneuper@59302
   219
  | Check_elementwise cterm'=> "Check_elementwise " ^ quote cterm'
wneuper@59302
   220
  | Or_to_List              => "Or_to_List "
wneuper@59302
   221
  | Collect_Trues           => "Collect_Trues"
wneuper@59302
   222
wneuper@59302
   223
  | Empty_Tac               => "Empty_Tac"
wneuper@59302
   224
  | Tac string              => "Tac " ^ string
wneuper@59302
   225
  | End_Proof'              => "tac End_Proof'"
wneuper@59302
   226
  | _                       => "tac2str not impl. for ?!";
wneuper@59302
   227
wneuper@59302
   228
fun is_empty_tac tac = case tac of Empty_Tac => true | _ => false
wneuper@59302
   229
wneuper@59302
   230
fun eq_tac (Rewrite (id1, _), Rewrite (id2, _)) = id1 = id2
wneuper@59302
   231
  | eq_tac (Rewrite_Inst (_, (id1, _)), Rewrite_Inst (_, (id2, _))) = id1 = id2
wneuper@59302
   232
  | eq_tac (Rewrite_Set id1, Rewrite_Set id2) = id1 = id2
wneuper@59302
   233
  | eq_tac (Rewrite_Set_Inst (_, id1), Rewrite_Set_Inst (_, id2)) = id1 = id2
wneuper@59302
   234
  | eq_tac (Calculate id1, Calculate id2) = id1 = id2
wneuper@59302
   235
  | eq_tac _ = false
wneuper@59302
   236
wneuper@59302
   237
fun is_rewset (Rewrite_Set_Inst _) = true
wneuper@59302
   238
  | is_rewset (Rewrite_Set _) = true 
wneuper@59302
   239
  | is_rewset _ = false;
wneuper@59302
   240
fun is_rewtac (Rewrite _) = true
wneuper@59302
   241
  | is_rewtac (Rewrite_Inst _) = true
wneuper@59302
   242
  | is_rewtac (Rewrite_Asm _) = true
wneuper@59302
   243
  | is_rewtac tac = is_rewset tac;
wneuper@59302
   244
wneuper@59302
   245
fun tac2IDstr ma = case ma of
wneuper@59302
   246
    Model_Problem => "Model_Problem"
wneuper@59302
   247
  | Refine_Tacitly _ => "Refine_Tacitly"
wneuper@59302
   248
  | Refine_Problem _ => "Refine_Problem"
wneuper@59302
   249
  | Add_Given _ => "Add_Given"
wneuper@59302
   250
  | Del_Given _ => "Del_Given"
wneuper@59302
   251
  | Add_Find _ => "Add_Find"
wneuper@59302
   252
  | Del_Find _ => "Del_Find"
wneuper@59302
   253
  | Add_Relation _ => "Add_Relation"
wneuper@59302
   254
  | Del_Relation _ => "Del_Relation"
wneuper@59302
   255
wneuper@59302
   256
  | Specify_Theory _ => "Specify_Theory"
wneuper@59302
   257
  | Specify_Problem _ => "Specify_Problem"
wneuper@59302
   258
  | Specify_Method _ => "Specify_Method"
wneuper@59302
   259
  | Apply_Method _ => "Apply_Method"
wneuper@59302
   260
  | Check_Postcond _ => "Check_Postcond"
wneuper@59302
   261
  | Free_Solve => "Free_Solve"
wneuper@59302
   262
wneuper@59302
   263
  | Rewrite_Inst _ => "Rewrite_Inst"
wneuper@59302
   264
  | Rewrite _ => "Rewrite"
wneuper@59302
   265
  | Rewrite_Asm _ => "Rewrite_Asm"
wneuper@59302
   266
  | Rewrite_Set_Inst _ => "Rewrite_Set_Inst"
wneuper@59302
   267
  | Rewrite_Set _ => "Rewrite_Set"
wneuper@59302
   268
  | Detail_Set _ => "Detail_Set"
wneuper@59302
   269
  | Detail_Set_Inst _ => "Detail_Set_Inst"
wneuper@59302
   270
  | Derive _ => "Derive "
wneuper@59302
   271
  | Calculate _ => "Calculate "
wneuper@59302
   272
  | Substitute _ => "Substitute" 
wneuper@59302
   273
  | Apply_Assumption _ => "Apply_Assumption"
wneuper@59302
   274
wneuper@59302
   275
  | Take _ => "Take"
wneuper@59302
   276
  | Take_Inst _ => "Take_Inst"
wneuper@59302
   277
  | Subproblem _ => "Subproblem"
wneuper@59302
   278
  | End_Subproblem => "End_Subproblem"
wneuper@59302
   279
  | CAScmd _ => "CAScmd"
wneuper@59302
   280
wneuper@59302
   281
  | Check_elementwise _ => "Check_elementwise"
wneuper@59302
   282
  | Or_to_List => "Or_to_List "
wneuper@59302
   283
  | Collect_Trues => "Collect_Trues"
wneuper@59302
   284
wneuper@59302
   285
  | Empty_Tac => "Empty_Tac"
wneuper@59302
   286
  | Tac _ => "Tac "
wneuper@59302
   287
  | End_Proof' => "End_Proof'"
wneuper@59302
   288
  | _ => "tac2str not impl. for ?!";
wneuper@59302
   289
wneuper@59302
   290
fun rls_of (Rewrite_Set_Inst (_, rls)) = rls
wneuper@59302
   291
  | rls_of (Rewrite_Set rls) = rls
wneuper@59302
   292
  | rls_of tac = error ("rls_of: called with tac \"" ^ tac2IDstr tac ^ "\"");
wneuper@59302
   293
wneuper@59302
   294
fun rule2tac thy _ (Calc (opID, thm)) = Calculate (assoc_calc thy opID)
wneuper@59302
   295
  | rule2tac _ [] (Thm thm'') = Rewrite thm''
wneuper@59302
   296
  | rule2tac _ subst (Thm thm'') = 
wneuper@59302
   297
    Rewrite_Inst (Selem.subst2subs subst, thm'')
wneuper@59302
   298
  | rule2tac _ [] (Rls_ rls) = Rewrite_Set (id_rls rls)
wneuper@59302
   299
  | rule2tac _ subst (Rls_ rls) = 
wneuper@59302
   300
    Rewrite_Set_Inst (Selem.subst2subs subst, (id_rls rls))
wneuper@59302
   301
  | rule2tac _ _ rule = 
wneuper@59302
   302
    error ("rule2tac: called with \"" ^ rule2str rule ^ "\"");
wneuper@59302
   303
wneuper@59302
   304
(* tactics for for internal use, compare "tac" for user at the front-end.
wneuper@59302
   305
  tac_ contains results from check in 'fun applicable_in'.
wneuper@59302
   306
  This is useful for costly results, e.g. from rewriting;
wneuper@59302
   307
  however, these results might be changed by Scripts like
wneuper@59302
   308
      "      eq = (Rewrite_Set ansatz_rls False) eql;" ^
wneuper@59302
   309
      "      eq = drop_questionmarks eq;" ^
wneuper@59302
   310
      "      eq = (Rewrite_Set equival_trans False) eq;" ^
wneuper@59302
   311
  TODO.WN120106 ANALOGOUSLY TO Substitute':
wneuper@59302
   312
  So tac_ contains the term t the result was calculated from
wneuper@59302
   313
  in order to compare t with t' possibly changed by "Expr "
wneuper@59302
   314
  and re-calculate result if t<>t'
wneuper@59302
   315
  TODO.WN161219: replace *every* cterm' by term
wneuper@59302
   316
*)
wneuper@59302
   317
  datatype tac_ =
wneuper@59302
   318
    Add_Find' of cterm' * itm list | Add_Given' of cterm' * itm list | Add_Relation' of cterm' * itm list
wneuper@59302
   319
  | Apply_Assumption' of term list * term
wneuper@59302
   320
  | Apply_Method' of metID * term option * Selem.istate * Proof.context
wneuper@59302
   321
  (*/--- TODO: re-design ? -----------------------------------------------------------------\*)
wneuper@59302
   322
  | Begin_Sequ' | Begin_Trans' of term
wneuper@59302
   323
  | Split_And' of term | Split_Or' of term | Split_Intersect' of term
wneuper@59302
   324
  | Conclude_And' of term | Conclude_Or' of term | Collect_Trues' of term
wneuper@59302
   325
  | End_Sequ' | End_Trans' of Selem.result
wneuper@59302
   326
  | End_Ruleset' of term | End_Subproblem' of term | End_Intersect' of term | End_Proof''
wneuper@59302
   327
  (*\--- TODO: re-design ? -----------------------------------------------------------------/*)
wneuper@59302
   328
  | CAScmd' of term
wneuper@59302
   329
  | Calculate' of theory' * string * term * (term * thm')
wneuper@59302
   330
  | Check_Postcond' of pblID *
wneuper@59302
   331
    Selem.result (* returnvalue of script in solve *)
wneuper@59302
   332
  | Check_elementwise' of (*special case:*)
wneuper@59302
   333
    term *       (* (1) the current formula: [x=1,x=...]     *)
wneuper@59302
   334
    string *     (* (2) the pred from Check_elementwise      *)
wneuper@59302
   335
    Selem.result (* (3) composed from (1) and (2): {x. pred} *)
wneuper@59302
   336
  | Del_Find' of cterm' | Del_Given' of cterm' | Del_Relation' of cterm'
wneuper@59302
   337
wneuper@59302
   338
  | Derive' of rls
wneuper@59302
   339
  | Detail_Set' of theory' * bool * rls * term * Selem.result
wneuper@59302
   340
  | Detail_Set_Inst' of theory' * bool * subst * rls * term * Selem.result
wneuper@59302
   341
  | End_Detail' of Selem.result
wneuper@59302
   342
wneuper@59302
   343
  | Empty_Tac_
wneuper@59302
   344
  | Free_Solve'
wneuper@59302
   345
wneuper@59302
   346
  | Init_Proof' of cterm' list * spec
wneuper@59302
   347
  | Model_Problem' of pblID * 
wneuper@59302
   348
    itm list *  (* the 'untouched' pbl        *)
wneuper@59302
   349
    itm list    (* the casually completed met *)
wneuper@59302
   350
  | Or_to_List' of term * term
wneuper@59302
   351
  | Refine_Problem' of pblID * (itm list * (bool * term) list)
wneuper@59302
   352
  | Refine_Tacitly' of
wneuper@59302
   353
    pblID *     (* input*)
wneuper@59302
   354
    pblID *     (* the refined from applicable_in                                       *)
wneuper@59302
   355
    domID *     (* from new pbt?! filled in specify                                     *)
wneuper@59302
   356
    metID *     (* from new pbt?! filled in specify                                     *)
wneuper@59302
   357
    itm list    (* drop ! 9.03: remains [] for Model_Problem recognizing its activation *)
wneuper@59302
   358
  | Rewrite' of theory' * rew_ord' * rls * bool * thm'' * term * Selem.result
wneuper@59302
   359
  | Rewrite_Asm' of theory' * rew_ord' * rls * bool * thm'' * term * Selem.result
wneuper@59302
   360
  | Rewrite_Inst' of theory' * rew_ord' * rls * bool * subst * thm'' * term * Selem.result
wneuper@59302
   361
  | Rewrite_Set' of theory' * bool * rls * term * Selem.result
wneuper@59302
   362
  | Rewrite_Set_Inst' of theory' * bool * subst * rls * term * Selem.result
wneuper@59302
   363
wneuper@59302
   364
  | Specify_Method' of metID * ori list * itm list
wneuper@59302
   365
  | Specify_Problem' of pblID * 
wneuper@59302
   366
    (bool *                  (* matches	      *)
wneuper@59302
   367
      (itm list *            (* ppc	          *)
wneuper@59302
   368
        (bool * term) list)) (* preconditions *)
wneuper@59302
   369
  | Specify_Theory' of domID
wneuper@59302
   370
  | Subproblem' of
wneuper@59302
   371
    spec * 
wneuper@59302
   372
		(ori list) *    (* filled in assod Subproblem'        *)
wneuper@59302
   373
		term *          (* -"-, headline of calc-head         *)
wneuper@59302
   374
		Selem.fmz_ * 
wneuper@59302
   375
    Proof.context * (* transported from assod to generate1*)
wneuper@59302
   376
		term            (* Subproblem(dom,pbl) OR cascmd      *)  
wneuper@59302
   377
  | Substitute' of
wneuper@59302
   378
    rew_ord_ *  (* for re-calculation                      *)
wneuper@59302
   379
    rls *       (* for re-calculation                      *)
wneuper@59302
   380
    Selem.subte *     (* the 'substitution': terms of type bool  *)
wneuper@59302
   381
    term *      (* to be substituted in                    *)
wneuper@59302
   382
    term        (* resulting from the substitution         *)
wneuper@59302
   383
  | Tac_ of theory * string * string * string
wneuper@59302
   384
  | Take' of term | Take_Inst' of term
wneuper@59302
   385
wneuper@59302
   386
fun tac_2str ma = case ma of
wneuper@59302
   387
    Init_Proof' (ppc, spec)  => "Init_Proof' " ^ pair2str (strs2str ppc, spec2str spec)
wneuper@59302
   388
  | Model_Problem' (pblID, _, _) => "Model_Problem' " ^ strs2str pblID
wneuper@59302
   389
  | Refine_Tacitly'(p, prefin, domID, metID, _) => "Refine_Tacitly' (" ^ strs2str p ^ ", " ^
wneuper@59302
   390
    strs2str prefin ^ ", " ^ domID ^ ", " ^ strs2str metID ^ ", pbl-itms)"
wneuper@59302
   391
  | Refine_Problem' _ => "Refine_Problem' (" ^ (*matchs2str ms*)"..." ^ ")"
wneuper@59302
   392
  | Add_Given' _ => "Add_Given' "(*^cterm'*)
wneuper@59302
   393
  | Del_Given' _ => "Del_Given' "(*^cterm'*)
wneuper@59302
   394
  | Add_Find' _ => "Add_Find' "(*^cterm'*)
wneuper@59302
   395
  | Del_Find' _ => "Del_Find' "(*^cterm'*)
wneuper@59302
   396
  | Add_Relation' _ => "Add_Relation' "(*^cterm'*)
wneuper@59302
   397
  | Del_Relation' _ => "Del_Relation' "(*^cterm'*)
wneuper@59302
   398
wneuper@59302
   399
  | Specify_Theory' domID => "Specify_Theory' " ^ quote domID
wneuper@59302
   400
  | Specify_Problem' (pI, (ok, _)) =>  "Specify_Problem' " ^ 
wneuper@59302
   401
    spair2str (strs2str pI, spair2str (bool2str ok, spair2str ("itms2str_ itms", "items2str pre")))
wneuper@59302
   402
  | Specify_Method' (pI, oris, _) => "Specify_Method' (" ^ 
wneuper@59302
   403
    metID2str pI ^ ", " ^ oris2str oris ^ ", )"
wneuper@59302
   404
wneuper@59302
   405
  | Apply_Method' (metID, _, _, _) => "Apply_Method' " ^ strs2str metID
wneuper@59302
   406
  | Check_Postcond' (pblID, (scval, asm)) => "Check_Postcond' " ^
wneuper@59302
   407
      (spair2str (strs2str pblID, spair2str (term2str scval, terms2str asm)))
wneuper@59302
   408
wneuper@59302
   409
  | Free_Solve' => "Free_Solve'"
wneuper@59302
   410
wneuper@59302
   411
  | Rewrite_Inst' (*subs,thm'*) _ => "Rewrite_Inst' "(*^(pair2str (subs2str subs, spair2str thm'))*)
wneuper@59302
   412
  | Rewrite' _(*thm'*) => "Rewrite' "(*^(spair2str thm')*)
wneuper@59302
   413
  | Rewrite_Asm' _(*thm'*) => "Rewrite_Asm' "(*^(spair2str thm')*)
wneuper@59302
   414
  | Rewrite_Set_Inst' _(*subs,thm'*) => "Rewrite_Set_Inst' "(*^(pair2str (subs2str subs, quote rls))*)
wneuper@59302
   415
  | Rewrite_Set' (thy', pasm, rls', f, (f', asm)) => "Rewrite_Set' (" ^ thy' ^ "," ^ bool2str pasm ^
wneuper@59302
   416
    "," ^ id_rls rls' ^ "," ^ term2str f ^ ",(" ^ term2str f' ^ "," ^ terms2str asm ^ "))"
wneuper@59302
   417
  | End_Detail' _ => "End_Detail' xxx"
wneuper@59302
   418
  | Detail_Set' _ => "Detail_Set' xxx"
wneuper@59302
   419
  | Detail_Set_Inst' _ => "Detail_Set_Inst' xxx"
wneuper@59302
   420
wneuper@59302
   421
  | Derive' rls => "Derive' " ^ id_rls rls
wneuper@59302
   422
  | Calculate'  _ => "Calculate' "
wneuper@59302
   423
  | Substitute' _ => "Substitute' "(*^(subs2str subs)*)    
wneuper@59302
   424
  | Apply_Assumption' _(* ct's*) => "Apply_Assumption' "(*^(strs2str ct's)*)
wneuper@59302
   425
wneuper@59302
   426
  | Take' _(*cterm'*) => "Take' "(*^(quote cterm'	)*)
wneuper@59302
   427
  | Take_Inst' _(*cterm'*) => "Take_Inst' "(*^(quote cterm' )*)
wneuper@59302
   428
  | Subproblem' _(*(spec, oris, _, _, _, pbl_form)*) => 
wneuper@59302
   429
    "Subproblem' "(*^(pair2str (domID, strs2str ,))*)
wneuper@59302
   430
  | End_Subproblem' _ => "End_Subproblem'"
wneuper@59302
   431
  | CAScmd' _(*cterm'*) => "CAScmd' "(*^(quote cterm')*)
wneuper@59302
   432
wneuper@59302
   433
  | Empty_Tac_ => "Empty_Tac_"
wneuper@59302
   434
  | Tac_ (_, form, id, result) => "Tac_ (thy," ^ form ^ "," ^ id ^ "," ^ result ^ ")"
wneuper@59302
   435
  | _  => "tac_2str not impl. for arg";
wneuper@59302
   436
wneuper@59298
   437
end