src/Tools/isac/MathEngine/detail-step.sml
author Walther Neuper <walther.neuper@jku.at>
Mon, 04 May 2020 09:25:51 +0200
changeset 59932 87336f3b021f
parent 59903 5037ca1b112b
child 59935 16927a749dd7
permissions -rw-r--r--
separate Solve_Step.add, rearrange code, prep. Specify_Step
     1 (* Title:  MathEngine/detail-step.sml
     2    Author: Walther Neuper 2020
     3    (c) due to copyright terms
     4 
     5 Within one step go into detailed steps on request by the user
     6 *)
     7 
     8 signature DETAIL_STEP =
     9 sig
    10   val go : Ctree.ctree -> Pos.pos' -> string * Ctree.ctree * Pos.pos'
    11   val detailrls : Ctree.ctree -> Pos.pos' -> string * Ctree.ctree * Pos.pos'
    12 end
    13 
    14 (**)
    15 structure Detail_Step(**): DETAIL_STEP(**) =
    16 struct
    17 (**)
    18 open Ctree;
    19 open Pos
    20 
    21 (* aux.fun for detailrls with Rrls, reverse rewriting *)
    22 fun rul_terms_2nds _ nds _ [] = nds
    23   | rul_terms_2nds thy nds t ((rule, res as (t', _)) :: rts) =
    24     (append_atomic [] (NONE(*guessed*), (Istate.empty, ContextC.empty)) t (Tactic.rule2tac thy [] rule) res Complete EmptyPtree) ::
    25       (rul_terms_2nds thy nds t' rts);
    26 
    27 (* detail steps done internally by Rewrite_Set* into Ctree 
    28   by use of a program *)
    29 fun detailrls pt (pos as (p, _)) = 
    30   let
    31     val t = get_obj g_form pt p
    32 	  val tac = get_obj g_tac pt p
    33 	  val rls = (assoc_rls o Tactic.rls_of) tac
    34     val ctxt = get_ctxt pt pos
    35   in
    36     case rls of
    37 	    Rule_Set.Rrls {scr = Rule.Rfuns {init_state, ...}, ...} => 
    38 	    let
    39         val (_, _, _, rul_terms) = init_state t
    40 	      val newnds = rul_terms_2nds (Proof_Context.theory_of ctxt) [] t rul_terms
    41 	      val pt''' = ins_chn newnds pt p 
    42 	    in ("detailrls", pt''', (p @ [length newnds], Res)) end
    43 	  | _ =>
    44 	    let
    45         val is = Generate.init_istate tac t
    46 	      val tac_ = Tactic.Apply_Method' (Method.id_empty(*WN0402: see generate1 !?!*), SOME t, is, ctxt)
    47 	      val pos' = ((lev_on o lev_dn) p, Frm)
    48 	      val (_, _, _, pt') = Step.add tac_ (is, ctxt) (pt, pos') (* implicit Take *)
    49 	      val (_,_, (pt'', _)) = Solve.complete_solve Solve.CompleteSubpbl [] (pt', pos')
    50 	      val newnds = children (get_nd pt'' p)
    51 	      val pt''' = ins_chn newnds pt p (*complete_solve cuts branches after*)
    52 	    in ("detailrls", pt''', (p @ [length newnds], Res)) end
    53   end;
    54 
    55 fun go pt (pos as (p, _)) = 
    56   let 
    57     val nd = Ctree.get_nd pt p
    58     val cn = Ctree.children nd
    59   in 
    60     if null cn 
    61     then
    62       if (Tactic.is_rewset o (Ctree.get_obj Ctree.g_tac nd)) [(*root of nd*)]
    63       then detailrls pt pos
    64       else ("no-Rewrite_Set...", Ctree.EmptyPtree, Pos.e_pos')
    65     else ("donesteps", pt, (p @ [length (Ctree.children (Ctree.get_nd pt p))], Pos.Res)) 
    66   end;
    67 
    68 end