src/Tools/isac/Interpret/solve-step.sml
changeset 59959 0f0718c61f68
parent 59943 4816df44437f
child 59962 6a59d252345d
equal deleted inserted replaced
59958:c06b7df89dcd 59959:0f0718c61f68
     6 *)
     6 *)
     7 
     7 
     8 signature SOLVE_STEP =
     8 signature SOLVE_STEP =
     9 sig
     9 sig
    10   val check: Tactic.input -> Calc.T -> Applicable.T
    10   val check: Tactic.input -> Calc.T -> Applicable.T
    11   val add: Tactic.T -> Istate_Def.T * Proof.context -> Calc.T -> Generate.test_out
    11   val add: Tactic.T -> Istate_Def.T * Proof.context -> Calc.T -> Test_Out.T
    12 
    12 
    13   val add_general: Tactic.T -> Istate_Def.T * Proof.context -> Calc.T -> Generate.test_out
    13   val add_general: Tactic.T -> Istate_Def.T * Proof.context -> Calc.T -> Test_Out.T
    14   val s_add_general: State_Steps.T ->
    14   val s_add_general: State_Steps.T ->
    15     Ctree.ctree * Pos.pos' list * Pos.pos' -> Ctree.ctree * Pos.pos' list * Pos.pos'
    15     Ctree.ctree * Pos.pos' list * Pos.pos' -> Ctree.ctree * Pos.pos' list * Pos.pos'
    16   val add_hard:
    16   val add_hard:
    17     theory -> Tactic.T -> Pos.pos' -> Ctree.ctree -> Generate.test_out
    17     theory -> Tactic.T -> Pos.pos' -> Ctree.ctree -> Test_Out.T
    18 
    18 
    19   val get_ruleset: 'a -> Pos.pos -> Ctree.ctree ->
    19   val get_ruleset: 'a -> Pos.pos -> Ctree.ctree ->
    20     string * ThyC.id * Rule_Def.rew_ord' * Rule_Def.rule_set * bool
    20     string * ThyC.id * Rule_Def.rew_ord' * Rule_Def.rule_set * bool
    21   val get_eval: string -> Pos.pos ->Ctree.ctree ->
    21   val get_eval: string -> Pos.pos ->Ctree.ctree ->
    22     string * ThyC.id * (string * Rule_Def.eval_fn)
    22     string * ThyC.id * (string * Rule_Def.eval_fn)
   236 
   236 
   237 fun add (Tactic.Apply_Method' (_, topt, is, _)) (_, ctxt) (pt, pos as (p, _)) = 
   237 fun add (Tactic.Apply_Method' (_, topt, is, _)) (_, ctxt) (pt, pos as (p, _)) = 
   238     (case topt of 
   238     (case topt of 
   239       SOME t => 
   239       SOME t => 
   240         let val (pt, c) = Ctree.cappend_form pt p (is, ctxt) t
   240         let val (pt, c) = Ctree.cappend_form pt p (is, ctxt) t
   241         in (pos, c, Generate.EmptyMout, pt) end
   241         in (pos, c, Test_Out.EmptyMout, pt) end
   242     | NONE => (pos, [], Generate.EmptyMout, pt))
   242     | NONE => (pos, [], Test_Out.EmptyMout, pt))
   243   | add (Tactic.Take' t) l (pt, (p, _)) = (* val (Take' t) = m; *)
   243   | add (Tactic.Take' t) l (pt, (p, _)) = (* val (Take' t) = m; *)
   244     let
   244     let
   245       val p =
   245       val p =
   246         let val (ps, p') = split_last p (* no connex to prev.ppobj *)
   246         let val (ps, p') = split_last p (* no connex to prev.ppobj *)
   247 	      in if p' = 0 then ps @ [1] else p end
   247 	      in if p' = 0 then ps @ [1] else p end
   248       val (pt, c) = Ctree.cappend_form pt p l t
   248       val (pt, c) = Ctree.cappend_form pt p l t
   249     in
   249     in
   250       ((p, Pos.Frm), c, Generate.FormKF (UnparseC.term t), pt)
   250       ((p, Pos.Frm), c, Test_Out.FormKF (UnparseC.term t), pt)
   251     end
   251     end
   252   | add (Tactic.Begin_Trans' t) l (pt, (p, Pos.Frm)) =
   252   | add (Tactic.Begin_Trans' t) l (pt, (p, Pos.Frm)) =
   253     let
   253     let
   254       val (pt, c) = Ctree.cappend_form pt p l t
   254       val (pt, c) = Ctree.cappend_form pt p l t
   255       val pt = Ctree.update_branch pt p Ctree.TransitiveB (*040312*)
   255       val pt = Ctree.update_branch pt p Ctree.TransitiveB (*040312*)
   256       (* replace the old PrfOjb ~~~~~ *)
   256       (* replace the old PrfOjb ~~~~~ *)
   257       val p = (Pos.lev_on o Pos.lev_dn (* starts with [...,0] *)) p
   257       val p = (Pos.lev_on o Pos.lev_dn (* starts with [...,0] *)) p
   258       val (pt, c') = Ctree.cappend_form pt p l t (*FIXME.0402 same istate ???*)
   258       val (pt, c') = Ctree.cappend_form pt p l t (*FIXME.0402 same istate ???*)
   259     in
   259     in
   260       ((p, Pos.Frm), c @ c', Generate.FormKF (UnparseC.term t), pt)
   260       ((p, Pos.Frm), c @ c', Test_Out.FormKF (UnparseC.term t), pt)
   261     end
   261     end
   262   | add (Tactic.Begin_Trans' t) l (pt, (p, Pos.Res)) = 
   262   | add (Tactic.Begin_Trans' t) l (pt, (p, Pos.Res)) = 
   263     (*append after existing PrfObj    vvvvvvvvvvvvv*)
   263     (*append after existing PrfObj    vvvvvvvvvvvvv*)
   264     add (Tactic.Begin_Trans' t) l (pt, (Pos.lev_on p, Pos.Frm))
   264     add (Tactic.Begin_Trans' t) l (pt, (Pos.lev_on p, Pos.Frm))
   265   | add (Tactic.End_Trans' tasm) l (pt, (p, _)) =
   265   | add (Tactic.End_Trans' tasm) l (pt, (p, _)) =
   266     let
   266     let
   267       val p' = Pos.lev_up p
   267       val p' = Pos.lev_up p
   268       val (pt, c) = Ctree.append_result pt p' l tasm Ctree.Complete
   268       val (pt, c) = Ctree.append_result pt p' l tasm Ctree.Complete
   269     in
   269     in
   270       ((p', Pos.Res), c, Generate.FormKF "DUMMY" (*term2str t ..ERROR (t) has not been declared*), pt)
   270       ((p', Pos.Res), c, Test_Out.FormKF "DUMMY" (*term2str t ..ERROR (t) has not been declared*), pt)
   271     end
   271     end
   272   | add (Tactic.Rewrite_Inst' (_, _, _, _, subs', thm', f, (f', asm))) (is, ctxt) (pt, (p, _)) =
   272   | add (Tactic.Rewrite_Inst' (_, _, _, _, subs', thm', f, (f', asm))) (is, ctxt) (pt, (p, _)) =
   273     let
   273     let
   274       val (pt, c) = Ctree.cappend_atomic pt p (is, ctxt) f
   274       val (pt, c) = Ctree.cappend_atomic pt p (is, ctxt) f
   275         (Tactic.Rewrite_Inst (Subst.T_to_input subs', thm')) (f',asm) Ctree.Complete;
   275         (Tactic.Rewrite_Inst (Subst.T_to_input subs', thm')) (f',asm) Ctree.Complete;
   276       val pt = Ctree.update_branch pt p Ctree.TransitiveB
   276       val pt = Ctree.update_branch pt p Ctree.TransitiveB
   277     in
   277     in
   278       ((p, Pos.Res), c, Generate.FormKF (UnparseC.term f'), pt)
   278       ((p, Pos.Res), c, Test_Out.FormKF (UnparseC.term f'), pt)
   279     end
   279     end
   280  | add (Tactic.Rewrite' (_, _, _, _, thm', f, (f', asm))) (is, ctxt) (pt, (p, _)) =
   280  | add (Tactic.Rewrite' (_, _, _, _, thm', f, (f', asm))) (is, ctxt) (pt, (p, _)) =
   281    let
   281    let
   282      val (pt, c) = Ctree.cappend_atomic pt p (is, ctxt) f (Tactic.Rewrite thm') (f', asm) Ctree.Complete
   282      val (pt, c) = Ctree.cappend_atomic pt p (is, ctxt) f (Tactic.Rewrite thm') (f', asm) Ctree.Complete
   283      val pt = Ctree.update_branch pt p Ctree.TransitiveB
   283      val pt = Ctree.update_branch pt p Ctree.TransitiveB
   284    in
   284    in
   285     ((p, Pos.Res), c, Generate.FormKF (UnparseC.term f'), pt)
   285     ((p, Pos.Res), c, Test_Out.FormKF (UnparseC.term f'), pt)
   286    end
   286    end
   287   | add (Tactic.Rewrite_Set_Inst' (_, _, subs', rls', f, (f', asm))) (is, ctxt) (pt, (p, _)) =
   287   | add (Tactic.Rewrite_Set_Inst' (_, _, subs', rls', f, (f', asm))) (is, ctxt) (pt, (p, _)) =
   288     let
   288     let
   289       val (pt, c) = Ctree.cappend_atomic pt p (is, ctxt) f 
   289       val (pt, c) = Ctree.cappend_atomic pt p (is, ctxt) f 
   290         (Tactic.Rewrite_Set_Inst (Subst.T_to_input subs', Rule_Set.id rls')) (f', asm) Ctree.Complete
   290         (Tactic.Rewrite_Set_Inst (Subst.T_to_input subs', Rule_Set.id rls')) (f', asm) Ctree.Complete
   291       val pt = Ctree.update_branch pt p Ctree.TransitiveB
   291       val pt = Ctree.update_branch pt p Ctree.TransitiveB
   292     in
   292     in
   293       ((p, Pos.Res), c, Generate.FormKF (UnparseC.term f'), pt)
   293       ((p, Pos.Res), c, Test_Out.FormKF (UnparseC.term f'), pt)
   294     end
   294     end
   295   | add (Tactic.Rewrite_Set' (_, _, rls', f, (f', asm))) (is, ctxt) (pt, (p, _)) =
   295   | add (Tactic.Rewrite_Set' (_, _, rls', f, (f', asm))) (is, ctxt) (pt, (p, _)) =
   296     let
   296     let
   297       val (pt, c) = Ctree.cappend_atomic pt p (is, ctxt) f 
   297       val (pt, c) = Ctree.cappend_atomic pt p (is, ctxt) f 
   298         (Tactic.Rewrite_Set (Rule_Set.id rls')) (f', asm) Ctree.Complete
   298         (Tactic.Rewrite_Set (Rule_Set.id rls')) (f', asm) Ctree.Complete
   299       val pt = Ctree.update_branch pt p Ctree.TransitiveB
   299       val pt = Ctree.update_branch pt p Ctree.TransitiveB
   300     in
   300     in
   301       ((p, Pos.Res), c, Generate.FormKF (UnparseC.term f'), pt)
   301       ((p, Pos.Res), c, Test_Out.FormKF (UnparseC.term f'), pt)
   302     end
   302     end
   303   | add (Tactic.Check_Postcond' (_, scval)) l (pt, (p, _)) =
   303   | add (Tactic.Check_Postcond' (_, scval)) l (pt, (p, _)) =
   304       let
   304       let
   305         val (pt, c) = Ctree.append_result pt p l (scval, []) Ctree.Complete
   305         val (pt, c) = Ctree.append_result pt p l (scval, []) Ctree.Complete
   306       in
   306       in
   307         ((p, Pos.Res), c, Generate.FormKF (UnparseC.term scval), pt)
   307         ((p, Pos.Res), c, Test_Out.FormKF (UnparseC.term scval), pt)
   308       end
   308       end
   309   | add (Tactic.Calculate' (_, op_, f, (f', _))) l (pt, (p, _)) =
   309   | add (Tactic.Calculate' (_, op_, f, (f', _))) l (pt, (p, _)) =
   310       let
   310       let
   311         val (pt,c) = Ctree.cappend_atomic pt p l f (Tactic.Calculate op_) (f', []) Ctree.Complete
   311         val (pt,c) = Ctree.cappend_atomic pt p l f (Tactic.Calculate op_) (f', []) Ctree.Complete
   312       in
   312       in
   313         ((p, Pos.Res), c, Generate.FormKF (UnparseC.term f'), pt)
   313         ((p, Pos.Res), c, Test_Out.FormKF (UnparseC.term f'), pt)
   314       end
   314       end
   315   | add (Tactic.Check_elementwise' (consts, pred, (f', asm))) l (pt, (p, _)) =
   315   | add (Tactic.Check_elementwise' (consts, pred, (f', asm))) l (pt, (p, _)) =
   316       let
   316       let
   317         val (pt,c) = Ctree.cappend_atomic pt p l consts (Tactic.Check_elementwise pred) (f', asm) Ctree.Complete
   317         val (pt,c) = Ctree.cappend_atomic pt p l consts (Tactic.Check_elementwise pred) (f', asm) Ctree.Complete
   318       in
   318       in
   319         ((p, Pos.Res), c, Generate.FormKF (UnparseC.term f'), pt)
   319         ((p, Pos.Res), c, Test_Out.FormKF (UnparseC.term f'), pt)
   320       end
   320       end
   321   | add (Tactic.Or_to_List' (ors, list)) l (pt, (p, _)) =
   321   | add (Tactic.Or_to_List' (ors, list)) l (pt, (p, _)) =
   322       let
   322       let
   323         val (pt,c) = Ctree.cappend_atomic pt p l ors Tactic.Or_to_List (list, []) Ctree.Complete
   323         val (pt,c) = Ctree.cappend_atomic pt p l ors Tactic.Or_to_List (list, []) Ctree.Complete
   324       in
   324       in
   325         ((p, Pos.Res), c, Generate.FormKF (UnparseC.term list), pt)
   325         ((p, Pos.Res), c, Test_Out.FormKF (UnparseC.term list), pt)
   326       end
   326       end
   327   | add (Tactic.Substitute' (_, _, subte, t, t')) l (pt, (p, _)) =
   327   | add (Tactic.Substitute' (_, _, subte, t, t')) l (pt, (p, _)) =
   328       let
   328       let
   329         val (pt,c) =
   329         val (pt,c) =
   330           Ctree.cappend_atomic pt p l t (Tactic.Substitute (Subst.eqs_to_input subte)) (t',[]) Ctree.Complete
   330           Ctree.cappend_atomic pt p l t (Tactic.Substitute (Subst.eqs_to_input subte)) (t',[]) Ctree.Complete
   331         in ((p, Pos.Res), c, Generate.FormKF (UnparseC.term t'), pt) 
   331         in ((p, Pos.Res), c, Test_Out.FormKF (UnparseC.term t'), pt) 
   332         end
   332         end
   333   | add (Tactic.Tac_ (_, f, id, f')) l (pt, (p, _)) =
   333   | add (Tactic.Tac_ (_, f, id, f')) l (pt, (p, _)) =
   334       let
   334       let
   335         val (pt, c) = Ctree.cappend_atomic pt p l (TermC.str2term f) (Tactic.Tac id) (TermC.str2term f', []) Ctree.Complete
   335         val (pt, c) = Ctree.cappend_atomic pt p l (TermC.str2term f) (Tactic.Tac id) (TermC.str2term f', []) Ctree.Complete
   336       in
   336       in
   337         ((p,Pos.Res), c, Generate.FormKF f', pt)
   337         ((p,Pos.Res), c, Test_Out.FormKF f', pt)
   338       end
   338       end
   339   | add (Tactic.Subproblem' ((domID, pblID, metID), oris, hdl, fmz_, ctxt_specify, f))
   339   | add (Tactic.Subproblem' ((domID, pblID, metID), oris, hdl, fmz_, ctxt_specify, f))
   340       (l as (_, ctxt)) (pt, (p, _)) =
   340       (l as (_, ctxt)) (pt, (p, _)) =
   341       let
   341       let
   342   	    val (pt, c) = Ctree.cappend_problem pt p l (fmz_, (domID, pblID, metID))
   342   	    val (pt, c) = Ctree.cappend_problem pt p l (fmz_, (domID, pblID, metID))
   343   	      (oris, (domID, pblID, metID), hdl, ctxt_specify)
   343   	      (oris, (domID, pblID, metID), hdl, ctxt_specify)
   344   	    val f = Syntax.string_of_term (ThyC.to_ctxt (Proof_Context.theory_of ctxt)) f
   344   	    val f = Syntax.string_of_term (ThyC.to_ctxt (Proof_Context.theory_of ctxt)) f
   345       in
   345       in
   346         ((p, Pos.Pbl), c, Generate.FormKF f, pt)
   346         ((p, Pos.Pbl), c, Test_Out.FormKF f, pt)
   347       end
   347       end
   348   | add m' _ (_, pos) =
   348   | add m' _ (_, pos) =
   349       raise ERROR ("Solve_Step.add: not impl.for " ^ Tactic.string_of m' ^ " at " ^ Pos.pos'2str pos)
   349       raise ERROR ("Solve_Step.add: not impl.for " ^ Tactic.string_of m' ^ " at " ^ Pos.pos'2str pos)
   350 
   350 
   351 (* LI switches between solve-phase and specify-phase *)
   351 (* LI switches between solve-phase and specify-phase *)