From 202be9fc1f9763a934d8d232bbc2cbd43794b796 Mon Sep 17 00:00:00 2001 From: Stephanie Weirich Date: Mon, 26 Jun 2023 11:18:17 -0400 Subject: [PATCH] separate inferType and checkType --- doc/oplss.mng | 87 ++--- doc/oplss.pdf | Bin 862143 -> 793150 bytes full/pi-forall.cabal | 2 +- full/src/Environment.hs | 58 ++-- full/src/Equal.hs | 8 +- full/src/Modules.hs | 2 +- full/src/Parser.hs | 182 +++++----- full/src/PrettyPrint.hs | 27 +- full/src/Syntax.hs | 199 ++++++----- full/src/TypeCheck.hs | 653 +++++++++++++++++------------------ main/pi-forall.cabal | 2 +- main/src/Environment.hs | 31 +- main/src/Parser.hs | 22 +- main/src/PrettyPrint.hs | 18 +- main/src/Syntax.hs | 65 ++-- main/src/TypeCheck.hs | 667 ++++++++++++++++++------------------ version1/pi-forall.cabal | 2 +- version1/pi/Lec1.pi | 7 +- version1/src/Environment.hs | 41 +-- version1/src/Equal.hs | 8 +- version1/src/Parser.hs | 16 +- version1/src/PrettyPrint.hs | 21 +- version1/src/Syntax.hs | 111 +++--- version1/src/TypeCheck.hs | 247 ++++++------- version2/pi-forall.cabal | 2 +- version2/src/Environment.hs | 41 +-- version2/src/Equal.hs | 8 +- version2/src/Parser.hs | 100 +++--- version2/src/PrettyPrint.hs | 21 +- version2/src/Syntax.hs | 115 ++++--- version2/src/TypeCheck.hs | 426 ++++++++++++----------- version3/pi-forall.cabal | 2 +- version3/src/Environment.hs | 47 +-- version3/src/Equal.hs | 8 +- version3/src/Parser.hs | 110 +++--- version3/src/PrettyPrint.hs | 21 +- version3/src/Syntax.hs | 115 ++++--- version3/src/TypeCheck.hs | 442 ++++++++++++------------ 38 files changed, 1964 insertions(+), 1970 deletions(-) diff --git a/doc/oplss.mng b/doc/oplss.mng index 1e356e6..dc1e2f0 100644 --- a/doc/oplss.mng +++ b/doc/oplss.mng @@ -1059,68 +1059,57 @@ that we can print warning messages. {[}Typecheck.hs{]}} Now that we have the type checking monad available, we can start our -implementation. For flexibility \texttt{inferType} and \texttt{checkType} will -\emph{both} be implemented by the same function, called \cd{tcTerm}. +implementation. -\begin{verbatim} -inferType :: Term -> TcMonad Type -inferType t = tcTerm t Nothing - -checkType :: Term -> Type -> TcMonad () -checkType tm ty = void $ tcTerm tm (Just ty) -\end{verbatim} - -The \texttt{tcTerm} function checks a term, producing its type. The -second argument is \texttt{Nothing} in inference mode and an expected -type in checking mode. +The general structure of the \cd{inferType} function starts with a pattern +match for the various syntactic forms. There are also several cases for +practical reasons (annotations, source code positions, etc.) and a few cases +for homework. If the form of the term does not match any of the forms of the +terms that we can synthesize types for, then the type checker produces an +error. \begin{verbatim} -tcTerm :: Term -> Maybe Type -> TcMonad Type -\end{verbatim} +inferType tm = case tm of + (Var x) -> ... -We combine these two functions into a single definition so that we can share -code between checking and inference modes. While none of the expression forms -of the core language can take advantage of this functionality, it is useful -for some extensions to the language. + TyType -> ... -The general structure of the \cd{tcTerm} function starts with a pattern match -for the various syntactic forms in inference mode: + (TyPi tyA bnd) -> ... -\begin{verbatim} -tcTerm (Var x) Nothing = ... - -tcTerm TyType Nothing = ... + (App t1 t2) -> ... -tcTerm (TyPi tyA bnd) Nothing = ... + (Ann tm ty) -> ... -tcTerm (App t1 t2) Nothing = ... + ... + _ -> Env.err [DS "Must have a type for", DD tm] \end{verbatim} +For checking, the general form of the function also + Mixed in here, we also have a pattern for lambda expressions in checking mode: \begin{verbatim} -tcTerm (Lam bnd) (Just (TyPi tyA bnd2)) = ... - -- pass in the Pi type for the lambda expression - -tcTerm (Lam _) (Just nf) = -- checking mode wrong type - err [DS "Lambda expression has a function type, not ", DD nf] +checkType tm ty = case tm of + (Lam bnd) -> case ty of + TyPi tyA bnd2 = ... + -- pass in the Pi type for the lambda expression + _ -> + Env.err [DS "Lambda expression has a function type, not ", DD ty] \end{verbatim} -There are also several cases for practical reasons (annotations, source code -positions, etc.) and a few cases for homework. - -Finally, the last case covers all other forms of checking mode, by -calling inference mode and making sure that the inferred type is equal -to the checked type. This case is the implementation of \rref{c-infer}. +Again there are several cases for practical reasons, plus cases for homework. +Finally, the last case covers all other forms of checking mode, by calling +inference mode and making sure that the inferred type is equal to the checked +type. This case is the implementation of \rref{c-infer}. \begin{verbatim} -tcTerm tm (Just ty) = do - ty' <- inferType tm - unless (Unbound.aeq ty' ty) $ - err [DS "Types don't match", DD ty, DS "and", DD ty'] - return ty + -- c-infer + tm -> do + ty' <- inferType tm + unless (Unbound.aeq ty' ty) $ + Env.err [DS "Types don't match", DD ty, DS "and", DD ty'] -} \end{verbatim} The function \texttt{aeq} ensures that the two types are alpha-equivalent. If @@ -1419,12 +1408,12 @@ whnf :: Term -> TcMonad Term In \texttt{version2} of the \href{version2/src/TypeCheck.hs}{implementation}, these functions are called in a few places: \begin{itemize} -\item \texttt{equate} is called at the -end of \texttt{tcTerm} +\item \texttt{equate} is called at the end of \texttt{checkType} to make sure +that the annotate type matches the inferred type. \item \texttt{ensurePi} is called in the \texttt{App} case -of \texttt{tcTerm} -\item \texttt{whnf} is called in \texttt{checkType}, before the call to - \texttt{tcTerm}, to make sure that we are using the head form in checking +of \texttt{inferType} +\item \texttt{whnf} is called in \texttt{checkType} + to make sure that we are using the head form of the type in checking mode. \end{itemize} @@ -1533,8 +1522,6 @@ For example, we can only type check the example below using the first (checking) \[ [[ |- \y. if y then (\x.x) else (\x. not x) <= Bool -> Bool -> Bool]] \] and we can only type check this next example using the second (inference) rule: \[ [[ x:Bool,y:Bool->Bool |- (if x then y else not) true => Bool ]] \] -Fortunately, it is not difficult to implement our type checking function so that it implements both rules. Indeed, because \cd{tcTerm} combines both judgments into a single Haskell function in the implementation, it is possible to implement both -rules with the same code. However, note that we can strengthen the specification of the type checking rule for \cd{if} by making the result type \texttt{A} depend on whether the diff --git a/doc/oplss.pdf b/doc/oplss.pdf index 9e61acae9b39a763f7612b8e8fc75fc53600f739..00e7349f72cba54fa0e753978d2e91113a0a74bc 100644 GIT binary patch delta 139989 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 +Y&b`@J4~xFmf@a|jpx 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%0D>=u~Pzft=#=k(sJdW z&a~{V$S+A3f!2kSsBM+SHVjcjD6Q#?f!p%w-*fFQJrdC!>rAKxppIQUXvb>*ntL}t z#0&IhUf++ur1-JyxbJCq2oNK9gmW{}E1Xk7j5 zIrPPMXSy6#6dV?SM~Js==Un2A=fuZ0yHi3Rz|}V}Qxifw+zLG4S_j(+pDMHSVSb?c zvB^$&fgcLs0em$BBp-S-+8_Ea@l8)gRIZfHk|DON+DVD^n@<*IiilJE>$=Y9ziv71=xh>h=G zz9Fu~F|sL0V5!DiA3VEQYQ;-7R_M1N5++RFDX$CVuv9!|Q#|3`&AjR)R-8z3-3GDL zhv2g;BmUD8rDa-!45^zg;|lm~9-Xk2k1L*ph();fHG4rmgl7++@ida;|Jp)SQ%76R zh`(QOYR~Tn;LT!2-}^X;VxsHzRwLF-ETDtDCE$Oa()uT_Oywt1PJ4guF=LjB)lMe> z7N89=U^-1f)ejMLehmB04?UqSY7R=M@zatLF^~Cpw>Xd&BQ_m&Tj5)!o*ZwxX14X! zU}-Z?6C3u|TF@vg`Q|J}pQfIxen4?&Xo3G*s`(XO0E_^_%J$zHG6(1XXI#_1blhr3 z{<-NBc|C8oN=MEwRMA6}PSU##0)9Z=WjGr$=V_-PhIa^(AbsJjy~U=jM&-Os#EWXXZ8;x-@^x@s4IFa2>O( z1B>71xLNAo)Y#`rQDqrRm04`N9G`b*z)N#j;4kXBVyVq75EkVe{RH*=M>f+-wWC5i@!wQ|Oc{7I4 z82$WLkv250V6_+y<|`N7hGtcZ+yd53TYpku(IbH*-_DW#?G3Qt9gH(~nWE=CE&R6< zDPiB?oHqshxS!|{z<={f)AqM@XCox}L$p;)T|_sH@77myBTG1~stONmB32k@ib?#r_Uf@lL38(8Y9_#PbgO^j0+$j^P~BvYgraPuc$APxT&mh1p~* zLg>2$C?D-dl(vNMzZG*V^df$3*Y_s(EJj^EV5Y9pm4q-3&5UjcO@lB`#08lk z$w=fMhVp)#x7@-3t|9{>6ve9Ja?>SbB$y%`oJO9_rFx-#@*jyHAcj1dV$w$yzcp-E zne!PZNEBKff34w>{8+JCcpQ{%o8viwAHHv?*Q~QHq6{MO1R9<%c!FbP$;gP+5u>OAMvNp4v!MzqU=*`Y5A*E z3V2as@M(p5Sw+|oAR$4g!Ly?a+Fil=yN`dE$g29g7RyF4fS%fZ#eX}roFGB-y?mba zI_&{NMP5lO*O&3%pGQ(T^0T|F5mgb?i##6zMuhhQFI-T6d_+StK<1@9-E>7^vP0xN znMBZ{ICc5!wD?%&UlQ=}@|Txe8sgDBwIYQ=wa93iK;w9-V!K}k|UwslK!KJ&f- zg4M+_lz6Z9y#uq1Pu%^mpd6K)c@ROpMLoD2`v~1jr1>`$moeM3uvrKAL83ai5F`$j zux?!Atuy;h7QX=4azS#rV;%0DLrcI5LJL4egM8CUMF-Tp0G<Rw^K9p>_ICNM7KL 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℘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 delta 208811 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ͭjUEq1lV9Qm^u{v*P| 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 O1i7#o7$lXXu>TLcP@I7P diff --git a/full/pi-forall.cabal b/full/pi-forall.cabal index e7a8c0c..ee29759 100644 --- a/full/pi-forall.cabal +++ b/full/pi-forall.cabal @@ -21,7 +21,7 @@ common shared-properties default-language: GHC2021 ghc-options: - -Wall -fno-warn-unused-matches -fno-warn-orphans -fno-warn-unused-top-binds -fno-warn-unused-imports -fno-warn-name-shadowing + -Wall -fno-warn-unused-matches -fno-warn-orphans -fno-warn-unused-top-binds -fno-warn-unused-imports -fno-warn-name-shadowing -Wno-unrecognised-pragmas default-extensions: DefaultSignatures DeriveAnyClass diff --git a/full/src/Environment.hs b/full/src/Environment.hs index 69ff773..85a7e92 100644 --- a/full/src/Environment.hs +++ b/full/src/Environment.hs @@ -9,7 +9,6 @@ module Environment lookupTy, lookupTyMaybe, lookupDef, - lookupRecDef, lookupHint , lookupTCon, lookupDCon, @@ -66,15 +65,15 @@ data SourceLocation where -- | Environment manipulation and accessing functions -- The context 'gamma' is a list data Env = Env - { -- | elaborated term and datatype declarations. - ctx :: [Decl], + { -- | elaborated term and datatype declarations + ctx :: [Entry], -- | how long the tail of "global" variables in the context is -- (used to supress printing those in error messages) globals :: Int, - -- | Type declarations (signatures): it's not safe to + -- | Type declarations: it's not safe to -- put these in the context until a corresponding term -- has been checked. - hints :: [Sig], + hints :: [Decl], -- | what part of the file we are in (for errors/warnings) sourceLocation :: [SourceLocation] } @@ -96,35 +95,35 @@ instance Disp Env where debugDisp e = vcat [debugDisp decl | decl <- ctx e] -- | Find a name's user supplied type signature. -lookupHint :: (MonadReader Env m) => TName -> m (Maybe Sig) +lookupHint :: (MonadReader Env m) => TName -> m (Maybe Decl) lookupHint v = do hints <- asks hints - return $ listToMaybe [ sig | sig <- hints, v == sigName sig] + return $ listToMaybe [ sig | sig <- hints, v == declName sig] -- | Find a name's type in the context. lookupTyMaybe :: (MonadReader Env m) => TName -> - m (Maybe Sig) + m (Maybe Decl) lookupTyMaybe v = do ctx <- asks ctx return $ go ctx where go [] = Nothing - go (TypeSig sig : ctx) - | v == sigName sig = Just sig + go (TypeDecl sig : ctx) + | v == declName sig = Just sig | otherwise = go ctx - go (Demote ep : ctx) = demoteSig ep <$> go ctx + go (Demote ep : ctx) = demoteDecl ep <$> go ctx go (_ : ctx) = go ctx -demoteSig :: Epsilon -> Sig -> Sig -demoteSig ep s = s { sigEp = min ep (sigEp s) } +demoteDecl :: Epsilon -> Decl -> Decl +demoteDecl ep s = s { declEp = min ep (declEp s) } -- | Find the type of a name specified in the context -- throwing an error if the name doesn't exist lookupTy :: - TName -> TcMonad Sig + TName -> TcMonad Decl lookupTy v = do x <- lookupTyMaybe v @@ -147,14 +146,6 @@ lookupDef v = do ctx <- asks ctx return $ listToMaybe [a | Def v' a <- ctx, v == v'] -lookupRecDef :: - (MonadReader Env m) => - TName -> - m (Maybe Term) -lookupRecDef v = do - ctx <- asks ctx - return $ listToMaybe [a | RecDef v' a <- ctx, v == v'] - -- | Find a type constructor in the context lookupTCon :: (MonadReader Env m, MonadError Err m) => @@ -177,10 +168,6 @@ lookupTCon v = do if v == v' then return (delta, Just cs) else scanGamma g - scanGamma ((DataSig v' delta) : g) = - if v == v' - then return (delta, Nothing) - else scanGamma g scanGamma (_ : g) = scanGamma g -- | Find a data constructor in the context, returns a list of @@ -200,7 +187,6 @@ lookupDConAll v = do Just c -> do more <- scanGamma g return $ (v', (delta, c)) : more - scanGamma ((DataSig v' delta) : g) = scanGamma g scanGamma (_ : g) = scanGamma g -- | Given the name of a data constructor and the type that it should @@ -231,17 +217,17 @@ lookupDCon c tname = do -- | Extend the context with a new binding -extendCtx :: (MonadReader Env m) => Decl -> m a -> m a +extendCtx :: (MonadReader Env m) => Entry -> m a -> m a extendCtx d = local (\m@Env{ctx = cs} -> m {ctx = d : cs}) -- | Extend the context with a list of bindings -extendCtxs :: (MonadReader Env m) => [Decl] -> m a -> m a +extendCtxs :: (MonadReader Env m) => [Entry] -> m a -> m a extendCtxs ds = local (\m@Env {ctx = cs} -> m {ctx = ds ++ cs}) -- | Extend the context with a list of bindings, marking them as "global" -extendCtxsGlobal :: (MonadReader Env m) => [Decl] -> m a -> m a +extendCtxsGlobal :: (MonadReader Env m) => [Entry] -> m a -> m a extendCtxsGlobal ds = local ( \m@Env {ctx = cs} -> @@ -252,12 +238,12 @@ extendCtxsGlobal ds = ) -- | Extend the context with a telescope -extendCtxTele :: (MonadReader Env m, MonadIO m, MonadError Err m) => [Decl] -> m a -> m a +extendCtxTele :: (MonadReader Env m, MonadIO m, MonadError Err m) => [Entry] -> m a -> m a extendCtxTele [] m = m extendCtxTele (Def x t2 : tele) m = extendCtx (Def x t2) $ extendCtxTele tele m -extendCtxTele (TypeSig sig : tele) m = - extendCtx (TypeSig sig) $ extendCtxTele tele m +extendCtxTele (TypeDecl sig : tele) m = + extendCtx (TypeDecl sig) $ extendCtxTele tele m extendCtxTele ( _ : tele) m = err [DS "Invalid telescope ", DD tele] @@ -273,11 +259,11 @@ extendCtxMods :: (MonadReader Env m) => [Module] -> m a -> m a extendCtxMods mods k = foldr extendCtxMod k mods -- | Get the complete current context -getCtx :: MonadReader Env m => m [Decl] +getCtx :: MonadReader Env m => m [Entry] getCtx = asks ctx -- | Get the prefix of the context that corresponds to local variables. -getLocalCtx :: MonadReader Env m => m [Decl] +getLocalCtx :: MonadReader Env m => m [Entry] getLocalCtx = do g <- asks ctx glen <- asks globals @@ -293,7 +279,7 @@ getSourceLocation :: MonadReader Env m => m [SourceLocation] getSourceLocation = asks sourceLocation -- | Add a type hint -extendHints :: (MonadReader Env m) => Sig -> m a -> m a +extendHints :: (MonadReader Env m) => Decl -> m a -> m a extendHints h = local (\m@Env {hints = hs} -> m {hints = h : hs}) -- | An error that should be reported to the user diff --git a/full/src/Equal.hs b/full/src/Equal.hs index 56ba625..0393f00 100644 --- a/full/src/Equal.hs +++ b/full/src/Equal.hs @@ -177,11 +177,7 @@ whnf (Var x) = do maybeDef <- Env.lookupDef x case maybeDef of (Just d) -> whnf d - _ -> do - maybeRecDef <- Env.lookupRecDef x - case maybeRecDef of - (Just d) -> whnf d - _ -> return (Var x) + _ -> return (Var x) whnf (App t1 t2) = do nf <- whnf t1 @@ -235,7 +231,7 @@ whnf tm = return tm -- | 'Unify' the two terms, producing a list of Defs -- If there is an obvious mismatch, this function produces an error -- If either term is "ambiguous" just ignore. -unify :: [TName] -> Term -> Term -> TcMonad [Decl] +unify :: [TName] -> Term -> Term -> TcMonad [Entry] unify ns tx ty = do txnf <- whnf tx tynf <- whnf ty diff --git a/full/src/Modules.hs b/full/src/Modules.hs index 1888bb2..c4f0fc0 100644 --- a/full/src/Modules.hs +++ b/full/src/Modules.hs @@ -23,7 +23,7 @@ getModules [FilePath] -> String -> m [Module] getModules prefixes top = do toParse <- gatherModules prefixes [ModuleImport top] - flip evalStateT emptyConstructorNames $ mapM reparse toParse + flip evalStateT initialConstructorNames $ mapM reparse toParse data ModuleInfo = ModuleInfo { diff --git a/full/src/Parser.hs b/full/src/Parser.hs index 856b0e3..d987855 100644 --- a/full/src/Parser.hs +++ b/full/src/Parser.hs @@ -3,7 +3,7 @@ -- | A parsec-based parser for the concrete syntax module Parser ( - parseModuleFile, + parseModuleFile, parseModuleImports, parseExpr, expr, @@ -19,7 +19,7 @@ import qualified Unbound.Generics.LocallyNameless as Unbound import Text.Parsec hiding (State,Empty) import Text.Parsec.Expr(Operator(..),Assoc(..),buildExpressionParser) -import qualified LayoutToken as Token +import qualified LayoutToken as Token import Control.Monad.State.Lazy hiding (join) import Control.Monad.Except ( MonadError(throwError) ) @@ -99,13 +99,13 @@ Optional components in this BNF are marked with < > A -> B - Get parsed as (x:A) -> B, with an internal name for x + Get parsed as (_:A) -> B, with a wildcard name for the binder - Nondependent product types, like: A * B - Get parsed as { x:A | B }, with an internal name for x + Get parsed as { _:A | B }, with a wildcard name for the binder - You can collapse lambdas, like: @@ -121,6 +121,12 @@ Optional components in this BNF are marked with < > -} + +-- | Default name (for parsing 'A -> B' as '(_:A) -> B') +wildcardName :: TName +wildcardName = Unbound.string2Name "_" + + liftError :: (MonadError e m) => Either e a -> m a liftError (Left e) = throwError e liftError (Right a) = return a @@ -130,8 +136,8 @@ parseModuleFile :: (MonadError ParseError m, MonadIO m) => ConstructorNames -> S parseModuleFile cnames name = do liftIO $ putStrLn $ "Parsing File " ++ show name contents <- liftIO $ readFile name - liftError $ Unbound.runFreshM $ - flip evalStateT cnames + liftError $ Unbound.runFreshM $ + flip evalStateT cnames (runParserT (do { whiteSpace; v <- moduleDef;eof; return v}) [] name contents) @@ -139,21 +145,23 @@ parseModuleFile cnames name = do parseModuleImports :: (MonadError ParseError m, MonadIO m) => String -> m Module parseModuleImports name = do contents <- liftIO $ readFile name - liftError $ Unbound.runFreshM $ - flip evalStateT emptyConstructorNames $ + liftError $ Unbound.runFreshM $ +{- SOLN DATA -} + flip evalStateT initialConstructorNames $ (runParserT (do { whiteSpace; moduleImports }) [] name contents) -- | Test an 'LParser' on a String. testParser :: ConstructorNames -> LParser t -> String -> Either ParseError t -testParser cn parser str = Unbound.runFreshM $ +testParser cn parser str = Unbound.runFreshM $ +{- SOLN DATA -} flip evalStateT cn $ runParserT (do { whiteSpace; v <- parser; eof; return v}) [] "" str -- | Parse an expression. parseExpr :: String -> Either ParseError Term -parseExpr = testParser emptyConstructorNames expr +parseExpr = testParser initialConstructorNames expr -- * Lexer definitions type LParser a = ParsecT @@ -196,10 +204,10 @@ piforallStyle = Token.LanguageDef ,"axiom" ,"TRUSTME" ,"PRINTME" - ,"ord" - ,"Bool", "True", "False" + ,"ord" + ,"Bool", "True", "False" ,"if","then","else" - ,"Unit", "()" + ,"Unit", "()" ] , Token.reservedOpNames = ["!","?","\\",":",".",",","<", "=", "+", "-", "*", "^", "()", "_","|","{", "}"] @@ -217,14 +225,14 @@ whiteSpace = Token.whiteSpace tokenizer variable :: LParser TName variable = - do i <- identifier + do i <- identifier cnames <- get - if (i `S.member` (tconNames cnames) || + if (i `S.member` (tconNames cnames) || i `S.member` (dconNames cnames)) then fail "Expected a variable, but a constructor was found" else return $ Unbound.string2Name i - + wildcard :: LParser TName wildcard = reservedOp "_" >> return wildcardName @@ -233,14 +241,14 @@ varOrWildcard = try wildcard <|> variable dconstructor :: LParser DataConName dconstructor = - do i <- identifier + do i <- identifier cnames <- get if (i `S.member` dconNames cnames) then return i else if (i `S.member` tconNames cnames) then fail "Expected a data constructor, but a type constructor was found." else fail "Expected a constructor, but a variable was found" - + tconstructor :: LParser TyConName tconstructor = do i <- identifier @@ -249,7 +257,7 @@ tconstructor = then return i else if (i `S.member` dconNames cnames) then fail "Expected a type constructor, but a data constructor was found." - else fail "Expected a constructor, but a variable was found" + else fail "Expected a constructor, but a variable was found" -- variables or zero-argument constructors @@ -267,7 +275,7 @@ colon, dot, comma :: LParser () colon = Token.colon tokenizer >> return () dot = Token.dot tokenizer >> return () comma = Token.comma tokenizer >> return () - + reserved,reservedOp :: String -> LParser () reserved = Token.reserved tokenizer reservedOp = Token.reservedOp tokenizer @@ -281,7 +289,7 @@ natural :: LParser Int natural = fromInteger <$> Token.natural tokenizer natenc :: LParser Term -natenc = encode <$> natural +natenc = encode <$> natural where encode 0 = DataCon "Zero" [] encode n = DataCon "Succ" [Arg Rel (encode (n-1))] @@ -292,7 +300,7 @@ moduleImports = do modName <- identifier reserved "where" imports <- layout importDef (return ()) - return $ Module modName imports [] emptyConstructorNames + return $ Module modName imports [] initialConstructorNames moduleDef :: LParser Module moduleDef = do @@ -309,54 +317,54 @@ importDef = do reserved "import" >> (ModuleImport <$> importName) where importName = identifier telescope :: LParser Telescope -telescope = do +telescope = do bindings <- telebindings return $ Telescope (foldr id [] bindings) where - -telebindings :: LParser [[Decl] -> [Decl]] + +telebindings :: LParser [[Entry] -> [Entry]] telebindings = many teleBinding where annot = do (x,ty) <- try ((,) <$> varOrWildcard <*> (colon >> expr)) <|> ((,) <$> (Unbound.fresh wildcardName) <*> expr) - return (TypeSig (Sig x Rel ty):) + return (TypeDecl (Decl x Rel ty):) imp = do v <- varOrWildcard colon t <- expr - return (TypeSig (Sig v Irr t):) - + return (TypeDecl (Decl v Irr t):) + equal = do v <- variable reservedOp "=" t <- expr return (Def v t :) - - teleBinding :: LParser ([Decl] -> [Decl]) + + teleBinding :: LParser ([Entry] -> [Entry]) teleBinding = ( parens annot <|> try (brackets imp) <|> brackets equal) "binding" - + --- --- Top level declarations --- -decl,sigDef,valDef :: LParser Decl -decl = (try dataDef) <|> sigDef <|> valDef +decl,declDef,valDef :: LParser Entry +decl = try dataDef <|> declDef <|> valDef -- datatype declarations. -dataDef :: LParser Decl +dataDef :: LParser Entry dataDef = do reserved "data" name <- identifier params <- telescope colon TyType <- typen - modify (\cnames -> - cnames{ tconNames = S.insert name + modify (\cnames -> + cnames{ tconNames = S.insert name (tconNames cnames) }) reserved "where" cs <- layout constructorDef (return ()) @@ -373,11 +381,11 @@ constructorDef = do return $ ConstructorDef pos cname args "Constructor" - -sigDef = do + +declDef = do n <- try (variable >>= \v -> colon >> return v) ty <- expr - return (mkSig n ty) + return (mkDecl n ty) valDef = do n <- try (do {n <- variable; reservedOp "="; return n}) @@ -400,13 +408,13 @@ printme = reserved "PRINTME" *> return (PrintMe ) refl :: LParser Term refl = do reserved "Refl" - return $ Refl + return $ Refl -- Expressions expr,term,factor :: LParser Term - + -- expr is the toplevel expression grammar expr = do p <- getPosition @@ -415,19 +423,19 @@ expr = do [ifix AssocLeft "=" TyEq], [ifixM AssocRight "->" mkArrowType], [ifixM AssocRight "*" mkTupleType] - ] + ] ifix assoc op f = Infix (reservedOp op >> return f) assoc ifixM assoc op f = Infix (reservedOp op >> f) assoc - mkArrowType = + mkArrowType = do n <- Unbound.fresh wildcardName - return $ \tyA tyB -> + return $ \tyA tyB -> TyPi Rel tyA (Unbound.bind n tyB) - mkTupleType = + mkTupleType = do n <- Unbound.fresh wildcardName - return $ \tyA tyB -> + return $ \tyA tyB -> TyCon sigmaName [Arg Rel tyA, Arg Rel $ Lam Rel (Unbound.bind n tyB)] - + -- A "term" is either a function application or a constructor -- application. Breaking it out as a seperate category both -- eliminates left-recursion in ( := ) and @@ -439,36 +447,36 @@ arg = try (Arg Irr <$> brackets expr) <|> Arg Rel <$> factor dconapp :: LParser Term -dconapp = do +dconapp = do c <- dconstructor args <- many arg - return $ DataCon c args - -tconapp :: LParser Term + return $ DataCon c args + +tconapp :: LParser Term tconapp = do c <- tconstructor ts <- many arg return $ TyCon c ts - + funapp :: LParser Term -funapp = do +funapp = do f <- factor foldl' app f <$> many bfactor where - bfactor = ((,Irr) <$> brackets expr) + bfactor = ((,Irr) <$> brackets expr) <|> ((,Rel) <$> factor) app e1 (e2,ep) = App e1 (Arg ep e2) factor = choice [ varOrCon "a variable or nullary data constructor" - + , typen "Type" , lambda "a lambda" , try letPairExp "a let pair" , letExpr "a let" - , natenc "a literal" + , natenc "a literal" , caseExpr "a case" , substExpr "a subst" , refl "Refl" @@ -477,16 +485,16 @@ factor = choice [ varOrCon "a variable or nullary data constructor" , printme "PRINTME" , impProd "an implicit function type" - , bconst "a constant" - , ifExpr "an if expression" - , sigmaTy "a sigma type" - + , bconst "a constant" + , ifExpr "an if expression" + , sigmaTy "a sigma type" + , expProdOrAnnotOrParens "an explicit function type or annotated expression" ] impOrExpVar :: LParser (TName, Epsilon) -impOrExpVar = try ((,Irr) <$> (brackets variable)) +impOrExpVar = try ((,Irr) <$> (brackets variable)) <|> (,Rel) <$> variable @@ -503,12 +511,12 @@ lambda = do reservedOp "\\" binds <- many1 impOrExpVar dot body <- expr - return $ foldr lam body binds + return $ foldr lam body binds where - lam (x, ep) m = Lam ep (Unbound.bind x m) - + lam (x, ep) m = Lam ep (Unbound.bind x m) + + - bconst :: LParser Term @@ -521,17 +529,17 @@ bconst = choice [reserved "Bool" >> return (TyCon boolName []), ifExpr :: LParser Term -ifExpr = +ifExpr = do reserved "if" a <- expr reserved "then" b <- expr reserved "else" c <- expr - return (Case a [Match $ Unbound.bind (PatCon trueName []) b, + return (Case a [Match $ Unbound.bind (PatCon trueName []) b, Match $ Unbound.bind (PatCon falseName []) c]) - + -- letExpr :: LParser Term @@ -565,10 +573,10 @@ letPairExp = do -- These have the syntax [x:a] -> b or [a] -> b . impProd :: LParser Term impProd = - do (x,tyA) <- brackets + do (x,tyA) <- brackets (try ((,) <$> variable <*> (colon >> expr)) <|> ((,) <$> Unbound.fresh wildcardName <*> expr)) - reservedOp "->" + reservedOp "->" tyB <- expr return $ TyPi Irr tyA (Unbound.bind x tyB) @@ -609,9 +617,9 @@ expProdOrAnnotOrParens = (do b <- afterBinder return $ TyPi Rel a (Unbound.bind x b)) Colon a b -> return $ Ann a b - - Comma a b -> - return $ DataCon prodName [Arg Rel a, Arg Rel b] + + Comma a b -> + return $ DataCon prodName [Arg Rel a, Arg Rel b] Nope a -> return a @@ -628,14 +636,14 @@ pattern :: LParser Pattern pattern = try (PatCon <$> dconstructor <*> many arg_pattern) <|> atomic_pattern where - arg_pattern = ((,Irr) <$> brackets pattern) + arg_pattern = ((,Irr) <$> brackets pattern) <|> ((,Rel) <$> atomic_pattern) - paren_pattern = do + paren_pattern = do pattern >>= \p -> ( (reservedOp ")" >> pure p) - <|> reservedOp "," *> (atomic_pattern >>= \q -> + <|> reservedOp "," *> (atomic_pattern >>= \q -> pure (PatCon prodName [(p, Rel), (q, Rel)])) - ) + ) atomic_pattern = reservedOp "(" *> paren_pattern <|> reserved "True" *> pure (PatCon trueName []) <|> reserved "False" *> pure (PatCon falseName []) @@ -650,8 +658,8 @@ pattern = try (PatCon <$> dconstructor <*> many arg_pattern) match :: LParser Match -match = - do pat <- pattern +match = + do pat <- pattern reservedOp "->" pos <- getPosition body <- expr @@ -664,9 +672,9 @@ caseExpr = do scrut <- expr reserved "of" alts <- layout match (return ()) - return $ Case (Pos pos scrut) alts - - + return $ Case (Pos pos scrut) alts + + -- subst e0 by e1 substExpr :: LParser Term @@ -675,16 +683,16 @@ substExpr = do a <- expr reserved "by" b <- expr - return $ Subst a b + return $ Subst a b contra :: LParser Term contra = do reserved "contra" witness <- expr - return $ Contra witness + return $ Contra witness -sigmaTy :: LParser Term +sigmaTy :: LParser Term sigmaTy = do reservedOp "{" x <- variable @@ -695,5 +703,5 @@ sigmaTy = do reservedOp "}" return $ TyCon sigmaName [Arg Rel a, Arg Rel (Lam Rel (Unbound.bind x b))] - - + + diff --git a/full/src/PrettyPrint.hs b/full/src/PrettyPrint.hs index 5a18a39..2b8d850 100644 --- a/full/src/PrettyPrint.hs +++ b/full/src/PrettyPrint.hs @@ -120,11 +120,11 @@ instance Disp Module instance Disp ModuleImport -instance Disp Decl +instance Disp Entry -instance Disp [Decl] +instance Disp [Entry] -instance Disp Sig +instance Disp Decl instance Disp Arg @@ -160,24 +160,23 @@ instance Display Module where instance Display ModuleImport where display (ModuleImport i) = pure $ PP.text "import" <+> disp i -instance Display [Decl] where +instance Display [Entry] where display ds = do dd <- mapM display ds pure $ PP.vcat dd -instance Display Sig where - display sig = do - dn <- display (sigName sig) - dt <- display (sigType sig) +instance Display Decl where + display decl = do + dn <- display (declName decl) + dt <- display (declType decl) pure $ dn <+> PP.text ":" <+> dt -instance Display Decl where +instance Display Entry where display (Def n term) = do dn <- display n dt <- display term pure $ dn <+> PP.text "=" <+> dt - display (RecDef n f) = display (Def n f) - display (TypeSig sig) = display sig + display (TypeDecl decl) = display decl display (Demote ep) = return mempty display (Data n params constructors) = do dn <- display n @@ -191,12 +190,6 @@ instance Display Decl where ) 2 (PP.vcat dc) - display (DataSig t delta) = do - dt <- display t - dd <- display delta - - pure $ PP.text "data" <+> dt <+> dd <+> PP.colon - <+> PP.text "Type" instance Display ConstructorDef where diff --git a/full/src/Syntax.hs b/full/src/Syntax.hs index 3c3d305..f474485 100644 --- a/full/src/Syntax.hs +++ b/full/src/Syntax.hs @@ -25,16 +25,8 @@ import Data.Function (on) -- and alpha-equality function. The abstract type `Name` from -- this library is indexed by the AST type that this variable -- is a name for. -type TName = Unbound.Name Term - --- | module names -type ModuleName = String - --- | type constructor names -type TyConName = String --- | data constructor names -type DataConName = String +type TName = Unbound.Name Term ----------------------------------------- @@ -143,12 +135,15 @@ data Pattern ----------------------------------------- +-- | module names +type ModuleName = String + -- | A Module has a name, a list of imports, a list of declarations, -- and a set of constructor names (which affect parsing). data Module = Module { moduleName :: ModuleName, moduleImports :: [ModuleImport], - moduleEntries :: [Decl] , + moduleEntries :: [Entry] , moduleConstructors :: ConstructorNames } deriving (Show, Generic, Typeable, Unbound.Alpha) @@ -158,36 +153,40 @@ newtype ModuleImport = ModuleImport ModuleName deriving (Show, Eq, Generic, Typeable) deriving anyclass (Unbound.Alpha) --- | A type declaration (or type signature) -data Sig = Sig {sigName :: TName , sigEp :: Epsilon , sigType :: Type} +-- | A type declaration (or type declnature) +data Decl = Decl {declName :: TName , declEp :: Epsilon , declType :: Type} deriving (Show, Generic, Typeable, Unbound.Alpha, Unbound.Subst Term) -- | Declare the type of a term -mkSig :: TName -> Type -> Decl -mkSig n ty = TypeSig (Sig n Rel ty) - --- | Declarations are the components of modules -data Decl - = -- | Declaration for the type of a term - TypeSig Sig - | -- | The definition of a particular name, must +mkDecl :: TName -> Type -> Entry +mkDecl n ty = TypeDecl (Decl n Rel ty) + +-- | Entries are the components of modules +data Entry + = -- | Declaration for the type of a term 'x : A' + TypeDecl Decl + | -- | The definition of a particular name, must 'x = a' -- already have a type declaration in scope Def TName Term - | -- | A potentially (recursive) definition of - -- a particular name, must be declared - RecDef TName Term -- | Adjust the context for relevance checking | Demote Epsilon - | -- | Declaration for a datatype including all of - -- its data constructors + | -- | Datatype definition (must be at the module level) Data TyConName Telescope [ConstructorDef] - | -- | An abstract view of a datatype. Does - -- not include any information about its data - -- constructors - DataSig TyConName Telescope deriving (Show, Generic, Typeable) deriving anyclass (Unbound.Alpha, Unbound.Subst Term) + +----------------------------------------- + +-- * Datatypes + +----------------------------------------- +-- | type constructor names +type TyConName = String + +-- | data constructor names +type DataConName = String + -- | The names of type/data constructors used in the module data ConstructorNames = ConstructorNames { tconNames :: Set String, @@ -200,36 +199,19 @@ data ConstructorDef = ConstructorDef SourcePos DataConName Telescope deriving (Show, Generic) deriving anyclass (Unbound.Alpha, Unbound.Subst Term) --- * Telescopes +-- ** Telescopes -- | A telescope is like a first class context. It is a list of -- assumptions, binding each variable in terms that appear -- later in the list. -- For example -- Delta = [ x:Type , y:x, y = w ] -newtype Telescope = Telescope [Decl] +newtype Telescope = Telescope [Entry] deriving (Show, Generic) deriving anyclass (Unbound.Alpha, Unbound.Subst Term) - --- * Auxiliary functions on syntax - --- | empty set of constructor names -emptyConstructorNames :: ConstructorNames -emptyConstructorNames = ConstructorNames initialTCNames initialDCNames - --- | Default name for '_' occurring in patterns -wildcardName :: TName -wildcardName = Unbound.string2Name "_" - --- | Partial inverse of Pos -unPos :: Term -> Maybe SourcePos -unPos (Pos p _) = Just p -unPos _ = Nothing - --- | Tries to find a Pos inside a term, otherwise just gives up. -unPosFlaky :: Term -> SourcePos -unPosFlaky t = fromMaybe (newPos "unknown location" 0 0) (unPos t) +----------------------------------------- +-- Definitions related to datatypes -- | Is this the syntax of a literal (natural) number isNumeral :: Term -> Maybe Int @@ -244,9 +226,9 @@ isPatVar :: Pattern -> Bool isPatVar (PatVar _) = True isPatVar _ = False -------------------------------------------------------------------- --- Prelude declarations for datatypes - +-- | built-in set of constructor names +initialConstructorNames :: ConstructorNames +initialConstructorNames = ConstructorNames initialTCNames initialDCNames -- | prelude names for built-in datatypes sigmaName :: TyConName @@ -269,7 +251,8 @@ initialTCNames = Set.fromList [sigmaName, boolName, tyUnitName] initialDCNames :: Set DataConName initialDCNames = Set.fromList [prodName, trueName, falseName, litUnitName] -preludeDataDecls :: [Decl] + +preludeDataDecls :: [Entry] preludeDataDecls = [ Data sigmaName sigmaTele [prodConstructorDef] , Data tyUnitName (Telescope []) [unitConstructorDef] @@ -283,27 +266,76 @@ preludeDataDecls = unitConstructorDef = ConstructorDef internalPos litUnitName (Telescope []) -- Sigma-type - sigmaTele = Telescope [TypeSig sigA, TypeSig sigB] - prodConstructorDef = ConstructorDef internalPos prodName (Telescope [TypeSig sigX, TypeSig sigY]) - sigA = Sig aName Rel TyType - sigB = Sig bName Rel (TyPi Rel (Var aName) (Unbound.bind xName TyType)) - sigX = Sig xName Rel (Var aName) - sigY = Sig yName Rel (App (Var bName) (Arg Rel (Var xName))) + sigmaTele = Telescope [TypeDecl declA, TypeDecl declB] + prodConstructorDef = ConstructorDef internalPos prodName (Telescope [TypeDecl declX, TypeDecl declY]) + declA = Decl aName Rel TyType + declB = Decl bName Rel (TyPi Rel (Var aName) (Unbound.bind xName TyType)) + declX = Decl xName Rel (Var aName) + declY = Decl yName Rel (App (Var bName) (Arg Rel (Var xName))) aName = Unbound.string2Name "a" bName = Unbound.string2Name "b" ------------------ + internalPos :: SourcePos + internalPos = initialPos "prelude" + + + +----------------------------------------- +-- * Auxiliary functions on syntax +----------------------------------------- + + +-- | Remove source positions and type annotations from the top level of a term +strip :: Term -> Term +strip (Pos _ tm) = strip tm +strip (Ann tm _) = strip tm +strip tm = tm + +-- | Partial inverse of Pos +unPos :: Term -> Maybe SourcePos +unPos (Pos p _) = Just p +unPos _ = Nothing + +-- | Tries to find a Pos inside a term, otherwise just gives up. +unPosFlaky :: Term -> SourcePos +unPosFlaky t = fromMaybe (newPos "unknown location" 0 0) (unPos t) + + + +----------------------------------------- +-- * Unbound library +----------------------------------------- -- We use the unbound-generics library to mark the binding occurrences of -- variables in the syntax. That allows us to automatically derive -- functions for alpha-equivalence, free variables and substitution -- using generic programming. +-- | Determine when two terms are alpha-equivalent (see below) +aeq :: Term -> Term -> Bool +aeq = Unbound.aeq + +-- | Calculate the free variables of a term +fv :: Term -> [Unbound.Name Term] +fv = Unbound.toListOf Unbound.fv + +-- | subst x b a means to replace x with b in a +-- i.e. a [ b / x ] +subst :: TName -> Term -> Term -> Term +subst = Unbound.subst + +-- | in a binder "x.a" replace x with b +instantiate :: Unbound.Bind TName Term -> Term -> Term +instantiate bnd a = Unbound.instantiate bnd [a] + +-- | in a binder "x.a" replace x with a fresh name +unbind :: (Unbound.Fresh m) => Unbound.Bind TName Term -> m (TName, Term) +unbind = Unbound.unbind ------------------ -- * Alpha equivalence and free variables --- Among other things, the Alpha class enables the following +-- The Unbound library's Alpha class enables the following -- functions: -- -- Compare terms for alpha equivalence -- aeq :: Alpha a => a -> a -> Bool @@ -313,23 +345,23 @@ preludeDataDecls = -- unbind :: (Alpha p, Alpha t, Fresh m) => Bind p t -> m (p, t) -- For Terms, we'd like Alpha equivalence to ignore --- source positions and type annotations. --- We can add these special cases to the definition of `aeq'` --- and then defer all other cases to the generic version of --- the function (Unbound.gaeq). +-- source positions and type annotations. So we make sure to +-- remove them before calling the generic operation. instance Unbound.Alpha Term where - aeq' ctx (Ann a _) b = Unbound.aeq' ctx a b - aeq' ctx a (Ann b _) = Unbound.aeq' ctx a b - aeq' ctx (Pos _ a) b = Unbound.aeq' ctx a b - aeq' ctx a (Pos _ b) = Unbound.aeq' ctx a b - aeq' ctx a b = (Unbound.gaeq ctx `on` from) a b + aeq' :: Unbound.AlphaCtx -> Term -> Term -> Bool + aeq' ctx a b = (Unbound.gaeq ctx `on` from) (strip a) (strip b) + -- For example, all occurrences of annotations and source positions -- are ignored by this definition. --- >>> Unbound.aeq (Pos internalPos (Ann TyBool Type)) TyBool --- True +-- '(Bool : Type)' is alpha-equivalent to 'Bool' +-- >>> aeq (Ann TyBool TyType) TyBool + +-- '(Bool, Bool:Type)' is alpha-equivalent to (Bool, Bool) +-- >>> aeq (Prod TyBool (Ann TyBool TyType)) (Prod TyBool TyBool) + -- At the same time, the generic operation equates terms that differ only -- in the names of bound variables. @@ -350,7 +382,7 @@ idx = Lam Rel (Unbound.bind xName (Var xName)) idy :: Term idy = Lam Rel (Unbound.bind yName (Var yName)) --- >>> Unbound.aeq idx idy +-- >>> aeq idx idy -- True @@ -379,14 +411,6 @@ pi2 :: Term pi2 = TyPi Rel TyBool (Unbound.bind yName (Var yName)) -- >>> Unbound.aeq (Unbound.subst xName TyBool pi1) pi2 --- True --- - ---------------- --- | Bridge function to calculate the free variables of a term - -fv :: Term -> [Unbound.Name Term] -fv = Unbound.toListOf Unbound.fv ----------------- @@ -410,15 +434,18 @@ instance Unbound.Alpha SourcePos where acompare' _ _ _ = EQ -- Substitutions ignore source positions -instance Unbound.Subst b SourcePos where subst _ _ = id; substs _ = id; substBvs _ _ = id +instance Unbound.Subst b SourcePos where + subst _ _ = id + substs _ = id + substBvs _ _ = id --- Internally generated source positions -internalPos :: SourcePos -internalPos = initialPos "internal" -- * Constructor Names +-- ConstructorNames are sets, so they also do not have an instance of the +-- Generic class available so we cannot automatically define their +-- Alpha and Subst instances. instance Unbound.Alpha ConstructorNames where aeq' _ a1 a2 = a1 == a2 fvAny' _ _ = pure diff --git a/full/src/TypeCheck.hs b/full/src/TypeCheck.hs index c6eb792..1cb272f 100644 --- a/full/src/TypeCheck.hs +++ b/full/src/TypeCheck.hs @@ -1,7 +1,6 @@ {- pi-forall -} -- | The main routines for type-checking -{-# OPTIONS_GHC -Wno-unrecognised-pragmas #-} {-# HLINT ignore "Use forM_" #-} module TypeCheck (tcModules, inferType, checkType) where @@ -25,314 +24,309 @@ import Unbound.Generics.LocallyNameless.Internal.Fold qualified as Unbound import Unbound.Generics.LocallyNameless.Unsafe (unsafeUnbind) --- | Infer/synthesize the type of a term -inferType :: Term -> TcMonad Type -inferType t = tcTerm t Nothing - --- | Check that the given term has the expected type -checkType :: Term -> Type -> TcMonad () -checkType tm (Pos _ ty) = checkType tm ty -- ignore source positions/annotations -checkType tm (Ann ty _) = checkType tm ty -checkType tm ty = do - nf <- Equal.whnf ty - void $ tcTerm tm (Just nf) - - --- | Make sure that the term is a "type" (i.e. that it has type 'Type') -tcType :: Term -> TcMonad () -tcType tm = void $ Env.withStage Irr $ checkType tm TyType --------------------------------------------------------------------- --- | Combined type checking/inference function --- The second argument is 'Just expectedType' in checking mode and 'Nothing' in inference mode --- In either case, this function returns the type of the term -tcTerm :: Term -> Maybe Type -> TcMonad Type --- i-var -tcTerm t@(Var x) Nothing = do - sig <- Env.lookupTy x -- make sure the variable is accessible - Env.checkStage (sigEp sig) - return (sigType sig) --- i-type -tcTerm TyType Nothing = return TyType --- i-pi -tcTerm (TyPi ep tyA bnd) Nothing = do - (x, tyB) <- Unbound.unbind bnd - tcType tyA - Env.extendCtx (TypeSig (Sig x ep tyA)) (tcType tyB) - return TyType --- c-lam: check the type of a function -tcTerm (Lam ep1 bnd) (Just (TyPi ep2 tyA bnd2)) = do - -- unbind the variables in the lambda expression and pi type - (x, body,_,tyB) <- Unbound.unbind2Plus bnd bnd2 --- epsilons should match up - unless (ep1 == ep2) $ Env.err [DS "In function definition, expected", DD ep2, DS "parameter", DD x, - DS "but found", DD ep1, DS "instead."] - -- check the type of the body of the lambda expression - Env.extendCtx (TypeSig (Sig x ep1 tyA)) (checkType body tyB) - return (TyPi ep1 tyA bnd2) -tcTerm (Lam _ _) (Just nf) = - Env.err [DS "Lambda expression should have a function type, not", DD nf] --- i-app -tcTerm (App t1 t2) Nothing = do - ty1 <- inferType t1 - let ensurePi = Equal.ensurePi - - (ep1, tyA, bnd) <- ensurePi ty1 - unless (ep1 == argEp t2) $ Env.err - [DS "In application, expected", DD ep1, DS "argument but found", - DD t2, DS "instead." ] - -- if the argument is Irrelevant, resurrect the context - (if ep1 == Irr then Env.extendCtx (Demote Rel) else id) $ - checkType (unArg t2) tyA - return (Unbound.instantiate bnd [unArg t2]) - +-- | Infer/synthesize the type of a term +inferType :: Term -> TcMonad Type +inferType t = case t of + -- i-var + (Var x) -> do + decl <- Env.lookupTy x -- make sure the variable is accessible + Env.checkStage (declEp decl) + return (declType decl) + + -- i-type + TyType -> return TyType + + -- i-pi + (TyPi ep tyA bnd) -> do + (x, tyB) <- Unbound.unbind bnd + tcType tyA + Env.extendCtx (TypeDecl (Decl x ep tyA)) (tcType tyB) + return TyType + + -- i-app + (App t1 t2) -> do + ty1 <- inferType t1 + let ensurePi = Equal.ensurePi + + (ep1, tyA, bnd) <- ensurePi ty1 + unless (ep1 == argEp t2) $ Env.err + [DS "In application, expected", DD ep1, DS "argument but found", + DD t2, DS "instead." ] + -- if the argument is Irrelevant, resurrect the context + (if ep1 == Irr then Env.extendCtx (Demote Rel) else id) $ + checkType (unArg t2) tyA + return (Unbound.instantiate bnd [unArg t2]) + --- i-ann -tcTerm (Ann tm ty) Nothing = do - tcType ty - checkType tm ty - return ty + -- i-ann + (Ann tm ty) -> do + tcType ty + checkType tm ty + return ty --- practicalities --- remember the current position in the type checking monad -tcTerm (Pos p tm) mTy = - Env.extendSourceLocation p tm $ tcTerm tm mTy --- ignore term, just return type annotation -tcTerm TrustMe (Just ty) = return ty + -- Practicalities + -- remember the current position in the type checking monad + (Pos p tm) -> + Env.extendSourceLocation p tm $ inferType tm --- i-unit -tcTerm TyUnit Nothing = return TyType -tcTerm LitUnit Nothing = return TyUnit - --- i-bool -tcTerm TyBool Nothing = return TyType - + -- Extensions to the core language + -- i-unit + TyUnit -> return TyType + LitUnit -> return TyUnit --- i-true/false -tcTerm (LitBool b) Nothing = do - return TyBool + -- i-bool + TyBool -> return TyType + -- i-true/false + (LitBool b) -> return TyBool --- c-if -tcTerm t@(If t1 t2 t3) mty = do - case mty of - Just ty -> do - checkType t1 TyBool - dtrue <- Equal.unify [] t1 (LitBool True) - dfalse <- Equal.unify [] t1 (LitBool False) - Env.extendCtxs dtrue $ checkType t2 ty - Env.extendCtxs dfalse $ checkType t3 ty - return ty - Nothing -> do + -- i-if + (If t1 t2 t3) -> do checkType t1 TyBool ty <- inferType t2 checkType t3 ty - return ty - - -tcTerm (Let rhs bnd) mty = do - (x, body) <- Unbound.unbind bnd - aty <- inferType rhs - ty <- Env.extendCtxs [mkSig x aty, Def x rhs] $ - tcTerm body mty - case mty of - Just _ -> return ty - Nothing -> return $ Unbound.subst x rhs ty - --- TyType constructor application -tcTerm (TyCon c params) Nothing = do - (Telescope delta, _) <- Env.lookupTCon c - unless (length params == length delta) $ - Env.err - [ DS "Datatype constructor", - DD c, - DS $ - "should have " ++ show (length delta) - ++ "parameters, but was given", - DD (length params) - ] - tcArgTele params delta - return TyType - --- Data constructor application --- we don't know the expected type, so see if there --- is only one datacon of that name that takes no --- parameters -tcTerm t@(DataCon c args) Nothing = do - matches <- Env.lookupDConAll c - case matches of - [(tname, (Telescope [], ConstructorDef _ _ (Telescope deltai)))] -> do - let numArgs = length deltai - unless (length args == numArgs) $ - Env.err - [ DS "Constructor", - DS c, - DS "should have", - DD numArgs, - DS "data arguments, but was given", - DD (length args), - DS "arguments." - ] - tcArgTele args deltai - return $ TyCon tname [] - - [_] -> + return ty + -- i-eq + (TyEq a b) -> do + aTy <- inferType a + checkType b aTy + return TyType + + -- i-sigma + (TySigma tyA bnd) -> do + (x, tyB) <- Unbound.unbind bnd + tcType tyA + Env.extendCtx (mkDecl x tyA) $ tcType tyB + return TyType + + -- Type constructor application + (TyCon c params) -> do + (Telescope delta, _) <- Env.lookupTCon c + unless (length params == length delta) $ Env.err - [ DS "Cannot infer the parameters to data constructors.", - DS "Add an annotation." + [ DS "Datatype constructor", + DD c, + DS $ + "should have " ++ show (length delta) + ++ "parameters, but was given", + DD (length params) ] - _ -> Env.err [DS "Ambiguous data constructor", DS c] - --- we know the expected type of the data constructor --- so look up its type in the context -tcTerm t@(DataCon c args) (Just ty) = do - case ty of - (TyCon tname params) -> do - (Telescope delta, Telescope deltai) <- Env.lookupDCon c tname - let isTypeSig :: Decl -> Bool - isTypeSig (TypeSig _) = True - isTypeSig _ = False - let numArgs = length (filter isTypeSig deltai) - unless (length args == numArgs) $ + tcArgTele params delta + return TyType + + -- Data constructor application + -- we don't know the expected type, so see if there + -- is only one datacon of that name that takes no + -- parameters + (DataCon c args) -> do + matches <- Env.lookupDConAll c + case matches of + [(tname, (Telescope [], ConstructorDef _ _ (Telescope deltai)))] -> do + let numArgs = length deltai + unless (length args == numArgs) $ + Env.err + [ DS "Constructor", + DS c, + DS "should have", + DD numArgs, + DS "data arguments, but was given", + DD (length args), + DS "arguments." + ] + tcArgTele args deltai + return $ TyCon tname [] + [_] -> Env.err - [ DS "Constructor", - DS c, - DS "should have", - DD numArgs, - DS "data arguments, but was given", - DD (length args), - DS "arguments." + [ DS "Cannot infer the parameters to data constructors.", + DS "Add an annotation." ] - newTele <- substTele delta params deltai - tcArgTele args newTele - return ty - _ -> - Env.err [DS "Unexpected type", DD ty, DS "for data constructor", DD t] - --- Must have an annotation for Case -tcTerm t@(Case scrut alts) (Just ty) = do - sty <- inferType scrut - scrut' <- Equal.whnf scrut - (c, args) <- Equal.ensureTCon sty - let checkAlt (Match bnd) = do - (pat, body) <- Unbound.unbind bnd - -- add variables from pattern to context - -- could fail if branch is in-accessible - decls <- declarePat pat Rel (TyCon c args) - -- add defs to the contents from scrut = pat - -- could fail if branch is in-accessible - decls' <- Equal.unify [] scrut' (pat2Term pat) - Env.extendCtxs (decls ++ decls') $ checkType body ty - - return () - let pats = map (\(Match bnd) -> fst (unsafeUnbind bnd)) alts - mapM_ checkAlt alts - exhaustivityCheck scrut' sty pats - return ty - -tcTerm (TyEq a b) Nothing = do - aTy <- inferType a - checkType b aTy - return TyType -tcTerm Refl (Just ty@(TyEq a b)) = do - Equal.equate a b - return ty -tcTerm Refl (Just ty) = - Env.err [DS "Refl annotated with", DD ty] -tcTerm t@(Subst a b) (Just ty) = do - -- infer the type of the proof 'b' - tp <- inferType b - -- make sure that it is an equality between m and n - (m, n) <- Equal.ensureTyEq tp - -- if either side is a variable, add a definition to the context - edecl <- Equal.unify [] m n - -- if proof is a variable, add a definition to the context - pdecl <- Equal.unify [] b Refl - _ <- Env.extendCtxs (edecl ++ pdecl) $ checkType a ty - return ty -tcTerm t@(Contra p) (Just ty) = do - ty' <- inferType p - (a, b) <- Equal.ensureTyEq ty' - a' <- Equal.whnf a - b' <- Equal.whnf b - case (a', b') of - - (DataCon da _, DataCon db _) - | da /= db -> - return ty - - (LitBool b1, LitBool b2) - | b1 /= b2 -> - return ty - (_, _) -> - Env.err - [ DS "I can't tell that", - DD a, - DS "and", - DD b, - DS "are contradictory" - ] - + _ -> Env.err [DS "Ambiguous data constructor", DS c] -tcTerm t@(TySigma tyA bnd) Nothing = do - (x, tyB) <- Unbound.unbind bnd - tcType tyA - Env.extendCtx (mkSig x tyA) $ tcType tyB - return TyType + -- cannot synthesize the type of the term + tm -> + Env.err [DS "Must have a type for", DD tm] -tcTerm t@(Prod a b) (Just ty) = do - case ty of - (TySigma tyA bnd) -> do - (x, tyB) <- Unbound.unbind bnd - checkType a tyA - Env.extendCtxs [mkSig x tyA, Def x a] $ checkType b tyB - return (TySigma tyA (Unbound.bind x tyB)) - _ -> - Env.err - [ DS "Products must have Sigma Type", - DD ty, - DS "found instead" - ] - +------------------------------------------------------------------------- -tcTerm t@(LetPair p bnd) (Just ty) = do - ((x, y), body) <- Unbound.unbind bnd - pty <- inferType p - pty' <- Equal.whnf pty - case pty' of - TySigma tyA bnd' -> do - let tyB = Unbound.instantiate bnd' [Var x] - decl <- Equal.unify [] p (Prod (Var x) (Var y)) - Env.extendCtxs ([mkSig x tyA, mkSig y tyB] ++ decl) $ - checkType body ty - return ty - _ -> Env.err [DS "Scrutinee of LetPair must have Sigma type"] +-- | Make sure that the term is a "type" (i.e. that it has type 'Type') +tcType :: Term -> TcMonad () +tcType tm = Env.withStage Irr $ checkType tm TyType +------------------------------------------------------------------------- +-- | Check that the given term has the expected type +checkType :: Term -> Type -> TcMonad () +checkType tm ty' = do + ty <- Equal.whnf ty' + case tm of + -- c-lam: check the type of a function + (Lam ep1 bnd) -> case ty of + (TyPi ep2 tyA bnd2) -> do + -- unbind the variables in the lambda expression and pi type + (x, body,_,tyB) <- Unbound.unbind2Plus bnd bnd2 +-- epsilons should match up + unless (ep1 == ep2) $ Env.err [DS "In function definition, expected", DD ep2, DS "parameter", DD x, + DS "but found", DD ep1, DS "instead."] + -- check the type of the body of the lambda expression + Env.extendCtx (TypeDecl (Decl x ep1 tyA)) (checkType body tyB) + _ -> Env.err [DS "Lambda expression should have a function type, not", DD ty] + + -- Practicalities + (Pos p tm) -> + Env.extendSourceLocation p tm $ checkType tm ty + + TrustMe -> return () + + PrintMe -> do + gamma <- Env.getLocalCtx + Env.warn [DS "Unmet obligation.\nContext:", DD gamma, + DS "\nGoal:", DD ty] + + -- Extensions to the core language + -- c-if + (If t1 t2 t3) -> do + checkType t1 TyBool + dtrue <- Equal.unify [] t1 (LitBool True) + dfalse <- Equal.unify [] t1 (LitBool False) + Env.extendCtxs dtrue $ checkType t2 ty + Env.extendCtxs dfalse $ checkType t3 ty + + -- c-let + (Let rhs bnd) -> do + (x, body) <- Unbound.unbind bnd + aty <- inferType rhs + Env.extendCtxs [mkDecl x aty, Def x rhs] $ + checkType body ty + -- c-data + -- we know the expected type of the data constructor + -- so look up its type in the context + (DataCon c args) -> do + case ty of + (TyCon tname params) -> do + (Telescope delta, Telescope deltai) <- Env.lookupDCon c tname + let isTypeDecl :: Entry -> Bool + isTypeDecl (TypeDecl _) = True + isTypeDecl _ = False + let numArgs = length (filter isTypeDecl deltai) + unless (length args == numArgs) $ + Env.err + [ DS "Constructor", + DS c, + DS "should have", + DD numArgs, + DS "data arguments, but was given", + DD (length args), + DS "arguments." + ] + newTele <- substTele delta params deltai + tcArgTele args newTele + _ -> + Env.err [DS "Unexpected type", DD ty, DS "for data constructor", DD tm] + + (Case scrut alts) -> do + sty <- inferType scrut + scrut' <- Equal.whnf scrut + (c, args) <- Equal.ensureTCon sty + let checkAlt (Match bnd) = do + (pat, body) <- Unbound.unbind bnd + -- add variables from pattern to context + -- could fail if branch is in-accessible + decls <- declarePat pat Rel (TyCon c args) + -- add defs to the contents from scrut = pat + -- could fail if branch is in-accessible + decls' <- Equal.unify [] scrut' (pat2Term pat) + Env.extendCtxs (decls ++ decls') $ checkType body ty + + return () + let pats = map (\(Match bnd) -> fst (unsafeUnbind bnd)) alts + mapM_ checkAlt alts + exhaustivityCheck scrut' sty pats + + -- c-refl + Refl -> case ty of + (TyEq a b) -> Equal.equate a b + _ -> Env.err [DS "Refl annotated with", DD ty] + -- c-subst + (Subst a b) -> do + -- infer the type of the proof 'b' + tp <- inferType b + -- make sure that it is an equality between m and n + (m, n) <- Equal.ensureTyEq tp + -- if either side is a variable, add a definition to the context + edecl <- Equal.unify [] m n + -- if proof is a variable, add a definition to the context + pdecl <- Equal.unify [] b Refl + Env.extendCtxs (edecl ++ pdecl) $ checkType a ty + -- c-contra + (Contra p) -> do + ty' <- inferType p + (a, b) <- Equal.ensureTyEq ty' + a' <- Equal.whnf a + b' <- Equal.whnf b + case (a', b') of + + (DataCon da _, DataCon db _) + | da /= db -> + return () + + (LitBool b1, LitBool b2) + | b1 /= b2 -> + return () + (_, _) -> + Env.err + [ DS "I can't tell that", + DD a, + DS "and", + DD b, + DS "are contradictory" + ] + + -- c-prod + (Prod a b) -> do + case ty of + (TySigma tyA bnd) -> do + (x, tyB) <- Unbound.unbind bnd + checkType a tyA + Env.extendCtxs [mkDecl x tyA, Def x a] $ checkType b tyB + _ -> + Env.err + [ DS "Products must have Sigma Type", + DD ty, + DS "found instead" + ] + -tcTerm PrintMe (Just ty) = do - gamma <- Env.getLocalCtx - Env.warn [DS "Unmet obligation.\nContext:", DD gamma, - DS "\nGoal:", DD ty] - return ty + -- c-letpair + (LetPair p bnd) -> do + ((x, y), body) <- Unbound.unbind bnd + pty <- inferType p + pty' <- Equal.whnf pty + case pty' of + TySigma tyA bnd' -> do + let tyB = Unbound.instantiate bnd' [Var x] + decl <- Equal.unify [] p (Prod (Var x) (Var y)) + Env.extendCtxs ([mkDecl x tyA, mkDecl y tyB] ++ decl) $ + checkType body ty + _ -> Env.err [DS "Scrutinee of LetPair must have Sigma type"] + --- c-infer -tcTerm tm (Just ty) = do - ty' <- inferType tm - Equal.equate ty' ty - return ty' + -- c-infer + tm -> do + ty' <- inferType tm + Equal.equate ty' ty + -tcTerm tm Nothing = - Env.err [DS "Must have a type annotation to check", DD tm] --------------------------------------------------------------------- -- helper functions for type checking -- | Create a Def if either side normalizes to a single variable -def :: Term -> Term -> TcMonad [Decl] +def :: Term -> Term -> TcMonad [Entry] def t1 t2 = do nf1 <- Equal.whnf t1 nf2 <- Equal.whnf t2 @@ -347,13 +341,13 @@ def t1 t2 = do -- helper functions for datatypes -- | type check a list of data constructor arguments against a telescope -tcArgTele :: [Arg] -> [Decl] -> TcMonad () +tcArgTele :: [Arg] -> [Entry] -> TcMonad () tcArgTele [] [] = return () tcArgTele args (Def x ty : tele) = do -- ensure that the equality is provable at this point Equal.equate (Var x) ty tcArgTele args tele -tcArgTele (Arg ep1 tm : terms) (TypeSig (Sig x ep2 ty) : tele) +tcArgTele (Arg ep1 tm : terms) (TypeDecl (Decl x ep2 ty) : tele) | ep1 == ep2 = do Env.withStage ep1 $ checkType tm ty tele' <- doSubst [(x, tm)] tele @@ -376,11 +370,11 @@ tcArgTele _ tele = -- This is used to instantiate the parameters of a data constructor -- to find the types of its arguments. -- The first argument should only contain 'Rel' type declarations. -substTele :: [Decl] -> [Arg] -> [Decl] -> TcMonad [Decl] +substTele :: [Entry] -> [Arg] -> [Entry] -> TcMonad [Entry] substTele tele args = doSubst (mkSubst tele (map unArg args)) where mkSubst [] [] = [] - mkSubst (TypeSig (Sig x Rel _) : tele') (tm : tms) = + mkSubst (TypeDecl (Decl x Rel _) : tele') (tm : tms) = (x, tm) : mkSubst tele' tms mkSubst _ _ = error "Internal error: substTele given illegal arguments" @@ -388,7 +382,7 @@ substTele tele args = doSubst (mkSubst tele (map unArg args)) -- Propagate the given substitution through the telescope, potentially -- reworking the constraints -doSubst :: [(TName, Term)] -> [Decl] -> TcMonad [Decl] +doSubst :: [(TName, Term)] -> [Entry] -> TcMonad [Entry] doSubst ss [] = return [] doSubst ss (Def x ty : tele') = do let tx' = Unbound.substs ss (Var x) @@ -396,19 +390,19 @@ doSubst ss (Def x ty : tele') = do decls1 <- Equal.unify [] tx' ty' decls2 <- Env.extendCtxs decls1 (doSubst ss tele') return $ decls1 ++ decls2 -doSubst ss (TypeSig sig : tele') = do - tynf <- Equal.whnf (Unbound.substs ss (sigType sig)) - let sig' = sig{sigType = tynf} +doSubst ss (TypeDecl decl : tele') = do + tynf <- Equal.whnf (Unbound.substs ss (declType decl)) + let decl' = decl{declType = tynf} tele'' <- doSubst ss tele' - return $ TypeSig sig' : tele'' + return $ TypeDecl decl' : tele'' doSubst _ tele = Env.err [DS "Invalid telescope", DD tele] ----------------------------------------------------------- -- | Create a binding for each of the variables in the pattern -declarePat :: Pattern -> Epsilon -> Type -> TcMonad [Decl] -declarePat (PatVar x) ep ty = return [TypeSig (Sig x ep ty)] +declarePat :: Pattern -> Epsilon -> Type -> TcMonad [Entry] +declarePat (PatVar x) ep ty = return [TypeDecl (Decl x ep ty)] declarePat (PatCon dc pats) Rel ty = do (tc,params) <- Equal.ensureTCon ty (Telescope delta, Telescope deltai) <- Env.lookupDCon dc tc @@ -419,12 +413,12 @@ declarePat pat Irr _ty = -- | Given a list of pattern arguments and a telescope, create a binding for -- each of the variables in the pattern, -declarePats :: DataConName -> [(Pattern, Epsilon)] -> [Decl] -> TcMonad [Decl] +declarePats :: DataConName -> [(Pattern, Epsilon)] -> [Entry] -> TcMonad [Entry] declarePats dc pats (Def x ty : tele) = do let ds1 = [Def x ty] ds2 <- Env.extendCtxs ds1 $ declarePats dc pats tele return (ds1 ++ ds2) -declarePats dc ((pat, _) : pats) (TypeSig (Sig x ep ty) : tele) = do +declarePats dc ((pat, _) : pats) (TypeDecl (Decl x ep ty) : tele) = do ds1 <- declarePat pat ep ty let tm = pat2Term pat tele' <- doSubst [(x,tm)] tele @@ -448,16 +442,16 @@ pat2Term (PatCon dc pats) = DataCon dc (pats2Terms pats) -- | Check all of the types contained within a telescope -tcTypeTele :: [Decl] -> TcMonad () +tcTypeTele :: [Entry] -> TcMonad () tcTypeTele [] = return () tcTypeTele (Def x tm : tl) = do ty1 <- Env.withStage Irr $ inferType (Var x) Env.withStage Irr $ checkType tm ty1 let decls = [Def x tm] Env.extendCtxs decls $ tcTypeTele tl -tcTypeTele (TypeSig sig : tl) = do - tcType (sigType sig) - Env.extendCtx (TypeSig sig) $ tcTypeTele tl +tcTypeTele (TypeDecl decl : tl) = do + tcType (declType decl) + Env.extendCtx (TypeDecl decl) $ tcTypeTele tl tcTypeTele tele = Env.err [DS "Invalid telescope: ", DD tele] @@ -483,11 +477,11 @@ tcModules = foldM tcM [] -- | Typecheck an entire module. tcModule :: - -- | List of already checked modules (including their Decls). + -- | List of already checked modules (including their entries). [Module] -> -- | Module to check. Module -> - -- | The same module with all Decls checked and elaborated. + -- | The same module with all entries checked and elaborated. TcMonad Module tcModule defs m' = do checkedEntries <- @@ -499,23 +493,23 @@ tcModule defs m' = do return $ m' {moduleEntries = checkedEntries} where d `tcE` m = do - -- Extend the Env per the current Decl before checking - -- subsequent Decls. + -- Extend the Env per the current Entry before checking + -- subsequent entries. x <- tcEntry d case x of AddHint hint -> Env.extendHints hint m - -- Add decls to the Decls to be returned + -- Add decls to the entries to be returned AddCtx decls -> (decls ++) <$> Env.extendCtxsGlobal decls m -- Get all of the defs from imported modules (this is the env to check current module in) importedModules = filter (\x -> ModuleImport (moduleName x) `elem` moduleImports m') defs --- | The Env-delta returned when type-checking a top-level Decl. +-- | The Env-delta returned when type-checking a top-level Entry. data HintOrCtx - = AddHint Sig - | AddCtx [Decl] + = AddHint Decl + | AddCtx [Entry] -- | Check each sort of declaration in a module -tcEntry :: Decl -> TcMonad HintOrCtx +tcEntry :: Entry -> TcMonad HintOrCtx tcEntry (Def n term) = do oldDef <- Env.lookupDef n maybe tc die oldDef @@ -525,22 +519,20 @@ tcEntry (Def n term) = do case lkup of Nothing -> do ty <- inferType term - return $ AddCtx [TypeSig (Sig n Rel ty), Def n term] - Just sig -> + return $ AddCtx [TypeDecl (Decl n Rel ty), Def n term] + Just decl -> let handler (Env.Err ps msg) = throwError $ Env.Err ps (msg $$ msg') msg' = disp [ DS "When checking the term", DD term, - DS "against the signature", - DD sig + DS "against the type", + DD decl ] in do - Env.extendCtx (TypeSig sig) $ checkType term (sigType sig) `catchError` handler - if n `elem` fv term - then return $ AddCtx [TypeSig sig, RecDef n term] - else return $ AddCtx [TypeSig sig, Def n term] + Env.extendCtx (TypeDecl decl) $ checkType term (declType decl) `catchError` handler + return $ AddCtx [TypeDecl decl, Def n term] die term' = Env.extendSourceLocation (unPosFlaky term) term $ Env.err @@ -549,14 +541,14 @@ tcEntry (Def n term) = do DS "Previous definition was", DD term' ] -tcEntry (TypeSig sig) = do - duplicateTypeBindingCheck sig - tcType (sigType sig) - return $ AddHint sig +tcEntry (TypeDecl decl) = do + duplicateTypeBindingCheck decl + tcType (declType decl) + return $ AddHint decl tcEntry (Demote ep) = return (AddCtx [Demote ep]) --- rule Decl_data +-- rule Entry_data tcEntry (Data t (Telescope delta) cs) = do -- Check that the telescope for the datatype definition is well-formed @@ -565,7 +557,7 @@ tcEntry (Data t (Telescope delta) cs) = --- for each data constructor is wellfomed, and elaborate them let elabConstructorDef defn@(ConstructorDef pos d (Telescope tele)) = Env.extendSourceLocation pos defn $ - Env.extendCtx (DataSig t (Telescope delta)) $ + Env.extendCtx (Data t (Telescope delta) []) $ Env.extendCtxTele delta $ do etele <- tcTypeTele tele return (ConstructorDef pos d (Telescope tele)) @@ -576,32 +568,29 @@ tcEntry (Data t (Telescope delta) cs) = Env.err [DS "Datatype definition", DD t, DS "contains duplicated constructors"] -- finally, add the datatype to the env and perform action m return $ AddCtx [Data t (Telescope delta) ecs] -tcEntry (DataSig _ _) = Env.err [DS "internal construct"] -tcEntry (RecDef _ _) = Env.err [DS "internal construct"] - -- | Make sure that we don't have the same name twice in the -- environment. (We don't rename top-level module definitions.) -duplicateTypeBindingCheck :: Sig -> TcMonad () -duplicateTypeBindingCheck sig = do +duplicateTypeBindingCheck :: Decl -> TcMonad () +duplicateTypeBindingCheck decl = do -- Look for existing type bindings ... - let n = sigName sig + let n = declName decl l <- Env.lookupTyMaybe n l' <- Env.lookupHint n -- ... we don't care which, if either are Just. case catMaybes [l, l'] of [] -> return () -- We already have a type in the environment so fail. - sig' : _ -> - let p = unPosFlaky $ sigType sig + decl' : _ -> + let p = unPosFlaky $ declType decl msg = - [ DS "Duplicate type signature", - DD sig, + [ DS "Duplicate type declaration", + DD decl, DS "Previous was", - DD sig' + DD decl' ] - in Env.extendSourceLocation p sig $ Env.err msg + in Env.extendSourceLocation p decl $ Env.err msg ----------------------------------------------------------- -- Checking that pattern matching is exhaustive @@ -695,10 +684,10 @@ relatedPats dc (pc : pats) = -- for simplicity, this function requires that all subpatterns -- are pattern variables. -checkSubPats :: DataConName -> [Decl] -> [[(Pattern, Epsilon)]] -> TcMonad () +checkSubPats :: DataConName -> [Entry] -> [[(Pattern, Epsilon)]] -> TcMonad () checkSubPats dc [] _ = return () checkSubPats dc (Def _ _ : tele) patss = checkSubPats dc tele patss -checkSubPats dc (TypeSig _ : tele) patss +checkSubPats dc (TypeDecl _ : tele) patss | (not . null) patss && not (any null patss) = do let hds = map (fst . head) patss let tls = map tail patss diff --git a/main/pi-forall.cabal b/main/pi-forall.cabal index e7a8c0c..ee29759 100644 --- a/main/pi-forall.cabal +++ b/main/pi-forall.cabal @@ -21,7 +21,7 @@ common shared-properties default-language: GHC2021 ghc-options: - -Wall -fno-warn-unused-matches -fno-warn-orphans -fno-warn-unused-top-binds -fno-warn-unused-imports -fno-warn-name-shadowing + -Wall -fno-warn-unused-matches -fno-warn-orphans -fno-warn-unused-top-binds -fno-warn-unused-imports -fno-warn-name-shadowing -Wno-unrecognised-pragmas default-extensions: DefaultSignatures DeriveAnyClass diff --git a/main/src/Environment.hs b/main/src/Environment.hs index c6f6db2..0f084b5 100644 --- a/main/src/Environment.hs +++ b/main/src/Environment.hs @@ -74,7 +74,7 @@ data Env = Env -- | Type declarations: it's not safe to -- put these in the context until a corresponding term -- has been checked. - hints :: [Sig], + hints :: [Decl], -- | what part of the file we are in (for errors/warnings) sourceLocation :: [SourceLocation] } @@ -96,37 +96,37 @@ instance Disp Env where debugDisp e = vcat [debugDisp decl | decl <- ctx e] -- | Find a name's user supplied type signature. -lookupHint :: (MonadReader Env m) => TName -> m (Maybe Sig) +lookupHint :: (MonadReader Env m) => TName -> m (Maybe Decl) lookupHint v = do hints <- asks hints - return $ listToMaybe [ sig | sig <- hints, v == sigName sig] + return $ listToMaybe [ sig | sig <- hints, v == declName sig] -- | Find a name's type in the context. lookupTyMaybe :: (MonadReader Env m) => TName -> - m (Maybe Sig) + m (Maybe Decl) lookupTyMaybe v = do ctx <- asks ctx return $ go ctx where go [] = Nothing - go (TypeSig sig : ctx) - | v == sigName sig = Just sig + go (TypeDecl sig : ctx) + | v == declName sig = Just sig | otherwise = go ctx {- SOLN EP -} - go (Demote ep : ctx) = demoteSig ep <$> go ctx + go (Demote ep : ctx) = demoteDecl ep <$> go ctx {- STUBWITH -} go (_ : ctx) = go ctx {- SOLN EP -} -demoteSig :: Epsilon -> Sig -> Sig -demoteSig ep s = s { sigEp = min ep (sigEp s) } +demoteDecl :: Epsilon -> Decl -> Decl +demoteDecl ep s = s { declEp = min ep (declEp s) } {- STUBWITH -} -- | Find the type of a name specified in the context -- throwing an error if the name doesn't exist lookupTy :: - TName -> TcMonad Sig + TName -> TcMonad Decl lookupTy v = do x <- lookupTyMaybe v @@ -175,10 +175,6 @@ lookupTCon v = do if v == v' then return (delta, Just cs) else scanGamma g - scanGamma ((DataSig v' delta) : g) = - if v == v' - then return (delta, Nothing) - else scanGamma g scanGamma (_ : g) = scanGamma g -- | Find a data constructor in the context, returns a list of @@ -198,7 +194,6 @@ lookupDConAll v = do Just c -> do more <- scanGamma g return $ (v', (delta, c)) : more - scanGamma ((DataSig v' delta) : g) = scanGamma g scanGamma (_ : g) = scanGamma g -- | Given the name of a data constructor and the type that it should @@ -256,8 +251,8 @@ extendCtxTele :: (MonadReader Env m, MonadIO m, MonadError Err m) => [Entry] -> extendCtxTele [] m = m extendCtxTele (Def x t2 : tele) m = extendCtx (Def x t2) $ extendCtxTele tele m -extendCtxTele (TypeSig sig : tele) m = - extendCtx (TypeSig sig) $ extendCtxTele tele m +extendCtxTele (TypeDecl sig : tele) m = + extendCtx (TypeDecl sig) $ extendCtxTele tele m extendCtxTele ( _ : tele) m = err [DS "Invalid telescope ", DD tele] @@ -293,7 +288,7 @@ getSourceLocation :: MonadReader Env m => m [SourceLocation] getSourceLocation = asks sourceLocation -- | Add a type hint -extendHints :: (MonadReader Env m) => Sig -> m a -> m a +extendHints :: (MonadReader Env m) => Decl -> m a -> m a extendHints h = local (\m@Env {hints = hs} -> m {hints = h : hs}) -- | An error that should be reported to the user diff --git a/main/src/Parser.hs b/main/src/Parser.hs index 840f209..6a2b6d6 100644 --- a/main/src/Parser.hs +++ b/main/src/Parser.hs @@ -104,13 +104,13 @@ Optional components in this BNF are marked with < > A -> B - Get parsed as (x:A) -> B, with an internal name for x + Get parsed as (_:A) -> B, with a wildcard name for the binder - Nondependent product types, like: A * B - Get parsed as { x:A | B }, with an internal name for x + Get parsed as { _:A | B }, with a wildcard name for the binder - You can collapse lambdas, like: @@ -126,6 +126,12 @@ Optional components in this BNF are marked with < > -} + +-- | Default name (for parsing 'A -> B' as '(_:A) -> B') +wildcardName :: TName +wildcardName = Unbound.string2Name "_" + + liftError :: (MonadError e m) => Either e a -> m a liftError (Left e) = throwError e liftError (Right a) = return a @@ -351,13 +357,13 @@ telebindings = many teleBinding annot = do (x,ty) <- try ((,) <$> varOrWildcard <*> (colon >> expr)) <|> ((,) <$> (Unbound.fresh wildcardName) <*> expr) - return (TypeSig (Sig x Rel ty):) + return (TypeDecl (Decl x Rel ty):) imp = do v <- varOrWildcard colon t <- expr - return (TypeSig (Sig v Irr t):) + return (TypeDecl (Decl v Irr t):) equal = do v <- variable @@ -376,8 +382,8 @@ telebindings = many teleBinding --- Top level declarations --- -decl,sigDef,valDef :: LParser Entry -decl = {- SOLN DATA -} try dataDef <|> {- STUBWITH -} sigDef <|> valDef +decl,declDef,valDef :: LParser Entry +decl = {- SOLN DATA -} try dataDef <|> {- STUBWITH -} declDef <|> valDef {- SOLN DATA -} -- datatype declarations. @@ -407,10 +413,10 @@ constructorDef = do "Constructor" {- STUBWITH -} -sigDef = do +declDef = do n <- try (variable >>= \v -> colon >> return v) ty <- expr - return (mkSig n ty) + return (mkDecl n ty) valDef = do n <- try (do {n <- variable; reservedOp "="; return n}) diff --git a/main/src/PrettyPrint.hs b/main/src/PrettyPrint.hs index 2cb3fa6..1e9a2e5 100644 --- a/main/src/PrettyPrint.hs +++ b/main/src/PrettyPrint.hs @@ -124,7 +124,7 @@ instance Disp Entry instance Disp [Entry] -instance Disp Sig +instance Disp Decl {- SOLN EP -} @@ -168,10 +168,10 @@ instance Display [Entry] where dd <- mapM display ds pure $ PP.vcat dd -instance Display Sig where - display sig = do - dn <- display (sigName sig) - dt <- display (sigType sig) +instance Display Decl where + display decl = do + dn <- display (declName decl) + dt <- display (declType decl) pure $ dn <+> PP.text ":" <+> dt instance Display Entry where @@ -179,7 +179,7 @@ instance Display Entry where dn <- display n dt <- display term pure $ dn <+> PP.text "=" <+> dt - display (TypeSig sig) = display sig + display (TypeDecl decl) = display decl {- SOLN EP -} display (Demote ep) = return mempty {- STUBWITH -} {- SOLN DATA -} @@ -195,12 +195,6 @@ instance Display Entry where ) 2 (PP.vcat dc) - display (DataSig t delta) = do - dt <- display t - dd <- display delta - - pure $ PP.text "data" <+> dt <+> dd <+> PP.colon - <+> PP.text "Type" {- STUBWITH -} {- SOLN DATA -} diff --git a/main/src/Syntax.hs b/main/src/Syntax.hs index 9fc205e..dad7cc8 100644 --- a/main/src/Syntax.hs +++ b/main/src/Syntax.hs @@ -158,32 +158,27 @@ newtype ModuleImport = ModuleImport ModuleName deriving (Show, Eq, Generic, Typeable) deriving anyclass (Unbound.Alpha) --- | A type declaration (or type signature) -data Sig = Sig {sigName :: TName {- SOLN EP -} , sigEp :: Epsilon {- STUBWITH -} , sigType :: Type} +-- | A type declaration (or type declnature) +data Decl = Decl {declName :: TName {- SOLN EP -} , declEp :: Epsilon {- STUBWITH -} , declType :: Type} deriving (Show, Generic, Typeable, Unbound.Alpha, Unbound.Subst Term) -- | Declare the type of a term -mkSig :: TName -> Type -> Entry -mkSig n ty = TypeSig (Sig n {- SOLN EP -} Rel {- STUBWITH -} ty) +mkDecl :: TName -> Type -> Entry +mkDecl n ty = TypeDecl (Decl n {- SOLN EP -} Rel {- STUBWITH -} ty) -- | Entries are the components of modules data Entry - = -- | Declaration for the type of a term - TypeSig Sig - | -- | The definition of a particular name, must + = -- | Declaration for the type of a term 'x : A' + TypeDecl Decl + | -- | The definition of a particular name, must 'x = a' -- already have a type declaration in scope Def TName Term {- SOLN EP -} -- | Adjust the context for relevance checking | Demote Epsilon {- STUBWITH -} {- SOLN DATA -} - | -- | Declaration for a datatype including all of - -- its data constructors + | -- | Datatype definition (must be at the module level) Data TyConName Telescope [ConstructorDef] - | -- | An abstract view of a datatype. Does - -- not include any information about its data - -- constructors - DataSig TyConName Telescope {- STUBWITH -} deriving (Show, Generic, Typeable) deriving anyclass (Unbound.Alpha, Unbound.Subst Term) @@ -279,12 +274,12 @@ preludeDataDecls = unitConstructorDef = ConstructorDef internalPos litUnitName (Telescope []) -- Sigma-type - sigmaTele = Telescope [TypeSig sigA, TypeSig sigB] - prodConstructorDef = ConstructorDef internalPos prodName (Telescope [TypeSig sigX, TypeSig sigY]) - sigA = Sig aName Rel TyType - sigB = Sig bName Rel (TyPi Rel (Var aName) (Unbound.bind xName TyType)) - sigX = Sig xName Rel (Var aName) - sigY = Sig yName Rel (App (Var bName) (Arg Rel (Var xName))) + sigmaTele = Telescope [TypeDecl declA, TypeDecl declB] + prodConstructorDef = ConstructorDef internalPos prodName (Telescope [TypeDecl declX, TypeDecl declY]) + declA = Decl aName Rel TyType + declB = Decl bName Rel (TyPi Rel (Var aName) (Unbound.bind xName TyType)) + declX = Decl xName Rel (Var aName) + declY = Decl yName Rel (App (Var bName) (Arg Rel (Var xName))) aName = Unbound.string2Name "a" bName = Unbound.string2Name "b" @@ -297,9 +292,12 @@ preludeDataDecls = -- * Auxiliary functions on syntax ----------------------------------------- --- | Default name (for parsing 'A -> B' as '(_:A) -> B') -wildcardName :: TName -wildcardName = Unbound.string2Name "_" + +-- | Remove source positions and type annotations from the top level of a term +strip :: Term -> Term +strip (Pos _ tm) = strip tm +strip (Ann tm _) = strip tm +strip tm = tm -- | Partial inverse of Pos unPos :: Term -> Maybe SourcePos @@ -311,6 +309,7 @@ unPosFlaky :: Term -> SourcePos unPosFlaky t = fromMaybe (newPos "unknown location" 0 0) (unPos t) + ----------------------------------------- -- * Unbound library ----------------------------------------- @@ -354,24 +353,22 @@ unbind = Unbound.unbind -- unbind :: (Alpha p, Alpha t, Fresh m) => Bind p t -> m (p, t) -- For Terms, we'd like Alpha equivalence to ignore --- source positions and type annotations. --- We can add these special cases to the definition of `aeq'` --- and then defer all other cases to the generic version of --- the function (Unbound.gaeq). +-- source positions and type annotations. So we make sure to +-- remove them before calling the generic operation. instance Unbound.Alpha Term where aeq' :: Unbound.AlphaCtx -> Term -> Term -> Bool - aeq' ctx (Ann a _) b = Unbound.aeq' ctx a b - aeq' ctx a (Ann b _) = Unbound.aeq' ctx a b - aeq' ctx (Pos _ a) b = Unbound.aeq' ctx a b - aeq' ctx a (Pos _ b) = Unbound.aeq' ctx a b - aeq' ctx a b = (Unbound.gaeq ctx `on` from) a b + aeq' ctx a b = (Unbound.gaeq ctx `on` from) (strip a) (strip b) + -- For example, all occurrences of annotations and source positions -- are ignored by this definition. --- '(Bool : Type)' is alpha-equivalent to 'Type' --- >>> aeq (Pos internalPos (Ann TyBool Type)) TyBool +-- '(Bool : Type)' is alpha-equivalent to 'Bool' +-- >>> aeq (Ann TyBool TyType) TyBool + +-- '(Bool, Bool:Type)' is alpha-equivalent to (Bool, Bool) +-- >>> aeq (Prod TyBool (Ann TyBool TyType)) (Prod TyBool TyBool) -- At the same time, the generic operation equates terms that differ only @@ -472,4 +469,4 @@ instance Unbound.Alpha ConstructorNames where freshen' _ x = return (x, mempty) lfreshen' _ x cont = cont x mempty acompare' _ _ _ = EQ -{- STUBWITH -} \ No newline at end of file +{- STUBWITH -} diff --git a/main/src/TypeCheck.hs b/main/src/TypeCheck.hs index a943124..a109274 100644 --- a/main/src/TypeCheck.hs +++ b/main/src/TypeCheck.hs @@ -1,7 +1,6 @@ {- pi-forall -} -- | The main routines for type-checking -{-# OPTIONS_GHC -Wno-unrecognised-pragmas #-} {-# HLINT ignore "Use forM_" #-} module TypeCheck (tcModules, inferType, checkType) where @@ -27,327 +26,324 @@ import Unbound.Generics.LocallyNameless.Internal.Fold qualified as Unbound import Unbound.Generics.LocallyNameless.Unsafe (unsafeUnbind) {- STUBWITH -} --- | Infer/synthesize the type of a term -inferType :: Term -> TcMonad Type -inferType t = tcTerm t Nothing --- | Check that the given term has the expected type -checkType :: Term -> Type -> TcMonad () -checkType tm (Pos _ ty) = checkType tm ty -- ignore source positions/annotations -checkType tm (Ann ty _) = checkType tm ty -checkType tm ty = {- SOLN EQUAL -} do - nf <- Equal.whnf ty - void $ tcTerm tm (Just nf) -{- STUBWITH void $ tcTerm tm (Just ty) -} - - --- | Make sure that the term is a "type" (i.e. that it has type 'Type') -tcType :: Term -> TcMonad () -tcType tm = void $ {- SOLN EP -} Env.withStage Irr $ {- STUBWITH -}checkType tm TyType --------------------------------------------------------------------- --- | Combined type checking/inference function --- The second argument is 'Just expectedType' in checking mode and 'Nothing' in inference mode --- In either case, this function returns the type of the term -tcTerm :: Term -> Maybe Type -> TcMonad Type --- i-var -tcTerm t@(Var x) Nothing = do - sig <- Env.lookupTy x {- SOLN EP -} - -- make sure the variable is accessible - Env.checkStage (sigEp sig) {- STUBWITH -} - return (sigType sig) --- i-type -tcTerm TyType Nothing = return TyType --- i-pi -tcTerm (TyPi {- SOLN EP -} ep {- STUBWITH -}tyA bnd) Nothing = do - (x, tyB) <- Unbound.unbind bnd - tcType tyA - Env.extendCtx {- SOLN EP -} (TypeSig (Sig x ep tyA)){- STUBWITH (mkSig x tyA) -} (tcType tyB) - return TyType --- c-lam: check the type of a function -tcTerm (Lam {- SOLN EP -} ep1 {- STUBWITH -} bnd) (Just (TyPi {- SOLN EP -} ep2 {- STUBWITH -}tyA bnd2)) = do - -- unbind the variables in the lambda expression and pi type - (x, body,_,tyB) <- Unbound.unbind2Plus bnd bnd2 -{- SOLN EP -} -- epsilons should match up - unless (ep1 == ep2) $ Env.err [DS "In function definition, expected", DD ep2, DS "parameter", DD x, - DS "but found", DD ep1, DS "instead."] {- STUBWITH -} - -- check the type of the body of the lambda expression - Env.extendCtx {- SOLN EP -} (TypeSig (Sig x ep1 tyA)){- STUBWITH (mkSig x tyA) -} (checkType body tyB) - return (TyPi {- SOLN EP -} ep1{- STUBWITH -} tyA bnd2) -tcTerm (Lam {- SOLN EP -} _ {- STUBWITH -}_) (Just nf) = - Env.err [DS "Lambda expression should have a function type, not", DD nf] --- i-app -tcTerm (App t1 t2) Nothing = do - ty1 <- inferType t1 +-- | Infer/synthesize the type of a term +inferType :: Term -> TcMonad Type +inferType t = case t of + -- i-var + (Var x) -> do + decl <- Env.lookupTy x {- SOLN EP -} + -- make sure the variable is accessible + Env.checkStage (declEp decl) {- STUBWITH -} + return (declType decl) + + -- i-type + TyType -> return TyType + + -- i-pi + (TyPi {- SOLN EP -} ep {- STUBWITH -}tyA bnd) -> do + (x, tyB) <- Unbound.unbind bnd + tcType tyA + Env.extendCtx {- SOLN EP -} (TypeDecl (Decl x ep tyA)){- STUBWITH (mkDecl x tyA) -} (tcType tyB) + return TyType + + -- i-app + (App t1 t2) -> do + ty1 <- inferType t1 {- SOLN EQUAL -} - let ensurePi = Equal.ensurePi - {- STUBWITH - - let ensurePi :: Type -> TcMonad (Type, Unbound.Bind TName Type) - ensurePi (Ann a _) = ensurePi a - ensurePi (Pos _ a) = ensurePi a - ensurePi (TyPi tyA bnd) = return (tyA,bnd) - ensurePi ty = Env.err [DS "Expected a function type but found ", DD ty] -} + let ensurePi = Equal.ensurePi + {- STUBWITH + + let ensurePi :: Type -> TcMonad (Type, Unbound.Bind TName Type) + ensurePi (Pos _ ty) = ensurePi ty + ensurePi (Ann tm _) = ensurePi tm + ensurePi (TyPi tyA bnd) = return (tyA,bnd) + ensurePi ty = Env.err [DS "Expected a function type but found ", DD ty] -} {- SOLN EP -} - (ep1, tyA, bnd) <- ensurePi ty1 - unless (ep1 == argEp t2) $ Env.err - [DS "In application, expected", DD ep1, DS "argument but found", - DD t2, DS "instead." ] - -- if the argument is Irrelevant, resurrect the context - (if ep1 == Irr then Env.extendCtx (Demote Rel) else id) $ - checkType (unArg t2) tyA - return (Unbound.instantiate bnd [unArg t2]) - {- STUBWITH - - (tyA,bnd) <- ensurePi ty1 - checkType t2 tyA - return (Unbound.instantiate bnd [t2]) -} - --- i-ann -tcTerm (Ann tm ty) Nothing = do - tcType ty - checkType tm ty - return ty + (ep1, tyA, bnd) <- ensurePi ty1 + unless (ep1 == argEp t2) $ Env.err + [DS "In application, expected", DD ep1, DS "argument but found", + DD t2, DS "instead." ] + -- if the argument is Irrelevant, resurrect the context + (if ep1 == Irr then Env.extendCtx (Demote Rel) else id) $ + checkType (unArg t2) tyA + return (Unbound.instantiate bnd [unArg t2]) + {- STUBWITH + + (tyA,bnd) <- ensurePi ty1 + checkType t2 tyA + return (Unbound.instantiate bnd [t2]) -} + + -- i-ann + (Ann tm ty) -> do + tcType ty + checkType tm ty + return ty --- practicalities --- remember the current position in the type checking monad -tcTerm (Pos p tm) mTy = - Env.extendSourceLocation p tm $ tcTerm tm mTy --- ignore term, just return type annotation -tcTerm TrustMe (Just ty) = return ty + -- Practicalities + -- remember the current position in the type checking monad + (Pos p tm) -> + Env.extendSourceLocation p tm $ inferType tm --- i-unit -tcTerm TyUnit Nothing = return TyType -tcTerm LitUnit Nothing = return TyUnit - --- i-bool -tcTerm TyBool Nothing = {- SOLN HW -} return TyType -{- STUBWITH Env.err [DS "unimplemented"] -} - --- i-true/false -tcTerm (LitBool b) Nothing = {- SOLN HW -} do - return TyBool -{- STUBWITH Env.err [DS "unimplemented"] -} - --- c-if -tcTerm t@(If t1 t2 t3) mty = {- SOLN HW -} do - case mty of - Just ty -> do - checkType t1 TyBool - dtrue <- Equal.unify [] t1 (LitBool True) - dfalse <- Equal.unify [] t1 (LitBool False) - Env.extendCtxs dtrue $ checkType t2 ty - Env.extendCtxs dfalse $ checkType t3 ty - return ty - Nothing -> do + -- Extensions to the core language + -- i-unit + TyUnit -> return TyType + LitUnit -> return TyUnit + + -- i-bool + TyBool -> {- SOLN HW -} return TyType {- STUBWITH Env.err [DS "unimplemented"] -} + + -- i-true/false + (LitBool b) -> {- SOLN HW -} return TyBool {- STUBWITH Env.err [DS "unimplemented"] -} + + -- i-if + (If t1 t2 t3) -> {- SOLN HW -} do checkType t1 TyBool ty <- inferType t2 checkType t3 ty - return ty -{- STUBWITH Env.err [DS "unimplemented"] -} - -tcTerm (Let rhs bnd) mty = {- SOLN HW -} do - (x, body) <- Unbound.unbind bnd - aty <- inferType rhs - ty <- Env.extendCtxs [mkSig x aty, Def x rhs] $ - tcTerm body mty - case mty of - Just _ -> return ty - Nothing -> return $ Unbound.subst x rhs ty -{- STUBWITH Env.err [DS "unimplemented"] -} + return ty {- STUBWITH Env.err [DS "unimplemented"] -} +{- SOLN EQUAL -} + -- i-eq + (TyEq a b) -> do + aTy <- inferType a + checkType b aTy + return TyType {- STUBWITH -} + + -- i-sigma + (TySigma tyA bnd) -> {- SOLN EQUAL -} do + (x, tyB) <- Unbound.unbind bnd + tcType tyA + Env.extendCtx (mkDecl x tyA) $ tcType tyB + return TyType {- STUBWITH Env.err [DS "unimplemented"] -} + {- SOLN DATA -} --- TyType constructor application -tcTerm (TyCon c params) Nothing = do - (Telescope delta, _) <- Env.lookupTCon c - unless (length params == length delta) $ - Env.err - [ DS "Datatype constructor", - DD c, - DS $ - "should have " ++ show (length delta) - ++ "parameters, but was given", - DD (length params) - ] - tcArgTele params delta - return TyType - --- Data constructor application --- we don't know the expected type, so see if there --- is only one datacon of that name that takes no --- parameters -tcTerm t@(DataCon c args) Nothing = do - matches <- Env.lookupDConAll c - case matches of - [(tname, (Telescope [], ConstructorDef _ _ (Telescope deltai)))] -> do - let numArgs = length deltai - unless (length args == numArgs) $ - Env.err - [ DS "Constructor", - DS c, - DS "should have", - DD numArgs, - DS "data arguments, but was given", - DD (length args), - DS "arguments." - ] - tcArgTele args deltai - return $ TyCon tname [] - - [_] -> + -- Type constructor application + (TyCon c params) -> do + (Telescope delta, _) <- Env.lookupTCon c + unless (length params == length delta) $ Env.err - [ DS "Cannot infer the parameters to data constructors.", - DS "Add an annotation." + [ DS "Datatype constructor", + DD c, + DS $ + "should have " ++ show (length delta) + ++ "parameters, but was given", + DD (length params) ] - _ -> Env.err [DS "Ambiguous data constructor", DS c] - --- we know the expected type of the data constructor --- so look up its type in the context -tcTerm t@(DataCon c args) (Just ty) = do - case ty of - (TyCon tname params) -> do - (Telescope delta, Telescope deltai) <- Env.lookupDCon c tname - let isTypeSig :: Entry -> Bool - isTypeSig (TypeSig _) = True - isTypeSig _ = False - let numArgs = length (filter isTypeSig deltai) - unless (length args == numArgs) $ + tcArgTele params delta + return TyType + + -- Data constructor application + -- we don't know the expected type, so see if there + -- is only one datacon of that name that takes no + -- parameters + (DataCon c args) -> do + matches <- Env.lookupDConAll c + case matches of + [(tname, (Telescope [], ConstructorDef _ _ (Telescope deltai)))] -> do + let numArgs = length deltai + unless (length args == numArgs) $ + Env.err + [ DS "Constructor", + DS c, + DS "should have", + DD numArgs, + DS "data arguments, but was given", + DD (length args), + DS "arguments." + ] + tcArgTele args deltai + return $ TyCon tname [] + [_] -> Env.err - [ DS "Constructor", - DS c, - DS "should have", - DD numArgs, - DS "data arguments, but was given", - DD (length args), - DS "arguments." + [ DS "Cannot infer the parameters to data constructors.", + DS "Add an annotation." ] - newTele <- substTele delta params deltai - tcArgTele args newTele - return ty - _ -> - Env.err [DS "Unexpected type", DD ty, DS "for data constructor", DD t] - --- Must have an annotation for Case -tcTerm t@(Case scrut alts) (Just ty) = do - sty <- inferType scrut - scrut' <- Equal.whnf scrut - (c, args) <- Equal.ensureTCon sty - let checkAlt (Match bnd) = do - (pat, body) <- Unbound.unbind bnd - -- add variables from pattern to context - -- could fail if branch is in-accessible - decls <- declarePat pat Rel (TyCon c args) - -- add defs to the contents from scrut = pat - -- could fail if branch is in-accessible - decls' <- Equal.unify [] scrut' (pat2Term pat) - Env.extendCtxs (decls ++ decls') $ checkType body ty - {- STUBWITH -} + _ -> Env.err [DS "Ambiguous data constructor", DS c] {- STUBWITH -} + + -- cannot synthesize the type of the term + tm -> + Env.err [DS "Must have a type for", DD tm] + + +------------------------------------------------------------------------- + +-- | Make sure that the term is a "type" (i.e. that it has type 'Type') +tcType :: Term -> TcMonad () +tcType tm = {- SOLN EP -} Env.withStage Irr $ {- STUBWITH -} checkType tm TyType + +------------------------------------------------------------------------- +-- | Check that the given term has the expected type +checkType :: Term -> Type -> TcMonad () +checkType tm ty' = do +{- SOLN EQUAL -} + ty <- Equal.whnf ty' {- STUBWITH let ty = strip ty' -- ignore source positions/annotations -} + case tm of + -- c-lam: check the type of a function + (Lam {- SOLN EP -} ep1 {- STUBWITH -} bnd) -> case ty of + (TyPi {- SOLN EP -} ep2 {- STUBWITH -}tyA bnd2) -> do + -- unbind the variables in the lambda expression and pi type + (x, body,_,tyB) <- Unbound.unbind2Plus bnd bnd2 +{- SOLN EP -} -- epsilons should match up + unless (ep1 == ep2) $ Env.err [DS "In function definition, expected", DD ep2, DS "parameter", DD x, + DS "but found", DD ep1, DS "instead."] {- STUBWITH -} + -- check the type of the body of the lambda expression + Env.extendCtx {- SOLN EP -} (TypeDecl (Decl x ep1 tyA)){- STUBWITH (mkDecl x tyA) -} (checkType body tyB) + _ -> Env.err [DS "Lambda expression should have a function type, not", DD ty] + + -- Practicalities + (Pos p tm) -> + Env.extendSourceLocation p tm $ checkType tm ty + + TrustMe -> return () + + PrintMe -> do + gamma <- Env.getLocalCtx + Env.warn [DS "Unmet obligation.\nContext:", DD gamma, + DS "\nGoal:", DD ty] + + -- Extensions to the core language + -- c-if + (If t1 t2 t3) -> {- SOLN HW -} do + checkType t1 TyBool + dtrue <- Equal.unify [] t1 (LitBool True) + dfalse <- Equal.unify [] t1 (LitBool False) + Env.extendCtxs dtrue $ checkType t2 ty + Env.extendCtxs dfalse $ checkType t3 ty {- STUBWITH Env.err [DS "unimplemented"] -} + + -- c-let + (Let rhs bnd) -> {- SOLN HW -} do + (x, body) <- Unbound.unbind bnd + aty <- inferType rhs + Env.extendCtxs [mkDecl x aty, Def x rhs] $ + checkType body ty {- STUBWITH Env.err [DS "unimplemented"] -} {- SOLN DATA -} - return () - let pats = map (\(Match bnd) -> fst (unsafeUnbind bnd)) alts - mapM_ checkAlt alts - exhaustivityCheck scrut' sty pats - return ty -{- STUBWITH -} -{- SOLN EQUAL -} -tcTerm (TyEq a b) Nothing = do - aTy <- inferType a - checkType b aTy - return TyType -tcTerm Refl (Just ty@(TyEq a b)) = do - Equal.equate a b - return ty -tcTerm Refl (Just ty) = - Env.err [DS "Refl annotated with", DD ty] -tcTerm t@(Subst a b) (Just ty) = do - -- infer the type of the proof 'b' - tp <- inferType b - -- make sure that it is an equality between m and n - (m, n) <- Equal.ensureTyEq tp - -- if either side is a variable, add a definition to the context - edecl <- Equal.unify [] m n - -- if proof is a variable, add a definition to the context - pdecl <- Equal.unify [] b Refl - _ <- Env.extendCtxs (edecl ++ pdecl) $ checkType a ty - return ty -tcTerm t@(Contra p) (Just ty) = do - ty' <- inferType p - (a, b) <- Equal.ensureTyEq ty' - a' <- Equal.whnf a - b' <- Equal.whnf b - case (a', b') of + -- c-data + -- we know the expected type of the data constructor + -- so look up its type in the context + (DataCon c args) -> do + case ty of + (TyCon tname params) -> do + (Telescope delta, Telescope deltai) <- Env.lookupDCon c tname + let isTypeDecl :: Entry -> Bool + isTypeDecl (TypeDecl _) = True + isTypeDecl _ = False + let numArgs = length (filter isTypeDecl deltai) + unless (length args == numArgs) $ + Env.err + [ DS "Constructor", + DS c, + DS "should have", + DD numArgs, + DS "data arguments, but was given", + DD (length args), + DS "arguments." + ] + newTele <- substTele delta params deltai + tcArgTele args newTele + _ -> + Env.err [DS "Unexpected type", DD ty, DS "for data constructor", DD tm] + + (Case scrut alts) -> do + sty <- inferType scrut + scrut' <- Equal.whnf scrut + (c, args) <- Equal.ensureTCon sty + let checkAlt (Match bnd) = do + (pat, body) <- Unbound.unbind bnd + -- add variables from pattern to context + -- could fail if branch is in-accessible + decls <- declarePat pat Rel (TyCon c args) + -- add defs to the contents from scrut = pat + -- could fail if branch is in-accessible + decls' <- Equal.unify [] scrut' (pat2Term pat) + Env.extendCtxs (decls ++ decls') $ checkType body ty + + return () + let pats = map (\(Match bnd) -> fst (unsafeUnbind bnd)) alts + mapM_ checkAlt alts + exhaustivityCheck scrut' sty pats {- STUBWITH -} +{- SOLN EQUAL -} + -- c-refl + Refl -> case ty of + (TyEq a b) -> Equal.equate a b + _ -> Env.err [DS "Refl annotated with", DD ty] + -- c-subst + (Subst a b) -> do + -- infer the type of the proof 'b' + tp <- inferType b + -- make sure that it is an equality between m and n + (m, n) <- Equal.ensureTyEq tp + -- if either side is a variable, add a definition to the context + edecl <- Equal.unify [] m n + -- if proof is a variable, add a definition to the context + pdecl <- Equal.unify [] b Refl + Env.extendCtxs (edecl ++ pdecl) $ checkType a ty + -- c-contra + (Contra p) -> do + ty' <- inferType p + (a, b) <- Equal.ensureTyEq ty' + a' <- Equal.whnf a + b' <- Equal.whnf b + case (a', b') of + {- STUBWITH -} {- SOLN DATA -} - (DataCon da _, DataCon db _) - | da /= db -> - return ty - {- STUBWITH -} + (DataCon da _, DataCon db _) + | da /= db -> + return () + {- STUBWITH -} {- SOLN EQUAL -} - (LitBool b1, LitBool b2) - | b1 /= b2 -> - return ty - (_, _) -> - Env.err - [ DS "I can't tell that", - DD a, - DS "and", - DD b, - DS "are contradictory" - ] -{- STUBWITH -} - -tcTerm t@(TySigma tyA bnd) Nothing = {- SOLN EQUAL -} do - (x, tyB) <- Unbound.unbind bnd - tcType tyA - Env.extendCtx (mkSig x tyA) $ tcType tyB - return TyType -{- STUBWITH Env.err [DS "unimplemented"] -} - -tcTerm t@(Prod a b) (Just ty) = {- SOLN EQUAL -} do - case ty of - (TySigma tyA bnd) -> do - (x, tyB) <- Unbound.unbind bnd - checkType a tyA - Env.extendCtxs [mkSig x tyA, Def x a] $ checkType b tyB - return (TySigma tyA (Unbound.bind x tyB)) - _ -> - Env.err - [ DS "Products must have Sigma Type", - DD ty, - DS "found instead" - ] -{- STUBWITH Env.err [DS "unimplemented"] -} - -tcTerm t@(LetPair p bnd) (Just ty) = {- SOLN EQUAL -} do - ((x, y), body) <- Unbound.unbind bnd - pty <- inferType p - pty' <- Equal.whnf pty - case pty' of - TySigma tyA bnd' -> do - let tyB = Unbound.instantiate bnd' [Var x] - decl <- Equal.unify [] p (Prod (Var x) (Var y)) - Env.extendCtxs ([mkSig x tyA, mkSig y tyB] ++ decl) $ - checkType body ty - return ty - _ -> Env.err [DS "Scrutinee of LetPair must have Sigma type"] -{- STUBWITH Env.err [DS "unimplemented"] -} - -tcTerm PrintMe (Just ty) = do - gamma <- Env.getLocalCtx - Env.warn [DS "Unmet obligation.\nContext:", DD gamma, - DS "\nGoal:", DD ty] - return ty - --- c-infer -tcTerm tm (Just ty) = do - ty' <- inferType tm + (LitBool b1, LitBool b2) + | b1 /= b2 -> + return () + (_, _) -> + Env.err + [ DS "I can't tell that", + DD a, + DS "and", + DD b, + DS "are contradictory" + ] + {- STUBWITH -} + -- c-prod + (Prod a b) -> {- SOLN EQUAL -} do + case ty of + (TySigma tyA bnd) -> do + (x, tyB) <- Unbound.unbind bnd + checkType a tyA + Env.extendCtxs [mkDecl x tyA, Def x a] $ checkType b tyB + _ -> + Env.err + [ DS "Products must have Sigma Type", + DD ty, + DS "found instead" + ] + {- STUBWITH Env.err [DS "unimplemented"] -} + + -- c-letpair + (LetPair p bnd) -> {- SOLN EQUAL -} do + ((x, y), body) <- Unbound.unbind bnd + pty <- inferType p + pty' <- Equal.whnf pty + case pty' of + TySigma tyA bnd' -> do + let tyB = Unbound.instantiate bnd' [Var x] + decl <- Equal.unify [] p (Prod (Var x) (Var y)) + Env.extendCtxs ([mkDecl x tyA, mkDecl y tyB] ++ decl) $ + checkType body ty + _ -> Env.err [DS "Scrutinee of LetPair must have Sigma type"] + {- STUBWITH Env.err [DS "unimplemented"] -} + + + -- c-infer + tm -> do + ty' <- inferType tm {- SOLN EQUAL -} - Equal.equate ty' ty -{- STUBWITH unless (Unbound.aeq ty' ty) $ Env.err [DS "Types don't match", DD ty, DS "and", DD ty'] -} - return ty' + Equal.equate ty' ty + {- STUBWITH unless (Unbound.aeq ty' ty) $ Env.err [DS "Types don't match", DD ty, DS "and", DD ty'] -} -tcTerm tm Nothing = - Env.err [DS "Must have a type annotation to check", DD tm] {- SOLN HW -} --------------------------------------------------------------------- @@ -376,7 +372,7 @@ tcArgTele args (Def x ty : tele) = do -- ensure that the equality is provable at this point Equal.equate (Var x) ty tcArgTele args tele -tcArgTele (Arg ep1 tm : terms) (TypeSig (Sig x ep2 ty) : tele) +tcArgTele (Arg ep1 tm : terms) (TypeDecl (Decl x ep2 ty) : tele) | ep1 == ep2 = do Env.withStage ep1 $ checkType tm ty tele' <- doSubst [(x, tm)] tele @@ -403,7 +399,7 @@ substTele :: [Entry] -> [Arg] -> [Entry] -> TcMonad [Entry] substTele tele args = doSubst (mkSubst tele (map unArg args)) where mkSubst [] [] = [] - mkSubst (TypeSig (Sig x Rel _) : tele') (tm : tms) = + mkSubst (TypeDecl (Decl x Rel _) : tele') (tm : tms) = (x, tm) : mkSubst tele' tms mkSubst _ _ = error "Internal error: substTele given illegal arguments" @@ -419,11 +415,11 @@ doSubst ss (Def x ty : tele') = do decls1 <- Equal.unify [] tx' ty' decls2 <- Env.extendCtxs decls1 (doSubst ss tele') return $ decls1 ++ decls2 -doSubst ss (TypeSig sig : tele') = do - tynf <- Equal.whnf (Unbound.substs ss (sigType sig)) - let sig' = sig{sigType = tynf} +doSubst ss (TypeDecl decl : tele') = do + tynf <- Equal.whnf (Unbound.substs ss (declType decl)) + let decl' = decl{declType = tynf} tele'' <- doSubst ss tele' - return $ TypeSig sig' : tele'' + return $ TypeDecl decl' : tele'' doSubst _ tele = Env.err [DS "Invalid telescope", DD tele] @@ -431,7 +427,7 @@ doSubst _ tele = -- | Create a binding for each of the variables in the pattern declarePat :: Pattern -> Epsilon -> Type -> TcMonad [Entry] -declarePat (PatVar x) ep ty = return [TypeSig (Sig x ep ty)] +declarePat (PatVar x) ep ty = return [TypeDecl (Decl x ep ty)] declarePat (PatCon dc pats) Rel ty = do (tc,params) <- Equal.ensureTCon ty (Telescope delta, Telescope deltai) <- Env.lookupDCon dc tc @@ -447,7 +443,7 @@ declarePats dc pats (Def x ty : tele) = do let ds1 = [Def x ty] ds2 <- Env.extendCtxs ds1 $ declarePats dc pats tele return (ds1 ++ ds2) -declarePats dc ((pat, _) : pats) (TypeSig (Sig x ep ty) : tele) = do +declarePats dc ((pat, _) : pats) (TypeDecl (Decl x ep ty) : tele) = do ds1 <- declarePat pat ep ty let tm = pat2Term pat tele' <- doSubst [(x,tm)] tele @@ -478,9 +474,9 @@ tcTypeTele (Def x tm : tl) = do Env.withStage Irr $ checkType tm ty1 let decls = [Def x tm] Env.extendCtxs decls $ tcTypeTele tl -tcTypeTele (TypeSig sig : tl) = do - tcType (sigType sig) - Env.extendCtx (TypeSig sig) $ tcTypeTele tl +tcTypeTele (TypeDecl decl : tl) = do + tcType (declType decl) + Env.extendCtx (TypeDecl decl) $ tcTypeTele tl tcTypeTele tele = Env.err [DS "Invalid telescope: ", DD tele] @@ -534,7 +530,7 @@ tcModule defs m' = do -- | The Env-delta returned when type-checking a top-level Entry. data HintOrCtx - = AddHint Sig + = AddHint Decl | AddCtx [Entry] -- | Check each sort of declaration in a module @@ -548,20 +544,20 @@ tcEntry (Def n term) = do case lkup of Nothing -> do ty <- inferType term - return $ AddCtx [TypeSig (Sig n {- SOLN EP -} Rel{- STUBWITH -} ty), Def n term] - Just sig -> + return $ AddCtx [TypeDecl (Decl n {- SOLN EP -} Rel{- STUBWITH -} ty), Def n term] + Just decl -> let handler (Env.Err ps msg) = throwError $ Env.Err ps (msg $$ msg') msg' = disp [ DS "When checking the term", DD term, - DS "against the signature", - DD sig + DS "against the type", + DD decl ] in do - Env.extendCtx (TypeSig sig) $ checkType term (sigType sig) `catchError` handler - return $ AddCtx [TypeSig sig, Def n term] + Env.extendCtx (TypeDecl decl) $ checkType term (declType decl) `catchError` handler + return $ AddCtx [TypeDecl decl, Def n term] die term' = Env.extendSourceLocation (unPosFlaky term) term $ Env.err @@ -570,10 +566,10 @@ tcEntry (Def n term) = do DS "Previous definition was", DD term' ] -tcEntry (TypeSig sig) = do - duplicateTypeBindingCheck sig - tcType (sigType sig) - return $ AddHint sig +tcEntry (TypeDecl decl) = do + duplicateTypeBindingCheck decl + tcType (declType decl) + return $ AddHint decl {- SOLN EP -} tcEntry (Demote ep) = return (AddCtx [Demote ep]) {- STUBWITH -} @@ -588,7 +584,7 @@ tcEntry (Data t (Telescope delta) cs) = --- for each data constructor is wellfomed, and elaborate them let elabConstructorDef defn@(ConstructorDef pos d (Telescope tele)) = Env.extendSourceLocation pos defn $ - Env.extendCtx (DataSig t (Telescope delta)) $ + Env.extendCtx (Data t (Telescope delta) []) $ Env.extendCtxTele delta $ do etele <- tcTypeTele tele return (ConstructorDef pos d (Telescope tele)) @@ -599,32 +595,29 @@ tcEntry (Data t (Telescope delta) cs) = Env.err [DS "Datatype definition", DD t, DS "contains duplicated constructors"] -- finally, add the datatype to the env and perform action m return $ AddCtx [Data t (Telescope delta) ecs] -tcEntry (DataSig _ _) = Env.err [DS "internal construct"] - - -{- STUBWITH tcEntry _ = Env.err "unimplemented" -} +{- STUBWITH -} -- | Make sure that we don't have the same name twice in the -- environment. (We don't rename top-level module definitions.) -duplicateTypeBindingCheck :: Sig -> TcMonad () -duplicateTypeBindingCheck sig = do +duplicateTypeBindingCheck :: Decl -> TcMonad () +duplicateTypeBindingCheck decl = do -- Look for existing type bindings ... - let n = sigName sig + let n = declName decl l <- Env.lookupTyMaybe n l' <- Env.lookupHint n -- ... we don't care which, if either are Just. case catMaybes [l, l'] of [] -> return () -- We already have a type in the environment so fail. - sig' : _ -> - let p = unPosFlaky $ sigType sig + decl' : _ -> + let p = unPosFlaky $ declType decl msg = - [ DS "Duplicate type signature", - DD sig, + [ DS "Duplicate type declaration", + DD decl, DS "Previous was", - DD sig' + DD decl' ] - in Env.extendSourceLocation p sig $ Env.err msg + in Env.extendSourceLocation p decl $ Env.err msg {- SOLN DATA -} ----------------------------------------------------------- @@ -722,7 +715,7 @@ relatedPats dc (pc : pats) = checkSubPats :: DataConName -> [Entry] -> [[(Pattern, Epsilon)]] -> TcMonad () checkSubPats dc [] _ = return () checkSubPats dc (Def _ _ : tele) patss = checkSubPats dc tele patss -checkSubPats dc (TypeSig _ : tele) patss +checkSubPats dc (TypeDecl _ : tele) patss | (not . null) patss && not (any null patss) = do let hds = map (fst . head) patss let tls = map tail patss diff --git a/version1/pi-forall.cabal b/version1/pi-forall.cabal index e7a8c0c..ee29759 100644 --- a/version1/pi-forall.cabal +++ b/version1/pi-forall.cabal @@ -21,7 +21,7 @@ common shared-properties default-language: GHC2021 ghc-options: - -Wall -fno-warn-unused-matches -fno-warn-orphans -fno-warn-unused-top-binds -fno-warn-unused-imports -fno-warn-name-shadowing + -Wall -fno-warn-unused-matches -fno-warn-orphans -fno-warn-unused-top-binds -fno-warn-unused-imports -fno-warn-name-shadowing -Wno-unrecognised-pragmas default-extensions: DefaultSignatures DeriveAnyClass diff --git a/version1/pi/Lec1.pi b/version1/pi/Lec1.pi index 9e43048..eb6a040 100644 --- a/version1/pi/Lec1.pi +++ b/version1/pi/Lec1.pi @@ -2,13 +2,10 @@ module Lec1 where -ida : Type -> Type -ida = \y . y - -id : (x:Type) -> ((y : x) -> x) +id : (x:Type) -> x -> x id = \x y . y -idid : ((x:Type) -> x -> x) +idid : ((x:Type) -> (y : x) -> x) idid = id ((x:Type) -> (y : x) -> x) id compose : (A : Type) -> (B : Type) -> (C:Type) -> diff --git a/version1/src/Environment.hs b/version1/src/Environment.hs index 6ef3da0..fcfa194 100644 --- a/version1/src/Environment.hs +++ b/version1/src/Environment.hs @@ -9,7 +9,6 @@ module Environment lookupTy, lookupTyMaybe, lookupDef, - lookupRecDef, lookupHint, getCtx, getLocalCtx, @@ -67,15 +66,15 @@ data SourceLocation where -- | Environment manipulation and accessing functions -- The context 'gamma' is a list data Env = Env - { -- | elaborated term and datatype declarations. - ctx :: [Decl], + { -- | elaborated term and datatype declarations + ctx :: [Entry], -- | how long the tail of "global" variables in the context is -- (used to supress printing those in error messages) globals :: Int, - -- | Type declarations (signatures): it's not safe to + -- | Type declarations: it's not safe to -- put these in the context until a corresponding term -- has been checked. - hints :: [Sig], + hints :: [Decl], -- | what part of the file we are in (for errors/warnings) sourceLocation :: [SourceLocation] } @@ -97,30 +96,30 @@ instance Disp Env where debugDisp e = vcat [debugDisp decl | decl <- ctx e] -- | Find a name's user supplied type signature. -lookupHint :: (MonadReader Env m) => TName -> m (Maybe Sig) +lookupHint :: (MonadReader Env m) => TName -> m (Maybe Decl) lookupHint v = do hints <- asks hints - return $ listToMaybe [sig | sig <- hints, v == sigName sig] + return $ listToMaybe [sig | sig <- hints, v == declName sig] -- | Find a name's type in the context. lookupTyMaybe :: (MonadReader Env m) => TName -> - m (Maybe Sig) + m (Maybe Decl) lookupTyMaybe v = do ctx <- asks ctx return $ go ctx where go [] = Nothing - go (TypeSig sig : ctx) - | v == sigName sig = Just sig + go (TypeDecl sig : ctx) + | v == declName sig = Just sig | otherwise = go ctx go (_ : ctx) = go ctx -- | Find the type of a name specified in the context -- throwing an error if the name doesn't exist lookupTy :: - TName -> TcMonad Sig + TName -> TcMonad Decl lookupTy v = do x <- lookupTyMaybe v @@ -143,26 +142,18 @@ lookupDef v = do ctx <- asks ctx return $ listToMaybe [a | Def v' a <- ctx, v == v'] -lookupRecDef :: - (MonadReader Env m) => - TName -> - m (Maybe Term) -lookupRecDef v = do - ctx <- asks ctx - return $ listToMaybe [a | RecDef v' a <- ctx, v == v'] - -- | Extend the context with a new binding -extendCtx :: (MonadReader Env m) => Decl -> m a -> m a +extendCtx :: (MonadReader Env m) => Entry -> m a -> m a extendCtx d = local (\m@Env {ctx = cs} -> m {ctx = d : cs}) -- | Extend the context with a list of bindings -extendCtxs :: (MonadReader Env m) => [Decl] -> m a -> m a +extendCtxs :: (MonadReader Env m) => [Entry] -> m a -> m a extendCtxs ds = local (\m@Env {ctx = cs} -> m {ctx = ds ++ cs}) -- | Extend the context with a list of bindings, marking them as "global" -extendCtxsGlobal :: (MonadReader Env m) => [Decl] -> m a -> m a +extendCtxsGlobal :: (MonadReader Env m) => [Entry] -> m a -> m a extendCtxsGlobal ds = local ( \m@Env {ctx = cs} -> @@ -182,11 +173,11 @@ extendCtxMods :: (MonadReader Env m) => [Module] -> m a -> m a extendCtxMods mods k = foldr extendCtxMod k mods -- | Get the complete current context -getCtx :: MonadReader Env m => m [Decl] +getCtx :: MonadReader Env m => m [Entry] getCtx = asks ctx -- | Get the prefix of the context that corresponds to local variables. -getLocalCtx :: MonadReader Env m => m [Decl] +getLocalCtx :: MonadReader Env m => m [Entry] getLocalCtx = do g <- asks ctx glen <- asks globals @@ -202,7 +193,7 @@ getSourceLocation :: MonadReader Env m => m [SourceLocation] getSourceLocation = asks sourceLocation -- | Add a type hint -extendHints :: (MonadReader Env m) => Sig -> m a -> m a +extendHints :: (MonadReader Env m) => Decl -> m a -> m a extendHints h = local (\m@Env {hints = hs} -> m {hints = h : hs}) -- | An error that should be reported to the user diff --git a/version1/src/Equal.hs b/version1/src/Equal.hs index 91ace75..b92c8cd 100644 --- a/version1/src/Equal.hs +++ b/version1/src/Equal.hs @@ -98,11 +98,7 @@ whnf (Var x) = do maybeDef <- Env.lookupDef x case maybeDef of (Just d) -> whnf d - _ -> do - maybeRecDef <- Env.lookupRecDef x - case maybeRecDef of - (Just d) -> whnf d - _ -> return (Var x) + _ -> return (Var x) whnf (App t1 t2) = do nf <- whnf t1 case nf of @@ -132,7 +128,7 @@ whnf tm = return tm -- | 'Unify' the two terms, producing a list of Defs -- If there is an obvious mismatch, this function produces an error -- If either term is "ambiguous" just ignore. -unify :: [TName] -> Term -> Term -> TcMonad [Decl] +unify :: [TName] -> Term -> Term -> TcMonad [Entry] unify ns tx ty = do txnf <- whnf tx tynf <- whnf ty diff --git a/version1/src/Parser.hs b/version1/src/Parser.hs index 55b5252..62c07b5 100644 --- a/version1/src/Parser.hs +++ b/version1/src/Parser.hs @@ -63,13 +63,13 @@ Optional components in this BNF are marked with < > A -> B - Get parsed as (x:A) -> B, with an internal name for x + Get parsed as (_:A) -> B, with a wildcard name for the binder - Nondependent product types, like: A * B - Get parsed as { x:A | B }, with an internal name for x + Get parsed as { _:A | B }, with a wildcard name for the binder - You can collapse lambdas, like: @@ -85,6 +85,10 @@ Optional components in this BNF are marked with < > -} +-- | Default name (for parsing 'A -> B' as '(_:A) -> B') +wildcardName :: TName +wildcardName = Unbound.string2Name "_" + liftError :: (MonadError e m) => Either e a -> m a liftError (Left e) = throwError e liftError (Right a) = return a @@ -233,12 +237,12 @@ importDef = do reserved "import" >> (ModuleImport <$> importName) --- Top level declarations --- -decl, sigDef, valDef :: LParser Decl -decl = sigDef <|> valDef -sigDef = do +decl, declDef, valDef :: LParser Entry +decl = declDef <|> valDef +declDef = do n <- try (variable >>= \v -> colon >> return v) ty <- expr - return (mkSig n ty) + return (mkDecl n ty) valDef = do n <- try (do n <- variable; reservedOp "="; return n) val <- expr diff --git a/version1/src/PrettyPrint.hs b/version1/src/PrettyPrint.hs index 1f0892c..d375ba4 100644 --- a/version1/src/PrettyPrint.hs +++ b/version1/src/PrettyPrint.hs @@ -119,11 +119,11 @@ instance Disp Module instance Disp ModuleImport -instance Disp Decl +instance Disp Entry -instance Disp [Decl] +instance Disp [Entry] -instance Disp Sig +instance Disp Decl ------------------------------------------------------------------------ @@ -144,24 +144,23 @@ instance Display Module where instance Display ModuleImport where display (ModuleImport i) = pure $ PP.text "import" <+> disp i -instance Display [Decl] where +instance Display [Entry] where display ds = do dd <- mapM display ds pure $ PP.vcat dd -instance Display Sig where - display sig = do - dn <- display (sigName sig) - dt <- display (sigType sig) +instance Display Decl where + display decl = do + dn <- display (declName decl) + dt <- display (declType decl) pure $ dn <+> PP.text ":" <+> dt -instance Display Decl where +instance Display Entry where display (Def n term) = do dn <- display n dt <- display term pure $ dn <+> PP.text "=" <+> dt - display (RecDef n f) = display (Def n f) - display (TypeSig sig) = display sig + display (TypeDecl decl) = display decl ------------------------------------------------------------------------- diff --git a/version1/src/Syntax.hs b/version1/src/Syntax.hs index 0c3ce34..f17276d 100644 --- a/version1/src/Syntax.hs +++ b/version1/src/Syntax.hs @@ -25,9 +25,6 @@ import Unbound.Generics.LocallyNameless.Internal.Fold qualified as Unbound -- is a name for. type TName = Unbound.Name Term --- | module names -type ModuleName = String - ----------------------------------------- -- * Core language of pi-forall (Combined syntax for types and terms) @@ -86,12 +83,15 @@ data Term ----------------------------------------- +-- | module names +type ModuleName = String + -- | A Module has a name, a list of imports, a list of declarations, -- and a set of constructor names (which affect parsing). data Module = Module { moduleName :: ModuleName, moduleImports :: [ModuleImport], - moduleEntries :: [Decl] + moduleEntries :: [Entry] } deriving (Show, Generic, Typeable, Unbound.Alpha) @@ -100,32 +100,35 @@ newtype ModuleImport = ModuleImport ModuleName deriving (Show, Eq, Generic, Typeable) deriving anyclass (Unbound.Alpha) --- | A type declaration (or type signature) -data Sig = Sig {sigName :: TName, sigType :: Type} +-- | A type declaration (or type declnature) +data Decl = Decl {declName :: TName, declType :: Type} deriving (Show, Generic, Typeable, Unbound.Alpha, Unbound.Subst Term) -- | Declare the type of a term -mkSig :: TName -> Type -> Decl -mkSig n ty = TypeSig (Sig n ty) - --- | Declarations are the components of modules -data Decl - = -- | Declaration for the type of a term - TypeSig Sig - | -- | The definition of a particular name, must +mkDecl :: TName -> Type -> Entry +mkDecl n ty = TypeDecl (Decl n ty) + +-- | Entries are the components of modules +data Entry + = -- | Declaration for the type of a term 'x : A' + TypeDecl Decl + | -- | The definition of a particular name, must 'x = a' -- already have a type declaration in scope Def TName Term - | -- | A potentially (recursive) definition of - -- a particular name, must be declared - RecDef TName Term deriving (Show, Generic, Typeable) deriving anyclass (Unbound.Alpha, Unbound.Subst Term) +----------------------------------------- + -- * Auxiliary functions on syntax --- | Default name for '_' occurring in patterns -wildcardName :: TName -wildcardName = Unbound.string2Name "_" +----------------------------------------- + +-- | Remove source positions and type annotations from the top level of a term +strip :: Term -> Term +strip (Pos _ tm) = strip tm +strip (Ann tm _) = strip tm +strip tm = tm -- | Partial inverse of Pos unPos :: Term -> Maybe SourcePos @@ -136,18 +139,43 @@ unPos _ = Nothing unPosFlaky :: Term -> SourcePos unPosFlaky t = fromMaybe (newPos "unknown location" 0 0) (unPos t) ------------------ +----------------------------------------- + +-- * Unbound library + +----------------------------------------- -- We use the unbound-generics library to mark the binding occurrences of -- variables in the syntax. That allows us to automatically derive -- functions for alpha-equivalence, free variables and substitution -- using generic programming. +-- | Determine when two terms are alpha-equivalent (see below) +aeq :: Term -> Term -> Bool +aeq = Unbound.aeq + +-- | Calculate the free variables of a term +fv :: Term -> [Unbound.Name Term] +fv = Unbound.toListOf Unbound.fv + +-- | subst x b a means to replace x with b in a +-- i.e. a [ b / x ] +subst :: TName -> Term -> Term -> Term +subst = Unbound.subst + +-- | in a binder "x.a" replace x with b +instantiate :: Unbound.Bind TName Term -> Term -> Term +instantiate bnd a = Unbound.instantiate bnd [a] + +-- | in a binder "x.a" replace x with a fresh name +unbind :: (Unbound.Fresh m) => Unbound.Bind TName Term -> m (TName, Term) +unbind = Unbound.unbind + ------------------ -- * Alpha equivalence and free variables --- Among other things, the Alpha class enables the following +-- The Unbound library's Alpha class enables the following -- functions: -- -- Compare terms for alpha equivalence -- aeq :: Alpha a => a -> a -> Bool @@ -157,23 +185,21 @@ unPosFlaky t = fromMaybe (newPos "unknown location" 0 0) (unPos t) -- unbind :: (Alpha p, Alpha t, Fresh m) => Bind p t -> m (p, t) -- For Terms, we'd like Alpha equivalence to ignore --- source positions and type annotations. --- We can add these special cases to the definition of `aeq'` --- and then defer all other cases to the generic version of --- the function (Unbound.gaeq). +-- source positions and type annotations. So we make sure to +-- remove them before calling the generic operation. instance Unbound.Alpha Term where - aeq' ctx (Ann a _) b = Unbound.aeq' ctx a b - aeq' ctx a (Ann b _) = Unbound.aeq' ctx a b - aeq' ctx (Pos _ a) b = Unbound.aeq' ctx a b - aeq' ctx a (Pos _ b) = Unbound.aeq' ctx a b - aeq' ctx a b = (Unbound.gaeq ctx `on` from) a b + aeq' :: Unbound.AlphaCtx -> Term -> Term -> Bool + aeq' ctx a b = (Unbound.gaeq ctx `on` from) (strip a) (strip b) -- For example, all occurrences of annotations and source positions -- are ignored by this definition. --- >>> Unbound.aeq (Pos internalPos (Ann TyBool Type)) TyBool --- True +-- '(Bool : Type)' is alpha-equivalent to 'Bool' +-- >>> aeq (Ann TyBool TyType) TyBool + +-- '(Bool, Bool:Type)' is alpha-equivalent to (Bool, Bool) +-- >>> aeq (Prod TyBool (Ann TyBool TyType)) (Prod TyBool TyBool) -- At the same time, the generic operation equates terms that differ only -- in the names of bound variables. @@ -194,7 +220,7 @@ idx = Lam (Unbound.bind xName (Var xName)) idy :: Term idy = Lam (Unbound.bind yName (Var yName)) --- >>> Unbound.aeq idx idy +-- >>> aeq idx idy -- True --------------- @@ -221,14 +247,6 @@ pi2 :: Term pi2 = TyPi TyBool (Unbound.bind yName (Var yName)) -- >>> Unbound.aeq (Unbound.subst xName TyBool pi1) pi2 --- True --- - ---------------- - --- | Bridge function to calculate the free variables of a term -fv :: Term -> [Unbound.Name Term] -fv = Unbound.toListOf Unbound.fv ----------------- @@ -252,8 +270,7 @@ instance Unbound.Alpha SourcePos where acompare' _ _ _ = EQ -- Substitutions ignore source positions -instance Unbound.Subst b SourcePos where subst _ _ = id; substs _ = id; substBvs _ _ = id - --- Internally generated source positions -internalPos :: SourcePos -internalPos = initialPos "internal" +instance Unbound.Subst b SourcePos where + subst _ _ = id + substs _ = id + substBvs _ _ = id diff --git a/version1/src/TypeCheck.hs b/version1/src/TypeCheck.hs index 024f577..64f9548 100644 --- a/version1/src/TypeCheck.hs +++ b/version1/src/TypeCheck.hs @@ -1,5 +1,4 @@ {- pi-forall -} -{-# OPTIONS_GHC -Wno-unrecognised-pragmas #-} {-# HLINT ignore "Use forM_" #-} @@ -18,102 +17,111 @@ import Text.PrettyPrint.HughesPJ (render, ($$)) import Unbound.Generics.LocallyNameless qualified as Unbound import Unbound.Generics.LocallyNameless.Internal.Fold qualified as Unbound +--------------------------------------------------------------------- + -- | Infer/synthesize the type of a term inferType :: Term -> TcMonad Type -inferType t = tcTerm t Nothing - --- | Check that the given term has the expected type -checkType :: Term -> Type -> TcMonad () -checkType tm (Pos _ ty) = checkType tm ty -- ignore source positions/annotations -checkType tm (Ann ty _) = checkType tm ty -checkType tm ty = void $ tcTerm tm (Just ty) +inferType t = case t of + -- i-var + (Var x) -> do + decl <- Env.lookupTy x + return (declType decl) + + -- i-type + TyType -> return TyType + -- i-pi + (TyPi tyA bnd) -> do + (x, tyB) <- Unbound.unbind bnd + tcType tyA + Env.extendCtx (mkDecl x tyA) (tcType tyB) + return TyType + + -- i-app + (App t1 t2) -> do + ty1 <- inferType t1 + let ensurePi :: Type -> TcMonad (Type, Unbound.Bind TName Type) + ensurePi (Pos _ ty) = ensurePi ty + ensurePi (Ann tm _) = ensurePi tm + ensurePi (TyPi tyA bnd) = return (tyA, bnd) + ensurePi ty = Env.err [DS "Expected a function type but found ", DD ty] + (tyA, bnd) <- ensurePi ty1 + checkType t2 tyA + return (Unbound.instantiate bnd [t2]) + + -- i-ann + (Ann tm ty) -> do + tcType ty + checkType tm ty + return ty + + -- Practicalities + -- remember the current position in the type checking monad + (Pos p tm) -> + Env.extendSourceLocation p tm $ inferType tm + -- Extensions to the core language + -- i-unit + TyUnit -> return TyType + LitUnit -> return TyUnit + -- i-bool + TyBool -> Env.err [DS "unimplemented"] + -- i-true/false + (LitBool b) -> Env.err [DS "unimplemented"] + -- i-if + (If t1 t2 t3) -> Env.err [DS "unimplemented"] + -- i-sigma + (TySigma tyA bnd) -> Env.err [DS "unimplemented"] + -- cannot synthesize the type of the term + tm -> + Env.err [DS "Must have a type for", DD tm] + +------------------------------------------------------------------------- -- | Make sure that the term is a "type" (i.e. that it has type 'Type') tcType :: Term -> TcMonad () -tcType tm = void $ checkType tm TyType +tcType tm = checkType tm TyType ---------------------------------------------------------------------- +------------------------------------------------------------------------- --- | Combined type checking/inference function --- The second argument is 'Just expectedType' in checking mode and 'Nothing' in inference mode --- In either case, this function returns the type of the term -tcTerm :: Term -> Maybe Type -> TcMonad Type --- i-var -tcTerm t@(Var x) Nothing = do - sig <- Env.lookupTy x - return (sigType sig) --- i-type -tcTerm TyType Nothing = return TyType --- i-pi -tcTerm (TyPi tyA bnd) Nothing = do - (x, tyB) <- Unbound.unbind bnd - tcType tyA - Env.extendCtx (mkSig x tyA) (tcType tyB) - return TyType --- c-lam: check the type of a function -tcTerm (Lam bnd) (Just (TyPi tyA bnd2)) = do - -- unbind the variables in the lambda expression and pi type - (x, body, _, tyB) <- Unbound.unbind2Plus bnd bnd2 - - -- check the type of the body of the lambda expression - Env.extendCtx (mkSig x tyA) (checkType body tyB) - return (TyPi tyA bnd2) -tcTerm (Lam _) (Just nf) = - Env.err [DS "Lambda expression should have a function type, not", DD nf] --- i-app -tcTerm (App t1 t2) Nothing = do - ty1 <- inferType t1 - let ensurePi :: Type -> TcMonad (Type, Unbound.Bind TName Type) - ensurePi (Ann a _) = ensurePi a - ensurePi (Pos _ a) = ensurePi a - ensurePi (TyPi tyA bnd) = return (tyA, bnd) - ensurePi ty = Env.err [DS "Expected a function type but found ", DD ty] - (tyA, bnd) <- ensurePi ty1 - checkType t2 tyA - return (Unbound.instantiate bnd [t2]) - --- i-ann -tcTerm (Ann tm ty) Nothing = do - tcType ty - checkType tm ty - return ty - --- practicalities --- remember the current position in the type checking monad -tcTerm (Pos p tm) mTy = - Env.extendSourceLocation p tm $ tcTerm tm mTy --- ignore term, just return type annotation -tcTerm TrustMe (Just ty) = return ty --- i-unit -tcTerm TyUnit Nothing = return TyType -tcTerm LitUnit Nothing = return TyUnit --- i-bool -tcTerm TyBool Nothing = Env.err [DS "unimplemented"] --- i-true/false -tcTerm (LitBool b) Nothing = Env.err [DS "unimplemented"] --- c-if -tcTerm t@(If t1 t2 t3) mty = Env.err [DS "unimplemented"] -tcTerm (Let rhs bnd) mty = Env.err [DS "unimplemented"] -tcTerm t@(TySigma tyA bnd) Nothing = Env.err [DS "unimplemented"] -tcTerm t@(Prod a b) (Just ty) = Env.err [DS "unimplemented"] -tcTerm t@(LetPair p bnd) (Just ty) = Env.err [DS "unimplemented"] -tcTerm PrintMe (Just ty) = do - gamma <- Env.getLocalCtx - Env.warn - [ DS "Unmet obligation.\nContext:", - DD gamma, - DS "\nGoal:", - DD ty - ] - return ty - --- c-infer -tcTerm tm (Just ty) = do - ty' <- inferType tm - unless (Unbound.aeq ty' ty) $ Env.err [DS "Types don't match", DD ty, DS "and", DD ty'] - return ty' -tcTerm tm Nothing = - Env.err [DS "Must have a type annotation to check", DD tm] +-- | Check that the given term has the expected type +checkType :: Term -> Type -> TcMonad () +checkType tm ty' = do + let ty = strip ty' -- ignore source positions/annotations + case tm of + -- c-lam: check the type of a function + (Lam bnd) -> case ty of + (TyPi tyA bnd2) -> do + -- unbind the variables in the lambda expression and pi type + (x, body, _, tyB) <- Unbound.unbind2Plus bnd bnd2 + + -- check the type of the body of the lambda expression + Env.extendCtx (mkDecl x tyA) (checkType body tyB) + _ -> Env.err [DS "Lambda expression should have a function type, not", DD ty] + -- Practicalities + (Pos p tm) -> + Env.extendSourceLocation p tm $ checkType tm ty + TrustMe -> return () + PrintMe -> do + gamma <- Env.getLocalCtx + Env.warn + [ DS "Unmet obligation.\nContext:", + DD gamma, + DS "\nGoal:", + DD ty + ] + + -- Extensions to the core language + -- c-if + (If t1 t2 t3) -> Env.err [DS "unimplemented"] + -- c-let + (Let rhs bnd) -> Env.err [DS "unimplemented"] + -- c-prod + (Prod a b) -> Env.err [DS "unimplemented"] + -- c-letpair + (LetPair p bnd) -> Env.err [DS "unimplemented"] + -- c-infer + tm -> do + ty' <- inferType tm + unless (Unbound.aeq ty' ty) $ Env.err [DS "Types don't match", DD ty, DS "and", DD ty'] -------------------------------------------------------- -- Using the typechecker for decls and modules and stuff @@ -135,11 +143,11 @@ tcModules = foldM tcM [] -- | Typecheck an entire module. tcModule :: - -- | List of already checked modules (including their Decls). + -- | List of already checked modules (including their entries). [Module] -> -- | Module to check. Module -> - -- | The same module with all Decls checked and elaborated. + -- | The same module with all entries checked and elaborated. TcMonad Module tcModule defs m' = do checkedEntries <- @@ -151,23 +159,23 @@ tcModule defs m' = do return $ m' {moduleEntries = checkedEntries} where d `tcE` m = do - -- Extend the Env per the current Decl before checking - -- subsequent Decls. + -- Extend the Env per the current Entry before checking + -- subsequent entries. x <- tcEntry d case x of AddHint hint -> Env.extendHints hint m - -- Add decls to the Decls to be returned + -- Add decls to the entries to be returned AddCtx decls -> (decls ++) <$> Env.extendCtxsGlobal decls m -- Get all of the defs from imported modules (this is the env to check current module in) importedModules = filter (\x -> ModuleImport (moduleName x) `elem` moduleImports m') defs --- | The Env-delta returned when type-checking a top-level Decl. +-- | The Env-delta returned when type-checking a top-level Entry. data HintOrCtx - = AddHint Sig - | AddCtx [Decl] + = AddHint Decl + | AddCtx [Entry] -- | Check each sort of declaration in a module -tcEntry :: Decl -> TcMonad HintOrCtx +tcEntry :: Entry -> TcMonad HintOrCtx tcEntry (Def n term) = do oldDef <- Env.lookupDef n maybe tc die oldDef @@ -177,21 +185,19 @@ tcEntry (Def n term) = do case lkup of Nothing -> do ty <- inferType term - return $ AddCtx [TypeSig (Sig n ty), Def n term] - Just sig -> + return $ AddCtx [TypeDecl (Decl n ty), Def n term] + Just decl -> let handler (Env.Err ps msg) = throwError $ Env.Err ps (msg $$ msg') msg' = disp [ DS "When checking the term", DD term, - DS "against the signature", - DD sig + DS "against the type", + DD decl ] in do - Env.extendCtx (TypeSig sig) $ checkType term (sigType sig) `catchError` handler - if n `elem` fv term - then return $ AddCtx [TypeSig sig, RecDef n term] - else return $ AddCtx [TypeSig sig, Def n term] + Env.extendCtx (TypeDecl decl) $ checkType term (declType decl) `catchError` handler + return $ AddCtx [TypeDecl decl, Def n term] die term' = Env.extendSourceLocation (unPosFlaky term) term $ Env.err @@ -200,30 +206,29 @@ tcEntry (Def n term) = do DS "Previous definition was", DD term' ] -tcEntry (TypeSig sig) = do - duplicateTypeBindingCheck sig - tcType (sigType sig) - return $ AddHint sig -tcEntry _ = Env.err "unimplemented" +tcEntry (TypeDecl decl) = do + duplicateTypeBindingCheck decl + tcType (declType decl) + return $ AddHint decl -- | Make sure that we don't have the same name twice in the -- environment. (We don't rename top-level module definitions.) -duplicateTypeBindingCheck :: Sig -> TcMonad () -duplicateTypeBindingCheck sig = do +duplicateTypeBindingCheck :: Decl -> TcMonad () +duplicateTypeBindingCheck decl = do -- Look for existing type bindings ... - let n = sigName sig + let n = declName decl l <- Env.lookupTyMaybe n l' <- Env.lookupHint n -- ... we don't care which, if either are Just. case catMaybes [l, l'] of [] -> return () -- We already have a type in the environment so fail. - sig' : _ -> - let p = unPosFlaky $ sigType sig + decl' : _ -> + let p = unPosFlaky $ declType decl msg = - [ DS "Duplicate type signature", - DD sig, + [ DS "Duplicate type declaration", + DD decl, DS "Previous was", - DD sig' + DD decl' ] - in Env.extendSourceLocation p sig $ Env.err msg + in Env.extendSourceLocation p decl $ Env.err msg diff --git a/version2/pi-forall.cabal b/version2/pi-forall.cabal index e7a8c0c..ee29759 100644 --- a/version2/pi-forall.cabal +++ b/version2/pi-forall.cabal @@ -21,7 +21,7 @@ common shared-properties default-language: GHC2021 ghc-options: - -Wall -fno-warn-unused-matches -fno-warn-orphans -fno-warn-unused-top-binds -fno-warn-unused-imports -fno-warn-name-shadowing + -Wall -fno-warn-unused-matches -fno-warn-orphans -fno-warn-unused-top-binds -fno-warn-unused-imports -fno-warn-name-shadowing -Wno-unrecognised-pragmas default-extensions: DefaultSignatures DeriveAnyClass diff --git a/version2/src/Environment.hs b/version2/src/Environment.hs index f452302..b052e1f 100644 --- a/version2/src/Environment.hs +++ b/version2/src/Environment.hs @@ -9,7 +9,6 @@ module Environment lookupTy, lookupTyMaybe, lookupDef, - lookupRecDef, lookupHint , getCtx, getLocalCtx, @@ -60,15 +59,15 @@ data SourceLocation where -- | Environment manipulation and accessing functions -- The context 'gamma' is a list data Env = Env - { -- | elaborated term and datatype declarations. - ctx :: [Decl], + { -- | elaborated term and datatype declarations + ctx :: [Entry], -- | how long the tail of "global" variables in the context is -- (used to supress printing those in error messages) globals :: Int, - -- | Type declarations (signatures): it's not safe to + -- | Type declarations: it's not safe to -- put these in the context until a corresponding term -- has been checked. - hints :: [Sig], + hints :: [Decl], -- | what part of the file we are in (for errors/warnings) sourceLocation :: [SourceLocation] } @@ -90,22 +89,22 @@ instance Disp Env where debugDisp e = vcat [debugDisp decl | decl <- ctx e] -- | Find a name's user supplied type signature. -lookupHint :: (MonadReader Env m) => TName -> m (Maybe Sig) +lookupHint :: (MonadReader Env m) => TName -> m (Maybe Decl) lookupHint v = do hints <- asks hints - return $ listToMaybe [ sig | sig <- hints, v == sigName sig] + return $ listToMaybe [ sig | sig <- hints, v == declName sig] -- | Find a name's type in the context. lookupTyMaybe :: (MonadReader Env m) => TName -> - m (Maybe Sig) + m (Maybe Decl) lookupTyMaybe v = do ctx <- asks ctx return $ go ctx where go [] = Nothing - go (TypeSig sig : ctx) - | v == sigName sig = Just sig + go (TypeDecl sig : ctx) + | v == declName sig = Just sig | otherwise = go ctx go (_ : ctx) = go ctx @@ -115,7 +114,7 @@ lookupTyMaybe v = do -- | Find the type of a name specified in the context -- throwing an error if the name doesn't exist lookupTy :: - TName -> TcMonad Sig + TName -> TcMonad Decl lookupTy v = do x <- lookupTyMaybe v @@ -138,28 +137,20 @@ lookupDef v = do ctx <- asks ctx return $ listToMaybe [a | Def v' a <- ctx, v == v'] -lookupRecDef :: - (MonadReader Env m) => - TName -> - m (Maybe Term) -lookupRecDef v = do - ctx <- asks ctx - return $ listToMaybe [a | RecDef v' a <- ctx, v == v'] - -- | Extend the context with a new binding -extendCtx :: (MonadReader Env m) => Decl -> m a -> m a +extendCtx :: (MonadReader Env m) => Entry -> m a -> m a extendCtx d = local (\m@Env{ctx = cs} -> m {ctx = d : cs}) -- | Extend the context with a list of bindings -extendCtxs :: (MonadReader Env m) => [Decl] -> m a -> m a +extendCtxs :: (MonadReader Env m) => [Entry] -> m a -> m a extendCtxs ds = local (\m@Env {ctx = cs} -> m {ctx = ds ++ cs}) -- | Extend the context with a list of bindings, marking them as "global" -extendCtxsGlobal :: (MonadReader Env m) => [Decl] -> m a -> m a +extendCtxsGlobal :: (MonadReader Env m) => [Entry] -> m a -> m a extendCtxsGlobal ds = local ( \m@Env {ctx = cs} -> @@ -181,11 +172,11 @@ extendCtxMods :: (MonadReader Env m) => [Module] -> m a -> m a extendCtxMods mods k = foldr extendCtxMod k mods -- | Get the complete current context -getCtx :: MonadReader Env m => m [Decl] +getCtx :: MonadReader Env m => m [Entry] getCtx = asks ctx -- | Get the prefix of the context that corresponds to local variables. -getLocalCtx :: MonadReader Env m => m [Decl] +getLocalCtx :: MonadReader Env m => m [Entry] getLocalCtx = do g <- asks ctx glen <- asks globals @@ -201,7 +192,7 @@ getSourceLocation :: MonadReader Env m => m [SourceLocation] getSourceLocation = asks sourceLocation -- | Add a type hint -extendHints :: (MonadReader Env m) => Sig -> m a -> m a +extendHints :: (MonadReader Env m) => Decl -> m a -> m a extendHints h = local (\m@Env {hints = hs} -> m {hints = h : hs}) -- | An error that should be reported to the user diff --git a/version2/src/Equal.hs b/version2/src/Equal.hs index 48a82d6..d91dd5a 100644 --- a/version2/src/Equal.hs +++ b/version2/src/Equal.hs @@ -129,11 +129,7 @@ whnf (Var x) = do maybeDef <- Env.lookupDef x case maybeDef of (Just d) -> whnf d - _ -> do - maybeRecDef <- Env.lookupRecDef x - case maybeRecDef of - (Just d) -> whnf d - _ -> return (Var x) + _ -> return (Var x) whnf (App t1 t2) = do nf <- whnf t1 @@ -176,7 +172,7 @@ whnf tm = return tm -- | 'Unify' the two terms, producing a list of Defs -- If there is an obvious mismatch, this function produces an error -- If either term is "ambiguous" just ignore. -unify :: [TName] -> Term -> Term -> TcMonad [Decl] +unify :: [TName] -> Term -> Term -> TcMonad [Entry] unify ns tx ty = do txnf <- whnf tx tynf <- whnf ty diff --git a/version2/src/Parser.hs b/version2/src/Parser.hs index 4957156..a6039d6 100644 --- a/version2/src/Parser.hs +++ b/version2/src/Parser.hs @@ -3,7 +3,7 @@ -- | A parsec-based parser for the concrete syntax module Parser ( - parseModuleFile, + parseModuleFile, parseModuleImports, parseExpr, expr, @@ -19,7 +19,7 @@ import qualified Unbound.Generics.LocallyNameless as Unbound import Text.Parsec hiding (State,Empty) import Text.Parsec.Expr(Operator(..),Assoc(..),buildExpressionParser) -import qualified LayoutToken as Token +import qualified LayoutToken as Token import Control.Monad.State.Lazy hiding (join) import Control.Monad.Except ( MonadError(throwError) ) @@ -79,13 +79,13 @@ Optional components in this BNF are marked with < > A -> B - Get parsed as (x:A) -> B, with an internal name for x + Get parsed as (_:A) -> B, with a wildcard name for the binder - Nondependent product types, like: A * B - Get parsed as { x:A | B }, with an internal name for x + Get parsed as { _:A | B }, with a wildcard name for the binder - You can collapse lambdas, like: @@ -101,6 +101,12 @@ Optional components in this BNF are marked with < > -} + +-- | Default name (for parsing 'A -> B' as '(_:A) -> B') +wildcardName :: TName +wildcardName = Unbound.string2Name "_" + + liftError :: (MonadError e m) => Either e a -> m a liftError (Left e) = throwError e liftError (Right a) = return a @@ -117,13 +123,13 @@ parseModuleFile name = do parseModuleImports :: (MonadError ParseError m, MonadIO m) => String -> m Module parseModuleImports name = do contents <- liftIO $ readFile name - liftError $ Unbound.runFreshM $ + liftError $ Unbound.runFreshM $ (runParserT (do { whiteSpace; moduleImports }) [] name contents) -- | Test an 'LParser' on a String. testParser :: LParser t -> String -> Either ParseError t -testParser parser str = Unbound.runFreshM $ +testParser parser str = Unbound.runFreshM $ runParserT (do { whiteSpace; v <- parser; eof; return v}) [] "" str @@ -171,10 +177,10 @@ piforallStyle = Token.LanguageDef ,"axiom" ,"TRUSTME" ,"PRINTME" - ,"ord" - ,"Bool", "True", "False" + ,"ord" + ,"Bool", "True", "False" ,"if","then","else" - ,"Unit", "()" + ,"Unit", "()" ] , Token.reservedOpNames = ["!","?","\\",":",".",",","<", "=", "+", "-", "*", "^", "()", "_","|","{", "}"] @@ -191,9 +197,9 @@ whiteSpace = Token.whiteSpace tokenizer variable :: LParser TName variable = - do i <- identifier + do i <- identifier return $ Unbound.string2Name i - + @@ -202,7 +208,7 @@ colon, dot, comma :: LParser () colon = Token.colon tokenizer >> return () dot = Token.dot tokenizer >> return () comma = Token.comma tokenizer >> return () - + reserved,reservedOp :: String -> LParser () reserved = Token.reserved tokenizer reservedOp = Token.reservedOp tokenizer @@ -237,20 +243,20 @@ importDef = do reserved "import" >> (ModuleImport <$> importName) where importName = identifier - + --- --- Top level declarations --- -decl,sigDef,valDef :: LParser Decl -decl = sigDef <|> valDef +decl,declDef,valDef :: LParser Entry +decl = declDef <|> valDef + - -sigDef = do +declDef = do n <- try (variable >>= \v -> colon >> return v) ty <- expr - return (mkSig n ty) + return (mkDecl n ty) valDef = do n <- try (do {n <- variable; reservedOp "="; return n}) @@ -273,13 +279,13 @@ printme = reserved "PRINTME" *> return (PrintMe ) refl :: LParser Term refl = do reserved "Refl" - return $ Refl + return $ Refl -- Expressions expr,term,factor :: LParser Term - + -- expr is the toplevel expression grammar expr = do p <- getPosition @@ -288,18 +294,18 @@ expr = do [ifix AssocLeft "=" TyEq], [ifixM AssocRight "->" mkArrowType], [ifixM AssocRight "*" mkTupleType] - ] + ] ifix assoc op f = Infix (reservedOp op >> return f) assoc ifixM assoc op f = Infix (reservedOp op >> f) assoc - mkArrowType = + mkArrowType = do n <- Unbound.fresh wildcardName - return $ \tyA tyB -> + return $ \tyA tyB -> TyPi tyA (Unbound.bind n tyB) - mkTupleType = + mkTupleType = do n <- Unbound.fresh wildcardName - return $ \tyA tyB -> + return $ \tyA tyB -> TySigma tyA (Unbound.bind n tyB) - + -- A "term" is either a function application or a constructor -- application. Breaking it out as a seperate category both -- eliminates left-recursion in ( := ) and @@ -307,16 +313,16 @@ expr = do term = funapp - + funapp :: LParser Term -funapp = do +funapp = do f <- factor foldl' app f <$> many bfactor where bfactor = factor app e1 e2 = App e1 e2 -factor = choice [ Var <$> variable "a variable" +factor = choice [ Var <$> variable "a variable" , typen "Type" , lambda "a lambda" , try letPairExp "a let pair" @@ -328,10 +334,10 @@ factor = choice [ Var <$> variable "a variable" , trustme "TRUSTME" , printme "PRINTME" - , bconst "a constant" - , ifExpr "an if expression" - , sigmaTy "a sigma type" - + , bconst "a constant" + , ifExpr "an if expression" + , sigmaTy "a sigma type" + , expProdOrAnnotOrParens "an explicit function type or annotated expression" ] @@ -351,11 +357,11 @@ lambda = do reservedOp "\\" binds <- many1 variable dot body <- expr - return $ foldr lam body binds + return $ foldr lam body binds where - lam x m = Lam (Unbound.bind x m) + lam x m = Lam (Unbound.bind x m) + - bconst :: LParser Term @@ -367,7 +373,7 @@ bconst = choice [reserved "Bool" >> return TyBool, ifExpr :: LParser Term -ifExpr = +ifExpr = do reserved "if" a <- expr reserved "then" @@ -375,7 +381,7 @@ ifExpr = reserved "else" c <- expr return (If a b c ) - + -- letExpr :: LParser Term @@ -441,13 +447,13 @@ expProdOrAnnotOrParens = (do b <- afterBinder return $ TyPi a (Unbound.bind x b)) Colon a b -> return $ Ann a b - - Comma a b -> + + Comma a b -> return $ Prod a b Nope a -> return a - - + + -- subst e0 by e1 substExpr :: LParser Term @@ -456,16 +462,16 @@ substExpr = do a <- expr reserved "by" b <- expr - return $ Subst a b + return $ Subst a b contra :: LParser Term contra = do reserved "contra" witness <- expr - return $ Contra witness + return $ Contra witness -sigmaTy :: LParser Term +sigmaTy :: LParser Term sigmaTy = do reservedOp "{" x <- variable @@ -475,5 +481,5 @@ sigmaTy = do b <- expr reservedOp "}" return (TySigma a (Unbound.bind x b)) - - + + diff --git a/version2/src/PrettyPrint.hs b/version2/src/PrettyPrint.hs index 11dfc74..b7d7937 100644 --- a/version2/src/PrettyPrint.hs +++ b/version2/src/PrettyPrint.hs @@ -120,11 +120,11 @@ instance Disp Module instance Disp ModuleImport -instance Disp Decl +instance Disp Entry -instance Disp [Decl] +instance Disp [Entry] -instance Disp Sig +instance Disp Decl @@ -149,24 +149,23 @@ instance Display Module where instance Display ModuleImport where display (ModuleImport i) = pure $ PP.text "import" <+> disp i -instance Display [Decl] where +instance Display [Entry] where display ds = do dd <- mapM display ds pure $ PP.vcat dd -instance Display Sig where - display sig = do - dn <- display (sigName sig) - dt <- display (sigType sig) +instance Display Decl where + display decl = do + dn <- display (declName decl) + dt <- display (declType decl) pure $ dn <+> PP.text ":" <+> dt -instance Display Decl where +instance Display Entry where display (Def n term) = do dn <- display n dt <- display term pure $ dn <+> PP.text "=" <+> dt - display (RecDef n f) = display (Def n f) - display (TypeSig sig) = display sig + display (TypeDecl decl) = display decl diff --git a/version2/src/Syntax.hs b/version2/src/Syntax.hs index 119e13e..47e68cc 100644 --- a/version2/src/Syntax.hs +++ b/version2/src/Syntax.hs @@ -25,11 +25,8 @@ import Data.Function (on) -- and alpha-equality function. The abstract type `Name` from -- this library is indexed by the AST type that this variable -- is a name for. -type TName = Unbound.Name Term - --- | module names -type ModuleName = String +type TName = Unbound.Name Term ----------------------------------------- @@ -102,12 +99,15 @@ data Term ----------------------------------------- +-- | module names +type ModuleName = String + -- | A Module has a name, a list of imports, a list of declarations, -- and a set of constructor names (which affect parsing). data Module = Module { moduleName :: ModuleName, moduleImports :: [ModuleImport], - moduleEntries :: [Decl] + moduleEntries :: [Entry] } deriving (Show, Generic, Typeable, Unbound.Alpha) @@ -116,36 +116,39 @@ newtype ModuleImport = ModuleImport ModuleName deriving (Show, Eq, Generic, Typeable) deriving anyclass (Unbound.Alpha) --- | A type declaration (or type signature) -data Sig = Sig {sigName :: TName , sigType :: Type} +-- | A type declaration (or type declnature) +data Decl = Decl {declName :: TName , declType :: Type} deriving (Show, Generic, Typeable, Unbound.Alpha, Unbound.Subst Term) -- | Declare the type of a term -mkSig :: TName -> Type -> Decl -mkSig n ty = TypeSig (Sig n ty) - --- | Declarations are the components of modules -data Decl - = -- | Declaration for the type of a term - TypeSig Sig - | -- | The definition of a particular name, must +mkDecl :: TName -> Type -> Entry +mkDecl n ty = TypeDecl (Decl n ty) + +-- | Entries are the components of modules +data Entry + = -- | Declaration for the type of a term 'x : A' + TypeDecl Decl + | -- | The definition of a particular name, must 'x = a' -- already have a type declaration in scope Def TName Term - | -- | A potentially (recursive) definition of - -- a particular name, must be declared - RecDef TName Term deriving (Show, Generic, Typeable) deriving anyclass (Unbound.Alpha, Unbound.Subst Term) --- * Auxiliary functions on syntax --- | Default name for '_' occurring in patterns -wildcardName :: TName -wildcardName = Unbound.string2Name "_" +----------------------------------------- +-- * Auxiliary functions on syntax +----------------------------------------- + + +-- | Remove source positions and type annotations from the top level of a term +strip :: Term -> Term +strip (Pos _ tm) = strip tm +strip (Ann tm _) = strip tm +strip tm = tm -- | Partial inverse of Pos unPos :: Term -> Maybe SourcePos @@ -157,18 +160,41 @@ unPosFlaky :: Term -> SourcePos unPosFlaky t = fromMaybe (newPos "unknown location" 0 0) (unPos t) ------------------ + +----------------------------------------- +-- * Unbound library +----------------------------------------- -- We use the unbound-generics library to mark the binding occurrences of -- variables in the syntax. That allows us to automatically derive -- functions for alpha-equivalence, free variables and substitution -- using generic programming. +-- | Determine when two terms are alpha-equivalent (see below) +aeq :: Term -> Term -> Bool +aeq = Unbound.aeq + +-- | Calculate the free variables of a term +fv :: Term -> [Unbound.Name Term] +fv = Unbound.toListOf Unbound.fv + +-- | subst x b a means to replace x with b in a +-- i.e. a [ b / x ] +subst :: TName -> Term -> Term -> Term +subst = Unbound.subst + +-- | in a binder "x.a" replace x with b +instantiate :: Unbound.Bind TName Term -> Term -> Term +instantiate bnd a = Unbound.instantiate bnd [a] + +-- | in a binder "x.a" replace x with a fresh name +unbind :: (Unbound.Fresh m) => Unbound.Bind TName Term -> m (TName, Term) +unbind = Unbound.unbind ------------------ -- * Alpha equivalence and free variables --- Among other things, the Alpha class enables the following +-- The Unbound library's Alpha class enables the following -- functions: -- -- Compare terms for alpha equivalence -- aeq :: Alpha a => a -> a -> Bool @@ -178,23 +204,23 @@ unPosFlaky t = fromMaybe (newPos "unknown location" 0 0) (unPos t) -- unbind :: (Alpha p, Alpha t, Fresh m) => Bind p t -> m (p, t) -- For Terms, we'd like Alpha equivalence to ignore --- source positions and type annotations. --- We can add these special cases to the definition of `aeq'` --- and then defer all other cases to the generic version of --- the function (Unbound.gaeq). +-- source positions and type annotations. So we make sure to +-- remove them before calling the generic operation. instance Unbound.Alpha Term where - aeq' ctx (Ann a _) b = Unbound.aeq' ctx a b - aeq' ctx a (Ann b _) = Unbound.aeq' ctx a b - aeq' ctx (Pos _ a) b = Unbound.aeq' ctx a b - aeq' ctx a (Pos _ b) = Unbound.aeq' ctx a b - aeq' ctx a b = (Unbound.gaeq ctx `on` from) a b + aeq' :: Unbound.AlphaCtx -> Term -> Term -> Bool + aeq' ctx a b = (Unbound.gaeq ctx `on` from) (strip a) (strip b) + -- For example, all occurrences of annotations and source positions -- are ignored by this definition. --- >>> Unbound.aeq (Pos internalPos (Ann TyBool Type)) TyBool --- True +-- '(Bool : Type)' is alpha-equivalent to 'Bool' +-- >>> aeq (Ann TyBool TyType) TyBool + +-- '(Bool, Bool:Type)' is alpha-equivalent to (Bool, Bool) +-- >>> aeq (Prod TyBool (Ann TyBool TyType)) (Prod TyBool TyBool) + -- At the same time, the generic operation equates terms that differ only -- in the names of bound variables. @@ -215,7 +241,7 @@ idx = Lam (Unbound.bind xName (Var xName)) idy :: Term idy = Lam (Unbound.bind yName (Var yName)) --- >>> Unbound.aeq idx idy +-- >>> aeq idx idy -- True @@ -244,14 +270,6 @@ pi2 :: Term pi2 = TyPi TyBool (Unbound.bind yName (Var yName)) -- >>> Unbound.aeq (Unbound.subst xName TyBool pi1) pi2 --- True --- - ---------------- --- | Bridge function to calculate the free variables of a term - -fv :: Term -> [Unbound.Name Term] -fv = Unbound.toListOf Unbound.fv ----------------- @@ -275,10 +293,11 @@ instance Unbound.Alpha SourcePos where acompare' _ _ _ = EQ -- Substitutions ignore source positions -instance Unbound.Subst b SourcePos where subst _ _ = id; substs _ = id; substBvs _ _ = id +instance Unbound.Subst b SourcePos where + subst _ _ = id + substs _ = id + substBvs _ _ = id + --- Internally generated source positions -internalPos :: SourcePos -internalPos = initialPos "internal" diff --git a/version2/src/TypeCheck.hs b/version2/src/TypeCheck.hs index a6afc3c..be6a8ec 100644 --- a/version2/src/TypeCheck.hs +++ b/version2/src/TypeCheck.hs @@ -1,7 +1,6 @@ {- pi-forall -} -- | The main routines for type-checking -{-# OPTIONS_GHC -Wno-unrecognised-pragmas #-} {-# HLINT ignore "Use forM_" #-} module TypeCheck (tcModules, inferType, checkType) where @@ -23,213 +22,212 @@ import Unbound.Generics.LocallyNameless qualified as Unbound import Unbound.Generics.LocallyNameless.Internal.Fold qualified as Unbound + + +--------------------------------------------------------------------- + -- | Infer/synthesize the type of a term inferType :: Term -> TcMonad Type -inferType t = tcTerm t Nothing +inferType t = case t of + -- i-var + (Var x) -> do + decl <- Env.lookupTy x + return (declType decl) + + -- i-type + TyType -> return TyType + + -- i-pi + (TyPi tyA bnd) -> do + (x, tyB) <- Unbound.unbind bnd + tcType tyA + Env.extendCtx (mkDecl x tyA) (tcType tyB) + return TyType + + -- i-app + (App t1 t2) -> do + ty1 <- inferType t1 + let ensurePi = Equal.ensurePi + + (tyA,bnd) <- ensurePi ty1 + checkType t2 tyA + return (Unbound.instantiate bnd [t2]) + + -- i-ann + (Ann tm ty) -> do + tcType ty + checkType tm ty + return ty + + -- Practicalities + -- remember the current position in the type checking monad + (Pos p tm) -> + Env.extendSourceLocation p tm $ inferType tm + + -- Extensions to the core language + -- i-unit + TyUnit -> return TyType + LitUnit -> return TyUnit --- | Check that the given term has the expected type -checkType :: Term -> Type -> TcMonad () -checkType tm (Pos _ ty) = checkType tm ty -- ignore source positions/annotations -checkType tm (Ann ty _) = checkType tm ty -checkType tm ty = do - nf <- Equal.whnf ty - void $ tcTerm tm (Just nf) + -- i-bool + TyBool -> return TyType + -- i-true/false + (LitBool b) -> return TyBool + -- i-if + (If t1 t2 t3) -> do + checkType t1 TyBool + ty <- inferType t2 + checkType t3 ty + return ty + -- i-eq + (TyEq a b) -> do + aTy <- inferType a + checkType b aTy + return TyType --- | Make sure that the term is a "type" (i.e. that it has type 'Type') -tcType :: Term -> TcMonad () -tcType tm = void $ checkType tm TyType + -- i-sigma + (TySigma tyA bnd) -> do + (x, tyB) <- Unbound.unbind bnd + tcType tyA + Env.extendCtx (mkDecl x tyA) $ tcType tyB + return TyType ---------------------------------------------------------------------- --- | Combined type checking/inference function --- The second argument is 'Just expectedType' in checking mode and 'Nothing' in inference mode --- In either case, this function returns the type of the term -tcTerm :: Term -> Maybe Type -> TcMonad Type --- i-var -tcTerm t@(Var x) Nothing = do - sig <- Env.lookupTy x - return (sigType sig) --- i-type -tcTerm TyType Nothing = return TyType --- i-pi -tcTerm (TyPi tyA bnd) Nothing = do - (x, tyB) <- Unbound.unbind bnd - tcType tyA - Env.extendCtx (mkSig x tyA) (tcType tyB) - return TyType --- c-lam: check the type of a function -tcTerm (Lam bnd) (Just (TyPi tyA bnd2)) = do - -- unbind the variables in the lambda expression and pi type - (x, body,_,tyB) <- Unbound.unbind2Plus bnd bnd2 - - -- check the type of the body of the lambda expression - Env.extendCtx (mkSig x tyA) (checkType body tyB) - return (TyPi tyA bnd2) -tcTerm (Lam _) (Just nf) = - Env.err [DS "Lambda expression should have a function type, not", DD nf] --- i-app -tcTerm (App t1 t2) Nothing = do - ty1 <- inferType t1 - let ensurePi = Equal.ensurePi - - (tyA,bnd) <- ensurePi ty1 - checkType t2 tyA - return (Unbound.instantiate bnd [t2]) - --- i-ann -tcTerm (Ann tm ty) Nothing = do - tcType ty - checkType tm ty - return ty - --- practicalities --- remember the current position in the type checking monad -tcTerm (Pos p tm) mTy = - Env.extendSourceLocation p tm $ tcTerm tm mTy --- ignore term, just return type annotation -tcTerm TrustMe (Just ty) = return ty - --- i-unit -tcTerm TyUnit Nothing = return TyType -tcTerm LitUnit Nothing = return TyUnit --- i-bool -tcTerm TyBool Nothing = return TyType + -- cannot synthesize the type of the term + tm -> + Env.err [DS "Must have a type for", DD tm] --- i-true/false -tcTerm (LitBool b) Nothing = do - return TyBool +------------------------------------------------------------------------- +-- | Make sure that the term is a "type" (i.e. that it has type 'Type') +tcType :: Term -> TcMonad () +tcType tm = checkType tm TyType --- c-if -tcTerm t@(If t1 t2 t3) mty = do - case mty of - Just ty -> do +------------------------------------------------------------------------- +-- | Check that the given term has the expected type +checkType :: Term -> Type -> TcMonad () +checkType tm ty' = do + ty <- Equal.whnf ty' + case tm of + -- c-lam: check the type of a function + (Lam bnd) -> case ty of + (TyPi tyA bnd2) -> do + -- unbind the variables in the lambda expression and pi type + (x, body,_,tyB) <- Unbound.unbind2Plus bnd bnd2 + + -- check the type of the body of the lambda expression + Env.extendCtx (mkDecl x tyA) (checkType body tyB) + _ -> Env.err [DS "Lambda expression should have a function type, not", DD ty] + + -- Practicalities + (Pos p tm) -> + Env.extendSourceLocation p tm $ checkType tm ty + + TrustMe -> return () + + PrintMe -> do + gamma <- Env.getLocalCtx + Env.warn [DS "Unmet obligation.\nContext:", DD gamma, + DS "\nGoal:", DD ty] + + -- Extensions to the core language + -- c-if + (If t1 t2 t3) -> do checkType t1 TyBool dtrue <- Equal.unify [] t1 (LitBool True) dfalse <- Equal.unify [] t1 (LitBool False) Env.extendCtxs dtrue $ checkType t2 ty - Env.extendCtxs dfalse $ checkType t3 ty - return ty - Nothing -> do - checkType t1 TyBool - ty <- inferType t2 - checkType t3 ty - return ty - - -tcTerm (Let rhs bnd) mty = do - (x, body) <- Unbound.unbind bnd - aty <- inferType rhs - ty <- Env.extendCtxs [mkSig x aty, Def x rhs] $ - tcTerm body mty - case mty of - Just _ -> return ty - Nothing -> return $ Unbound.subst x rhs ty - - - -tcTerm (TyEq a b) Nothing = do - aTy <- inferType a - checkType b aTy - return TyType -tcTerm Refl (Just ty@(TyEq a b)) = do - Equal.equate a b - return ty -tcTerm Refl (Just ty) = - Env.err [DS "Refl annotated with", DD ty] -tcTerm t@(Subst a b) (Just ty) = do - -- infer the type of the proof 'b' - tp <- inferType b - -- make sure that it is an equality between m and n - (m, n) <- Equal.ensureTyEq tp - -- if either side is a variable, add a definition to the context - edecl <- Equal.unify [] m n - -- if proof is a variable, add a definition to the context - pdecl <- Equal.unify [] b Refl - _ <- Env.extendCtxs (edecl ++ pdecl) $ checkType a ty - return ty -tcTerm t@(Contra p) (Just ty) = do - ty' <- inferType p - (a, b) <- Equal.ensureTyEq ty' - a' <- Equal.whnf a - b' <- Equal.whnf b - case (a', b') of + Env.extendCtxs dfalse $ checkType t3 ty + + -- c-let + (Let rhs bnd) -> do + (x, body) <- Unbound.unbind bnd + aty <- inferType rhs + Env.extendCtxs [mkDecl x aty, Def x rhs] $ + checkType body ty + + -- c-refl + Refl -> case ty of + (TyEq a b) -> Equal.equate a b + _ -> Env.err [DS "Refl annotated with", DD ty] + -- c-subst + (Subst a b) -> do + -- infer the type of the proof 'b' + tp <- inferType b + -- make sure that it is an equality between m and n + (m, n) <- Equal.ensureTyEq tp + -- if either side is a variable, add a definition to the context + edecl <- Equal.unify [] m n + -- if proof is a variable, add a definition to the context + pdecl <- Equal.unify [] b Refl + Env.extendCtxs (edecl ++ pdecl) $ checkType a ty + -- c-contra + (Contra p) -> do + ty' <- inferType p + (a, b) <- Equal.ensureTyEq ty' + a' <- Equal.whnf a + b' <- Equal.whnf b + case (a', b') of + + + (LitBool b1, LitBool b2) + | b1 /= b2 -> + return () + (_, _) -> + Env.err + [ DS "I can't tell that", + DD a, + DS "and", + DD b, + DS "are contradictory" + ] + + -- c-prod + (Prod a b) -> do + case ty of + (TySigma tyA bnd) -> do + (x, tyB) <- Unbound.unbind bnd + checkType a tyA + Env.extendCtxs [mkDecl x tyA, Def x a] $ checkType b tyB + _ -> + Env.err + [ DS "Products must have Sigma Type", + DD ty, + DS "found instead" + ] + + + -- c-letpair + (LetPair p bnd) -> do + ((x, y), body) <- Unbound.unbind bnd + pty <- inferType p + pty' <- Equal.whnf pty + case pty' of + TySigma tyA bnd' -> do + let tyB = Unbound.instantiate bnd' [Var x] + decl <- Equal.unify [] p (Prod (Var x) (Var y)) + Env.extendCtxs ([mkDecl x tyA, mkDecl y tyB] ++ decl) $ + checkType body ty + _ -> Env.err [DS "Scrutinee of LetPair must have Sigma type"] + + + + -- c-infer + tm -> do + ty' <- inferType tm + Equal.equate ty' ty - (LitBool b1, LitBool b2) - | b1 /= b2 -> - return ty - (_, _) -> - Env.err - [ DS "I can't tell that", - DD a, - DS "and", - DD b, - DS "are contradictory" - ] - - -tcTerm t@(TySigma tyA bnd) Nothing = do - (x, tyB) <- Unbound.unbind bnd - tcType tyA - Env.extendCtx (mkSig x tyA) $ tcType tyB - return TyType - - -tcTerm t@(Prod a b) (Just ty) = do - case ty of - (TySigma tyA bnd) -> do - (x, tyB) <- Unbound.unbind bnd - checkType a tyA - Env.extendCtxs [mkSig x tyA, Def x a] $ checkType b tyB - return (TySigma tyA (Unbound.bind x tyB)) - _ -> - Env.err - [ DS "Products must have Sigma Type", - DD ty, - DS "found instead" - ] - - -tcTerm t@(LetPair p bnd) (Just ty) = do - ((x, y), body) <- Unbound.unbind bnd - pty <- inferType p - pty' <- Equal.whnf pty - case pty' of - TySigma tyA bnd' -> do - let tyB = Unbound.instantiate bnd' [Var x] - decl <- Equal.unify [] p (Prod (Var x) (Var y)) - Env.extendCtxs ([mkSig x tyA, mkSig y tyB] ++ decl) $ - checkType body ty - return ty - _ -> Env.err [DS "Scrutinee of LetPair must have Sigma type"] - - -tcTerm PrintMe (Just ty) = do - gamma <- Env.getLocalCtx - Env.warn [DS "Unmet obligation.\nContext:", DD gamma, - DS "\nGoal:", DD ty] - return ty - --- c-infer -tcTerm tm (Just ty) = do - ty' <- inferType tm - Equal.equate ty' ty - - return ty' - -tcTerm tm Nothing = - Env.err [DS "Must have a type annotation to check", DD tm] --------------------------------------------------------------------- -- helper functions for type checking -- | Create a Def if either side normalizes to a single variable -def :: Term -> Term -> TcMonad [Decl] +def :: Term -> Term -> TcMonad [Entry] def t1 t2 = do nf1 <- Equal.whnf t1 nf2 <- Equal.whnf t2 @@ -262,11 +260,11 @@ tcModules = foldM tcM [] -- | Typecheck an entire module. tcModule :: - -- | List of already checked modules (including their Decls). + -- | List of already checked modules (including their entries). [Module] -> -- | Module to check. Module -> - -- | The same module with all Decls checked and elaborated. + -- | The same module with all entries checked and elaborated. TcMonad Module tcModule defs m' = do checkedEntries <- @@ -278,23 +276,23 @@ tcModule defs m' = do return $ m' {moduleEntries = checkedEntries} where d `tcE` m = do - -- Extend the Env per the current Decl before checking - -- subsequent Decls. + -- Extend the Env per the current Entry before checking + -- subsequent entries. x <- tcEntry d case x of AddHint hint -> Env.extendHints hint m - -- Add decls to the Decls to be returned + -- Add decls to the entries to be returned AddCtx decls -> (decls ++) <$> Env.extendCtxsGlobal decls m -- Get all of the defs from imported modules (this is the env to check current module in) importedModules = filter (\x -> ModuleImport (moduleName x) `elem` moduleImports m') defs --- | The Env-delta returned when type-checking a top-level Decl. +-- | The Env-delta returned when type-checking a top-level Entry. data HintOrCtx - = AddHint Sig - | AddCtx [Decl] + = AddHint Decl + | AddCtx [Entry] -- | Check each sort of declaration in a module -tcEntry :: Decl -> TcMonad HintOrCtx +tcEntry :: Entry -> TcMonad HintOrCtx tcEntry (Def n term) = do oldDef <- Env.lookupDef n maybe tc die oldDef @@ -304,22 +302,20 @@ tcEntry (Def n term) = do case lkup of Nothing -> do ty <- inferType term - return $ AddCtx [TypeSig (Sig n ty), Def n term] - Just sig -> + return $ AddCtx [TypeDecl (Decl n ty), Def n term] + Just decl -> let handler (Env.Err ps msg) = throwError $ Env.Err ps (msg $$ msg') msg' = disp [ DS "When checking the term", DD term, - DS "against the signature", - DD sig + DS "against the type", + DD decl ] in do - Env.extendCtx (TypeSig sig) $ checkType term (sigType sig) `catchError` handler - if n `elem` fv term - then return $ AddCtx [TypeSig sig, RecDef n term] - else return $ AddCtx [TypeSig sig, Def n term] + Env.extendCtx (TypeDecl decl) $ checkType term (declType decl) `catchError` handler + return $ AddCtx [TypeDecl decl, Def n term] die term' = Env.extendSourceLocation (unPosFlaky term) term $ Env.err @@ -328,34 +324,34 @@ tcEntry (Def n term) = do DS "Previous definition was", DD term' ] -tcEntry (TypeSig sig) = do - duplicateTypeBindingCheck sig - tcType (sigType sig) - return $ AddHint sig +tcEntry (TypeDecl decl) = do + duplicateTypeBindingCheck decl + tcType (declType decl) + return $ AddHint decl + -tcEntry _ = Env.err "unimplemented" -- | Make sure that we don't have the same name twice in the -- environment. (We don't rename top-level module definitions.) -duplicateTypeBindingCheck :: Sig -> TcMonad () -duplicateTypeBindingCheck sig = do +duplicateTypeBindingCheck :: Decl -> TcMonad () +duplicateTypeBindingCheck decl = do -- Look for existing type bindings ... - let n = sigName sig + let n = declName decl l <- Env.lookupTyMaybe n l' <- Env.lookupHint n -- ... we don't care which, if either are Just. case catMaybes [l, l'] of [] -> return () -- We already have a type in the environment so fail. - sig' : _ -> - let p = unPosFlaky $ sigType sig + decl' : _ -> + let p = unPosFlaky $ declType decl msg = - [ DS "Duplicate type signature", - DD sig, + [ DS "Duplicate type declaration", + DD decl, DS "Previous was", - DD sig' + DD decl' ] - in Env.extendSourceLocation p sig $ Env.err msg + in Env.extendSourceLocation p decl $ Env.err msg diff --git a/version3/pi-forall.cabal b/version3/pi-forall.cabal index e7a8c0c..ee29759 100644 --- a/version3/pi-forall.cabal +++ b/version3/pi-forall.cabal @@ -21,7 +21,7 @@ common shared-properties default-language: GHC2021 ghc-options: - -Wall -fno-warn-unused-matches -fno-warn-orphans -fno-warn-unused-top-binds -fno-warn-unused-imports -fno-warn-name-shadowing + -Wall -fno-warn-unused-matches -fno-warn-orphans -fno-warn-unused-top-binds -fno-warn-unused-imports -fno-warn-name-shadowing -Wno-unrecognised-pragmas default-extensions: DefaultSignatures DeriveAnyClass diff --git a/version3/src/Environment.hs b/version3/src/Environment.hs index 7eb9703..0937d36 100644 --- a/version3/src/Environment.hs +++ b/version3/src/Environment.hs @@ -9,7 +9,6 @@ module Environment lookupTy, lookupTyMaybe, lookupDef, - lookupRecDef, lookupHint , getCtx, getLocalCtx, @@ -62,15 +61,15 @@ data SourceLocation where -- | Environment manipulation and accessing functions -- The context 'gamma' is a list data Env = Env - { -- | elaborated term and datatype declarations. - ctx :: [Decl], + { -- | elaborated term and datatype declarations + ctx :: [Entry], -- | how long the tail of "global" variables in the context is -- (used to supress printing those in error messages) globals :: Int, - -- | Type declarations (signatures): it's not safe to + -- | Type declarations: it's not safe to -- put these in the context until a corresponding term -- has been checked. - hints :: [Sig], + hints :: [Decl], -- | what part of the file we are in (for errors/warnings) sourceLocation :: [SourceLocation] } @@ -92,35 +91,35 @@ instance Disp Env where debugDisp e = vcat [debugDisp decl | decl <- ctx e] -- | Find a name's user supplied type signature. -lookupHint :: (MonadReader Env m) => TName -> m (Maybe Sig) +lookupHint :: (MonadReader Env m) => TName -> m (Maybe Decl) lookupHint v = do hints <- asks hints - return $ listToMaybe [ sig | sig <- hints, v == sigName sig] + return $ listToMaybe [ sig | sig <- hints, v == declName sig] -- | Find a name's type in the context. lookupTyMaybe :: (MonadReader Env m) => TName -> - m (Maybe Sig) + m (Maybe Decl) lookupTyMaybe v = do ctx <- asks ctx return $ go ctx where go [] = Nothing - go (TypeSig sig : ctx) - | v == sigName sig = Just sig + go (TypeDecl sig : ctx) + | v == declName sig = Just sig | otherwise = go ctx - go (Demote ep : ctx) = demoteSig ep <$> go ctx + go (Demote ep : ctx) = demoteDecl ep <$> go ctx go (_ : ctx) = go ctx -demoteSig :: Epsilon -> Sig -> Sig -demoteSig ep s = s { sigEp = min ep (sigEp s) } +demoteDecl :: Epsilon -> Decl -> Decl +demoteDecl ep s = s { declEp = min ep (declEp s) } -- | Find the type of a name specified in the context -- throwing an error if the name doesn't exist lookupTy :: - TName -> TcMonad Sig + TName -> TcMonad Decl lookupTy v = do x <- lookupTyMaybe v @@ -143,28 +142,20 @@ lookupDef v = do ctx <- asks ctx return $ listToMaybe [a | Def v' a <- ctx, v == v'] -lookupRecDef :: - (MonadReader Env m) => - TName -> - m (Maybe Term) -lookupRecDef v = do - ctx <- asks ctx - return $ listToMaybe [a | RecDef v' a <- ctx, v == v'] - -- | Extend the context with a new binding -extendCtx :: (MonadReader Env m) => Decl -> m a -> m a +extendCtx :: (MonadReader Env m) => Entry -> m a -> m a extendCtx d = local (\m@Env{ctx = cs} -> m {ctx = d : cs}) -- | Extend the context with a list of bindings -extendCtxs :: (MonadReader Env m) => [Decl] -> m a -> m a +extendCtxs :: (MonadReader Env m) => [Entry] -> m a -> m a extendCtxs ds = local (\m@Env {ctx = cs} -> m {ctx = ds ++ cs}) -- | Extend the context with a list of bindings, marking them as "global" -extendCtxsGlobal :: (MonadReader Env m) => [Decl] -> m a -> m a +extendCtxsGlobal :: (MonadReader Env m) => [Entry] -> m a -> m a extendCtxsGlobal ds = local ( \m@Env {ctx = cs} -> @@ -186,11 +177,11 @@ extendCtxMods :: (MonadReader Env m) => [Module] -> m a -> m a extendCtxMods mods k = foldr extendCtxMod k mods -- | Get the complete current context -getCtx :: MonadReader Env m => m [Decl] +getCtx :: MonadReader Env m => m [Entry] getCtx = asks ctx -- | Get the prefix of the context that corresponds to local variables. -getLocalCtx :: MonadReader Env m => m [Decl] +getLocalCtx :: MonadReader Env m => m [Entry] getLocalCtx = do g <- asks ctx glen <- asks globals @@ -206,7 +197,7 @@ getSourceLocation :: MonadReader Env m => m [SourceLocation] getSourceLocation = asks sourceLocation -- | Add a type hint -extendHints :: (MonadReader Env m) => Sig -> m a -> m a +extendHints :: (MonadReader Env m) => Decl -> m a -> m a extendHints h = local (\m@Env {hints = hs} -> m {hints = h : hs}) -- | An error that should be reported to the user diff --git a/version3/src/Equal.hs b/version3/src/Equal.hs index 81a98af..e33092e 100644 --- a/version3/src/Equal.hs +++ b/version3/src/Equal.hs @@ -151,11 +151,7 @@ whnf (Var x) = do maybeDef <- Env.lookupDef x case maybeDef of (Just d) -> whnf d - _ -> do - maybeRecDef <- Env.lookupRecDef x - case maybeRecDef of - (Just d) -> whnf d - _ -> return (Var x) + _ -> return (Var x) whnf (App t1 t2) = do nf <- whnf t1 @@ -198,7 +194,7 @@ whnf tm = return tm -- | 'Unify' the two terms, producing a list of Defs -- If there is an obvious mismatch, this function produces an error -- If either term is "ambiguous" just ignore. -unify :: [TName] -> Term -> Term -> TcMonad [Decl] +unify :: [TName] -> Term -> Term -> TcMonad [Entry] unify ns tx ty = do txnf <- whnf tx tynf <- whnf ty diff --git a/version3/src/Parser.hs b/version3/src/Parser.hs index 122f99a..55b32a0 100644 --- a/version3/src/Parser.hs +++ b/version3/src/Parser.hs @@ -3,7 +3,7 @@ -- | A parsec-based parser for the concrete syntax module Parser ( - parseModuleFile, + parseModuleFile, parseModuleImports, parseExpr, expr, @@ -19,7 +19,7 @@ import qualified Unbound.Generics.LocallyNameless as Unbound import Text.Parsec hiding (State,Empty) import Text.Parsec.Expr(Operator(..),Assoc(..),buildExpressionParser) -import qualified LayoutToken as Token +import qualified LayoutToken as Token import Control.Monad.State.Lazy hiding (join) import Control.Monad.Except ( MonadError(throwError) ) @@ -82,13 +82,13 @@ Optional components in this BNF are marked with < > A -> B - Get parsed as (x:A) -> B, with an internal name for x + Get parsed as (_:A) -> B, with a wildcard name for the binder - Nondependent product types, like: A * B - Get parsed as { x:A | B }, with an internal name for x + Get parsed as { _:A | B }, with a wildcard name for the binder - You can collapse lambdas, like: @@ -104,6 +104,12 @@ Optional components in this BNF are marked with < > -} + +-- | Default name (for parsing 'A -> B' as '(_:A) -> B') +wildcardName :: TName +wildcardName = Unbound.string2Name "_" + + liftError :: (MonadError e m) => Either e a -> m a liftError (Left e) = throwError e liftError (Right a) = return a @@ -120,13 +126,13 @@ parseModuleFile name = do parseModuleImports :: (MonadError ParseError m, MonadIO m) => String -> m Module parseModuleImports name = do contents <- liftIO $ readFile name - liftError $ Unbound.runFreshM $ + liftError $ Unbound.runFreshM $ (runParserT (do { whiteSpace; moduleImports }) [] name contents) -- | Test an 'LParser' on a String. testParser :: LParser t -> String -> Either ParseError t -testParser parser str = Unbound.runFreshM $ +testParser parser str = Unbound.runFreshM $ runParserT (do { whiteSpace; v <- parser; eof; return v}) [] "" str @@ -174,10 +180,10 @@ piforallStyle = Token.LanguageDef ,"axiom" ,"TRUSTME" ,"PRINTME" - ,"ord" - ,"Bool", "True", "False" + ,"ord" + ,"Bool", "True", "False" ,"if","then","else" - ,"Unit", "()" + ,"Unit", "()" ] , Token.reservedOpNames = ["!","?","\\",":",".",",","<", "=", "+", "-", "*", "^", "()", "_","|","{", "}"] @@ -194,9 +200,9 @@ whiteSpace = Token.whiteSpace tokenizer variable :: LParser TName variable = - do i <- identifier + do i <- identifier return $ Unbound.string2Name i - + @@ -205,7 +211,7 @@ colon, dot, comma :: LParser () colon = Token.colon tokenizer >> return () dot = Token.dot tokenizer >> return () comma = Token.comma tokenizer >> return () - + reserved,reservedOp :: String -> LParser () reserved = Token.reserved tokenizer reservedOp = Token.reservedOp tokenizer @@ -240,20 +246,20 @@ importDef = do reserved "import" >> (ModuleImport <$> importName) where importName = identifier - + --- --- Top level declarations --- -decl,sigDef,valDef :: LParser Decl -decl = sigDef <|> valDef +decl,declDef,valDef :: LParser Entry +decl = declDef <|> valDef + - -sigDef = do +declDef = do n <- try (variable >>= \v -> colon >> return v) ty <- expr - return (mkSig n ty) + return (mkDecl n ty) valDef = do n <- try (do {n <- variable; reservedOp "="; return n}) @@ -276,13 +282,13 @@ printme = reserved "PRINTME" *> return (PrintMe ) refl :: LParser Term refl = do reserved "Refl" - return $ Refl + return $ Refl -- Expressions expr,term,factor :: LParser Term - + -- expr is the toplevel expression grammar expr = do p <- getPosition @@ -291,18 +297,18 @@ expr = do [ifix AssocLeft "=" TyEq], [ifixM AssocRight "->" mkArrowType], [ifixM AssocRight "*" mkTupleType] - ] + ] ifix assoc op f = Infix (reservedOp op >> return f) assoc ifixM assoc op f = Infix (reservedOp op >> f) assoc - mkArrowType = + mkArrowType = do n <- Unbound.fresh wildcardName - return $ \tyA tyB -> + return $ \tyA tyB -> TyPi Rel tyA (Unbound.bind n tyB) - mkTupleType = + mkTupleType = do n <- Unbound.fresh wildcardName - return $ \tyA tyB -> + return $ \tyA tyB -> TySigma tyA (Unbound.bind n tyB) - + -- A "term" is either a function application or a constructor -- application. Breaking it out as a seperate category both -- eliminates left-recursion in ( := ) and @@ -310,19 +316,19 @@ expr = do term = funapp - + funapp :: LParser Term -funapp = do +funapp = do f <- factor foldl' app f <$> many bfactor where - bfactor = ((,Irr) <$> brackets expr) + bfactor = ((,Irr) <$> brackets expr) <|> ((,Rel) <$> factor) app e1 (e2,ep) = App e1 (Arg ep e2) -factor = choice [ Var <$> variable "a variable" +factor = choice [ Var <$> variable "a variable" , typen "Type" , lambda "a lambda" , try letPairExp "a let pair" @@ -335,16 +341,16 @@ factor = choice [ Var <$> variable "a variable" , printme "PRINTME" , impProd "an implicit function type" - , bconst "a constant" - , ifExpr "an if expression" - , sigmaTy "a sigma type" - + , bconst "a constant" + , ifExpr "an if expression" + , sigmaTy "a sigma type" + , expProdOrAnnotOrParens "an explicit function type or annotated expression" ] impOrExpVar :: LParser (TName, Epsilon) -impOrExpVar = try ((,Irr) <$> (brackets variable)) +impOrExpVar = try ((,Irr) <$> (brackets variable)) <|> (,Rel) <$> variable @@ -361,12 +367,12 @@ lambda = do reservedOp "\\" binds <- many1 impOrExpVar dot body <- expr - return $ foldr lam body binds + return $ foldr lam body binds where - lam (x, ep) m = Lam ep (Unbound.bind x m) - + lam (x, ep) m = Lam ep (Unbound.bind x m) + + - bconst :: LParser Term @@ -378,7 +384,7 @@ bconst = choice [reserved "Bool" >> return TyBool, ifExpr :: LParser Term -ifExpr = +ifExpr = do reserved "if" a <- expr reserved "then" @@ -386,7 +392,7 @@ ifExpr = reserved "else" c <- expr return (If a b c ) - + -- letExpr :: LParser Term @@ -418,10 +424,10 @@ letPairExp = do -- These have the syntax [x:a] -> b or [a] -> b . impProd :: LParser Term impProd = - do (x,tyA) <- brackets + do (x,tyA) <- brackets (try ((,) <$> variable <*> (colon >> expr)) <|> ((,) <$> Unbound.fresh wildcardName <*> expr)) - reservedOp "->" + reservedOp "->" tyB <- expr return $ TyPi Irr tyA (Unbound.bind x tyB) @@ -462,13 +468,13 @@ expProdOrAnnotOrParens = (do b <- afterBinder return $ TyPi Rel a (Unbound.bind x b)) Colon a b -> return $ Ann a b - - Comma a b -> + + Comma a b -> return $ Prod a b Nope a -> return a - - + + -- subst e0 by e1 substExpr :: LParser Term @@ -477,16 +483,16 @@ substExpr = do a <- expr reserved "by" b <- expr - return $ Subst a b + return $ Subst a b contra :: LParser Term contra = do reserved "contra" witness <- expr - return $ Contra witness + return $ Contra witness -sigmaTy :: LParser Term +sigmaTy :: LParser Term sigmaTy = do reservedOp "{" x <- variable @@ -496,5 +502,5 @@ sigmaTy = do b <- expr reservedOp "}" return (TySigma a (Unbound.bind x b)) - - + + diff --git a/version3/src/PrettyPrint.hs b/version3/src/PrettyPrint.hs index 60c1ea2..c130026 100644 --- a/version3/src/PrettyPrint.hs +++ b/version3/src/PrettyPrint.hs @@ -120,11 +120,11 @@ instance Disp Module instance Disp ModuleImport -instance Disp Decl +instance Disp Entry -instance Disp [Decl] +instance Disp [Entry] -instance Disp Sig +instance Disp Decl instance Disp Arg @@ -152,24 +152,23 @@ instance Display Module where instance Display ModuleImport where display (ModuleImport i) = pure $ PP.text "import" <+> disp i -instance Display [Decl] where +instance Display [Entry] where display ds = do dd <- mapM display ds pure $ PP.vcat dd -instance Display Sig where - display sig = do - dn <- display (sigName sig) - dt <- display (sigType sig) +instance Display Decl where + display decl = do + dn <- display (declName decl) + dt <- display (declType decl) pure $ dn <+> PP.text ":" <+> dt -instance Display Decl where +instance Display Entry where display (Def n term) = do dn <- display n dt <- display term pure $ dn <+> PP.text "=" <+> dt - display (RecDef n f) = display (Def n f) - display (TypeSig sig) = display sig + display (TypeDecl decl) = display decl display (Demote ep) = return mempty diff --git a/version3/src/Syntax.hs b/version3/src/Syntax.hs index e1f50cd..206d461 100644 --- a/version3/src/Syntax.hs +++ b/version3/src/Syntax.hs @@ -25,11 +25,8 @@ import Data.Function (on) -- and alpha-equality function. The abstract type `Name` from -- this library is indexed by the AST type that this variable -- is a name for. -type TName = Unbound.Name Term - --- | module names -type ModuleName = String +type TName = Unbound.Name Term ----------------------------------------- @@ -121,12 +118,15 @@ data Epsilon ----------------------------------------- +-- | module names +type ModuleName = String + -- | A Module has a name, a list of imports, a list of declarations, -- and a set of constructor names (which affect parsing). data Module = Module { moduleName :: ModuleName, moduleImports :: [ModuleImport], - moduleEntries :: [Decl] + moduleEntries :: [Entry] } deriving (Show, Generic, Typeable, Unbound.Alpha) @@ -135,37 +135,40 @@ newtype ModuleImport = ModuleImport ModuleName deriving (Show, Eq, Generic, Typeable) deriving anyclass (Unbound.Alpha) --- | A type declaration (or type signature) -data Sig = Sig {sigName :: TName , sigEp :: Epsilon , sigType :: Type} +-- | A type declaration (or type declnature) +data Decl = Decl {declName :: TName , declEp :: Epsilon , declType :: Type} deriving (Show, Generic, Typeable, Unbound.Alpha, Unbound.Subst Term) -- | Declare the type of a term -mkSig :: TName -> Type -> Decl -mkSig n ty = TypeSig (Sig n Rel ty) - --- | Declarations are the components of modules -data Decl - = -- | Declaration for the type of a term - TypeSig Sig - | -- | The definition of a particular name, must +mkDecl :: TName -> Type -> Entry +mkDecl n ty = TypeDecl (Decl n Rel ty) + +-- | Entries are the components of modules +data Entry + = -- | Declaration for the type of a term 'x : A' + TypeDecl Decl + | -- | The definition of a particular name, must 'x = a' -- already have a type declaration in scope Def TName Term - | -- | A potentially (recursive) definition of - -- a particular name, must be declared - RecDef TName Term -- | Adjust the context for relevance checking | Demote Epsilon deriving (Show, Generic, Typeable) deriving anyclass (Unbound.Alpha, Unbound.Subst Term) --- * Auxiliary functions on syntax --- | Default name for '_' occurring in patterns -wildcardName :: TName -wildcardName = Unbound.string2Name "_" +----------------------------------------- +-- * Auxiliary functions on syntax +----------------------------------------- + + +-- | Remove source positions and type annotations from the top level of a term +strip :: Term -> Term +strip (Pos _ tm) = strip tm +strip (Ann tm _) = strip tm +strip tm = tm -- | Partial inverse of Pos unPos :: Term -> Maybe SourcePos @@ -177,18 +180,41 @@ unPosFlaky :: Term -> SourcePos unPosFlaky t = fromMaybe (newPos "unknown location" 0 0) (unPos t) ------------------ + +----------------------------------------- +-- * Unbound library +----------------------------------------- -- We use the unbound-generics library to mark the binding occurrences of -- variables in the syntax. That allows us to automatically derive -- functions for alpha-equivalence, free variables and substitution -- using generic programming. +-- | Determine when two terms are alpha-equivalent (see below) +aeq :: Term -> Term -> Bool +aeq = Unbound.aeq + +-- | Calculate the free variables of a term +fv :: Term -> [Unbound.Name Term] +fv = Unbound.toListOf Unbound.fv + +-- | subst x b a means to replace x with b in a +-- i.e. a [ b / x ] +subst :: TName -> Term -> Term -> Term +subst = Unbound.subst + +-- | in a binder "x.a" replace x with b +instantiate :: Unbound.Bind TName Term -> Term -> Term +instantiate bnd a = Unbound.instantiate bnd [a] + +-- | in a binder "x.a" replace x with a fresh name +unbind :: (Unbound.Fresh m) => Unbound.Bind TName Term -> m (TName, Term) +unbind = Unbound.unbind ------------------ -- * Alpha equivalence and free variables --- Among other things, the Alpha class enables the following +-- The Unbound library's Alpha class enables the following -- functions: -- -- Compare terms for alpha equivalence -- aeq :: Alpha a => a -> a -> Bool @@ -198,23 +224,23 @@ unPosFlaky t = fromMaybe (newPos "unknown location" 0 0) (unPos t) -- unbind :: (Alpha p, Alpha t, Fresh m) => Bind p t -> m (p, t) -- For Terms, we'd like Alpha equivalence to ignore --- source positions and type annotations. --- We can add these special cases to the definition of `aeq'` --- and then defer all other cases to the generic version of --- the function (Unbound.gaeq). +-- source positions and type annotations. So we make sure to +-- remove them before calling the generic operation. instance Unbound.Alpha Term where - aeq' ctx (Ann a _) b = Unbound.aeq' ctx a b - aeq' ctx a (Ann b _) = Unbound.aeq' ctx a b - aeq' ctx (Pos _ a) b = Unbound.aeq' ctx a b - aeq' ctx a (Pos _ b) = Unbound.aeq' ctx a b - aeq' ctx a b = (Unbound.gaeq ctx `on` from) a b + aeq' :: Unbound.AlphaCtx -> Term -> Term -> Bool + aeq' ctx a b = (Unbound.gaeq ctx `on` from) (strip a) (strip b) + -- For example, all occurrences of annotations and source positions -- are ignored by this definition. --- >>> Unbound.aeq (Pos internalPos (Ann TyBool Type)) TyBool --- True +-- '(Bool : Type)' is alpha-equivalent to 'Bool' +-- >>> aeq (Ann TyBool TyType) TyBool + +-- '(Bool, Bool:Type)' is alpha-equivalent to (Bool, Bool) +-- >>> aeq (Prod TyBool (Ann TyBool TyType)) (Prod TyBool TyBool) + -- At the same time, the generic operation equates terms that differ only -- in the names of bound variables. @@ -235,7 +261,7 @@ idx = Lam Rel (Unbound.bind xName (Var xName)) idy :: Term idy = Lam Rel (Unbound.bind yName (Var yName)) --- >>> Unbound.aeq idx idy +-- >>> aeq idx idy -- True @@ -264,14 +290,6 @@ pi2 :: Term pi2 = TyPi Rel TyBool (Unbound.bind yName (Var yName)) -- >>> Unbound.aeq (Unbound.subst xName TyBool pi1) pi2 --- True --- - ---------------- --- | Bridge function to calculate the free variables of a term - -fv :: Term -> [Unbound.Name Term] -fv = Unbound.toListOf Unbound.fv ----------------- @@ -295,10 +313,11 @@ instance Unbound.Alpha SourcePos where acompare' _ _ _ = EQ -- Substitutions ignore source positions -instance Unbound.Subst b SourcePos where subst _ _ = id; substs _ = id; substBvs _ _ = id +instance Unbound.Subst b SourcePos where + subst _ _ = id + substs _ = id + substBvs _ _ = id + --- Internally generated source positions -internalPos :: SourcePos -internalPos = initialPos "internal" diff --git a/version3/src/TypeCheck.hs b/version3/src/TypeCheck.hs index 0b35105..25cd666 100644 --- a/version3/src/TypeCheck.hs +++ b/version3/src/TypeCheck.hs @@ -1,7 +1,6 @@ {- pi-forall -} -- | The main routines for type-checking -{-# OPTIONS_GHC -Wno-unrecognised-pragmas #-} {-# HLINT ignore "Use forM_" #-} module TypeCheck (tcModules, inferType, checkType) where @@ -23,222 +22,221 @@ import Unbound.Generics.LocallyNameless qualified as Unbound import Unbound.Generics.LocallyNameless.Internal.Fold qualified as Unbound + + +--------------------------------------------------------------------- + -- | Infer/synthesize the type of a term inferType :: Term -> TcMonad Type -inferType t = tcTerm t Nothing +inferType t = case t of + -- i-var + (Var x) -> do + decl <- Env.lookupTy x -- make sure the variable is accessible + Env.checkStage (declEp decl) + return (declType decl) + + -- i-type + TyType -> return TyType + + -- i-pi + (TyPi ep tyA bnd) -> do + (x, tyB) <- Unbound.unbind bnd + tcType tyA + Env.extendCtx (TypeDecl (Decl x ep tyA)) (tcType tyB) + return TyType + + -- i-app + (App t1 t2) -> do + ty1 <- inferType t1 + let ensurePi = Equal.ensurePi + + (ep1, tyA, bnd) <- ensurePi ty1 + unless (ep1 == argEp t2) $ Env.err + [DS "In application, expected", DD ep1, DS "argument but found", + DD t2, DS "instead." ] + -- if the argument is Irrelevant, resurrect the context + (if ep1 == Irr then Env.extendCtx (Demote Rel) else id) $ + checkType (unArg t2) tyA + return (Unbound.instantiate bnd [unArg t2]) + --- | Check that the given term has the expected type -checkType :: Term -> Type -> TcMonad () -checkType tm (Pos _ ty) = checkType tm ty -- ignore source positions/annotations -checkType tm (Ann ty _) = checkType tm ty -checkType tm ty = do - nf <- Equal.whnf ty - void $ tcTerm tm (Just nf) + -- i-ann + (Ann tm ty) -> do + tcType ty + checkType tm ty + return ty + + -- Practicalities + -- remember the current position in the type checking monad + (Pos p tm) -> + Env.extendSourceLocation p tm $ inferType tm + + -- Extensions to the core language + -- i-unit + TyUnit -> return TyType + LitUnit -> return TyUnit + -- i-bool + TyBool -> return TyType + -- i-true/false + (LitBool b) -> return TyBool --- | Make sure that the term is a "type" (i.e. that it has type 'Type') -tcType :: Term -> TcMonad () -tcType tm = void $ Env.withStage Irr $ checkType tm TyType + -- i-if + (If t1 t2 t3) -> do + checkType t1 TyBool + ty <- inferType t2 + checkType t3 ty + return ty + -- i-eq + (TyEq a b) -> do + aTy <- inferType a + checkType b aTy + return TyType ---------------------------------------------------------------------- + -- i-sigma + (TySigma tyA bnd) -> do + (x, tyB) <- Unbound.unbind bnd + tcType tyA + Env.extendCtx (mkDecl x tyA) $ tcType tyB + return TyType --- | Combined type checking/inference function --- The second argument is 'Just expectedType' in checking mode and 'Nothing' in inference mode --- In either case, this function returns the type of the term -tcTerm :: Term -> Maybe Type -> TcMonad Type --- i-var -tcTerm t@(Var x) Nothing = do - sig <- Env.lookupTy x -- make sure the variable is accessible - Env.checkStage (sigEp sig) - return (sigType sig) --- i-type -tcTerm TyType Nothing = return TyType --- i-pi -tcTerm (TyPi ep tyA bnd) Nothing = do - (x, tyB) <- Unbound.unbind bnd - tcType tyA - Env.extendCtx (TypeSig (Sig x ep tyA)) (tcType tyB) - return TyType --- c-lam: check the type of a function -tcTerm (Lam ep1 bnd) (Just (TyPi ep2 tyA bnd2)) = do - -- unbind the variables in the lambda expression and pi type - (x, body,_,tyB) <- Unbound.unbind2Plus bnd bnd2 --- epsilons should match up - unless (ep1 == ep2) $ Env.err [DS "In function definition, expected", DD ep2, DS "parameter", DD x, - DS "but found", DD ep1, DS "instead."] - -- check the type of the body of the lambda expression - Env.extendCtx (TypeSig (Sig x ep1 tyA)) (checkType body tyB) - return (TyPi ep1 tyA bnd2) -tcTerm (Lam _ _) (Just nf) = - Env.err [DS "Lambda expression should have a function type, not", DD nf] --- i-app -tcTerm (App t1 t2) Nothing = do - ty1 <- inferType t1 - let ensurePi = Equal.ensurePi - - (ep1, tyA, bnd) <- ensurePi ty1 - unless (ep1 == argEp t2) $ Env.err - [DS "In application, expected", DD ep1, DS "argument but found", - DD t2, DS "instead." ] - -- if the argument is Irrelevant, resurrect the context - (if ep1 == Irr then Env.extendCtx (Demote Rel) else id) $ - checkType (unArg t2) tyA - return (Unbound.instantiate bnd [unArg t2]) - --- i-ann -tcTerm (Ann tm ty) Nothing = do - tcType ty - checkType tm ty - return ty - --- practicalities --- remember the current position in the type checking monad -tcTerm (Pos p tm) mTy = - Env.extendSourceLocation p tm $ tcTerm tm mTy --- ignore term, just return type annotation -tcTerm TrustMe (Just ty) = return ty - --- i-unit -tcTerm TyUnit Nothing = return TyType -tcTerm LitUnit Nothing = return TyUnit --- i-bool -tcTerm TyBool Nothing = return TyType + -- cannot synthesize the type of the term + tm -> + Env.err [DS "Must have a type for", DD tm] --- i-true/false -tcTerm (LitBool b) Nothing = do - return TyBool +------------------------------------------------------------------------- +-- | Make sure that the term is a "type" (i.e. that it has type 'Type') +tcType :: Term -> TcMonad () +tcType tm = Env.withStage Irr $ checkType tm TyType --- c-if -tcTerm t@(If t1 t2 t3) mty = do - case mty of - Just ty -> do +------------------------------------------------------------------------- +-- | Check that the given term has the expected type +checkType :: Term -> Type -> TcMonad () +checkType tm ty' = do + ty <- Equal.whnf ty' + case tm of + -- c-lam: check the type of a function + (Lam ep1 bnd) -> case ty of + (TyPi ep2 tyA bnd2) -> do + -- unbind the variables in the lambda expression and pi type + (x, body,_,tyB) <- Unbound.unbind2Plus bnd bnd2 +-- epsilons should match up + unless (ep1 == ep2) $ Env.err [DS "In function definition, expected", DD ep2, DS "parameter", DD x, + DS "but found", DD ep1, DS "instead."] + -- check the type of the body of the lambda expression + Env.extendCtx (TypeDecl (Decl x ep1 tyA)) (checkType body tyB) + _ -> Env.err [DS "Lambda expression should have a function type, not", DD ty] + + -- Practicalities + (Pos p tm) -> + Env.extendSourceLocation p tm $ checkType tm ty + + TrustMe -> return () + + PrintMe -> do + gamma <- Env.getLocalCtx + Env.warn [DS "Unmet obligation.\nContext:", DD gamma, + DS "\nGoal:", DD ty] + + -- Extensions to the core language + -- c-if + (If t1 t2 t3) -> do checkType t1 TyBool dtrue <- Equal.unify [] t1 (LitBool True) dfalse <- Equal.unify [] t1 (LitBool False) Env.extendCtxs dtrue $ checkType t2 ty - Env.extendCtxs dfalse $ checkType t3 ty - return ty - Nothing -> do - checkType t1 TyBool - ty <- inferType t2 - checkType t3 ty - return ty - - -tcTerm (Let rhs bnd) mty = do - (x, body) <- Unbound.unbind bnd - aty <- inferType rhs - ty <- Env.extendCtxs [mkSig x aty, Def x rhs] $ - tcTerm body mty - case mty of - Just _ -> return ty - Nothing -> return $ Unbound.subst x rhs ty - - - -tcTerm (TyEq a b) Nothing = do - aTy <- inferType a - checkType b aTy - return TyType -tcTerm Refl (Just ty@(TyEq a b)) = do - Equal.equate a b - return ty -tcTerm Refl (Just ty) = - Env.err [DS "Refl annotated with", DD ty] -tcTerm t@(Subst a b) (Just ty) = do - -- infer the type of the proof 'b' - tp <- inferType b - -- make sure that it is an equality between m and n - (m, n) <- Equal.ensureTyEq tp - -- if either side is a variable, add a definition to the context - edecl <- Equal.unify [] m n - -- if proof is a variable, add a definition to the context - pdecl <- Equal.unify [] b Refl - _ <- Env.extendCtxs (edecl ++ pdecl) $ checkType a ty - return ty -tcTerm t@(Contra p) (Just ty) = do - ty' <- inferType p - (a, b) <- Equal.ensureTyEq ty' - a' <- Equal.whnf a - b' <- Equal.whnf b - case (a', b') of + Env.extendCtxs dfalse $ checkType t3 ty + + -- c-let + (Let rhs bnd) -> do + (x, body) <- Unbound.unbind bnd + aty <- inferType rhs + Env.extendCtxs [mkDecl x aty, Def x rhs] $ + checkType body ty + + -- c-refl + Refl -> case ty of + (TyEq a b) -> Equal.equate a b + _ -> Env.err [DS "Refl annotated with", DD ty] + -- c-subst + (Subst a b) -> do + -- infer the type of the proof 'b' + tp <- inferType b + -- make sure that it is an equality between m and n + (m, n) <- Equal.ensureTyEq tp + -- if either side is a variable, add a definition to the context + edecl <- Equal.unify [] m n + -- if proof is a variable, add a definition to the context + pdecl <- Equal.unify [] b Refl + Env.extendCtxs (edecl ++ pdecl) $ checkType a ty + -- c-contra + (Contra p) -> do + ty' <- inferType p + (a, b) <- Equal.ensureTyEq ty' + a' <- Equal.whnf a + b' <- Equal.whnf b + case (a', b') of + + + (LitBool b1, LitBool b2) + | b1 /= b2 -> + return () + (_, _) -> + Env.err + [ DS "I can't tell that", + DD a, + DS "and", + DD b, + DS "are contradictory" + ] + + -- c-prod + (Prod a b) -> do + case ty of + (TySigma tyA bnd) -> do + (x, tyB) <- Unbound.unbind bnd + checkType a tyA + Env.extendCtxs [mkDecl x tyA, Def x a] $ checkType b tyB + _ -> + Env.err + [ DS "Products must have Sigma Type", + DD ty, + DS "found instead" + ] + + + -- c-letpair + (LetPair p bnd) -> do + ((x, y), body) <- Unbound.unbind bnd + pty <- inferType p + pty' <- Equal.whnf pty + case pty' of + TySigma tyA bnd' -> do + let tyB = Unbound.instantiate bnd' [Var x] + decl <- Equal.unify [] p (Prod (Var x) (Var y)) + Env.extendCtxs ([mkDecl x tyA, mkDecl y tyB] ++ decl) $ + checkType body ty + _ -> Env.err [DS "Scrutinee of LetPair must have Sigma type"] + + + + -- c-infer + tm -> do + ty' <- inferType tm + Equal.equate ty' ty - (LitBool b1, LitBool b2) - | b1 /= b2 -> - return ty - (_, _) -> - Env.err - [ DS "I can't tell that", - DD a, - DS "and", - DD b, - DS "are contradictory" - ] - - -tcTerm t@(TySigma tyA bnd) Nothing = do - (x, tyB) <- Unbound.unbind bnd - tcType tyA - Env.extendCtx (mkSig x tyA) $ tcType tyB - return TyType - - -tcTerm t@(Prod a b) (Just ty) = do - case ty of - (TySigma tyA bnd) -> do - (x, tyB) <- Unbound.unbind bnd - checkType a tyA - Env.extendCtxs [mkSig x tyA, Def x a] $ checkType b tyB - return (TySigma tyA (Unbound.bind x tyB)) - _ -> - Env.err - [ DS "Products must have Sigma Type", - DD ty, - DS "found instead" - ] - - -tcTerm t@(LetPair p bnd) (Just ty) = do - ((x, y), body) <- Unbound.unbind bnd - pty <- inferType p - pty' <- Equal.whnf pty - case pty' of - TySigma tyA bnd' -> do - let tyB = Unbound.instantiate bnd' [Var x] - decl <- Equal.unify [] p (Prod (Var x) (Var y)) - Env.extendCtxs ([mkSig x tyA, mkSig y tyB] ++ decl) $ - checkType body ty - return ty - _ -> Env.err [DS "Scrutinee of LetPair must have Sigma type"] - - -tcTerm PrintMe (Just ty) = do - gamma <- Env.getLocalCtx - Env.warn [DS "Unmet obligation.\nContext:", DD gamma, - DS "\nGoal:", DD ty] - return ty - --- c-infer -tcTerm tm (Just ty) = do - ty' <- inferType tm - Equal.equate ty' ty - - return ty' - -tcTerm tm Nothing = - Env.err [DS "Must have a type annotation to check", DD tm] --------------------------------------------------------------------- -- helper functions for type checking -- | Create a Def if either side normalizes to a single variable -def :: Term -> Term -> TcMonad [Decl] +def :: Term -> Term -> TcMonad [Entry] def t1 t2 = do nf1 <- Equal.whnf t1 nf2 <- Equal.whnf t2 @@ -271,11 +269,11 @@ tcModules = foldM tcM [] -- | Typecheck an entire module. tcModule :: - -- | List of already checked modules (including their Decls). + -- | List of already checked modules (including their entries). [Module] -> -- | Module to check. Module -> - -- | The same module with all Decls checked and elaborated. + -- | The same module with all entries checked and elaborated. TcMonad Module tcModule defs m' = do checkedEntries <- @@ -287,23 +285,23 @@ tcModule defs m' = do return $ m' {moduleEntries = checkedEntries} where d `tcE` m = do - -- Extend the Env per the current Decl before checking - -- subsequent Decls. + -- Extend the Env per the current Entry before checking + -- subsequent entries. x <- tcEntry d case x of AddHint hint -> Env.extendHints hint m - -- Add decls to the Decls to be returned + -- Add decls to the entries to be returned AddCtx decls -> (decls ++) <$> Env.extendCtxsGlobal decls m -- Get all of the defs from imported modules (this is the env to check current module in) importedModules = filter (\x -> ModuleImport (moduleName x) `elem` moduleImports m') defs --- | The Env-delta returned when type-checking a top-level Decl. +-- | The Env-delta returned when type-checking a top-level Entry. data HintOrCtx - = AddHint Sig - | AddCtx [Decl] + = AddHint Decl + | AddCtx [Entry] -- | Check each sort of declaration in a module -tcEntry :: Decl -> TcMonad HintOrCtx +tcEntry :: Entry -> TcMonad HintOrCtx tcEntry (Def n term) = do oldDef <- Env.lookupDef n maybe tc die oldDef @@ -313,22 +311,20 @@ tcEntry (Def n term) = do case lkup of Nothing -> do ty <- inferType term - return $ AddCtx [TypeSig (Sig n Rel ty), Def n term] - Just sig -> + return $ AddCtx [TypeDecl (Decl n Rel ty), Def n term] + Just decl -> let handler (Env.Err ps msg) = throwError $ Env.Err ps (msg $$ msg') msg' = disp [ DS "When checking the term", DD term, - DS "against the signature", - DD sig + DS "against the type", + DD decl ] in do - Env.extendCtx (TypeSig sig) $ checkType term (sigType sig) `catchError` handler - if n `elem` fv term - then return $ AddCtx [TypeSig sig, RecDef n term] - else return $ AddCtx [TypeSig sig, Def n term] + Env.extendCtx (TypeDecl decl) $ checkType term (declType decl) `catchError` handler + return $ AddCtx [TypeDecl decl, Def n term] die term' = Env.extendSourceLocation (unPosFlaky term) term $ Env.err @@ -337,35 +333,35 @@ tcEntry (Def n term) = do DS "Previous definition was", DD term' ] -tcEntry (TypeSig sig) = do - duplicateTypeBindingCheck sig - tcType (sigType sig) - return $ AddHint sig +tcEntry (TypeDecl decl) = do + duplicateTypeBindingCheck decl + tcType (declType decl) + return $ AddHint decl tcEntry (Demote ep) = return (AddCtx [Demote ep]) -tcEntry _ = Env.err "unimplemented" + -- | Make sure that we don't have the same name twice in the -- environment. (We don't rename top-level module definitions.) -duplicateTypeBindingCheck :: Sig -> TcMonad () -duplicateTypeBindingCheck sig = do +duplicateTypeBindingCheck :: Decl -> TcMonad () +duplicateTypeBindingCheck decl = do -- Look for existing type bindings ... - let n = sigName sig + let n = declName decl l <- Env.lookupTyMaybe n l' <- Env.lookupHint n -- ... we don't care which, if either are Just. case catMaybes [l, l'] of [] -> return () -- We already have a type in the environment so fail. - sig' : _ -> - let p = unPosFlaky $ sigType sig + decl' : _ -> + let p = unPosFlaky $ declType decl msg = - [ DS "Duplicate type signature", - DD sig, + [ DS "Duplicate type declaration", + DD decl, DS "Previous was", - DD sig' + DD decl' ] - in Env.extendSourceLocation p sig $ Env.err msg + in Env.extendSourceLocation p decl $ Env.err msg