@@ -22,9 +22,15 @@ instance Monad TC where
2222 Error e -> Error e
2323 fail = Error
2424
25+instance MonadPlus TC where
26+ mzero = Error "Unknown error"
27+ (OK x) `mplus` _ = OK x
28+ _ `mplus` (OK y) = OK y
29+ err `mplus` _ = err
30+
2531converts :: Context -> Env -> Term -> Term -> TC ()
26−converts ctxt env x y = if (normalise ctxt (bindEnv env x) ==
27− normalise ctxt (bindEnv env y))
32+converts ctxt env x y = if (normalise ctxt env (bindEnv env x) ==
33+ normalise ctxt env (bindEnv env y))
2834 then return ()
2935 else fail ("Can't convert between " ++
3036 show x ++ " and " ++ show y)
@@ -41,12 +47,12 @@ check ctxt env (Var n)
4147check ctxt env (RApp f a)
4248 = do (fv, fty) <- check ctxt env f
4349 (av, aty) <- check ctxt env a
44− let fty' = normalise ctxt fty
50+ let fty' = normalise ctxt env fty
4551 case fty' of
4652 Bind x (Pi s) t ->
4753 do converts ctxt env s aty
4854 return (App fv fty av,
49− normalise ctxt (Bind x (Let av aty) t))
55+ normalise ctxt env (Bind x (Let av aty) t))
5056 t -> fail "Can't apply a non-function type"
5157check ctxt env (RSet i) = return (Set i, Set (i+1))
5258check ctxt env (RBind n b sc)
@@ -55,42 +61,42 @@ check ctxt env (RBind n b sc)
5561 discharge n b' scv sct
5662 where checkBinder (Lam t)
5763 = do (tv, tt) <- check ctxt env t
58− let tv' = normalise ctxt tv
59− let tt' = normalise ctxt tt
64+ let tv' = normalise ctxt env tv
65+ let tt' = normalise ctxt env tt
6066 isSet tt'
6167 return (Lam tv')
6268 checkBinder (Pi t)
6369 = do (tv, tt) <- check ctxt env t
64− let tv' = normalise ctxt tv
65− let tt' = normalise ctxt tt
70+ let tv' = normalise ctxt env tv
71+ let tt' = normalise ctxt env tt
6672 isSet tt'
6773 return (Pi tv')
6874 checkBinder (Let t v)
6975 = do (tv, tt) <- check ctxt env t
7076 (vv, vt) <- check ctxt env v
71− let tv' = normalise ctxt tv
72− let tt' = normalise ctxt tt
77+ let tv' = normalise ctxt env tv
78+ let tt' = normalise ctxt env tt
7379 converts ctxt env tv vt
7480 isSet tt'
7581 return (Let tv' vv)
7682 checkBinder (Hole t)
7783 = do (tv, tt) <- check ctxt env t
78− let tv' = normalise ctxt tv
79− let tt' = normalise ctxt tt
84+ let tv' = normalise ctxt env tv
85+ let tt' = normalise ctxt env tt
8086 isSet tt'
8187 return (Hole tv')
8288 checkBinder (Guess t v)
8389 = do (tv, tt) <- check ctxt env t
8490 (vv, vt) <- check ctxt env v
85− let tv' = normalise ctxt tv
86− let tt' = normalise ctxt tt
91+ let tv' = normalise ctxt env tv
92+ let tt' = normalise ctxt env tt
8793 converts ctxt env tv vt
8894 isSet tt'
8995 return (Guess tv' vv)
9096 checkBinder (PVar t)
9197 = do (tv, tt) <- check ctxt env t
92− let tv' = normalise ctxt tv
93− let tt' = normalise ctxt tt
98+ let tv' = normalise ctxt env tv
99+ let tt' = normalise ctxt env tt
94100 isSet tt'
95101 return (PVar tv')
96102
@@ -131,4 +137,4 @@ checkProgram ctxt ((n, RFunction (RawFun ty val)):xs)
131137 isSet tyt'
132138 converts ctxt [] ty' valt'
133139 checkProgram ((n, Function (Fun ty' (hoas [] ty')
134− val' (hoas [] val'))):ctxt) xs
140+ val' (hoas [] val'))):ctxt) xs