module Goals where
import Unparse
import X_interface
import Edlib
import Core_datatype
import Vtslib
import Tree
import Globals
import Lookup -- stub
import Parse
import Kernel
import Sub_Core1
import Sub_Core2
import Sub_Core3
import Sub_Core4
import Type_defs
import Tags
{-
(******************************************************************************)
(* A goal consists of: a tactic name, a list of arguments, a comment, a *)
(* unique identifier and a specification. *)
(******************************************************************************)
-}
data GOAL = Goal ( Option String )
( Option [String] ) -- arguments if any
( Option String ) -- comment if any
String -- unique identifier
Obj -- spec (goal)
Bool -- read only?
Sgn -- its signature
Lookup_table -- its lookup table
data Obj = TrmSpec ITrm |
ThmSpec ITrm |
SgnSpec ISgn |
DecSpec IDec
data Done = TrmDone Trm |
ThmDone Thm |
SgnDone Sgn |
DecDone Dec
show_option :: (String -> a) -> (b -> String) -> (Option b) -> a
show_option xfn gfn NONE = xfn "None"
show_option xfn gfn (SOME x) = xfn (gfn x)
summary_depth :: Int
summary_depth = 4
is_done :: (Option a) -> String
is_done NONE = ""
is_done (SOME _) = "Done"
short :: Int -> String -> String
short = short' -- Check that they are the same
short' :: Int -> String -> String
short' _ [] = []
short' 0 _ = "..."
short' i ('\n' : l) = ' ' : remove_spaces (i-1) l
short' i (c : l) = c : short' (i-1) l
remove_spaces :: Int -> String -> String
remove_spaces i ( ' ' : l) = remove_spaces i l
remove_spaces i ( '\n' : l) = remove_spaces i l
remove_spaces i l = short' i l
depth_print_tm i l sg tm = short 50 (unparse_trm sg l tm)
depth_print_sg i l sg isg = short 50 (unparse_sgn sg l isg)
depth_print_dc i l sg dc = short 50 (unparse_dec sg l dc)
{-
show_parent gst []
= x_unset_parent
show_parent gst ((_,t):_)
= x_set_parent done summary
where
(done,summary) = show_summary (get_attributes gst) t
-}
show_summary attL (Tree (Goal _ _ _ _ (TrmSpec tm) _ sg _) _ dn _ _)
= (is_done dn, depth_print_tm summary_depth attL sg tm)
show_summary attL (Tree (Goal _ _ _ _ (ThmSpec tm) _ sg _) _ dn _ _)
= (is_done dn, depth_print_tm summary_depth attL sg tm)
show_summary attL (Tree (Goal _ _ _ _ (SgnSpec isg) _ sg _) _ dn _ _)
= (is_done dn, depth_print_sg summary_depth attL sg isg)
show_summary attL (Tree (Goal _ _ _ _ (DecSpec dc) _ sg _) _ dn _ _)
= (is_done dn, depth_print_dc summary_depth attL sg dc)
show_goal :: Global_state -> (TREE GOAL b c) -> Xio_fn
show_goal gst t@(Tree (Goal tac args com uid obj rw _ lt) _ _ _ _)
= show_node uid obj ...
show_option x_set_tactic id tac ...
show_option x_set_argument head args ...
show_option x_set_comment (short 50) com ...
x_set_rw (if rw then "Editable" else "Read Only") ...
x_set_goal done summary
where
(done,summary) = show_summary (get_attributes gst) t
-- (done,summary) = show_summary [] t
show_node uid (TrmSpec tm)
= x_set_node ("Trm Node: " ++ uid)
show_node uid (ThmSpec tm)
= x_set_node ("Thm Node: " ++ uid)
show_node uid (DecSpec dc)
= x_set_node ("Dec Node: " ++ uid)
show_node uid (SgnSpec sg)
= x_set_node ("Sgn Node: " ++ uid)
show_subgoals gst goalL
= x_set_subgoals (map (show_summary (get_attributes gst)) goalL)
show_done NONE = x_set_done "Incomplete"
show_done (SOME _) = x_set_done "Complete"
{- old initialize
initialize (TreeSt t@(Tree goal goalL dn _ _ ) spine gst )
= show_parent gst spine ...
show_done dn ...
show_goal gst t ...
show_subgoals gst goalL
-}
initialize dset thy styp spec NONE
= get_tree dset thy styp spec NONE /./
exp
where
exp ( SOME (tr@(TreeSt t@(Tree goal goalL dn _ _) spine gst)))
= show_goal gst t ...
show_subgoals gst goalL ./.
reTurn tr
exp NONE
= end_x ./.
return_err "no state"
get_tree :: (Option String) -> (Option String) -> (Option String) ->
(Option String) -> (Option String) -> Xin ->
Xst ( MayBe (Option (Tree_state GOAL b Global_state )) String )
get_tree dset thy styp spec errmesg
= x_form True (input_form dset thy styp spec errmesg) /./
exp
where
exp NONE = reTurn NONE
exp ( SOME [OutText ds, OutText ty, OutText sp, OutRadio st] )
= parse_fn /.>/
genuid /./
exp2
where
parse_fn = case st of
"Thm" -> mkspec ThmSpec parse_trm sp
"Trm" -> mkspec TrmSpec parse_trm sp
-- "Dec" -> mkspec DecSpec parse_dec sp
-- "Sgn" -> mkspec SgnSpec parse_sgn sp
-- _ -> return_err "Bad Type"
mkspec ctr p_fn sp
= case p_fn sg ps sp of
Ok res -> reTurn ( ctr res )
Bad mesg -> return_err mesg
where
ps = default_tag_tbl
exp2 ( obj , uid )
= reTurn ( SOME tst )
where
tst = TreeSt tr [] gst
tr = Tree gl [] NONE ( \ x y -> y ) NONE
gl = Goal NONE NONE NONE uid obj True sg lt
lt = [] --create_lookup_table isg
at = [] --defaults
gst = ( 0 , [] , default_tag_tbl )
exp _ = error "unimplemented in get_tree"
sg = empty --erestore_Sgn (ds,ty)
isg = internal_Sgn sg
{-
handle
Syntax (e,inp) =>
let val err = unerr e
val where = under_line_input inp
in get_tree (SOME ds) (SOME ty) (SOME st) (SOME sp)
(SOME (err ^ "\n" ^ where)) xio
end
| Expect (t1,t2,inp) =>
let val err = eexperr t1 t2
val where = under_line_input inp
in get_tree (SOME ds) (SOME ty) (SOME st) (SOME sp)
(SOME (err ^ "\n" ^ where)) xio
end
| Fail s =>
let val err = "Error: "^ s
in get_tree (SOME ds) (SOME ty) (SOME st) (SOME sp)
(SOME err) xio
end
| _ =>
let val err = "Error in specification"
in get_tree (SOME ds) (SOME ty) (SOME st) (SOME sp)
(SOME err) xio
end
)
-}
input_form dset thy styp spec errmesg
= [ InComment "XVTSEDIT VERSION 1.1",
InSingleText "Dataset" ( case dset of
SOME ds -> ds
_ -> default_ds ),
InSingleText "Theory " ( case thy of
SOME ty -> ty
_ -> default_ty ),
InMultiText "Spec " ( case spec of
SOME sp -> sp
_ -> "" ),
InRadio "Type "
( case styp of
SOME st -> my_index st types
_ -> 0 )
types ] ++
(case errmesg of
SOME err -> [ InComment err ]
NONE -> [] )
types = ["Thm","Trm","Sgn","Dec"]
my_index :: Eq b => b -> [b] -> Int
my_index s (s' : l) = if s == s' then 0 else 1 + my_index s l
my_index s [] = 0
default_ty = "empty"
default_ds = "default_ds not passed in yet"
{-
(******************************************************************************)
(* When sorted out equalities, should check differences and only update *)
(* those fields which differ *)
(******************************************************************************)
-}
update_state (TreeSt ( Tree goal1 goalL1 dn1 _ _ ) spine1 gst1 )
(TreeSt t@( Tree goal2 goalL2 dn2 _ _ ) spine2 gst2 )
= ((show_goal gst2 t) ...
(show_subgoals gst2 goalL2))
my_quit current
= x_form True form /./ exp
where
exp NONE = reTurn False
exp ( SOME _ ) = reTurn True
form = [InComment "\n\nSelect ok to Quit\n\n"]
finish = end_x ./. reTurn (error "Finish state evaluated")
|