src/Tools/isac/MathEngine/solve.sml
author Walther Neuper <walther.neuper@jku.at>
Sun, 27 Oct 2019 12:10:57 +0100
changeset 59675 9950708a8a2e
parent 59662 e3713aaf2735
child 59676 6c23dc07c454
permissions -rw-r--r--
lucin: replace Istate.safe by Istate.appy_
neuper@41968
     1
(* Title:  solve an example by interpreting a method's script
neuper@41968
     2
   Author: Walther Neuper 1999
neuper@41968
     3
   (c) copyright due to lincense terms.
neuper@37906
     4
*)
neuper@37906
     5
wneuper@59562
     6
signature SOLVE_PHASE =
wneuper@59286
     7
sig
wneuper@59286
     8
  datatype auto = CompleteCalc | CompleteCalcHead | CompleteModel | CompleteSubpbl 
wneuper@59286
     9
  | CompleteToSubpbl | Step of int
wneuper@59286
    10
  val autoord : auto -> int
wneuper@59286
    11
  type tac'_
wneuper@59571
    12
  val mk_tac'_ : Tactic.input -> string * Tactic.input
wneuper@59286
    13
  val specsteps : string list
wneuper@59286
    14
wneuper@59286
    15
  val all_solve : auto -> Ctree.pos' list -> Ctree.state ->
wneuper@59286
    16
    string * Ctree.pos' list * (Ctree.ctree * (int list * Ctree.pos_))
wneuper@59286
    17
  val complete_solve :
wneuper@59286
    18
     auto -> Ctree.pos' list -> Ctree.state -> string * Ctree.pos' list * Ctree.state
wneuper@59571
    19
  val solve : string * Tactic.T -> Ctree.state -> string * Chead.calcstate'
wneuper@59286
    20
wneuper@59562
    21
  val inform : Chead.calcstate' -> string -> string * Chead.calcstate'
wneuper@59562
    22
wneuper@59286
    23
  val detailrls : Ctree.ctree -> Ctree.pos' -> string * Ctree.ctree * Ctree.pos'
wneuper@59310
    24
(* ---- for tests only: shifted from below to remove the Warning "unused" at fun.def. --------- *)
wneuper@59286
    25
  val get_form : tac'_ -> Ctree.pos' -> Ctree.ctree -> Generate.mout
walther@59662
    26
(*/-------------------------------------------------------- ! aktivate for Test_Isac BEGIN ---\* )
wneuper@59570
    27
  (*NONE*)
walther@59662
    28
( *\--- ! aktivate for Test_Isac END ----------------------------------------------------------/*)
wneuper@59310
    29
wneuper@59310
    30
(*----- unused code, kept as hints to design ideas ---------------------------------------------*)
wneuper@59310
    31
  (* NONE *)
wneuper@59286
    32
end
wneuper@59286
    33
wneuper@59286
    34
(**)
wneuper@59562
    35
structure Solve(**): SOLVE_PHASE(**) =
wneuper@59273
    36
struct
wneuper@59286
    37
(**)
wneuper@59276
    38
open Ctree;
wneuper@59273
    39
neuper@37906
    40
type mstID = string;
wneuper@59571
    41
type tac'_ = mstID * Tactic.input; (*DG <-> ME*)
neuper@37906
    42
wneuper@59286
    43
fun mk_tac'_   m = case m of (* scr not cleaned -- will disappear eventually *)
wneuper@59571
    44
  Tactic.Init_Proof (ppc, spec)    => ("Init_Proof", Tactic.Init_Proof (ppc, spec )) 
wneuper@59571
    45
| Tactic.Model_Problem             => ("Model_Problem", Tactic.Model_Problem)
wneuper@59571
    46
| Tactic.Refine_Tacitly pblID      => ("Refine_Tacitly", Tactic.Refine_Tacitly pblID)
wneuper@59571
    47
| Tactic.Refine_Problem pblID      => ("Refine_Problem", Tactic.Refine_Problem pblID)
wneuper@59571
    48
| Tactic.Add_Given cterm'          => ("Add_Given", Tactic.Add_Given cterm') 
wneuper@59571
    49
| Tactic.Del_Given cterm'          => ("Del_Given", Tactic.Del_Given cterm') 
wneuper@59571
    50
| Tactic.Add_Find cterm'           => ("Add_Find", Tactic.Add_Find cterm') 
wneuper@59571
    51
| Tactic.Del_Find cterm'           => ("Del_Find", Tactic.Del_Find cterm') 
wneuper@59571
    52
| Tactic.Add_Relation cterm'       => ("Add_Relation", Tactic.Add_Relation cterm') 
wneuper@59571
    53
| Tactic.Del_Relation cterm'       => ("Del_Relation", Tactic.Del_Relation cterm') 
neuper@37906
    54
wneuper@59571
    55
| Tactic.Specify_Theory domID	    => ("Specify_Theory", Tactic.Specify_Theory domID) 
wneuper@59571
    56
| Tactic.Specify_Problem pblID     => ("Specify_Problem", Tactic.Specify_Problem pblID)
wneuper@59571
    57
| Tactic.Specify_Method metID	    => ("Specify_Method", Tactic.Specify_Method metID) 
wneuper@59571
    58
| Tactic.Apply_Method metID	    => ("Apply_Method", Tactic.Apply_Method metID) 
wneuper@59571
    59
| Tactic.Check_Postcond pblID	    => ("Check_Postcond", Tactic.Check_Postcond pblID)
wneuper@59571
    60
| Tactic.Free_Solve                => ("Free_Solve", Tactic.Free_Solve)
neuper@37906
    61
		    
wneuper@59571
    62
| Tactic.Rewrite_Inst (subs, thm') => ("Rewrite_Inst", Tactic.Rewrite_Inst (subs, thm')) 
wneuper@59571
    63
| Tactic.Rewrite thm'		    => ("Rewrite", Tactic.Rewrite thm') 
wneuper@59571
    64
| Tactic.Rewrite_Asm thm'	    => ("Rewrite_Asm", Tactic.Rewrite_Asm thm') 
wneuper@59571
    65
| Tactic.Rewrite_Set_Inst (subs, rls')
wneuper@59571
    66
               => ("Rewrite_Set_Inst", Tactic.Rewrite_Set_Inst (subs, rls')) 
wneuper@59571
    67
| Tactic.Rewrite_Set rls'          => ("Rewrite_Set", Tactic.Rewrite_Set rls') 
wneuper@59571
    68
| Tactic.End_Ruleset		    => ("End_Ruleset", Tactic.End_Ruleset)
neuper@37906
    69
wneuper@59571
    70
| Tactic.End_Detail                => ("End_Detail", Tactic.End_Detail)
wneuper@59571
    71
| Tactic.Detail_Set rls'           => ("Detail_Set", Tactic.Detail_Set rls')
wneuper@59571
    72
| Tactic.Detail_Set_Inst (s, rls') => ("Detail_Set_Inst", Tactic.Detail_Set_Inst (s, rls'))
neuper@37906
    73
wneuper@59571
    74
| Tactic.Calculate op_             => ("Calculate", Tactic.Calculate op_)
wneuper@59571
    75
| Tactic.Substitute sube           => ("Substitute", Tactic.Substitute sube) 
wneuper@59571
    76
| Tactic.Apply_Assumption cts'	    => ("Apply_Assumption", Tactic.Apply_Assumption cts')
neuper@37906
    77
wneuper@59571
    78
| Tactic.Take cterm'               => ("Take", Tactic.Take cterm') 
wneuper@59571
    79
| Tactic.Take_Inst cterm'          => ("Take_Inst", Tactic.Take_Inst cterm') 
wneuper@59571
    80
| Tactic.Subproblem (domID, pblID) => ("Subproblem", Tactic.Subproblem (domID, pblID)) 
neuper@37906
    81
(*
wneuper@59571
    82
| Tactic.Subproblem_Full(spec,cts')=> ("Subproblem_Full", Tactic.Subproblem_Full(spec,cts')) 
neuper@37906
    83
*)
wneuper@59571
    84
| Tactic.End_Subproblem            => ("End_Subproblem", Tactic.End_Subproblem)
wneuper@59571
    85
| Tactic.CAScmd cterm'		    => ("CAScmd", Tactic.CAScmd cterm')
neuper@37906
    86
			    
wneuper@59571
    87
| Tactic.Split_And                 => ("Split_And", Tactic.Split_And) 
wneuper@59571
    88
| Tactic.Conclude_And		    => ("Conclude_And", Tactic.Conclude_And) 
wneuper@59571
    89
| Tactic.Split_Or                  => ("Split_Or", Tactic.Split_Or) 
wneuper@59571
    90
| Tactic.Conclude_Or		    => ("Conclude_Or", Tactic.Conclude_Or) 
wneuper@59571
    91
| Tactic.Begin_Trans               => ("Begin_Trans", Tactic.Begin_Trans) 
wneuper@59571
    92
| Tactic.End_Trans		    => ("End_Trans", Tactic.End_Trans) 
wneuper@59571
    93
| Tactic.Begin_Sequ                => ("Begin_Sequ", Tactic.Begin_Sequ) 
wneuper@59571
    94
| Tactic.End_Sequ                  => ("End_Sequ", Tactic.Begin_Sequ) 
wneuper@59571
    95
| Tactic.Split_Intersect           => ("Split_Intersect", Tactic.Split_Intersect) 
wneuper@59571
    96
| Tactic.End_Intersect		    => ("End_Intersect", Tactic.End_Intersect) 
wneuper@59571
    97
| Tactic.Check_elementwise cterm'  => ("Check_elementwise", Tactic.Check_elementwise cterm')
wneuper@59571
    98
| Tactic.Or_to_List                => ("Or_to_List", Tactic.Or_to_List) 
wneuper@59571
    99
| Tactic.Collect_Trues	            => ("Collect_Results", Tactic.Collect_Trues) 
neuper@37906
   100
			    
wneuper@59571
   101
| Tactic.Empty_Tac               => ("Empty_Tac", Tactic.Empty_Tac)
wneuper@59571
   102
| Tactic.Tac string              => ("Tac", Tactic.Tac string)
wneuper@59571
   103
| Tactic.End_Proof'                => ("End_Proof'", Tactic.End_Proof')
wneuper@59286
   104
| _ => error "mk_tac'_: uncovered case"; 
neuper@37906
   105
wneuper@59279
   106
type squ = ctree; (* TODO: safe etc. *)
neuper@37906
   107
wneuper@59286
   108
val specsteps = ["Init_Proof", "Refine_Tacitly", "Refine_Problem", "Model_Problem",
wneuper@59286
   109
  "Add_Given", "Del_Given", "Add_Find", "Del_Find", "Add_Relation", "Del_Relation",
wneuper@59286
   110
  "Specify_Theory", "Specify_Problem", "Specify_Method"];
neuper@37906
   111
wneuper@59578
   112
(*FIXME.WN050821 compare solve    ...   begin_end_prog:
wneuper@59578
   113
        WN190811: solve ("Apply_Method",.. used by root-pbl + by locate_input_tactic !!!
wneuper@59578
   114
*)
walther@59655
   115
fun solve ("Apply_Method", m as Tactic.Apply_Method' (mI, _, _, ctxt)) (pt, (pos as (p, p_))) =
walther@59603
   116
    let
walther@59603
   117
      val {srls, ...} = Specify.get_met mI;
wneuper@59286
   118
      val itms = case get_obj I pt p of
wneuper@59286
   119
        PblObj {meth=itms, ...} => itms
wneuper@59286
   120
      | _ => error "solve Apply_Method: uncovered case get_obj"
wneuper@59286
   121
      val thy' = get_obj g_domID pt p;
wneuper@59405
   122
      val thy = Celem.assoc_thy thy';
wneuper@59583
   123
      val (is, env, ctxt, sc) = case Lucin.init_pstate ctxt itms mI of
wneuper@59583
   124
        (is as Istate.Pstate (env,_,_,_,_,_), ctxt, sc) =>  (is, env, ctxt, sc)
wneuper@59583
   125
      | _ => error "solve Apply_Method: uncovered case init_pstate"
wneuper@59286
   126
      val ini = Lucin.init_form thy sc env;
wneuper@59286
   127
      val p = lev_dn p;
wneuper@59286
   128
    in 
wneuper@59286
   129
      case ini of
wneuper@59286
   130
	      SOME t =>
wneuper@59286
   131
          let val (pos,c,_, pt) = 
wneuper@59571
   132
		        Generate.generate1 thy (Tactic.Apply_Method' (mI, SOME t, is, ctxt))
wneuper@59286
   133
		        (is, ctxt) (lev_on p, Frm)(*implicit Take*) pt;
wneuper@59571
   134
	        in ("ok",([(Tactic.Apply_Method mI, Tactic.Apply_Method' (mI, SOME t, is, ctxt), 
wneuper@59286
   135
		        ((lev_on p, Frm), (is, ctxt)))], c, (pt, pos))) 
wneuper@59286
   136
	        end	      
walther@59655
   137
	    | NONE => (*execute first tac in the Program, compare solve m*)
wneuper@59286
   138
	        let
walther@59675
   139
            val (m', (is', ctxt'), _) =
walther@59675
   140
              LucinNEW.determine_next_tactic (thy', srls) (pt, (p, Res)) sc (is, ctxt);
wneuper@59286
   141
	        in 
wneuper@59569
   142
            case LucinNEW.locate_input_tactic sc (pt, (p, Res)) is' ctxt' m' of
walther@59655
   143
              LucinNEW.Safe_Step (istate, ctxt, tac) =>
walther@59655
   144
(*NEW*)       let
walther@59655
   145
(*NEW*)         val (p'', _, _,pt') =
walther@59655
   146
(*NEW*)           Generate.generate1 (Celem.assoc_thy "Isac_Knowledge") tac
walther@59655
   147
(*NEW*)           (* DEL.^^^^^ ContextC.insert_assumptions asms' ctxt 2nd, fst in Lucin.associate *)
walther@59655
   148
(*NEW*)             (istate, ctxt) (lev_on p, Pbl) pt;
walther@59655
   149
(*NEW*)       in
walther@59655
   150
(*NEW*)	  	    ("ok", ([(Lucin.tac_2tac tac, tac, (p'', (istate, ctxt)))],
walther@59655
   151
(*NEW*)           [(*ctree NOT cut*)], (pt', p'')))
walther@59655
   152
(*NEW*)       end
walther@59655
   153
(*OLD* )		  ("ok", ([(Lucin.tac_2tac tac, tac, (snd cstate, (istate, ctxt)))],
walther@59655
   154
(*OLD*)         [(*ctree NOT cut*)], cstate))
walther@59655
   155
( *OLD*)
wneuper@59286
   156
		        | _ => (* NotLocatable *)
walther@59675
   157
		            let
walther@59675
   158
		              val (p, ps, _, pt) =
walther@59675
   159
		                Generate.generate_hard (Celem.assoc_thy "Isac_Knowledge") m (p, Frm) pt;
wneuper@59286
   160
		            in 
wneuper@59286
   161
		              ("not-found-in-script",([(Lucin.tac_2tac m, m, (pos, (is, ctxt)))], ps, (pt, p))) 
wneuper@59286
   162
		            end
wneuper@59286
   163
	        end
wneuper@59286
   164
    end
wneuper@59571
   165
  | solve ("Free_Solve", Tactic.Free_Solve')  (pt, po as (p, _)) =
wneuper@59286
   166
    let
wneuper@59286
   167
      val p' = lev_dn_ (p, Res);
wneuper@59405
   168
      val pt = update_metID pt (par_pblobj pt p) Celem.e_metID;
wneuper@59286
   169
    in
wneuper@59581
   170
      ("ok", ([(Tactic.Empty_Tac, Tactic.Empty_Tac_, (po, (Istate.Uistate, ContextC.e_ctxt)))], [], (pt,p')))
wneuper@59286
   171
    end
wneuper@59571
   172
  | solve ("Check_Postcond", Tactic.Check_Postcond' (pI, _)) (pt, (p, p_)) =
wneuper@59286
   173
    let
wneuper@59286
   174
      val pp = par_pblobj pt p
wneuper@59286
   175
      val asm = 
wneuper@59582
   176
        (case get_obj g_tac pt p of (*assumes Check_elementwise IMMEDIATELY BEFORE Check_Postcond*)
wneuper@59571
   177
		       Tactic.Check_elementwise _ => (*collects and instantiates asms*)
wneuper@59286
   178
		         (snd o (get_obj g_result pt)) p
wneuper@59286
   179
		     | _ => get_assumptions_ pt (p,p_))
wneuper@59286
   180
	      handle _ => [] (*WN.27.5.03 asms in subpbls not completely clear*)
wneuper@59286
   181
      val metID = get_obj g_metID pt pp;
wneuper@59286
   182
      val {srls = srls, scr = sc, ...} = Specify.get_met metID;
wneuper@59286
   183
      val (loc, E, l, a, b, ctxt) = case get_loc pt (p, p_) of
wneuper@59583
   184
        loc as (Istate.Pstate (E, l, a, _, _, b), ctxt) => (loc, E, l, a, b, ctxt)
wneuper@59286
   185
      | _ => error "solve Check_Postcond: uncovered case get_loc"
wneuper@59286
   186
      val thy' = get_obj g_domID pt pp;
wneuper@59405
   187
      val thy = Celem.assoc_thy thy';
wneuper@59559
   188
      val (_, _, (scval, scsaf)) = LucinNEW.determine_next_tactic (thy', srls) (pt, (p, p_)) sc loc;
wneuper@59286
   189
    in 
wneuper@59286
   190
      if pp = [] 
wneuper@59286
   191
      then
wneuper@59286
   192
	      let 
walther@59675
   193
          val is = Istate.Pstate (E,l,a,scval,Istate.Skip_,b)
wneuper@59571
   194
	        val tac_ = Tactic.Check_Postcond' (pI, (scval, asm))
wneuper@59286
   195
	        val (pos, ps, _, pt) = Generate.generate1 thy tac_ (is, ctxt) (pp, Res) pt;
wneuper@59571
   196
	      in ("ok", ([(Tactic.Check_Postcond pI, tac_, ((pp, Res), (is, ctxt)))], ps, (pt, pos))) end
wneuper@59286
   197
      else
wneuper@59286
   198
        let (*resume script of parpbl, transfer value of subpbl-script*)
wneuper@59286
   199
          val ppp = par_pblobj pt (lev_up p);
wneuper@59286
   200
	        val thy' = get_obj g_domID pt ppp;
wneuper@59405
   201
          val thy = Celem.assoc_thy thy';
wneuper@59286
   202
          val (E, l, a, b, ctxt') = case get_loc pt (pp, Frm) of
wneuper@59583
   203
            (Istate.Pstate (E, l, a, _, _, b), ctxt') => (E, l, a, b, ctxt')
wneuper@59286
   204
          | _ => error "solve Check_Postcond resume script of parpbl: uncovered case get_loc"
wneuper@59577
   205
	        val ctxt'' = ContextC.from_subpbl_to_caller ctxt scval ctxt'
wneuper@59571
   206
          val ((p, p_), ps, _, pt) = Generate.generate1 thy (Tactic.Check_Postcond' (pI, (scval, asm)))
walther@59675
   207
		        (Istate.Pstate (E,l,a,scval,Istate.Skip_,b), ctxt'') (pp,Res) pt;
wneuper@59571
   208
       in ("ok", ([(Tactic.Check_Postcond pI, Tactic.Check_Postcond'(pI, (scval, asm)),
walther@59675
   209
  	      ((pp, Res), (Istate.Pstate (E, l, a, scval, Istate.Skip_, b), ctxt'')))], ps, (pt, (p, p_)))) end
wneuper@59286
   210
     end
wneuper@59571
   211
  | solve (_, Tactic.End_Proof'') (pt, (p, p_)) =
wneuper@59581
   212
    ("end-proof", ([(Tactic.Empty_Tac, Tactic.Empty_Tac_, (([], Res), (Istate.Uistate, ContextC.e_ctxt)))], [], (pt, (p, p_))))
wneuper@59571
   213
  | solve (_, Tactic.End_Detail' t) (pt, (p, p_)) = (* could be done by generate1 ?!? *)
wneuper@59286
   214
    let (*Rewrite_Set* done at Detail_Set*: this result is already in ctree*)
wneuper@59286
   215
      val pr = (lev_up p, Res)
wneuper@59286
   216
    in
wneuper@59571
   217
      ("ok", ([(Tactic.End_Detail, Tactic.End_Detail' t , ((p, p_), get_loc pt (p, p_)))], [], (pt, pr)))
wneuper@59286
   218
    end
walther@59639
   219
  (* ======== general case ======== *)
wneuper@59286
   220
  | solve (_, m) (pt, po as (p, p_)) =
wneuper@59405
   221
    if Celem.e_metID = get_obj g_metID pt (par_pblobj pt p) (*29.8.02: could be detail, too !!*)
wneuper@59286
   222
    then
wneuper@59286
   223
      let
wneuper@59286
   224
        val ctxt = get_ctxt pt po
wneuper@59405
   225
        val ((p,p_),ps,_,pt) = Generate.generate1 (Celem.assoc_thy (get_obj g_domID pt (par_pblobj pt p))) 
wneuper@59572
   226
		      m (Istate.e_istate, ctxt) (p, p_) pt;
wneuper@59286
   227
	    in ("no-method-specified", (*Free_Solve*)
wneuper@59572
   228
	      ([(Tactic.Empty_Tac, Tactic.Empty_Tac_, ((p, p_), (Istate.Uistate, ctxt)))], ps, (pt, (p, p_))))
wneuper@59286
   229
      end
wneuper@59286
   230
    else
wneuper@59286
   231
	    let 
wneuper@59286
   232
	      val thy' = get_obj g_domID pt (par_pblobj pt p);
wneuper@59569
   233
	      val (_, is, sc) = Lucin.from_pblobj_or_detail' thy' (p,p_) pt;
wneuper@59286
   234
	    in
wneuper@59569
   235
        case LucinNEW.locate_input_tactic sc (pt, po) (fst is) (snd is) m  of
walther@59653
   236
(*OLD* )   LucinNEW.Safe_Step ((*->*)cstate(*<-*), istate, (*->*)ctxt(*<-*), tac) =>
walther@59655
   237
( *NEW*)  LucinNEW.Safe_Step (istate, ctxt, tac) =>
walther@59653
   238
(*NEW*)     let
walther@59653
   239
(*NEW*)        val p' = 
walther@59653
   240
(*NEW*)          case p_ of Frm => p 
walther@59653
   241
(*NEW*)          | Res => lev_on p
walther@59653
   242
(*NEW*)          | _ => error ("solve: call by " ^ pos'2str (p, p_));
walther@59653
   243
(*NEW*)        val (p'', _, _,pt') =
walther@59654
   244
(*NEW*)          Generate.generate1 (Celem.assoc_thy "Isac_Knowledge") tac
walther@59653
   245
(*NEW*)          (* DEL.^^^^^ ContextC.insert_assumptions asms' ctxt 2nd, fst in Lucin.associate *)
walther@59653
   246
(*NEW*)            (istate, ctxt) (p', p_) pt;
walther@59639
   247
(*NEW*)     in
walther@59653
   248
(*NEW*)		    ("ok", ([(Lucin.tac_2tac tac, tac, (p'', (istate, ctxt)))],
walther@59653
   249
(*NEW*)         [(*ctree NOT cut*)], (pt', p'')))
walther@59653
   250
(*NEW*)     end
walther@59653
   251
(*OLD* )		  ("ok", ([(Lucin.tac_2tac tac, tac, (snd cstate, (istate, ctxt)))],
walther@59651
   252
(*OLD*)         [(*ctree NOT cut*)], cstate))
walther@59653
   253
( *OLD*)
walther@59655
   254
	      | LucinNEW.Unsafe_Step (istate, ctxt, tac) =>
walther@59654
   255
(*NEW*)     let
walther@59654
   256
(*NEW*)        val p' = 
walther@59654
   257
(*NEW*)          case p_ of Frm => p 
walther@59654
   258
(*NEW*)          | Res => lev_on p
walther@59654
   259
(*NEW*)          | _ => error ("solve: call by " ^ pos'2str (p, p_));
walther@59654
   260
(*NEW*)        val (p'', _, _,pt') =
walther@59654
   261
(*NEW*)          Generate.generate1 (Celem.assoc_thy "Isac_Knowledge") tac
walther@59654
   262
(*NEW*)          (* DEL.^^^^^ ContextC.insert_assumptions asms' ctxt 2nd, fst in Lucin.associate *)
walther@59654
   263
(*NEW*)            (istate, ctxt) (p', p_) pt;
walther@59654
   264
(*NEW*)     in
walther@59654
   265
(*NEW*)		    ("ok", ([(Lucin.tac_2tac tac, tac, (p'', (istate, ctxt)))],
walther@59654
   266
(*NEW*)         [(*ctree NOT cut*)], (pt', p'')))
walther@59654
   267
(*NEW*)     end
wneuper@59286
   268
	      | _ => (* NotLocatable *)
wneuper@59286
   269
	        let 
wneuper@59592
   270
	          val (p,ps, _, pt) = Generate.generate_hard (Celem.assoc_thy "Isac_Knowledge") m (p, p_) pt;
wneuper@59286
   271
	        in
wneuper@59286
   272
	          ("not-found-in-script", ([(Lucin.tac_2tac m, m, (po, is))], ps, (pt, p)))
wneuper@59286
   273
          end
wneuper@59286
   274
	    end;
neuper@37906
   275
walther@59648
   276
(* tell how may steps of a calculation should be done by "fun autocalc"
wneuper@59286
   277
   FIXXXME040624: does NOT match interfaces/ITOCalc.java
wneuper@59286
   278
   TODO.WN0512 redesign togehter with autocalc ?                     *)
neuper@37906
   279
datatype auto = 
wneuper@59260
   280
  Step of int      (*1 do #int steps (may stop in model/specify)
wneuper@59260
   281
                       IS VERY INEFFICIENT IN MODEL/SPECIY                    *)
neuper@37906
   282
| CompleteModel    (*2 complete modeling
wneuper@59260
   283
                       if model complete, finish specifying                   *)
wneuper@59260
   284
| CompleteCalcHead (*3 complete model/specify in one go                       *)
neuper@37906
   285
| CompleteToSubpbl (*4 stop at the next begin of a subproblem,
wneuper@59260
   286
                       if none, complete the actual (sub)problem              *)
wneuper@59260
   287
| CompleteSubpbl   (*5 complete the actual (sub)problem (incl.ev.subproblems) *)
wneuper@59260
   288
| CompleteCalc;    (*6 complete the calculation as a whole                    *)
neuper@42092
   289
neuper@37906
   290
fun autoord (Step _ ) = 1
neuper@37906
   291
  | autoord CompleteModel = 2
neuper@37906
   292
  | autoord CompleteCalcHead = 3
neuper@37906
   293
  | autoord CompleteToSubpbl = 4
neuper@37906
   294
  | autoord CompleteSubpbl = 5
neuper@37906
   295
  | autoord CompleteCalc = 6;
neuper@37906
   296
wneuper@59286
   297
fun complete_solve auto c (ptp as (_, p as (_, p_))) =
wneuper@59286
   298
    if p = ([], Res)
wneuper@59286
   299
    then ("end-of-calculation", [], ptp)
neuper@41997
   300
    else
wneuper@59286
   301
      if member op = [Pbl,Met] p_
wneuper@59286
   302
      then
wneuper@59286
   303
        let
wneuper@59286
   304
          val ptp = Chead.all_modspec ptp
wneuper@59286
   305
	        val (_, c', ptp) = all_solve auto c ptp
wneuper@59286
   306
	      in complete_solve auto (c @ c') ptp end
wneuper@59286
   307
      else
wneuper@59562
   308
        case LucinNEW.do_solve_step ptp of
wneuper@59571
   309
	        ((Tactic.Subproblem _, _, _) :: _, c', ptp') =>
wneuper@59286
   310
	          if autoord auto < 5
wneuper@59286
   311
            then ("ok", c @ c', ptp)
wneuper@59286
   312
	          else
wneuper@59286
   313
              let
wneuper@59286
   314
                val ptp = Chead.all_modspec ptp'
wneuper@59286
   315
	             val (_, c'', ptp) = all_solve auto (c @ c') ptp
wneuper@59286
   316
	           in complete_solve auto (c @ c'@ c'') ptp end
wneuper@59571
   317
	      | ((Tactic.Check_Postcond _, _, _) :: _, c', ptp' as (_, p')) =>
wneuper@59286
   318
	        if autoord auto < 6 orelse p' = ([], Res)
neuper@41997
   319
          then ("ok", c @ c', ptp')
neuper@41997
   320
	        else complete_solve auto (c @ c') ptp'
wneuper@59571
   321
	      | ((Tactic.End_Detail, _, _) :: _, c', ptp') => 
neuper@41997
   322
	        if autoord auto < 6
neuper@41997
   323
          then ("ok", c @ c', ptp')
neuper@41997
   324
	        else complete_solve auto (c @ c') ptp'
wneuper@59286
   325
	      | (_, c', ptp') => complete_solve auto (c @ c') ptp'
wneuper@59279
   326
and all_solve auto c (ptp as (pt, pos as (p,_)): ctree * pos') = 
wneuper@59286
   327
    let
wneuper@59286
   328
      val (_, _, mI) = get_obj g_spec pt p
wneuper@59286
   329
      val ctxt = get_ctxt pt pos
wneuper@59572
   330
      val (_, c', ptp) = LucinNEW.begin_end_prog (Tactic.Apply_Method' (mI, NONE, Istate.e_istate, ctxt)) (Istate.e_istate, ctxt) ptp
wneuper@59286
   331
    in
wneuper@59286
   332
      complete_solve auto (c @ c') ptp
wneuper@59286
   333
    end;
neuper@41997
   334
neuper@41997
   335
(* aux.fun for detailrls with Rrls, reverse rewriting *)
wneuper@59286
   336
fun rul_terms_2nds _ nds _ [] = nds
s1210629013@52153
   337
  | rul_terms_2nds thy nds t ((rule, res as (t', _)) :: rts) =
wneuper@59581
   338
    (append_atomic [] (Istate.e_istate, ContextC.e_ctxt) t (Tactic.rule2tac thy [] rule) res Complete EmptyPtree) ::
wneuper@59286
   339
      (rul_terms_2nds thy nds t' rts);
neuper@37906
   340
neuper@41997
   341
(* detail steps done internally by Rewrite_Set* into ctree by use of a script *)
wneuper@59286
   342
fun detailrls pt (pos as (p, _)) = 
neuper@41997
   343
  let
neuper@41997
   344
    val t = get_obj g_form pt p
neuper@41997
   345
	  val tac = get_obj g_tac pt p
wneuper@59571
   346
	  val rls = (assoc_rls o Tactic.rls_of) tac
neuper@41997
   347
    val ctxt = get_ctxt pt pos
neuper@41997
   348
  in
neuper@41997
   349
    case rls of
wneuper@59416
   350
	    Rule.Rrls {scr = Rule.Rfuns {init_state, ...}, ...} => 
wneuper@59286
   351
	    let
wneuper@59286
   352
        val (_, _, _, rul_terms) = init_state t
wneuper@59286
   353
	      val newnds = rul_terms_2nds (Proof_Context.theory_of ctxt) [] t rul_terms
wneuper@59286
   354
	      val pt''' = ins_chn newnds pt p 
wneuper@59286
   355
	    in ("detailrls", pt''', (p @ [length newnds], Res)) end
neuper@41997
   356
	  | _ =>
wneuper@59286
   357
	    let
wneuper@59286
   358
        val is = Generate.init_istate tac t
wneuper@59583
   359
	      (*TODO.WN060602 Pstate (["(t_, Problem (Isac,[equation,univar]))"]
wneuper@59286
   360
			    is wrong for simpl, but working ?!? *)
wneuper@59571
   361
	      val tac_ = Tactic.Apply_Method' (Celem.e_metID(*WN0402: see generate1 !?!*), SOME t, is, ctxt)
wneuper@59286
   362
	      val pos' = ((lev_on o lev_dn) p, Frm)
wneuper@59592
   363
	      val thy = Celem.assoc_thy "Isac_Knowledge"
wneuper@59286
   364
	      val (_, _, _, pt') = Generate.generate1 thy tac_ (is, ctxt) pos' pt (* implicit Take *)
wneuper@59286
   365
	      val (_,_, (pt'', _)) = complete_solve CompleteSubpbl [] (pt', pos')
wneuper@59286
   366
	      val newnds = children (get_nd pt'' p)
wneuper@59286
   367
	      val pt''' = ins_chn newnds pt p (*complete_solve cuts branches after*)
wneuper@59411
   368
	    in ("detailrls", pt''', (p @ [length newnds], Res)) end
neuper@41997
   369
  end;
neuper@37906
   370
wneuper@59286
   371
fun get_form (mI, m) (p,p_) pt = 
wneuper@59286
   372
  case Applicable.applicable_in (p, p_) pt m of
wneuper@59271
   373
    Chead.Notappl e => Generate.Error' e
wneuper@59265
   374
  | Chead.Appl m => 
neuper@37935
   375
      if member op = specsteps mI
wneuper@59286
   376
      then
wneuper@59286
   377
        let val (_, _, f, _, _, _) = Chead.specify m (p, p_) [] pt
wneuper@59286
   378
        in f end
wneuper@59286
   379
      else Generate.EmptyMout;
wneuper@59562
   380
wneuper@59562
   381
fun inform (next_cs as (_, _, (pt, pos as (p, _))): Chead.calcstate') istr =
wneuper@59562
   382
  let
wneuper@59562
   383
    val ctxt = get_ctxt pt pos (*see TODO.thy*)
wneuper@59562
   384
  in
wneuper@59592
   385
    case TermC.parse (Celem.assoc_thy "Isac_Knowledge") istr of
wneuper@59562
   386
      NONE => ("syntax error in '" ^ istr ^ "'", Chead.e_calcstate' (*TODO: previous cs'*))
wneuper@59562
   387
    | SOME f_in =>
wneuper@59562
   388
      let
wneuper@59562
   389
    	  val f_in = Thm.term_of f_in
wneuper@59562
   390
        val pos_pred = lev_back(*'*) pos
wneuper@59562
   391
    	  val f_pred = Ctree.get_curr_formula (pt, pos_pred);
wneuper@59562
   392
    	  val f_succ = Ctree.get_curr_formula (pt, pos);
wneuper@59562
   393
      in
wneuper@59562
   394
        if f_succ = f_in
wneuper@59562
   395
        then ("same-formula", next_cs) (* ctree not cut with replaceFormula *)
wneuper@59562
   396
        else
wneuper@59562
   397
          case Inform.cas_input f_in of
wneuper@59562
   398
            SOME (pt, _) => ("ok",([], [], (pt, (p, Ctree.Met))))
wneuper@59562
   399
			    | NONE => (*/-------------------------------------- NEW fun locate_input_formula------*)
wneuper@59562
   400
            let
wneuper@59562
   401
       (*NEW*)val (_, _, metID) = get_obj g_spec pt (par_pblobj pt p)
wneuper@59562
   402
       (*NEW*)val {scr = prog, ...} = Specify.get_met metID
wneuper@59562
   403
       (*NEW*)val istate = get_istate pt pos
wneuper@59562
   404
       (*NEW*)val ctxt = get_ctxt pt pos
wneuper@59562
   405
            in
wneuper@59562
   406
              case LucinNEW.locate_input_formula prog (pt, pos) istate ctxt f_in of
wneuper@59562
   407
                LucinNEW.Step (cstate, _(*istate*), _(*ctxt*)) =>
wneuper@59562
   408
                ("ok" , ([], [], cstate (* already contains istate, ctxt *)))
wneuper@59562
   409
              | LucinNEW.Not_Derivable calcstate' =>
wneuper@59562
   410
                let
wneuper@59562
   411
            		  val pp = Ctree.par_pblobj pt p
wneuper@59562
   412
            		  val (errpats, nrls, prog) = case Specify.get_met (Ctree.get_obj Ctree.g_metID pt pp) of
wneuper@59562
   413
              		    {errpats, nrls, scr = Rule.Prog prog, ...} => (errpats, nrls, prog)
wneuper@59562
   414
              		  | _ => error "inform: uncovered case of get_met"
wneuper@59562
   415
            		  val env = case Ctree.get_istate pt pos of
wneuper@59583
   416
              		    Istate.Pstate (env, _, _, _, _, _) => env
wneuper@59562
   417
              		  | _ => error "inform: uncovered case of get_istate"
wneuper@59562
   418
            		in
wneuper@59562
   419
            		  case Inform.check_error_patterns (f_pred, f_in) (prog, env) (errpats, nrls) of
wneuper@59562
   420
            		    SOME errpatID => ("error pattern #" ^ errpatID ^ "#", calcstate')
wneuper@59562
   421
            		  | NONE => ("no derivation found", calcstate')
wneuper@59562
   422
                end
wneuper@59562
   423
            end
wneuper@59562
   424
      end
wneuper@59562
   425
  end
wneuper@59562
   426
wneuper@59273
   427
end