{- * Mon Nov 5 09:54:24 GMT 1990 * * Implementation of untyped terms, signatures and declarations * * Each constructors last argument (of the tuple) is a list of * information attributes that the parser, unparsers, tactics etc use. * * Each terms' next to last argument is a list of alternative types the the * term can have to its natutal type. * -} module Sub_Core4 where import Vtslib import Core_datatype import Sub_Core1 import Sub_Core2 import Sub_Core3 get_dec_att (Symbol_dec _ att) = att get_dec_att (Axiom_dec _ att) = att get_dec_att (Def _ _ att) = att get_dec_att (Data _ _ att) = att get_dec_att (Decpair _ _ att) = att set_dec_att (Symbol_dec tm _) att = Symbol_dec tm att set_dec_att (Axiom_dec tm _) att = Axiom_dec tm att set_dec_att (Def tm1 tm2 _) att = Def tm1 tm2 att set_dec_att (Data dcL tl _) att = Data dcL tl att set_dec_att (Decpair dc1 dc2 _) att = Decpair dc1 dc2 att get_sgn_att (Empty att) = att get_sgn_att (Extend _ _ att) = att get_sgn_att (Combine _ _ _ _ att) = att get_sgn_att (Share _ _ _ _ _ att) = att set_sgn_att (Empty _) att = Empty att set_sgn_att (Extend dc sg _) att = Extend dc sg att set_sgn_att (Combine sg1 sg2 l sm _) att = Combine sg1 sg2 l sm att set_sgn_att (Share sg i j k sm _) att = Share sg i j k sm att {- (* given a signature and a datasum return the type of of each *) (* clause in each prong of a corrsponding recurse expression of *) (* which the datasum would be the type *) -} add_type (Sym i j tmL att) ty = Sym i j (ty:tmL) att add_type (App tm1 tm2 tmL att) ty = App tm1 tm2 (ty:tmL) att add_type (Pair tm1 tm2 tm3 tmL att) ty = Pair tm1 tm2 tm3 (ty:tmL) att add_type (Constant c tmL att) ty = Constant c (ty:tmL) att add_type (Binder c tm1 tm2 tmL att) ty = Binder c tm1 tm2 (ty:tmL) att add_type (Unary c tm tmL att) ty = Unary c tm (ty:tmL) att add_type (Binary' c dc tm tmL att) ty = Binary' c dc tm (ty:tmL) att add_type (Cond dc tm1 tm2 tmL att) ty = Cond dc tm1 tm2 (ty:tmL) att add_type (Const i j k tmL att) ty = Const i j k (ty:tmL) att add_type (Recurse tmL tm tyL att) ty = Recurse tmL tm (ty:tyL) att is_sub_sgn sg1 sg2 = sub_sgn 0 sg2 where sub_sgn i sg2 = if eq_sgn sg1 sg2 then SOME i else case sg2 of Empty _ -> NONE Extend _ sg3 _ -> sub_sgn (i+1) sg3 Combine sg3 sg4 k _ _ -> case sub_sgn i sg4 of SOME i -> SOME i NONE -> sub_sgn (i+k) sg3 Share sg3 _ _ _ _ _ -> sub_sgn i sg3 eta_match dc tm i = error "VTS_ERROR" -- ** exn make_rec fntype clause_ty [] = clause_ty make_rec (fntype @ ( Binder Pi dc tm _ _)) clause_ty (ty:tyL) = Binder Pi (Symbol_dec ty2 []) ty1 [] [] where ty1 = make_rec (shift_trm [] 1 fntype) (shift_trm [] 1 clause_ty) tyL ty2 = subst_trm dc tm ty gen_type i (fntype @(Binder Pi dc tm _ _)) rectypeL const [] = make_rec fntype (subst_trm dc tm const) rectypeL gen_type i (fntype @(Binder Pi dc tm _ _)) rectypeL const (ty : tyL) = Binder Pi (Symbol_dec (shift_trm [] i ty) []) ty1 [] [] where const1 = App (shift_trm [] 1 const) (Sym 0 0 [] []) [] [] fntype1 = shift_trm [] 1 fntype rectypeL1 = map (shift_trm [] 1) rectypeL ++ if eq_trm ty (Sym 0 0 [] []) then [Sym i 1 [] []] else [] ty1 = gen_type (i+1) fntype1 rectypeL1 const1 tyL --gen_type _ _ _ _ _ = error "VTS_ERROR" -- ** exn gen_typeL _ _ _ [] _ _ _ = [] gen_typeL tyL tm fntype (tmL : tmLL) i j k = substL (length tyL - 1) (subst_trm dc ty tm) tyL : gen_typeL tyL tm fntype tmLL i j (k+1) where const = foldr make_app (Const i j k [] []) ( reverse tyL ) ty = gen_type 0 fntype [] const tmL dc = Symbol_dec tm [] substL i tm [] = tm substL i tm (tm1:tmL1) = substL (i-1) (subst_trm dc tm (shift_trm [] i tm1)) tmL1 get_datatype_info sg (App tm1 tm2 _ _) = (i,j,tm2:tmL,dcL,tmLLL) where (i,j,tmL,dcL,tmLLL) = get_datatype_info sg tm1 get_datatype_info sg (Const i j k _ _) = case shift_dec (get_share_map sg) i dc of Data dcL tmLLL _ -> (i,j,[],dcL,tmLLL) -- _ -> error "VTS_ERROR" -- ** exn where dc = extract_dc j (nth_dec i sg) --get_datatype_info _ _ = error "VTS_ERROR" -- ** exn no_params :: [ITrm] -> Int no_params ((Sym _ _ _ _) : tmL) = 2 + no_params tmL no_params (_ : tmL) = no_params tmL no_params [] = 0 shift :: Int -> Int -> ITrm -> ITrm shift i j tm = tm3 where bind tm = Binder Pi (Symbol_dec (Sym 0 0 [] []) []) tm [] [] body (Binder _ _ tm _ _) = tm -- body _ = error "System_Error" -- ** exn tm1 = for i bind tm tm2 = shift_trm [] j tm1 tm3 = for i body tm2 clause_types :: ISgn -> ITrm -> ITrm -> ([ITrm], [Int]) clause_types sg dtype fntype = (clauses,params) where (i,j,spec,dcL,tmLL) = get_datatype_info sg dtype fntype1 = shift_trm [] (length dcL + 1) fntype dtype1 = shift_trm [] (length dcL) dtype tmLL1 = map (map (shift (length dcL + 1) j)) tmLL clauses = gen_typeL spec dtype1 fntype1 tmLL1 i j 0 params = map no_params tmLL make_ind tm rectype [] = rectype make_ind tm rectype (ty : tyL) = Binder Imp ty2 ty1 [] [] where ty1 = make_ind tm rectype tyL ty2 = Symbol_dec ( make_app tm ty ) [] ind_type i tm rectypeL const [] = make_ind tm (make_app tm const) rectypeL ind_type i tm rectypeL const (ty : tyL) = Binder Forall (Symbol_dec (shift_trm [] i ty) []) ty1 [] [] where const1 = make_app (shift_trm [] 1 const) (Sym 0 0 [] []) tm1 = shift_trm [] 1 tm rectypeL1 = map (shift_trm [] 1) rectypeL ++ if eq_trm ty (Sym 0 0 [] []) then [ty] else [] ty1 = ind_type (i+1) tm1 rectypeL1 const1 tyL ind_typeL _ _ _ [] _ _ _ = [] ind_typeL rectype sms tm (tyL:tyLL) i j k = (ty2 : ind_typeL rectype sms tm tyLL i j (k+1)) where const = foldr make_app (Const i j k [] []) ( reverse sms ) ty1 = ind_type 0 tm [] const tyL ty2 = subst_trm (Symbol_dec (Const i j 0 [] []) []) ty1 rectype induction_trm sg tm = foldr make_forall tm2 ( reverse (dc : dcL)) where make_imp tm1 tm2 = Binder Imp dc_imp tm2 [] [] make_forall dc tm = Binder Forall dc tm [] [] (i,j,_,dcL,tmLL) = get_datatype_info sg tm tmLL1 = map (map (shift 1 1)) tmLL sms = mk_smsl dcL 0 [] dtype = foldr make_app (shift_trm [] (length dcL) tm) ( reverse sms ) ty = Binder Pi (Symbol_dec dtype []) (Constant Bool' [] []) [] [] dc = Symbol_dec ty [] dtype1 = shift_trm [] 1 dtype sms1 = map (shift_trm [] 2) sms tmL = ind_typeL dtype1 sms1 (Sym 1 0 [] []) tmLL1 (2+i+length dcL) j 1 dc_imp = Symbol_dec tm1 [] tm1 = Binder Forall (Symbol_dec dtype1 []) tm1 [] [] where tm1 = make_app (Sym 1 0 [] []) (Sym 0 0 [] []) tm2 = foldr1 make_imp (tmL ++ [tm1]) equiv :: (Eq b) => b -> [b] -> [Int] equiv i m = equivf 0 m where equivf j [] = [] equivf j (k:m) = (if k==i then [j] else []) ++ equivf (j+1) m union (i:l) m = (if i `elem` m then [] else [i]) ++ union l m union [] m = m update :: b -> [Int] -> [b] -> [b] update i eq m = updatef 0 m where updatef j [] = [] updatef j (k:m) = (if j `elem` eq then [i] else [k]) ++ updatef (j+1) m canonical :: Int -> [b] -> b canonical i m = m !! i addequiv :: (Ord a) => (Int, Int) -> [a] -> [a] addequiv (i,j) m = update (min i' j') eqij m where i' = canonical i m j' = canonical j m eqi = equiv i' m eqj = equiv j' m eqij = union eqi eqj addequivL i j k m = foldr addequiv m (list i j k) where list i' j' 0 = [] list i' j' k' = (i',j') : list (i'+1) (j'+1) (k'-1) split_def (Def tm1 tm2 _) = (Symbol_dec tm2 [],tm1,tm2) split_def (Decpair dc1 dc2 _) = (Decpair dc3 dc4 [] , Pair tm1 tm6 tm5 [] [] , tm5) where (dc3,tm1,tm2) = split_def dc1 (dc4,tm3,tm4) = split_def dc2 tm5 = shift_trm [] 1 (subst_trm dc1 tm4 tm1) tm6 = subst_trm dc1 tm3 tm1 tm7 = Binder Sigma dc3 tm5 [] [] --split_def _ = error "VTS_ERROR" -- ** exn