module Tactics where import Core_datatype import X_interface import Vtslib import Globals import Lookup import Kernel import Edlib import Goals import Tags -- partain import Tree import Type_defs data TACTIC = Tactic String ( Global_state -> Lookup_table -> Obj -> Xin -> Xst ( MayBe ( Option [String] ) String ) ) ( Global_state -> Sgn -> Lookup_table -> Option [String] -> Obj -> MayBe ([Obj] , ( [Option Done] -> Option Done )) String ) data Ordered_tactic = OrdTactic String ( Global_state -> Lookup_table -> Obj -> Xin -> Xst ( MayBe ( Option [String] ) String ) ) ( Global_state -> Sgn -> Lookup_table -> Option [String] -> Obj -> MayBe ( [Obj] , [Lookup_table] , [Bool] , ([Option Done] -> [Bool] -> ( [Bool] , [Sgn] , Option Done ))) String ) lift_tactic (Tactic name arg_fn subgoal_fn) = ( name , lift ) where lift (TreeSt t@(Tree g [] dn vf u) spine gst ) = arg_fn gst lt obj /./ exp where (Goal NONE NONE com uid obj rw sg lt) = g exp args = return_val ( subgoal_fn gst sg lt args obj ) /./ exp' where exp' ( subgoals , valid_fn ) = make_goal1 sg lt subgoals [] /./ exp'' where exp'' subtrees = reTurn ( TreeSt (vf' gst t1) spine gst ) where vf' = lift_tactic_valid valid_fn g1 =Goal (SOME name) args com uid obj rw sg lt t1 = Tree g1 subtrees NONE vf' (SOME t) lift _ = return_err "cannot apply tactic" lift_ordtactic (OrdTactic name arg_fn subgoal_fn) = ( name , lift ) where lift (TreeSt t@(Tree g [] dn vf u) spine gst ) = arg_fn gst lt obj /./ exp where (Goal NONE NONE com uid obj rw sg lt) = g exp args = return_val ( subgoal_fn gst sg lt args obj ) /./ exp' where exp' ( subgoals , ltL , rwL , valid_fn ) = make_goal2 sg (zip ltL (zip rwL subgoals)) [] /./ exp'' where exp'' subtrees = reTurn ( TreeSt (vf' gst t1) spine gst ) where vf' = lift_ordtactic_valid valid_fn g1 =Goal (SOME name) args com uid obj rw sg lt t1 = Tree g1 subtrees NONE vf' (SOME t) lift _ = return_err "cannot apply tactic" lift_tactic_valid vf gst t@(Tree g tl NONE vf' u) = Tree g tl dn vf' u -- `handle` -- _ -> t where dnL = map get_done tl dn = vf dnL lift_tactic_valid _ _ t = t lift_ordtactic_valid vf gst t @(Tree g tl NONE vf' u) = Tree g tl' dn vf' u -- handle _ => t where dnL = map get_done tl bL = map get_rw tl (bL',sgL,dn) = vf dnL bL tl' = map set_info (zip tl (zip bL' sgL)) lift_ordtactic_valid _ _ t = t make_goal1 sg lt ( obj : objL ) glL = make_goal1' sg lt obj /./ ( \ gl -> make_goal1 sg lt objL ( glL <: gl )) make_goal1 _ _ [] glL = reTurn glL make_goal1' sg lt obj = genuid /./ ( \ uid -> reTurn ( Tree (Goal NONE NONE NONE uid obj True sg lt) [] NONE id' NONE )) make_goal2 sg ((lt, (rw, obj)) : pL ) glL = make_goal2' sg lt rw obj /./ ( \ gl -> make_goal2 sg pL ( glL <: gl )) make_goal2 _ [] glL = reTurn glL make_goal2' sg lt rw obj = genuid /./ ( \ uid -> reTurn ( Tree (Goal NONE NONE NONE uid obj rw sg lt) [] NONE id' NONE )) get_done (Tree _ _ dn _ _) = dn get_rw (Tree (Goal _ _ _ _ _ rw _ _) _ _ _ _) = rw set_info (Tree (Goal cmd arg com uid obj _ _ lt) tl dn vf u , (rw,sg)) = Tree (Goal cmd arg com uid obj rw sg lt) tl dn vf u id' x y = y null_arg_fn gst lt spc = reTurn NONE