{-# LANGUAGE FlexibleContexts, FlexibleInstances, TypeSynonymInstances,
PatternGuards, TupleSections, NamedFieldPuns #-}
module TypeChecker where
import Prelude hiding (null)
#if !MIN_VERSION_base(4,8,0)
import Control.Applicative ((<$>), (<*>))
#endif
import Control.Monad (foldM, forM, forM_, liftM, unless, when, zipWithM, zipWithM_)
import Control.Monad.IO.Class (MonadIO(..))
import Control.Monad.State (runStateT, get, gets, put)
import Control.Monad.Except (runExceptT, catchError)
import Control.Monad.Reader (runReaderT, ask, asks, local)
import qualified Data.List as List
import Data.Map (Map)
import Data.Maybe
import qualified Data.Foldable as Foldable
import qualified Data.Traversable as Traversable
import qualified Text.PrettyPrint as PP
import Util
import Abstract hiding (Substitute)
import Polarity as Pol
import Value
import TCM
import Eval
import Extract
import PrettyTCM
import TraceError
import Termination
traceCheck, traceSing, traceAdm :: String -> a -> a
traceCheckM, traceSingM, traceAdmM :: Monad m => String -> m ()
traceCheck :: forall a. String -> a -> a
traceCheck String
msg a
a = a
a
traceCheckM :: forall (m :: * -> *). Monad m => String -> m ()
traceCheckM String
msg = () -> m ()
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return ()
traceSing :: forall a. String -> a -> a
traceSing String
msg a
a = a
a
traceSingM :: forall (m :: * -> *). Monad m => String -> m ()
traceSingM String
msg = () -> m ()
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return ()
traceAdm :: forall a. String -> a -> a
traceAdm String
msg a
a = a
a
traceAdmM :: forall (m :: * -> *). Monad m => String -> m ()
traceAdmM String
msg = () -> m ()
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return ()
doNf :: Signature -> Expr -> IO (Either TraceError (Expr, TCState))
doNf :: Signature -> Expr -> IO (Either TraceError (Expr, TCState))
doNf Signature
sig Expr
e = ExceptT TraceError IO (Expr, TCState)
-> IO (Either TraceError (Expr, TCState))
forall e (m :: * -> *) a. ExceptT e m a -> m (Either e a)
runExceptT (ReaderT TCContext (ExceptT TraceError IO) (Expr, TCState)
-> TCContext -> ExceptT TraceError IO (Expr, TCState)
forall r (m :: * -> *) a. ReaderT r m a -> r -> m a
runReaderT (StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Expr
-> TCState
-> ReaderT TCContext (ExceptT TraceError IO) (Expr, TCState)
forall s (m :: * -> *) a. StateT s m a -> s -> m (a, s)
runStateT (Env -> Expr -> TypeCheck TVal
whnf Env
forall a. Environ a
emptyEnv Expr
e TypeCheck TVal
-> (TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Expr)
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Expr
forall a b.
StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
-> (a
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) b)
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Expr
reify) (Signature -> TCState
initWithSig Signature
sig)) TCContext
emptyContext)
doWhnf :: Signature -> Expr -> IO (Either TraceError (Val, TCState))
doWhnf :: Signature -> Expr -> IO (Either TraceError (TVal, TCState))
doWhnf Signature
sig Expr
e = ExceptT TraceError IO (TVal, TCState)
-> IO (Either TraceError (TVal, TCState))
forall e (m :: * -> *) a. ExceptT e m a -> m (Either e a)
runExceptT (ReaderT TCContext (ExceptT TraceError IO) (TVal, TCState)
-> TCContext -> ExceptT TraceError IO (TVal, TCState)
forall r (m :: * -> *) a. ReaderT r m a -> r -> m a
runReaderT (TypeCheck TVal
-> TCState
-> ReaderT TCContext (ExceptT TraceError IO) (TVal, TCState)
forall s (m :: * -> *) a. StateT s m a -> s -> m (a, s)
runStateT (Env -> Expr -> TypeCheck TVal
whnf Env
forall a. Environ a
emptyEnv Expr
e TypeCheck TVal -> (TVal -> TypeCheck TVal) -> TypeCheck TVal
forall a b.
StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
-> (a
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) b)
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= TVal -> TypeCheck TVal
whnfClos) (Signature -> TCState
initWithSig Signature
sig)) TCContext
emptyContext)
runTypeCheck :: TCState -> TypeCheck a -> IO (Either TraceError (a, TCState))
runTypeCheck :: forall a.
TCState -> TypeCheck a -> IO (Either TraceError (a, TCState))
runTypeCheck TCState
st TypeCheck a
tc = ExceptT TraceError IO (a, TCState)
-> IO (Either TraceError (a, TCState))
forall e (m :: * -> *) a. ExceptT e m a -> m (Either e a)
runExceptT (ReaderT TCContext (ExceptT TraceError IO) (a, TCState)
-> TCContext -> ExceptT TraceError IO (a, TCState)
forall r (m :: * -> *) a. ReaderT r m a -> r -> m a
runReaderT (TypeCheck a
-> TCState
-> ReaderT TCContext (ExceptT TraceError IO) (a, TCState)
forall s (m :: * -> *) a. StateT s m a -> s -> m (a, s)
runStateT TypeCheck a
tc TCState
st) TCContext
emptyContext)
typeCheck :: [Declaration] -> IO (Either TraceError ([EDeclaration], TCState))
typeCheck :: [Declaration] -> IO (Either TraceError ([Declaration], TCState))
typeCheck [Declaration]
dl = TCState
-> TypeCheck [Declaration]
-> IO (Either TraceError ([Declaration], TCState))
forall a.
TCState -> TypeCheck a -> IO (Either TraceError (a, TCState))
runTypeCheck TCState
initSt ([Declaration] -> TypeCheck [Declaration]
typeCheckDecls [Declaration]
dl)
echo :: MonadIO m => String -> m ()
echo :: forall (m :: * -> *). MonadIO m => String -> m ()
echo = IO () -> m ()
forall a. IO a -> m a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> m ()) -> (String -> IO ()) -> String -> m ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> IO ()
putStrLn
echoR :: MonadIO m => String -> m ()
echoR :: forall (m :: * -> *). MonadIO m => String -> m ()
echoR = String -> m ()
forall (m :: * -> *). MonadIO m => String -> m ()
echo
echoTySig :: (Show n, MonadIO m) => n -> Expr -> m ()
echoTySig :: forall n (m :: * -> *). (Show n, MonadIO m) => n -> Expr -> m ()
echoTySig n
n Expr
t = () -> m ()
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return ()
echoKindedTySig :: (Show n, MonadIO m) => Kind -> n -> Expr -> m ()
echoKindedTySig :: forall n (m :: * -> *).
(Show n, MonadIO m) =>
Kind -> n -> Expr -> m ()
echoKindedTySig Kind
ki n
n Expr
t = String -> m ()
forall (m :: * -> *). MonadIO m => String -> m ()
echo (String -> m ()) -> String -> m ()
forall a b. (a -> b) -> a -> b
$ Kind -> String
prettyKind Kind
ki String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
" " String -> String -> String
forall a. [a] -> [a] -> [a]
++ n -> String
forall a. Show a => a -> String
show n
n String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
" : " String -> String -> String
forall a. [a] -> [a] -> [a]
++ Expr -> String
forall a. Show a => a -> String
show Expr
t
echoKindedDef :: (Show n, MonadIO m) => Kind -> n -> Expr -> m ()
echoKindedDef :: forall n (m :: * -> *).
(Show n, MonadIO m) =>
Kind -> n -> Expr -> m ()
echoKindedDef Kind
ki n
n Expr
t = String -> m ()
forall (m :: * -> *). MonadIO m => String -> m ()
echo (String -> m ()) -> String -> m ()
forall a b. (a -> b) -> a -> b
$ Kind -> String
prettyKind Kind
ki String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
" " String -> String -> String
forall a. [a] -> [a] -> [a]
++ n -> String
forall a. Show a => a -> String
show n
n String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
" = " String -> String -> String
forall a. [a] -> [a] -> [a]
++ Expr -> String
forall a. Show a => a -> String
show Expr
t
echoEPrefix :: String
echoEPrefix :: String
echoEPrefix = String
"E> "
echoTySigE :: (Show n, MonadIO m) => n -> Expr -> m ()
echoTySigE :: forall n (m :: * -> *). (Show n, MonadIO m) => n -> Expr -> m ()
echoTySigE n
n Expr
t = String -> m ()
forall (m :: * -> *). MonadIO m => String -> m ()
echo (String -> m ()) -> String -> m ()
forall a b. (a -> b) -> a -> b
$ String
echoEPrefix String -> String -> String
forall a. [a] -> [a] -> [a]
++ n -> String
forall a. Show a => a -> String
show n
n String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
" : " String -> String -> String
forall a. [a] -> [a] -> [a]
++ Expr -> String
forall a. Show a => a -> String
show Expr
t
echoDefE :: (Show n, MonadIO m) => n -> Expr -> m ()
echoDefE :: forall n (m :: * -> *). (Show n, MonadIO m) => n -> Expr -> m ()
echoDefE n
n Expr
t = String -> m ()
forall (m :: * -> *). MonadIO m => String -> m ()
echo (String -> m ()) -> String -> m ()
forall a b. (a -> b) -> a -> b
$ String
echoEPrefix String -> String -> String
forall a. [a] -> [a] -> [a]
++ n -> String
forall a. Show a => a -> String
show n
n String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
" = " String -> String -> String
forall a. [a] -> [a] -> [a]
++ Expr -> String
forall a. Show a => a -> String
show Expr
t
typeCheckDecls :: [Declaration] -> TypeCheck [EDeclaration]
typeCheckDecls :: [Declaration] -> TypeCheck [Declaration]
typeCheckDecls [] = [Declaration] -> TypeCheck [Declaration]
forall a.
a -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
forall (m :: * -> *) a. Monad m => a -> m a
return []
typeCheckDecls (Declaration
d:[Declaration]
ds) = do
de <- Declaration -> TypeCheck [Declaration]
typeCheckDeclaration Declaration
d
dse <- typeCheckDecls ds
return (de ++ dse)
typeCheckDeclaration :: Declaration -> TypeCheck [EDeclaration]
typeCheckDeclaration :: Declaration -> TypeCheck [Declaration]
typeCheckDeclaration (OverrideDecl Override
Check [Declaration]
ds) = do
st <- StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) TCState
forall s (m :: * -> *). MonadState s m => m s
get
_ <- typeCheckDecls ds
put st
return []
typeCheckDeclaration (OverrideDecl Override
Fail [Declaration]
ds) = do
st <- StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) TCState
forall s (m :: * -> *). MonadState s m => m s
get
r <- (typeCheckDecls ds >> return True) `catchError`
(\ TraceError
s -> do IO ()
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall a.
IO a
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO ()
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ())
-> IO ()
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall a b. (a -> b) -> a -> b
$ String -> IO ()
putStrLn (String
"block fails as expected, error message:\n" String -> String -> String
forall a. [a] -> [a] -> [a]
++ TraceError -> String
forall a. Show a => a -> String
show TraceError
s)
Bool
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Bool
forall a.
a -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
forall (m :: * -> *) a. Monad m => a -> m a
return Bool
False)
if r then throwErrorMsg "unexpected success" else do
put st
return []
typeCheckDeclaration (OverrideDecl Override
TrustMe [Declaration]
ds) =
AssertionHandling
-> TypeCheck [Declaration] -> TypeCheck [Declaration]
forall a.
AssertionHandling
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
forall (m :: * -> *) a.
MonadAssert m =>
AssertionHandling -> m a -> m a
newAssertionHandling AssertionHandling
Warning (TypeCheck [Declaration] -> TypeCheck [Declaration])
-> TypeCheck [Declaration] -> TypeCheck [Declaration]
forall a b. (a -> b) -> a -> b
$ [Declaration] -> TypeCheck [Declaration]
typeCheckDecls [Declaration]
ds
typeCheckDeclaration (OverrideDecl Override
Impredicative [Declaration]
ds) =
TypeCheck [Declaration] -> TypeCheck [Declaration]
forall a.
StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
forall (m :: * -> *) a. MonadCxt m => m a -> m a
goImpredicative (TypeCheck [Declaration] -> TypeCheck [Declaration])
-> TypeCheck [Declaration] -> TypeCheck [Declaration]
forall a b. (a -> b) -> a -> b
$ [Declaration] -> TypeCheck [Declaration]
typeCheckDecls [Declaration]
ds
typeCheckDeclaration (RecordDecl Name
n Telescope
tel Expr
t0 Constructor
c [Name]
fields) =
Maybe DefId -> TypeCheck [Declaration] -> TypeCheck [Declaration]
forall a.
Maybe DefId
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
forall (m :: * -> *) a. MonadCxt m => Maybe DefId -> m a -> m a
checkingMutual (DefId -> Maybe DefId
forall a. a -> Maybe a
Just (DefId -> Maybe DefId) -> DefId -> Maybe DefId
forall a b. (a -> b) -> a -> b
$ IdKind -> QName -> DefId
DefId IdKind
DatK (QName -> DefId) -> QName -> DefId
forall a b. (a -> b) -> a -> b
$ Name -> QName
QName Name
n) (TypeCheck [Declaration] -> TypeCheck [Declaration])
-> TypeCheck [Declaration] -> TypeCheck [Declaration]
forall a b. (a -> b) -> a -> b
$ do
result <- Name
-> Sized
-> Co
-> [Pol]
-> Telescope
-> Expr
-> [Constructor]
-> [Name]
-> TypeCheck [Declaration]
typeCheckDataDecl Name
n Sized
NotSized Co
CoInd [] Telescope
tel Expr
t0 [Constructor
c] [Name]
fields
checkPositivityGraph
return result
typeCheckDeclaration (DataDecl Name
n Sized
sz Co
co [Pol]
pos0 Telescope
tel Expr
t0 [Constructor]
cs [Name]
fields) =
Maybe DefId -> TypeCheck [Declaration] -> TypeCheck [Declaration]
forall a.
Maybe DefId
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
forall (m :: * -> *) a. MonadCxt m => Maybe DefId -> m a -> m a
checkingMutual (DefId -> Maybe DefId
forall a. a -> Maybe a
Just (DefId -> Maybe DefId) -> DefId -> Maybe DefId
forall a b. (a -> b) -> a -> b
$ IdKind -> QName -> DefId
DefId IdKind
DatK (QName -> DefId) -> QName -> DefId
forall a b. (a -> b) -> a -> b
$ Name -> QName
QName Name
n) (TypeCheck [Declaration] -> TypeCheck [Declaration])
-> TypeCheck [Declaration] -> TypeCheck [Declaration]
forall a b. (a -> b) -> a -> b
$ do
result <- Name
-> Sized
-> Co
-> [Pol]
-> Telescope
-> Expr
-> [Constructor]
-> [Name]
-> TypeCheck [Declaration]
typeCheckDataDecl Name
n Sized
sz Co
co [Pol]
pos0 Telescope
tel Expr
t0 [Constructor]
cs [Name]
fields
checkPositivityGraph
return result
typeCheckDeclaration (LetDecl Bool
eval Name
n Telescope
tel Maybe Expr
mt Expr
e) = String -> TypeCheck [Declaration] -> TypeCheck [Declaration]
forall (m :: * -> *) a.
MonadError TraceError m =>
String -> m a -> m a
enter (Name -> String
forall a. Show a => a -> String
show Name
n) (TypeCheck [Declaration] -> TypeCheck [Declaration])
-> TypeCheck [Declaration] -> TypeCheck [Declaration]
forall a b. (a -> b) -> a -> b
$ do
(vt, te, Kinded ki ee) <- Dec
-> Telescope
-> Maybe Expr
-> Expr
-> TypeCheck (TVal, Expr, Kinded Expr)
checkLetDef Dec
neutralDec Telescope
tel Maybe Expr
mt Expr
e
rho <- getEnv
let v = Env -> Expr -> TVal
mkClos Env
rho Expr
ee
addSig n (LetSig vt ki v $ undefinedFType $ QName n)
echoKindedTySig ki n te
echoKindedDef ki n ee
return [LetDecl eval n emptyTel (Just te) ee]
typeCheckDeclaration d :: Declaration
d@(PatternDecl Name
x [Name]
xs Pattern
p) = do
String
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall (m :: * -> *). MonadIO m => String -> m ()
echo (String
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ())
-> String
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall a b. (a -> b) -> a -> b
$ String
"pattern " String -> String -> String
forall a. [a] -> [a] -> [a]
++ String -> (Name -> String) -> [Name] -> String
forall a. String -> (a -> String) -> [a] -> String
Util.showList String
" " Name -> String
forall a. Show a => a -> String
show (Name
xName -> [Name] -> [Name]
forall a. a -> [a] -> [a]
:[Name]
xs) String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
" = " String -> String -> String
forall a. [a] -> [a] -> [a]
++ Pattern -> String
forall a. Show a => a -> String
show Pattern
p
v <- Expr -> TypeCheck TVal
whnf' (Expr -> TypeCheck TVal) -> Expr -> TypeCheck TVal
forall a b. (a -> b) -> a -> b
$ (Name -> Expr -> Expr) -> Expr -> [Name] -> Expr
forall a b. (a -> b -> b) -> b -> [a] -> b
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr (Dec -> Name -> Expr -> Expr
Lam Dec
defaultDec) (Pattern -> Expr
patternToExpr Pattern
p) [Name]
xs
addSig x (PatSig xs p v)
return [d]
typeCheckDeclaration (MutualFunDecl Bool
False Co
co [Fun]
funs) =
do
funse <- Co -> [Fun] -> TypeCheck [Fun]
typeCheckFuns Co
co [Fun]
funs
return $ [MutualFunDecl False co funse]
typeCheckDeclaration (MutualFunDecl Bool
True Co
co [Fun]
funs) =
do
funse <- Co -> [Fun] -> TypeCheck [Fun]
typeCheckMeasuredFuns Co
co [Fun]
funs
return $ [MutualFunDecl False co funse]
typeCheckDeclaration (MutualDecl Bool
measured [Declaration]
ds) = do
ktss <- [Declaration] -> TypeCheck [Kinded (TySig TVal)]
typeCheckMutualSigs [Declaration]
ds
let ns = [Kinded (TySig TVal)] -> (Kinded (TySig TVal) -> Name) -> [Name]
forall (f :: * -> *) a b. Functor f => f a -> (a -> b) -> f b
for [Kinded (TySig TVal)]
ktss ((Kinded (TySig TVal) -> Name) -> [Name])
-> (Kinded (TySig TVal) -> Name) -> [Name]
forall a b. (a -> b) -> a -> b
$ \ (Kinded Kind
_ (TypeSig Name
n TVal
_)) -> Name
n
addMutualNames = (TCContext -> TCContext) -> m a -> m a
forall a. (TCContext -> TCContext) -> m a -> m a
forall r (m :: * -> *) a. MonadReader r m => (r -> r) -> m a -> m a
local ((TCContext -> TCContext) -> m a -> m a)
-> (TCContext -> TCContext) -> m a -> m a
forall a b. (a -> b) -> a -> b
$ \ TCContext
e -> TCContext
e { mutualNames = ns ++ mutualNames e }
edss <- addKindedTypeSigs ktss $ addMutualNames $
zipWithM (typeCheckMutualBody measured) (map (predKind . kindOf) ktss) ds
checkPositivityGraph
return $ concat edss
typeCheckMutualSigs :: [Declaration] -> TypeCheck [Kinded (TySig TVal)]
typeCheckMutualSigs :: [Declaration] -> TypeCheck [Kinded (TySig TVal)]
typeCheckMutualSigs [] = [Kinded (TySig TVal)] -> TypeCheck [Kinded (TySig TVal)]
forall a.
a -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
forall (m :: * -> *) a. Monad m => a -> m a
return []
typeCheckMutualSigs (Declaration
d:[Declaration]
ds) = do
kts@(Kinded ki (TypeSig n tv)) <- Declaration -> TypeCheck (Kinded (TySig TVal))
typeCheckMutualSig Declaration
d
new' n (Domain tv ki defaultDec) $ do
ktss <- typeCheckMutualSigs ds
return $ kts : ktss
typeCheckSignature :: TySig Type -> TypeCheck (Kinded (TySig TVal))
typeCheckSignature :: TySig Expr -> TypeCheck (Kinded (TySig TVal))
typeCheckSignature (TypeSig Name
n Expr
t) = do
Name
-> Expr
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall n (m :: * -> *). (Show n, MonadIO m) => n -> Expr -> m ()
echoTySig Name
n Expr
t
Kinded ki te <- Expr -> TypeCheck (Kinded Expr)
checkType Expr
t
tv <- whnf' te
return $ Kinded (predKind ki) $ TypeSig n tv
typeCheckMutualSig :: Declaration -> TypeCheck (Kinded (TySig TVal))
typeCheckMutualSig :: Declaration -> TypeCheck (Kinded (TySig TVal))
typeCheckMutualSig (LetDecl Bool
ev Name
n Telescope
tel (Just Expr
t) Expr
e) =
TySig Expr -> TypeCheck (Kinded (TySig TVal))
typeCheckSignature (TySig Expr -> TypeCheck (Kinded (TySig TVal)))
-> TySig Expr -> TypeCheck (Kinded (TySig TVal))
forall a b. (a -> b) -> a -> b
$ Name -> Expr -> TySig Expr
forall a. Name -> a -> TySig a
TypeSig Name
n (Expr -> TySig Expr) -> Expr -> TySig Expr
forall a b. (a -> b) -> a -> b
$ Telescope -> Expr -> Expr
teleToType Telescope
tel Expr
t
typeCheckMutualSig (DataDecl Name
n Sized
sz Co
co [Pol]
pos Telescope
tel Expr
t [Constructor]
cs [Name]
fields) = do
Kinded ki ts <- TySig Expr -> TypeCheck (Kinded (TySig TVal))
typeCheckSignature (Name -> Expr -> TySig Expr
forall a. Name -> a -> TySig a
TypeSig Name
n (Telescope -> Expr -> Expr
teleToType Telescope
tel Expr
t))
return $ Kinded ki ts
typeCheckMutualSig (FunDecl Co
co (Fun TySig Expr
ts Name
n' Arity
ar [Clause]
cls)) =
TySig Expr -> TypeCheck (Kinded (TySig TVal))
typeCheckSignature TySig Expr
ts
typeCheckMutualSig (OverrideDecl Override
TrustMe [Declaration
d]) =
AssertionHandling
-> TypeCheck (Kinded (TySig TVal))
-> TypeCheck (Kinded (TySig TVal))
forall a.
AssertionHandling
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
forall (m :: * -> *) a.
MonadAssert m =>
AssertionHandling -> m a -> m a
newAssertionHandling AssertionHandling
Warning (TypeCheck (Kinded (TySig TVal))
-> TypeCheck (Kinded (TySig TVal)))
-> TypeCheck (Kinded (TySig TVal))
-> TypeCheck (Kinded (TySig TVal))
forall a b. (a -> b) -> a -> b
$ Declaration -> TypeCheck (Kinded (TySig TVal))
typeCheckMutualSig Declaration
d
typeCheckMutualSig (OverrideDecl Override
Impredicative [Declaration
d]) =
TypeCheck (Kinded (TySig TVal)) -> TypeCheck (Kinded (TySig TVal))
forall a.
StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
forall (m :: * -> *) a. MonadCxt m => m a -> m a
goImpredicative (TypeCheck (Kinded (TySig TVal))
-> TypeCheck (Kinded (TySig TVal)))
-> TypeCheck (Kinded (TySig TVal))
-> TypeCheck (Kinded (TySig TVal))
forall a b. (a -> b) -> a -> b
$ Declaration -> TypeCheck (Kinded (TySig TVal))
typeCheckMutualSig Declaration
d
typeCheckMutualSig Declaration
d = String -> TypeCheck (Kinded (TySig TVal))
forall (m :: * -> *) a. MonadError TraceError m => String -> m a
throwErrorMsg (String -> TypeCheck (Kinded (TySig TVal)))
-> String -> TypeCheck (Kinded (TySig TVal))
forall a b. (a -> b) -> a -> b
$ String
"typeCheckMutualSig: panic: unexpected declaration " String -> String -> String
forall a. [a] -> [a] -> [a]
++ Declaration -> String
forall a. Show a => a -> String
show Declaration
d
typeCheckMutualBody :: Bool -> Kind -> Declaration -> TypeCheck [EDeclaration]
typeCheckMutualBody :: Bool -> Kind -> Declaration -> TypeCheck [Declaration]
typeCheckMutualBody Bool
measured Kind
_ (DataDecl Name
n Sized
sz Co
co [Pol]
pos Telescope
tel Expr
t [Constructor]
cs [Name]
fields) = do
Maybe DefId -> TypeCheck [Declaration] -> TypeCheck [Declaration]
forall a.
Maybe DefId
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
forall (m :: * -> *) a. MonadCxt m => Maybe DefId -> m a -> m a
checkingMutual (DefId -> Maybe DefId
forall a. a -> Maybe a
Just (DefId -> Maybe DefId) -> DefId -> Maybe DefId
forall a b. (a -> b) -> a -> b
$ IdKind -> QName -> DefId
DefId IdKind
DatK (QName -> DefId) -> QName -> DefId
forall a b. (a -> b) -> a -> b
$ Name -> QName
QName Name
n) (TypeCheck [Declaration] -> TypeCheck [Declaration])
-> TypeCheck [Declaration] -> TypeCheck [Declaration]
forall a b. (a -> b) -> a -> b
$
Name
-> Sized
-> Co
-> [Pol]
-> Telescope
-> Expr
-> [Constructor]
-> [Name]
-> TypeCheck [Declaration]
typeCheckDataDecl Name
n Sized
sz Co
co [Pol]
pos Telescope
tel Expr
t [Constructor]
cs [Name]
fields
typeCheckMutualBody measured :: Bool
measured@Bool
False Kind
ki (FunDecl Co
co fun :: Fun
fun@(Fun ts :: TySig Expr
ts@(TypeSig Name
n Expr
t) Name
n' Arity
ar [Clause]
cls)) = do
Maybe DefId -> TypeCheck [Declaration] -> TypeCheck [Declaration]
forall a.
Maybe DefId
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
forall (m :: * -> *) a. MonadCxt m => Maybe DefId -> m a -> m a
checkingMutual (DefId -> Maybe DefId
forall a. a -> Maybe a
Just (DefId -> Maybe DefId) -> DefId -> Maybe DefId
forall a b. (a -> b) -> a -> b
$ IdKind -> QName -> DefId
DefId IdKind
FunK (QName -> DefId) -> QName -> DefId
forall a b. (a -> b) -> a -> b
$ Name -> QName
QName Name
n) (TypeCheck [Declaration] -> TypeCheck [Declaration])
-> TypeCheck [Declaration] -> TypeCheck [Declaration]
forall a b. (a -> b) -> a -> b
$ do
fun' <- Co -> Kind -> Fun -> TypeCheck Fun
typeCheckFunBody Co
co Kind
ki Fun
fun
return $ [FunDecl co fun']
typeCheckDataDecl :: Name -> Sized -> Co -> [Pol] -> Telescope -> Type -> [Constructor] -> [Name] -> TypeCheck [EDeclaration]
typeCheckDataDecl :: Name
-> Sized
-> Co
-> [Pol]
-> Telescope
-> Expr
-> [Constructor]
-> [Name]
-> TypeCheck [Declaration]
typeCheckDataDecl Name
n Sized
sz Co
co [Pol]
pos0 Telescope
tel0 Expr
t0 [Constructor]
cs0 [Name]
fields = String -> TypeCheck [Declaration] -> TypeCheck [Declaration]
forall (m :: * -> *) a.
MonadError TraceError m =>
String -> m a -> m a
enter (Name -> String
forall a. Show a => a -> String
show Name
n) (TypeCheck [Declaration] -> TypeCheck [Declaration])
-> TypeCheck [Declaration] -> TypeCheck [Declaration]
forall a b. (a -> b) -> a -> b
$
(do
let params :: Int
params = Telescope -> Int
forall a. Size a => a -> Int
size Telescope
tel0
(p', pos, t) <- do
case Sized
sz of
Sized
Sized -> do
let polsz :: Pol
polsz = if Co
coCo -> Co -> Bool
forall a. Eq a => a -> a -> Bool
==Co
Ind then Pol
Pos else Pol
Neg
t <- case Expr
t0 of
Quant PiSigma
Pi (TBind Name
x (Domain Expr
domt Kind
ki Dec
dec)) Expr
b | Expr -> Bool
isSize Expr
domt ->
case (Dec -> Pol
forall pol. Polarity pol => Decoration pol -> pol
polarity Dec
dec) of
Pol
pol | Pol
pol Pol -> [Pol] -> Bool
forall a. Eq a => a -> [a] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [Pol
Param,Pol
Rec] -> Expr
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Expr
forall a.
a -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
forall (m :: * -> *) a. Monad m => a -> m a
return (Expr
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Expr)
-> Expr
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Expr
forall a b. (a -> b) -> a -> b
$ PiSigma -> TBind -> Expr -> Expr
Quant PiSigma
Pi (Name -> Dom Expr -> TBind
forall a. Name -> Dom a -> TBinding a
TBind Name
x (Dom Expr -> TBind) -> Dom Expr -> TBind
forall a b. (a -> b) -> a -> b
$ Expr -> Kind -> Dec -> Dom Expr
forall a. a -> Kind -> Dec -> Dom a
Domain Expr
tSize Kind
kSize (Dec -> Dom Expr) -> Dec -> Dom Expr
forall a b. (a -> b) -> a -> b
$ Pol -> Dec -> Dec
forall a. LensPol a => Pol -> a -> a
setPol Pol
polsz Dec
dec) Expr
b
Pol
pol | Pol
pol Pol -> Pol -> Bool
forall a. Eq a => a -> a -> Bool
== Pol
polsz -> Expr
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Expr
forall a.
a -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
forall (m :: * -> *) a. Monad m => a -> m a
return Expr
t0
Pol
pol -> String
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Expr
forall (m :: * -> *) a. MonadError TraceError m => String -> m a
throwErrorMsg (String
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Expr)
-> String
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Expr
forall a b. (a -> b) -> a -> b
$ String
"sized type " String -> String -> String
forall a. [a] -> [a] -> [a]
++ Name -> String
forall a. Show a => a -> String
show Name
n String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
" has wrong polarity annotation " String -> String -> String
forall a. [a] -> [a] -> [a]
++ Pol -> String
forall a. Show a => a -> String
show Pol
pol String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
" at Size argument, it should be " String -> String -> String
forall a. [a] -> [a] -> [a]
++ Pol -> String
forall a. Show a => a -> String
show Pol
polsz
Expr
t0 -> Expr
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Expr
forall a.
a -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
forall (m :: * -> *) a. Monad m => a -> m a
return Expr
t0
return (params + 1, pos0 ++ [polsz], t)
Sized
NotSized -> do
case Expr
t0 of
Quant PiSigma
Pi (TBind Name
x (Domain Expr
domt Kind
ki Dec
dec)) Expr
b | Expr -> Bool
isSize Expr
domt -> do
String
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall (m :: * -> *). Monad m => String -> m ()
traceM (String
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ())
-> String
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall a b. (a -> b) -> a -> b
$ String
"Warning: data " String -> String -> String
forall a. [a] -> [a] -> [a]
++ Name -> String
forall a. Show a => a -> String
show Name
n String -> String -> String
forall a. [a] -> [a] -> [a]
++
String
" looks like you want to define a sized type, did you forget keyword `sized`?"
Expr
_ -> () -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall a.
a -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
forall (m :: * -> *) a. Monad m => a -> m a
return ()
(Int, [Pol], Expr)
-> StateT
TCState
(ReaderT TCContext (ExceptT TraceError IO))
(Int, [Pol], Expr)
forall a.
a -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
forall (m :: * -> *) a. Monad m => a -> m a
return (Int
params, [Pol]
pos0, Expr
t0)
let dt = (Telescope -> Expr -> Expr
teleToType Telescope
tel0 Expr
t)
echoTySig n dt
Kinded ki0 (ds, dte) <- checkDataType p' dt
let ki = Kind -> Kind
dataKind Kind
ki0
echoKindedTySig ki n dte
v <- whnf emptyEnv dte
Just fkind <- extractKind v
let (tel, dtcore) = typeToTele' params dte
cs0 <- mapM (insertConstructorTele tel dtcore) cs0
let cis = Co -> Name -> Telescope -> [Constructor] -> [ConstructorInfo]
analyzeConstructors Co
co Name
n Telescope
tel [Constructor]
cs0
let cs = (ConstructorInfo -> Constructor)
-> [ConstructorInfo] -> [Constructor]
forall a b. (a -> b) -> [a] -> [b]
map ConstructorInfo -> Constructor
reassembleConstructor [ConstructorInfo]
cis
addSig n (DataSig { numPars = params
, positivity = pos
, isSized = sz
, isCo = co
, symbTyp = v
, symbolKind = ki
, constructors = cis
, etaExpand = False
, isTuple = False
, extrTyp = fkind
})
when (sz == Sized) $
szType co params v
(isRecList, kcse) <- liftM unzip $
mapM (typeCheckConstructor n dte sz co pos tel) cs
let newki = case ((Kind -> Kind -> Kind) -> Kind -> [Kind] -> Kind
forall b a. (b -> a -> b) -> b -> [a] -> b
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl Kind -> Kind -> Kind
unionKind Kind
NoKind ((Kinded Constructor -> Kind) -> [Kinded Constructor] -> [Kind]
forall a b. (a -> b) -> [a] -> [b]
map Kinded Constructor -> Kind
forall a. Kinded a -> Kind
kindOf [Kinded Constructor]
kcse)) of
Kind
NoKind -> Kind
kType
Kind
AnyKind -> Kind
AnyKind
Kind Sort Expr
s Sort Expr
s' -> Sort Expr -> Sort Expr -> Kind
Kind (Expr -> Sort Expr
forall a. a -> Sort a
Set Expr
Zero) Sort Expr
s'
sol <- solveConstraints
resetConstraints
let decls = [[Declaration]] -> [Declaration]
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat ([[Declaration]] -> [Declaration])
-> [[Declaration]] -> [Declaration]
forall a b. (a -> b) -> a -> b
$ (ConstructorInfo -> [Declaration])
-> [ConstructorInfo] -> [[Declaration]]
forall a b. (a -> b) -> [a] -> [b]
map ConstructorInfo -> [Declaration]
mkDestrs [ConstructorInfo]
cis
mkDestrs ConstructorInfo
ci | ConstructorInfo -> Bool
cEtaExp ConstructorInfo
ci = [[Declaration]] -> [Declaration]
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat ([[Declaration]] -> [Declaration])
-> [[Declaration]] -> [Declaration]
forall a b. (a -> b) -> a -> b
$ (FieldInfo -> [Declaration]) -> [FieldInfo] -> [[Declaration]]
forall a b. (a -> b) -> [a] -> [b]
map FieldInfo -> [Declaration]
mkDestr (ConstructorInfo -> [FieldInfo]
cFields ConstructorInfo
ci)
| Bool
otherwise = []
mkDestr FieldInfo
fi =
case (FieldInfo -> FieldClass
fClass FieldInfo
fi) of
Field (Just (Expr
ty, Arity
arity, Clause
cl)) | Bool -> Bool
not (Dec -> Bool
forall pol. Polarity pol => pol -> Bool
erased (Dec -> Bool) -> Dec -> Bool
forall a b. (a -> b) -> a -> b
$ FieldInfo -> Dec
fDec FieldInfo
fi) Bool -> Bool -> Bool
&& Bool -> Bool
not (Name -> Bool
emptyName (Name -> Bool) -> Name -> Bool
forall a b. (a -> b) -> a -> b
$ FieldInfo -> Name
fName FieldInfo
fi) ->
let n' :: Name
n' = FieldInfo -> Name
fName FieldInfo
fi
n :: Name
n = Name -> Name
internal Name
n'
in
[Bool -> Co -> [Fun] -> Declaration
MutualFunDecl Bool
False Co
Ind [TySig Expr -> Name -> Arity -> [Clause] -> Fun
Fun (Name -> Expr -> TySig Expr
forall a. Name -> a -> TySig a
TypeSig Name
n Expr
ty) Name
n' Arity
arity [Clause
cl]]]
FieldClass
_ -> []
when (not (null decls)) $
traceCheckM $ "generated destructors: " ++ show decls
declse <- mapM (\ d :: Declaration
d@(MutualFunDecl Bool
False Co
co [Fun (TypeSig Name
n Expr
t) Name
n' Arity
ar [Clause]
cls]) -> do
Maybe DefId -> TypeCheck [Declaration] -> TypeCheck [Declaration]
forall a.
Maybe DefId
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
forall (m :: * -> *) a. MonadCxt m => Maybe DefId -> m a -> m a
checkingMutual Maybe DefId
forall a. Maybe a
Nothing (TypeCheck [Declaration] -> TypeCheck [Declaration])
-> TypeCheck [Declaration] -> TypeCheck [Declaration]
forall a b. (a -> b) -> a -> b
$ Declaration -> TypeCheck [Declaration]
typeCheckDeclaration Declaration
d)
decls
let isPatIndFam = (ConstructorInfo -> Bool) -> [ConstructorInfo] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all (\ ConstructorInfo
ci -> (PatternsType, [Pattern]) -> PatternsType
forall a b. (a, b) -> a
fst (ConstructorInfo -> (PatternsType, [Pattern])
cPatFam ConstructorInfo
ci) PatternsType -> PatternsType -> Bool
forall a. Eq a => a -> a -> Bool
/= PatternsType
NotPatterns Bool -> Bool -> Bool
&& ConstructorInfo -> Bool
cEtaExp ConstructorInfo
ci) [ConstructorInfo]
cis
let disableRec ConstructorInfo
ci Bool
rec' = ConstructorInfo
ci
{ cRec = rec'
, cEtaExp = cEtaExp ci
&& fst (cPatFam ci) /= NotPatterns
&& not (co==Ind && rec') }
let cis' = (ConstructorInfo -> Bool -> ConstructorInfo)
-> [ConstructorInfo] -> [Bool] -> [ConstructorInfo]
forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith ConstructorInfo -> Bool -> ConstructorInfo
disableRec [ConstructorInfo]
cis [Bool]
isRecList
let typeEtaExpandable = Bool
isPatIndFam Bool -> Bool -> Bool
&& ([ConstructorInfo] -> Bool
forall a. Null a => a -> Bool
null [ConstructorInfo]
cis Bool -> Bool -> Bool
|| (ConstructorInfo -> Bool) -> [ConstructorInfo] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any ConstructorInfo -> Bool
cEtaExp [ConstructorInfo]
cis')
traceEtaM $ "data " ++ show n ++ " eta-expandable " ++ show typeEtaExpandable ++ " constructors " ++ show cis'
modifySig n (\ SigDef
dataSig ->
SigDef
dataSig { symbolKind = newki
, etaExpand = typeEtaExpandable
, constructors = cis'
, isTuple = length cis' >= 1 && isPatIndFam
})
let (tele, te) = typeToTele' (size tel) dte
return $ (DataDecl n sz co pos tele te (map valueOf kcse) fields) : concat declse
)
insertConstructorTele :: Telescope -> Type -> Constructor -> TypeCheck Constructor
insertConstructorTele :: Telescope
-> Expr
-> Constructor
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) Constructor
insertConstructorTele Telescope
dtel Expr
dt c :: Constructor
c@(Constructor QName
n Maybe (Telescope, [Pattern])
Nothing Expr
t) = Constructor
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) Constructor
forall a.
a -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
forall (m :: * -> *) a. Monad m => a -> m a
return Constructor
c
insertConstructorTele Telescope
dtel Expr
dt c :: Constructor
c@(Constructor QName
n Just{} Expr
t) = do
res <- Telescope -> Expr -> Expr -> TypeCheck (Telescope, [Pattern])
computeConstructorTele Telescope
dtel Expr
dt Expr
t
return $ Constructor n (Just res) t
computeConstructorTele :: Telescope -> Type -> Type -> TypeCheck (Telescope, [Pattern])
computeConstructorTele :: Telescope -> Expr -> Expr -> TypeCheck (Telescope, [Pattern])
computeConstructorTele Telescope
dtel Expr
dt Expr
t = do
let (Telescope
_, Expr
target) = Expr -> (Telescope, Expr)
typeToTele Expr
t
(Expr
_, [Expr]
es) = Expr -> (Expr, [Expr])
spineView Expr
target
pars :: [Expr]
pars = Int -> [Expr] -> [Expr]
forall a. Int -> [a] -> [a]
take (Telescope -> Int
forall a. Size a => a -> Int
size Telescope
dtel) [Expr]
es
(cxt, ps) <- [Expr] -> TVal -> TypeCheck (TCContext, [Pattern])
checkConstructorParams [Expr]
pars (TVal -> TypeCheck (TCContext, [Pattern]))
-> TypeCheck TVal -> TypeCheck (TCContext, [Pattern])
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< Expr -> TypeCheck TVal
whnf' (Telescope -> Expr -> Expr
teleToType Telescope
dtel Expr
dt)
(,ps) . setDec (Dec Param) <$> do local (const cxt) $ contextToTele cxt
checkConstructorParams :: [Expr] -> TVal -> TypeCheck (TCContext, [Pattern])
checkConstructorParams :: [Expr] -> TVal -> TypeCheck (TCContext, [Pattern])
checkConstructorParams [Expr]
es TVal
tv = do
ps <- (Expr
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) Pattern)
-> [Expr]
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) [Pattern]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> [a] -> m [b]
mapM (\ Expr
e -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Pattern
-> (Pattern
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) Pattern)
-> Maybe Pattern
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) Pattern
forall b a. b -> (a -> b) -> Maybe a -> b
maybe (Expr
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) Pattern
forall {m :: * -> *} {p} {a}. MonadError TraceError m => p -> m a
errorParamNotPattern Expr
e) Pattern
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) Pattern
forall a.
a -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
forall (m :: * -> *) a. Monad m => a -> m a
return (Maybe Pattern
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) Pattern)
-> Maybe Pattern
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) Pattern
forall a b. (a -> b) -> a -> b
$ Expr -> Maybe Pattern
exprToPattern Expr
e) [Expr]
es
([],_,cxt,_,_,_,False) <- checkPatterns defaultDec [] emptySub tv ps
return (cxt, ps)
where
errorParamNotPattern :: p -> m a
errorParamNotPattern p
e = String -> m a
forall (m :: * -> *) a. MonadError TraceError m => String -> m a
throwErrorMsg (String -> m a) -> String -> m a
forall a b. (a -> b) -> a -> b
$
String
"expected parameter to be a pattern, but I found " String -> String -> String
forall a. [a] -> [a] -> [a]
++ [Expr] -> String
forall a. Show a => a -> String
show [Expr]
es
contextToTele :: TCContext -> TypeCheck Telescope
contextToTele :: TCContext
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) Telescope
contextToTele TCContext
ce = do
let n :: Int
n :: Int
n = SemCxt -> Int
len (TCContext -> SemCxt
context TCContext
ce)
delta :: Map Int (OneOrTwo Domain)
delta :: Map Int (OneOrTwo Domain)
delta = SemCxt -> Map Int (OneOrTwo Domain)
cxt (TCContext -> SemCxt
context TCContext
ce)
names :: Map Int Name
names :: Map Int Name
names = TCContext -> Map Int Name
naming TCContext
ce
[TBind] -> Telescope
Telescope ([TBind] -> Telescope)
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) [TBind]
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) Telescope
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> do
[Int]
-> (Int
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) TBind)
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) [TBind]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
t a -> (a -> m b) -> m (t b)
forM [Int
0..Int
nInt -> Int -> Int
forall a. Num a => a -> a -> a
-Int
1] ((Int
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) TBind)
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) [TBind])
-> (Int
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) TBind)
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) [TBind]
forall a b. (a -> b) -> a -> b
$ \ Int
k -> do
x <- Int
-> Map Int Name
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Name
forall (m :: * -> *) k v.
(MonadError TraceError m, Show k, Ord k) =>
k -> Map k v -> m v
lookupM Int
k Map Int Name
names
One dom <- lookupM k delta
TBind x <$> Traversable.traverse toExpr dom
typeCheckConstructor :: Name -> Type -> Sized -> Co -> [Pol] -> Telescope -> Constructor -> TypeCheck (Bool, Kinded EConstructor)
typeCheckConstructor :: Name
-> Expr
-> Sized
-> Co
-> [Pol]
-> Telescope
-> Constructor
-> StateT
TCState
(ReaderT TCContext (ExceptT TraceError IO))
(Bool, Kinded Constructor)
typeCheckConstructor Name
d Expr
dt Sized
sz Co
co [Pol]
pos Telescope
dtel (Constructor QName
n Maybe (Telescope, [Pattern])
mctel Expr
t) = String
-> StateT
TCState
(ReaderT TCContext (ExceptT TraceError IO))
(Bool, Kinded Constructor)
-> StateT
TCState
(ReaderT TCContext (ExceptT TraceError IO))
(Bool, Kinded Constructor)
forall (m :: * -> *) a.
MonadError TraceError m =>
String -> m a -> m a
enter (String
"constructor " String -> String -> String
forall a. [a] -> [a] -> [a]
++ QName -> String
forall a. Show a => a -> String
show QName
n) (StateT
TCState
(ReaderT TCContext (ExceptT TraceError IO))
(Bool, Kinded Constructor)
-> StateT
TCState
(ReaderT TCContext (ExceptT TraceError IO))
(Bool, Kinded Constructor))
-> StateT
TCState
(ReaderT TCContext (ExceptT TraceError IO))
(Bool, Kinded Constructor)
-> StateT
TCState
(ReaderT TCContext (ExceptT TraceError IO))
(Bool, Kinded Constructor)
forall a b. (a -> b) -> a -> b
$ do
let tel :: Telescope
tel = Telescope
-> ((Telescope, [Pattern]) -> Telescope)
-> Maybe (Telescope, [Pattern])
-> Telescope
forall b a. b -> (a -> b) -> Maybe a -> b
maybe Telescope
dtel (Telescope, [Pattern]) -> Telescope
forall a b. (a, b) -> a
fst Maybe (Telescope, [Pattern])
mctel
sig <- (TCState -> Signature)
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) Signature
forall s (m :: * -> *) a. MonadState s m => (s -> a) -> m a
gets TCState -> Signature
signature
let telE = Dec -> Telescope -> Telescope
forall a. LensDec a => Dec -> a -> a
setDec Dec
irrelevantDec Telescope
tel
let tt = Telescope -> Expr -> Expr
teleToType Telescope
telE Expr
t
echoTySig n tt
let params = Telescope -> Int
forall a. Size a => a -> Int
size Telescope
tel
let telWithD = [TBind] -> Telescope
Telescope ([TBind] -> Telescope) -> [TBind] -> Telescope
forall a b. (a -> b) -> a -> b
$ (Name -> Dom Expr -> TBind
forall a. Name -> Dom a -> TBinding a
TBind Name
d (Dom Expr -> TBind) -> Dom Expr -> TBind
forall a b. (a -> b) -> a -> b
$ Expr -> Kind -> Dec -> Dom Expr
forall a. a -> Kind -> Dec -> Dom a
Domain Expr
dt Kind
NoKind (Dec -> Dom Expr) -> Dec -> Dom Expr
forall a b. (a -> b) -> a -> b
$ Pol -> Dec
forall pos. pos -> Decoration pos
Dec Pol
SPos) TBind -> [TBind] -> [TBind]
forall a. a -> [a] -> [a]
: Telescope -> [TBind]
telescope Telescope
tel
Kinded ki te <- addBinds telWithD $
checkConType sz t
dv <- whnf' dt
let (Telescope argts,target) = typeToTele te
whenNothing mctel $
addBinds telWithD $ addBinds (Telescope argts) $ checkTarget d dv tel target
let mkName a
i Name
n | Name -> Bool
emptyName Name
n = String -> Name
fresh (String -> Name) -> String -> Name
forall a b. (a -> b) -> a -> b
$ String
"y" String -> String -> String
forall a. [a] -> [a] -> [a]
++ a -> String
forall a. Show a => a -> String
show a
i
| Bool
otherwise = Name
n
fields = (TBind -> Name) -> [TBind] -> [Name]
forall a b. (a -> b) -> [a] -> [b]
map TBind -> Name
forall a. TBinding a -> Name
boundName [TBind]
argts
argns = (Integer -> Name -> Name) -> [Integer] -> [Name] -> [Name]
forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith Integer -> Name -> Name
forall {a}. Show a => a -> Name -> Name
mkName [Integer
0..] ([Name] -> [Name]) -> [Name] -> [Name]
forall a b. (a -> b) -> a -> b
$ [Name]
fields
argtbs = (Name -> TBind -> TBind) -> [Name] -> [TBind] -> [TBind]
forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith (\ Name
n TBind
tb -> TBind
tb { boundName = n }) [Name]
argns [TBind]
argts
core = RecInfo -> [(Name, Expr)] -> Expr
Record (ConK -> QName -> Bool -> Dotted -> RecInfo
NamedRec (Co -> ConK
coToConK Co
co) QName
n Bool
False Dotted
notDotted) ([(Name, Expr)] -> Expr) -> [(Name, Expr)] -> Expr
forall a b. (a -> b) -> a -> b
$ [Name] -> [Expr] -> [(Name, Expr)]
forall a b. [a] -> [b] -> [(a, b)]
zip [Name]
fields ([Expr] -> [(Name, Expr)]) -> [Expr] -> [(Name, Expr)]
forall a b. (a -> b) -> a -> b
$ (Name -> Expr) -> [Name] -> [Expr]
forall a b. (a -> b) -> [a] -> [b]
map Name -> Expr
Var [Name]
argns
tsing = Telescope -> Expr -> Expr
teleToType ([TBind] -> Telescope
Telescope [TBind]
argtbs) (Expr -> Expr) -> Expr -> Expr
forall a b. (a -> b) -> a -> b
$ Expr -> Expr -> Expr
Sing Expr
core Expr
target
let tte = Telescope -> Expr -> Expr
teleToType Telescope
telE Expr
tsing
vt <- whnf' tte
mutualNames <- asks mutualNames
let mutOcc TBind
tb = Bool -> Bool
not (Bool -> Bool) -> Bool -> Bool
forall a b. (a -> b) -> a -> b
$ [Name] -> Bool
forall a. Null a => a -> Bool
null ([Name] -> Bool) -> [Name] -> Bool
forall a b. (a -> b) -> a -> b
$ [Name] -> [Name] -> [Name]
forall a. Eq a => [a] -> [a] -> [a]
List.intersect (Name
dName -> [Name] -> [Name]
forall a. a -> [a] -> [a]
:[Name]
mutualNames) ([Name] -> [Name]) -> [Name] -> [Name]
forall a b. (a -> b) -> a -> b
$ Expr -> [Name]
forall a. UsedDefs a => a -> [Name]
usedDefs (Expr -> [Name]) -> Expr -> [Name]
forall a b. (a -> b) -> a -> b
$ TBind -> Expr
boundType TBind
tb
recOccs = (TBind -> Bool) -> [TBind] -> [Bool]
forall a b. (a -> b) -> [a] -> [b]
map TBind -> Bool
mutOcc [TBind]
argts
isRec = [Bool] -> Bool
forall (t :: * -> *). Foldable t => t Bool -> Bool
or [Bool]
recOccs
let fType = QName -> Expr
undefinedFType QName
n
isSz <- if sz /= Sized then return Nothing else do
szConstructor d co params vt
if co == CoInd then return $ Just $ error "impossible lhs type of coconstructor" else do
let (x, lte) = mapSnd (teleToType telE) $ mkConLType params te
echoKindedTySig kTerm n lte
ltv <- whnf' lte
return $ Just (x, ltv)
let cpars = ((Telescope, [Pattern]) -> ([Name], [Pattern]))
-> Maybe (Telescope, [Pattern]) -> Maybe ([Name], [Pattern])
forall a b. (a -> b) -> Maybe a -> Maybe b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ((Telescope -> [Name])
-> (Telescope, [Pattern]) -> ([Name], [Pattern])
forall a c d. (a -> c) -> (a, d) -> (c, d)
mapFst ((TBind -> Name) -> [TBind] -> [Name]
forall a b. (a -> b) -> [a] -> [b]
map TBind -> Name
forall a. TBinding a -> Name
boundName ([TBind] -> [Name])
-> (Telescope -> [TBind]) -> Telescope -> [Name]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Telescope -> [TBind]
telescope)) Maybe (Telescope, [Pattern])
mctel
addSigQ n (ConSig cpars isSz recOccs vt d (size dtel) fType)
echoKindedTySig kTerm n tte
return (isRec, Kinded ki $ Constructor n (fmap (mapFst (const telE)) mctel) te)
typeCheckMeasuredFuns :: Co -> [Fun] -> TypeCheck [EFun]
typeCheckMeasuredFuns :: Co -> [Fun] -> TypeCheck [Fun]
typeCheckMeasuredFuns Co
co [Fun]
funs0 = do
kfse <- (Fun
-> StateT
TCState
(ReaderT TCContext (ExceptT TraceError IO))
(Kinded (TySig Expr)))
-> [Fun]
-> StateT
TCState
(ReaderT TCContext (ExceptT TraceError IO))
[Kinded (TySig Expr)]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> [a] -> m [b]
mapM Fun
-> StateT
TCState
(ReaderT TCContext (ExceptT TraceError IO))
(Kinded (TySig Expr))
typeCheckFunSig [Fun]
funs0
let funs = (Kinded (TySig Expr) -> Fun -> Fun)
-> [Kinded (TySig Expr)] -> [Fun] -> [Fun]
forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith (\ (Kinded Kind
ki TySig Expr
ts) Fun
f -> Fun
f { funTypeSig = ts }) [Kinded (TySig Expr)]
kfse [Fun]
funs0
kcle <- installFuns co (zipWith Kinded (map kindOf kfse) funs) $
mapM typeCheckFunClauses funs
let kis = (Kinded [Clause] -> Kind) -> [Kinded [Clause]] -> [Kind]
forall a b. (a -> b) -> [a] -> [b]
map Kinded [Clause] -> Kind
forall a. Kinded a -> Kind
kindOf [Kinded [Clause]]
kcle
let clse = (Kinded [Clause] -> [Clause]) -> [Kinded [Clause]] -> [[Clause]]
forall a b. (a -> b) -> [a] -> [b]
map Kinded [Clause] -> [Clause]
forall a. Kinded a -> a
valueOf [Kinded [Clause]]
kcle
let funse = (TySig Expr -> Name -> Arity -> [Clause] -> Fun)
-> [TySig Expr] -> [Name] -> [Arity] -> [[Clause]] -> [Fun]
forall a b c d e.
(a -> b -> c -> d -> e) -> [a] -> [b] -> [c] -> [d] -> [e]
List.zipWith4 TySig Expr -> Name -> Arity -> [Clause] -> Fun
Fun
((Kinded (TySig Expr) -> TySig Expr)
-> [Kinded (TySig Expr)] -> [TySig Expr]
forall a b. (a -> b) -> [a] -> [b]
map ((Expr -> Expr) -> TySig Expr -> TySig Expr
forall a b. (a -> b) -> TySig a -> TySig b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Expr -> Expr
eraseMeasure (TySig Expr -> TySig Expr)
-> (Kinded (TySig Expr) -> TySig Expr)
-> Kinded (TySig Expr)
-> TySig Expr
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Kinded (TySig Expr) -> TySig Expr
forall a. Kinded a -> a
valueOf) [Kinded (TySig Expr)]
kfse)
((Fun -> Name) -> [Fun] -> [Name]
forall a b. (a -> b) -> [a] -> [b]
map Fun -> Name
funExtName [Fun]
funs)
((Fun -> Arity) -> [Fun] -> [Arity]
forall a b. (a -> b) -> [a] -> [b]
map Fun -> Arity
funArity [Fun]
funs)
[[Clause]]
clse
mapM_ (\ (Fun (TypeSig Name
n Expr
t) Name
n' Arity
ar [Clause]
cls) -> do
String
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall (m :: * -> *). MonadIO m => String -> m ()
echoR (String
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ())
-> String
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall a b. (a -> b) -> a -> b
$ (Doc -> String
PP.render (Doc -> String) -> Doc -> String
forall a b. (a -> b) -> a -> b
$ Name -> [Clause] -> Doc
prettyFun Name
n [Clause]
cls))
funse
zipWithM_ (enableSig co) (zipWith intersectKind kis $ map kindOf kfse) funse
return $ funse
where
enableSig :: Co -> Kind -> Fun -> TypeCheck ()
enableSig :: Co
-> Kind
-> Fun
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
enableSig Co
co Kind
ki (Fun (TypeSig Name
n Expr
t) Name
n' Arity
ar' [Clause]
cl') = do
vt <- Expr -> TypeCheck TVal
whnf' Expr
t
addSig n (FunSig co vt ki ar' cl' True $ undefinedFType $ QName n)
v <- up False (vFun n) vt
addSig n' (LetSig vt ki v $ undefinedFType $ QName n')
typeCheckFunBody :: Co -> Kind -> Fun -> TypeCheck EFun
typeCheckFunBody :: Co -> Kind -> Fun -> TypeCheck Fun
typeCheckFunBody Co
co Kind
ki0 fun :: Fun
fun@(Fun ts :: TySig Expr
ts@(TypeSig Name
n Expr
t) Name
n' Arity
ar [Clause]
cls0) = do
Co
-> Kinded Fun
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
addFunSig Co
co (Kinded Fun
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ())
-> Kinded Fun
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall a b. (a -> b) -> a -> b
$ Kind -> Fun -> Kinded Fun
forall a. Kind -> a -> Kinded a
Kinded Kind
ki0 Fun
fun
Kinded ki clse <- Co
-> StateT
TCState
(ReaderT TCContext (ExceptT TraceError IO))
(Kinded [Clause])
-> StateT
TCState
(ReaderT TCContext (ExceptT TraceError IO))
(Kinded [Clause])
forall a.
Co
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
forall (m :: * -> *) a. MonadCxt m => Co -> m a -> m a
setCo Co
co (StateT
TCState
(ReaderT TCContext (ExceptT TraceError IO))
(Kinded [Clause])
-> StateT
TCState
(ReaderT TCContext (ExceptT TraceError IO))
(Kinded [Clause]))
-> StateT
TCState
(ReaderT TCContext (ExceptT TraceError IO))
(Kinded [Clause])
-> StateT
TCState
(ReaderT TCContext (ExceptT TraceError IO))
(Kinded [Clause])
forall a b. (a -> b) -> a -> b
$ Fun
-> StateT
TCState
(ReaderT TCContext (ExceptT TraceError IO))
(Kinded [Clause])
typeCheckFunClauses Fun
fun
echoR $ (PP.render $ prettyFun n clse)
let fune = TySig Expr -> Name -> Arity -> [Clause] -> Fun
Fun TySig Expr
ts Name
n' Arity
ar [Clause]
clse
enableSig ki fune
return fune
typeCheckFuns :: Co -> [Fun] -> TypeCheck [EFun]
typeCheckFuns :: Co -> [Fun] -> TypeCheck [Fun]
typeCheckFuns Co
co [Fun]
funs0 = do
kfse <- (Fun
-> StateT
TCState
(ReaderT TCContext (ExceptT TraceError IO))
(Kinded (TySig Expr)))
-> [Fun]
-> StateT
TCState
(ReaderT TCContext (ExceptT TraceError IO))
[Kinded (TySig Expr)]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> [a] -> m [b]
mapM Fun
-> StateT
TCState
(ReaderT TCContext (ExceptT TraceError IO))
(Kinded (TySig Expr))
typeCheckFunSig [Fun]
funs0
let kfuns = (Kinded (TySig Expr) -> Fun -> Kinded Fun)
-> [Kinded (TySig Expr)] -> [Fun] -> [Kinded Fun]
forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith (\ (Kinded Kind
ki TySig Expr
ts) (Fun TySig Expr
ts0 Name
n' Arity
ar [Clause]
cls) -> Kind -> Fun -> Kinded Fun
forall a. Kind -> a -> Kinded a
Kinded Kind
ki (TySig Expr -> Name -> Arity -> [Clause] -> Fun
Fun TySig Expr
ts Name
n' Arity
ar [Clause]
cls)) [Kinded (TySig Expr)]
kfse [Fun]
funs0
mapM_ (addFunSig co) kfuns
let funs = (Kinded Fun -> Fun) -> [Kinded Fun] -> [Fun]
forall a b. (a -> b) -> [a] -> [b]
map Kinded Fun -> Fun
forall a. Kinded a -> a
valueOf [Kinded Fun]
kfuns
kce <- setCo co $ mapM typeCheckFunClauses funs
let kis = (Kinded [Clause] -> Kind) -> [Kinded [Clause]] -> [Kind]
forall a b. (a -> b) -> [a] -> [b]
map Kinded [Clause] -> Kind
forall a. Kinded a -> Kind
kindOf [Kinded [Clause]]
kce
let clse = (Kinded [Clause] -> [Clause]) -> [Kinded [Clause]] -> [[Clause]]
forall a b. (a -> b) -> [a] -> [b]
map Kinded [Clause] -> [Clause]
forall a. Kinded a -> a
valueOf [Kinded [Clause]]
kce
let names = (Fun -> Name) -> [Fun] -> [Name]
forall a b. (a -> b) -> [a] -> [b]
map (\ (Fun (TypeSig Name
n Expr
t) Name
n' Arity
ar [Clause]
cls) -> Name
n) [Fun]
funs
clse <- zipWithM (\ (Fun TySig Expr
tysig Name
_ Arity
_ [Clause]
_) [Clause]
cls' -> Co
-> [Name]
-> TySig Expr
-> [Clause]
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) [Clause]
admCheckFunSig Co
co [Name]
names TySig Expr
tysig [Clause]
cls') funs clse
let funse = (TySig Expr -> Name -> Arity -> [Clause] -> Fun)
-> [TySig Expr] -> [Name] -> [Arity] -> [[Clause]] -> [Fun]
forall a b c d e.
(a -> b -> c -> d -> e) -> [a] -> [b] -> [c] -> [d] -> [e]
List.zipWith4 TySig Expr -> Name -> Arity -> [Clause] -> Fun
Fun
((Kinded (TySig Expr) -> TySig Expr)
-> [Kinded (TySig Expr)] -> [TySig Expr]
forall a b. (a -> b) -> [a] -> [b]
map Kinded (TySig Expr) -> TySig Expr
forall a. Kinded a -> a
valueOf [Kinded (TySig Expr)]
kfse)
((Fun -> Name) -> [Fun] -> [Name]
forall a b. (a -> b) -> [a] -> [b]
map Fun -> Name
funExtName [Fun]
funs)
((Fun -> Arity) -> [Fun] -> [Arity]
forall a b. (a -> b) -> [a] -> [b]
map Fun -> Arity
funArity [Fun]
funs)
[[Clause]]
clse
mapM_ (\ (Fun (TypeSig Name
n Expr
t) Name
n' Arity
ar [Clause]
cls) -> do
String
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall (m :: * -> *). MonadIO m => String -> m ()
echoR (String
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ())
-> String
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall a b. (a -> b) -> a -> b
$ (Doc -> String
PP.render (Doc -> String) -> Doc -> String
forall a b. (a -> b) -> a -> b
$ Name -> [Clause] -> Doc
prettyFun Name
n [Clause]
cls))
funse
terminationCheck funse
zipWithM_ enableSig kis funse
return $ funse
addFunSig :: Co -> Kinded Fun -> TypeCheck ()
addFunSig :: Co
-> Kinded Fun
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
addFunSig Co
co (Kinded Kind
ki (Fun (TypeSig Name
n Expr
t) Name
n' Arity
ar [Clause]
cl)) = do
sig <- (TCState -> Signature)
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) Signature
forall s (m :: * -> *) a. MonadState s m => (s -> a) -> m a
gets TCState -> Signature
signature
vt <- whnf' t
addSig n (FunSig co vt ki ar cl False $ undefinedFType $ QName n)
admCheckFunSig :: Co -> [Name] -> TypeSig -> [Clause] -> TypeCheck [Clause]
admCheckFunSig :: Co
-> [Name]
-> TySig Expr
-> [Clause]
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) [Clause]
admCheckFunSig Co
CoInd [Name]
mutualNames (TypeSig Name
n Expr
t) [Clause]
cls = [Clause]
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) [Clause]
forall a.
a -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
forall (m :: * -> *) a. Monad m => a -> m a
return [Clause]
cls
admCheckFunSig co :: Co
co@Co
Ind [Name]
mutualNames (TypeSig Name
n Expr
t) [Clause]
cls = String
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) [Clause]
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) [Clause]
forall a. String -> a -> a
traceAdm (String
"admCheckFunSig: checking admissibility of " String -> String -> String
forall a. [a] -> [a] -> [a]
++ Name -> String
forall a. Show a => a -> String
show Name
n String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
" : " String -> String -> String
forall a. [a] -> [a] -> [a]
++ Expr -> String
forall a. Show a => a -> String
show Expr
t) (StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) [Clause]
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) [Clause])
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) [Clause]
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) [Clause]
forall a b. (a -> b) -> a -> b
$
(
do
let usedNames :: [Name]
usedNames = [Clause] -> [Name]
rhsDefs [Clause]
cls
let notRecursive :: Bool
notRecursive = (Name -> Bool) -> [Name] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all (\ Name
n -> Bool -> Bool
not (Name
n Name -> [Name] -> Bool
forall a. Eq a => a -> [a] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [Name]
usedNames)) [Name]
mutualNames
if Bool
notRecursive then
[Clause]
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) [Clause]
forall a.
a -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
forall (m :: * -> *) a. Monad m => a -> m a
return [Clause]
cls
else
do vt <- Expr -> TypeCheck TVal
whnf' Expr
t
admFunDef co cls vt
) StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) [Clause]
-> String
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) [Clause]
forall (m :: * -> *) a.
MonadError TraceError m =>
m a -> String -> m a
`throwTrace` (String
"checking type of " String -> String -> String
forall a. [a] -> [a] -> [a]
++ Name -> String
forall a. Show a => a -> String
show Name
n String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
" for admissibility")
enableSig :: Kind -> Fun -> TypeCheck ()
enableSig :: Kind
-> Fun
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
enableSig Kind
ki (Fun (TypeSig Name
n Expr
_) Name
n' Arity
ar' [Clause]
cl') = do
(FunSig co vt ki0 ar cl _ ftyp) <- Name
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) SigDef
forall (m :: * -> *). MonadSig m => Name -> m SigDef
lookupSymb Name
n
addSig n (FunSig co vt (intersectKind ki ki0) ar cl' True ftyp)
v <- up False (vFun n) vt
addSig n' (LetSig vt ki v ftyp)
typeCheckFunSig :: Fun -> TypeCheck (Kinded ETypeSig)
typeCheckFunSig :: Fun
-> StateT
TCState
(ReaderT TCContext (ExceptT TraceError IO))
(Kinded (TySig Expr))
typeCheckFunSig (Fun (TypeSig Name
n Expr
t) Name
n' Arity
ar [Clause]
cls) = String
-> StateT
TCState
(ReaderT TCContext (ExceptT TraceError IO))
(Kinded (TySig Expr))
-> StateT
TCState
(ReaderT TCContext (ExceptT TraceError IO))
(Kinded (TySig Expr))
forall (m :: * -> *) a.
MonadError TraceError m =>
String -> m a -> m a
enter (String
"type of " String -> String -> String
forall a. [a] -> [a] -> [a]
++ Name -> String
forall a. Show a => a -> String
show Name
n) (StateT
TCState
(ReaderT TCContext (ExceptT TraceError IO))
(Kinded (TySig Expr))
-> StateT
TCState
(ReaderT TCContext (ExceptT TraceError IO))
(Kinded (TySig Expr)))
-> StateT
TCState
(ReaderT TCContext (ExceptT TraceError IO))
(Kinded (TySig Expr))
-> StateT
TCState
(ReaderT TCContext (ExceptT TraceError IO))
(Kinded (TySig Expr))
forall a b. (a -> b) -> a -> b
$ do
Name
-> Expr
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall n (m :: * -> *). (Show n, MonadIO m) => n -> Expr -> m ()
echoTySig Name
n Expr
t
Kinded ki0 te <- Expr -> TypeCheck (Kinded Expr)
checkType Expr
t
let ki = Kind -> Kind
predKind Kind
ki0
echoKindedTySig ki n (eraseMeasure te)
return $ Kinded ki $ TypeSig n te
typeCheckFunClauses :: Fun -> TypeCheck (Kinded [EClause])
typeCheckFunClauses :: Fun
-> StateT
TCState
(ReaderT TCContext (ExceptT TraceError IO))
(Kinded [Clause])
typeCheckFunClauses (Fun (TypeSig Name
n Expr
t) Name
n' Arity
ar [Clause]
cl) = String
-> StateT
TCState
(ReaderT TCContext (ExceptT TraceError IO))
(Kinded [Clause])
-> StateT
TCState
(ReaderT TCContext (ExceptT TraceError IO))
(Kinded [Clause])
forall (m :: * -> *) a.
MonadError TraceError m =>
String -> m a -> m a
enter (Name -> String
forall a. Show a => a -> String
show Name
n) (StateT
TCState
(ReaderT TCContext (ExceptT TraceError IO))
(Kinded [Clause])
-> StateT
TCState
(ReaderT TCContext (ExceptT TraceError IO))
(Kinded [Clause]))
-> StateT
TCState
(ReaderT TCContext (ExceptT TraceError IO))
(Kinded [Clause])
-> StateT
TCState
(ReaderT TCContext (ExceptT TraceError IO))
(Kinded [Clause])
forall a b. (a -> b) -> a -> b
$
do result@(Kinded _ cle) <- Expr
-> [Clause]
-> StateT
TCState
(ReaderT TCContext (ExceptT TraceError IO))
(Kinded [Clause])
checkFun Expr
t [Clause]
cl
return result
checkConType :: Sized -> Expr -> TypeCheck (Kinded Extr)
checkConType :: Sized -> Expr -> TypeCheck (Kinded Expr)
checkConType Sized
NotSized Expr
t = Expr -> TypeCheck (Kinded Expr)
checkConType' Expr
t
checkConType Sized
Sized Expr
t =
case Expr
t of
Quant PiSigma
Pi tb :: TBind
tb@(TBind Name
_ (Domain Expr
t1 Kind
_ Dec
_)) Expr
t2 | Expr -> Bool
isSize Expr
t1 -> do
TBind -> TypeCheck (Kinded Expr) -> TypeCheck (Kinded Expr)
forall a. TBind -> TypeCheck a -> TypeCheck a
addBind ((Dec -> Dec) -> TBind -> TBind
forall a. LensDec a => (Dec -> Dec) -> a -> a
mapDec (Dec -> Dec -> Dec
forall a b. a -> b -> a
const Dec
paramDec) TBind
tb) (TypeCheck (Kinded Expr) -> TypeCheck (Kinded Expr))
-> TypeCheck (Kinded Expr) -> TypeCheck (Kinded Expr)
forall a b. (a -> b) -> a -> b
$ do
Kinded ki t2e <- Expr -> TypeCheck (Kinded Expr)
checkConType' Expr
t2
return $ Kinded ki $ Quant Pi (mapDec (const irrelevantDec) tb) t2e
Expr
_ -> String -> TypeCheck (Kinded Expr)
forall (m :: * -> *) a. MonadError TraceError m => String -> m a
throwErrorMsg (String -> TypeCheck (Kinded Expr))
-> String -> TypeCheck (Kinded Expr)
forall a b. (a -> b) -> a -> b
$ String
"checkConType: expecting size quantification, found " String -> String -> String
forall a. [a] -> [a] -> [a]
++ Expr -> String
forall a. Show a => a -> String
show Expr
t
checkConType' :: Expr -> TypeCheck (Kinded Extr)
checkConType' :: Expr -> TypeCheck (Kinded Expr)
checkConType' Expr
t = do
(s, kte) <- Bool
-> StateT
TCState
(ReaderT TCContext (ExceptT TraceError IO))
(Sort TVal, Kinded Expr)
-> StateT
TCState
(ReaderT TCContext (ExceptT TraceError IO))
(Sort TVal, Kinded Expr)
forall a.
Bool
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
forall (m :: * -> *) a. MonadCxt m => Bool -> m a -> m a
checkingCon Bool
True (StateT
TCState
(ReaderT TCContext (ExceptT TraceError IO))
(Sort TVal, Kinded Expr)
-> StateT
TCState
(ReaderT TCContext (ExceptT TraceError IO))
(Sort TVal, Kinded Expr))
-> StateT
TCState
(ReaderT TCContext (ExceptT TraceError IO))
(Sort TVal, Kinded Expr)
-> StateT
TCState
(ReaderT TCContext (ExceptT TraceError IO))
(Sort TVal, Kinded Expr)
forall a b. (a -> b) -> a -> b
$ Expr
-> StateT
TCState
(ReaderT TCContext (ExceptT TraceError IO))
(Sort TVal, Kinded Expr)
inferType Expr
t
case s of
Set{} -> Kinded Expr -> TypeCheck (Kinded Expr)
forall a.
a -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
forall (m :: * -> *) a. Monad m => a -> m a
return Kinded Expr
kte
CoSet{} -> Kinded Expr -> TypeCheck (Kinded Expr)
forall a.
a -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
forall (m :: * -> *) a. Monad m => a -> m a
return Kinded Expr
kte
Sort TVal
_ -> String -> TypeCheck (Kinded Expr)
forall (m :: * -> *) a. MonadError TraceError m => String -> m a
throwErrorMsg (String -> TypeCheck (Kinded Expr))
-> String -> TypeCheck (Kinded Expr)
forall a b. (a -> b) -> a -> b
$ String
"checkConType: type " String -> String -> String
forall a. [a] -> [a] -> [a]
++ Expr -> String
forall a. Show a => a -> String
show Expr
t String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
" of constructor not a universe"
checkTarget :: Name -> TVal -> Telescope -> Type -> TypeCheck ()
checkTarget :: Name
-> TVal
-> Telescope
-> Expr
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
checkTarget Name
d TVal
dv Telescope
tel Expr
tg = do
tv <- Expr -> TypeCheck TVal
whnf' Expr
tg
case tv of
VApp (VDef (DefId IdKind
DatK (QName Name
n))) [TVal]
vs | Name
n Name -> Name -> Bool
forall a. Eq a => a -> a -> Bool
== Name
d -> do
telvs <- (TBind -> TypeCheck TVal)
-> [TBind]
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) [TVal]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> [a] -> m [b]
mapM (\ TBind
tb -> Expr -> TypeCheck TVal
whnf' (Name -> Expr
Var (TBind -> Name
forall a. TBinding a -> Name
boundName TBind
tb))) ([TBind]
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) [TVal])
-> [TBind]
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) [TVal]
forall a b. (a -> b) -> a -> b
$ Telescope -> [TBind]
telescope Telescope
tel
_ <- enter ("checking datatype parameters in constructor target") $
leqVals' N mixed (One dv) (take (size tel) vs) telvs
return ()
TVal
_ -> String
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall (m :: * -> *) a. MonadError TraceError m => String -> m a
throwErrorMsg (String
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ())
-> String
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall a b. (a -> b) -> a -> b
$ String
"constructor should produce something in data type " String -> String -> String
forall a. [a] -> [a] -> [a]
++ Name -> String
forall a. Show a => a -> String
show Name
d
checkDataType :: Int -> Expr -> TypeCheck (Kinded (Sort Expr, Extr))
checkDataType :: Int -> Expr -> TypeCheck (Kinded (Sort Expr, Expr))
checkDataType Int
p Expr
e = do
String
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall (m :: * -> *). Monad m => String -> m ()
traceCheckM (String
"checkDataType " String -> String -> String
forall a. [a] -> [a] -> [a]
++ Expr -> String
forall a. Show a => a -> String
show Expr
e String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
" p=" String -> String -> String
forall a. [a] -> [a] -> [a]
++ Int -> String
forall a. Show a => a -> String
show Int
p)
case Expr
e of
Quant PiSigma
Pi tb :: TBind
tb@(TBind Name
x (Domain Expr
t1 Kind
_ Dec
dec)) Expr
t2 -> do
k <- StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Int
forall (m :: * -> *). MonadCxt m => m Int
getLen
traceCheckM ("length of context = " ++ show k)
(s1, Kinded ki0 t1e) <- checkingDom $ inferType t1
let ki1 = Kind -> Kind
predKind Kind
ki0
addBind (TBind x (Domain t1 ki1 defaultDec)) $ do
Kinded ki2 (s, t2e) <- checkDataType p t2
return $ Kinded ki2 (s, Quant Pi (TBind x (Domain t1e ki1 dec)) t2e)
Sort s :: Sort Expr
s@(Set Expr
e1) -> do
(_, e1e) <- Expr -> TypeCheck (TVal, Expr)
checkLevel Expr
e1
return $ Kinded (kUniv e1e) (s, Sort $ Set e1e)
Sort s :: Sort Expr
s@(CoSet Expr
e1) -> do
e1e <- Expr
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Expr
checkSize Expr
e1
return $ Kinded (kUniv Zero) (s, Sort $ CoSet e1e)
Expr
_ -> String -> TypeCheck (Kinded (Sort Expr, Expr))
forall (m :: * -> *) a. MonadError TraceError m => String -> m a
throwErrorMsg String
"doesn't target Set or CoSet"
checkSize :: Expr -> TypeCheck Extr
checkSize :: Expr
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Expr
checkSize Expr
e =
case Expr
e of
Meta Int
i -> do
ren <- (TCContext -> Ren)
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Ren
forall r (m :: * -> *) a. MonadReader r m => (r -> a) -> m a
asks TCContext -> Ren
renaming
addMeta ren i
return e
Expr
e -> Expr
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Expr
inferSize Expr
e
inferSize :: Expr -> TypeCheck Extr
inferSize :: Expr
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Expr
inferSize Expr
e =
case Expr
e of
Expr
Zero -> Expr
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Expr
forall a.
a -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
forall (m :: * -> *) a. Monad m => a -> m a
return Expr
e
Expr
Infty -> Expr
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Expr
forall a.
a -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
forall (m :: * -> *) a. Monad m => a -> m a
return Expr
e
Succ Expr
e -> Expr -> Expr
Succ (Expr -> Expr)
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Expr
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Expr
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Expr
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Expr
checkSize Expr
e
Plus [Expr]
es -> [Expr] -> Expr
Plus ([Expr] -> Expr)
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) [Expr]
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Expr
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Expr
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Expr)
-> [Expr]
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) [Expr]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> [a] -> m [b]
mapM Expr
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Expr
checkSize [Expr]
es
Max [Expr]
es -> [Expr] -> Expr
maxE ([Expr] -> Expr)
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) [Expr]
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Expr
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Expr
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Expr)
-> [Expr]
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) [Expr]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> [a] -> m [b]
mapM Expr
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Expr
checkSize [Expr]
es
Expr
e -> do
(v, Kinded ki e) <- Expr -> TypeCheck (TVal, Kinded Expr)
inferExpr Expr
e
subtype v vSize
return e
checkBelow :: Expr -> LtLe -> Val -> TypeCheck Extr
checkBelow :: Expr
-> LtLe
-> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Expr
checkBelow Expr
e LtLe
Le TVal
VInfty = Expr
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Expr
checkSize Expr
e
checkBelow Expr
e LtLe
ltle TVal
v = do
e' <- Expr
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Expr
checkSize Expr
e
v' <- whnf' e
leSize ltle Pos v' v
return e'
checkLevel :: Expr -> TypeCheck (Val, Extr)
checkLevel :: Expr -> TypeCheck (TVal, Expr)
checkLevel Expr
e = do
Kinded _ ee <- Expr -> TVal -> TypeCheck (Kinded Expr)
checkExpr Expr
e TVal
vSize
v <- whnf' e
when (v == VInfty) $ recoverFail $ "# is not a valid universe level"
return (v, ee)
checkExpr :: Expr -> TVal -> TypeCheck (Kinded Extr)
checkExpr :: Expr -> TVal -> TypeCheck (Kinded Expr)
checkExpr Expr
e TVal
v = do
l <- StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Int
forall (m :: * -> *). MonadCxt m => m Int
getLen
enterDoc (text ("checkExpr " ++ show l ++ " |-") <+> prettyTCM e <+> colon <+> prettyTCM v) $ do
ce <- ask
traceCheck ("checkExpr: " ++ show (renaming ce) ++ ";" ++ show (context ce) ++ " |- " ++ show e ++ " : " ++ show v ++ " in env" ++ show (environ ce)) $ do
(case (e, v) of
(App (Lam Dec
dec Name
x Expr
f) Expr
e, TVal
v) | Expr -> Bool
inferable Expr
e -> Dec
-> Name
-> Telescope
-> Maybe Expr
-> Expr
-> Expr
-> TVal
-> TypeCheck (Kinded Expr)
checkLet Dec
dec Name
x Telescope
emptyTel Maybe Expr
forall a. Maybe a
Nothing Expr
e Expr
f TVal
v
(LLet (TBind Name
x (Domain Maybe Expr
mt Kind
_ Dec
dec)) Telescope
tel Expr
e1 Expr
e2, TVal
v) -> Dec
-> Name
-> Telescope
-> Maybe Expr
-> Expr
-> Expr
-> TVal
-> TypeCheck (Kinded Expr)
checkLet Dec
dec Name
x Telescope
tel Maybe Expr
mt Expr
e1 Expr
e2 TVal
v
(Case (Var Name
x) Maybe Expr
Nothing [Clause TeleVal
_ [SuccP (VarP Name
y)] (Just Expr
rhs)], TVal
v) -> do
(tv, _) <- TypeCheck (TVal, Kinded Expr) -> TypeCheck (TVal, Kinded Expr)
forall a.
StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
forall (m :: * -> *) a. MonadCxt m => m a -> m a
resurrect (TypeCheck (TVal, Kinded Expr) -> TypeCheck (TVal, Kinded Expr))
-> TypeCheck (TVal, Kinded Expr) -> TypeCheck (TVal, Kinded Expr)
forall a b. (a -> b) -> a -> b
$ Expr -> TypeCheck (TVal, Kinded Expr)
inferExpr (Name -> Expr
Var Name
x)
subtype tv vSize
vx@(VGen i) <- whnf' (Var x)
endsInSizedCo i v
let dom = TVal -> Kind -> Dec -> Domain
forall a. a -> Kind -> Dec -> Dom a
Domain TVal
vSize Kind
kSize Dec
defaultDec
newWithGen y dom $ \ Int
j TVal
vy -> do
let vp :: TVal
vp = TVal -> TVal
VSucc TVal
vy
Int
-> Int -> Int -> TypeCheck (Kinded Expr) -> TypeCheck (Kinded Expr)
forall a.
Int
-> Int
-> Int
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
forall (m :: * -> *) a.
MonadCxt m =>
Int -> Int -> Int -> m a -> m a
addSizeRel Int
j Int
1 Int
i (TypeCheck (Kinded Expr) -> TypeCheck (Kinded Expr))
-> TypeCheck (Kinded Expr) -> TypeCheck (Kinded Expr)
forall a b. (a -> b) -> a -> b
$
Rewrite
-> [TVal]
-> ([TVal] -> TypeCheck (Kinded Expr))
-> TypeCheck (Kinded Expr)
forall a.
Rewrite
-> [TVal]
-> ([TVal]
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a)
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
forall (m :: * -> *) a.
MonadCxt m =>
Rewrite -> [TVal] -> ([TVal] -> m a) -> m a
addRewrite (TVal -> TVal -> Rewrite
Rewrite TVal
vx TVal
vp) [TVal
v] (([TVal] -> TypeCheck (Kinded Expr)) -> TypeCheck (Kinded Expr))
-> ([TVal] -> TypeCheck (Kinded Expr)) -> TypeCheck (Kinded Expr)
forall a b. (a -> b) -> a -> b
$ \ [TVal
v'] -> do
Kinded ki2 rhse <- Substitution -> Expr -> TVal -> TypeCheck (Kinded Expr)
checkRHS Substitution
emptySub Expr
rhs TVal
v'
return $ Kinded ki2 $ Case (Var x) (Just tSize) [Clause [TBind y dom] [SuccP (VarP y)] (Just rhse)]
(Case Expr
e Maybe Expr
mt [Clause]
cs, TVal
v) -> do
(tv, t, Kinded ki1 ee) <- Dec -> Expr -> Maybe Expr -> TypeCheck (TVal, Expr, Kinded Expr)
checkOrInfer Dec
neutralDec Expr
e Maybe Expr
mt
ve <- whnf' ee
Kinded ki2 cle <- checkCases ve (arrow tv v) cs
return $ Kinded ki2 $ Case ee (Just t) cle
(Expr
_, VGuard Bound TVal
beta TVal
bv) ->
Bound TVal -> TypeCheck (Kinded Expr) -> TypeCheck (Kinded Expr)
forall a.
Bound TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
forall (m :: * -> *) a. MonadCxt m => Bound TVal -> m a -> m a
addBoundHyp Bound TVal
beta (TypeCheck (Kinded Expr) -> TypeCheck (Kinded Expr))
-> TypeCheck (Kinded Expr) -> TypeCheck (Kinded Expr)
forall a b. (a -> b) -> a -> b
$ Expr -> TVal -> TypeCheck (Kinded Expr)
checkExpr Expr
e TVal
bv
(Expr
e,TVal
v) | Expr -> Bool
inferable Expr
e -> do
(v2, Kinded ki1 ee) <- Expr -> TypeCheck (TVal, Kinded Expr)
inferExpr Expr
e
checkSubtype ee v2 v
return $ Kinded ki1 ee
(Expr, TVal)
_ -> Expr -> TVal -> TypeCheck (Kinded Expr)
checkForced Expr
e TVal
v
)
checkLet :: Dec -> Name -> Telescope -> Maybe Type -> Expr -> Expr -> TVal -> TypeCheck (Kinded Extr)
checkLet :: Dec
-> Name
-> Telescope
-> Maybe Expr
-> Expr
-> Expr
-> TVal
-> TypeCheck (Kinded Expr)
checkLet Dec
dec Name
x Telescope
tel Maybe Expr
mt1 Expr
e1 Expr
e2 TVal
v = do
(v_t1, t1e, Kinded ki1 e1e) <- Dec
-> Telescope
-> Maybe Expr
-> Expr
-> TypeCheck (TVal, Expr, Kinded Expr)
checkLetDef Dec
dec Telescope
tel Maybe Expr
mt1 Expr
e1
checkLetBody x t1e v_t1 ki1 dec e1e e2 v
checkLetDef :: Dec -> Telescope -> Maybe Type -> Expr -> TypeCheck (TVal, EType, Kinded Extr)
checkLetDef :: Dec
-> Telescope
-> Maybe Expr
-> Expr
-> TypeCheck (TVal, Expr, Kinded Expr)
checkLetDef Dec
dec Telescope
tel Maybe Expr
mt Expr
e = (TCContext -> TCContext)
-> TypeCheck (TVal, Expr, Kinded Expr)
-> TypeCheck (TVal, Expr, Kinded Expr)
forall a.
(TCContext -> TCContext)
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
forall r (m :: * -> *) a. MonadReader r m => (r -> r) -> m a -> m a
local (\ TCContext
cxt -> TCContext
cxt {consistencyCheck = True}) (TypeCheck (TVal, Expr, Kinded Expr)
-> TypeCheck (TVal, Expr, Kinded Expr))
-> TypeCheck (TVal, Expr, Kinded Expr)
-> TypeCheck (TVal, Expr, Kinded Expr)
forall a b. (a -> b) -> a -> b
$ do
(tel, (vt, te, Kinded ki ee)) <- Telescope
-> TypeCheck (TVal, Expr, Kinded Expr)
-> TypeCheck (Telescope, (TVal, Expr, Kinded Expr))
forall a. Telescope -> TypeCheck a -> TypeCheck (Telescope, a)
checkTele Telescope
tel (TypeCheck (TVal, Expr, Kinded Expr)
-> TypeCheck (Telescope, (TVal, Expr, Kinded Expr)))
-> TypeCheck (TVal, Expr, Kinded Expr)
-> TypeCheck (Telescope, (TVal, Expr, Kinded Expr))
forall a b. (a -> b) -> a -> b
$ Dec -> Expr -> Maybe Expr -> TypeCheck (TVal, Expr, Kinded Expr)
checkOrInfer Dec
dec Expr
e Maybe Expr
mt
te <- return $ teleToType tel te
ee <- return $ teleLam tel ee
vt <- whnf' te
return (vt, te, Kinded ki ee)
checkLetBody :: Name -> EType -> TVal -> Kind -> Dec -> Extr -> Expr -> TVal -> TypeCheck (Kinded Extr)
checkLetBody :: Name
-> Expr
-> TVal
-> Kind
-> Dec
-> Expr
-> Expr
-> TVal
-> TypeCheck (Kinded Expr)
checkLetBody Name
x Expr
t1e TVal
v_t1 Kind
ki1 Dec
dec Expr
e1e Expr
e2 TVal
v = do
v_e1 <- Expr -> TypeCheck TVal
whnf' Expr
e1e
new x (Domain v_t1 ki1 dec) $ \ TVal
vx -> do
Rewrite
-> [TVal]
-> ([TVal] -> TypeCheck (Kinded Expr))
-> TypeCheck (Kinded Expr)
forall a.
Rewrite
-> [TVal]
-> ([TVal]
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a)
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
forall (m :: * -> *) a.
MonadCxt m =>
Rewrite -> [TVal] -> ([TVal] -> m a) -> m a
addRewrite (TVal -> TVal -> Rewrite
Rewrite TVal
vx TVal
v_e1) [TVal
v] (([TVal] -> TypeCheck (Kinded Expr)) -> TypeCheck (Kinded Expr))
-> ([TVal] -> TypeCheck (Kinded Expr)) -> TypeCheck (Kinded Expr)
forall a b. (a -> b) -> a -> b
$ \ [TVal
v'] -> do
Kinded ki2 e2e <- Expr -> TVal -> TypeCheck (Kinded Expr)
checkExpr Expr
e2 TVal
v'
return $ Kinded ki2 $ LLet (TBind x (Domain (Just t1e) ki1 dec)) emptyTel e1e e2e
checkPair :: Expr -> Expr -> Name -> Domain -> FVal -> TypeCheck (Kinded Expr)
checkPair :: Expr -> Expr -> Name -> Domain -> TVal -> TypeCheck (Kinded Expr)
checkPair Expr
e1 Expr
e2 Name
y dom :: Domain
dom@(Domain TVal
av Kind
ki Dec
dec) TVal
fv = do
case TVal
av of
VBelow LtLe
Lt TVal
VInfty -> do
lowerSemi <- Name
-> Domain
-> TVal
-> (Int
-> TVal
-> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Bool)
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Bool
forall a.
Name
-> Domain
-> TVal
-> (Int -> TVal -> TVal -> TypeCheck a)
-> TypeCheck a
underAbs Name
y Domain
dom TVal
fv ((Int
-> TVal
-> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Bool)
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Bool)
-> (Int
-> TVal
-> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Bool)
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Bool
forall a b. (a -> b) -> a -> b
$ \ Int
i TVal
_ TVal
bv -> Int
-> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Bool
lowerSemiCont Int
i TVal
bv
continue $ if lowerSemi then VBelow Le VInfty else av
TVal
_ -> TVal -> TypeCheck (Kinded Expr)
continue TVal
av
where
continue :: TVal -> TypeCheck (Kinded Expr)
continue TVal
av = do
Kinded k1 e1 <- Dec -> TypeCheck (Kinded Expr) -> TypeCheck (Kinded Expr)
forall a.
Dec
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
forall (m :: * -> *) a. MonadCxt m => Dec -> m a -> m a
applyDec Dec
dec (TypeCheck (Kinded Expr) -> TypeCheck (Kinded Expr))
-> TypeCheck (Kinded Expr) -> TypeCheck (Kinded Expr)
forall a b. (a -> b) -> a -> b
$ Expr -> TVal -> TypeCheck (Kinded Expr)
checkExpr Expr
e1 TVal
av
v1 <- whnf' e1
bv <- app fv v1
Kinded k2 e2 <- checkExpr e2 bv
return $ Kinded (unionKind k1 k2) $ Pair (maybeErase dec e1) e2
checkForced :: Expr -> TVal -> TypeCheck (Kinded Expr)
checkForced :: Expr -> TVal -> TypeCheck (Kinded Expr)
checkForced Expr
e TVal
v = do
ren <- (TCContext -> Ren)
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Ren
forall r (m :: * -> *) a. MonadReader r m => (r -> a) -> m a
asks TCContext -> Ren
renaming
v <- force v
enterDoc (text ("checkForced " ++ show ren ++ " |-") <+> prettyTCM e <+> colon <+> prettyTCM v) $ do
case (e,v) of
(Expr
_, VGuard Bound TVal
beta TVal
bv) ->
Bound TVal -> TypeCheck (Kinded Expr) -> TypeCheck (Kinded Expr)
forall a.
Bound TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
forall (m :: * -> *) a. MonadCxt m => Bound TVal -> m a -> m a
addBoundHyp Bound TVal
beta (TypeCheck (Kinded Expr) -> TypeCheck (Kinded Expr))
-> TypeCheck (Kinded Expr) -> TypeCheck (Kinded Expr)
forall a b. (a -> b) -> a -> b
$ Expr -> TVal -> TypeCheck (Kinded Expr)
checkForced Expr
e TVal
bv
(Pair Expr
e1 Expr
e2, VQuant PiSigma
Sigma Name
y dom :: Domain
dom@(Domain TVal
av Kind
ki Dec
dec) TVal
fv) ->
Expr -> Expr -> Name -> Domain -> TVal -> TypeCheck (Kinded Expr)
checkPair Expr
e1 Expr
e2 Name
y Domain
dom TVal
fv
(Record RecInfo
ri [(Name, Expr)]
rs, t :: TVal
t@(VApp (VDef (DefId IdKind
DatK QName
d)) [TVal]
vl)) -> do
let fail1 :: StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
fail1 = StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
forall (m :: * -> *) a. MonadError TraceError m => m Doc -> m a
failDoc (String
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall {m :: * -> *}. Monad m => String -> m Doc
text String
"expected" StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall {f :: * -> *}. Applicative f => f Doc -> f Doc -> f Doc
<+> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall a.
PrettyTCM a =>
a -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
prettyTCM TVal
t StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall {f :: * -> *}. Applicative f => f Doc -> f Doc -> f Doc
<+> String
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall {m :: * -> *}. Monad m => String -> m Doc
text String
"to be a record type")
mfs <- QName -> [TVal] -> TypeCheck (Maybe [(Name, TVal)])
getFieldsAtType QName
d [TVal]
vl
case mfs of
Maybe [(Name, TVal)]
Nothing -> TypeCheck (Kinded Expr)
forall {a}.
StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
fail1
Just [(Name, TVal)]
ptv -> do
let checkField :: (Name, Expr) -> TypeCheck (Kinded [(Name,Expr)]) -> TypeCheck (Kinded [(Name,Expr)])
checkField :: (Name, Expr)
-> TypeCheck (Kinded [(Name, Expr)])
-> TypeCheck (Kinded [(Name, Expr)])
checkField (Name
p,Expr
e) TypeCheck (Kinded [(Name, Expr)])
cont =
case Name -> [(Name, TVal)] -> Maybe TVal
forall a b. Eq a => a -> [(a, b)] -> Maybe b
lookup Name
p [(Name, TVal)]
ptv of
Maybe TVal
Nothing -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> TypeCheck (Kinded [(Name, Expr)])
forall (m :: * -> *) a. MonadError TraceError m => m Doc -> m a
failDoc (Name
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall a.
PrettyTCM a =>
a -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
prettyTCM Name
p StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall {f :: * -> *}. Applicative f => f Doc -> f Doc -> f Doc
<+> String
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall {m :: * -> *}. Monad m => String -> m Doc
text String
"is not a field of record" StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall {f :: * -> *}. Applicative f => f Doc -> f Doc -> f Doc
<+> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall a.
PrettyTCM a =>
a -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
prettyTCM TVal
t)
Just TVal
tv -> do
tv <- TVal -> TVal -> TypeCheck TVal
piApp TVal
tv TVal
VIrr
Kinded k e <- checkExpr e tv
Kinded k' es <- cont
return $ Kinded (unionKind k k') ((p,e) : es)
Kinded k rs <- ((Name, Expr)
-> TypeCheck (Kinded [(Name, Expr)])
-> TypeCheck (Kinded [(Name, Expr)]))
-> TypeCheck (Kinded [(Name, Expr)])
-> [(Name, Expr)]
-> TypeCheck (Kinded [(Name, Expr)])
forall a b. (a -> b -> b) -> b -> [a] -> b
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr (Name, Expr)
-> TypeCheck (Kinded [(Name, Expr)])
-> TypeCheck (Kinded [(Name, Expr)])
checkField (Kinded [(Name, Expr)] -> TypeCheck (Kinded [(Name, Expr)])
forall a.
a -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
forall (m :: * -> *) a. Monad m => a -> m a
return (Kinded [(Name, Expr)] -> TypeCheck (Kinded [(Name, Expr)]))
-> Kinded [(Name, Expr)] -> TypeCheck (Kinded [(Name, Expr)])
forall a b. (a -> b) -> a -> b
$ Kind -> [(Name, Expr)] -> Kinded [(Name, Expr)]
forall a. Kind -> a -> Kinded a
Kinded Kind
NoKind []) [(Name, Expr)]
rs
return $ Kinded k $ Record ri rs
(Lam Dec
_ Name
y Expr
e1, VQuant PiSigma
Pi Name
x Domain
dom TVal
fv) -> do
Name
-> Domain
-> TVal
-> (Int -> TVal -> TVal -> TypeCheck (Kinded Expr))
-> TypeCheck (Kinded Expr)
forall a.
Name
-> Domain
-> TVal
-> (Int -> TVal -> TVal -> TypeCheck a)
-> TypeCheck a
underAbs Name
y Domain
dom TVal
fv ((Int -> TVal -> TVal -> TypeCheck (Kinded Expr))
-> TypeCheck (Kinded Expr))
-> (Int -> TVal -> TVal -> TypeCheck (Kinded Expr))
-> TypeCheck (Kinded Expr)
forall a b. (a -> b) -> a -> b
$ \ Int
_ TVal
vy TVal
bv -> do
Kinded ki1 e1e <- Expr -> TVal -> TypeCheck (Kinded Expr)
checkExpr Expr
e1 TVal
bv
return $ Kinded ki1 $ Lam (decor dom) y e1e
(Proj PrePost
Pre Name
p, VQuant PiSigma
Pi Name
x Domain
dom TVal
fv) -> do
let y :: Name
y = Name -> String -> Name
nonEmptyName Name
x String
"y"
Expr -> TVal -> TypeCheck (Kinded Expr)
checkForced (Dec -> Name -> Expr -> Expr
Lam (Domain -> Dec
forall a. Dom a -> Dec
decor Domain
dom) Name
y (Expr -> Expr) -> Expr -> Expr
forall a b. (a -> b) -> a -> b
$ Expr -> Expr -> Expr
App Expr
e (Name -> Expr
Var Name
y)) TVal
v
(Expr
e, VBelow LtLe
ltle TVal
v) -> Kind -> Expr -> Kinded Expr
forall a. Kind -> a -> Kinded a
Kinded Kind
kSize (Expr -> Kinded Expr)
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Expr
-> TypeCheck (Kinded Expr)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Expr
-> LtLe
-> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Expr
checkBelow Expr
e LtLe
ltle TVal
v
(Expr
e,TVal
v) -> do
case Expr -> (Expr, [Expr])
spineView Expr
e of
(h :: Expr
h@(Def (DefId (ConK ConK
DefPat) QName
c)), [Expr]
es) -> do
PatSig xs pat _ <- QName
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) SigDef
forall (m :: * -> *). MonadSig m => QName -> m SigDef
lookupSymbQ QName
c
let (xs1, xs2) = splitAt (length es) xs
phi Name
x = Expr -> (Expr -> Expr) -> Maybe Expr -> Expr
forall b a. b -> (a -> b) -> Maybe a -> b
maybe (Name -> Expr
Var Name
x) Expr -> Expr
forall a. a -> a
id (Maybe Expr -> Expr) -> Maybe Expr -> Expr
forall a b. (a -> b) -> a -> b
$ Name -> [(Name, Expr)] -> Maybe Expr
forall a b. Eq a => a -> [(a, b)] -> Maybe b
lookup Name
x ([Name] -> [Expr] -> [(Name, Expr)]
forall a b. [a] -> [b] -> [(a, b)]
zip [Name]
xs1 [Expr]
es)
body = (Name -> Expr) -> Expr -> Expr
forall a. ParSubst a => (Name -> Expr) -> a -> a
parSubst Name -> Expr
phi (Pattern -> Expr
patternToExpr Pattern
pat)
e = (Name -> Expr -> Expr) -> Expr -> [Name] -> Expr
forall a b. (a -> b -> b) -> b -> [a] -> b
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr (Dec -> Name -> Expr -> Expr
Lam Dec
defaultDec) Expr
body [Name]
xs2
checkForced e v
(h :: Expr
h@(Def (DefId (ConK ConK
co) QName
c)), [Expr]
es) -> ConK -> QName -> [Expr] -> TVal -> TypeCheck (Kinded Expr)
checkConTerm ConK
co QName
c [Expr]
es TVal
v
(Expr, [Expr])
_ -> do
(v2,kee) <- Expr -> TypeCheck (TVal, Kinded Expr)
inferExpr Expr
e
checkSubtype (valueOf kee) v2 v
return kee
checkConTerm :: ConK -> QName -> [Expr] -> TVal -> TypeCheck (Kinded Extr)
checkConTerm :: ConK -> QName -> [Expr] -> TVal -> TypeCheck (Kinded Expr)
checkConTerm ConK
co QName
c [Expr]
es TVal
v = do
case TVal
v of
VQuant PiSigma
Pi Name
x Domain
dom TVal
fv -> do
let y :: Name
y = Name -> Name
freshen (Name -> Name) -> Name -> Name
forall a b. (a -> b) -> a -> b
$ Name -> String -> Name
nonEmptyName Name
x String
"y"
Name
-> Domain
-> TVal
-> (Int -> TVal -> TVal -> TypeCheck (Kinded Expr))
-> TypeCheck (Kinded Expr)
forall a.
Name
-> Domain
-> TVal
-> (Int -> TVal -> TVal -> TypeCheck a)
-> TypeCheck a
underAbs Name
y Domain
dom TVal
fv ((Int -> TVal -> TVal -> TypeCheck (Kinded Expr))
-> TypeCheck (Kinded Expr))
-> (Int -> TVal -> TVal -> TypeCheck (Kinded Expr))
-> TypeCheck (Kinded Expr)
forall a b. (a -> b) -> a -> b
$ \ Int
_ TVal
_ TVal
bv -> do
Kinded ki ee <- ConK -> QName -> [Expr] -> TVal -> TypeCheck (Kinded Expr)
checkConTerm ConK
co QName
c ([Expr]
es [Expr] -> [Expr] -> [Expr]
forall a. [a] -> [a] -> [a]
++ [Name -> Expr
Var Name
y]) TVal
bv
return $ Kinded ki $ Lam (decor dom) y ee
TVal
_ -> do
c <- QName -> TVal -> TypeCheck QName
disambigCon QName
c TVal
v
tv <- conType c v
(knes, dv) <- checkSpine es tv
let ee = RecInfo -> [(Name, Expr)] -> Expr
Record (ConK -> QName -> Bool -> Dotted -> RecInfo
NamedRec ConK
co QName
c Bool
False Dotted
notDotted) ([(Name, Expr)] -> Expr) -> [(Name, Expr)] -> Expr
forall a b. (a -> b) -> a -> b
$ (Kinded (Name, Expr) -> (Name, Expr))
-> [Kinded (Name, Expr)] -> [(Name, Expr)]
forall a b. (a -> b) -> [a] -> [b]
map Kinded (Name, Expr) -> (Name, Expr)
forall a. Kinded a -> a
valueOf [Kinded (Name, Expr)]
knes
checkSubtype ee dv v
return $ Kinded kTerm ee
checkSpine :: [Expr] -> TVal -> TypeCheck ([Kinded (Name, Extr)], TVal)
checkSpine :: [Expr] -> TVal -> TypeCheck ([Kinded (Name, Expr)], TVal)
checkSpine [] TVal
tv = ([Kinded (Name, Expr)], TVal)
-> TypeCheck ([Kinded (Name, Expr)], TVal)
forall a.
a -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
forall (m :: * -> *) a. Monad m => a -> m a
return ([], TVal
tv)
checkSpine (Expr
e : [Expr]
es) TVal
tv = do
(kne, tv) <- Expr -> TVal -> TypeCheck (Kinded (Name, Expr), TVal)
checkApp Expr
e TVal
tv
(knes, tv) <- checkSpine es tv
return (kne : knes, tv)
maybeErase :: Polarity pol => pol -> Expr -> Expr
maybeErase :: forall pol. Polarity pol => pol -> Expr -> Expr
maybeErase pol
dec = if pol -> Bool
forall pol. Polarity pol => pol -> Bool
erased pol
dec then Expr -> Expr
erasedExpr else Expr -> Expr
forall a. a -> a
id
checkApp :: Expr -> TVal -> TypeCheck (Kinded (Name, Extr), TVal)
checkApp :: Expr -> TVal -> TypeCheck (Kinded (Name, Expr), TVal)
checkApp Expr
e2 TVal
v = do
v <- TVal -> TypeCheck TVal
force TVal
v
enter ("checkApp " ++ show v ++ " eliminated by " ++ show e2) $ do
case v of
VQuant PiSigma
Pi Name
x dom :: Domain
dom@(Domain av :: TVal
av@(VBelow LtLe
Lt TVal
VInfty) Kind
_ Dec
dec) TVal
fv -> do
upperSemi <- Name
-> Domain
-> TVal
-> (Int
-> TVal
-> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Bool)
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Bool
forall a.
Name
-> Domain
-> TVal
-> (Int -> TVal -> TVal -> TypeCheck a)
-> TypeCheck a
underAbs Name
x Domain
dom TVal
fv ((Int
-> TVal
-> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Bool)
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Bool)
-> (Int
-> TVal
-> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Bool)
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Bool
forall a b. (a -> b) -> a -> b
$ \ Int
i TVal
_ TVal
bv -> Int
-> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Bool
upperSemiCont Int
i TVal
bv
continue $ if upperSemi then VQuant Pi x dom{ typ = VBelow Le VInfty} fv
else v
TVal
_ -> TVal -> TypeCheck (Kinded (Name, Expr), TVal)
continue TVal
v
where
continue :: TVal -> TypeCheck (Kinded (Name, Expr), TVal)
continue TVal
v = case TVal
v of
VQuant PiSigma
Pi Name
x (Domain TVal
av Kind
_ Dec
dec) TVal
fv -> do
(ki, v2, e2e) <- do
if Expr -> Bool
inferable Expr
e2 then do
(av', Kinded ki e2e) <- Dec
-> TypeCheck (TVal, Kinded Expr) -> TypeCheck (TVal, Kinded Expr)
forall a.
Dec
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
forall (m :: * -> *) a. MonadCxt m => Dec -> m a -> m a
applyDec Dec
dec (TypeCheck (TVal, Kinded Expr) -> TypeCheck (TVal, Kinded Expr))
-> TypeCheck (TVal, Kinded Expr) -> TypeCheck (TVal, Kinded Expr)
forall a b. (a -> b) -> a -> b
$ Expr -> TypeCheck (TVal, Kinded Expr)
inferExpr Expr
e2
case av' of
VSing TVal
v2 TVal
av'' -> do TVal
-> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
subtype TVal
av' TVal
av
(Kind, TVal, Expr)
-> StateT
TCState
(ReaderT TCContext (ExceptT TraceError IO))
(Kind, TVal, Expr)
forall a.
a -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
forall (m :: * -> *) a. Monad m => a -> m a
return (Kind
ki, TVal
v2, Expr
e2e)
TVal
_ -> do Expr
-> TVal
-> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
checkSubtype Expr
e2e TVal
av' TVal
av
v2 <- Expr -> TypeCheck TVal
whnf' Expr
e2e
return (ki, v2, e2e)
else do
Kinded ki e2e <- Dec -> TypeCheck (Kinded Expr) -> TypeCheck (Kinded Expr)
forall a.
Dec
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
forall (m :: * -> *) a. MonadCxt m => Dec -> m a -> m a
applyDec Dec
dec (TypeCheck (Kinded Expr) -> TypeCheck (Kinded Expr))
-> TypeCheck (Kinded Expr) -> TypeCheck (Kinded Expr)
forall a b. (a -> b) -> a -> b
$ Expr -> TVal -> TypeCheck (Kinded Expr)
checkExpr Expr
e2 TVal
av
v2 <- whnf' e2e
return (ki, v2, e2e)
bv <- app fv v2
return (Kinded ki $ (x,) $ maybeErase dec e2e, bv)
TVal
_ -> String -> TypeCheck (Kinded (Name, Expr), TVal)
forall (m :: * -> *) a. MonadError TraceError m => String -> m a
throwErrorMsg (String -> TypeCheck (Kinded (Name, Expr), TVal))
-> String -> TypeCheck (Kinded (Name, Expr), TVal)
forall a b. (a -> b) -> a -> b
$ String
"checking application to " String -> String -> String
forall a. [a] -> [a] -> [a]
++ Expr -> String
forall a. Show a => a -> String
show Expr
e2 String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
": expected function type, found " String -> String -> String
forall a. [a] -> [a] -> [a]
++ TVal -> String
forall a. Show a => a -> String
show TVal
v
checkSubtype :: Expr -> TVal -> TVal -> TypeCheck ()
checkSubtype :: Expr
-> TVal
-> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
checkSubtype Expr
e TVal
v2 TVal
v = do
rho <- StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Env
forall (m :: * -> *). MonadCxt m => m Env
getEnv
traceSingM $ "computing singleton <" ++ show e ++ " : " ++ show v2 ++ ">"
v2principal <- sing rho e v2
traceSingM $ "subtype checking " ++ show v2principal ++ " ?<= " ++ show v ++ " in environment " ++ show rho
subtype v2principal v
ptsRule :: Bool -> Sort Val -> Sort Val -> TypeCheck (Sort Val)
ptsRule :: Bool -> Sort TVal -> Sort TVal -> TypeCheck (Sort TVal)
ptsRule Bool
er Sort TVal
s1 Sort TVal
s2 = do
cxt <- StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) TCContext
forall r (m :: * -> *). MonadReader r m => m r
ask
let parametric = TCContext -> Bool
checkingConType TCContext
cxt
let err = String
"ptsRule " String -> String -> String
forall a. [a] -> [a] -> [a]
++ (Sort TVal, Sort TVal) -> String
forall a. Show a => a -> String
show (Sort TVal
s1,Sort TVal
s2) String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
" " String -> String -> String
forall a. [a] -> [a] -> [a]
++ (if Bool
parametric then String
"(in type of constructor)" else String
"") String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
": "
case (s1,s2) of
(Set TVal
VInfty,Sort TVal
_) -> String -> TypeCheck (Sort TVal)
forall (m :: * -> *) a. MonadError TraceError m => String -> m a
throwErrorMsg (String -> TypeCheck (Sort TVal))
-> String -> TypeCheck (Sort TVal)
forall a b. (a -> b) -> a -> b
$ String
err String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
"domain too big"
(Set TVal
v1, Set TVal
v2) ->
if Bool
parametric then do
Bool
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
unless Bool
er (StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ())
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall a b. (a -> b) -> a -> b
$ Pol
-> TVal
-> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
leqSize Pol
Pos TVal
v1 TVal
v2
Sort TVal -> TypeCheck (Sort TVal)
forall a.
a -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
forall (m :: * -> *) a. Monad m => a -> m a
return Sort TVal
s2
else Sort TVal -> TypeCheck (Sort TVal)
forall a.
a -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
forall (m :: * -> *) a. Monad m => a -> m a
return (Sort TVal -> TypeCheck (Sort TVal))
-> Sort TVal -> TypeCheck (Sort TVal)
forall a b. (a -> b) -> a -> b
$ TVal -> Sort TVal
forall a. a -> Sort a
Set (TVal -> Sort TVal) -> TVal -> Sort TVal
forall a b. (a -> b) -> a -> b
$ [TVal] -> TVal
maxSize [TVal
v1,TVal
v2]
(CoSet TVal
v1, Set TVal
VZero)
| Bool
parametric -> Sort TVal -> TypeCheck (Sort TVal)
forall a.
a -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
forall (m :: * -> *) a. Monad m => a -> m a
return (Sort TVal -> TypeCheck (Sort TVal))
-> Sort TVal -> TypeCheck (Sort TVal)
forall a b. (a -> b) -> a -> b
$ TVal -> Sort TVal
forall a. a -> Sort a
CoSet TVal
v1
| TVal
v1 TVal -> TVal -> Bool
forall a. Eq a => a -> a -> Bool
== TVal
VInfty -> Sort TVal -> TypeCheck (Sort TVal)
forall a.
a -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
forall (m :: * -> *) a. Monad m => a -> m a
return (Sort TVal -> TypeCheck (Sort TVal))
-> Sort TVal -> TypeCheck (Sort TVal)
forall a b. (a -> b) -> a -> b
$ TVal -> Sort TVal
forall a. a -> Sort a
Set TVal
VZero
| Bool
otherwise -> String -> TypeCheck (Sort TVal)
forall (m :: * -> *) a. MonadError TraceError m => String -> m a
throwErrorMsg (String -> TypeCheck (Sort TVal))
-> String -> TypeCheck (Sort TVal)
forall a b. (a -> b) -> a -> b
$ String
err String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
"domain cannot be sized"
(CoSet TVal
v1, CoSet TVal
v2)
| Bool
parametric -> do
let v2' :: TVal
v2' = TVal -> (TVal -> TVal) -> Maybe TVal -> TVal
forall b a. b -> (a -> b) -> Maybe a -> b
maybe TVal
v2 TVal -> TVal
forall a. a -> a
id (Maybe TVal -> TVal) -> Maybe TVal -> TVal
forall a b. (a -> b) -> a -> b
$ TVal -> Maybe TVal
predSize TVal
v2
case TVal -> TVal -> Maybe TVal
minSize TVal
v1 TVal
v2 of
Just TVal
v -> Sort TVal -> TypeCheck (Sort TVal)
forall a.
a -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
forall (m :: * -> *) a. Monad m => a -> m a
return (Sort TVal -> TypeCheck (Sort TVal))
-> Sort TVal -> TypeCheck (Sort TVal)
forall a b. (a -> b) -> a -> b
$ TVal -> Sort TVal
forall a. a -> Sort a
CoSet TVal
v
Maybe TVal
Nothing -> String -> TypeCheck (Sort TVal)
forall (m :: * -> *) a. MonadError TraceError m => String -> m a
throwErrorMsg (String -> TypeCheck (Sort TVal))
-> String -> TypeCheck (Sort TVal)
forall a b. (a -> b) -> a -> b
$ String
err String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
"min" String -> String -> String
forall a. [a] -> [a] -> [a]
++ (TVal, TVal) -> String
forall a. Show a => a -> String
show (TVal
v1,TVal
v2) String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
" does not exist"
| TVal
v1 TVal -> TVal -> Bool
forall a. Eq a => a -> a -> Bool
== TVal
VInfty -> Sort TVal -> TypeCheck (Sort TVal)
forall a.
a -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
forall (m :: * -> *) a. Monad m => a -> m a
return (Sort TVal -> TypeCheck (Sort TVal))
-> Sort TVal -> TypeCheck (Sort TVal)
forall a b. (a -> b) -> a -> b
$ TVal -> Sort TVal
forall a. a -> Sort a
CoSet (TVal -> Sort TVal) -> TVal -> Sort TVal
forall a b. (a -> b) -> a -> b
$ TVal -> TVal
succSize TVal
v2
| Bool
otherwise -> String -> TypeCheck (Sort TVal)
forall (m :: * -> *) a. MonadError TraceError m => String -> m a
throwErrorMsg (String -> TypeCheck (Sort TVal))
-> String -> TypeCheck (Sort TVal)
forall a b. (a -> b) -> a -> b
$ String
err String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
"domain cannot be sized"
(Sort TVal, Sort TVal)
_ -> Sort TVal -> TypeCheck (Sort TVal)
forall a.
a -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
forall (m :: * -> *) a. Monad m => a -> m a
return Sort TVal
s2
checkOrInfer :: Dec -> Expr -> Maybe Type -> TypeCheck (TVal, EType, Kinded Extr)
checkOrInfer :: Dec -> Expr -> Maybe Expr -> TypeCheck (TVal, Expr, Kinded Expr)
checkOrInfer Dec
dec Expr
e Maybe Expr
Nothing = do
(tv, ke) <- Dec
-> TypeCheck (TVal, Kinded Expr) -> TypeCheck (TVal, Kinded Expr)
forall a.
Dec
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
forall (m :: * -> *) a. MonadCxt m => Dec -> m a -> m a
applyDec Dec
dec (TypeCheck (TVal, Kinded Expr) -> TypeCheck (TVal, Kinded Expr))
-> TypeCheck (TVal, Kinded Expr) -> TypeCheck (TVal, Kinded Expr)
forall a b. (a -> b) -> a -> b
$ Expr -> TypeCheck (TVal, Kinded Expr)
inferExpr Expr
e
te <- toExpr tv
return (tv, te, ke)
checkOrInfer Dec
dec Expr
e (Just Expr
t) = do
Kinded kt te <- Expr -> TypeCheck (Kinded Expr)
checkType Expr
t
tv <- whnf' te
Kinded ke ee <- applyDec dec $ checkExpr e tv
let ki = Kind -> Kind -> Kind
intersectKind Kind
ke (Kind -> Kind) -> Kind -> Kind
forall a b. (a -> b) -> a -> b
$ Kind -> Kind
predKind Kind
kt
return $ (tv, te, Kinded ki ee)
inferType :: Expr -> TypeCheck (Sort Val, Kinded Extr)
inferType :: Expr
-> StateT
TCState
(ReaderT TCContext (ExceptT TraceError IO))
(Sort TVal, Kinded Expr)
inferType Expr
t = do
(sv, te) <- Expr -> TypeCheck (TVal, Kinded Expr)
inferExpr Expr
t
case sv of
VSort Sort TVal
s | Bool -> Bool
not (Sort TVal
s Sort TVal -> [Sort TVal] -> Bool
forall a. Eq a => a -> [a] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` (Class -> Sort TVal) -> [Class] -> [Sort TVal]
forall a b. (a -> b) -> [a] -> [b]
map Class -> Sort TVal
forall a. Class -> Sort a
SortC [Class
Tm,Class
Size]) -> (Sort TVal, Kinded Expr)
-> StateT
TCState
(ReaderT TCContext (ExceptT TraceError IO))
(Sort TVal, Kinded Expr)
forall a.
a -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
forall (m :: * -> *) a. Monad m => a -> m a
return (Sort TVal
s,Kinded Expr
te)
TVal
_ -> String
-> StateT
TCState
(ReaderT TCContext (ExceptT TraceError IO))
(Sort TVal, Kinded Expr)
forall (m :: * -> *) a. MonadError TraceError m => String -> m a
throwErrorMsg (String
-> StateT
TCState
(ReaderT TCContext (ExceptT TraceError IO))
(Sort TVal, Kinded Expr))
-> String
-> StateT
TCState
(ReaderT TCContext (ExceptT TraceError IO))
(Sort TVal, Kinded Expr)
forall a b. (a -> b) -> a -> b
$ String
"inferExpr: expected " String -> String -> String
forall a. [a] -> [a] -> [a]
++ Expr -> String
forall a. Show a => a -> String
show Expr
t String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
" to be a type!"
inferExpr :: Expr -> TypeCheck (TVal, Kinded Extr)
inferExpr :: Expr -> TypeCheck (TVal, Kinded Expr)
inferExpr Expr
e = do
(tv, ee) <- Expr -> TypeCheck (TVal, Kinded Expr)
inferExpr' Expr
e
case tv of
VGuard Bound TVal
beta TVal
vb -> do
Bound TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
checkGuard Bound TVal
beta
(TVal, Kinded Expr) -> TypeCheck (TVal, Kinded Expr)
forall a.
a -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
forall (m :: * -> *) a. Monad m => a -> m a
return (TVal
vb, Kinded Expr
ee)
TVal
_ -> (TVal, Kinded Expr) -> TypeCheck (TVal, Kinded Expr)
forall a.
a -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
forall (m :: * -> *) a. Monad m => a -> m a
return (TVal
tv, Kinded Expr
ee)
inferProj :: Expr -> PrePost -> Name -> TypeCheck (TVal, Kinded Extr)
inferProj :: Expr -> PrePost -> Name -> TypeCheck (TVal, Kinded Expr)
inferProj Expr
e1 PrePost
fx Name
p = Bool
-> TypeCheck (TVal, Kinded Expr) -> TypeCheck (TVal, Kinded Expr)
forall a.
Bool
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
forall (m :: * -> *) a. MonadCxt m => Bool -> m a -> m a
checkingCon Bool
False (TypeCheck (TVal, Kinded Expr) -> TypeCheck (TVal, Kinded Expr))
-> TypeCheck (TVal, Kinded Expr) -> TypeCheck (TVal, Kinded Expr)
forall a b. (a -> b) -> a -> b
$ do
(v, Kinded ki1 e1e) <- Expr -> TypeCheck (TVal, Kinded Expr)
inferExpr Expr
e1
v <- force v
tv <- projectType v p =<< whnf' e1e
return (tv, Kinded ki1 (proj e1e fx p))
inferExpr' :: Expr -> TypeCheck (TVal, Kinded Extr)
inferExpr' :: Expr -> TypeCheck (TVal, Kinded Expr)
inferExpr' Expr
e = String
-> TypeCheck (TVal, Kinded Expr) -> TypeCheck (TVal, Kinded Expr)
forall (m :: * -> *) a.
MonadError TraceError m =>
String -> m a -> m a
enter (String
"inferExpr' " String -> String -> String
forall a. [a] -> [a] -> [a]
++ Expr -> String
forall a. Show a => a -> String
show Expr
e) (TypeCheck (TVal, Kinded Expr) -> TypeCheck (TVal, Kinded Expr))
-> TypeCheck (TVal, Kinded Expr) -> TypeCheck (TVal, Kinded Expr)
forall a b. (a -> b) -> a -> b
$
let returnSing :: Kinded Expr -> TVal -> TypeCheck (TVal, Kinded Expr)
returnSing (Kinded Kind
ki Expr
ee) TVal
tv = do
tv' <- Expr -> TVal -> TypeCheck TVal
sing' Expr
ee TVal
tv
return (tv', Kinded ki ee)
in
(case Expr
e of
Var Name
x -> do
String
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall (m :: * -> *). Monad m => String -> m ()
traceCheckM (String
"infer variable " String -> String -> String
forall a. [a] -> [a] -> [a]
++ Name -> String
forall a. Show a => a -> String
show Name
x)
item <- Name
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) CxtEntry1
forall (m :: * -> *). MonadCxt m => Name -> m CxtEntry1
lookupName1 Name
x
traceCheckM ("infer variable: retrieved item ")
let dom = CxtEntry1 -> Domain
forall a. CxtE a -> a
domain CxtEntry1
item
av = Domain -> TVal
forall a. Dom a -> a
typ Domain
dom
traceCheckM ("infer variable: " ++ show av)
enterDoc (text "inferExpr: variable" <+> prettyTCM x <+> colon <+> prettyTCM av <+> text "may not occur") $ do
let dec = Domain -> Dec
forall a. Dom a -> Dec
decor Domain
dom
udec = CxtEntry1 -> UDec
forall a. CxtE a -> UDec
upperDec CxtEntry1
item
pol = Dec -> Pol
forall pol. Polarity pol => Decoration pol -> pol
polarity Dec
dec
upol = UDec -> PProd
forall pol. Polarity pol => Decoration pol -> pol
polarity UDec
udec
when (erased dec && not (erased udec)) $
recoverFail ", because it is marked as erased"
enter ", because of polarity" $
leqPolM pol upol
traceCheckM ("infer variable returns")
traceCheckM ("infer variable " ++ show x ++ " : " ++ show av)
return $ (av, Kinded (kind dom) $ Var x)
Sort (CoSet Expr
e) -> do
ee <- Expr
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Expr
checkSize Expr
e
return (VSort (Set (VSucc VZero)), Kinded (kUniv Zero) $ Sort $ CoSet ee)
Sort (Set Expr
e) -> do
(v, ee) <- Expr -> TypeCheck (TVal, Expr)
checkLevel Expr
e
return (VSort (Set (succSize v)), Kinded (kUniv ee) $ Sort $ Set ee)
Sort (SortC Class
Size) -> (TVal, Kinded Expr) -> TypeCheck (TVal, Kinded Expr)
forall a.
a -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
forall (m :: * -> *) a. Monad m => a -> m a
return (TVal
vTSize, Kind -> Expr -> Kinded Expr
forall a. Kind -> a -> Kinded a
Kinded Kind
kTSize (Expr -> Kinded Expr) -> Expr -> Kinded Expr
forall a b. (a -> b) -> a -> b
$ Expr
e)
Expr
Zero -> (TVal, Kinded Expr) -> TypeCheck (TVal, Kinded Expr)
forall a.
a -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
forall (m :: * -> *) a. Monad m => a -> m a
return (TVal
vSize, Kind -> Expr -> Kinded Expr
forall a. Kind -> a -> Kinded a
Kinded Kind
kSize Expr
Zero)
Expr
Infty -> (TVal, Kinded Expr) -> TypeCheck (TVal, Kinded Expr)
forall a.
a -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
forall (m :: * -> *) a. Monad m => a -> m a
return (TVal
vSize, Kind -> Expr -> Kinded Expr
forall a. Kind -> a -> Kinded a
Kinded Kind
kSize Expr
Infty)
Below LtLe
ltle Expr
e -> do
ee <- Expr
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Expr
checkSize Expr
e
return (vTSize, Kinded kTSize $ Below ltle ee)
Quant PiSigma
pisig (TBind Name
n (Domain Expr
t1 Kind
_ Dec
dec)) Expr
t2 -> do
checkCon <- (TCContext -> Bool)
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Bool
forall r (m :: * -> *) a. MonadReader r m => (r -> a) -> m a
asks TCContext -> Bool
checkingConType
(s1, Kinded ki0 t1e) <- (if pisig==Pi then checkingDom else id) $
checkingCon False $ inferType t1
let ki1 = Kind -> Kind
predKind Kind
ki0
addBind (TBind n (Domain t1e ki1 $ defaultDec)) $ do
(s2, Kinded ki2 t2e) <- inferType t2
ce <- ask
let er = Dec -> Bool
forall pol. Polarity pol => pol -> Bool
erased Dec
dec
s <- if impredicative ce && er && s2 == Set VZero then return s2 else ptsRule er s1 s2
let (ki',dec') = if checkCon then
if ki0 == kTSize then (ki2, irrelevantDec)
else if erased dec then (ki2, dec)
else (unionKind ki0 ki2, dec)
else (ki2, if argKind ki0 `irrelevantFor` (predKind ki2)
then irrelevantDec
else dec)
return (VSort s, Kinded ki' $ Quant pisig (TBind n (Domain t1e ki1 dec')) t2e)
Quant PiSigma
Pi (TMeasure (Measure [Expr]
mu)) Expr
t2 -> do
mue <- (Expr
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Expr)
-> [Expr]
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) [Expr]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> [a] -> m [b]
mapM Expr
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Expr
checkSize [Expr]
mu
(s, Kinded ki2 t2e) <- inferType t2
return (VSort s, Kinded ki2 $ Quant Pi (TMeasure (Measure mue)) t2e)
Quant PiSigma
Pi (TBound (Bound LtLe
ltle (Measure [Expr]
mu) (Measure [Expr]
mu'))) Expr
t2 -> do
(mue,mue') <- StateT
TCState
(ReaderT TCContext (ExceptT TraceError IO))
([Expr], [Expr])
-> StateT
TCState
(ReaderT TCContext (ExceptT TraceError IO))
([Expr], [Expr])
forall a.
StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
forall (m :: * -> *) a. MonadCxt m => m a -> m a
checkingDom (StateT
TCState
(ReaderT TCContext (ExceptT TraceError IO))
([Expr], [Expr])
-> StateT
TCState
(ReaderT TCContext (ExceptT TraceError IO))
([Expr], [Expr]))
-> StateT
TCState
(ReaderT TCContext (ExceptT TraceError IO))
([Expr], [Expr])
-> StateT
TCState
(ReaderT TCContext (ExceptT TraceError IO))
([Expr], [Expr])
forall a b. (a -> b) -> a -> b
$ do
mue <- StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) [Expr]
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) [Expr]
forall a.
StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
forall (m :: * -> *) a. MonadCxt m => m a -> m a
checkingDom (StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) [Expr]
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) [Expr])
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) [Expr]
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) [Expr]
forall a b. (a -> b) -> a -> b
$ (Expr
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Expr)
-> [Expr]
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) [Expr]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> [a] -> m [b]
mapM Expr
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Expr
checkSize [Expr]
mu
mue' <- mapM checkSize mu'
return (mue,mue')
(s, Kinded ki2 t2e) <- inferType t2
return (VSort s, Kinded ki2 $ Quant Pi (TBound (Bound ltle (Measure mue) (Measure mue'))) t2e)
Sing Expr
e1 Expr
t -> do
(s, Kinded ki te) <- Expr
-> StateT
TCState
(ReaderT TCContext (ExceptT TraceError IO))
(Sort TVal, Kinded Expr)
inferType Expr
t
tv <- whnf' te
Kinded ki1 e1e <- checkExpr e1 tv
return (VSort $ s, Kinded (intersectKind ki $ succKind ki1)
$ Sing e1e te)
App (Proj PrePost
Pre Name
p) Expr
e -> Expr -> PrePost -> Name -> TypeCheck (TVal, Kinded Expr)
inferProj Expr
e PrePost
Pre Name
p
App Expr
e (Proj PrePost
Post Name
p) -> Expr -> PrePost -> Name -> TypeCheck (TVal, Kinded Expr)
inferProj Expr
e PrePost
Post Name
p
App Expr
e1 Expr
e2 -> Bool
-> TypeCheck (TVal, Kinded Expr) -> TypeCheck (TVal, Kinded Expr)
forall a.
Bool
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
forall (m :: * -> *) a. MonadCxt m => Bool -> m a -> m a
checkingCon Bool
False (TypeCheck (TVal, Kinded Expr) -> TypeCheck (TVal, Kinded Expr))
-> TypeCheck (TVal, Kinded Expr) -> TypeCheck (TVal, Kinded Expr)
forall a b. (a -> b) -> a -> b
$ do
(v, Kinded ki1 e1e) <- Expr -> TypeCheck (TVal, Kinded Expr)
inferExpr Expr
e1
(Kinded ki2 (_, e2e), bv) <- checkApp e2 v
return (bv, Kinded ki1 $ App e1e e2e)
(Def id :: DefId
id@(DefId {IdKind
idKind :: IdKind
idKind :: DefId -> IdKind
idKind, idName :: DefId -> QName
idName = QName
name})) | Bool -> Bool
not (IdKind -> Bool
conKind IdKind
idKind) -> do
mitem <- StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) CxtEntry1
-> StateT
TCState
(ReaderT TCContext (ExceptT TraceError IO))
(Maybe CxtEntry1)
forall e (m :: * -> *) a. MonadError e m => m a -> m (Maybe a)
errorToMaybe (StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) CxtEntry1
-> StateT
TCState
(ReaderT TCContext (ExceptT TraceError IO))
(Maybe CxtEntry1))
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) CxtEntry1
-> StateT
TCState
(ReaderT TCContext (ExceptT TraceError IO))
(Maybe CxtEntry1)
forall a b. (a -> b) -> a -> b
$ Name
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) CxtEntry1
forall (m :: * -> *). MonadCxt m => Name -> m CxtEntry1
lookupName1 (Name
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) CxtEntry1)
-> Name
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) CxtEntry1
forall a b. (a -> b) -> a -> b
$ QName -> Name
unqual QName
name
case mitem of
Just CxtEntry1
item -> do
let pol :: Pol
pol = (Dec -> Pol
forall pol. Polarity pol => Decoration pol -> pol
polarity (Dec -> Pol) -> Dec -> Pol
forall a b. (a -> b) -> a -> b
$ Domain -> Dec
forall a. Dom a -> Dec
decor (Domain -> Dec) -> Domain -> Dec
forall a b. (a -> b) -> a -> b
$ CxtEntry1 -> Domain
forall a. CxtE a -> a
domain CxtEntry1
item)
let upol :: PProd
upol = (UDec -> PProd
forall pol. Polarity pol => Decoration pol -> pol
polarity (UDec -> PProd) -> UDec -> PProd
forall a b. (a -> b) -> a -> b
$ CxtEntry1 -> UDec
forall a. CxtE a -> UDec
upperDec CxtEntry1
item)
mId <- (TCContext -> Maybe DefId)
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) (Maybe DefId)
forall r (m :: * -> *) a. MonadReader r m => (r -> a) -> m a
asks TCContext -> Maybe DefId
checkingMutualName
case mId of
Just DefId
srcId ->
DefId
-> DefId
-> PProd
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
addPosEdge DefId
srcId DefId
id PProd
upol
Maybe DefId
Nothing ->
String
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall (m :: * -> *) a.
MonadError TraceError m =>
String -> m a -> m a
enter (String
"recursive occurrence of " String -> String -> String
forall a. [a] -> [a] -> [a]
++ QName -> String
forall a. Show a => a -> String
show QName
name String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
" not strictly positive") (StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ())
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall a b. (a -> b) -> a -> b
$
Pol
-> PProd
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
leqPolM Pol
pol PProd
upol
return (typ $ domain item, Kinded (kind $ domain item) $ e)
Maybe CxtEntry1
Nothing ->
do sige <- QName
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) SigDef
forall (m :: * -> *). MonadSig m => QName -> m SigDef
lookupSymbQ QName
name
case sige of
(DataSig { symbTyp :: SigDef -> TVal
symbTyp = TVal
tv }) -> (TVal, Kinded Expr) -> TypeCheck (TVal, Kinded Expr)
forall a.
a -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
forall (m :: * -> *) a. Monad m => a -> m a
return (TVal
tv, Kind -> Expr -> Kinded Expr
forall a. Kind -> a -> Kinded a
Kinded (SigDef -> Kind
symbolKind SigDef
sige) Expr
e)
(FunSig { symbTyp :: SigDef -> TVal
symbTyp = TVal
tv }) -> (TVal, Kinded Expr) -> TypeCheck (TVal, Kinded Expr)
forall a.
a -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
forall (m :: * -> *) a. Monad m => a -> m a
return (TVal
tv, Kind -> Expr -> Kinded Expr
forall a. Kind -> a -> Kinded a
Kinded (SigDef -> Kind
symbolKind SigDef
sige) Expr
e)
(ConSig { symbTyp :: SigDef -> TVal
symbTyp = TVal
tv }) -> Kinded Expr -> TVal -> TypeCheck (TVal, Kinded Expr)
returnSing (Kind -> Expr -> Kinded Expr
forall a. Kind -> a -> Kinded a
Kinded Kind
kTerm Expr
e) TVal
tv
(LetSig { symbTyp :: SigDef -> TVal
symbTyp = TVal
tv }) -> (TVal, Kinded Expr) -> TypeCheck (TVal, Kinded Expr)
forall a.
a -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
forall (m :: * -> *) a. Monad m => a -> m a
return (TVal
tv, Kind -> Expr -> Kinded Expr
forall a. Kind -> a -> Kinded a
Kinded (SigDef -> Kind
symbolKind SigDef
sige) Expr
e)
Expr
_ -> String -> TypeCheck (TVal, Kinded Expr)
forall (m :: * -> *) a. MonadError TraceError m => String -> m a
throwErrorMsg (String -> TypeCheck (TVal, Kinded Expr))
-> String -> TypeCheck (TVal, Kinded Expr)
forall a b. (a -> b) -> a -> b
$ String
"cannot infer type of " String -> String -> String
forall a. [a] -> [a] -> [a]
++ Expr -> String
forall a. Show a => a -> String
show Expr
e
) TypeCheck (TVal, Kinded Expr)
-> ((TVal, Kinded Expr) -> TypeCheck (TVal, Kinded Expr))
-> TypeCheck (TVal, Kinded Expr)
forall a b.
StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
-> (a
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) b)
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \ (TVal, Kinded Expr)
tv -> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) TCContext
forall r (m :: * -> *). MonadReader r m => m r
ask StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) TCContext
-> (TCContext -> TypeCheck (TVal, Kinded Expr))
-> TypeCheck (TVal, Kinded Expr)
forall a b.
StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
-> (a
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) b)
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \ TCContext
ce ->
String
-> TypeCheck (TVal, Kinded Expr) -> TypeCheck (TVal, Kinded Expr)
forall a. String -> a -> a
traceCheck (String
"inferExpr: " String -> String -> String
forall a. [a] -> [a] -> [a]
++ Ren -> String
forall a. Show a => a -> String
show (TCContext -> Ren
renaming TCContext
ce) String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
";" String -> String -> String
forall a. [a] -> [a] -> [a]
++ SemCxt -> String
forall a. Show a => a -> String
show (TCContext -> SemCxt
context TCContext
ce) String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
" |- " String -> String -> String
forall a. [a] -> [a] -> [a]
++ Expr -> String
forall a. Show a => a -> String
show Expr
e String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
" :=> " String -> String -> String
forall a. [a] -> [a] -> [a]
++ (TVal, Kinded Expr) -> String
forall a. Show a => a -> String
show (TVal, Kinded Expr)
tv String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
" in env" String -> String -> String
forall a. [a] -> [a] -> [a]
++ Env2 -> String
forall a. Show a => a -> String
show (TCContext -> Env2
environ TCContext
ce)) (TypeCheck (TVal, Kinded Expr) -> TypeCheck (TVal, Kinded Expr))
-> TypeCheck (TVal, Kinded Expr) -> TypeCheck (TVal, Kinded Expr)
forall a b. (a -> b) -> a -> b
$
(TVal, Kinded Expr) -> TypeCheck (TVal, Kinded Expr)
forall a.
a -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
forall (m :: * -> *) a. Monad m => a -> m a
return (TVal, Kinded Expr)
tv
checkType :: Expr -> TypeCheck (Kinded Extr)
checkType :: Expr -> TypeCheck (Kinded Expr)
checkType Expr
t =
String -> TypeCheck (Kinded Expr) -> TypeCheck (Kinded Expr)
forall (m :: * -> *) a.
MonadError TraceError m =>
String -> m a -> m a
enter (String
"not a type: " String -> String -> String
forall a. [a] -> [a] -> [a]
++ Expr -> String
forall a. Show a => a -> String
show Expr
t) (TypeCheck (Kinded Expr) -> TypeCheck (Kinded Expr))
-> TypeCheck (Kinded Expr) -> TypeCheck (Kinded Expr)
forall a b. (a -> b) -> a -> b
$
TypeCheck (Kinded Expr) -> TypeCheck (Kinded Expr)
forall a.
StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
forall (m :: * -> *) a. MonadCxt m => m a -> m a
resurrect (TypeCheck (Kinded Expr) -> TypeCheck (Kinded Expr))
-> TypeCheck (Kinded Expr) -> TypeCheck (Kinded Expr)
forall a b. (a -> b) -> a -> b
$ do
(s, te) <- Expr
-> StateT
TCState
(ReaderT TCContext (ExceptT TraceError IO))
(Sort TVal, Kinded Expr)
inferType Expr
t
leqSort Pos s (Set VInfty)
return te
checkSmallType :: Expr -> TypeCheck (Kinded Extr)
checkSmallType :: Expr -> TypeCheck (Kinded Expr)
checkSmallType Expr
t =
String -> TypeCheck (Kinded Expr) -> TypeCheck (Kinded Expr)
forall (m :: * -> *) a.
MonadError TraceError m =>
String -> m a -> m a
enter (String
"not a set: " String -> String -> String
forall a. [a] -> [a] -> [a]
++ Expr -> String
forall a. Show a => a -> String
show Expr
t) (TypeCheck (Kinded Expr) -> TypeCheck (Kinded Expr))
-> TypeCheck (Kinded Expr) -> TypeCheck (Kinded Expr)
forall a b. (a -> b) -> a -> b
$
TypeCheck (Kinded Expr) -> TypeCheck (Kinded Expr)
forall a.
StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
forall (m :: * -> *) a. MonadCxt m => m a -> m a
resurrect (TypeCheck (Kinded Expr) -> TypeCheck (Kinded Expr))
-> TypeCheck (Kinded Expr) -> TypeCheck (Kinded Expr)
forall a b. (a -> b) -> a -> b
$ do
(s, te) <- Expr
-> StateT
TCState
(ReaderT TCContext (ExceptT TraceError IO))
(Sort TVal, Kinded Expr)
inferType Expr
t
case s of
Set TVal
VZero -> Kinded Expr -> TypeCheck (Kinded Expr)
forall a.
a -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
forall (m :: * -> *) a. Monad m => a -> m a
return Kinded Expr
te
CoSet{} -> Kinded Expr -> TypeCheck (Kinded Expr)
forall a.
a -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
forall (m :: * -> *) a. Monad m => a -> m a
return Kinded Expr
te
Sort TVal
_ -> String -> TypeCheck (Kinded Expr)
forall (m :: * -> *) a. MonadError TraceError m => String -> m a
throwErrorMsg (String -> TypeCheck (Kinded Expr))
-> String -> TypeCheck (Kinded Expr)
forall a b. (a -> b) -> a -> b
$ String
"expected " String -> String -> String
forall a. [a] -> [a] -> [a]
++ Sort TVal -> String
forall a. Show a => a -> String
show Sort TVal
s String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
" to be Set or CoSet _"
checkTele :: Telescope -> TypeCheck a -> TypeCheck (ETelescope, a)
checkTele :: forall a. Telescope -> TypeCheck a -> TypeCheck (Telescope, a)
checkTele (Telescope [TBind]
tel) TypeCheck a
k = [TBind]
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) (Telescope, a)
loop [TBind]
tel where
loop :: [TBind]
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) (Telescope, a)
loop [TBind]
tel = case [TBind]
tel of
[] -> (Telescope
emptyTel,) (a -> (Telescope, a))
-> TypeCheck a
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) (Telescope, a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> TypeCheck a
k
tb :: TBind
tb@(TBind Name
x (Domain Expr
t Kind
_ Dec
dec)) : [TBind]
tel -> do
Kinded ki te <- Expr -> TypeCheck (Kinded Expr)
checkType Expr
t
let tb = Name -> Dom Expr -> TBind
forall a. Name -> Dom a -> TBinding a
TBind Name
x (Expr -> Kind -> Dec -> Dom Expr
forall a. a -> Kind -> Dec -> Dom a
Domain Expr
te (Kind -> Kind
predKind Kind
ki) Dec
dec)
(tel, a) <- addBind tb $ loop tel
return (Telescope $ tb : telescope tel, a)
checkCases :: Val -> TVal -> [Clause] -> TypeCheck (Kinded [EClause])
checkCases :: TVal
-> TVal
-> [Clause]
-> StateT
TCState
(ReaderT TCContext (ExceptT TraceError IO))
(Kinded [Clause])
checkCases = Int
-> TVal
-> TVal
-> [Clause]
-> StateT
TCState
(ReaderT TCContext (ExceptT TraceError IO))
(Kinded [Clause])
checkCases' Int
1
checkCases' :: Int -> Val -> TVal -> [Clause] -> TypeCheck (Kinded [EClause])
checkCases' :: Int
-> TVal
-> TVal
-> [Clause]
-> StateT
TCState
(ReaderT TCContext (ExceptT TraceError IO))
(Kinded [Clause])
checkCases' Int
i TVal
v TVal
tv [] = Kinded [Clause]
-> StateT
TCState
(ReaderT TCContext (ExceptT TraceError IO))
(Kinded [Clause])
forall a.
a -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
forall (m :: * -> *) a. Monad m => a -> m a
return (Kinded [Clause]
-> StateT
TCState
(ReaderT TCContext (ExceptT TraceError IO))
(Kinded [Clause]))
-> Kinded [Clause]
-> StateT
TCState
(ReaderT TCContext (ExceptT TraceError IO))
(Kinded [Clause])
forall a b. (a -> b) -> a -> b
$ Kind -> [Clause] -> Kinded [Clause]
forall a. Kind -> a -> Kinded a
Kinded Kind
NoKind []
checkCases' Int
i TVal
v TVal
tv (Clause
c : [Clause]
cl) = do
Kinded k1 ce <- Int -> TVal -> TVal -> Clause -> TypeCheck (Kinded Clause)
checkCase Int
i TVal
v TVal
tv Clause
c
Kinded k2 cle <- checkCases' (i + 1) v tv cl
return $ Kinded (unionKind k1 k2) $ ce : cle
checkCase :: Int -> Val -> TVal -> Clause -> TypeCheck (Kinded EClause)
checkCase :: Int -> TVal -> TVal -> Clause -> TypeCheck (Kinded Clause)
checkCase Int
i TVal
v TVal
tv cl :: Clause
cl@(Clause TeleVal
_ [Pattern
p] Maybe Expr
mrhs) = String -> TypeCheck (Kinded Clause) -> TypeCheck (Kinded Clause)
forall (m :: * -> *) a.
MonadError TraceError m =>
String -> m a -> m a
enter (String
"case " String -> String -> String
forall a. [a] -> [a] -> [a]
++ Int -> String
forall a. Show a => a -> String
show Int
i) (TypeCheck (Kinded Clause) -> TypeCheck (Kinded Clause))
-> TypeCheck (Kinded Clause) -> TypeCheck (Kinded Clause)
forall a b. (a -> b) -> a -> b
$
do
(flex,ins,cxt,vt,pe,pv,absp) <- Dec
-> [Goal]
-> Substitution
-> TVal
-> Pattern
-> TypeCheck
([Goal], Substitution, TCContext, TVal, Pattern, TVal, Bool)
checkPattern Dec
forall pol. Polarity pol => pol
neutral [] Substitution
emptySub TVal
tv Pattern
p
local (\ TCContext
_ -> TCContext
cxt) $ do
mapM_ (checkGoal ins) flex
tel <- getContextTele
case (absp,mrhs) of
(Bool
True,Maybe Expr
Nothing) -> Kinded Clause -> TypeCheck (Kinded Clause)
forall a.
a -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
forall (m :: * -> *) a. Monad m => a -> m a
return (Kinded Clause -> TypeCheck (Kinded Clause))
-> Kinded Clause -> TypeCheck (Kinded Clause)
forall a b. (a -> b) -> a -> b
$ Kind -> Clause -> Kinded Clause
forall a. Kind -> a -> Kinded a
Kinded Kind
NoKind (TeleVal -> [Pattern] -> Maybe Expr -> Clause
Clause TeleVal
tel [Pattern
pe] Maybe Expr
forall a. Maybe a
Nothing)
(Bool
False,Maybe Expr
Nothing) -> String -> TypeCheck (Kinded Clause)
forall (m :: * -> *) a. MonadError TraceError m => String -> m a
throwErrorMsg (String
"missing right hand side in case " String -> String -> String
forall a. [a] -> [a] -> [a]
++ Clause -> String
showCase Clause
cl)
(Bool
True,Just Expr
rhs) -> String -> TypeCheck (Kinded Clause)
forall (m :: * -> *) a. MonadError TraceError m => String -> m a
throwErrorMsg (String
"absurd pattern requires no right hand side in case " String -> String -> String
forall a. [a] -> [a] -> [a]
++ Clause -> String
showCase Clause
cl)
(Bool
False,Just Expr
rhs) -> do
Rewrite
-> [TVal]
-> ([TVal] -> TypeCheck (Kinded Clause))
-> TypeCheck (Kinded Clause)
forall a.
Rewrite
-> [TVal]
-> ([TVal]
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a)
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
forall (m :: * -> *) a.
MonadCxt m =>
Rewrite -> [TVal] -> ([TVal] -> m a) -> m a
addRewrite (TVal -> TVal -> Rewrite
Rewrite TVal
v TVal
pv) [TVal
vt] (([TVal] -> TypeCheck (Kinded Clause))
-> TypeCheck (Kinded Clause))
-> ([TVal] -> TypeCheck (Kinded Clause))
-> TypeCheck (Kinded Clause)
forall a b. (a -> b) -> a -> b
$ \ [TVal
vt'] -> do
Kinded ki rhse <- Substitution -> Expr -> TVal -> TypeCheck (Kinded Expr)
checkRHS Substitution
ins Expr
rhs TVal
vt'
return $ Kinded ki (Clause tel [pe] (Just rhse))
checkFun :: Type -> [Clause] -> TypeCheck (Kinded [EClause])
checkFun :: Expr
-> [Clause]
-> StateT
TCState
(ReaderT TCContext (ExceptT TraceError IO))
(Kinded [Clause])
checkFun Expr
t [Clause]
cl = do
tv <- Expr -> TypeCheck TVal
whnf' Expr
t
checkClauses tv cl
checkClauses :: TVal -> [Clause] -> TypeCheck (Kinded [EClause])
checkClauses :: TVal
-> [Clause]
-> StateT
TCState
(ReaderT TCContext (ExceptT TraceError IO))
(Kinded [Clause])
checkClauses = Int
-> TVal
-> [Clause]
-> StateT
TCState
(ReaderT TCContext (ExceptT TraceError IO))
(Kinded [Clause])
checkClauses' Int
1
checkClauses' :: Int -> TVal -> [Clause] -> TypeCheck (Kinded [EClause])
checkClauses' :: Int
-> TVal
-> [Clause]
-> StateT
TCState
(ReaderT TCContext (ExceptT TraceError IO))
(Kinded [Clause])
checkClauses' Int
i TVal
tv [] = Kinded [Clause]
-> StateT
TCState
(ReaderT TCContext (ExceptT TraceError IO))
(Kinded [Clause])
forall a.
a -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
forall (m :: * -> *) a. Monad m => a -> m a
return (Kinded [Clause]
-> StateT
TCState
(ReaderT TCContext (ExceptT TraceError IO))
(Kinded [Clause]))
-> Kinded [Clause]
-> StateT
TCState
(ReaderT TCContext (ExceptT TraceError IO))
(Kinded [Clause])
forall a b. (a -> b) -> a -> b
$ Kind -> [Clause] -> Kinded [Clause]
forall a. Kind -> a -> Kinded a
Kinded Kind
NoKind ([])
checkClauses' Int
i TVal
tv (Clause
c:[Clause]
cl) = do
Kinded ki1 ce <- Int -> TVal -> Clause -> TypeCheck (Kinded Clause)
checkClause Int
i TVal
tv Clause
c
Kinded ki2 cle <- checkClauses' (i + 1) tv cl
return $ Kinded (unionKind ki1 ki2) $ (ce : cle)
checkClause :: Int -> TVal -> Clause -> TypeCheck (Kinded EClause)
checkClause :: Int -> TVal -> Clause -> TypeCheck (Kinded Clause)
checkClause Int
i TVal
tv cl :: Clause
cl@(Clause TeleVal
_ [Pattern]
pl Maybe Expr
mrhs) = String -> TypeCheck (Kinded Clause) -> TypeCheck (Kinded Clause)
forall (m :: * -> *) a.
MonadError TraceError m =>
String -> m a -> m a
enter (String
"clause " String -> String -> String
forall a. [a] -> [a] -> [a]
++ Int -> String
forall a. Show a => a -> String
show Int
i) (TypeCheck (Kinded Clause) -> TypeCheck (Kinded Clause))
-> TypeCheck (Kinded Clause) -> TypeCheck (Kinded Clause)
forall a b. (a -> b) -> a -> b
$ do
(flex,ins,cxt,tv0,ple,plv,absp) <- Dec
-> [Goal]
-> Substitution
-> TVal
-> [Pattern]
-> TypeCheck
([Goal], Substitution, TCContext, TVal, [Pattern], [TVal], Bool)
checkPatterns Dec
forall pol. Polarity pol => pol
neutral [] Substitution
emptySub TVal
tv [Pattern]
pl
local (\ TCContext
_ -> TCContext
cxt { consistencyCheck = (mutualCo cxt == Ind) }) $ do
mapM_ (checkGoal ins) flex
tel <- getContextTele
case (absp,mrhs) of
(Bool
True,Maybe Expr
Nothing) -> Kinded Clause -> TypeCheck (Kinded Clause)
forall a.
a -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
forall (m :: * -> *) a. Monad m => a -> m a
return (Kinded Clause -> TypeCheck (Kinded Clause))
-> Kinded Clause -> TypeCheck (Kinded Clause)
forall a b. (a -> b) -> a -> b
$ Kind -> Clause -> Kinded Clause
forall a. Kind -> a -> Kinded a
Kinded Kind
NoKind (TeleVal -> [Pattern] -> Maybe Expr -> Clause
Clause TeleVal
tel [Pattern]
ple Maybe Expr
forall a. Maybe a
Nothing)
(Bool
False,Maybe Expr
Nothing) -> String -> TypeCheck (Kinded Clause)
forall (m :: * -> *) a. MonadError TraceError m => String -> m a
throwErrorMsg (String
"missing right hand side in clause " String -> String -> String
forall a. [a] -> [a] -> [a]
++ Clause -> String
forall a. Show a => a -> String
show Clause
cl)
(Bool
True,Just Expr
rhs) -> String -> TypeCheck (Kinded Clause)
forall (m :: * -> *) a. MonadError TraceError m => String -> m a
throwErrorMsg (String
"absurd pattern requires no right hand side in clause " String -> String -> String
forall a. [a] -> [a] -> [a]
++ Clause -> String
forall a. Show a => a -> String
show Clause
cl)
(Bool
False,Just Expr
rhs) -> do
Kinded ki rhse <- Substitution -> Expr -> TVal -> TypeCheck (Kinded Expr)
checkRHS Substitution
ins Expr
rhs TVal
tv0
env <- getEnv
[rhse] <- solveAndModify [rhse] env
return $ Kinded ki (Clause tel ple (Just rhse))
type Substitution = Valuation
emptySub :: Substitution
emptySub :: Substitution
emptySub = Substitution
emptyVal
sgSub :: Int -> Val -> Substitution
sgSub :: Int -> TVal -> Substitution
sgSub = Int -> TVal -> Substitution
sgVal
lookupSub :: Int -> Substitution -> Maybe Val
lookupSub :: Int -> Substitution -> Maybe TVal
lookupSub Int
i = Int -> [(Int, TVal)] -> Maybe TVal
forall a b. Eq a => a -> [(a, b)] -> Maybe b
lookup Int
i ([(Int, TVal)] -> Maybe TVal)
-> (Substitution -> [(Int, TVal)]) -> Substitution -> Maybe TVal
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Substitution -> [(Int, TVal)]
valuation
type DotFlex = (Int,(Expr,Domain))
data Goal
= DotFlex Int (Maybe Expr) Domain
| MaxMatches Int TVal
| DottedCons Dotted Pattern TVal
deriving Int -> Goal -> String -> String
[Goal] -> String -> String
Goal -> String
(Int -> Goal -> String -> String)
-> (Goal -> String) -> ([Goal] -> String -> String) -> Show Goal
forall a.
(Int -> a -> String -> String)
-> (a -> String) -> ([a] -> String -> String) -> Show a
$cshowsPrec :: Int -> Goal -> String -> String
showsPrec :: Int -> Goal -> String -> String
$cshow :: Goal -> String
show :: Goal -> String
$cshowList :: [Goal] -> String -> String
showList :: [Goal] -> String -> String
Show
checkPatterns :: Dec -> [Goal] -> Substitution -> TVal -> [Pattern] -> TypeCheck ([Goal],Substitution,TCContext,TVal,[EPattern],[Val],Bool)
checkPatterns :: Dec
-> [Goal]
-> Substitution
-> TVal
-> [Pattern]
-> TypeCheck
([Goal], Substitution, TCContext, TVal, [Pattern], [TVal], Bool)
checkPatterns Dec
dec0 [Goal]
flex Substitution
ins TVal
v [Pattern]
pl =
case TVal
v of
VMeasured Measure TVal
mu TVal
vb -> Measure TVal
-> TypeCheck
([Goal], Substitution, TCContext, TVal, [Pattern], [TVal], Bool)
-> TypeCheck
([Goal], Substitution, TCContext, TVal, [Pattern], [TVal], Bool)
forall a.
Measure TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
forall (m :: * -> *) a. MonadCxt m => Measure TVal -> m a -> m a
setMeasure Measure TVal
mu (TypeCheck
([Goal], Substitution, TCContext, TVal, [Pattern], [TVal], Bool)
-> TypeCheck
([Goal], Substitution, TCContext, TVal, [Pattern], [TVal], Bool))
-> TypeCheck
([Goal], Substitution, TCContext, TVal, [Pattern], [TVal], Bool)
-> TypeCheck
([Goal], Substitution, TCContext, TVal, [Pattern], [TVal], Bool)
forall a b. (a -> b) -> a -> b
$ Dec
-> [Goal]
-> Substitution
-> TVal
-> [Pattern]
-> TypeCheck
([Goal], Substitution, TCContext, TVal, [Pattern], [TVal], Bool)
checkPatterns Dec
dec0 [Goal]
flex Substitution
ins TVal
vb [Pattern]
pl
VGuard Bound TVal
beta TVal
vb -> Bound TVal
-> TypeCheck
([Goal], Substitution, TCContext, TVal, [Pattern], [TVal], Bool)
-> TypeCheck
([Goal], Substitution, TCContext, TVal, [Pattern], [TVal], Bool)
forall a.
Bound TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
forall (m :: * -> *) a. MonadCxt m => Bound TVal -> m a -> m a
addBoundHyp Bound TVal
beta (TypeCheck
([Goal], Substitution, TCContext, TVal, [Pattern], [TVal], Bool)
-> TypeCheck
([Goal], Substitution, TCContext, TVal, [Pattern], [TVal], Bool))
-> TypeCheck
([Goal], Substitution, TCContext, TVal, [Pattern], [TVal], Bool)
-> TypeCheck
([Goal], Substitution, TCContext, TVal, [Pattern], [TVal], Bool)
forall a b. (a -> b) -> a -> b
$ Dec
-> [Goal]
-> Substitution
-> TVal
-> [Pattern]
-> TypeCheck
([Goal], Substitution, TCContext, TVal, [Pattern], [TVal], Bool)
checkPatterns Dec
dec0 [Goal]
flex Substitution
ins TVal
vb [Pattern]
pl
TVal
_ -> case [Pattern]
pl of
[] -> do cxt <- StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) TCContext
forall r (m :: * -> *). MonadReader r m => m r
ask
return (flex,ins,cxt,v,[],[],False)
(Pattern
p:[Pattern]
pl') -> do (flex',ins',cxt',v',pe,pv,absp) <- Dec
-> [Goal]
-> Substitution
-> TVal
-> Pattern
-> TypeCheck
([Goal], Substitution, TCContext, TVal, Pattern, TVal, Bool)
checkPattern Dec
dec0 [Goal]
flex Substitution
ins TVal
v Pattern
p
local (\ TCContext
_ -> TCContext
cxt') $ do
(flex'',ins'',cxt'',v'',ple,plv,absps) <- checkPatterns dec0 flex' ins' v' pl'
return (flex'',ins'',cxt'',v'', pe:ple, pv:plv, absp || absps)
checkPattern :: Dec -> [Goal] -> Substitution -> TVal -> Pattern -> TypeCheck ([Goal],Substitution,TCContext,TVal,EPattern,Val,Bool)
checkPattern :: Dec
-> [Goal]
-> Substitution
-> TVal
-> Pattern
-> TypeCheck
([Goal], Substitution, TCContext, TVal, Pattern, TVal, Bool)
checkPattern Dec
dec0 [Goal]
flex Substitution
ins TVal
tv Pattern
p =
String
-> TypeCheck
([Goal], Substitution, TCContext, TVal, Pattern, TVal, Bool)
-> TypeCheck
([Goal], Substitution, TCContext, TVal, Pattern, TVal, Bool)
forall (m :: * -> *) a.
MonadError TraceError m =>
String -> m a -> m a
enter (String
"pattern " String -> String -> String
forall a. [a] -> [a] -> [a]
++ Pattern -> String
forall a. Show a => a -> String
show Pattern
p) (TypeCheck
([Goal], Substitution, TCContext, TVal, Pattern, TVal, Bool)
-> TypeCheck
([Goal], Substitution, TCContext, TVal, Pattern, TVal, Bool))
-> TypeCheck
([Goal], Substitution, TCContext, TVal, Pattern, TVal, Bool)
-> TypeCheck
([Goal], Substitution, TCContext, TVal, Pattern, TVal, Bool)
forall a b. (a -> b) -> a -> b
$ do
tv <- TVal -> TypeCheck TVal
force TVal
tv
case tv of
VApp (VDef (DefId IdKind
DatK QName
d)) [TVal]
vl ->
case Pattern
p of
ProjP Name
proj -> do
tv <- TVal -> Name -> TVal -> TypeCheck TVal
projectType TVal
tv Name
proj TVal
VIrr
cxt <- ask
return (flex, ins, cxt, tv, p, VProj Post proj, False)
Pattern
_ -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> TypeCheck
([Goal], Substitution, TCContext, TVal, Pattern, TVal, Bool)
forall (m :: * -> *) a. MonadError TraceError m => m Doc -> m a
failDoc (String
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall {m :: * -> *}. Monad m => String -> m Doc
text String
"cannot eliminate type" StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall {f :: * -> *}. Applicative f => f Doc -> f Doc -> f Doc
<+> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall a.
PrettyTCM a =>
a -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
prettyTCM TVal
tv StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall {f :: * -> *}. Applicative f => f Doc -> f Doc -> f Doc
<+> String
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall {m :: * -> *}. Monad m => String -> m Doc
text String
"with a non-projection pattern")
VQuant PiSigma
Pi Name
x dom :: Domain
dom@(Domain TVal
av Kind
ki Dec
Hidden) TVal
fv -> do
Name
-> Domain
-> (Int
-> TVal
-> TypeCheck
([Goal], Substitution, TCContext, TVal, Pattern, TVal, Bool))
-> TypeCheck
([Goal], Substitution, TCContext, TVal, Pattern, TVal, Bool)
forall a.
Name
-> Domain
-> (Int
-> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a)
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
forall (m :: * -> *) a.
MonadCxt m =>
Name -> Domain -> (Int -> TVal -> m a) -> m a
newWithGen Name
x Domain
dom ((Int
-> TVal
-> TypeCheck
([Goal], Substitution, TCContext, TVal, Pattern, TVal, Bool))
-> TypeCheck
([Goal], Substitution, TCContext, TVal, Pattern, TVal, Bool))
-> (Int
-> TVal
-> TypeCheck
([Goal], Substitution, TCContext, TVal, Pattern, TVal, Bool))
-> TypeCheck
([Goal], Substitution, TCContext, TVal, Pattern, TVal, Bool)
forall a b. (a -> b) -> a -> b
$ \ Int
i TVal
xv -> do
tv <- TVal
fv TVal -> TVal -> TypeCheck TVal
`app` TVal
xv
checkPattern dec0 (DotFlex i Nothing dom : flex) ins tv p
VQuant PiSigma
Pi Name
x (Domain TVal
av Kind
ki Dec
dec) TVal
fv -> do
let decEr :: Dec
decEr = Dec
dec Dec -> Dec -> Dec
forall pol. Polarity pol => pol -> pol -> pol
`compose` Dec
dec0
let domEr :: Domain
domEr = (TVal -> Kind -> Dec -> Domain
forall a. a -> Kind -> Dec -> Dom a
Domain TVal
av Kind
ki Dec
decEr)
case Pattern
p of
SuccP Pattern
p2 -> do
Bool
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (TVal
av TVal -> TVal -> Bool
forall a. Eq a => a -> a -> Bool
/= TVal
vSize) (StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ())
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall a b. (a -> b) -> a -> b
$ String
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall (m :: * -> *) a. MonadError TraceError m => String -> m a
throwErrorMsg String
"checkPattern: expected type Size"
Bool
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (Pattern -> Bool
isSuccessorPattern Pattern
p2) (StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ())
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall a b. (a -> b) -> a -> b
$ Pattern
-> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
cannotMatchDeep Pattern
p TVal
tv
co <- (TCContext -> Co)
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Co
forall r (m :: * -> *) a. MonadReader r m => (r -> a) -> m a
asks TCContext -> Co
mutualCo
when (co /= CoInd) $
throwErrorMsg ("successor pattern only allowed in cofun")
enterDoc (text ("checkPattern " ++ show p ++" : matching on size, checking that target") <+> prettyTCM tv <+> text "ends in correct coinductive sized type") $
underAbs x domEr fv $ \ Int
i TVal
_ TVal
bv -> Int
-> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
endsInSizedCo Int
i TVal
bv
cxt <- ask
let sucTy = (TVal
vFinSize TVal -> TVal -> TVal
`arrow` TVal
vFinSize)
(flex',ins',cxt',tv',p2e,p2v,absp) <- checkPattern decEr flex ins sucTy p2
let pe = Pattern -> Pattern
forall e. Pat e -> Pat e
SuccP Pattern
p2e
let pv = TVal -> TVal
VSucc TVal
p2v
vb <- app fv pv
return (flex',ins',cxt',vb,pe,pv,absp)
Pattern
_ -> do
(flex',ins',cxt',pe,pv,absp) <- [Goal]
-> Substitution
-> Domain
-> Pattern
-> TypeCheck ([Goal], Substitution, TCContext, Pattern, TVal, Bool)
checkPattern' [Goal]
flex Substitution
ins Domain
domEr Pattern
p
vb <- app fv pv
vb <- substitute ins' vb
return (flex',ins',cxt',vb,pe,pv,absp)
TVal
_ -> String
-> TypeCheck
([Goal], Substitution, TCContext, TVal, Pattern, TVal, Bool)
forall (m :: * -> *) a. MonadError TraceError m => String -> m a
throwErrorMsg (String
-> TypeCheck
([Goal], Substitution, TCContext, TVal, Pattern, TVal, Bool))
-> String
-> TypeCheck
([Goal], Substitution, TCContext, TVal, Pattern, TVal, Bool)
forall a b. (a -> b) -> a -> b
$ String
"checkPattern: expected function type, found " String -> String -> String
forall a. [a] -> [a] -> [a]
++ TVal -> String
forall a. Show a => a -> String
show TVal
tv
turnIntoVarPatAtUnitType :: TVal -> Pattern -> TypeCheck Pattern
turnIntoVarPatAtUnitType :: TVal
-> Pattern
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) Pattern
turnIntoVarPatAtUnitType (VApp (VDef (DefId IdKind
DatK QName
n)) [TVal]
_) p :: Pattern
p@(ConP PatternInfo
pi QName
c []) =
(StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Pattern
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) Pattern
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) Pattern)
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) Pattern
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) Pattern
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) Pattern
forall a b c. (a -> b -> c) -> b -> a -> c
flip (StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Bool
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) Pattern
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) Pattern
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) Pattern
forall (m :: * -> *) a. Monad m => m Bool -> m a -> m a -> m a
ifM (StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Bool
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) Pattern
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) Pattern
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) Pattern)
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Bool
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) Pattern
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) Pattern
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) Pattern
forall a b. (a -> b) -> a -> b
$ QName
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Bool
isUnitData QName
n) (Pattern
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) Pattern
forall a.
a -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
forall (m :: * -> *) a. Monad m => a -> m a
return Pattern
p) (StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Pattern
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) Pattern)
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) Pattern
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) Pattern
forall a b. (a -> b) -> a -> b
$ do
let x :: Name
x = String -> Name
fresh String
"un!t"
Pattern
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) Pattern
forall a.
a -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
forall (m :: * -> *) a. Monad m => a -> m a
return (Pattern
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) Pattern)
-> Pattern
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) Pattern
forall a b. (a -> b) -> a -> b
$ Name -> Pattern
forall e. Name -> Pat e
VarP Name
x
turnIntoVarPatAtUnitType TVal
_ Pattern
p = Pattern
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) Pattern
forall a.
a -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
forall (m :: * -> *) a. Monad m => a -> m a
return Pattern
p
checkPattern' :: [Goal] -> Substitution -> Domain -> Pattern -> TypeCheck ([Goal],Substitution,TCContext,EPattern,Val,Bool)
checkPattern' :: [Goal]
-> Substitution
-> Domain
-> Pattern
-> TypeCheck ([Goal], Substitution, TCContext, Pattern, TVal, Bool)
checkPattern' [Goal]
flex Substitution
ins domEr :: Domain
domEr@(Domain TVal
av Kind
ki Dec
decEr) Pattern
p = do
p <- TVal
-> Pattern
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) Pattern
turnIntoVarPatAtUnitType TVal
av Pattern
p
case p of
SuccP{} -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> TypeCheck ([Goal], Substitution, TCContext, Pattern, TVal, Bool)
forall (m :: * -> *) a. MonadError TraceError m => m Doc -> m a
failDoc (String
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall {m :: * -> *}. Monad m => String -> m Doc
text String
"successor pattern" StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall {f :: * -> *}. Applicative f => f Doc -> f Doc -> f Doc
<+> Pattern
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall a.
PrettyTCM a =>
a -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
prettyTCM Pattern
p StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall {f :: * -> *}. Applicative f => f Doc -> f Doc -> f Doc
<+> String
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall {m :: * -> *}. Monad m => String -> m Doc
text String
"not allowed here")
PairP Pattern
p1 Pattern
p2 -> do
av <- TVal -> TypeCheck TVal
force TVal
av
case av of
VQuant PiSigma
Sigma Name
y dom1 :: Domain
dom1@(Domain TVal
av1 Kind
ki1 Dec
dec1) TVal
fv -> do
(flex, ins, cxt, pe1, pv1, absp1) <-
[Goal]
-> Substitution
-> Domain
-> Pattern
-> TypeCheck ([Goal], Substitution, TCContext, Pattern, TVal, Bool)
checkPattern' [Goal]
flex Substitution
ins (TVal -> Kind -> Dec -> Domain
forall a. a -> Kind -> Dec -> Dom a
Domain TVal
av1 Kind
ki1 (Dec -> Domain) -> Dec -> Domain
forall a b. (a -> b) -> a -> b
$ Dec
dec1 Dec -> Dec -> Dec
forall pol. Polarity pol => pol -> pol -> pol
`compose` Dec
decEr) Pattern
p1
av2 <- app fv pv1
(flex, ins, cxt, pe2, pv2, absp2) <-
local (const cxt) $
checkPattern' flex ins (Domain av2 ki decEr) p2
return (flex, ins, cxt, PairP pe1 pe2, VPair pv1 pv2, absp1 || absp2)
TVal
_ -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> TypeCheck ([Goal], Substitution, TCContext, Pattern, TVal, Bool)
forall (m :: * -> *) a. MonadError TraceError m => m Doc -> m a
failDoc (String
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall {m :: * -> *}. Monad m => String -> m Doc
text String
"pair pattern" StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall {f :: * -> *}. Applicative f => f Doc -> f Doc -> f Doc
<+> Pattern
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall a.
PrettyTCM a =>
a -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
prettyTCM Pattern
p StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall {f :: * -> *}. Applicative f => f Doc -> f Doc -> f Doc
<+> String
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall {m :: * -> *}. Monad m => String -> m Doc
text String
"could not be checked against type" StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall {f :: * -> *}. Applicative f => f Doc -> f Doc -> f Doc
<+> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall a.
PrettyTCM a =>
a -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
prettyTCM TVal
av)
ProjP Name
proj -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> TypeCheck ([Goal], Substitution, TCContext, Pattern, TVal, Bool)
forall (m :: * -> *) a. MonadError TraceError m => m Doc -> m a
failDoc (String
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall {m :: * -> *}. Monad m => String -> m Doc
text String
"cannot eliminate type" StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall {f :: * -> *}. Applicative f => f Doc -> f Doc -> f Doc
<+> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall a.
PrettyTCM a =>
a -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
prettyTCM TVal
av StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall {f :: * -> *}. Applicative f => f Doc -> f Doc -> f Doc
<+> String
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall {m :: * -> *}. Monad m => String -> m Doc
text String
"with projection pattern" StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall {f :: * -> *}. Applicative f => f Doc -> f Doc -> f Doc
<+> Pattern
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall a.
PrettyTCM a =>
a -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
prettyTCM Pattern
p)
VarP Name
y -> do
Name
-> Domain
-> (TVal
-> TypeCheck
([Goal], Substitution, TCContext, Pattern, TVal, Bool))
-> TypeCheck ([Goal], Substitution, TCContext, Pattern, TVal, Bool)
forall a.
Name
-> Domain
-> (TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a)
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
forall (m :: * -> *) a.
MonadCxt m =>
Name -> Domain -> (TVal -> m a) -> m a
new Name
y Domain
domEr ((TVal
-> TypeCheck
([Goal], Substitution, TCContext, Pattern, TVal, Bool))
-> TypeCheck
([Goal], Substitution, TCContext, Pattern, TVal, Bool))
-> (TVal
-> TypeCheck
([Goal], Substitution, TCContext, Pattern, TVal, Bool))
-> TypeCheck ([Goal], Substitution, TCContext, Pattern, TVal, Bool)
forall a b. (a -> b) -> a -> b
$ \ TVal
xv -> do
cxt' <- StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) TCContext
forall r (m :: * -> *). MonadReader r m => m r
ask
p' <- case av of
VBelow LtLe
Lt TVal
v -> (Expr -> Name -> Pattern) -> Name -> Expr -> Pattern
forall a b c. (a -> b -> c) -> b -> a -> c
flip Expr -> Name -> Pattern
forall e. e -> Name -> Pat e
SizeP Name
y (Expr -> Pattern)
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Expr
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) Pattern
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Expr
toExpr TVal
v
TVal
_ -> Pattern
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) Pattern
forall a.
a -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
forall (m :: * -> *) a. Monad m => a -> m a
return Pattern
p
return (flex, ins, cxt', maybeErase $ p', xv, False)
SizeP Expr
e Name
y -> do
e <- StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Expr
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Expr
forall a.
StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
forall (m :: * -> *) a. MonadCxt m => m a -> m a
resurrect (StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Expr
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Expr)
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Expr
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Expr
forall a b. (a -> b) -> a -> b
$ Expr
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Expr
checkSize Expr
e
newWithGen y domEr $ \ Int
j TVal
xv -> do
ve <- Expr -> TypeCheck TVal
whnf' Expr
e
addBoundHyp (Bound Lt (Measure [xv]) (Measure [ve])) $ do
subtype av (VBelow Lt ve)
cxt' <- ask
return (flex, ins, cxt', maybeErase $ SizeP e y, xv, False)
Pattern
AbsurdP -> do
Bool
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (TVal -> Bool
isFunType TVal
av) (StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ())
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall a b. (a -> b) -> a -> b
$ String
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall (m :: * -> *) a. MonadError TraceError m => String -> m a
throwErrorMsg (String
"absurd pattern " String -> String -> String
forall a. [a] -> [a] -> [a]
++ Pattern -> String
forall a. Show a => a -> String
show Pattern
p String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
" does not match function types, like " String -> String -> String
forall a. [a] -> [a] -> [a]
++ TVal -> String
forall a. Show a => a -> String
show TVal
av)
cxt' <- StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) TCContext
forall r (m :: * -> *). MonadReader r m => m r
ask
return (MaxMatches 0 av : flex, ins, cxt', maybeErase $ AbsurdP, VIrr, True)
p :: Pattern
p@(ConP PatternInfo
pi QName
n [Pattern]
ps) | PatternInfo -> ConK
coPat PatternInfo
pi ConK -> ConK -> Bool
forall a. Eq a => a -> a -> Bool
== ConK
DefPat -> do
[Goal]
-> Substitution
-> Domain
-> Pattern
-> TypeCheck ([Goal], Substitution, TCContext, Pattern, TVal, Bool)
checkPattern' [Goal]
flex Substitution
ins Domain
domEr (Pattern
-> TypeCheck
([Goal], Substitution, TCContext, Pattern, TVal, Bool))
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) Pattern
-> TypeCheck ([Goal], Substitution, TCContext, Pattern, TVal, Bool)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< Pattern
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) Pattern
expandDefPat Pattern
p
ConP PatternInfo
pi QName
n [Pattern]
pl -> do
n <- QName -> TVal -> TypeCheck QName
disambigCon QName
n TVal
av
let co = PatternInfo -> ConK
coPat PatternInfo
pi
dotted = PatternInfo -> Bool
dottedPat PatternInfo
pi
unless dotted $ nonDottedConstructorChecks n co pl
(vc,(flex',ins',cxt',vc',ple,pvs,absp)) <- checkConstructorPattern co n pl
when (isFunType vc') $ throwErrorMsg ("higher-order matching of pattern " ++ show p ++ " of type " ++ show vc' ++ " not allowed")
let flexgen = [[Int]] -> [Int]
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat ([[Int]] -> [Int]) -> [[Int]] -> [Int]
forall a b. (a -> b) -> a -> b
$ (Goal -> [Int]) -> [Goal] -> [[Int]]
forall a b. (a -> b) -> [a] -> [b]
map (\ Goal
g -> case Goal
g of
DotFlex Int
i Maybe Expr
_ Domain
_ -> [Int
i]
Goal
_ -> []) [Goal]
flex'
let pe = PatternInfo -> QName -> [Pattern] -> Pattern
forall e. PatternInfo -> QName -> [Pat e] -> Pat e
ConP PatternInfo
pi QName
n [Pattern]
ple
dot <- if dottedPat pi then mkDotted True else return notDotted
pv0 <- mkConVal dot co n pvs vc
subst <- local (\ TCContext
_ -> TCContext
cxt') $ do
case av of
VSing TVal
vav TVal
av0 -> do
vav <- TVal -> TypeCheck TVal
whnfClos TVal
vav
inst Pos flexgen av0 pv0 vav
TVal
_ -> [Int]
-> TVal
-> TVal
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) Substitution
unifyIndices [Int]
flexgen TVal
vc' TVal
av
ins'' <- compSubst ins' subst
delta'' <- substitute ins'' (context cxt')
traceCheckM $ "delta'' = " ++ show delta''
av <- substitute ins'' av
pv <- up False pv0 av
let flex'' = Bool -> ([Goal] -> [Goal]) -> [Goal] -> [Goal]
forall a. Bool -> (a -> a) -> a -> a
fwhen Bool
dotted (Dotted -> Pattern -> TVal -> Goal
DottedCons Dotted
dot Pattern
p TVal
av Goal -> [Goal] -> [Goal]
forall a. a -> [a] -> [a]
:) [Goal]
flex'
return (flex'', ins'', cxt' { context = delta'' },
maybeErase pe, pv, absp)
DotP Expr
e -> do
let xp :: Name
xp = String -> Name
fresh (String -> Name) -> String -> Name
forall a b. (a -> b) -> a -> b
$ String
"." String -> String -> String
forall a. [a] -> [a] -> [a]
++ case Expr
e of Var Name
z -> Name -> String
suggestion Name
z; Expr
_ -> String -> String
Util.parens (String -> String) -> String -> String
forall a b. (a -> b) -> a -> b
$ Expr -> String
forall a. Show a => a -> String
show Expr
e
Name
-> Domain
-> (Int
-> TVal
-> TypeCheck
([Goal], Substitution, TCContext, Pattern, TVal, Bool))
-> TypeCheck ([Goal], Substitution, TCContext, Pattern, TVal, Bool)
forall a.
Name
-> Domain
-> (Int
-> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a)
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
forall (m :: * -> *) a.
MonadCxt m =>
Name -> Domain -> (Int -> TVal -> m a) -> m a
newWithGen Name
xp Domain
domEr ((Int
-> TVal
-> TypeCheck
([Goal], Substitution, TCContext, Pattern, TVal, Bool))
-> TypeCheck
([Goal], Substitution, TCContext, Pattern, TVal, Bool))
-> (Int
-> TVal
-> TypeCheck
([Goal], Substitution, TCContext, Pattern, TVal, Bool))
-> TypeCheck ([Goal], Substitution, TCContext, Pattern, TVal, Bool)
forall a b. (a -> b) -> a -> b
$ \ Int
k TVal
xv -> do
cxt' <- StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) TCContext
forall r (m :: * -> *). MonadReader r m => m r
ask
return (DotFlex k (Just e) domEr : flex
,ins
,cxt'
,maybeErase $ DotP e
,xv
,False)
where
maybeErase :: Pat e -> Pat e
maybeErase Pat e
p = if Dec -> Bool
forall pol. Polarity pol => pol -> Bool
erased Dec
decEr then Pat e -> Pat e
forall e. Pat e -> Pat e
ErasedP Pat e
p else Pat e
p
checkConstructorPattern :: ConK
-> QName
-> [Pattern]
-> StateT
TCState
(ReaderT TCContext (ExceptT TraceError IO))
(TVal,
([Goal], Substitution, TCContext, TVal, [Pattern], [TVal], Bool))
checkConstructorPattern ConK
co QName
n [Pattern]
pl = do
Bool
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (TVal -> Bool
isFunType TVal
av) (StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ())
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall a b. (a -> b) -> a -> b
$ String
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall (m :: * -> *) a. MonadError TraceError m => String -> m a
throwErrorMsg (String
"higher-order matching of pattern " String -> String -> String
forall a. [a] -> [a] -> [a]
++ Pattern -> String
forall a. Show a => a -> String
show Pattern
p String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
" at type " String -> String -> String
forall a. [a] -> [a] -> [a]
++ TVal -> String
forall a. Show a => a -> String
show TVal
av String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
" not allowed")
ConSig {conPars, lhsTyp = sz, recOccs, symbTyp = vc, dataName, dataPars} <- QName
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) SigDef
forall (m :: * -> *). MonadSig m => QName -> m SigDef
lookupSymbQ QName
n
let flexK Int
k (DotFlex Int
k' Maybe Expr
_ Domain
_) = Int
k Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
k'
flexK Int
k Goal
_ = Bool
False
isFlex (VGen Int
k) = (Goal -> Bool) -> [Goal] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
List.any (Int -> Goal -> Bool
flexK Int
k) [Goal]
flex
isFlex TVal
_ = Bool
True
isSz = if ConK
co ConK -> ConK -> Bool
forall a. Eq a => a -> a -> Bool
== ConK
Cons then Maybe (Name, TVal)
sz else Maybe (Name, TVal)
forall a. Maybe a
Nothing
vc <- instConLType n conPars vc isSz isFlex dataPars =<< force av
(vc,) <$> checkPatterns decEr flex ins vc pl
nonDottedConstructorChecks :: QName
-> ConK
-> [Pattern]
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
nonDottedConstructorChecks QName
n ConK
co [Pattern]
pl = do
ConSig {conPars, lhsTyp = sz, recOccs, symbTyp = vc, dataName, dataPars} <- QName
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) SigDef
forall (m :: * -> *). MonadSig m => QName -> m SigDef
lookupSymbQ QName
n
when (co == CoCons && isJust sz) $ do
let sizep = [Pattern] -> Pattern
forall a. HasCallStack => [a] -> a
head [Pattern]
pl
unless (isDotPattern sizep) $
throwErrorMsg $ "in pattern " ++ show p ++ ", coinductive size sub pattern " ++ show sizep ++ " must be dotted"
when (not $ decEr `elem` map Dec [Const,Rec]) $
recoverFail $ "cannot match pattern " ++ show p ++ " against non-computational argument"
when (decEr == Dec Const) $ do
let failNotForced = String -> m ()
forall (m :: * -> *). MonadAssert m => String -> m ()
recoverFail (String -> m ()) -> String -> m ()
forall a b. (a -> b) -> a -> b
$ String
"checkPattern: constructor " String -> String -> String
forall a. [a] -> [a] -> [a]
++ QName -> String
forall a. Show a => a -> String
show QName
n String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
" of non-computational argument " String -> String -> String
forall a. [a] -> [a] -> [a]
++ Pattern -> String
forall a. Show a => a -> String
show Pattern
p String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
" : " String -> String -> String
forall a. [a] -> [a] -> [a]
++ TVal -> String
forall a. Show a => a -> String
show TVal
av String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
" not forced"
mcenvs <- matchingConstructors av
case mcenvs of
Maybe [(ConstructorInfo, Env)]
Nothing -> do
DataSig { constructors } <- Name
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) SigDef
forall (m :: * -> *). MonadSig m => Name -> m SigDef
lookupSymb Name
dataName
unless (length constructors == 1) $ failNotForced
return ()
Just [] -> String
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall (m :: * -> *). MonadAssert m => String -> m ()
recoverFail (String
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ())
-> String
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall a b. (a -> b) -> a -> b
$ String
"checkPattern: no constructor matches type " String -> String -> String
forall a. [a] -> [a] -> [a]
++ TVal -> String
forall a. Show a => a -> String
show TVal
av
Just [(ConstructorInfo
ci, Env
_)] | ConstructorInfo -> QName
cName ConstructorInfo
ci QName -> QName -> Bool
forall a. Eq a => a -> a -> Bool
== QName
n -> () -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall a.
a -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
forall (m :: * -> *) a. Monad m => a -> m a
return ()
Maybe [(ConstructorInfo, Env)]
_ -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall {m :: * -> *}. MonadAssert m => m ()
failNotForced
checkGoal :: Substitution -> Goal -> TypeCheck ()
checkGoal :: Substitution
-> Goal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
checkGoal Substitution
subst (DotFlex Int
i Maybe Expr
me Domain
it) = String
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall (m :: * -> *) a.
MonadError TraceError m =>
String -> m a -> m a
enter (String
"dot pattern " String -> String -> String
forall a. [a] -> [a] -> [a]
++ Maybe Expr -> String
forall a. Show a => a -> String
show Maybe Expr
me) (StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ())
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall a b. (a -> b) -> a -> b
$
case Int -> Substitution -> Maybe TVal
lookupSub Int
i Substitution
subst of
Maybe TVal
Nothing -> String
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall (m :: * -> *). MonadAssert m => String -> m ()
recoverFail (String
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ())
-> String
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall a b. (a -> b) -> a -> b
$ String
"not instantiated"
Just TVal
v -> Maybe Expr
-> (Expr
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ())
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall (m :: * -> *) a. Monad m => Maybe a -> (a -> m ()) -> m ()
whenJust Maybe Expr
me ((Expr
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ())
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ())
-> (Expr
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ())
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall a b. (a -> b) -> a -> b
$ \ Expr
e -> do
tv <- Substitution -> TVal -> TypeCheck TVal
forall a. Substitute a => Substitution -> a -> TypeCheck a
substitute Substitution
subst (Domain -> TVal
forall a. Dom a -> a
typ Domain
it)
ask >>= \ TCContext
ce -> String
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall (m :: * -> *). Monad m => String -> m ()
traceCheckM (String
"checking dot pattern " String -> String -> String
forall a. [a] -> [a] -> [a]
++ TCContext -> String
forall a. Show a => a -> String
show TCContext
ce String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
" |- " String -> String -> String
forall a. [a] -> [a] -> [a]
++ Expr -> String
forall a. Show a => a -> String
show Expr
e String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
" : " String -> String -> String
forall a. [a] -> [a] -> [a]
++ Dec -> String
forall a. Show a => a -> String
show (Domain -> Dec
forall a. Dom a -> Dec
decor Domain
it) String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
" " String -> String -> String
forall a. [a] -> [a] -> [a]
++ TVal -> String
forall a. Show a => a -> String
show TVal
tv)
resurrect $ do
e <- valueOf <$> checkExpr e tv
v' <- whnf' e
enterDoc (text "inferred value" <+> prettyTCM v <+> text "does not match given dot pattern value" <+> prettyTCM v') $
leqVal Pos tv v v'
checkGoal Substitution
subst (MaxMatches Int
n TVal
av) = do
String
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall (m :: * -> *). Monad m => String -> m ()
traceCheckM (String
"checkGoal _ $ MaxMatches " String -> String -> String
forall a. [a] -> [a] -> [a]
++ Int -> String
forall a. Show a => a -> String
show Int
n String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
" $ " String -> String -> String
forall a. [a] -> [a] -> [a]
++ TVal -> String
forall a. Show a => a -> String
show TVal
av)
av' <- Substitution -> TVal -> TypeCheck TVal
forall a. Substitute a => Substitution -> a -> TypeCheck a
substitute Substitution
subst TVal
av
traceCheckM ("checkGoal _ $ MaxMatches " ++ show n ++ " $ " ++ show av')
mcenvs <- matchingConstructors av'
traceCheckM ("checkGoal matching constructors = " ++ show mcenvs)
maybe (recoverFail $ "not a data type: " ++ show av')
(\ [(ConstructorInfo, Env)]
cenvs ->
if [(ConstructorInfo, Env)] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [(ConstructorInfo, Env)]
cenvs Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
n then String
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall (m :: * -> *). MonadAssert m => String -> m ()
recoverFail (String
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ())
-> String
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall a b. (a -> b) -> a -> b
$
if Int
nInt -> Int -> Bool
forall a. Eq a => a -> a -> Bool
==Int
0 then String
"absurd pattern does not match since type " String -> String -> String
forall a. [a] -> [a] -> [a]
++ TVal -> String
forall a. Show a => a -> String
show TVal
av' String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
" is not empty"
else
String
"more than one constructor matches type " String -> String -> String
forall a. [a] -> [a] -> [a]
++ TVal -> String
forall a. Show a => a -> String
show TVal
av'
else () -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall a.
a -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
forall (m :: * -> *) a. Monad m => a -> m a
return ())
mcenvs
checkGoal Substitution
subst (DottedCons Dotted
dot Pattern
p TVal
av)
| Dotted -> Bool
isDotted Dotted
dot =
StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall (m :: * -> *) d a.
(MonadError TraceError m, Pretty d) =>
m d -> m a -> m a
enterDoc (String
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall {m :: * -> *}. Monad m => String -> m Doc
text String
"confirming dotted constructor" StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall {f :: * -> *}. Applicative f => f Doc -> f Doc -> f Doc
<+> Pattern
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall a.
PrettyTCM a =>
a -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
prettyTCM Pattern
p) (StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ())
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall a b. (a -> b) -> a -> b
$ do
Substitution
-> Goal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
checkGoal Substitution
subst (Int -> TVal -> Goal
MaxMatches Int
1 TVal
av)
| Bool
otherwise = () -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall a.
a -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
forall (m :: * -> *) a. Monad m => a -> m a
return ()
checkRHS :: Substitution -> Expr -> TVal -> TypeCheck (Kinded Extr)
checkRHS :: Substitution -> Expr -> TVal -> TypeCheck (Kinded Expr)
checkRHS Substitution
ins Expr
rhs TVal
v = do
String
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall (m :: * -> *). Monad m => String -> m ()
traceCheckM (String
"checking rhs " String -> String -> String
forall a. [a] -> [a] -> [a]
++ Expr -> String
forall a. Show a => a -> String
show Expr
rhs String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
" : " String -> String -> String
forall a. [a] -> [a] -> [a]
++ TVal -> String
forall a. Show a => a -> String
show TVal
v)
String -> TypeCheck (Kinded Expr) -> TypeCheck (Kinded Expr)
forall (m :: * -> *) a.
MonadError TraceError m =>
String -> m a -> m a
enter String
"right hand side" (TypeCheck (Kinded Expr) -> TypeCheck (Kinded Expr))
-> TypeCheck (Kinded Expr) -> TypeCheck (Kinded Expr)
forall a b. (a -> b) -> a -> b
$ do
cxt <- StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) TCContext
forall r (m :: * -> *). MonadReader r m => m r
ask
let rho = TCContext -> Env2
environ TCContext
cxt
mmu' <- Traversable.mapM (substitute ins) (envBound rho)
local (\ TCContext
_ -> TCContext
cxt { environ = rho { envBound = mmu' }}) $
activateFuns $
checkExpr rhs v
unifyIndices :: [Int] -> Val -> Val -> TypeCheck Substitution
unifyIndices :: [Int]
-> TVal
-> TVal
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) Substitution
unifyIndices [Int]
flex TVal
v1 TVal
v2 = StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) TCContext
forall r (m :: * -> *). MonadReader r m => m r
ask StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) TCContext
-> (TCContext
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) Substitution)
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) Substitution
forall a b.
StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
-> (a
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) b)
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \ TCContext
cxt -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) Substitution
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) Substitution
forall (m :: * -> *) d a.
(MonadError TraceError m, Pretty d) =>
m d -> m a -> m a
enterDoc (String
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall {m :: * -> *}. Monad m => String -> m Doc
text (String
"unifyIndices " String -> String -> String
forall a. [a] -> [a] -> [a]
++ SemCxt -> String
forall a. Show a => a -> String
show (TCContext -> SemCxt
context TCContext
cxt) String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
" |-") StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall {f :: * -> *}. Applicative f => f Doc -> f Doc -> f Doc
<+> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall a.
PrettyTCM a =>
a -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
prettyTCM TVal
v1 StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall {f :: * -> *}. Applicative f => f Doc -> f Doc -> f Doc
<+> String
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall {m :: * -> *}. Monad m => String -> m Doc
text (String
"?<=" String -> String -> String
forall a. [a] -> [a] -> [a]
++ Pol -> String
forall a. Show a => a -> String
show Pol
Pos) StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall {f :: * -> *}. Applicative f => f Doc -> f Doc -> f Doc
<+> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall a.
PrettyTCM a =>
a -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
prettyTCM TVal
v2) (StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) Substitution
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) Substitution)
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) Substitution
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) Substitution
forall a b. (a -> b) -> a -> b
$ do
case (TVal
v1,TVal
v2) of
(VSing TVal
_ TVal
v1, VApp (VDef (DefId IdKind
DatK QName
d2)) [TVal]
vl2) ->
(TVal
-> TVal
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) Substitution)
-> TVal
-> TVal
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) Substitution
forall a b c. (a -> b -> c) -> b -> a -> c
flip ([Int]
-> TVal
-> TVal
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) Substitution
unifyIndices [Int]
flex) TVal
v2 (TVal
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) Substitution)
-> TypeCheck TVal
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) Substitution
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< TVal -> TypeCheck TVal
whnfClos TVal
v1
(VApp (VDef (DefId IdKind
DatK QName
d1)) [TVal]
vl1, VApp (VDef (DefId IdKind
DatK QName
d2)) [TVal]
vl2) | QName
d1 QName -> QName -> Bool
forall a. Eq a => a -> a -> Bool
== QName
d2 -> do
(DataSig { numPars = np, symbTyp = tv, positivity = posl}) <- QName
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) SigDef
forall (m :: * -> *). MonadSig m => QName -> m SigDef
lookupSymbQ QName
d1
instList posl flex tv vl1 vl2
(TVal, TVal)
_ ->
Pol
-> [Int]
-> TVal
-> TVal
-> TVal
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) Substitution
inst Pol
Pos [Int]
flex TVal
vTopSort TVal
v1 TVal
v2
instWh :: Pol -> [Int] -> TVal -> Val -> Val -> TypeCheck Substitution
instWh :: Pol
-> [Int]
-> TVal
-> TVal
-> TVal
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) Substitution
instWh Pol
pos [Int]
flex TVal
tv TVal
w1 TVal
w2 = do
v1 <- TVal -> TypeCheck TVal
whnfClos TVal
w1
v2 <- whnfClos w2
inst pos flex tv v1 v2
assignFlex :: Int -> Val -> TypeCheck Substitution
assignFlex :: Int
-> TVal
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) Substitution
assignFlex Int
k TVal
v = do
StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Bool
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall (m :: * -> *). Monad m => m Bool -> m () -> m ()
unlessM ([Int]
-> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Bool
forall a.
Nocc a =>
[Int]
-> a
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Bool
nocc [Int
k] TVal
v) (StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ())
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall a b. (a -> b) -> a -> b
$
StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall (m :: * -> *) a. MonadError TraceError m => m Doc -> m a
failDoc (StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ())
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall a b. (a -> b) -> a -> b
$
String
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall {m :: * -> *}. Monad m => String -> m Doc
text String
"variable " StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall {f :: * -> *}. Applicative f => f Doc -> f Doc -> f Doc
<+> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall a.
PrettyTCM a =>
a -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
prettyTCM (Int -> TVal
VGen Int
k) StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall {f :: * -> *}. Applicative f => f Doc -> f Doc -> f Doc
<+>
String
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall {m :: * -> *}. Monad m => String -> m Doc
text String
" may not occur in " StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall {f :: * -> *}. Applicative f => f Doc -> f Doc -> f Doc
<+> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall a.
PrettyTCM a =>
a -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
prettyTCM TVal
v
Substitution
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) Substitution
forall a.
a -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
forall (m :: * -> *) a. Monad m => a -> m a
return (Substitution
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) Substitution)
-> Substitution
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) Substitution
forall a b. (a -> b) -> a -> b
$ Int -> TVal -> Substitution
sgSub Int
k TVal
v
inst :: Pol -> [Int] -> TVal -> Val -> Val -> TypeCheck Substitution
inst :: Pol
-> [Int]
-> TVal
-> TVal
-> TVal
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) Substitution
inst Pol
pos [Int]
flex TVal
tv TVal
v1 TVal
v2 = StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) TCContext
forall r (m :: * -> *). MonadReader r m => m r
ask StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) TCContext
-> (TCContext
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) Substitution)
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) Substitution
forall a b.
StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
-> (a
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) b)
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \ TCContext
cxt -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) Substitution
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) Substitution
forall (m :: * -> *) d a.
(MonadError TraceError m, Pretty d) =>
m d -> m a -> m a
enterDoc (String
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall {m :: * -> *}. Monad m => String -> m Doc
text (String
"inst " String -> String -> String
forall a. [a] -> [a] -> [a]
++ SemCxt -> String
forall a. Show a => a -> String
show (TCContext -> SemCxt
context TCContext
cxt) String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
" |-") StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall {f :: * -> *}. Applicative f => f Doc -> f Doc -> f Doc
<+> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall a.
PrettyTCM a =>
a -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
prettyTCM TVal
v1 StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall {f :: * -> *}. Applicative f => f Doc -> f Doc -> f Doc
<+> String
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall {m :: * -> *}. Monad m => String -> m Doc
text (String
"?<=" String -> String -> String
forall a. [a] -> [a] -> [a]
++ Pol -> String
forall a. Show a => a -> String
show Pol
pos) StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall {f :: * -> *}. Applicative f => f Doc -> f Doc -> f Doc
<+> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall a.
PrettyTCM a =>
a -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
prettyTCM TVal
v2 StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall {f :: * -> *}. Applicative f => f Doc -> f Doc -> f Doc
<+> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall (m :: * -> *). Monad m => m Doc
colon StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall {f :: * -> *}. Applicative f => f Doc -> f Doc -> f Doc
<+> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall a.
PrettyTCM a =>
a -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
prettyTCM TVal
tv) (StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) Substitution
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) Substitution)
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) Substitution
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) Substitution
forall a b. (a -> b) -> a -> b
$ do
case (TVal
v1,TVal
v2) of
(VGen Int
k, VGen Int
j) | Int
k Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
j -> Substitution
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) Substitution
forall a.
a -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
forall (m :: * -> *) a. Monad m => a -> m a
return Substitution
emptySub
(VGen Int
k, TVal
_) | Int -> [Int] -> Bool
forall a. Eq a => a -> [a] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem Int
k [Int]
flex -> Int
-> TVal
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) Substitution
assignFlex Int
k TVal
v2
(TVal
_, VGen Int
k) | Int -> [Int] -> Bool
forall a. Eq a => a -> [a] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem Int
k [Int]
flex -> Int
-> TVal
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) Substitution
assignFlex Int
k TVal
v1
(VApp (VDef (DefId IdKind
DatK QName
d1)) [TVal]
vl1,
VApp (VDef (DefId IdKind
DatK QName
d2)) [TVal]
vl2) | QName
d1 QName -> QName -> Bool
forall a. Eq a => a -> a -> Bool
== QName
d2 -> do
(DataSig { numPars, symbTyp = tv, positivity = posl }) <- QName
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) SigDef
forall (m :: * -> *). MonadSig m => QName -> m SigDef
lookupSymbQ QName
d1
instList' numPars posl flex tv vl1 vl2
(VRecord (NamedRec ConK
_ QName
c1 Bool
_ Dotted
dot1) [(Name, TVal)]
rs1,
VRecord (NamedRec ConK
_ QName
c2 Bool
_ Dotted
dot2) [(Name, TVal)]
rs2) | QName
c1 QName -> QName -> Bool
forall a. Eq a => a -> a -> Bool
== QName
c2 -> do
Dotted
-> Dotted
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall (m :: * -> *). MonadIO m => Dotted -> Dotted -> m ()
alignDotted Dotted
dot1 Dotted
dot2
sige <- QName
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) SigDef
forall (m :: * -> *). MonadSig m => QName -> m SigDef
lookupSymbQ QName
c1
instList [] flex (symbTyp sige) (map snd rs1) (map snd rs2)
(VSucc TVal
v1', VSucc TVal
v2') -> Pol
-> [Int]
-> TVal
-> TVal
-> TVal
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) Substitution
instWh Pol
pos [Int]
flex TVal
tv TVal
v1' TVal
v2'
(VSucc TVal
v, TVal
VInfty) -> Pol
-> [Int]
-> TVal
-> TVal
-> TVal
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) Substitution
instWh Pol
pos [Int]
flex TVal
tv TVal
v TVal
VInfty
(VSing TVal
v1' TVal
tv1, VSing TVal
v2' TVal
tv2) -> do
subst <- Pol
-> [Int]
-> TVal
-> TVal
-> TVal
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) Substitution
inst Pol
pos [Int]
flex TVal
tv TVal
tv1 TVal
tv2
u1 <- substitute subst v1'
u2 <- substitute subst v2'
tv1' <- substitute subst tv1
inst pos flex tv1' u1 u2 >>= compSubst subst
(VUp TVal
v1 TVal
_, TVal
_) -> Pol
-> [Int]
-> TVal
-> TVal
-> TVal
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) Substitution
inst Pol
pos [Int]
flex TVal
tv TVal
v1 TVal
v2
(TVal
_, VUp TVal
v2 TVal
_) -> Pol
-> [Int]
-> TVal
-> TVal
-> TVal
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) Substitution
inst Pol
pos [Int]
flex TVal
tv TVal
v1 TVal
v2
(TVal, TVal)
_ -> do Pol
-> TVal
-> TVal
-> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
leqVal Pol
pos TVal
tv TVal
v1 TVal
v2 StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
-> String
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall (m :: * -> *) a.
MonadError TraceError m =>
m a -> String -> m a
`throwTrace` (String
"inst: leqVal " String -> String -> String
forall a. [a] -> [a] -> [a]
++ TVal -> String
forall a. Show a => a -> String
show TVal
v1 String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
" ?<=" String -> String -> String
forall a. [a] -> [a] -> [a]
++ Pol -> String
forall a. Show a => a -> String
show Pol
pos String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
" " String -> String -> String
forall a. [a] -> [a] -> [a]
++ TVal -> String
forall a. Show a => a -> String
show TVal
v2 String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
" : " String -> String -> String
forall a. [a] -> [a] -> [a]
++ TVal -> String
forall a. Show a => a -> String
show TVal
tv String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
" failed")
Substitution
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) Substitution
forall a.
a -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
forall (m :: * -> *) a. Monad m => a -> m a
return Substitution
emptySub
instList :: [Pol] -> [Int] -> TVal -> [Val] -> [Val] -> TypeCheck Substitution
instList :: [Pol]
-> [Int]
-> TVal
-> [TVal]
-> [TVal]
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) Substitution
instList = Int
-> [Pol]
-> [Int]
-> TVal
-> [TVal]
-> [TVal]
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) Substitution
instList' Int
0
instList' :: Int -> [Pol] -> [Int] -> TVal -> [Val] -> [Val] -> TypeCheck Substitution
instList' :: Int
-> [Pol]
-> [Int]
-> TVal
-> [TVal]
-> [TVal]
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) Substitution
instList' Int
np [Pol]
posl [Int]
flex TVal
tv [] [] = Substitution
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) Substitution
forall a.
a -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
forall (m :: * -> *) a. Monad m => a -> m a
return Substitution
emptySub
instList' Int
np [Pol]
posl [Int]
flex TVal
tv (TVal
v1:[TVal]
vl1) (TVal
v2:[TVal]
vl2) = do
v1 <- TVal -> TypeCheck TVal
whnfClos TVal
v1
v2 <- whnfClos v2
if (np <= 0 || isMeta flex v1 || isMeta flex v2) then
case tv of
(VQuant PiSigma
Pi Name
x Domain
dom TVal
fv) -> do
let pol :: Pol
pol = Domain -> Pol
forall a. LensPol a => a -> Pol
getPol Domain
dom
subst <- Pol
-> [Int]
-> TVal
-> TVal
-> TVal
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) Substitution
inst Pol
pol [Int]
flex (Domain -> TVal
forall a. Dom a -> a
typ Domain
dom) TVal
v1 TVal
v2
vl1' <- mapM (substitute subst) vl1
vl2' <- mapM (substitute subst) vl2
v <- substitute subst v1
fv <- substitute subst fv
vb <- app fv v
subst' <- instList' (np - 1) (tailPosl posl) flex vb vl1' vl2'
compSubst subst subst'
else
case tv of
(VQuant PiSigma
Pi Name
x Domain
dom TVal
fv) -> do
vb <- TVal -> TVal -> TypeCheck TVal
app TVal
fv TVal
v2
instList' (np - 1) (tailPosl posl) flex vb vl1 vl2
instList' Int
np [Pol]
pos [Int]
flex TVal
tv [TVal]
vl1 [TVal]
vl2 = String
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) Substitution
forall (m :: * -> *) a. MonadError TraceError m => String -> m a
throwErrorMsg (String
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) Substitution)
-> String
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) Substitution
forall a b. (a -> b) -> a -> b
$ String
"internal error: instList' " String -> String -> String
forall a. [a] -> [a] -> [a]
++ (Int, [Pol], [Int], TVal, [TVal], [TVal]) -> String
forall a. Show a => a -> String
show (Int
np,[Pol]
pos,[Int]
flex,TVal
tv,[TVal]
vl1,[TVal]
vl2) String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
" not handled"
headPosl :: [Pol] -> Pol
headPosl :: [Pol] -> Pol
headPosl [] = Pol
mixed
headPosl (Pol
pos:[Pol]
_) = Pol
pos
tailPosl :: [Pol] -> [Pol]
tailPosl :: [Pol] -> [Pol]
tailPosl [] = []
tailPosl (Pol
_:[Pol]
posl) = [Pol]
posl
isMeta :: [Int] -> Val -> Bool
isMeta :: [Int] -> TVal -> Bool
isMeta [Int]
flex (VGen Int
k) = Int
k Int -> [Int] -> Bool
forall a. Eq a => a -> [a] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [Int]
flex
isMeta [Int]
_ TVal
_ = Bool
False
class Substitute a where
substitute :: Substitution -> a -> TypeCheck a
instance Substitute v => Substitute (x,v) where
substitute :: Substitution -> (x, v) -> TypeCheck (x, v)
substitute Substitution
subst (x
x,v
v) = (x
x,) (v -> (x, v))
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) v
-> TypeCheck (x, v)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Substitution
-> v
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) v
forall a. Substitute a => Substitution -> a -> TypeCheck a
substitute Substitution
subst v
v
instance Substitute v => Substitute [v] where
substitute :: Substitution -> [v] -> TypeCheck [v]
substitute = (v -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) v)
-> [v] -> TypeCheck [v]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> [a] -> m [b]
mapM ((v
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) v)
-> [v] -> TypeCheck [v])
-> (Substitution
-> v
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) v)
-> Substitution
-> [v]
-> TypeCheck [v]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Substitution
-> v
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) v
forall a. Substitute a => Substitution -> a -> TypeCheck a
substitute
instance Substitute v => Substitute (Maybe v) where
substitute :: Substitution -> Maybe v -> TypeCheck (Maybe v)
substitute = (v -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) v)
-> Maybe v -> TypeCheck (Maybe v)
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
forall (m :: * -> *) a b.
Monad m =>
(a -> m b) -> Maybe a -> m (Maybe b)
Traversable.mapM ((v
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) v)
-> Maybe v -> TypeCheck (Maybe v))
-> (Substitution
-> v
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) v)
-> Substitution
-> Maybe v
-> TypeCheck (Maybe v)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Substitution
-> v
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) v
forall a. Substitute a => Substitution -> a -> TypeCheck a
substitute
instance Substitute v => Substitute (Map k v) where
substitute :: Substitution -> Map k v -> TypeCheck (Map k v)
substitute = (v -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) v)
-> Map k v -> TypeCheck (Map k v)
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
forall (m :: * -> *) a b.
Monad m =>
(a -> m b) -> Map k a -> m (Map k b)
Traversable.mapM ((v
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) v)
-> Map k v -> TypeCheck (Map k v))
-> (Substitution
-> v
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) v)
-> Substitution
-> Map k v
-> TypeCheck (Map k v)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Substitution
-> v
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) v
forall a. Substitute a => Substitution -> a -> TypeCheck a
substitute
instance Substitute v => Substitute (OneOrTwo v) where
substitute :: Substitution -> OneOrTwo v -> TypeCheck (OneOrTwo v)
substitute = (v -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) v)
-> OneOrTwo v -> TypeCheck (OneOrTwo v)
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
forall (m :: * -> *) a b.
Monad m =>
(a -> m b) -> OneOrTwo a -> m (OneOrTwo b)
Traversable.mapM ((v
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) v)
-> OneOrTwo v -> TypeCheck (OneOrTwo v))
-> (Substitution
-> v
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) v)
-> Substitution
-> OneOrTwo v
-> TypeCheck (OneOrTwo v)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Substitution
-> v
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) v
forall a. Substitute a => Substitution -> a -> TypeCheck a
substitute
instance Substitute v => Substitute (Dom v) where
substitute :: Substitution -> Dom v -> TypeCheck (Dom v)
substitute = (v -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) v)
-> Dom v -> TypeCheck (Dom v)
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
forall (m :: * -> *) a b.
Monad m =>
(a -> m b) -> Dom a -> m (Dom b)
Traversable.mapM ((v
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) v)
-> Dom v -> TypeCheck (Dom v))
-> (Substitution
-> v
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) v)
-> Substitution
-> Dom v
-> TypeCheck (Dom v)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Substitution
-> v
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) v
forall a. Substitute a => Substitution -> a -> TypeCheck a
substitute
instance Substitute v => Substitute (Measure v) where
substitute :: Substitution -> Measure v -> TypeCheck (Measure v)
substitute = (v -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) v)
-> Measure v -> TypeCheck (Measure v)
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
forall (m :: * -> *) a b.
Monad m =>
(a -> m b) -> Measure a -> m (Measure b)
Traversable.mapM ((v
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) v)
-> Measure v -> TypeCheck (Measure v))
-> (Substitution
-> v
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) v)
-> Substitution
-> Measure v
-> TypeCheck (Measure v)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Substitution
-> v
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) v
forall a. Substitute a => Substitution -> a -> TypeCheck a
substitute
instance Substitute v => Substitute (Bound v) where
substitute :: Substitution -> Bound v -> TypeCheck (Bound v)
substitute = (v -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) v)
-> Bound v -> TypeCheck (Bound v)
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
forall (m :: * -> *) a b.
Monad m =>
(a -> m b) -> Bound a -> m (Bound b)
Traversable.mapM ((v
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) v)
-> Bound v -> TypeCheck (Bound v))
-> (Substitution
-> v
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) v)
-> Substitution
-> Bound v
-> TypeCheck (Bound v)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Substitution
-> v
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) v
forall a. Substitute a => Substitution -> a -> TypeCheck a
substitute
instance Substitute v => Substitute (Sort v) where
substitute :: Substitution -> Sort v -> TypeCheck (Sort v)
substitute = (v -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) v)
-> Sort v -> TypeCheck (Sort v)
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
forall (m :: * -> *) a b.
Monad m =>
(a -> m b) -> Sort a -> m (Sort b)
Traversable.mapM ((v
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) v)
-> Sort v -> TypeCheck (Sort v))
-> (Substitution
-> v
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) v)
-> Substitution
-> Sort v
-> TypeCheck (Sort v)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Substitution
-> v
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) v
forall a. Substitute a => Substitution -> a -> TypeCheck a
substitute
instance Substitute Val where
substitute :: Substitution -> TVal -> TypeCheck TVal
substitute Substitution
subst TVal
v = do
let sub :: a -> TypeCheck a
sub a
v = Substitution -> a -> TypeCheck a
forall a. Substitute a => Substitution -> a -> TypeCheck a
substitute Substitution
subst a
v
case TVal
v of
VGen Int
k -> TVal -> TypeCheck TVal
forall a.
a -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
forall (m :: * -> *) a. Monad m => a -> m a
return (TVal -> TypeCheck TVal) -> TVal -> TypeCheck TVal
forall a b. (a -> b) -> a -> b
$ Int -> Substitution -> TVal
valuateGen Int
k Substitution
subst
VApp TVal
v1 [TVal]
vl -> (TVal -> TVal -> TypeCheck TVal)
-> TVal -> [TVal] -> TypeCheck TVal
forall (t :: * -> *) (m :: * -> *) b a.
(Foldable t, Monad m) =>
(b -> a -> m b) -> b -> t a -> m b
foldM TVal -> TVal -> TypeCheck TVal
app (TVal -> [TVal] -> TypeCheck TVal)
-> (TypeCheck TVal,
StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) [TVal])
-> TypeCheck TVal
forall (m :: * -> *) a b c.
Monad m =>
(a -> b -> m c) -> (m a, m b) -> m c
==<< (TVal -> TypeCheck TVal
forall {a}. Substitute a => a -> TypeCheck a
sub TVal
v1, [TVal]
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) [TVal]
forall {a}. Substitute a => a -> TypeCheck a
sub [TVal]
vl)
VSing TVal
v1 TVal
vt -> TVal -> TVal -> TypeCheck TVal
vSing (TVal -> TVal -> TypeCheck TVal)
-> (TypeCheck TVal, TypeCheck TVal) -> TypeCheck TVal
forall (m :: * -> *) a b c.
Monad m =>
(a -> b -> m c) -> (m a, m b) -> m c
==<< (TVal -> TypeCheck TVal
forall {a}. Substitute a => a -> TypeCheck a
sub TVal
v1, TVal -> TypeCheck TVal
forall {a}. Substitute a => a -> TypeCheck a
sub TVal
vt)
VSucc TVal
v1 -> TVal -> TVal
succSize (TVal -> TVal) -> TypeCheck TVal -> TypeCheck TVal
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Substitution -> TVal -> TypeCheck TVal
forall a. Substitute a => Substitution -> a -> TypeCheck a
substitute Substitution
subst TVal
v1
VMax [TVal]
vs -> [TVal] -> TVal
maxSize ([TVal] -> TVal)
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) [TVal]
-> TypeCheck TVal
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (TVal -> TypeCheck TVal)
-> [TVal]
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) [TVal]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> [a] -> m [b]
mapM (Substitution -> TVal -> TypeCheck TVal
forall a. Substitute a => Substitution -> a -> TypeCheck a
substitute Substitution
subst) [TVal]
vs
VPlus [TVal]
vs -> [TVal] -> TVal
plusSizes ([TVal] -> TVal)
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) [TVal]
-> TypeCheck TVal
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (TVal -> TypeCheck TVal)
-> [TVal]
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) [TVal]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> [a] -> m [b]
mapM (Substitution -> TVal -> TypeCheck TVal
forall a. Substitute a => Substitution -> a -> TypeCheck a
substitute Substitution
subst) [TVal]
vs
VCase TVal
v1 TVal
tv1 Env
env [Clause]
cl -> TVal -> TVal -> Env -> [Clause] -> TVal
VCase (TVal -> TVal -> Env -> [Clause] -> TVal)
-> TypeCheck TVal
-> StateT
TCState
(ReaderT TCContext (ExceptT TraceError IO))
(TVal -> Env -> [Clause] -> TVal)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> TVal -> TypeCheck TVal
forall {a}. Substitute a => a -> TypeCheck a
sub TVal
v1 StateT
TCState
(ReaderT TCContext (ExceptT TraceError IO))
(TVal -> Env -> [Clause] -> TVal)
-> TypeCheck TVal
-> StateT
TCState
(ReaderT TCContext (ExceptT TraceError IO))
(Env -> [Clause] -> TVal)
forall a b.
StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) (a -> b)
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> TVal -> TypeCheck TVal
forall {a}. Substitute a => a -> TypeCheck a
sub TVal
tv1 StateT
TCState
(ReaderT TCContext (ExceptT TraceError IO))
(Env -> [Clause] -> TVal)
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Env
-> StateT
TCState
(ReaderT TCContext (ExceptT TraceError IO))
([Clause] -> TVal)
forall a b.
StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) (a -> b)
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Env
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Env
forall {a}. Substitute a => a -> TypeCheck a
sub Env
env StateT
TCState
(ReaderT TCContext (ExceptT TraceError IO))
([Clause] -> TVal)
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) [Clause]
-> TypeCheck TVal
forall a b.
StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) (a -> b)
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> [Clause]
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) [Clause]
forall a.
a -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
forall (m :: * -> *) a. Monad m => a -> m a
return [Clause]
cl
VMeasured Measure TVal
mu TVal
bv -> Measure TVal -> TVal -> TVal
VMeasured (Measure TVal -> TVal -> TVal)
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) (Measure TVal)
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) (TVal -> TVal)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Measure TVal
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) (Measure TVal)
forall {a}. Substitute a => a -> TypeCheck a
sub Measure TVal
mu StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) (TVal -> TVal)
-> TypeCheck TVal -> TypeCheck TVal
forall a b.
StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) (a -> b)
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> TVal -> TypeCheck TVal
forall {a}. Substitute a => a -> TypeCheck a
sub TVal
bv
VGuard Bound TVal
beta TVal
bv -> Bound TVal -> TVal -> TVal
VGuard (Bound TVal -> TVal -> TVal)
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) (Bound TVal)
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) (TVal -> TVal)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Bound TVal
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) (Bound TVal)
forall {a}. Substitute a => a -> TypeCheck a
sub Bound TVal
beta StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) (TVal -> TVal)
-> TypeCheck TVal -> TypeCheck TVal
forall a b.
StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) (a -> b)
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> TVal -> TypeCheck TVal
forall {a}. Substitute a => a -> TypeCheck a
sub TVal
bv
VBelow LtLe
ltle TVal
v -> LtLe -> TVal -> TVal
VBelow LtLe
ltle (TVal -> TVal) -> TypeCheck TVal -> TypeCheck TVal
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Substitution -> TVal -> TypeCheck TVal
forall a. Substitute a => Substitution -> a -> TypeCheck a
substitute Substitution
subst TVal
v
VQuant PiSigma
pisig Name
x Domain
dom TVal
fv -> PiSigma -> Name -> Domain -> TVal -> TVal
VQuant PiSigma
pisig Name
x (Domain -> TVal -> TVal)
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) Domain
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) (TVal -> TVal)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Domain
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) Domain
forall {a}. Substitute a => a -> TypeCheck a
sub Domain
dom StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) (TVal -> TVal)
-> TypeCheck TVal -> TypeCheck TVal
forall a b.
StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) (a -> b)
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> TVal -> TypeCheck TVal
forall {a}. Substitute a => a -> TypeCheck a
sub TVal
fv
VRecord RecInfo
ri [(Name, TVal)]
rs -> RecInfo -> [(Name, TVal)] -> TVal
VRecord RecInfo
ri ([(Name, TVal)] -> TVal)
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) [(Name, TVal)]
-> TypeCheck TVal
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [(Name, TVal)]
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) [(Name, TVal)]
forall {a}. Substitute a => a -> TypeCheck a
sub [(Name, TVal)]
rs
VPair TVal
v1 TVal
v2 -> TVal -> TVal -> TVal
VPair (TVal -> TVal -> TVal)
-> TypeCheck TVal
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) (TVal -> TVal)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> TVal -> TypeCheck TVal
forall {a}. Substitute a => a -> TypeCheck a
sub TVal
v1 StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) (TVal -> TVal)
-> TypeCheck TVal -> TypeCheck TVal
forall a b.
StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) (a -> b)
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> TVal -> TypeCheck TVal
forall {a}. Substitute a => a -> TypeCheck a
sub TVal
v2
VProj{} -> TVal -> TypeCheck TVal
forall a.
a -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
forall (m :: * -> *) a. Monad m => a -> m a
return TVal
v
VLam Name
x Env
env Expr
b -> (Env -> Expr -> TVal) -> Expr -> Env -> TVal
forall a b c. (a -> b -> c) -> b -> a -> c
flip (Name -> Env -> Expr -> TVal
VLam Name
x) Expr
b (Env -> TVal)
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Env
-> TypeCheck TVal
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Env
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Env
forall {a}. Substitute a => a -> TypeCheck a
sub Env
env
VConst TVal
v -> TVal -> TVal
VConst (TVal -> TVal) -> TypeCheck TVal -> TypeCheck TVal
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> TVal -> TypeCheck TVal
forall {a}. Substitute a => a -> TypeCheck a
sub TVal
v
VAbs Name
x Int
i TVal
v Substitution
valu -> Name -> Int -> TVal -> Substitution -> TVal
VAbs Name
x Int
i TVal
v (Substitution -> TVal)
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) Substitution
-> TypeCheck TVal
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Substitution
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) Substitution
forall {a}. Substitute a => a -> TypeCheck a
sub Substitution
valu
VClos Env
env Expr
e -> (Env -> Expr -> TVal) -> Expr -> Env -> TVal
forall a b c. (a -> b -> c) -> b -> a -> c
flip Env -> Expr -> TVal
VClos Expr
e (Env -> TVal)
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Env
-> TypeCheck TVal
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Env
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Env
forall {a}. Substitute a => a -> TypeCheck a
sub Env
env
VUp TVal
v1 TVal
vt -> Bool -> TVal -> TVal -> TypeCheck TVal
up Bool
False (TVal -> TVal -> TypeCheck TVal)
-> (TypeCheck TVal, TypeCheck TVal) -> TypeCheck TVal
forall (m :: * -> *) a b c.
Monad m =>
(a -> b -> m c) -> (m a, m b) -> m c
==<< (TVal -> TypeCheck TVal
forall {a}. Substitute a => a -> TypeCheck a
sub TVal
v1, TVal -> TypeCheck TVal
forall {a}. Substitute a => a -> TypeCheck a
sub TVal
vt)
VSort Sort TVal
s -> Sort TVal -> TVal
VSort (Sort TVal -> TVal) -> TypeCheck (Sort TVal) -> TypeCheck TVal
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Sort TVal -> TypeCheck (Sort TVal)
forall {a}. Substitute a => a -> TypeCheck a
sub Sort TVal
s
TVal
VZero -> TVal -> TypeCheck TVal
forall a.
a -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
forall (m :: * -> *) a. Monad m => a -> m a
return (TVal -> TypeCheck TVal) -> TVal -> TypeCheck TVal
forall a b. (a -> b) -> a -> b
$ TVal
v
TVal
VInfty -> TVal -> TypeCheck TVal
forall a.
a -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
forall (m :: * -> *) a. Monad m => a -> m a
return (TVal -> TypeCheck TVal) -> TVal -> TypeCheck TVal
forall a b. (a -> b) -> a -> b
$ TVal
v
TVal
VIrr -> TVal -> TypeCheck TVal
forall a.
a -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
forall (m :: * -> *) a. Monad m => a -> m a
return (TVal -> TypeCheck TVal) -> TVal -> TypeCheck TVal
forall a b. (a -> b) -> a -> b
$ TVal
v
VDef DefId
id -> TVal -> TypeCheck TVal
forall a.
a -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
forall (m :: * -> *) a. Monad m => a -> m a
return (TVal -> TypeCheck TVal) -> TVal -> TypeCheck TVal
forall a b. (a -> b) -> a -> b
$ DefId -> TVal
vDef DefId
id
VMeta Int
x Env
env Int
n -> (Env -> Int -> TVal) -> Int -> Env -> TVal
forall a b c. (a -> b -> c) -> b -> a -> c
flip (Int -> Env -> Int -> TVal
VMeta Int
x) Int
n (Env -> TVal)
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Env
-> TypeCheck TVal
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Env
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Env
forall {a}. Substitute a => a -> TypeCheck a
sub Env
env
instance Substitute SemCxt where
substitute :: Substitution -> SemCxt -> TypeCheck SemCxt
substitute Substitution
subst SemCxt
delta = do
cxt' <- Substitution
-> Map Int (OneOrTwo Domain)
-> TypeCheck (Map Int (OneOrTwo Domain))
forall a. Substitute a => Substitution -> a -> TypeCheck a
substitute Substitution
subst (SemCxt -> Map Int (OneOrTwo Domain)
cxt SemCxt
delta)
return $ delta { cxt = cxt' }
instance Substitute Env where
substitute :: Substitution
-> Env
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Env
substitute Substitution
subst (Environ [(Name, TVal)]
rho Maybe (Measure TVal)
mmeas) =
[(Name, TVal)] -> Maybe (Measure TVal) -> Env
forall a. [(Name, a)] -> Maybe (Measure TVal) -> Environ a
Environ ([(Name, TVal)] -> Maybe (Measure TVal) -> Env)
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) [(Name, TVal)]
-> StateT
TCState
(ReaderT TCContext (ExceptT TraceError IO))
(Maybe (Measure TVal) -> Env)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Substitution
-> [(Name, TVal)]
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) [(Name, TVal)]
forall a. Substitute a => Substitution -> a -> TypeCheck a
substitute Substitution
subst [(Name, TVal)]
rho StateT
TCState
(ReaderT TCContext (ExceptT TraceError IO))
(Maybe (Measure TVal) -> Env)
-> StateT
TCState
(ReaderT TCContext (ExceptT TraceError IO))
(Maybe (Measure TVal))
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Env
forall a b.
StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) (a -> b)
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Substitution
-> Maybe (Measure TVal)
-> StateT
TCState
(ReaderT TCContext (ExceptT TraceError IO))
(Maybe (Measure TVal))
forall a. Substitute a => Substitution -> a -> TypeCheck a
substitute Substitution
subst Maybe (Measure TVal)
mmeas
instance Substitute Substitution where
substitute :: Substitution
-> Substitution
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) Substitution
substitute Substitution
subst2 Substitution
subst1 = Substitution
-> Substitution
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) Substitution
compSubst Substitution
subst1 Substitution
subst2
compSubst :: Substitution -> Substitution -> TypeCheck Substitution
compSubst :: Substitution
-> Substitution
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) Substitution
compSubst (Valuation [(Int, TVal)]
subst1) subst2 :: Substitution
subst2@(Valuation [(Int, TVal)]
subst2') =
[(Int, TVal)] -> Substitution
Valuation ([(Int, TVal)] -> Substitution)
-> ([(Int, TVal)] -> [(Int, TVal)])
-> [(Int, TVal)]
-> Substitution
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ([(Int, TVal)] -> [(Int, TVal)] -> [(Int, TVal)]
forall a. [a] -> [a] -> [a]
++ [(Int, TVal)]
subst2') ([(Int, TVal)] -> Substitution)
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) [(Int, TVal)]
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) Substitution
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Substitution
-> [(Int, TVal)]
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) [(Int, TVal)]
forall a. Substitute a => Substitution -> a -> TypeCheck a
substitute Substitution
subst2 [(Int, TVal)]
subst1
mkConLType :: Int -> Expr -> (Name, Expr)
mkConLType :: Int -> Expr -> (Name, Expr)
mkConLType Int
npars Expr
t =
let (Telescope (TBind
sizetb : [TBind]
tel), Expr
t0) = Expr -> (Telescope, Expr)
typeToTele Expr
t
in case Expr -> (Expr, [Expr])
spineView Expr
t0 of
(d :: Expr
d@(Def (DefId IdKind
DatK QName
_)), [Expr]
args) ->
let ([Expr]
pars, Expr
sizeindex : [Expr]
inds) = Int -> [Expr] -> ([Expr], [Expr])
forall a. Int -> [a] -> ([a], [a])
splitAt Int
npars [Expr]
args
i :: Name
i = String -> Name
fresh String
"s!ze"
args' :: [Expr]
args' = [Expr]
pars [Expr] -> [Expr] -> [Expr]
forall a. [a] -> [a] -> [a]
++ Name -> Expr
Var Name
i Expr -> [Expr] -> [Expr]
forall a. a -> [a] -> [a]
: [Expr]
inds
core :: Expr
core = (Expr -> Expr -> Expr) -> Expr -> [Expr] -> Expr
forall b a. (b -> a -> b) -> b -> [a] -> b
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl Expr -> Expr -> Expr
App Expr
d [Expr]
args'
tbi :: TBind
tbi = Name -> Dom Expr -> TBind
forall a. Name -> Dom a -> TBinding a
TBind Name
i (Dom Expr -> TBind) -> Dom Expr -> TBind
forall a b. (a -> b) -> a -> b
$ Dec -> Dom Expr
sizeDomain Dec
irrelevantDec
tbj :: TBind
tbj = TBind
sizetb { boundDom = belowDomain irrelevantDec Lt (Var i) }
tel' :: Telescope
tel' = [TBind] -> Telescope
Telescope ([TBind] -> Telescope) -> [TBind] -> Telescope
forall a b. (a -> b) -> a -> b
$ TBind
tbi TBind -> [TBind] -> [TBind]
forall a. a -> [a] -> [a]
: TBind
tbj TBind -> [TBind] -> [TBind]
forall a. a -> [a] -> [a]
: [TBind]
tel
in (Name
i, Telescope -> Expr -> Expr
teleToType Telescope
tel' Expr
core)
(Expr, [Expr])
_ -> String -> (Name, Expr)
forall a. HasCallStack => String -> a
error (String -> (Name, Expr)) -> String -> (Name, Expr)
forall a b. (a -> b) -> a -> b
$ String
"conLType " String -> String -> String
forall a. [a] -> [a] -> [a]
++ Int -> String
forall a. Show a => a -> String
show Int
npars String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
" (" String -> String -> String
forall a. [a] -> [a] -> [a]
++ Expr -> String
forall a. Show a => a -> String
show Expr
t String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
"): illformed constructor type"
szType :: Co -> Int -> TVal -> TypeCheck ()
szType :: Co
-> Int
-> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
szType Co
co Int
p TVal
tv = Int
-> TVal
-> (TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ())
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall a. Int -> TVal -> (TVal -> TypeCheck a) -> TypeCheck a
doVParams Int
p TVal
tv ((TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ())
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ())
-> (TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ())
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall a b. (a -> b) -> a -> b
$ \ TVal
tv' -> do
let polsz :: Pol
polsz = if Co
coCo -> Co -> Bool
forall a. Eq a => a -> a -> Bool
==Co
Ind then Pol
Pos else Pol
Neg
case TVal
tv' of
VQuant PiSigma
Pi Name
x (Domain TVal
av Kind
ki Dec
dec) TVal
fv | TVal -> Bool
isVSize TVal
av Bool -> Bool -> Bool
&& Bool -> Bool
not (Dec -> Bool
forall pol. Polarity pol => pol -> Bool
erased Dec
dec) Bool -> Bool -> Bool
&& Dec -> Pol
forall pol. Polarity pol => Decoration pol -> pol
polarity Dec
dec Pol -> Pol -> Bool
forall a. Eq a => a -> a -> Bool
== Pol
polsz -> () -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall a.
a -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
forall (m :: * -> *) a. Monad m => a -> m a
return ()
TVal
_ -> String
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall (m :: * -> *) a. MonadError TraceError m => String -> m a
throwErrorMsg (String
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ())
-> String
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall a b. (a -> b) -> a -> b
$ String
"not a sized type, target " String -> String -> String
forall a. [a] -> [a] -> [a]
++ TVal -> String
forall a. Show a => a -> String
show TVal
tv' String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
" must have non-erased domain " String -> String -> String
forall a. [a] -> [a] -> [a]
++ Class -> String
forall a. Show a => a -> String
show Class
Size String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
" with polarity " String -> String -> String
forall a. [a] -> [a] -> [a]
++ Pol -> String
forall a. Show a => a -> String
show Pol
polsz
szConstructor :: Name -> Co -> Int -> TVal -> TypeCheck ()
szConstructor :: Name
-> Co
-> Int
-> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
szConstructor Name
n Co
co Int
p TVal
tv = StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall (m :: * -> *) d a.
(MonadError TraceError m, Pretty d) =>
m d -> m a -> m a
enterDoc (String
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall {m :: * -> *}. Monad m => String -> m Doc
text (String
"szConstructor " String -> String -> String
forall a. [a] -> [a] -> [a]
++ Name -> String
forall a. Show a => a -> String
show Name
n String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
" :") StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall {f :: * -> *}. Applicative f => f Doc -> f Doc -> f Doc
<+> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall a.
PrettyTCM a =>
a -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
prettyTCM TVal
tv) (StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ())
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall a b. (a -> b) -> a -> b
$ do
Int
-> TVal
-> (TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ())
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall a. Int -> TVal -> (TVal -> TypeCheck a) -> TypeCheck a
doVParams Int
p TVal
tv ((TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ())
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ())
-> (TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ())
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall a b. (a -> b) -> a -> b
$ \ TVal
tv' ->
case TVal
tv' of
VQuant PiSigma
Pi Name
x Domain
dom TVal
fv | TVal -> Bool
isVSize (Domain -> TVal
forall a. Dom a -> a
typ Domain
dom) ->
Name
-> Domain
-> TVal
-> (Int
-> TVal
-> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ())
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall a.
Name
-> Domain
-> TVal
-> (Int -> TVal -> TVal -> TypeCheck a)
-> TypeCheck a
underAbs Name
x Domain
dom TVal
fv ((Int
-> TVal
-> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ())
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ())
-> (Int
-> TVal
-> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ())
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall a b. (a -> b) -> a -> b
$ \ Int
k TVal
xv TVal
bv -> do
Name
-> Co
-> Int
-> Int
-> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
szSizeVarUsage Name
n Co
co Int
p Int
k TVal
bv
TVal
_ -> String
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall (m :: * -> *) a. MonadError TraceError m => String -> m a
throwErrorMsg (String
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ())
-> String
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall a b. (a -> b) -> a -> b
$ String
"not a valid sized constructor: expected size quantification"
szSizeVarUsage :: Name -> Co -> Int -> Int -> TVal -> TypeCheck ()
szSizeVarUsage :: Name
-> Co
-> Int
-> Int
-> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
szSizeVarUsage Name
n Co
co Int
p Int
i TVal
tv = StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall (m :: * -> *) d a.
(MonadError TraceError m, Pretty d) =>
m d -> m a -> m a
enterDoc (String
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall {m :: * -> *}. Monad m => String -> m Doc
text String
"szSizeVarUsage of" StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall {f :: * -> *}. Applicative f => f Doc -> f Doc -> f Doc
<+> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall a.
PrettyTCM a =>
a -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
prettyTCM (Int -> TVal
VGen Int
i) StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall {f :: * -> *}. Applicative f => f Doc -> f Doc -> f Doc
<+> String
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall {m :: * -> *}. Monad m => String -> m Doc
text String
"in" StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall {f :: * -> *}. Applicative f => f Doc -> f Doc -> f Doc
<+> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall a.
PrettyTCM a =>
a -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
prettyTCM TVal
tv) (StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ())
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall a b. (a -> b) -> a -> b
$
case TVal
tv of
VQuant PiSigma
Pi Name
x Domain
dom TVal
fv -> do
let av :: TVal
av = Domain -> TVal
forall a. Dom a -> a
typ Domain
dom
Name
-> Int
-> Int
-> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
szSizeVarDataArgs Name
n Int
p Int
i TVal
av
StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall (m :: * -> *) d a.
(MonadError TraceError m, Pretty d) =>
m d -> m a -> m a
enterDoc (String
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall {m :: * -> *}. Monad m => String -> m Doc
text String
"checking" StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall {f :: * -> *}. Applicative f => f Doc -> f Doc -> f Doc
<+> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall a.
PrettyTCM a =>
a -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
prettyTCM TVal
av StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall {f :: * -> *}. Applicative f => f Doc -> f Doc -> f Doc
<+> String
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall {m :: * -> *}. Monad m => String -> m Doc
text (String
" to be " String -> String -> String
forall a. [a] -> [a] -> [a]
++
(if Co
co Co -> Co -> Bool
forall a. Eq a => a -> a -> Bool
== Co
CoInd then String
"antitone" else String
"isotone") String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
" in variable")
StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall {f :: * -> *}. Applicative f => f Doc -> f Doc -> f Doc
<+> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall a.
PrettyTCM a =>
a -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
prettyTCM (Int -> TVal
VGen Int
i)) (StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ())
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall a b. (a -> b) -> a -> b
$
Co
-> Int
-> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
szMono Co
co Int
i TVal
av
Name
-> Domain
-> TVal
-> (Int
-> TVal
-> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ())
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall a.
Name
-> Domain
-> TVal
-> (Int -> TVal -> TVal -> TypeCheck a)
-> TypeCheck a
underAbs Name
x Domain
dom TVal
fv ((Int
-> TVal
-> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ())
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ())
-> (Int
-> TVal
-> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ())
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall a b. (a -> b) -> a -> b
$ \ Int
_ TVal
xv TVal
bv -> do
Name
-> Co
-> Int
-> Int
-> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
szSizeVarUsage Name
n Co
co Int
p Int
i TVal
bv
TVal
_ -> Int
-> Int
-> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
szSizeVarTarget Int
p Int
i TVal
tv
szSizeVarTarget :: Int -> Int -> TVal -> TypeCheck ()
szSizeVarTarget :: Int
-> Int
-> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
szSizeVarTarget Int
p Int
i TVal
tv = StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall (m :: * -> *) d a.
(MonadError TraceError m, Pretty d) =>
m d -> m a -> m a
enterDoc (String
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall {m :: * -> *}. Monad m => String -> m Doc
text String
"szSizeVarTarget, variable" StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall {f :: * -> *}. Applicative f => f Doc -> f Doc -> f Doc
<+> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall a.
PrettyTCM a =>
a -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
prettyTCM (Int -> TVal
VGen Int
i) StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall {f :: * -> *}. Applicative f => f Doc -> f Doc -> f Doc
<+> String
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall {m :: * -> *}. Monad m => String -> m Doc
text (String
"argument no. " String -> String -> String
forall a. [a] -> [a] -> [a]
++ Int -> String
forall a. Show a => a -> String
show Int
p String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
" in") StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall {f :: * -> *}. Applicative f => f Doc -> f Doc -> f Doc
<+> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall a.
PrettyTCM a =>
a -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
prettyTCM TVal
tv) (StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ())
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall a b. (a -> b) -> a -> b
$ do
let err :: StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
err = String
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall {m :: * -> *}. Monad m => String -> m Doc
text String
"expected target" StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall {f :: * -> *}. Applicative f => f Doc -> f Doc -> f Doc
<+> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall a.
PrettyTCM a =>
a -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
prettyTCM TVal
tv StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall {f :: * -> *}. Applicative f => f Doc -> f Doc -> f Doc
<+> String
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall {m :: * -> *}. Monad m => String -> m Doc
text String
"of size" StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall {f :: * -> *}. Applicative f => f Doc -> f Doc -> f Doc
<+> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall a.
PrettyTCM a =>
a -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
prettyTCM (TVal -> TVal
VSucc (Int -> TVal
VGen Int
i))
case TVal
tv of
VSing TVal
_ TVal
tv -> Int
-> Int
-> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
szSizeVarTarget Int
p Int
i (TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ())
-> TypeCheck TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< TVal -> TypeCheck TVal
whnfClos TVal
tv
VApp TVal
d [TVal]
vl -> do
v0 <- TVal -> TypeCheck TVal
whnfClos ([TVal]
vl [TVal] -> Int -> TVal
forall a. HasCallStack => [a] -> Int -> a
!! Int
p)
case v0 of
(VSucc (VGen Int
i')) | Int
i Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
i' -> () -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall a.
a -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
forall (m :: * -> *) a. Monad m => a -> m a
return ()
TVal
_ -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall (m :: * -> *) a. MonadError TraceError m => m Doc -> m a
failDoc StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
err
TVal
_ -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall (m :: * -> *) a. MonadError TraceError m => m Doc -> m a
failDoc StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
err
szSizeVarDataArgs :: Name -> Int -> Int -> TVal -> TypeCheck ()
szSizeVarDataArgs :: Name
-> Int
-> Int
-> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
szSizeVarDataArgs Name
n Int
p Int
i TVal
tv = StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall (m :: * -> *) d a.
(MonadError TraceError m, Pretty d) =>
m d -> m a -> m a
enterDoc (String
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall {m :: * -> *}. Monad m => String -> m Doc
text String
"sizeVarDataArgs" StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall {f :: * -> *}. Applicative f => f Doc -> f Doc -> f Doc
<+> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall a.
PrettyTCM a =>
a -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
prettyTCM (Int -> TVal
VGen Int
i) StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall {f :: * -> *}. Applicative f => f Doc -> f Doc -> f Doc
<+> String
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall {m :: * -> *}. Monad m => String -> m Doc
text String
"in" StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall {f :: * -> *}. Applicative f => f Doc -> f Doc -> f Doc
<+> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall a.
PrettyTCM a =>
a -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
prettyTCM TVal
tv) (StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ())
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall a b. (a -> b) -> a -> b
$ do
case TVal
tv of
VApp (VDef (DefId IdKind
DatK (QName Name
m))) [TVal]
vl | Name
n Name -> Name -> Bool
forall a. Eq a => a -> a -> Bool
== Name
m -> do
let ([TVal]
pars, TVal
v0 : [TVal]
idxs) = Int -> [TVal] -> ([TVal], [TVal])
forall a. Int -> [a] -> ([a], [a])
splitAt Int
p [TVal]
vl
v0 <- TVal -> TypeCheck TVal
whnfClos TVal
v0
case v0 of
VGen Int
i' | Int
i' Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
i -> do
[TVal]
-> (TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ())
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
t a -> (a -> m b) -> m ()
forM_ ([TVal]
pars [TVal] -> [TVal] -> [TVal]
forall a. [a] -> [a] -> [a]
++ [TVal]
idxs) ((TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ())
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ())
-> (TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ())
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall a b. (a -> b) -> a -> b
$ \ TVal
v -> [Int]
-> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Bool
forall a.
Nocc a =>
[Int]
-> a
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Bool
nocc [Int
i] TVal
v StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Bool
-> (Bool
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ())
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall a b.
StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
-> (a
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) b)
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= do
StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> Bool
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall (m :: * -> *).
MonadError TraceError m =>
m Doc -> Bool -> m ()
boolToErrorDoc (StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> Bool
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ())
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> Bool
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall a b. (a -> b) -> a -> b
$
String
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall {m :: * -> *}. Monad m => String -> m Doc
text String
"variable" StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall {f :: * -> *}. Applicative f => f Doc -> f Doc -> f Doc
<+> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall a.
PrettyTCM a =>
a -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
prettyTCM (Int -> TVal
VGen Int
i) StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall {f :: * -> *}. Applicative f => f Doc -> f Doc -> f Doc
<+>
String
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall {m :: * -> *}. Monad m => String -> m Doc
text String
"may not occur in" StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall {f :: * -> *}. Applicative f => f Doc -> f Doc -> f Doc
<+> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall a.
PrettyTCM a =>
a -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
prettyTCM TVal
v
TVal
_ -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall (m :: * -> *) a. MonadError TraceError m => m Doc -> m a
failDoc (StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ())
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall a b. (a -> b) -> a -> b
$
String
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall {m :: * -> *}. Monad m => String -> m Doc
text String
"wrong size index" StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall {f :: * -> *}. Applicative f => f Doc -> f Doc -> f Doc
<+> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall a.
PrettyTCM a =>
a -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
prettyTCM TVal
v0 StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall {f :: * -> *}. Applicative f => f Doc -> f Doc -> f Doc
<+>
String
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall {m :: * -> *}. Monad m => String -> m Doc
text String
"at recursive occurrence" StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall {f :: * -> *}. Applicative f => f Doc -> f Doc -> f Doc
<+> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall a.
PrettyTCM a =>
a -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
prettyTCM TVal
tv
VApp TVal
v1 [TVal]
vl -> (TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ())
-> [TVal]
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ (\ TVal
v -> TVal -> TypeCheck TVal
whnfClos TVal
v TypeCheck TVal
-> (TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ())
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall a b.
StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
-> (a
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) b)
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Name
-> Int
-> Int
-> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
szSizeVarDataArgs Name
n Int
p Int
i) (TVal
v1TVal -> [TVal] -> [TVal]
forall a. a -> [a] -> [a]
:[TVal]
vl)
VQuant PiSigma
Pi Name
x Domain
dom TVal
fv -> do
Name
-> Int
-> Int
-> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
szSizeVarDataArgs Name
n Int
p Int
i (Domain -> TVal
forall a. Dom a -> a
typ Domain
dom)
Name
-> Domain
-> TVal
-> (Int
-> TVal
-> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ())
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall a.
Name
-> Domain
-> TVal
-> (Int -> TVal -> TVal -> TypeCheck a)
-> TypeCheck a
underAbs Name
x Domain
dom TVal
fv ((Int
-> TVal
-> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ())
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ())
-> (Int
-> TVal
-> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ())
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall a b. (a -> b) -> a -> b
$ \ Int
_ TVal
xv TVal
bv -> do
Name
-> Int
-> Int
-> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
szSizeVarDataArgs Name
n Int
p Int
i TVal
bv
TVal
fv | TVal -> Bool
isFun TVal
fv ->
Name
-> (TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ())
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall a.
Name
-> (TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a)
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
forall (m :: * -> *) a. MonadCxt m => Name -> (TVal -> m a) -> m a
addName (TVal -> Name
absName TVal
fv) ((TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ())
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ())
-> (TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ())
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall a b. (a -> b) -> a -> b
$ \ TVal
xv -> Name
-> Int
-> Int
-> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
szSizeVarDataArgs Name
n Int
p Int
i (TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ())
-> TypeCheck TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< TVal -> TVal -> TypeCheck TVal
app TVal
fv TVal
xv
TVal
_ -> () -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall a.
a -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
forall (m :: * -> *) a. Monad m => a -> m a
return ()
doVParams :: Int -> TVal -> (TVal -> TypeCheck a) -> TypeCheck a
doVParams :: forall a. Int -> TVal -> (TVal -> TypeCheck a) -> TypeCheck a
doVParams Int
0 TVal
tv TVal -> TypeCheck a
k = TVal -> TypeCheck a
k TVal
tv
doVParams Int
p (VQuant PiSigma
Pi Name
x Domain
dom TVal
fv) TVal -> TypeCheck a
k =
Name
-> Domain
-> TVal
-> (Int -> TVal -> TVal -> TypeCheck a)
-> TypeCheck a
forall a.
Name
-> Domain
-> TVal
-> (Int -> TVal -> TVal -> TypeCheck a)
-> TypeCheck a
underAbs Name
x Domain
dom TVal
fv ((Int -> TVal -> TVal -> TypeCheck a) -> TypeCheck a)
-> (Int -> TVal -> TVal -> TypeCheck a) -> TypeCheck a
forall a b. (a -> b) -> a -> b
$ \ Int
_ TVal
xv TVal
bv -> do
Int -> TVal -> (TVal -> TypeCheck a) -> TypeCheck a
forall a. Int -> TVal -> (TVal -> TypeCheck a) -> TypeCheck a
doVParams (Int
p Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1) TVal
bv TVal -> TypeCheck a
k
admFunDef :: Co -> [Clause] -> TVal -> TypeCheck [Clause]
admFunDef :: Co
-> [Clause]
-> TVal
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) [Clause]
admFunDef Co
co [Clause]
cls TVal
tv = do
(cls, inco) <- [Clause] -> TVal -> TypeCheck ([Clause], [Co])
admClauses [Clause]
cls TVal
tv
when (co==CoInd && not (co `elem` inco)) $
throwErrorMsg $ show tv ++ " is not a type of a cofun"
return cls
admClauses :: [Clause] -> TVal -> TypeCheck ([Clause], [Co])
admClauses :: [Clause] -> TVal -> TypeCheck ([Clause], [Co])
admClauses [] TVal
tv = ([Clause], [Co]) -> TypeCheck ([Clause], [Co])
forall a.
a -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
forall (m :: * -> *) a. Monad m => a -> m a
return ([], [])
admClauses (Clause
cl:[Clause]
cls) TVal
tv = do
(cl',inco) <- Clause -> TVal -> TypeCheck (Clause, [Co])
admClause Clause
cl TVal
tv
(cls',inco') <- admClauses cls tv
return (cl' : cls', inco ++ inco')
admClause :: Clause -> TVal -> TypeCheck (Clause, [Co])
admClause :: Clause -> TVal -> TypeCheck (Clause, [Co])
admClause (Clause TeleVal
tel [Pattern]
ps Maybe Expr
e) TVal
tv = String -> TypeCheck (Clause, [Co]) -> TypeCheck (Clause, [Co])
forall a. String -> a -> a
traceAdm (String
"admClause: admissibility of patterns " String -> String -> String
forall a. [a] -> [a] -> [a]
++ [Pattern] -> String
forall a. Show a => a -> String
show [Pattern]
ps) (TypeCheck (Clause, [Co]) -> TypeCheck (Clause, [Co]))
-> TypeCheck (Clause, [Co]) -> TypeCheck (Clause, [Co])
forall a b. (a -> b) -> a -> b
$
[Pattern]
-> TVal
-> ([(Pattern, TVal)] -> TVal -> TypeCheck (Clause, [Co]))
-> TypeCheck (Clause, [Co])
forall a.
[Pattern]
-> TVal
-> ([(Pattern, TVal)] -> TVal -> TypeCheck a)
-> TypeCheck a
introPatterns [Pattern]
ps TVal
tv (([(Pattern, TVal)] -> TVal -> TypeCheck (Clause, [Co]))
-> TypeCheck (Clause, [Co]))
-> ([(Pattern, TVal)] -> TVal -> TypeCheck (Clause, [Co]))
-> TypeCheck (Clause, [Co])
forall a b. (a -> b) -> a -> b
$ \ [(Pattern, TVal)]
pvs TVal
_ -> do
(ps', inco) <- [(Pattern, TVal)] -> TVal -> TypeCheck ([Pattern], [Co])
admPatterns [(Pattern, TVal)]
pvs TVal
tv
return (Clause tel ps' e, inco)
admPatterns :: [(Pattern,Val)] -> TVal -> TypeCheck ([Pattern], [Co])
admPatterns :: [(Pattern, TVal)] -> TVal -> TypeCheck ([Pattern], [Co])
admPatterns [] TVal
tv = do
isCo <- TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Bool
endsInCo TVal
tv
return ([], if isCo then [CoInd] else [])
admPatterns ((Pattern
p,TVal
v):[(Pattern, TVal)]
pvs) TVal
tv = do
(p, inco1) <- Pattern -> TVal -> TypeCheck (Pattern, [Co])
admPattern Pattern
p TVal
tv
bv <- piApp tv v
(ps, inco2) <- admPatterns pvs bv
return (p:ps, inco1 ++ inco2)
lowerSemiCont :: Int -> TVal -> TypeCheck Bool
lowerSemiCont :: Int
-> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Bool
lowerSemiCont Int
i TVal
tv = StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Bool
forall e (m :: * -> *). MonadError e m => m () -> m Bool
errorToBool (StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Bool)
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Bool
forall a b. (a -> b) -> a -> b
$ Int
-> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
lowerSemiContinuous Int
i TVal
tv
docNotLowerSemi :: Int -> TVal -> TypeCheck Doc
docNotLowerSemi :: Int
-> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
docNotLowerSemi Int
i TVal
av = String
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall {m :: * -> *}. Monad m => String -> m Doc
text String
"type " StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall {f :: * -> *}. Applicative f => f Doc -> f Doc -> f Doc
<+> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall a.
PrettyTCM a =>
a -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
prettyTCM TVal
av StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall {f :: * -> *}. Applicative f => f Doc -> f Doc -> f Doc
<+>
String
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall {m :: * -> *}. Monad m => String -> m Doc
text String
" not lower semi continuous in " StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall {f :: * -> *}. Applicative f => f Doc -> f Doc -> f Doc
<+> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall a.
PrettyTCM a =>
a -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
prettyTCM (Int -> TVal
VGen Int
i)
lowerSemiContinuous :: Int -> TVal -> TypeCheck ()
lowerSemiContinuous :: Int
-> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
lowerSemiContinuous Int
i TVal
av = do
av <- TVal -> TypeCheck TVal
force TVal
av
let fallback = Int
-> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
szAntitone Int
i TVal
av StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall (m :: * -> *) a.
MonadError TraceError m =>
m a -> m Doc -> m a
`newErrorDoc` Int
-> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
docNotLowerSemi Int
i TVal
av
case av of
VQuant PiSigma
Sigma Name
x dom :: Domain
dom@Domain{ typ :: forall a. Dom a -> a
typ = VBelow LtLe
Lt (VGen Int
i') } TVal
fv | Int
i Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
i' -> () -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall a.
a -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
forall (m :: * -> *) a. Monad m => a -> m a
return ()
VQuant PiSigma
Sigma Name
x dom :: Domain
dom@Domain{ typ :: forall a. Dom a -> a
typ = VBelow LtLe
Le (VGen Int
i') } TVal
fv | Int
i Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
i' -> do
Name
-> Domain
-> TVal
-> (Int
-> TVal
-> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ())
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall a.
Name
-> Domain
-> TVal
-> (Int -> TVal -> TVal -> TypeCheck a)
-> TypeCheck a
underAbs Name
x Domain
dom TVal
fv ((Int
-> TVal
-> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ())
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ())
-> (Int
-> TVal
-> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ())
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall a b. (a -> b) -> a -> b
$ \ Int
j TVal
xv TVal
bv -> Int
-> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
lowerSemiContinuous Int
j TVal
bv
VQuant PiSigma
Sigma Name
x dom :: Domain
dom@Domain{ typ :: forall a. Dom a -> a
typ = TVal
av } TVal
fv -> do
Int
-> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
lowerSemiContinuous Int
i TVal
av
Name
-> Domain
-> TVal
-> (Int
-> TVal
-> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ())
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall a.
Name
-> Domain
-> TVal
-> (Int -> TVal -> TVal -> TypeCheck a)
-> TypeCheck a
underAbs Name
x Domain
dom TVal
fv ((Int
-> TVal
-> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ())
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ())
-> (Int
-> TVal
-> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ())
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall a b. (a -> b) -> a -> b
$ \ Int
_ TVal
xv TVal
bv -> Int
-> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
lowerSemiContinuous Int
i TVal
bv
VApp (VDef (DefId IdKind
DatK QName
n)) [TVal]
vl -> do
sige <- QName
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) SigDef
forall (m :: * -> *). MonadSig m => QName -> m SigDef
lookupSymbQ QName
n
case sige of
DataSig { symbTyp :: SigDef -> TVal
symbTyp = TVal
dv, constructors :: SigDef -> [ConstructorInfo]
constructors = [ConstructorInfo]
cis, isTuple :: SigDef -> Bool
isTuple = Bool
True } -> do
mrhoci <- [StateT
TCState
(ReaderT TCContext (ExceptT TraceError IO))
(Maybe (Env, ConstructorInfo))]
-> StateT
TCState
(ReaderT TCContext (ExceptT TraceError IO))
(Maybe (Env, ConstructorInfo))
forall (m :: * -> *) a. Monad m => [m (Maybe a)] -> m (Maybe a)
Util.firstJustM ([StateT
TCState
(ReaderT TCContext (ExceptT TraceError IO))
(Maybe (Env, ConstructorInfo))]
-> StateT
TCState
(ReaderT TCContext (ExceptT TraceError IO))
(Maybe (Env, ConstructorInfo)))
-> [StateT
TCState
(ReaderT TCContext (ExceptT TraceError IO))
(Maybe (Env, ConstructorInfo))]
-> StateT
TCState
(ReaderT TCContext (ExceptT TraceError IO))
(Maybe (Env, ConstructorInfo))
forall a b. (a -> b) -> a -> b
$ (ConstructorInfo
-> StateT
TCState
(ReaderT TCContext (ExceptT TraceError IO))
(Maybe (Env, ConstructorInfo)))
-> [ConstructorInfo]
-> [StateT
TCState
(ReaderT TCContext (ExceptT TraceError IO))
(Maybe (Env, ConstructorInfo))]
forall a b. (a -> b) -> [a] -> [b]
map (\ ConstructorInfo
ci -> (Env -> (Env, ConstructorInfo))
-> Maybe Env -> Maybe (Env, ConstructorInfo)
forall a b. (a -> b) -> Maybe a -> Maybe b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (,ConstructorInfo
ci) (Maybe Env -> Maybe (Env, ConstructorInfo))
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) (Maybe Env)
-> StateT
TCState
(ReaderT TCContext (ExceptT TraceError IO))
(Maybe (Env, ConstructorInfo))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Bool
-> Env
-> [Pattern]
-> [TVal]
-> TVal
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) (Maybe Env)
nonLinMatchList Bool
False Env
forall a. Environ a
emptyEnv ((PatternsType, [Pattern]) -> [Pattern]
forall a b. (a, b) -> b
snd ((PatternsType, [Pattern]) -> [Pattern])
-> (PatternsType, [Pattern]) -> [Pattern]
forall a b. (a -> b) -> a -> b
$ ConstructorInfo -> (PatternsType, [Pattern])
cPatFam ConstructorInfo
ci) [TVal]
vl TVal
dv) [ConstructorInfo]
cis
case mrhoci of
Maybe (Env, ConstructorInfo)
Nothing -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
fallback
Just (Env
rho,ConstructorInfo
ci) -> if (ConstructorInfo -> Bool
cRec ConstructorInfo
ci) then StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
fallback else do
String
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall (m :: * -> *) a.
MonadError TraceError m =>
String -> m a -> m a
enter (String
"lowerSemiContinuous: detected tuple type, checking components") (StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ())
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall a b. (a -> b) -> a -> b
$
[FieldInfo]
-> Env
-> (TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ())
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
allComponentTypes (ConstructorInfo -> [FieldInfo]
cFields ConstructorInfo
ci) Env
rho (Int
-> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
lowerSemiContinuous Int
i)
DataSig { Int
numPars :: SigDef -> Int
numPars :: Int
numPars, isSized :: SigDef -> Sized
isSized = Sized
Sized, isCo :: SigDef -> Co
isCo = Co
Ind } | [TVal] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [TVal]
vl Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
numPars -> do
s <- TVal -> TypeCheck TVal
whnfClos (TVal -> TypeCheck TVal) -> TVal -> TypeCheck TVal
forall a b. (a -> b) -> a -> b
$ [TVal]
vl [TVal] -> Int -> TVal
forall a. HasCallStack => [a] -> Int -> a
!! Int
numPars
case s of
VGen Int
i' | Int
i Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
i' -> () -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall a.
a -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
forall (m :: * -> *) a. Monad m => a -> m a
return ()
TVal
_ -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
fallback
DataSig { symbTyp :: SigDef -> TVal
symbTyp = TVal
dv, constructors :: SigDef -> [ConstructorInfo]
constructors = [ConstructorInfo]
cis, isCo :: SigDef -> Co
isCo = Co
Ind } ->
StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Bool
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall (m :: * -> *) a. Monad m => m Bool -> m a -> m a -> m a
ifM ((QName
n QName -> [QName] -> Bool
forall a. Eq a => a -> [a] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem`) ([QName] -> Bool)
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) [QName]
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Bool
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (TCContext -> [QName])
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) [QName]
forall r (m :: * -> *) a. MonadReader r m => (r -> a) -> m a
asks TCContext -> [QName]
callStack) StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
fallback (StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ())
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall a b. (a -> b) -> a -> b
$ do
(TCContext -> TCContext)
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall a.
(TCContext -> TCContext)
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
forall r (m :: * -> *) a. MonadReader r m => (r -> r) -> m a -> m a
local (\ TCContext
ce -> TCContext
ce { callStack = n : callStack ce }) (StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ())
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall a b. (a -> b) -> a -> b
$ do
[ConstructorInfo]
-> (ConstructorInfo
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ())
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
t a -> (a -> m b) -> m ()
forM_ [ConstructorInfo]
cis ((ConstructorInfo
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ())
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ())
-> (ConstructorInfo
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ())
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall a b. (a -> b) -> a -> b
$ \ ConstructorInfo
ci -> do
match <- Bool
-> Env
-> [Pattern]
-> [TVal]
-> TVal
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) (Maybe Env)
nonLinMatchList Bool
False Env
forall a. Environ a
emptyEnv ((PatternsType, [Pattern]) -> [Pattern]
forall a b. (a, b) -> b
snd ((PatternsType, [Pattern]) -> [Pattern])
-> (PatternsType, [Pattern]) -> [Pattern]
forall a b. (a -> b) -> a -> b
$ ConstructorInfo -> (PatternsType, [Pattern])
cPatFam ConstructorInfo
ci) [TVal]
vl TVal
dv
Foldable.forM_ match $ \ Env
rho -> do
String
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall (m :: * -> *) a.
MonadError TraceError m =>
String -> m a -> m a
enter (String
"lowerSemiContinuous: detected tuple type, checking components") (StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ())
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall a b. (a -> b) -> a -> b
$
[FieldInfo]
-> Env
-> (TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ())
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
allComponentTypes (ConstructorInfo -> [FieldInfo]
cFields ConstructorInfo
ci) Env
rho (Int
-> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
lowerSemiContinuous Int
i)
SigDef
_ -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
fallback
TVal
_ -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
fallback
upperSemiCont :: Int -> TVal -> TypeCheck Bool
upperSemiCont :: Int
-> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Bool
upperSemiCont Int
i TVal
tv = StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Bool
forall e (m :: * -> *). MonadError e m => m () -> m Bool
errorToBool (StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Bool)
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Bool
forall a b. (a -> b) -> a -> b
$ Bool
-> Int
-> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
endsInSizedCo' Bool
False Int
i TVal
tv
endsInSizedCo :: Int -> TVal -> TypeCheck ()
endsInSizedCo :: Int
-> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
endsInSizedCo = Bool
-> Int
-> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
endsInSizedCo' Bool
True
endsInSizedCo' :: Bool -> Int -> TVal -> TypeCheck ()
endsInSizedCo' :: Bool
-> Int
-> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
endsInSizedCo' Bool
endInCo Int
i TVal
tv = StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall (m :: * -> *) d a.
(MonadError TraceError m, Pretty d) =>
m d -> m a -> m a
enterDoc (String
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall {m :: * -> *}. Monad m => String -> m Doc
text String
"endsInSizedCo:" StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall {f :: * -> *}. Applicative f => f Doc -> f Doc -> f Doc
<+> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall a.
PrettyTCM a =>
a -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
prettyTCM TVal
tv) (StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ())
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall a b. (a -> b) -> a -> b
$ do
tv <- TVal -> TypeCheck TVal
force TVal
tv
let fallback
| Bool
endInCo = StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall (m :: * -> *) a. MonadError TraceError m => m Doc -> m a
failDoc (StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ())
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall a b. (a -> b) -> a -> b
$ String
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall {m :: * -> *}. Monad m => String -> m Doc
text String
"endsInSizedCo: target" StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall {f :: * -> *}. Applicative f => f Doc -> f Doc -> f Doc
<+> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall a.
PrettyTCM a =>
a -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
prettyTCM TVal
tv StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall {f :: * -> *}. Applicative f => f Doc -> f Doc -> f Doc
<+> String
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall {m :: * -> *}. Monad m => String -> m Doc
text String
"of corecursive function is neither a CoSet or codata of size" StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall {f :: * -> *}. Applicative f => f Doc -> f Doc -> f Doc
<+> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall a.
PrettyTCM a =>
a -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
prettyTCM (Int -> TVal
VGen Int
i) StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall {f :: * -> *}. Applicative f => f Doc -> f Doc -> f Doc
<+> String
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall {m :: * -> *}. Monad m => String -> m Doc
text String
"nor a tuple type"
| Bool
otherwise = Int
-> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
szMonotone Int
i TVal
tv
case tv of
VSort (CoSet (VGen Int
i)) -> () -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall a.
a -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
forall (m :: * -> *) a. Monad m => a -> m a
return ()
VMeasured Measure TVal
mu TVal
bv -> Bool
-> Int
-> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
endsInSizedCo' Bool
endInCo Int
i TVal
bv
VQuant PiSigma
Pi Name
x dom :: Domain
dom@Domain{ typ :: forall a. Dom a -> a
typ = VBelow LtLe
Le (VGen Int
i') } TVal
fv | Int
i Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
i' ->
Name
-> Domain
-> TVal
-> (Int
-> TVal
-> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ())
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall a.
Name
-> Domain
-> TVal
-> (Int -> TVal -> TVal -> TypeCheck a)
-> TypeCheck a
underAbs Name
x Domain
dom TVal
fv ((Int
-> TVal
-> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ())
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ())
-> (Int
-> TVal
-> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ())
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall a b. (a -> b) -> a -> b
$ \ Int
j TVal
xv TVal
bv ->
Bool
-> Int
-> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
endsInSizedCo' Bool
endInCo Int
j TVal
bv
VGuard (Bound LtLe
Le (Measure [VGen Int
j]) (Measure [VGen Int
i'])) TVal
bv | Int
i Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
i' ->
Bool
-> Int
-> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
endsInSizedCo' Bool
endInCo Int
j TVal
bv
VQuant PiSigma
Pi Name
x dom :: Domain
dom@Domain{ typ :: forall a. Dom a -> a
typ = VBelow LtLe
Lt (VSucc (VGen Int
i')) } TVal
fv | Int
i Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
i' ->
Name
-> Domain
-> TVal
-> (Int
-> TVal
-> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ())
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall a.
Name
-> Domain
-> TVal
-> (Int -> TVal -> TVal -> TypeCheck a)
-> TypeCheck a
underAbs Name
x Domain
dom TVal
fv ((Int
-> TVal
-> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ())
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ())
-> (Int
-> TVal
-> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ())
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall a b. (a -> b) -> a -> b
$ \ Int
j TVal
xv TVal
bv ->
Bool
-> Int
-> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
endsInSizedCo' Bool
endInCo Int
j TVal
bv
VGuard (Bound LtLe
Lt (Measure [VGen Int
j]) (Measure [VSucc (VGen Int
i')])) TVal
bv | Int
i Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
i' ->
Bool
-> Int
-> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
endsInSizedCo' Bool
endInCo Int
j TVal
bv
VGuard (Bound LtLe
Lt (Measure [VGen Int
j]) (Measure [VGen Int
i'])) TVal
bv | Int
i Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
i' ->
() -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall a.
a -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
forall (m :: * -> *) a. Monad m => a -> m a
return ()
VQuant PiSigma
Pi Name
x dom :: Domain
dom@Domain{ typ :: forall a. Dom a -> a
typ = VBelow LtLe
Lt (VGen Int
i') } TVal
fv | Int
i Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
i' -> () -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall a.
a -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
forall (m :: * -> *) a. Monad m => a -> m a
return ()
VQuant PiSigma
Pi Name
x Domain
dom TVal
fv -> do
Int
-> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
lowerSemiContinuous Int
i (TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ())
-> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall a b. (a -> b) -> a -> b
$ Domain -> TVal
forall a. Dom a -> a
typ Domain
dom
Name
-> Domain
-> TVal
-> (Int
-> TVal
-> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ())
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall a.
Name
-> Domain
-> TVal
-> (Int -> TVal -> TVal -> TypeCheck a)
-> TypeCheck a
underAbs Name
x Domain
dom TVal
fv ((Int
-> TVal
-> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ())
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ())
-> (Int
-> TVal
-> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ())
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall a b. (a -> b) -> a -> b
$ \ Int
_ TVal
xv TVal
bv -> Bool
-> Int
-> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
endsInSizedCo' Bool
endInCo Int
i TVal
bv
VSing TVal
_ TVal
tv -> Bool
-> Int
-> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
endsInSizedCo' Bool
endInCo Int
i (TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ())
-> TypeCheck TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< TVal -> TypeCheck TVal
whnfClos TVal
tv
VApp (VDef (DefId IdKind
DatK QName
n)) [TVal]
vl -> do
sige <- QName
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) SigDef
forall (m :: * -> *). MonadSig m => QName -> m SigDef
lookupSymbQ QName
n
case sige of
DataSig { numPars :: SigDef -> Int
numPars = Int
np, isSized :: SigDef -> Sized
isSized = Sized
Sized, isCo :: SigDef -> Co
isCo = Co
CoInd }
| [TVal] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [TVal]
vl Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
np -> do
v <- TVal -> TypeCheck TVal
whnfClos (TVal -> TypeCheck TVal) -> TVal -> TypeCheck TVal
forall a b. (a -> b) -> a -> b
$ [TVal]
vl [TVal] -> Int -> TVal
forall a. HasCallStack => [a] -> Int -> a
!! Int
np
if isVGeni v then return () else fallback
where isVGeni :: TVal -> Bool
isVGeni (VGen Int
i) = Bool
True
isVGeni (VPlus [TVal]
vs) = [Bool] -> Bool
forall (t :: * -> *). Foldable t => t Bool -> Bool
and ([Bool] -> Bool) -> [Bool] -> Bool
forall a b. (a -> b) -> a -> b
$ (TVal -> Bool) -> [TVal] -> [Bool]
forall a b. (a -> b) -> [a] -> [b]
map TVal -> Bool
isVGeni [TVal]
vs
isVGeni (VMax [TVal]
vs) = [Bool] -> Bool
forall (t :: * -> *). Foldable t => t Bool -> Bool
and ([Bool] -> Bool) -> [Bool] -> Bool
forall a b. (a -> b) -> a -> b
$ (TVal -> Bool) -> [TVal] -> [Bool]
forall a b. (a -> b) -> [a] -> [b]
map TVal -> Bool
isVGeni [TVal]
vs
isVGeni TVal
VZero = Bool
True
isVGeni TVal
_ = Bool
False
DataSig { symbTyp :: SigDef -> TVal
symbTyp = TVal
dv, constructors :: SigDef -> [ConstructorInfo]
constructors = [ConstructorInfo]
cis, isTuple :: SigDef -> Bool
isTuple = Bool
True } -> do
TVal
-> [TVal]
-> TVal
-> [ConstructorInfo]
-> (TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ())
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
allTypesOfTuple TVal
tv [TVal]
vl TVal
dv [ConstructorInfo]
cis (Bool
-> Int
-> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
endsInSizedCo' Bool
endInCo Int
i)
SigDef
_ -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
fallback
TVal
_ -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
fallback
allTypesOfTuple :: TVal -> [Val] -> TVal -> [ConstructorInfo] -> (TVal -> TypeCheck ()) -> TypeCheck ()
allTypesOfTuple :: TVal
-> [TVal]
-> TVal
-> [ConstructorInfo]
-> (TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ())
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
allTypesOfTuple TVal
tv [TVal]
vl TVal
dv [ConstructorInfo]
cis TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
check = do
mrhoci <- [StateT
TCState
(ReaderT TCContext (ExceptT TraceError IO))
(Maybe (Env, ConstructorInfo))]
-> StateT
TCState
(ReaderT TCContext (ExceptT TraceError IO))
(Maybe (Env, ConstructorInfo))
forall (m :: * -> *) a. Monad m => [m (Maybe a)] -> m (Maybe a)
Util.firstJustM ([StateT
TCState
(ReaderT TCContext (ExceptT TraceError IO))
(Maybe (Env, ConstructorInfo))]
-> StateT
TCState
(ReaderT TCContext (ExceptT TraceError IO))
(Maybe (Env, ConstructorInfo)))
-> [StateT
TCState
(ReaderT TCContext (ExceptT TraceError IO))
(Maybe (Env, ConstructorInfo))]
-> StateT
TCState
(ReaderT TCContext (ExceptT TraceError IO))
(Maybe (Env, ConstructorInfo))
forall a b. (a -> b) -> a -> b
$
(ConstructorInfo
-> StateT
TCState
(ReaderT TCContext (ExceptT TraceError IO))
(Maybe (Env, ConstructorInfo)))
-> [ConstructorInfo]
-> [StateT
TCState
(ReaderT TCContext (ExceptT TraceError IO))
(Maybe (Env, ConstructorInfo))]
forall a b. (a -> b) -> [a] -> [b]
map (\ ConstructorInfo
ci -> (Env -> (Env, ConstructorInfo))
-> Maybe Env -> Maybe (Env, ConstructorInfo)
forall a b. (a -> b) -> Maybe a -> Maybe b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (,ConstructorInfo
ci) (Maybe Env -> Maybe (Env, ConstructorInfo))
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) (Maybe Env)
-> StateT
TCState
(ReaderT TCContext (ExceptT TraceError IO))
(Maybe (Env, ConstructorInfo))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Bool
-> Env
-> [Pattern]
-> [TVal]
-> TVal
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) (Maybe Env)
nonLinMatchList Bool
False Env
forall a. Environ a
emptyEnv ((PatternsType, [Pattern]) -> [Pattern]
forall a b. (a, b) -> b
snd ((PatternsType, [Pattern]) -> [Pattern])
-> (PatternsType, [Pattern]) -> [Pattern]
forall a b. (a -> b) -> a -> b
$ ConstructorInfo -> (PatternsType, [Pattern])
cPatFam ConstructorInfo
ci) [TVal]
vl TVal
dv) [ConstructorInfo]
cis
case mrhoci of
Maybe (Env, ConstructorInfo)
Nothing -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall (m :: * -> *) a. MonadError TraceError m => m Doc -> m a
failDoc (StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ())
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall a b. (a -> b) -> a -> b
$ String
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall {m :: * -> *}. Monad m => String -> m Doc
text String
"allTypesOfTuple: panic: target type" StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall {f :: * -> *}. Applicative f => f Doc -> f Doc -> f Doc
<+> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall a.
PrettyTCM a =>
a -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
prettyTCM TVal
tv StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall {f :: * -> *}. Applicative f => f Doc -> f Doc -> f Doc
<+> String
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall {m :: * -> *}. Monad m => String -> m Doc
text String
"is not an instance of any constructor"
Just (Env
rho,ConstructorInfo
ci) -> String
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall (m :: * -> *) a.
MonadError TraceError m =>
String -> m a -> m a
enter (String
"allTypesOfTuple: detected tuple target, checking components") (StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ())
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall a b. (a -> b) -> a -> b
$
[FieldInfo]
-> Env
-> (TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ())
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
allComponentTypes (ConstructorInfo -> [FieldInfo]
cFields ConstructorInfo
ci) Env
rho TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
check
allComponentTypes :: [FieldInfo] -> Env -> (TVal -> TypeCheck ()) -> TypeCheck ()
allComponentTypes :: [FieldInfo]
-> Env
-> (TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ())
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
allComponentTypes [FieldInfo]
fis Env
rho0 TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
check = String
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall (m :: * -> *) a.
MonadError TraceError m =>
String -> m a -> m a
enter (String
"allComponentTypes: checking fields of tuple type " String -> String -> String
forall a. [a] -> [a] -> [a]
++ [FieldInfo] -> String
forall a. Show a => a -> String
show [FieldInfo]
fis String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
" in environment " String -> String -> String
forall a. [a] -> [a] -> [a]
++ Env -> String
forall a. Show a => a -> String
show Env
rho0) (StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ())
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall a b. (a -> b) -> a -> b
$
[FieldInfo]
-> Env
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
loop [FieldInfo]
fis Env
rho0 where
loop :: [FieldInfo]
-> Env
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
loop [] Env
rho = () -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall a.
a -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
forall (m :: * -> *) a. Monad m => a -> m a
return ()
loop (FieldInfo
f : [FieldInfo]
fs) Env
rho | FieldInfo -> FieldClass
fClass FieldInfo
f FieldClass -> FieldClass -> Bool
forall a. Eq a => a -> a -> Bool
== FieldClass
Index Bool -> Bool -> Bool
&& Dec -> Bool
forall pol. Polarity pol => pol -> Bool
erased (FieldInfo -> Dec
fDec FieldInfo
f) =
[FieldInfo]
-> Env
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
loop [FieldInfo]
fs Env
rho
loop (FieldInfo
f : [FieldInfo]
fs) Env
rho | FieldInfo -> FieldClass
fClass FieldInfo
f FieldClass -> FieldClass -> Bool
forall a. Eq a => a -> a -> Bool
== FieldClass
Index = do
TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
check (TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ())
-> TypeCheck TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< Env -> Expr -> TypeCheck TVal
whnf Env
rho (FieldInfo -> Expr
fType FieldInfo
f)
[FieldInfo]
-> Env
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
loop [FieldInfo]
fs Env
rho
loop (FieldInfo
f : [FieldInfo]
fs) Env
rho = do
tv <- Env -> Expr -> TypeCheck TVal
whnf Env
rho (FieldInfo -> Expr
fType FieldInfo
f)
when (not $ erased (fDec f)) $ check tv
new (fName f) (Domain tv defaultKind (fDec f)) $ \ TVal
xv -> do
[FieldInfo]
-> Env
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
loop [FieldInfo]
fs (Env
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ())
-> Env
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall a b. (a -> b) -> a -> b
$ Env -> Name -> TVal -> Env
forall a. Environ a -> Name -> a -> Environ a
update Env
rho (FieldInfo -> Name
fName FieldInfo
f) TVal
xv
endsInCo :: TVal -> TypeCheck Bool
endsInCo :: TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Bool
endsInCo TVal
tv =
case TVal
tv of
VQuant PiSigma
Pi Name
x Domain
dom TVal
fv -> Name
-> Domain
-> TVal
-> (Int
-> TVal
-> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Bool)
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Bool
forall a.
Name
-> Domain
-> TVal
-> (Int -> TVal -> TVal -> TypeCheck a)
-> TypeCheck a
underAbs Name
x Domain
dom TVal
fv ((Int
-> TVal
-> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Bool)
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Bool)
-> (Int
-> TVal
-> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Bool)
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Bool
forall a b. (a -> b) -> a -> b
$ \ Int
_ TVal
_ TVal
bv -> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Bool
endsInCo TVal
bv
VApp (VDef (DefId IdKind
DatK QName
n)) [TVal]
vl -> do
sige <- QName
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) SigDef
forall (m :: * -> *). MonadSig m => QName -> m SigDef
lookupSymbQ QName
n
case sige of
DataSig { isCo :: SigDef -> Co
isCo = Co
CoInd } ->
Bool
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Bool
forall a.
a -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
forall (m :: * -> *) a. Monad m => a -> m a
return Bool
True
SigDef
_ -> Bool
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Bool
forall a.
a -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
forall (m :: * -> *) a. Monad m => a -> m a
return Bool
False
TVal
_ -> Bool
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Bool
forall a.
a -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
forall (m :: * -> *) a. Monad m => a -> m a
return Bool
False
admPattern :: Pattern -> TVal -> TypeCheck (Pattern, [Co])
admPattern :: Pattern -> TVal -> TypeCheck (Pattern, [Co])
admPattern Pattern
p TVal
tv = String -> TypeCheck (Pattern, [Co]) -> TypeCheck (Pattern, [Co])
forall a. String -> a -> a
traceAdm (String
"admPattern " String -> String -> String
forall a. [a] -> [a] -> [a]
++ Pattern -> String
forall a. Show a => a -> String
show Pattern
p String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
" type: " String -> String -> String
forall a. [a] -> [a] -> [a]
++ TVal -> String
forall a. Show a => a -> String
show TVal
tv) (TypeCheck (Pattern, [Co]) -> TypeCheck (Pattern, [Co]))
-> TypeCheck (Pattern, [Co]) -> TypeCheck (Pattern, [Co])
forall a b. (a -> b) -> a -> b
$
case TVal
tv of
VGuard Bound TVal
beta TVal
bv -> Bound TVal
-> TypeCheck (Pattern, [Co]) -> TypeCheck (Pattern, [Co])
forall a.
Bound TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
forall (m :: * -> *) a. MonadCxt m => Bound TVal -> m a -> m a
addBoundHyp Bound TVal
beta (TypeCheck (Pattern, [Co]) -> TypeCheck (Pattern, [Co]))
-> TypeCheck (Pattern, [Co]) -> TypeCheck (Pattern, [Co])
forall a b. (a -> b) -> a -> b
$ Pattern -> TVal -> TypeCheck (Pattern, [Co])
admPattern Pattern
p TVal
bv
VApp (VDef (DefId IdKind
DatK QName
d)) [TVal]
vl -> do
case Pattern
p of
ProjP Name
n -> (Pattern, [Co]) -> TypeCheck (Pattern, [Co])
forall a.
a -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
forall (m :: * -> *) a. Monad m => a -> m a
return (Pattern
p, [])
Pattern
_ -> String -> TypeCheck (Pattern, [Co])
forall (m :: * -> *) a. MonadError TraceError m => String -> m a
throwErrorMsg String
"admPattern: IMPOSSIBLE: non-projection pattern for record type"
VQuant PiSigma
Pi Name
x Domain
dom TVal
fv -> Name
-> Domain
-> TVal
-> (Int -> TVal -> TVal -> TypeCheck (Pattern, [Co]))
-> TypeCheck (Pattern, [Co])
forall a.
Name
-> Domain
-> TVal
-> (Int -> TVal -> TVal -> TypeCheck a)
-> TypeCheck a
underAbs Name
x Domain
dom TVal
fv ((Int -> TVal -> TVal -> TypeCheck (Pattern, [Co]))
-> TypeCheck (Pattern, [Co]))
-> (Int -> TVal -> TVal -> TypeCheck (Pattern, [Co]))
-> TypeCheck (Pattern, [Co])
forall a b. (a -> b) -> a -> b
$ \ Int
k TVal
xv TVal
bv -> do
if Pattern -> Bool
isSuccessorPattern Pattern
p then do
inco <- Int -> TVal -> TypeCheck [Co]
admType Int
k TVal
bv
when (CoInd `elem` inco && not (shallowSuccP p)) $ cannotMatchDeep p tv
if (CoInd `elem` inco)
|| (inco /= [] && completeP p)
then return (p, inco)
else return (UnusableP p, inco)
else (Pattern, [Co]) -> TypeCheck (Pattern, [Co])
forall a.
a -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
forall (m :: * -> *) a. Monad m => a -> m a
return (Pattern
p, [])
TVal
_ -> String -> TypeCheck (Pattern, [Co])
forall (m :: * -> *) a. MonadError TraceError m => String -> m a
throwErrorMsg String
"admPattern: IMPOSSIBLE: pattern for a non-function type"
cannotMatchDeep :: Pattern -> TVal -> TypeCheck ()
cannotMatchDeep :: Pattern
-> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
cannotMatchDeep Pattern
p TVal
tv = StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall (m :: * -> *). MonadAssert m => m Doc -> m ()
recoverFailDoc (StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ())
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall a b. (a -> b) -> a -> b
$
String
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall {m :: * -> *}. Monad m => String -> m Doc
text String
"cannot match against deep successor pattern"
StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall {f :: * -> *}. Applicative f => f Doc -> f Doc -> f Doc
<+> String
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall {m :: * -> *}. Monad m => String -> m Doc
text (Pattern -> String
forall a. Show a => a -> String
show Pattern
p) StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall {f :: * -> *}. Applicative f => f Doc -> f Doc -> f Doc
<+> String
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall {m :: * -> *}. Monad m => String -> m Doc
text String
"at type" StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall {f :: * -> *}. Applicative f => f Doc -> f Doc -> f Doc
<+> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
forall a.
PrettyTCM a =>
a -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
prettyTCM TVal
tv
admType :: Int -> TVal -> TypeCheck [Co]
admType :: Int -> TVal -> TypeCheck [Co]
admType Int
i TVal
tv = String -> TypeCheck [Co] -> TypeCheck [Co]
forall (m :: * -> *) a.
MonadError TraceError m =>
String -> m a -> m a
enter (String
"admType: checking " String -> String -> String
forall a. [a] -> [a] -> [a]
++ TVal -> String
forall a. Show a => a -> String
show TVal
tv String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
" admissible in v" String -> String -> String
forall a. [a] -> [a] -> [a]
++ Int -> String
forall a. Show a => a -> String
show Int
i) (TypeCheck [Co] -> TypeCheck [Co])
-> TypeCheck [Co] -> TypeCheck [Co]
forall a b. (a -> b) -> a -> b
$
case TVal
tv of
VQuant PiSigma
Pi Name
x dom :: Domain
dom@(Domain TVal
av Kind
_ Dec
_) TVal
fv -> do
isInd <- Co
-> Int
-> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Bool
szUsed Co
Ind Int
i TVal
av
when (not isInd) $
szAntitone i av `newErrorDoc` docNotLowerSemi i av
underAbs x dom fv $ \ Int
gen TVal
_ TVal
bv -> do
inco <- Int -> TVal -> TypeCheck [Co]
admType Int
i TVal
bv
if isInd then return (Ind : inco) else return inco
TVal
_ -> do
isCoind <- Co
-> Int
-> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Bool
szUsed Co
CoInd Int
i TVal
tv
if isCoind then return [CoInd]
else do
szMonotone i tv
return []
szUsed :: Co -> Int -> TVal -> TypeCheck Bool
szUsed :: Co
-> Int
-> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Bool
szUsed Co
co Int
i TVal
tv = String
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Bool
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Bool
forall a. String -> a -> a
traceAdm (String
"szUsed: " String -> String -> String
forall a. [a] -> [a] -> [a]
++ TVal -> String
forall a. Show a => a -> String
show TVal
tv String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
" " String -> String -> String
forall a. [a] -> [a] -> [a]
++ Co -> String
forall a. Show a => a -> String
show Co
co String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
" in v" String -> String -> String
forall a. [a] -> [a] -> [a]
++ Int -> String
forall a. Show a => a -> String
show Int
i) (StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Bool
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Bool)
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Bool
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Bool
forall a b. (a -> b) -> a -> b
$
case TVal
tv of
(VApp (VDef (DefId IdKind
DatK QName
n)) [TVal]
vl) -> do
String
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall (m :: * -> *). Monad m => String -> m ()
traceAdmM (String
"szUsed: case data type: " String -> String -> String
forall a. [a] -> [a] -> [a]
++ QName -> String
forall a. Show a => a -> String
show QName
n String -> String -> String
forall a. [a] -> [a] -> [a]
++ [TVal] -> String
forall a. Show a => a -> String
show [TVal]
vl)
sige <- QName
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) SigDef
forall (m :: * -> *). MonadSig m => QName -> m SigDef
lookupSymbQ QName
n
case sige of
DataSig { numPars :: SigDef -> Int
numPars = Int
p
, isSized :: SigDef -> Sized
isSized = Sized
Sized
, isCo :: SigDef -> Co
isCo = Co
co' } | Co
co Co -> Co -> Bool
forall a. Eq a => a -> a -> Bool
== Co
co' Bool -> Bool -> Bool
&& [TVal] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [TVal]
vl Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
p ->
do s <- TVal -> TypeCheck TVal
whnfClos (TVal -> TypeCheck TVal) -> TVal -> TypeCheck TVal
forall a b. (a -> b) -> a -> b
$ [TVal]
vl [TVal] -> Int -> TVal
forall a. HasCallStack => [a] -> Int -> a
!! Int
p
case s of
VGen Int
i' | Int
i Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
i' -> Bool
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Bool
forall a.
a -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
forall (m :: * -> *) a. Monad m => a -> m a
return Bool
True
TVal
_ -> Bool
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Bool
forall a.
a -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
forall (m :: * -> *) a. Monad m => a -> m a
return Bool
False
SigDef
_ -> Bool
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Bool
forall a.
a -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
forall (m :: * -> *) a. Monad m => a -> m a
return Bool
False
TVal
_ -> Bool
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Bool
forall a.
a -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
forall (m :: * -> *) a. Monad m => a -> m a
return Bool
False
szCheckIndFun :: [Int] -> TVal -> TypeCheck ()
szCheckIndFun :: [Int]
-> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
szCheckIndFun [Int]
admpos TVal
tv =
case TVal
tv of
VQuant PiSigma
Pi Name
x Domain
dom TVal
fv -> Name
-> Domain
-> TVal
-> (Int
-> TVal
-> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ())
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall a.
Name
-> Domain
-> TVal
-> (Int -> TVal -> TVal -> TypeCheck a)
-> TypeCheck a
underAbs Name
x Domain
dom TVal
fv ((Int
-> TVal
-> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ())
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ())
-> (Int
-> TVal
-> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ())
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall a b. (a -> b) -> a -> b
$ \ Int
k TVal
_ TVal
bv -> do
if TVal -> Bool
isVSize (Domain -> TVal
forall a. Dom a -> a
typ Domain
dom) then do
Bool
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (Int
k Int -> [Int] -> Bool
forall a. Eq a => a -> [a] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [Int]
admpos) (StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ())
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall a b. (a -> b) -> a -> b
$
Int
-> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
szCheckIndFunSize Int
k TVal
bv
[Int]
-> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
szCheckIndFun [Int]
admpos TVal
bv
else [Int]
-> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
szCheckIndFun [Int]
admpos TVal
bv
TVal
_ -> () -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall a.
a -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
forall (m :: * -> *) a. Monad m => a -> m a
return ()
szCheckIndFunSize :: Int -> TVal -> TypeCheck ()
szCheckIndFunSize :: Int
-> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
szCheckIndFunSize Int
i TVal
tv =
case TVal
tv of
VQuant PiSigma
Pi Name
x Domain
dom TVal
fv -> do
Int
-> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
szLowerSemiCont Int
i (Domain -> TVal
forall a. Dom a -> a
typ Domain
dom)
Name
-> Domain
-> TVal
-> (Int
-> TVal
-> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ())
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall a.
Name
-> Domain
-> TVal
-> (Int -> TVal -> TVal -> TypeCheck a)
-> TypeCheck a
underAbs Name
x Domain
dom TVal
fv ((Int
-> TVal
-> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ())
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ())
-> (Int
-> TVal
-> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ())
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall a b. (a -> b) -> a -> b
$ \ Int
_ TVal
_ TVal
bv -> Int
-> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
szCheckIndFunSize Int
i TVal
bv
TVal
_ -> Int
-> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
szMonotone Int
i TVal
tv
szLowerSemiCont :: Int -> TVal -> TypeCheck ()
szLowerSemiCont :: Int
-> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
szLowerSemiCont Int
i TVal
av =
(Int
-> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
szAntitone Int
i TVal
av StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
-> (TraceError
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ())
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall a.
StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
-> (TraceError
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a)
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
forall e (m :: * -> *) a.
MonadError e m =>
m a -> (e -> m a) -> m a
`catchError`
(\ TraceError
msg ->
Int
-> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
szInductive Int
i TVal
av))
StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall (m :: * -> *) a.
MonadError TraceError m =>
m a -> m Doc -> m a
`newErrorDoc` Int
-> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Doc
docNotLowerSemi Int
i TVal
av
data CoFunType
= CoFun
| SizedCoFun Int
admCoFun :: TVal -> TypeCheck CoFunType
admCoFun :: TVal -> TypeCheck CoFunType
admCoFun TVal
tv = do
l <- StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Int
forall (m :: * -> *). MonadCxt m => m Int
getLen
admEndsInCo tv l (\ Int
i -> () -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall a.
a -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
forall (m :: * -> *) a. Monad m => a -> m a
return ())
admEndsInCo :: TVal -> Int -> (Int -> TypeCheck ()) -> TypeCheck CoFunType
admEndsInCo :: TVal
-> Int
-> (Int
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ())
-> TypeCheck CoFunType
admEndsInCo TVal
tv Int
firstVar Int
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
jobs =
case TVal
tv of
VQuant PiSigma
Pi Name
x Domain
dom TVal
fv -> do
l <- StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) Int
forall (m :: * -> *). MonadCxt m => m Int
getLen
let jobs' = (Int
-> TVal
-> (Int
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ())
-> Int
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
addJob Int
l (Domain -> TVal
forall a. Dom a -> a
typ Domain
dom) Int
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
jobs)
underAbs x dom fv $ \ Int
_ TVal
_ TVal
bv -> TVal
-> Int
-> (Int
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ())
-> TypeCheck CoFunType
admEndsInCo TVal
bv Int
firstVar Int
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
jobs'
VApp (VDef (DefId IdKind
DatK QName
n)) [TVal]
vl -> do
sige <- QName
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) SigDef
forall (m :: * -> *). MonadSig m => QName -> m SigDef
lookupSymbQ QName
n
case sige of
DataSig { isSized :: SigDef -> Sized
isSized = Sized
NotSized, isCo :: SigDef -> Co
isCo = Co
CoInd } ->
CoFunType -> TypeCheck CoFunType
forall a.
a -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
forall (m :: * -> *) a. Monad m => a -> m a
return CoFunType
CoFun
DataSig { numPars :: SigDef -> Int
numPars = Int
p, isSized :: SigDef -> Sized
isSized = Sized
Sized, isCo :: SigDef -> Co
isCo = Co
CoInd } | [TVal] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [TVal]
vl Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
p ->
do
s <- TVal -> TypeCheck TVal
whnfClos (TVal -> TypeCheck TVal) -> TVal -> TypeCheck TVal
forall a b. (a -> b) -> a -> b
$ [TVal]
vl [TVal] -> Int -> TVal
forall a. HasCallStack => [a] -> Int -> a
!! Int
p
case s of
VGen Int
i -> do
Int
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
jobs Int
i
CoFunType -> TypeCheck CoFunType
forall a.
a -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
forall (m :: * -> *) a. Monad m => a -> m a
return (CoFunType -> TypeCheck CoFunType)
-> CoFunType -> TypeCheck CoFunType
forall a b. (a -> b) -> a -> b
$ Int -> CoFunType
SizedCoFun (Int -> CoFunType) -> Int -> CoFunType
forall a b. (a -> b) -> a -> b
$ Int
i Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
firstVar
TVal
_ -> String -> TypeCheck CoFunType
forall (m :: * -> *) a. MonadError TraceError m => String -> m a
throwErrorMsg (String -> TypeCheck CoFunType) -> String -> TypeCheck CoFunType
forall a b. (a -> b) -> a -> b
$ String
"size argument in result type must be a variable"
SigDef
_ -> String -> TypeCheck CoFunType
forall (m :: * -> *) a. MonadError TraceError m => String -> m a
throwErrorMsg (String -> TypeCheck CoFunType) -> String -> TypeCheck CoFunType
forall a b. (a -> b) -> a -> b
$ String
"type of cofun does not end in coinductive type"
addJob :: Int -> TVal -> (Int -> TypeCheck ())
-> (Int -> TypeCheck ())
addJob :: Int
-> TVal
-> (Int
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ())
-> Int
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
addJob Int
l TVal
tv Int
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
jobs Int
recVar = do
Int
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
jobs Int
recVar
Bool
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (Int
recVar Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
l) (StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ())
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall a b. (a -> b) -> a -> b
$ Int
-> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
szLowerSemiCont Int
recVar TVal
tv
szMono :: Co -> Int -> TVal -> TypeCheck ()
szMono :: Co
-> Int
-> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
szMono Co
co Int
i TVal
tv =
case Co
co of
Co
Ind -> Int
-> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
szMonotone Int
i TVal
tv
Co
CoInd -> Int
-> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
szAntitone Int
i TVal
tv
szMonotone :: Int -> TVal -> TypeCheck ()
szMonotone :: Int
-> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
szMonotone Int
i TVal
tv = String
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall a. String -> a -> a
traceCheck (String
"szMonotone: "
String -> String -> String
forall a. [a] -> [a] -> [a]
++ TVal -> String
forall a. Show a => a -> String
show TVal
tv String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
" mon(v" String -> String -> String
forall a. [a] -> [a] -> [a]
++ Int -> String
forall a. Show a => a -> String
show Int
i String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
")?") (StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ())
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall a b. (a -> b) -> a -> b
$
do
let si :: TVal
si = TVal -> TVal
VSucc (Int -> TVal
VGen Int
i)
tv' <- Substitution -> TVal -> TypeCheck TVal
forall a. Substitute a => Substitution -> a -> TypeCheck a
substitute (Int -> TVal -> Substitution
sgSub Int
i TVal
si) TVal
tv
leqVal Pos vTopSort tv tv'
szAntitone :: Int -> TVal -> TypeCheck ()
szAntitone :: Int
-> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
szAntitone Int
i TVal
tv = String
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall a. String -> a -> a
traceCheck (String
"szAntitone: "
String -> String -> String
forall a. [a] -> [a] -> [a]
++ TVal -> String
forall a. Show a => a -> String
show TVal
tv String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
" anti(v" String -> String -> String
forall a. [a] -> [a] -> [a]
++ Int -> String
forall a. Show a => a -> String
show Int
i String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
")?") (StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ())
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall a b. (a -> b) -> a -> b
$
do
let si :: TVal
si = TVal -> TVal
VSucc (Int -> TVal
VGen Int
i)
tv' <- Substitution -> TVal -> TypeCheck TVal
forall a. Substitute a => Substitution -> a -> TypeCheck a
substitute (Int -> TVal -> Substitution
sgSub Int
i TVal
si) TVal
tv
leqVal Neg vTopSort tv tv'
szInductive :: Int -> TVal -> TypeCheck ()
szInductive :: Int
-> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
szInductive Int
i TVal
tv = Co
-> Int
-> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
szUsed' Co
Ind Int
i TVal
tv
szCoInductive :: Int -> TVal -> TypeCheck ()
szCoInductive :: Int
-> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
szCoInductive Int
i TVal
tv = Co
-> Int
-> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
szUsed' Co
CoInd Int
i TVal
tv
szUsed' :: Co -> Int -> TVal -> TypeCheck ()
szUsed' :: Co
-> Int
-> TVal
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
szUsed' Co
co Int
i TVal
tv =
case TVal
tv of
(VApp (VDef (DefId IdKind
DatK QName
n)) [TVal]
vl) ->
do sige <- QName
-> StateT
TCState (ReaderT TCContext (ExceptT TraceError IO)) SigDef
forall (m :: * -> *). MonadSig m => QName -> m SigDef
lookupSymbQ QName
n
case sige of
DataSig { numPars :: SigDef -> Int
numPars = Int
p, isSized :: SigDef -> Sized
isSized = Sized
Sized, isCo :: SigDef -> Co
isCo = Co
co' } | Co
co Co -> Co -> Bool
forall a. Eq a => a -> a -> Bool
== Co
co' Bool -> Bool -> Bool
&& [TVal] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [TVal]
vl Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
p ->
do s <- TVal -> TypeCheck TVal
whnfClos (TVal -> TypeCheck TVal) -> TVal -> TypeCheck TVal
forall a b. (a -> b) -> a -> b
$ [TVal]
vl [TVal] -> Int -> TVal
forall a. HasCallStack => [a] -> Int -> a
!! Int
p
case s of
VGen Int
i' | Int
i Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
i' -> () -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall a.
a -> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) a
forall (m :: * -> *) a. Monad m => a -> m a
return ()
TVal
_ -> String
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall (m :: * -> *) a. MonadError TraceError m => String -> m a
throwErrorMsg (String
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ())
-> String
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall a b. (a -> b) -> a -> b
$ String
"expected size variable"
SigDef
_ -> String
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall (m :: * -> *) a. MonadError TraceError m => String -> m a
throwErrorMsg (String
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ())
-> String
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall a b. (a -> b) -> a -> b
$ String
"expected (co)inductive sized type"
TVal
_ -> String
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall (m :: * -> *) a. MonadError TraceError m => String -> m a
throwErrorMsg (String
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ())
-> String
-> StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) ()
forall a b. (a -> b) -> a -> b
$ String
"expected (co)inductive sized type"