@@ -1,11 +1,10 @@
1−{-# LANGUAGE MultiParamTypeClasses, FunctionalDependencies, DeriveFunctor #-}
3module Core.Unify(unify) where
1module Core.Unify(unify) where
5import Core.TT
3import Core.TT
6import Core.Evaluate
4import Core.Evaluate
8import Control.Monad
6import Control.Monad
10-- Unification is applied inside the theorem prover. We're looking for holes
9-- Unification is applied inside the theorem prover. We're looking for holes
11-- which can be filled in, by matching one term's normal form against another.
10-- which can be filled in, by matching one term's normal form against another.
@@ -16,9 +15,10 @@ import Control.Monad
17unify :: Context -> Env -> TT Name -> TT Name -> TC [(Name, TT Name)]
16unify :: Context -> Env -> TT Name -> TT Name -> TC [(Name, TT Name)]
18unify ctxt env x y
17unify ctxt env x y
19− = case un' [] x y of -- try without normalising first, for speed
18+ = --case un' [] x y of -- try without normalising first, for speed
20− OK v -> return v
19+ -- OK v -> return v
21− _ -> case un' [] (normalise ctxt env x) (normalise ctxt env y) of
21+ case un' [] (normalise ctxt env x) (normalise ctxt env y) of
22 OK v -> return v
22 OK v -> return v
23 _ -> fail $ "Can't unify " ++ showEnv env x ++ " and " ++ showEnv env y
23 _ -> fail $ "Can't unify " ++ showEnv env x ++ " and " ++ showEnv env y
@@ -61,18 +61,26 @@ unify ctxt env x y
61 (holeIn env x && okToUnify ynt) ||
61 (holeIn env x && okToUnify ynt) ||
62 (okToUnify xnt && holeIn env y)
62 (okToUnify xnt && holeIn env y)
63 = do h <- un' bnames xp yp
63 = do h <- un' bnames xp yp
64− hargs <- zipWithM (un' bnames) xargs yargs
64+ uArgs bnames h xargs yargs
65− h' <- foldM (combine bnames) [] hargs
67 uApp bnames (xf, xargs) (yf, yargs)
65 uApp bnames (xf, xargs) (yf, yargs)
68 = do un' bnames xf yf -- ignore result
66 = do un' bnames xf yf -- ignore result
69− hargs <- zipWithM (un' bnames) xargs yargs
67+ uArgs bnames [] xargs yargs
70− foldM (combine bnames) [] hargs
72 okToUnify (DCon _ _) = True
69 okToUnify (DCon _ _) = True
73 okToUnify (TCon _) = True
70 okToUnify (TCon _) = True
74 okToUnify _ = False
71 okToUnify _ = False
73+ uArgs bnames h [] [] = return h
74+ uArgs bnames h (x:xs) (y:ys) =
75+ case un' bnames x y of
76+ OK h' -> do next <- combine bnames h h'
77+ uArgs bnames next xs ys
78+ _ -> do let x' = normalise ctxt env (substNames h x)
79+ let y' = normalise ctxt env (substNames h y)
80+ h' <- un' bnames x' y'
81+ next <- combine bnames h h'
82+ uArgs bnames next xs ys
76 combine bnames as [] = return as
84 combine bnames as [] = return as
77 combine bnames as ((n, t) : bs)
85 combine bnames as ((n, t) : bs)
78 = case lookup n as of
86 = case lookup n as of