{-# OPTIONS_GHC -Wunused-imports #-}
module Mikan.TypeChecking.Rules.Cubical
( cubicalPrimChecks
, isConstrainedPrimitive
)
where
import Prelude hiding ( null )
import Data.Map.Strict qualified as Map
import Mikan.Syntax.Concrete.Pretty ()
import Mikan.Syntax.Common
import Mikan.Syntax.Internal as I
import Mikan.Syntax.Position
import {-# SOURCE #-} Mikan.TypeChecking.Rules.Application
import Mikan.TypeChecking.Conversion
import Mikan.TypeChecking.MetaVars
import Mikan.TypeChecking.Names
import Mikan.TypeChecking.Pretty
import Mikan.TypeChecking.Primitive hiding (Nat)
import Mikan.TypeChecking.Monad
import Mikan.TypeChecking.Substitute
import Mikan.Utils.Functor
import Mikan.Utils.List hiding (Suffix)
import Mikan.Utils.Impossible
pattern (:@) :: Arg a -> [Elim' a] -> [Elim' a]
pattern x $b:@ :: forall a. Arg a -> [Elim' a] -> [Elim' a]
$m:@ :: forall {r} {a}.
[Elim' a] -> (Arg a -> [Elim' a] -> r) -> ((# #) -> r) -> r
:@ xs = Apply x:xs
infixr 5 :@
cubicalPrimChecks :: Map.Map PrimitiveId (QName -> ArgsCheck)
cubicalPrimChecks :: Map PrimitiveId (QName -> ArgsCheck)
cubicalPrimChecks = [(PrimitiveId, QName -> ArgsCheck)]
-> Map PrimitiveId (QName -> ArgsCheck)
forall k a. Ord k => [(k, a)] -> Map k a
Map.fromList
[ (PrimitiveId
builtinPOr, QName -> ArgsCheck
checkPrimPOr)
, (PrimitiveId
builtinComp, QName -> ArgsCheck
checkPrimComp)
, (PrimitiveId
builtinHComp, QName -> ArgsCheck
checkPrimHComp)
, (PrimitiveId
builtinTrans, QName -> ArgsCheck
checkPrimTrans)
, (PrimitiveId
builtin_glue, QName -> ArgsCheck
checkPrimGlue)
, (PrimitiveId
builtin_glueU, QName -> ArgsCheck
checkPrimGlueU)
]
isConstrainedPrimitive :: QName -> TCM (Maybe ArgsCheck)
isConstrainedPrimitive :: QName -> TCM (Maybe ArgsCheck)
isConstrainedPrimitive QName
def = TCMT IO Definition -> TCMT IO Definition
forall (m :: * -> *) a. MonadTCEnv m => m a -> m a
ignoreAbstractMode (QName -> TCMT IO Definition
forall (m :: * -> *).
(HasConstInfo m, HasCallStack) =>
QName -> m Definition
getConstInfo QName
def) TCMT IO Definition -> (Definition -> Defn) -> TCMT IO Defn
forall (f :: * -> *) a b. Functor f => f a -> (a -> b) -> f b
<&> Definition -> Defn
theDef TCMT IO Defn
-> (Defn -> TCM (Maybe ArgsCheck)) -> TCM (Maybe ArgsCheck)
forall a b. TCMT IO a -> (a -> TCMT IO b) -> TCMT IO b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
Primitive{primName :: Defn -> PrimitiveId
primName = PrimitiveId
id}
| Just QName -> ArgsCheck
chk <- PrimitiveId
-> Map PrimitiveId (QName -> ArgsCheck)
-> Maybe (QName -> ArgsCheck)
forall k a. Ord k => k -> Map k a -> Maybe a
Map.lookup PrimitiveId
id Map PrimitiveId (QName -> ArgsCheck)
cubicalPrimChecks -> Maybe ArgsCheck -> TCM (Maybe ArgsCheck)
forall a. a -> TCMT IO a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Maybe ArgsCheck -> TCM (Maybe ArgsCheck))
-> Maybe ArgsCheck -> TCM (Maybe ArgsCheck)
forall a b. (a -> b) -> a -> b
$ ArgsCheck -> Maybe ArgsCheck
forall a. a -> Maybe a
Just (QName -> ArgsCheck
chk QName
def)
Defn
_ -> Maybe ArgsCheck -> TCM (Maybe ArgsCheck)
forall a. a -> TCMT IO a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Maybe ArgsCheck
forall a. Maybe a
Nothing
pathAbs :: PathView -> Abs Term -> TCM Term
pathAbs :: PathView -> Abs Term -> TCM Term
pathAbs (OType Type
_) Abs Term
t = TCM Term
forall a. HasCallStack => a
__IMPOSSIBLE__
pathAbs (PathType Sort
s QName
path Arg Term
l Arg Term
a Arg Term
x Arg Term
y) Abs Term
t = do
Term -> TCM Term
forall a. a -> TCMT IO a
forall (m :: * -> *) a. Monad m => a -> m a
return (Term -> TCM Term) -> Term -> TCM Term
forall a b. (a -> b) -> a -> b
$ ArgInfo -> Abs Term -> Term
Lam ArgInfo
defaultArgInfo Abs Term
t
checkPrimComp :: QName -> ArgsCheck
checkPrimComp :: QName -> ArgsCheck
checkPrimComp QName
c ArgRanges
rs Elims
vs Type
_ = case Elims
vs of
Arg Term
l :@ Arg Term
a :@ Arg Term
phi :@ Arg Term
u :@ Arg Term
a0 :@ Elims
rest -> do
iz <- ArgInfo -> Term -> Arg Term
forall e. ArgInfo -> e -> Arg e
Arg ArgInfo
defaultArgInfo (Term -> Arg Term) -> TCM Term -> TCMT IO (Arg Term)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> IntervalView -> TCM Term
forall (m :: * -> *). HasBuiltins m => IntervalView -> m Term
intervalUnview IntervalView
IZero
let lz = Arg Term -> Term
forall e. Arg e -> e
unArg Arg Term
l Term -> Args -> Term
forall t. Apply t => t -> Args -> t
`apply` [Arg Term
iz]
az = Arg Term -> Term
forall e. Arg e -> e
unArg Arg Term
a Term -> Args -> Term
forall t. Apply t => t -> Args -> t
`apply` [Arg Term
iz]
ty <- el's (pure (unArg l `apply` [iz])) $ primPartial
<#> pure (unArg l `apply` [iz])
<@> pure (unArg phi)
<@> pure (unArg a `apply` [iz])
bAz <- el' (pure $ lz) (pure $ az)
a0 <- blockArg bAz (rs !!! 4) a0 $ equalTerm ty
(Lam defaultArgInfo $ NoAbs "_" $ unArg a0)
(apply (unArg u) [iz])
return $ l :@ a :@ phi :@ u :@ a0 :@ rest
Elims
_ -> TypeError -> TCM Elims
forall (m :: * -> *) e a.
(HasCallStack, MonadTCError m, Diagnostic e) =>
e -> m a
typeError (TypeError -> TCM Elims) -> TypeError -> TCM Elims
forall a b. (a -> b) -> a -> b
$ QName -> TypeError
CubicalPrimitiveNotFullyApplied QName
c
checkPrimHComp :: QName -> ArgsCheck
checkPrimHComp :: QName -> ArgsCheck
checkPrimHComp QName
c ArgRanges
rs Elims
vs Type
_ = case Elims
vs of
Arg Term
l :@ Arg Term
a :@ Arg Term
phi :@ Arg Term
u :@ Arg Term
a0 :@ Elims
rest -> do
iz <- ArgInfo -> Term -> Arg Term
forall e. ArgInfo -> e -> Arg e
Arg ArgInfo
defaultArgInfo (Term -> Arg Term) -> TCM Term -> TCMT IO (Arg Term)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> IntervalView -> TCM Term
forall (m :: * -> *). HasBuiltins m => IntervalView -> m Term
intervalUnview IntervalView
IZero
ty <- el's (pure (unArg l)) $ primPartial
<#> pure (unArg l)
<@> pure (unArg phi)
<@> pure (unArg a)
bA <- el' (pure $ unArg l) (pure $ unArg a)
a0 <- blockArg bA (rs !!! 4) a0 $ equalTerm ty
(Lam defaultArgInfo $ NoAbs "_" $ unArg a0)
(apply (unArg u) [iz])
return $ l :@ a :@ phi :@ u :@ a0 :@ rest
Elims
_ -> TypeError -> TCM Elims
forall (m :: * -> *) e a.
(HasCallStack, MonadTCError m, Diagnostic e) =>
e -> m a
typeError (TypeError -> TCM Elims) -> TypeError -> TCM Elims
forall a b. (a -> b) -> a -> b
$ QName -> TypeError
CubicalPrimitiveNotFullyApplied QName
c
checkPrimTrans :: QName -> ArgsCheck
checkPrimTrans :: QName -> ArgsCheck
checkPrimTrans QName
c ArgRanges
rs Elims
vs Type
_ = case Elims
vs of
Arg Term
l :@ Arg Term
a :@ Arg Term
phi :@ Elims
rest -> do
iz <- ArgInfo -> Term -> Arg Term
forall e. ArgInfo -> e -> Arg e
Arg ArgInfo
defaultArgInfo (Term -> Arg Term) -> TCM Term -> TCMT IO (Arg Term)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> IntervalView -> TCM Term
forall (m :: * -> *). HasBuiltins m => IntervalView -> m Term
intervalUnview IntervalView
IZero
ty <- runNamesT [] $ do
l <- open $ unArg l
nPi' "i" primIntervalType $ \ NamesT (TCMT IO) Term
i -> (Sort -> Type
sort (Sort -> Type) -> (Term -> Sort) -> Term -> Type
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Term -> Sort
tmSort (Term -> Type) -> NamesT (TCMT IO) Term -> NamesT (TCMT IO) Type
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (NamesT (TCMT IO) Term
l NamesT (TCMT IO) Term
-> NamesT (TCMT IO) Term -> NamesT (TCMT IO) Term
forall (m :: * -> *). Applicative m => m Term -> m Term -> m Term
<@> NamesT (TCMT IO) Term
i))
a <- blockArg ty (rs !!! 1) a $ equalTermOnFace (unArg phi) ty
(unArg a)
(Lam defaultArgInfo $ NoAbs "_" $ apply (unArg a) [iz])
return $ l :@ a :@ phi :@ rest
Elims
_ -> TypeError -> TCM Elims
forall (m :: * -> *) e a.
(HasCallStack, MonadTCError m, Diagnostic e) =>
e -> m a
typeError (TypeError -> TCM Elims) -> TypeError -> TCM Elims
forall a b. (a -> b) -> a -> b
$ QName -> TypeError
CubicalPrimitiveNotFullyApplied QName
c
blockArg :: HasRange r => Type -> r -> Arg Term -> TCM () -> TCM (Arg Term)
blockArg :: forall r.
HasRange r =>
Type -> r -> Arg Term -> TCM () -> TCMT IO (Arg Term)
blockArg Type
t r
r Arg Term
a TCM ()
m =
Range -> TCMT IO (Arg Term) -> TCMT IO (Arg Term)
forall (m :: * -> *) x a.
(MonadTrace m, HasRange x) =>
x -> m a -> m a
setCurrentRange (r -> Range
forall a. HasRange a => a -> Range
getRange (r -> Range) -> r -> Range
forall a b. (a -> b) -> a -> b
$ r
r) (TCMT IO (Arg Term) -> TCMT IO (Arg Term))
-> TCMT IO (Arg Term) -> TCMT IO (Arg Term)
forall a b. (a -> b) -> a -> b
$ (Term -> Arg Term) -> TCM Term -> TCMT IO (Arg Term)
forall a b. (a -> b) -> TCMT IO a -> TCMT IO b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (Arg Term
a Arg Term -> Term -> Arg Term
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$>) (TCM Term -> TCMT IO (Arg Term)) -> TCM Term -> TCMT IO (Arg Term)
forall a b. (a -> b) -> a -> b
$ Type -> TCM Term -> TCM Term
blockTerm Type
t (TCM Term -> TCM Term) -> TCM Term -> TCM Term
forall a b. (a -> b) -> a -> b
$ TCM ()
m TCM () -> TCM Term -> TCM Term
forall a b. TCMT IO a -> TCMT IO b -> TCMT IO b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Term -> TCM Term
forall a. a -> TCMT IO a
forall (m :: * -> *) a. Monad m => a -> m a
return (Arg Term -> Term
forall e. Arg e -> e
unArg Arg Term
a)
checkPrimPOr :: QName -> ArgsCheck
checkPrimPOr :: QName -> ArgsCheck
checkPrimPOr QName
c ArgRanges
rs Elims
vs Type
_ = case Elims
vs of
Arg Term
l :@ Arg Term
phi1 :@ Arg Term
phi2 :@ Arg Term
a :@ Arg Term
u :@ Arg Term
v :@ Elims
rest -> do
phi <- IntervalView -> TCM Term
forall (m :: * -> *). HasBuiltins m => IntervalView -> m Term
intervalUnview (Arg Term -> Arg Term -> IntervalView
IMin Arg Term
phi1 Arg Term
phi2)
reportSDoc "tc.term.por" 10 $ text (show phi)
t1 <- runNamesT [] $ do
l <- open . unArg $ l
a <- open . unArg $ a
psi <- open =<< intervalUnview (IMax phi1 phi2)
pPi' "o" psi $ \ NamesT (TCMT IO) Term
o -> NamesT (TCMT IO) Term
-> NamesT (TCMT IO) Term -> NamesT (TCMT IO) Type
forall (m :: * -> *). Applicative m => m Term -> m Term -> m Type
el' NamesT (TCMT IO) Term
l (NamesT (TCMT IO) Term
a NamesT (TCMT IO) Term
-> NamesT (TCMT IO) Term -> NamesT (TCMT IO) Term
forall (m :: * -> *). Applicative m => m Term -> m Term -> m Term
<@> NamesT (TCMT IO) Term
o)
tv <- runNamesT [] $ do
l <- open . unArg $ l
a <- open . unArg $ a
phi1 <- open . unArg $ phi1
phi2 <- open . unArg $ phi2
pPi' "o" phi2 $ \ NamesT (TCMT IO) Term
o -> NamesT (TCMT IO) Term
-> NamesT (TCMT IO) Term -> NamesT (TCMT IO) Type
forall (m :: * -> *). Applicative m => m Term -> m Term -> m Type
el' NamesT (TCMT IO) Term
l (NamesT (TCMT IO) Term
a NamesT (TCMT IO) Term
-> NamesT (TCMT IO) Term -> NamesT (TCMT IO) Term
forall (m :: * -> *). Applicative m => m Term -> m Term -> m Term
<@> (TCM Term -> NamesT (TCMT IO) Term
forall (m :: * -> *) a. Monad m => m a -> NamesT m a
cl TCM Term
forall (m :: * -> *).
(HasBuiltins m, MonadError TCErr m, MonadTCEnv m, ReadTCState m) =>
m Term
primIsOne2 NamesT (TCMT IO) Term
-> NamesT (TCMT IO) Term -> NamesT (TCMT IO) Term
forall (m :: * -> *). Applicative m => m Term -> m Term -> m Term
<@> NamesT (TCMT IO) Term
phi1 NamesT (TCMT IO) Term
-> NamesT (TCMT IO) Term -> NamesT (TCMT IO) Term
forall (m :: * -> *). Applicative m => m Term -> m Term -> m Term
<@> NamesT (TCMT IO) Term
phi2 NamesT (TCMT IO) Term
-> NamesT (TCMT IO) Term -> NamesT (TCMT IO) Term
forall (m :: * -> *). Applicative m => m Term -> m Term -> m Term
<@> NamesT (TCMT IO) Term
o))
v <- blockArg tv (rs !!! 5) v $ do
equalTermOnFace phi t1 (unArg u) (unArg v)
return $ l :@ phi1 :@ phi2 :@ a :@ u :@ v :@ rest
Elims
_ -> TypeError -> TCM Elims
forall (m :: * -> *) e a.
(HasCallStack, MonadTCError m, Diagnostic e) =>
e -> m a
typeError (TypeError -> TCM Elims) -> TypeError -> TCM Elims
forall a b. (a -> b) -> a -> b
$ QName -> TypeError
CubicalPrimitiveNotFullyApplied QName
c
checkPrimGlue :: QName -> ArgsCheck
checkPrimGlue :: QName -> ArgsCheck
checkPrimGlue QName
c ArgRanges
rs Elims
vs Type
_ = case Elims
vs of
Arg Term
la :@ Arg Term
lb :@ Arg Term
bA :@ Arg Term
phi :@ Arg Term
bT :@ Arg Term
e :@ Arg Term
t :@ Arg Term
a :@ Elims
rest -> do
v <- Names -> NamesT (TCMT IO) Term -> TCM Term
forall (m :: * -> *) a. Names -> NamesT m a -> m a
runNamesT [] do
lb <- Term -> NamesT (TCMT IO) (NamesT (TCMT IO) Term)
forall (m :: * -> *) a.
(Monad m, Subst a) =>
a -> NamesT m (NamesT m a)
open (Term -> NamesT (TCMT IO) (NamesT (TCMT IO) Term))
-> (Arg Term -> Term)
-> Arg Term
-> NamesT (TCMT IO) (NamesT (TCMT IO) Term)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Arg Term -> Term
forall e. Arg e -> e
unArg (Arg Term -> NamesT (TCMT IO) (NamesT (TCMT IO) Term))
-> Arg Term -> NamesT (TCMT IO) (NamesT (TCMT IO) Term)
forall a b. (a -> b) -> a -> b
$ Arg Term
lb
la <- open . unArg $ la
bA <- open . unArg $ bA
phi <- open . unArg $ phi
bT <- open . unArg $ bT
e <- open . unArg $ e
t <- open . unArg $ t
let f NamesT (TCMT IO) Term
o = TCM Term -> NamesT (TCMT IO) Term
forall (m :: * -> *) a. Monad m => m a -> NamesT m a
cl TCM Term
forall (m :: * -> *).
(HasBuiltins m, MonadError TCErr m, MonadTCEnv m, ReadTCState m) =>
m Term
primEquivFun NamesT (TCMT IO) Term
-> NamesT (TCMT IO) Term -> NamesT (TCMT IO) Term
forall (m :: * -> *). Applicative m => m Term -> m Term -> m Term
<#> NamesT (TCMT IO) Term
lb NamesT (TCMT IO) Term
-> NamesT (TCMT IO) Term -> NamesT (TCMT IO) Term
forall (m :: * -> *). Applicative m => m Term -> m Term -> m Term
<#> NamesT (TCMT IO) Term
la NamesT (TCMT IO) Term
-> NamesT (TCMT IO) Term -> NamesT (TCMT IO) Term
forall (m :: * -> *). Applicative m => m Term -> m Term -> m Term
<#> (NamesT (TCMT IO) Term
bT NamesT (TCMT IO) Term
-> NamesT (TCMT IO) Term -> NamesT (TCMT IO) Term
forall (m :: * -> *). Applicative m => m Term -> m Term -> m Term
<@> NamesT (TCMT IO) Term
o) NamesT (TCMT IO) Term
-> NamesT (TCMT IO) Term -> NamesT (TCMT IO) Term
forall (m :: * -> *). Applicative m => m Term -> m Term -> m Term
<#> NamesT (TCMT IO) Term
bA NamesT (TCMT IO) Term
-> NamesT (TCMT IO) Term -> NamesT (TCMT IO) Term
forall (m :: * -> *). Applicative m => m Term -> m Term -> m Term
<@> (NamesT (TCMT IO) Term
e NamesT (TCMT IO) Term
-> NamesT (TCMT IO) Term -> NamesT (TCMT IO) Term
forall (m :: * -> *). Applicative m => m Term -> m Term -> m Term
<@> NamesT (TCMT IO) Term
o)
glam defaultArgInfo "o" $ \ NamesT (TCMT IO) Term
o -> NamesT (TCMT IO) Term -> NamesT (TCMT IO) Term
f NamesT (TCMT IO) Term
o NamesT (TCMT IO) Term
-> NamesT (TCMT IO) Term -> NamesT (TCMT IO) Term
forall (m :: * -> *). Applicative m => m Term -> m Term -> m Term
<@> (NamesT (TCMT IO) Term
t NamesT (TCMT IO) Term
-> NamesT (TCMT IO) Term -> NamesT (TCMT IO) Term
forall (m :: * -> *). Applicative m => m Term -> m Term -> m Term
<@> NamesT (TCMT IO) Term
o)
ty <- runNamesT [] do
lb <- open . unArg $ lb
phi <- open . unArg $ phi
bA <- open . unArg $ bA
el's lb $ cl primPartialP <#> lb <@> phi <@> glam defaultArgInfo "o" (\ NamesT (TCMT IO) Term
_ -> NamesT (TCMT IO) Term
bA)
let a' = ArgInfo -> Abs Term -> Term
Lam ArgInfo
defaultArgInfo (ArgName -> Term -> Abs Term
forall a. ArgName -> a -> Abs a
NoAbs ArgName
"o" (Term -> Abs Term) -> Term -> Abs Term
forall a b. (a -> b) -> a -> b
$ Arg Term -> Term
forall e. Arg e -> e
unArg Arg Term
a)
ta <- el' (pure $ unArg la) (pure $ unArg bA)
a <- blockArg ta (rs !!! 7) a $ equalTerm ty a' v
return $ la :@ lb :@ bA :@ phi :@ bT :@ e :@ t :@ a :@ rest
Elims
_ -> TypeError -> TCM Elims
forall (m :: * -> *) e a.
(HasCallStack, MonadTCError m, Diagnostic e) =>
e -> m a
typeError (TypeError -> TCM Elims) -> TypeError -> TCM Elims
forall a b. (a -> b) -> a -> b
$ QName -> TypeError
CubicalPrimitiveNotFullyApplied QName
c
checkPrimGlueU :: QName -> ArgsCheck
checkPrimGlueU :: QName -> ArgsCheck
checkPrimGlueU QName
c ArgRanges
rs Elims
vs Type
_ = case Elims
vs of
Arg Term
la :@ Arg Term
phi :@ Arg Term
bT :@ Arg Term
bA :@ Arg Term
t :@ Arg Term
a :@ Elims
rest -> do
v <- Names -> NamesT (TCMT IO) Term -> TCM Term
forall (m :: * -> *) a. Names -> NamesT m a -> m a
runNamesT [] (NamesT (TCMT IO) Term -> TCM Term)
-> NamesT (TCMT IO) Term -> TCM Term
forall a b. (a -> b) -> a -> b
$ do
la <- Term -> NamesT (TCMT IO) (NamesT (TCMT IO) Term)
forall (m :: * -> *) a.
(Monad m, Subst a) =>
a -> NamesT m (NamesT m a)
open (Term -> NamesT (TCMT IO) (NamesT (TCMT IO) Term))
-> (Arg Term -> Term)
-> Arg Term
-> NamesT (TCMT IO) (NamesT (TCMT IO) Term)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Arg Term -> Term
forall e. Arg e -> e
unArg (Arg Term -> NamesT (TCMT IO) (NamesT (TCMT IO) Term))
-> Arg Term -> NamesT (TCMT IO) (NamesT (TCMT IO) Term)
forall a b. (a -> b) -> a -> b
$ Arg Term
la
phi <- open . unArg $ phi
bT <- open . unArg $ bT
bA <- open . unArg $ bA
t <- open . unArg $ t
let f NamesT (TCMT IO) Term
o = TCM Term -> NamesT (TCMT IO) Term
forall (m :: * -> *) a. Monad m => m a -> NamesT m a
cl TCM Term
forall (m :: * -> *).
(HasBuiltins m, MonadError TCErr m, MonadTCEnv m, ReadTCState m) =>
m Term
primTrans NamesT (TCMT IO) Term
-> NamesT (TCMT IO) Term -> NamesT (TCMT IO) Term
forall (m :: * -> *). Applicative m => m Term -> m Term -> m Term
<#> ArgName
-> (NamesT (TCMT IO) Term -> NamesT (TCMT IO) Term)
-> NamesT (TCMT IO) Term
forall (m :: * -> *).
Monad m =>
ArgName -> (NamesT m Term -> NamesT m Term) -> NamesT m Term
lam ArgName
"i" (NamesT (TCMT IO) Term
-> NamesT (TCMT IO) Term -> NamesT (TCMT IO) Term
forall a b. a -> b -> a
const NamesT (TCMT IO) Term
la) NamesT (TCMT IO) Term
-> NamesT (TCMT IO) Term -> NamesT (TCMT IO) Term
forall (m :: * -> *). Applicative m => m Term -> m Term -> m Term
<@> ArgName
-> (NamesT (TCMT IO) Term -> NamesT (TCMT IO) Term)
-> NamesT (TCMT IO) Term
forall (m :: * -> *).
Monad m =>
ArgName -> (NamesT m Term -> NamesT m Term) -> NamesT m Term
lam ArgName
"i" (\ NamesT (TCMT IO) Term
i -> NamesT (TCMT IO) Term
bT NamesT (TCMT IO) Term
-> NamesT (TCMT IO) Term -> NamesT (TCMT IO) Term
forall (m :: * -> *). Applicative m => m Term -> m Term -> m Term
<@> (TCM Term -> NamesT (TCMT IO) Term
forall (m :: * -> *) a. Monad m => m a -> NamesT m a
cl TCM Term
forall (m :: * -> *).
(HasBuiltins m, MonadError TCErr m, MonadTCEnv m, ReadTCState m) =>
m Term
primINeg NamesT (TCMT IO) Term
-> NamesT (TCMT IO) Term -> NamesT (TCMT IO) Term
forall (m :: * -> *). Applicative m => m Term -> m Term -> m Term
<@> NamesT (TCMT IO) Term
i) NamesT (TCMT IO) Term
-> NamesT (TCMT IO) Term -> NamesT (TCMT IO) Term
forall (m :: * -> *). Applicative m => m Term -> m Term -> m Term
<@> NamesT (TCMT IO) Term
o) NamesT (TCMT IO) Term
-> NamesT (TCMT IO) Term -> NamesT (TCMT IO) Term
forall (m :: * -> *). Applicative m => m Term -> m Term -> m Term
<@> TCM Term -> NamesT (TCMT IO) Term
forall (m :: * -> *) a. Monad m => m a -> NamesT m a
cl TCM Term
forall (m :: * -> *).
(HasBuiltins m, MonadError TCErr m, MonadTCEnv m, ReadTCState m) =>
m Term
primIZero
glam defaultArgInfo "o" $ \ NamesT (TCMT IO) Term
o -> NamesT (TCMT IO) Term -> NamesT (TCMT IO) Term
f NamesT (TCMT IO) Term
o NamesT (TCMT IO) Term
-> NamesT (TCMT IO) Term -> NamesT (TCMT IO) Term
forall (m :: * -> *). Applicative m => m Term -> m Term -> m Term
<@> (NamesT (TCMT IO) Term
t NamesT (TCMT IO) Term
-> NamesT (TCMT IO) Term -> NamesT (TCMT IO) Term
forall (m :: * -> *). Applicative m => m Term -> m Term -> m Term
<@> NamesT (TCMT IO) Term
o)
ty <- runNamesT [] $ do
la <- open . unArg $ la
phi <- open . unArg $ phi
bT <- open . unArg $ bT
pPi' "o" phi $ \ NamesT (TCMT IO) Term
o -> NamesT (TCMT IO) Term
-> NamesT (TCMT IO) Term -> NamesT (TCMT IO) Type
forall (m :: * -> *). Applicative m => m Term -> m Term -> m Type
el' NamesT (TCMT IO) Term
la (NamesT (TCMT IO) Term
bT NamesT (TCMT IO) Term
-> NamesT (TCMT IO) Term -> NamesT (TCMT IO) Term
forall (m :: * -> *). Applicative m => m Term -> m Term -> m Term
<@> TCM Term -> NamesT (TCMT IO) Term
forall (m :: * -> *) a. Monad m => m a -> NamesT m a
cl TCM Term
forall (m :: * -> *).
(HasBuiltins m, MonadError TCErr m, MonadTCEnv m, ReadTCState m) =>
m Term
primIZero NamesT (TCMT IO) Term
-> NamesT (TCMT IO) Term -> NamesT (TCMT IO) Term
forall (m :: * -> *). Applicative m => m Term -> m Term -> m Term
<@> NamesT (TCMT IO) Term
o)
let a' = ArgInfo -> Abs Term -> Term
Lam ArgInfo
defaultArgInfo (ArgName -> Term -> Abs Term
forall a. ArgName -> a -> Abs a
NoAbs ArgName
"o" (Term -> Abs Term) -> Term -> Abs Term
forall a b. (a -> b) -> a -> b
$ Arg Term -> Term
forall e. Arg e -> e
unArg Arg Term
a)
ta <- runNamesT [] $ do
la <- open . unArg $ la
phi <- open . unArg $ phi
bT <- open . unArg $ bT
bA <- open . unArg $ bA
el' la (cl primSubOut <#> (cl primLevelSuc <@> la) <#> (Sort . tmSort <$> la) <#> phi <#> (bT <@> cl primIZero) <@> bA)
a <- blockArg ta (rs !!! 5) a $ equalTerm ty a' v
return $ la :@ phi :@ bT :@ bA :@ t :@ a :@ rest
Elims
_ -> TypeError -> TCM Elims
forall (m :: * -> *) e a.
(HasCallStack, MonadTCError m, Diagnostic e) =>
e -> m a
typeError (TypeError -> TCM Elims) -> TypeError -> TCM Elims
forall a b. (a -> b) -> a -> b
$ QName -> TypeError
CubicalPrimitiveNotFullyApplied QName
c