@@ -17,7 +17,7 @@ unify :: Context -> Env -> TT Name -> TT Name -> TC [(Name, TT Name)]
17unify ctxt env topx topy
17unify ctxt env topx topy
18 = case un' [] (normalise ctxt env topx) (normalise ctxt env topy) of
18 = case un' [] (normalise ctxt env topx) (normalise ctxt env topy) of
19 OK v -> return v
19 OK v -> return v
20− _ -> tfail $ CantUnify topx topy
20+ Error e -> tfail $ CantUnify topx topy e
22 un' bnames (P Bound x _) (P Bound y _)
22 un' bnames (P Bound x _) (P Bound y _)
23 | (x,y) `elem` bnames = return []
23 | (x,y) `elem` bnames = return []
@@ -25,6 +25,10 @@ unify ctxt env topx topy
25 | holeIn env x = return [(x, tm)]
25 | holeIn env x = return [(x, tm)]
26 un' bnames tm (P Bound y _)
26 un' bnames tm (P Bound y _)
27 | holeIn env y = return [(y, tm)]
27 | 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 []
29 un' bnames x@(App _ _) y@(App _ _)
33 un' bnames x@(App _ _) y@(App _ _)
30 = uApp bnames (unApply x) (unApply y)
34 = uApp bnames (unApply x) (unApply y)
@@ -37,7 +41,8 @@ unify ctxt env topx topy
37 h2 <- un' ((x,y):bnames) sx sy
41 h2 <- un' ((x,y):bnames) sx sy
38 combine bnames h1 h2
42 combine bnames h1 h2
39 un' bnames x y | x == y = return []
43 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
42 uB bnames (Let tx vx) (Let ty vy)
47 uB bnames (Let tx vx) (Let ty vy)
43 = do h1 <- un' bnames tx ty
48 = do h1 <- un' bnames tx ty
@@ -54,11 +59,14 @@ unify ctxt env topx topy
54 uB bnames _ _ = fail "Can't unify"
59 uB bnames _ _ = fail "Can't unify"
56 uApp bnames (xp@(P xnt x xty), xargs) (yp@(P ynt y yty), yargs)
61 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
58 (holeIn env x && okToUnify ynt) ||
63 (holeIn env x && okToUnify ynt) ||
59 (okToUnify xnt && holeIn env y)
64 (okToUnify xnt && holeIn env y)
60 = do h <- un' bnames xp yp
65 = do h <- un' bnames xp yp
61 uArgs bnames h xargs yargs
66 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
62 uApp bnames (xf, xargs) (yf, yargs)
70 uApp bnames (xf, xargs) (yf, yargs)
63 = do un' bnames xf yf -- ignore result
71 = do un' bnames xf yf -- ignore result
64 uArgs bnames [] xargs yargs
72 uArgs bnames [] xargs yargs
@@ -77,6 +85,7 @@ unify ctxt env topx topy
77 h' <- un' bnames x' y'
85 h' <- un' bnames x' y'
78 next <- combine bnames h h'
86 next <- combine bnames h h'
79 uArgs bnames next xs ys
87 uArgs bnames next xs ys
88+ uArgs bnames h _ _ = fail "Can't unify; argument lists different length"
81 combine bnames as [] = return as
90 combine bnames as [] = return as
82 combine bnames as ((n, t) : bs)
91 combine bnames as ((n, t) : bs)