1{-# LANGUAGE MultiParamTypeClasses, FunctionalDependencies, DeriveFunctor #-}
5import Control.Monad.State
10 * A hierarchy of universes, with cumulativity: Set : Set1, Set1 : Set2, ...
11 * Pattern matching letrec binding
12 * (primitive types defined externally)
15 * Typechecker is kept as simple as possible
16 - no unification, just a checker for incomplete terms.
17 * We have a simple collection of tactics which we use to elaborate source
18 programs with implicit syntax into fully explicit terms.
25-- RAW TERMS ----------------------------------------------------------------
27-- Names are hierarchies of strings, describing scope (so no danger of
28-- duplicate names, but need to be careful on lookup).
29-- Also MN for machine chosen names
31data Name = UN [String]
35instance Show Name where
37 show (UN (n:ns)) = show (UN [n]) ++ "." ++ show (UN ns)
38 show (MN i s) = "{" ++ s ++ show i ++ "}"
41 | RBind Name (Binder Raw) Raw
46data Binder b = Lam { binderTy :: b }
47 | Pi { binderTy :: b }
48 | Let { binderTy :: b,
50 | Hole { binderTy :: b}
51 | Guess { binderTy :: b,
53 | PVar { binderTy :: b }
54 deriving (Show, Eq, Functor)
56data RawFun = RawFun { rtype :: Raw,
61data RDef = RFunction RawFun
65type RProgram = [(Name, RDef)]
67-- WELL TYPED TERMS ---------------------------------------------------------
69data NameType = Ref | DCon Int Int | TCon Int
72data TT n = P NameType n (TT n) -- embed type
74 | Bind n (Binder (TT n)) (TT n)
75 | App (TT n) (TT n) (TT n) -- function, function type, arg
77 deriving (Functor, Eq)
79type EnvTT n = [(n, Binder (TT n))]
81bindEnv :: EnvTT n -> TT n -> TT n
83bindEnv ((n, b):bs) tm = Bind n b (bindEnv bs tm)
90instance Show n => Show (TT n) where
91 show t = se 10 [] t where
92 se p env (P _ n _) = show n
93 se p env (V i) | i < length env = show $ fst $ env!!i
94 | otherwise = "!!V " ++ show i ++ "!!"
95 se p env (Bind n b sc) = bracket p 2 $ sb env n b ++ se 10 ((n,b):env) sc
96 se p env (App f t a) = bracket p 1 $ se 1 env f ++ " " ++ se 0 env a
97 se p env (Set i) = "Set" ++ show i
99 sb env n (Lam t) = showb env "\\ " " => " n t
100 sb env n (Hole t) = showb env "? " ". " n t
101 sb env n (Pi t) = showb env "forall " " -> " n t
102 sb env n (PVar t) = showb env "! " ". " n t
103 sb env n (Let t v) = showbv env "let " " in " n t v
104 sb env n (Guess t v) = showbv env "?? " " in " n t v
106 showb env op sc n t = op ++ show n ++ " : " ++ se 10 env t ++ sc
107 showbv env op sc n t v = op ++ show n ++ " : " ++ se 10 env t ++ " = " ++
110 bracket outer inner str | inner > outer = "(" ++ str ++ ")"
113-- WELL TYPED TERMS AS HOAS -------------------------------------------------
115data HTT = HP NameType Name HTT
117 | HBind Name (Binder HTT) (HTT -> HTT)
122instance Show HTT where
125hoas :: [HTT] -> TT Name -> HTT
126hoas env (P nt n ty) = HP nt n (hoas env ty)
127hoas env (V i) | i < length env = env!!i
129hoas env (Bind n b sc) = HBind n (hbind b) (\x -> hoas (x:env) sc)
130 where hbind (Lam t) = Lam (hoas env t)
131 hbind (Pi t) = Pi (hoas env t)
132 hbind (Hole t) = Hole (hoas env t)
133 hbind (PVar t) = PVar (hoas env t)
134 hbind (Let v t) = Let (hoas env v) (hoas env t)
135 hbind (Guess v t) = Guess (hoas env v) (hoas env t)
136hoas env (App f t a) = HApp (hoas env f) (hoas env t) (hoas env a)
137hoas env (Set i) = HSet i
139-- CONTEXTS -----------------------------------------------------------------
141data Fun = Fun Type HTT Term HTT
144data Def = Function Fun
145 | Constant NameType Type HTT
148type Context = [(Name, Def)]
152lookupTy :: Name -> Context -> Maybe Type
153lookupTy n ctxt = do def <- lookup n ctxt
155 (Function (Fun ty _ _ _)) -> return ty
156 (Constant _ ty _) -> return ty
158lookupP :: Name -> Context -> Maybe Term
160 = do def <- lookup n ctxt
162 (Function (Fun ty _ tm _)) -> return (P Ref n ty)
163 (Constant nt ty hty) -> return (P nt n ty)
165lookupVal :: Name -> Context -> Maybe HTT
167 = do def <- lookup n ctxt
169 (Function (Fun _ _ _ htm)) -> return htm
170 (Constant nt ty hty) -> return (HP nt n hty)
172lookupTyEnv :: Name -> Env -> Maybe (Int, Type)
173lookupTyEnv n env = li n 0 env where
176 | n == x = Just (i, binderTy b)
177 | otherwise = li n (i+1) xs
182testtm = RBind xt (Lam (RSet 0)) (RBind x (Lam (Var xt)) (Var x))
keysesc to close
- j k
- move down, up
- enter
- open
- esc
- back, or up a level
- 1 2 3 4
- readme, files, commits, refs
- /
- filter
- y
- copy the clone command
- c
- compare the chosen commit with another (or shift-click both)
- ?
- show or hide this list