module Auto where import Core_datatype import Edlib import Lookup import Tree import X_interface import Vtslib import Tactics import Parse import Type_defs import Goals import Globals -- partain import Tags -- partain import Kernel auto_tac = Tactic "Auto" null_arg_fn auto --split_tac = OrdTactic ("Split",null_arg_fn,split) auto _ sg lt _ (TrmSpec tm) = auto_tm sg lt tm auto _ sg lt _ (ThmSpec _) = Bad "Not Applicable" auto _ sg lt _ (DecSpec dc) = auto_dc sg lt dc auto _ sg1 lt _ (SgnSpec sg2) = auto_sg sg1 lt sg2 auto_tm sg lt tm = Ok ([], tm_valid (trm_to_Trm sg tm)) auto_dc sg lt dc = Ok ([], dc_valid (dec_to_Dec sg dc)) auto_sg sg0 lt sg = Ok ([], sg_valid (sgn_to_Sgn sg)) tm_valid tm [] = SOME (TrmDone tm) tm_valid _ _ = NONE dc_valid dc [] = SOME (DecDone dc) dc_valid _ _ = NONE sg_valid sg [] = SOME (SgnDone sg) sg_valid _ _ = NONE {- split _ Sg lt _ (TrmSpec tm) = split_tm Sg lt tm split _ Sg lt _ (DecSpec dc) = split_dc Sg lt dc split _ Sg lt _ (SgnSpec sg) = split_sg Sg lt sg split _ Sg lt _ (ThmSpec _) = Bad "Not Applicable" split_tm Sg lt tm@(Sym _ _ _ _) = ([], [], [], lift_null_update Sg lt (tm_valid (trm_to_Trm Sg tm))) split_tm Sg lt tm@(Constant _ _ _) = ([], [], [], lift_null_update Sg lt (tm_valid (trm_to_Trm Sg tm))) split_tm Sg lt tm@(Const _ _ _ _ _) = ([], [], [], lift_null_update Sg lt (tm_valid (trm_to_Trm Sg tm))) split_tm Sg lt tm@(App tm1 tm2 _ _) = ([TrmSpec tm1,TrmSpec tm2],[lt,lt],[True,True], lift_null_update Sg lt app_valid) split_tm Sg lt tm@(Pair tm1 tm2 tm3 _ _) = ([TrmSpec tm1,TrmSpec tm2,TrmSpec tm3],[lt,lt,lt],[True,True,True], lift_null_update Sg lt pair_valid) split_tm Sg lt tm@(Binder q dc tm1 _ _) = ([DecSpec dc,TrmSpec tm1],[error "no lt"], [True,False], binder_valid (binder_fn q) Sg) split_tm Sg lt tm@(Cond dc tm1 tm2 _ _) = ([DecSpec dc,TrmSpec tm1,TrmSpec tm2],[error "no lt"], [True,False,False], cond_valid Sg) split_tm Sg lt tm@(Unary u tm1 _ _) = ([TrmSpec tm1],[lt],[true], lift_null_update Sg lt (unary_valid (unary_fn u))) | split_tm Sg lt (tm as Binary (b,tm1,tm2,_,_)) = ([TrmSpec tm1,TrmSpec tm2],[lt,lt],[true,true], lift_null_update Sg lt (binary_valid (binary_fn b))) | split_tm Sg lt (tm as Recurse (tmL,ty,_,_)) = let val tmL1 = tmL @ [ty] in (map TrmSpec tmL1, map (fn x => lt) tmL1, map (fn x => true) tmL1, lift_null_update Sg lt recurse_valid) end and split_dc Sg lt (dc as Symbol_dec (tm,_)) = ([TrmSpec tm],[lt],[true], lift_null_update Sg lt (symbol_dec_valid symbol_dec)) | split_dc Sg lt (dc as Axiom_dec (tm,_)) = ([TrmSpec tm],[lt],[true], lift_null_update Sg lt (symbol_dec_valid axiom_dec)) | split_dc Sg lt (dc as Def (tm,_,_)) = ([TrmSpec tm],[lt],[true], lift_null_update Sg lt (symbol_dec_valid def)) | split_dc Sg lt (dc as Decpair (dc1,dc2,_)) = ([DecSpec dc1, DecSpec dc2],[lt,extend_lookup_table true dc1 lt], [true,false], decpair_valid Sg) | split_dc Sg lt (dc as Data (dcL, tmLL,_)) = fail "Can't split datatypes yet!" and split_sg Sg lt (Empty _) = ( [], [],[], lift_null_update Sg lt (empty_valid) ) | split_sg Sg lt (Extend (dc,sg,_)) = ([SgnSpec sg, DecSpec dc],[lt,extend_lookup_table true dc lt], [true,false], extend_valid Sg) | split_sg Sg lt (Combine _) = fail "Can't split combine yet!" | split_sg Sg lt (Share _) = fail "Can't split combine yet!" and empty_valid [] = SOME (SgnDone empty) and extend_valid Sg dnL rwL = case (dnL, rwL) of ([SOME (SgnDone Sg), SOME (DecDone dc)],_) => (rwL,[Sg,Sg],SOME (SgnDone (extend dc Sg))) | ([SOME (SgnDone Sg), NONE], [true,false]) => ([true,true],[Sg,Sg],NONE) | _ => (rwL,[Sg,Sg],NONE) and symbol_dec_valid f [SOME (TrmDone tm)] = SOME (DecDone (f tm)) and decpair_valid Sg dnL rwL = case (dnL, rwL) of ([SOME (DecDone dc1), SOME (DecDone dc2)],_) => (rwL,[Sg,extend dc1 Sg],SOME (DecDone (decpair dc2))) | ([SOME (DecDone dc1), NONE], [true,false]) => ([true,true],[Sg,extend dc1 Sg],NONE) | _ => (rwL,[Sg,Sg],NONE) and app_valid [SOME (TrmDone tm1), SOME (TrmDone tm2)] = SOME (TrmDone (appl tm1 tm2)) and pair_valid [SOME (TrmDone tm1),SOME (TrmDone tm2),SOME (TrmDone tm3)] = SOME (TrmDone (pair tm1 tm2 tm3)) and binder_valid binder Sg dnL rwL = case (dnL, rwL) of ([SOME (DecDone dc), SOME (TrmDone tm)],_) => (rwL,[Sg,extend dc Sg],SOME (TrmDone (binder tm))) | ([SOME (DecDone dc), NONE], [true,false]) => ([true,true],[Sg,extend dc Sg],NONE) | _ => (rwL,[Sg,Sg],NONE) and cond_valid Sg dnL rwL = case (dnL, rwL) of ([SOME (DecDone dc), SOME (TrmDone tm1), SOME (TrmDone tm2)],_) => (rwL, [Sg,extend dc Sg], SOME (TrmDone (conditional tm1 tm2))) | ([SOME (DecDone dc), NONE,NONE],[true,false,false]) => ([true,true,true],[Sg,extend dc Sg,extend dc Sg],NONE) | _ => (rwL,[Sg,Sg,Sg],NONE) and unary_valid unary [SOME (TrmDone tm1)] = SOME (TrmDone (unary tm1)) and binary_valid binary [SOME (TrmDone tm1), SOME (TrmDone tm2)] = SOME (TrmDone (binary tm1 tm2)) and recurse_valid tmL = if forall (fn SOME _ => true | NONE => false) tmL then let val (rec_tmL, rec_ty) = split_list tmL in SOME (TrmDone (recurse rec_tmL rec_ty)) end else NONE and split_list [SOME (TrmDone tm)] = ([],tm) | split_list (SOME (TrmDone x)::l) = let val (l1,l2) = split_list l in (x::l1,l2) end and lift_null_update Sg lt vf dnL rwL = let val dn = vf dnL in (rwL,for (length rwL) (rep Sg) [], dn) end and rep Sg l = Sg :: l and binder_fn Forall = universal | binder_fn Exists = existential | binder_fn Lambda = lambda | binder_fn Imp = implication | binder_fn Subtype = subtype | binder_fn Pi = pi | binder_fn Sigma = sigma and unary_fn Not = negation and binary_fn And = conjunction | binary_fn Or = disjunction | binary_fn Issubtype = issubtype | binary_fn Eq' = equal in end end end -}