2
3
module Agda.TypeChecking.Monad.Builtin where
5
import Control.Applicative
4
6
import Control.Monad.Error
5
7
import Control.Monad.State
8
10
import qualified Data.Map as Map
12
import Agda.Syntax.Common
10
13
import Agda.Syntax.Position
11
14
import Agda.Syntax.Literal
12
15
import Agda.Syntax.Internal
13
16
import Agda.TypeChecking.Monad.Base
17
import Agda.TypeChecking.Substitute
15
19
import Agda.Utils.Monad (when_)
20
import Agda.Utils.Maybe
21
import Agda.Utils.Tuple
23
#include "../../undefined.h"
24
import Agda.Utils.Impossible
26
class (Functor m, Applicative m, Monad m) => HasBuiltins m where
27
getBuiltinThing :: String -> m (Maybe (Builtin PrimFun))
17
29
litType :: Literal -> TCM Type
18
30
litType l = case l of
28
40
el t = El (mkType 0) t
30
getBuiltinThing :: String -> TCM (Maybe (Builtin PrimFun))
31
getBuiltinThing b = liftM2 mplus (Map.lookup b <$> gets stLocalBuiltins)
32
(Map.lookup b <$> gets stImportedBuiltins)
42
instance MonadIO m => HasBuiltins (TCMT m) where
43
getBuiltinThing b = liftM2 mplus (Map.lookup b <$> gets stLocalBuiltins)
44
(Map.lookup b <$> gets stImportedBuiltins)
34
46
setBuiltinThings :: BuiltinThings PrimFun -> TCM ()
35
47
setBuiltinThings b = modify $ \s -> s { stLocalBuiltins = b }
50
62
builtin <- gets stLocalBuiltins
51
63
setBuiltinThings $ Map.insert b (Prim pf) builtin
54
65
getBuiltin :: String -> TCM Term
58
Nothing -> typeError $ NoBindingForBuiltin x
67
fromMaybeM (typeError $ NoBindingForBuiltin x) $ getBuiltin' x
61
getBuiltin' :: String -> TCM (Maybe Term)
69
getBuiltin' :: HasBuiltins m => String -> m (Maybe Term)
63
71
builtin <- getBuiltinThing x
65
73
Just (Builtin t) -> return $ Just (killRange t)
66
74
_ -> return Nothing
76
getPrimitive' :: HasBuiltins m => String -> m (Maybe PrimFun)
77
getPrimitive' x = (getPrim =<<) <$> getBuiltinThing x
79
getPrim (Prim pf) = return pf
68
82
getPrimitive :: String -> TCM PrimFun
70
builtin <- getBuiltinThing x
72
Just (Prim pf) -> return pf
73
_ -> typeError $ NoSuchPrimitiveFunction x
84
fromMaybeM (typeError $ NoSuchPrimitiveFunction x) $ getPrimitive' x
86
-- | Rewrite a literal to constructor form if possible.
87
constructorForm :: Term -> TCM Term
88
constructorForm v = constructorForm' primZero primSuc v
90
constructorForm' :: Applicative m => m Term -> m Term -> Term -> m Term
91
constructorForm' pZero pSuc v = case ignoreSharing v of
92
{- 2012-04-02 changed semantics of DontCare
93
-- Andreas, 2011-10-03, the following line restores IrrelevantLevel
94
DontCare v -> constructorForm v
96
Lit (LitInt r n) -> cons (Lit . LitInt r) n
97
-- Level (Max []) -> primLevelZero
98
-- Level (Max [ClosedLevel n]) -> cons primLevelZero primLevelSuc (Level . Max . (:[]) . ClosedLevel) n
103
| n > 0 = (`apply` [defaultArg $ lit $ n - 1]) <$> pSuc
75
106
---------------------------------------------------------------------------
76
107
-- * The names of built-in things
84
115
primInf, primSharp, primFlat,
85
116
primEquality, primRefl,
86
117
primLevel, primLevelZero, primLevelSuc, primLevelMax,
118
primIrrAxiom, primSizeMax,
88
119
-- builtins for reflection:
89
primQName, primArg, primArgArg, primAgdaTerm, primAgdaTermVar,
120
primQName, primArgInfo, primArgArgInfo, primArg, primArgArg, primAgdaTerm, primAgdaTermVar,
90
121
primAgdaTermLam, primAgdaTermDef, primAgdaTermCon, primAgdaTermPi,
91
122
primAgdaTermSort, primAgdaTermUnsupported,
92
123
primAgdaType, primAgdaTypeEl,
146
177
primRelevance = getBuiltin builtinRelevance
147
178
primRelevant = getBuiltin builtinRelevant
148
179
primIrrelevant = getBuiltin builtinIrrelevant
180
primArgInfo = getBuiltin builtinArgInfo
181
primArgArgInfo = getBuiltin builtinArgArgInfo
149
182
primAgdaSortSet = getBuiltin builtinAgdaSortSet
150
183
primAgdaSortLit = getBuiltin builtinAgdaSortLit
151
184
primAgdaSortUnsupported = getBuiltin builtinAgdaSortUnsupported
218
251
builtinRelevant = "RELEVANT"
219
252
builtinIrrelevant = "IRRELEVANT"
220
253
builtinArg = "ARG"
254
builtinArgInfo = "ARGINFO"
255
builtinArgArgInfo = "ARGARGINFO"
221
256
builtinArgArg = "ARGARG"
222
257
builtinAgdaTerm = "AGDATERM"
223
258
builtinAgdaTermVar = "AGDATERMVAR"
259
294
, nameOfFlat = flat
261
296
`catchError` \_ -> return Nothing
298
------------------------------------------------------------------------
299
-- * Builtin equality
300
------------------------------------------------------------------------
302
-- | Get the name of the equality type.
303
primEqualityName :: TCM QName
304
primEqualityName = do
306
-- Andreas, 2014-05-17 moved this here from TC.Rules.Def
307
-- Don't know why up to 2 hidden lambdas need to be stripped,
308
-- but I left the code in place.
309
-- Maybe it was intended that equality could be declared
310
-- in three different ways:
311
-- 1. universe and type polymorphic
312
-- 2. type polymorphic only
314
let lamV (Lam i b) = mapFst (getHiding i :) $ lamV (unAbs b)
315
lamV (Shared p) = lamV (derefPtr p)
317
return $ case lamV eq of
318
([Hidden, Hidden], Def equality _) -> equality
319
([Hidden], Def equality _) -> equality
320
([], Def equality _) -> equality