@@ -8,32 +8,14 @@ import Debug.Trace
9import Evaluate
9import Evaluate
11−data TC a = OK a
11+-- To check conversion, normalise each term wrt the current environment.
12− | Error String -- TMP! Make this an informative data structure
12+-- Since we haven't converted everything to de Bruijn indices yet, we'll have to
13− deriving (Eq, Functor)
13+-- deal with alpha conversion - we do this by making each inner term de Bruijn
14−
14+-- indexed with 'finalise'
15−instance Show a => Show (TC a) where
17− show (Error str) = "Error: " ++ str
19−-- at some point, this instance should also carry type checking options
22−instance Monad TC where
29−instance MonadPlus TC where
30− mzero = Error "Unknown error"
31− (OK x) `mplus` _ = OK x
32− _ `mplus` (OK y) = OK y
35converts :: Context -> Env -> Term -> Term -> TC ()
16converts :: Context -> Env -> Term -> Term -> TC ()
36−converts ctxt env x y = if (normalise ctxt env x == normalise ctxt env y)
17+converts ctxt env x y = if (finalise (normalise ctxt env x) ==
18+ finalise (normalise ctxt env y))
37 then return ()
19 then return ()
38 else fail ("Can't convert between " ++
20 else fail ("Can't convert between " ++
39 showEnv env (normalise ctxt env x) ++ " and " ++
21 showEnv env (normalise ctxt env x) ++ " and " ++
@@ -173,14 +155,24 @@ finalise t = t
174checkProgram :: Context -> RProgram -> TC Context
156checkProgram :: Context -> RProgram -> TC Context
175checkProgram ctxt [] = return ctxt
157checkProgram ctxt [] = return ctxt
176−checkProgram ctxt ((n, RConst t):xs)
158+checkProgram ctxt ((n, RConst t) : xs)
177 = do (t', tt') <- trace (show n) $ check ctxt [] t
159 = do (t', tt') <- trace (show n) $ check ctxt [] t
178 isSet ctxt [] tt'
160 isSet ctxt [] tt'
179 checkProgram (addConstant n t' ctxt) xs
161 checkProgram (addConstant n t' ctxt) xs
180−checkProgram ctxt ((n, RFunction (RawFun ty val)):xs)
162+checkProgram ctxt ((n, RFunction (RawFun ty val)) : xs)
181 = do (ty', tyt') <- trace (show n) $ check ctxt [] ty
163 = do (ty', tyt') <- trace (show n) $ check ctxt [] ty
182 (val', valt') <- check ctxt [] val
164 (val', valt') <- check ctxt [] val
183 isSet ctxt [] tyt'
165 isSet ctxt [] tyt'
184 converts ctxt [] ty' valt'
166 converts ctxt [] ty' valt'
185 checkProgram (addToCtxt n val' ty' ctxt) xs
167 checkProgram (addToCtxt n val' ty' ctxt) xs
168+checkProgram ctxt ((n, RData (RDatatype _ ty cons)) : xs)
169+ = do (ty', tyt') <- trace (show n) $ check ctxt [] ty
171+ -- add the tycon temporarily so we can check constructors
172+ let ctxt' = addDatatype (Data n ty' []) ctxt
173+ cons' <- mapM (checkCon ctxt') cons
174+ checkProgram (addDatatype (Data n ty' cons') ctxt) xs
175+ where checkCon ctxt (n, cty) = do (cty', ctyt') <- check ctxt [] cty