@@ -17,7 +17,7 @@ unify :: Context -> Env -> TT Name -> TT Name -> TC [(Name, TT Name)]
1717unify ctxt env topx topy
1818 = case un' [] (normalise ctxt env topx) (normalise ctxt env topy) of
1919 OK v -> return v
20− _ -> tfail $ CantUnify topx topy
20+ Error e -> tfail $ CantUnify topx topy e
2121 where
2222 un' bnames (P Bound x _) (P Bound y _)
2323 | (x,y) `elem` bnames = return []
@@ -25,6 +25,10 @@ unify ctxt env topx topy
2525 | holeIn env x = return [(x, tm)]
2626 un' bnames tm (P Bound y _)
2727 | holeIn env y = return [(y, tm)]
28+ un' bnames (V i) (P Bound x _)
29+ | fst (bnames!!i) == x || snd (bnames!!i) == x = return []
30+ un' bnames (P Bound x _) (V i)
31+ | fst (bnames!!i) == x || snd (bnames!!i) == x = return []
2832
2933 un' bnames x@(App _ _) y@(App _ _)
3034 = uApp bnames (unApply x) (unApply y)
@@ -37,7 +41,8 @@ unify ctxt env topx topy
3741 h2 <- un' ((x,y):bnames) sx sy
3842 combine bnames h1 h2
3943 un' bnames x y | x == y = return []
40− | otherwise = fail "Can't unify"
44+ | otherwise = fail $ "Can't unify " ++ show x ++ " and " ++ show y
45+ ++ " " ++ show bnames ++ " " ++ show env
4146
4247 uB bnames (Let tx vx) (Let ty vy)
4348 = do h1 <- un' bnames tx ty
@@ -54,11 +59,14 @@ unify ctxt env topx topy
5459 uB bnames _ _ = fail "Can't unify"
5560
5661 uApp bnames (xp@(P xnt x xty), xargs) (yp@(P ynt y yty), yargs)
57− | (x == y && all okToUnify [xnt, ynt]) ||
62+ | (x == y && all okToUnify [xnt, ynt]) || -- functions x,y are injectice
5863 (holeIn env x && okToUnify ynt) ||
5964 (okToUnify xnt && holeIn env y)
6065 = do h <- un' bnames xp yp
6166 uArgs bnames h xargs yargs
67+ | x == y && xargs == yargs -- only ok if arguments are equal, if functions
68+ -- are not known to be injetive
69+ = return []
6270 uApp bnames (xf, xargs) (yf, yargs)
6371 = do un' bnames xf yf -- ignore result
6472 uArgs bnames [] xargs yargs
@@ -77,6 +85,7 @@ unify ctxt env topx topy
7785 h' <- un' bnames x' y'
7886 next <- combine bnames h h'
7987 uArgs bnames next xs ys
88+ uArgs bnames h _ _ = fail "Can't unify; argument lists different length"
8089
8190 combine bnames as [] = return as
8291 combine bnames as ((n, t) : bs)