src/Tools/isac/Interpret/step-solve.sml
author Walther Neuper <walther.neuper@jku.at>
Thu, 14 May 2020 14:49:13 +0200
changeset 59979 8c4142718e45
parent 59978 660ed21464d2
child 59981 dc34eff67648
permissions -rw-r--r--
analogous naming P_Specific .. P_Model
     1 (* Title:  Interpret/step-solve.sml
     2    Author: Walther Neuper 2019
     3    (c) due to copyright terms
     4 *)
     5 
     6 signature STEP_SOLVE =
     7 sig
     8   val do_next: Calc.T -> string * Specification.calcstate'
     9   val by_tactic : Tactic.T -> Calc.T -> string * Specification.calcstate'
    10   val by_term : Calc.T -> string -> string * Specification.calcstate' (*TODO: string * Calc.T*)
    11 end
    12 
    13 (**)
    14 structure Step_Solve(**): STEP_SOLVE(**) =
    15 struct
    16 (**)
    17 open Ctree;
    18 open Pos
    19 
    20 fun by_tactic (tac as Tactic.Apply_Method' _) (ptp as (pt, p)) =
    21     LI.by_tactic tac (get_istate_LI pt p, get_ctxt_LI pt p) ptp
    22   | by_tactic (tac as Tactic.Check_Postcond' _) (ptp as (pt, p)) =
    23     LI.by_tactic tac (get_istate_LI pt p, get_ctxt_LI pt p) ptp
    24   | by_tactic (Tactic.Free_Solve')  (pt, po as (p, _)) =
    25     let
    26       val p' = lev_dn_ (p, Res);
    27       val pt = update_metID pt (par_pblobj pt p) Method.id_empty;
    28     in
    29       ("ok", ([(Tactic.Empty_Tac, Tactic.Empty_Tac_, (po, (Istate.Uistate, ContextC.empty)))], [], (pt,p')))
    30     end
    31   | by_tactic (Tactic.End_Proof'') ptp = ("end-proof", ([], [], ptp))
    32   | by_tactic (Tactic.End_Detail' t) (pt, (p, p_)) = (* could be done by generate1 ?!? *)
    33     let (*Rewrite_Set* done at Detail_Set*: this result is already in ctree*)
    34       val pr = (lev_up p, Res)
    35     in
    36       ("ok", ([(Tactic.End_Detail, Tactic.End_Detail' t , ((p, p_), get_loc pt (p, p_)))], [], (pt, pr)))
    37     end
    38   | by_tactic m (pt, po as (p, p_)) =
    39     if Method.id_empty = get_obj g_metID pt (par_pblobj pt p) (*29.8.02: could be detail, too !!*)
    40     then
    41       let
    42         val ctxt = get_ctxt pt po
    43         val ((p, p_), ps, _, pt) = Solve_Step.add_general m (Istate.empty, ctxt) (pt, (p, p_))
    44 	    in ("no-method-specified", (*Free_Solve*)
    45 	      ([(Tactic.Empty_Tac, Tactic.Empty_Tac_, ((p, p_), (Istate.Uistate, ctxt)))], ps, (pt, (p, p_))))
    46       end
    47     else
    48 	    let 
    49 	      val thy' = get_obj g_domID pt (par_pblobj pt p);
    50 	      val (is, sc) = LItool.resume_prog thy' (p,p_) pt;
    51 	    in
    52         case LI.locate_input_tactic sc (pt, po) (fst is) (snd is) m of
    53           LI.Safe_Step (istate, ctxt, tac) =>
    54             let
    55                val p' = next_in_prog po
    56                val (p'', _, _,pt') = Solve_Step.add_general tac (istate, ctxt) (pt, (p', p_))
    57             in
    58        		    ("ok", ([(Tactic.input_from_T tac, tac, (p'', (istate, ctxt)))],
    59                 [(*Ctree NOT cut*)], (pt', p'')))
    60             end
    61 	      | LI.Unsafe_Step (istate, ctxt, tac) =>
    62             let
    63                val p' = 
    64                  case p_ of Frm => p 
    65                  | Res => lev_on p
    66                  | _ => raise ERROR ("Step_Solve.by_tactic: call by " ^ pos'2str (p, p_));
    67                val (p'', _, _,pt') = Solve_Step.add_general tac (istate, ctxt) (pt, (p', p_));
    68             in
    69        		    ("ok", ([(Tactic.input_from_T tac, tac, (p'', (istate, ctxt)))],
    70                 [(*Ctree NOT cut*)], (pt', p'')))
    71             end
    72 	      | _ => (* NotLocatable *)
    73 	        let 
    74 	          val (p,ps, _, pt) = Solve_Step.add_hard (ThyC.get_theory "Isac_Knowledge") m (p, p_) pt;
    75 	        in
    76 	          ("not-found-in-program", ([(Tactic.input_from_T m, m, (po, is))], ps, (pt, p)))
    77           end
    78 	    end;
    79 
    80 val do_next = LI.do_next
    81 
    82 
    83 (*
    84   Locate a step in a program, which has been determined by input of a term.
    85   Special case: if the term is a CAS-command, then create a calchead, and do 1 step.
    86   If "no derivation found" then Error_Pattern.check_for.
    87   (Error_Pattern.check_for *within* compare_step seems too expensive)
    88 *)
    89 (*fun by_term (next_cs as (_, _, (pt, pos as (p, _))): Specification.calcstate') istr =*)
    90 fun by_term (pt, pos as (p, _)) istr =
    91   case TermC.parse (ThyC.get_theory "Isac_Knowledge") istr of
    92     NONE => ("syntax error in '" ^ istr ^ "'", Specification.e_calcstate')
    93   | SOME f_in =>
    94     let
    95   	  val f_in = Thm.term_of f_in
    96       val pos_pred = lev_back(*'*) pos
    97   	  val f_pred = Ctree.get_curr_formula (pt, pos_pred);
    98   	  val f_succ = Ctree.get_curr_formula (pt, pos);
    99     in
   100       if f_succ = f_in
   101       then ("same-formula", ([], [], (pt, pos))) (* ctree not cut with replaceFormula *)
   102       else
   103         case P_Specific.cas_input f_in of
   104           SOME (pt, _) => ("ok", ([], [], (pt, (p, Pos.Met))))
   105 		    | NONE =>
   106           case LI.locate_input_term (pt, pos) f_in of
   107             LI.Found_Step cstate =>
   108             ("ok" , ([], [], cstate (* already contains istate, ctxt *)))
   109           | LI.Not_Derivable =>
   110             let
   111           	  val pp = Ctree.par_pblobj pt p
   112           	  val (errpats, nrls, prog) = case Method.from_store (Ctree.get_obj Ctree.g_metID pt pp) of
   113           		    {errpats, nrls, scr = Rule.Prog prog, ...} => (errpats, nrls, prog)
   114           		  | _ => raise ERROR "inform: uncovered case of get_met"
   115           	  val {env, ...} = Ctree.get_istate_LI pt pos |> Istate.the_pstate
   116           	in
   117           	  case Error_Pattern.check_for (f_pred, f_in) (prog, env) (errpats, nrls) of
   118           	    SOME errpatID => ("error pattern #" ^ errpatID ^ "#", Specification.e_calcstate')
   119           	  | NONE => ("no derivation found", Specification.e_calcstate')
   120             end
   121     end
   122 
   123 end