src/Tools/isac/Specify/step-specify.sml
changeset 59846 7184a26ac7d5
parent 59819 74ad911c10b9
child 59854 c20d08e01ad2
equal deleted inserted replaced
59845:273ffde50058 59846:7184a26ac7d5
    41         NONE => (pbl, [])
    41         NONE => (pbl, [])
    42   		| _ => complete_mod_ (oris, mpc, ppc, probl)
    42   		| _ => complete_mod_ (oris, mpc, ppc, probl)
    43       (*----------------------------------------------------------------*)
    43       (*----------------------------------------------------------------*)
    44       val tac_ = Tactic.Model_Problem' (pI, pbl, met)
    44       val tac_ = Tactic.Model_Problem' (pI, pbl, met)
    45       val (pos,c,_,pt) = Generate.generate1 tac_ (Istate_Def.Uistate, ctxt) (pt, pos)
    45       val (pos,c,_,pt) = Generate.generate1 tac_ (Istate_Def.Uistate, ctxt) (pt, pos)
    46     in ([(tac, tac_, (pos, (Istate_Def.Uistate, ContextC.e_ctxt)))], c, (pt,pos)) end
    46     in ([(tac, tac_, (pos, (Istate_Def.Uistate, ContextC.empty)))], c, (pt,pos)) end
    47   | by_tactic_input (Tactic.Add_Given ct) ptp = nxt_specif_additem "#Given" ct ptp
    47   | by_tactic_input (Tactic.Add_Given ct) ptp = nxt_specif_additem "#Given" ct ptp
    48   | by_tactic_input (Tactic.Add_Find  ct) ptp = nxt_specif_additem "#Find"  ct ptp
    48   | by_tactic_input (Tactic.Add_Find  ct) ptp = nxt_specif_additem "#Find"  ct ptp
    49   | by_tactic_input (Tactic.Add_Relation ct) ptp = nxt_specif_additem"#Relate" ct ptp
    49   | by_tactic_input (Tactic.Add_Relation ct) ptp = nxt_specif_additem"#Relate" ct ptp
    50     (*. called only if no_met is specified .*)     
    50     (*. called only if no_met is specified .*)     
    51   | by_tactic_input (Tactic.Refine_Tacitly pI) (ptp as (pt, pos as (p, _))) =
    51   | by_tactic_input (Tactic.Refine_Tacitly pI) (ptp as (pt, pos as (p, _))) =
    64             val thy = Celem.assoc_thy dI
    64             val thy = Celem.assoc_thy dI
    65 	          val (pos, c, _, pt) = 
    65 	          val (pos, c, _, pt) = 
    66 		          Generate.generate1 (Tactic.Refine_Tacitly' (pI, pI', dI, mI,(*pbl*)[])) (Istate_Def.Uistate, ctxt) (pt, pos)
    66 		          Generate.generate1 (Tactic.Refine_Tacitly' (pI, pI', dI, mI,(*pbl*)[])) (Istate_Def.Uistate, ctxt) (pt, pos)
    67 	        in
    67 	        in
    68 	          ([(Tactic.Refine_Tacitly pI, Tactic.Refine_Tacitly' (pI,pI',dI,mI,(*pbl*)[]),
    68 	          ([(Tactic.Refine_Tacitly pI, Tactic.Refine_Tacitly' (pI,pI',dI,mI,(*pbl*)[]),
    69 	              (pos, (Istate_Def.Uistate, ContextC.e_ctxt)))], c, (pt,pos)) 
    69 	              (pos, (Istate_Def.Uistate, ContextC.empty)))], c, (pt,pos)) 
    70           end
    70           end
    71 	    | NONE => ([], [], ptp)
    71 	    | NONE => ([], [], ptp)
    72     end
    72     end
    73   | by_tactic_input (Tactic.Refine_Problem pI) (ptp as (pt, pos as (p,_))) =
    73   | by_tactic_input (Tactic.Refine_Problem pI) (ptp as (pt, pos as (p,_))) =
    74     let
    74     let
    82 	      NONE => ([], [], ptp)
    82 	      NONE => ([], [], ptp)
    83 	    | SOME rfd => 
    83 	    | SOME rfd => 
    84 	      let 
    84 	      let 
    85           val (pos,c,_,pt) = Generate.generate1 (Tactic.Refine_Problem' rfd) (Istate_Def.Uistate, ctxt) (pt, pos)
    85           val (pos,c,_,pt) = Generate.generate1 (Tactic.Refine_Problem' rfd) (Istate_Def.Uistate, ctxt) (pt, pos)
    86 	      in
    86 	      in
    87 	        ([(Tactic.Refine_Problem pI, Tactic.Refine_Problem' rfd, (pos, (Istate_Def.Uistate, ContextC.e_ctxt)))], c, (pt,pos))
    87 	        ([(Tactic.Refine_Problem pI, Tactic.Refine_Problem' rfd, (pos, (Istate_Def.Uistate, ContextC.empty)))], c, (pt,pos))
    88         end
    88         end
    89     end
    89     end
    90   | by_tactic_input (Tactic.Specify_Problem pI) (pt, pos as (p,_)) =
    90   | by_tactic_input (Tactic.Specify_Problem pI) (pt, pos as (p,_)) =
    91     let
    91     let
    92       val (oris, dI, dI', pI', probl, ctxt) = case get_obj I pt p of
    92       val (oris, dI, dI', pI', probl, ctxt) = case get_obj I pt p of
   103 	    val (c, pt) =
   103 	    val (c, pt) =
   104 	      case Generate.generate1 (Tactic.Specify_Problem' (pI, pbl)) (Istate_Def.Uistate, ctxt) (pt, pos) of
   104 	      case Generate.generate1 (Tactic.Specify_Problem' (pI, pbl)) (Istate_Def.Uistate, ctxt) (pt, pos) of
   105   	      ((_, Pbl), c, _, pt) => (c, pt)
   105   	      ((_, Pbl), c, _, pt) => (c, pt)
   106   	    | _ => error ""
   106   	    | _ => error ""
   107     in
   107     in
   108       ([(Tactic.Specify_Problem pI, Tactic.Specify_Problem' (pI, pbl), (pos, (Istate_Def.Uistate, ContextC.e_ctxt)))], c, (pt, pos))
   108       ([(Tactic.Specify_Problem pI, Tactic.Specify_Problem' (pI, pbl), (pos, (Istate_Def.Uistate, ContextC.empty)))], c, (pt, pos))
   109     end
   109     end
   110   (* transfers oris (not required in pbl) to met-model for script-env
   110   (* transfers oris (not required in pbl) to met-model for script-env
   111      FIXME.WN.8.03: application of several mIDs to SAME model?       *)
   111      FIXME.WN.8.03: application of several mIDs to SAME model?       *)
   112   | by_tactic_input (Tactic.Specify_Method mID) (pt, pos as (p,_)) = 
   112   | by_tactic_input (Tactic.Specify_Method mID) (pt, pos as (p,_)) = 
   113     let
   113     let
   122       val (_, (itms, _)) = Specify.match_itms_oris thy met (ppc,pre,prls ) oris
   122       val (_, (itms, _)) = Specify.match_itms_oris thy met (ppc,pre,prls ) oris
   123       val itms = Specify.hack_until_review_Specify_2 mID itms
   123       val itms = Specify.hack_until_review_Specify_2 mID itms
   124       val (pos, c, _, pt) = 
   124       val (pos, c, _, pt) = 
   125 	      Generate.generate1 (Tactic.Specify_Method' (mID, oris, itms)) (Istate_Def.Uistate, ctxt) (pt, pos)
   125 	      Generate.generate1 (Tactic.Specify_Method' (mID, oris, itms)) (Istate_Def.Uistate, ctxt) (pt, pos)
   126     in
   126     in
   127       ([(Tactic.Specify_Method mID, Tactic.Specify_Method' (mID, oris, itms), (pos, (Istate_Def.Uistate, ContextC.e_ctxt)))], c, (pt, pos)) 
   127       ([(Tactic.Specify_Method mID, Tactic.Specify_Method' (mID, oris, itms), (pos, (Istate_Def.Uistate, ContextC.empty)))], c, (pt, pos)) 
   128     end    
   128     end    
   129   | by_tactic_input (Tactic.Specify_Theory dI) (pt, pos as (_, Pbl)) =
   129   | by_tactic_input (Tactic.Specify_Theory dI) (pt, pos as (_, Pbl)) =
   130     let
   130     let
   131       val ctxt = get_ctxt pt pos
   131       val ctxt = get_ctxt pt pos
   132 	    val (pos, c, _, pt) = 
   132 	    val (pos, c, _, pt) = 
   140       val ctxt = get_ctxt pt pos
   140       val ctxt = get_ctxt pt pos
   141 	    val (pos, c, _, pt) = Generate.generate1 (Tactic.Specify_Theory' dI) (Istate_Def.Uistate, ctxt) (pt, pos)
   141 	    val (pos, c, _, pt) = Generate.generate1 (Tactic.Specify_Theory' dI) (Istate_Def.Uistate, ctxt) (pt, pos)
   142     in  (*FIXXXME: check if met can still be parsed*)
   142     in  (*FIXXXME: check if met can still be parsed*)
   143 	    ([(Tactic.Specify_Theory dI, Tactic.Specify_Theory' dI, (pos, (Istate_Def.Uistate, ctxt)))], c, (pt, pos))
   143 	    ([(Tactic.Specify_Theory dI, Tactic.Specify_Theory' dI, (pos, (Istate_Def.Uistate, ctxt)))], c, (pt, pos))
   144     end
   144     end
   145   | by_tactic_input m' _ = error ("by_tactic_input: not impl. for " ^ Tactic.tac2str m')
   145   | by_tactic_input m' _ = error ("by_tactic_input: not impl. for " ^ Tactic.input_to_string m')
   146 (* was fun Math_Engine.nxt_specify_ *)
   146 (* was fun Math_Engine.nxt_specify_ *)
   147 
   147 
   148 
   148 
   149 (* was fun Chead.specify *)
   149 (* was fun Chead.specify *)
   150 fun by_tactic (Tactic.Init_Proof' (fmz, spec' as (dI', pI', mI'))) _ = 
   150 fun by_tactic (Tactic.Init_Proof' (fmz, spec' as (dI', pI', mI'))) _ = 
   151     let          (* either """"""""""""""" all empty or complete *)
   151     let          (* either """"""""""""""" all empty or complete *)
   152       val thy = Celem.assoc_thy dI'
   152       val thy = Celem.assoc_thy dI'
   153       val (oris, ctxt) = 
   153       val (oris, ctxt) = 
   154         if dI' = Rule.e_domID orelse pI' = Celem.e_pblID  (*andalso? WN110511*)
   154         if dI' = Rule.e_domID orelse pI' = Celem.e_pblID  (*andalso? WN110511*)
   155         then ([], ContextC.e_ctxt)
   155         then ([], ContextC.empty)
   156   	    else pI' |> #ppc o Specify.get_pbt |> Specify.prep_ori fmz thy
   156   	    else pI' |> #ppc o Specify.get_pbt |> Specify.prep_ori fmz thy
   157         (* these are deprecated                vvvvvvvvvvvvvvvvvvvvvvvvvv*)
   157         (* these are deprecated                vvvvvvvvvvvvvvvvvvvvvvvvvv*)
   158       val (pt, _) = cappend_problem e_ctree [] (Istate_Def.e_istate, ContextC.e_ctxt) (fmz, spec')
   158       val (pt, _) = cappend_problem e_ctree [] (Istate_Def.empty, ContextC.empty) (fmz, spec')
   159   			(oris, (dI',pI',mI'), Rule.e_term, ctxt)
   159   			(oris, (dI',pI',mI'), Rule.e_term, ctxt)
   160       val pt = update_loc' pt [] (SOME (Istate_Def.e_istate, ctxt), NONE)
   160       val pt = update_loc' pt [] (SOME (Istate_Def.empty, ctxt), NONE)
   161     in 
   161     in 
   162       case mI' of
   162       case mI' of
   163   	    ["no_met"] => ("Refine_Tacitly", ([], [], (pt, ([], Pbl))))
   163   	    ["no_met"] => ("Refine_Tacitly", ([], [], (pt, ([], Pbl))))
   164       | _ => ("ok", ([], [], (pt, ([], Pbl))))
   164       | _ => ("ok", ([], [], (pt, ([], Pbl))))
   165     end
   165     end
   190         | _ => error "Step_Solve.by_tactic (Refine_Tacitly': uncovered case get_obj"*)
   190         | _ => error "Step_Solve.by_tactic (Refine_Tacitly': uncovered case get_obj"*)
   191         val {met, thy,...} = Specify.get_pbt pIre
   191         val {met, thy,...} = Specify.get_pbt pIre
   192         val (domID, metID) = (Rule.string_of_thy thy, if length met = 0 then Celem.e_metID else hd met)
   192         val (domID, metID) = (Rule.string_of_thy thy, if length met = 0 then Celem.e_metID else hd met)
   193         val ((p,_), _, _, pt) = 
   193         val ((p,_), _, _, pt) = 
   194 	        Generate.generate1 (Tactic.Refine_Tacitly' (pI, pIre, domID, metID, [(*pbl*)]))
   194 	        Generate.generate1 (Tactic.Refine_Tacitly' (pI, pIre, domID, metID, [(*pbl*)]))
   195             (Istate_Def.Uistate, ContextC.e_ctxt) (pt, pos)
   195             (Istate_Def.Uistate, ContextC.empty) (pt, pos)
   196 (* deprecated^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ *)
   196 (* deprecated^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ *)
   197 (*     val (pbl, pre, _) = ([], [], false)*)
   197 (*     val (pbl, pre, _) = ([], [], false)*)
   198       in 
   198       in 
   199         ("ok", ([], [], (pt,(p, Pbl))))
   199         ("ok", ([], [], (pt,(p, Pbl))))
   200       end
   200       end
   284 	    let 
   284 	    let 
   285         val {cas, met, ppc, thy, ...} = Specify.get_pbt pI
   285         val {cas, met, ppc, thy, ...} = Specify.get_pbt pI
   286 	      val dI = if dI = "" then Rule.theory2theory' thy else dI
   286 	      val dI = if dI = "" then Rule.theory2theory' thy else dI
   287 	      val mI = if mI = [] then hd met else mI
   287 	      val mI = if mI = [] then hd met else mI
   288 	      val hdl = case cas of NONE => Auto_Prog.pblterm dI pI | SOME t => t
   288 	      val hdl = case cas of NONE => Auto_Prog.pblterm dI pI | SOME t => t
   289 	      val (pt,_) = cappend_problem e_ctree [] (Istate_Def.Uistate, ContextC.e_ctxt) ([], (dI, pI, mI))
   289 	      val (pt,_) = cappend_problem e_ctree [] (Istate_Def.Uistate, ContextC.empty) ([], (dI, pI, mI))
   290 				  ([], (dI,pI,mI), hdl, ContextC.e_ctxt)
   290 				  ([], (dI,pI,mI), hdl, ContextC.empty)
   291 	      val pt = update_spec pt [] (dI, pI, mI)
   291 	      val pt = update_spec pt [] (dI, pI, mI)
   292 	      val pits = Generate.init_pbl' ppc
   292 	      val pits = Generate.init_pbl' ppc
   293 	      val pt = update_pbl pt [] pits
   293 	      val pt = update_pbl pt [] pits
   294 	    in ((pt, ([] , Pbl)), []) end
   294 	    in ((pt, ([] , Pbl)), []) end
   295     else 
   295     else 
   296       if mI <> [] 
   296       if mI <> [] 
   297       then (* from met-browser *)
   297       then (* from met-browser *)
   298 	      let 
   298 	      let 
   299           val {ppc, ...} = Specify.get_met mI
   299           val {ppc, ...} = Specify.get_met mI
   300 	        val dI = if dI = "" then "Isac_Knowledge" else dI
   300 	        val dI = if dI = "" then "Isac_Knowledge" else dI
   301 	        val (pt, _) = cappend_problem e_ctree [] (Istate_Def.e_istate, ContextC.e_ctxt)
   301 	        val (pt, _) = cappend_problem e_ctree [] (Istate_Def.empty, ContextC.empty)
   302 	          ([], (dI, pI, mI)) ([], (dI, pI, mI), Rule.e_term, ContextC.e_ctxt)
   302 	          ([], (dI, pI, mI)) ([], (dI, pI, mI), Rule.e_term, ContextC.empty)
   303 	        val pt = update_spec pt [] (dI, pI, mI)
   303 	        val pt = update_spec pt [] (dI, pI, mI)
   304 	        val mits = Generate.init_pbl' ppc
   304 	        val mits = Generate.init_pbl' ppc
   305 	        val pt = update_met pt [] mits
   305 	        val pt = update_met pt [] mits
   306 	      in ((pt, ([], Met)), []) end
   306 	      in ((pt, ([], Met)), []) end
   307       else (* new example, pepare for interactive modeling *)
   307       else (* new example, pepare for interactive modeling *)
   308 	      let
   308 	      let
   309 	        val (pt, _) = cappend_problem e_ctree [] (Istate_Def.e_istate, ContextC.e_ctxt) 
   309 	        val (pt, _) = cappend_problem e_ctree [] (Istate_Def.empty, ContextC.empty) 
   310 	          ([], Celem.e_spec) ([], Celem.e_spec, Rule.e_term, ContextC.e_ctxt)
   310 	          ([], Celem.e_spec) ([], Celem.e_spec, Rule.e_term, ContextC.empty)
   311 	      in ((pt, ([], Pbl)), []) end
   311 	      in ((pt, ([], Pbl)), []) end
   312   | nxt_specify_init_calc (fmz, (dI, pI, mI)) = 
   312   | nxt_specify_init_calc (fmz, (dI, pI, mI)) = 
   313     let           (* both """"""""""""""""""""""""" either empty or complete *)
   313     let           (* both """"""""""""""""""""""""" either empty or complete *)
   314 	    val thy = Celem.assoc_thy dI
   314 	    val thy = Celem.assoc_thy dI
   315 	    val (pI, (pors, pctxt), mI) = 
   315 	    val (pI, (pors, pctxt), mI) = 
   325 	    val {cas, ppc, thy = thy', ...} = Specify.get_pbt pI (*take dI from _refined_ pbl*)
   325 	    val {cas, ppc, thy = thy', ...} = Specify.get_pbt pI (*take dI from _refined_ pbl*)
   326 	    val dI = Rule.theory2theory' (Stool.common_subthy (thy, thy'))
   326 	    val dI = Rule.theory2theory' (Stool.common_subthy (thy, thy'))
   327 	    val hdl = case cas of
   327 	    val hdl = case cas of
   328 		    NONE => Auto_Prog.pblterm dI pI
   328 		    NONE => Auto_Prog.pblterm dI pI
   329 		  | SOME t => subst_atomic ((vars_of_pbl_' ppc) ~~~ vals_of_oris pors) t
   329 		  | SOME t => subst_atomic ((vars_of_pbl_' ppc) ~~~ vals_of_oris pors) t
   330       val (pt, _) = cappend_problem e_ctree [] (Istate_Def.e_istate, pctxt)
   330       val (pt, _) = cappend_problem e_ctree [] (Istate_Def.empty, pctxt)
   331         (fmz, (dI, pI, mI)) (pors, (dI, pI, mI), hdl, pctxt)
   331         (fmz, (dI, pI, mI)) (pors, (dI, pI, mI), hdl, pctxt)
   332     in
   332     in
   333       ((pt, ([], Pbl)), fst3 (by_tactic_input Tactic.Model_Problem (pt, ([], Pbl))))
   333       ((pt, ([], Pbl)), fst3 (by_tactic_input Tactic.Model_Problem (pt, ([], Pbl))))
   334     end
   334     end
   335 
   335