src/Tools/isac/Specify/specify-step.sml
changeset 60774 e3fe057158b2
parent 60771 1b072aab8f4e
child 60775 c31ae770d74c
equal deleted inserted replaced
60773:439e23525491 60774:e3fe057158b2
    49         val (ctxt, o_model, pI') = case Ctree.get_obj I pt p of
    49         val (ctxt, o_model, pI') = case Ctree.get_obj I pt p of
    50           Ctree.PblObj {ctxt, origin = (o_model, (_, pI', _), _), ...} => (ctxt, o_model, pI')
    50           Ctree.PblObj {ctxt, origin = (o_model, (_, pI', _), _), ...} => (ctxt, o_model, pI')
    51         | _ => raise ERROR "Specify_Step.check Model_Problem: uncovered case Ctree.get_obj"
    51         | _ => raise ERROR "Specify_Step.check Model_Problem: uncovered case Ctree.get_obj"
    52 	      val {model = model_patt, ...} = Problem.from_store (Ctree.get_ctxt pt pos) pI'
    52 	      val {model = model_patt, ...} = Problem.from_store (Ctree.get_ctxt pt pos) pI'
    53 	      val pbl = I_Model.init_POS ctxt o_model model_patt
    53 	      val pbl = I_Model.init_POS ctxt o_model model_patt
    54       in Applicable.Yes (Tactic.Model_Problem' (pI', I_Model.TEST_to_OLD pbl, [])) end
    54       in Applicable.Yes (Tactic.Model_Problem' (pI', pbl, [])) end
    55   | check (Tactic.Refine_Problem pI) (pt, (p, _)) =
    55   | check (Tactic.Refine_Problem pI) (pt, (p, _)) =
    56       let
    56       let
    57         val (dI, dI', itms, ctxt) = case Ctree.get_obj I pt p of
    57         val (dI, dI', itms, ctxt) = case Ctree.get_obj I pt p of
    58             Ctree.PblObj {origin = (_, (dI, _, _), _), spec = (dI', _, _), probl = itms, ctxt, ...}
    58             Ctree.PblObj {origin = (_, (dI, _, _), _), spec = (dI', _, _), probl = itms, ctxt, ...}
    59               => (dI, dI', itms, ctxt)
    59               => (dI, dI', itms, ctxt)
    61       	val thy = if dI' = ThyC.id_empty then dI else dI';
    61       	val thy = if dI' = ThyC.id_empty then dI else dI';
    62       in
    62       in
    63         case Refine.problem (ThyC.get_theory ctxt thy) pI itms of
    63         case Refine.problem (ThyC.get_theory ctxt thy) pI itms of
    64           NONE => Applicable.No
    64           NONE => Applicable.No
    65             (Tactic.input_to_string ctxt (Tactic.Refine_Problem pI) ^ " not applicable")
    65             (Tactic.input_to_string ctxt (Tactic.Refine_Problem pI) ^ " not applicable")
    66 	      | SOME (rf as (pI', _)) =>
    66 	      | SOME (pI', (i_model, prec)) =>
    67       	   if pI' = pI
    67       	   if pI' = pI
    68       	   then Applicable.No
    68       	   then Applicable.No
    69       	     (Tactic.input_to_string ctxt (Tactic.Refine_Problem pI) ^ " not applicable")
    69       	     (Tactic.input_to_string ctxt (Tactic.Refine_Problem pI) ^ " not applicable")
    70       	   else Applicable.Yes (Tactic.Refine_Problem' rf)
    70       	   else Applicable.Yes (Tactic.Refine_Problem' (pI', (I_Model.OLD_to_POS i_model, prec)))
    71     end
    71     end
    72   | check (Tactic.Refine_Tacitly pI) (pt, (p, _)) =
    72   | check (Tactic.Refine_Tacitly pI) (pt, (p, _)) =
    73      let 
    73      let 
    74        val (oris, ctxt) = case Ctree.get_obj I pt p of
    74        val (oris, ctxt) = case Ctree.get_obj I pt p of
    75          Ctree.PblObj {origin = (oris, _, _), ctxt, ...} => (oris, ctxt)
    75          Ctree.PblObj {origin = (oris, _, _), ctxt, ...} => (oris, ctxt)
    83      end
    83      end
    84   | check (Tactic.Specify_Method mID) (ctree, pos) =
    84   | check (Tactic.Specify_Method mID) (ctree, pos) =
    85       let
    85       let
    86         val (o_model, _, i_model) = complete_for mID (ctree, pos)
    86         val (o_model, _, i_model) = complete_for mID (ctree, pos)
    87       in
    87       in
    88         Applicable.Yes (Tactic.Specify_Method' (mID, o_model, I_Model.TEST_to_OLD i_model))
    88         Applicable.Yes (Tactic.Specify_Method' (mID, o_model, i_model))
    89       end
    89       end
    90   | check (Tactic.Specify_Problem pID) (pt, pos as (p, _)) =
    90   | check (Tactic.Specify_Problem pID) (pt, pos as (p, _)) =
    91       let
    91       let
    92 		    val (oris,  pI,  pI', probl, meth, ctxt) = case Ctree.get_obj I pt p of
    92 		    val (oris,  pI,  pI', probl, meth, ctxt) = case Ctree.get_obj I pt p of
    93 		      Ctree.PblObj {origin = (oris, (_, pI, _), _), spec = (_, pI', _), probl, meth, ctxt, ...}
    93 		      Ctree.PblObj {origin = (oris, (_, pI, _), _), spec = (_, pI', _), probl, meth, ctxt, ...}
    97         val (check, (i_model, preconds)) = if pI' = Problem.id_empty andalso pI = Problem.id_empty
    97         val (check, (i_model, preconds)) = if pI' = Problem.id_empty andalso pI = Problem.id_empty
    98           then (false, (I_Model.OLD_to_POS (I_Model.init model), []))
    98           then (false, (I_Model.OLD_to_POS (I_Model.init model), []))
    99           else M_Match.by_i_models ctxt oris
    99           else M_Match.by_i_models ctxt oris
   100             (I_Model.OLD_to_POS probl, I_Model.OLD_to_POS meth) (model, where_, where_rls)
   100             (I_Model.OLD_to_POS probl, I_Model.OLD_to_POS meth) (model, where_, where_rls)
   101        in
   101        in
   102          Applicable.Yes (Tactic.Specify_Problem' (pID, (check, (I_Model.TEST_to_OLD i_model, preconds))))
   102          Applicable.Yes (Tactic.Specify_Problem' (pID, (check, (i_model, preconds))))
   103        end
   103        end
   104   | check (Tactic.Specify_Theory dI)_ = Applicable.Yes (Tactic.Specify_Theory' dI)
   104   | check (Tactic.Specify_Theory dI)_ = Applicable.Yes (Tactic.Specify_Theory' dI)
   105   | check Tactic.Empty_Tac _ = Applicable.No "Empty_Tac is not applicable"
   105   | check Tactic.Empty_Tac _ = Applicable.No "Empty_Tac is not applicable"
   106   | check tac (ctree, pos) =
   106   | check tac (ctree, pos) =
   107     let
   107     let
   112     end;
   112     end;
   113 
   113 
   114 (* exceed line length, because result type will change *)
   114 (* exceed line length, because result type will change *)
   115 fun add (Tactic.Model_Problem' (_, itms, met)) (_, ctxt) (pt, pos as (p, _)) =
   115 fun add (Tactic.Model_Problem' (_, itms, met)) (_, ctxt) (pt, pos as (p, _)) =
   116       let
   116       let
   117         val pt = Ctree.update_pbl pt p itms
   117         val pt = Ctree.update_pbl pt p (I_Model.TEST_to_OLD itms)
   118   	    val pt = Ctree.update_met pt p met
   118   	    val pt = Ctree.update_met pt p (I_Model.TEST_to_OLD met)
   119       in
   119       in
   120         (pos, [], Test_Out.PpcKF (Test_Out.Upblmet, P_Model.from (Proof_Context.theory_of ctxt) [] []), pt)
   120         (pos, [], Test_Out.PpcKF (Test_Out.Upblmet, P_Model.from (Proof_Context.theory_of ctxt) [] []), pt)
   121       end
   121       end
   122   | add (Tactic.Add_Given' (_, itmlist)) (_, ctxt) (pt, pos as (p, p_)) = 
   122   | add (Tactic.Add_Given' (_, itmlist)) (_, ctxt) (pt, pos as (p, p_)) = 
   123       (pos, [], Test_Out.PpcKF (Test_Out.Upblmet,P_Model.from (Proof_Context.theory_of ctxt) [][]),
   123       (pos, [], Test_Out.PpcKF (Test_Out.Upblmet,P_Model.from (Proof_Context.theory_of ctxt) [][]),
   124          case p_ of
   124          case p_ of
   125            Pos.Pbl => Ctree.update_pbl pt p itmlist
   125            Pos.Pbl => Ctree.update_pbl pt p (I_Model.TEST_to_OLD itmlist)
   126   	     | Pos.Met => Ctree.update_met pt p itmlist
   126   	     | Pos.Met => Ctree.update_met pt p (I_Model.TEST_to_OLD itmlist)
   127          | _ => raise ERROR ("uncovered case " ^ Pos.pos_2str p_))
   127          | _ => raise ERROR ("uncovered case " ^ Pos.pos_2str p_))
   128   | add (Tactic.Add_Find' (_, itmlist)) (_, ctxt) (pt, pos as (p, p_)) = 
   128   | add (Tactic.Add_Find' (_, itmlist)) (_, ctxt) (pt, pos as (p, p_)) = 
   129       (pos, [], (Test_Out.PpcKF (Test_Out.Upblmet, P_Model.from (Proof_Context.theory_of ctxt) [] [])),
   129       (pos, [], (Test_Out.PpcKF (Test_Out.Upblmet, P_Model.from (Proof_Context.theory_of ctxt) [] [])),
   130          case p_ of
   130          case p_ of
   131            Pos.Pbl => Ctree.update_pbl pt p itmlist
   131            Pos.Pbl => Ctree.update_pbl pt p (I_Model.TEST_to_OLD itmlist)
   132   	     | Pos.Met => Ctree.update_met pt p itmlist
   132   	     | Pos.Met => Ctree.update_met pt p (I_Model.TEST_to_OLD itmlist)
   133          | _ => raise ERROR ("uncovered case " ^ Pos.pos_2str p_))
   133          | _ => raise ERROR ("uncovered case " ^ Pos.pos_2str p_))
   134   | add (Tactic.Add_Relation' (_, itmlist)) (_, ctxt) (pt, pos as (p, p_)) = 
   134   | add (Tactic.Add_Relation' (_, itmlist)) (_, ctxt) (pt, pos as (p, p_)) = 
   135       (pos, [],  Test_Out.PpcKF (Test_Out.Upblmet, P_Model.from (Proof_Context.theory_of ctxt) [] []),
   135       (pos, [],  Test_Out.PpcKF (Test_Out.Upblmet, P_Model.from (Proof_Context.theory_of ctxt) [] []),
   136          case p_ of
   136          case p_ of
   137            Pos.Pbl => Ctree.update_pbl pt p itmlist
   137            Pos.Pbl => Ctree.update_pbl pt p (I_Model.TEST_to_OLD itmlist)
   138   	     | Pos.Met => Ctree.update_met pt p itmlist
   138   	     | Pos.Met => Ctree.update_met pt p (I_Model.TEST_to_OLD itmlist)
   139          | _ => raise ERROR ("uncovered case " ^ Pos.pos_2str p_))
   139          | _ => raise ERROR ("uncovered case " ^ Pos.pos_2str p_))
   140   | add (Tactic.Specify_Theory' domID) (_, ctxt) (pt, pos as (p,_)) = 
   140   | add (Tactic.Specify_Theory' domID) (_, ctxt) (pt, pos as (p,_)) = 
   141       (pos, [] , Test_Out.PpcKF  (Test_Out.Upblmet, P_Model.from (Proof_Context.theory_of ctxt) [] []),
   141       (pos, [] , Test_Out.PpcKF  (Test_Out.Upblmet, P_Model.from (Proof_Context.theory_of ctxt) [] []),
   142         Ctree.update_domID pt p domID)
   142         Ctree.update_domID pt p domID)
   143   | add (Tactic.Specify_Problem' (pI, (_, (itms, _)))) (_, ctxt) (pt, (p, _)) =
   143   | add (Tactic.Specify_Problem' (pI, (_, (itms, _)))) (_, ctxt) (pt, (p, _)) =
   144       let
   144       let
   145         val pt = Ctree.update_pbl pt p itms
   145         val pt = Ctree.update_pbl pt p (I_Model.TEST_to_OLD itms)
   146         val pt = Ctree.update_pblID pt p pI
   146         val pt = Ctree.update_pblID pt p pI
   147       in
   147       in
   148         ((p, Pos.Pbl), [], Test_Out.PpcKF (Test_Out.Upblmet, P_Model.from (Proof_Context.theory_of ctxt) [] []), pt)
   148         ((p, Pos.Pbl), [], Test_Out.PpcKF (Test_Out.Upblmet, P_Model.from (Proof_Context.theory_of ctxt) [] []), pt)
   149       end
   149       end
   150   | add (Tactic.Specify_Method' (mID, oris, itms)) (_, ctxt) (pt, (p, _)) =
   150   | add (Tactic.Specify_Method' (mID, oris, itms)) (_, ctxt) (pt, (p, _)) =
   151       let
   151       let
   152         val pt = Ctree.update_oris pt p oris
   152         val pt = Ctree.update_oris pt p oris
   153         val pt = Ctree.update_met pt p itms                            
   153         val pt = Ctree.update_met pt p (I_Model.TEST_to_OLD itms)
   154         val pt = Ctree.update_metID pt p mID
   154         val pt = Ctree.update_metID pt p mID
   155       in
   155       in
   156         ((p, Pos.Met), [], Test_Out.PpcKF (Test_Out.Upblmet, P_Model.from (Proof_Context.theory_of ctxt) [] []), pt)
   156         ((p, Pos.Met), [], Test_Out.PpcKF (Test_Out.Upblmet, P_Model.from (Proof_Context.theory_of ctxt) [] []), pt)
   157       end
   157       end
   158   | add (Tactic.Refine_Tacitly' (_, pIre, domID, metID, pbl)) (_, ctxt) (pt, pos as (p, _)) = 
   158   | add (Tactic.Refine_Tacitly' (_, pIre, domID, metID, pbl)) (_, ctxt) (pt, pos as (p, _)) = 
   159       let
   159       let
   160         val pt = Ctree.update_pbl pt p pbl
   160         val pt = Ctree.update_pbl pt p (I_Model.TEST_to_OLD pbl)
   161         val pt = Ctree.update_orispec pt p (domID, pIre, metID)
   161         val pt = Ctree.update_orispec pt p (domID, pIre, metID)
   162       in
   162       in
   163         (pos, [], Test_Out.PpcKF (Test_Out.Upblmet, P_Model.from (Proof_Context.theory_of ctxt) [] []), pt)
   163         (pos, [], Test_Out.PpcKF (Test_Out.Upblmet, P_Model.from (Proof_Context.theory_of ctxt) [] []), pt)
   164       end
   164       end
   165   | add (Tactic.Refine_Problem' (pI, _)) (_, ctxt) (pt, pos as (p, _)) =
   165   | add (Tactic.Refine_Problem' (pI, _)) (_, ctxt) (pt, pos as (p, _)) =