@@ -154,19 +154,13 @@ tcRho scope t@(Abs Implicit var body) (Just ty) = do -- ABS2
154154 if bt == Implicit
155155 then return ()
156156 else evalError (ppTerm Unqualified 0 t <+> " is an implicit function, but no implicit function is expected" )
157- body_ty <- case body_ty of
158- VClosure env body_ty -> do tnk <- newEvaluatedThunk (VGen (length scope) [] )
159- eval ((x,tnk): env) body_ty []
160- body_ty -> return body_ty
157+ body_ty <- evalCodomain scope x body_ty
161158 (body, body_ty) <- tcRho ((var,var_ty): scope) body (Just body_ty)
162159 return (Abs Implicit var body,ty)
163160tcRho scope (Abs Explicit var body) (Just ty) = do -- ABS3
164161 (scope,f,ty') <- skolemise scope ty
165162 (_,x,var_ty,body_ty) <- unifyFun scope ty'
166- body_ty <- case body_ty of
167- VClosure env body_ty -> do tnk <- newEvaluatedThunk (VGen (length scope) [] )
168- eval ((x,tnk): env) body_ty []
169- body_ty -> return body_ty
163+ body_ty <- evalCodomain scope x body_ty
170164 (body, body_ty) <- tcRho ((var,var_ty): scope) body (Just body_ty)
171165 return (f (Abs Explicit var body),ty)
172166tcRho scope (Meta _) mb_ty = do
@@ -375,6 +369,12 @@ tcRho scope (Reset c t) mb_ty = do
375369 instSigma scope (Reset c t) vtypeMarkup mb_ty
376370tcRho scope t _ = unimplemented (" tcRho " ++ show t)
377371
372+ evalCodomain :: Scope s -> Ident -> Value s -> EvalM s (Constraint s )
373+ evalCodomain scope x (VClosure env t) = do
374+ tnk <- newEvaluatedThunk (VGen (length scope) [] )
375+ eval ((x,tnk): env) t []
376+ evalCodomain scope x t = return t
377+
378378tcCases scope [] p_ty res_ty = return []
379379tcCases scope ((p,t): cs) p_ty res_ty = do
380380 scope' <- tcPatt scope p p_ty
@@ -632,10 +632,7 @@ subsCheckRho scope t (VProd Implicit x ty1 ty2) rho2 = do -- Rule SPEC
632632 subsCheckRho scope (App t (ImplArg (Meta i))) ty2 rho2
633633subsCheckRho scope t rho1 (VProd Implicit x ty1 ty2) = do -- Rule SKOL
634634 let v = newVar scope
635- ty2 <- case ty2 of
636- VClosure env ty2 -> do tnk <- newEvaluatedThunk (VGen (length scope) [] )
637- eval ((x,tnk): env) ty2 []
638- ty2 -> return ty2
635+ ty2 <- evalCodomain scope x ty2
639636 t <- subsCheckRho ((v,ty1): scope) t rho1 ty2
640637 return (Abs Implicit v t)
641638subsCheckRho scope t rho1 (VProd Explicit _ a2 r2) = do -- Rule FUN
@@ -830,6 +827,12 @@ unify scope (VMeta i vs) v = unifyVar scope i vs v
830827unify scope v (VMeta i vs) = unifyVar scope i vs v
831828unify scope (VGen i vs1) (VGen j vs2)
832829 | i == j = sequence_ (zipWith (unifyThunk scope) vs1 vs2)
830+ unify scope (VProd b x d cod) (VProd b' x' d' cod')
831+ | b == b' = do
832+ unify scope d d'
833+ cod <- evalCodomain scope x cod
834+ cod' <- evalCodomain scope x' cod'
835+ unify scope cod cod'
833836unify scope (VTable p1 res1) (VTable p2 res2) = do
834837 unify scope p2 p1
835838 unify scope res1 res2
@@ -960,10 +963,7 @@ skolemise scope ty@(VMeta i vs) = do
960963 skolemise scope ty
961964skolemise scope (VProd Implicit x ty1 ty2) = do
962965 let v = newVar scope
963- ty2 <- case ty2 of
964- VClosure env ty2 -> do tnk <- newEvaluatedThunk (VGen (length scope) [] )
965- eval ((x,tnk) : env) ty2 []
966- ty2 -> return ty2
966+ ty2 <- evalCodomain scope x ty2
967967 (scope,f,ty2) <- skolemise ((v,ty1): scope) ty2
968968 return (scope,Abs Implicit v . f,ty2)
969969skolemise scope ty = do
0 commit comments