MiniAgda 0.2014.5.5 → 0.2014.9.12
raw patch · 15 files changed
+210/−198 lines, 15 filesdep −IfElsedep ~haskell-src-extsdep ~mtl
Dependencies removed: IfElse
Dependency ranges changed: haskell-src-exts, mtl
Files
- Abstract.hs +4/−4
- Eval.hs +28/−27
- Extract.hs +8/−8
- Makefile +7/−7
- MiniAgda.cabal +7/−11
- ScopeChecker.hs +13/−14
- TCM.hs +23/−52
- TCM.hs-boot +2/−2
- ToHaskell.hs +7/−7
- TraceError.hs +12/−12
- TreeShapedOrder.hs +1/−1
- TypeChecker.hs +40/−41
- Util.hs +9/−9
- Value.hs +0/−3
- test/succeed/AgdaIssue1052.ma +49/−0
Abstract.hs view
@@ -676,11 +676,11 @@ succMeas (e:es) = e : succMeas es -} -applyLastM :: Monad m => (a -> m a) -> Measure a -> m (Measure a)-applyLastM f (Measure mu) = loop mu >>= return . Measure+applyLastM :: (a -> Maybe a) -> Measure a -> Maybe (Measure a)+applyLastM f (Measure mu) = Measure <$> loop mu where loop [] = fail "empty measure"- loop [e] = f e >>= return . (:[])- loop (e:es) = loop es >>= return . (e:)+ loop [e] = (:[]) <$> f e+ loop (e:es) = (e:) <$> loop es instance HasPred a => HasPred (Measure a) where predecessor mu = applyLastM predecessor mu
Eval.hs view
@@ -1,4 +1,4 @@-{-# LANGUAGE TupleSections, FlexibleInstances, NamedFieldPuns #-}+{-# LANGUAGE TupleSections, FlexibleInstances, FlexibleContexts, NamedFieldPuns #-} {-# LANGUAGE NoImplicitPrelude #-} {-# LANGUAGE CPP #-} @@ -12,10 +12,8 @@ import Control.Applicative import Control.Monad.Identity hiding (mapM) import Control.Monad.State hiding (mapM)-import Control.Monad.Error hiding (mapM)+import Control.Monad.Except hiding (mapM) import Control.Monad.Reader hiding (mapM)-import Control.Monad.IfElse -- unlessM--- import Control.Monad.HT -- andLazy -- because liftM2 (&&) is NOT lazy! import qualified Data.Array as Array import Data.Maybe -- fromMaybe@@ -72,6 +70,9 @@ traceSizeM msg = traceM msg -} +failValInv :: (MonadError TraceError m) => Val -> m a+failValInv v = throwErrorMsg $ "internal error: value " ++ show v ++ " violates representation invariant"+ -- evaluation with rewriting ------------------------------------- {-@@ -546,7 +547,7 @@ bv <- whnf env b -- not adding measure constraint to context! case (envBound env) of Nothing -> return $ VMeasured muv bv- -- fail $ "panic: whnf " ++ show e ++ " : no measure in environment " ++ show env+ -- throwErrorMsg $ "panic: whnf " ++ show e ++ " : no measure in environment " ++ show env Just muv' -> return $ VGuard (Bound Lt muv muv') bv Quant Pi (TBound (Bound ltle mu mu')) b -> do@@ -603,7 +604,7 @@ whnfClos (definingVal item) Def (DefId (ConK DefPat) n) -> whnfClos . definingVal =<< lookupSymbQ n--- Def (DefId (ConK DefPat) n) -> fail $ "internal error: whnf of defined pattern " ++ show n+-- Def (DefId (ConK DefPat) n) -> throwErrorMsg $ "internal error: whnf of defined pattern " ++ show n Def id -> return $ vDef id {- Con co n -> return $ VCon co n@@ -619,7 +620,7 @@ Var y -> lookupEnv env y >>= whnfClos Ann e -> whnf env (unTag e) -- return VIrr -- NEED TO KEEP because of eta-exp! Irr -> return VIrr- e -> fail $ "NYI whnf " ++ show e+ e -> throwErrorMsg $ "NYI whnf " ++ show e whnfMeasure :: Env -> Measure Expr -> TypeCheck (Measure Val) whnfMeasure rho (Measure mu) = mapM (whnf rho) mu >>= return . Measure@@ -704,7 +705,7 @@ VProj Pre n -> flip (app' expandDefs) (VProj Post n) =<< whnfClos v VRecord ri rho -> do let VProj Post n = v- maybe (fail $ "app: projection " ++ show n ++ " not found in " ++ show u)+ maybe (throwErrorMsg $ "app: projection " ++ show n ++ " not found in " ++ show u) whnfClos (lookup n rho) VDef (DefId FunK n) -> appDef_ n [v] VApp (VDef (DefId FunK n)) vl -> appDef_ n (vl ++ [v])@@ -739,7 +740,7 @@ VIrr -> return VIrr {- 2010-11-01 this breaks extraction for System U example- VIrr -> fail $ "app internal error: " ++ show (VApp u [v])+ VIrr -> throwErrorMsg $ "app internal error: " ++ show (VApp u [v]) -} _ -> return $ VApp u [v] --@@ -764,7 +765,7 @@ -- -- ALT: VIrr consumes applications -- (VIrr,_) -> return VIrr -- -}--- (VIrr,_) -> fail $ "app internal error: " ++ show (VApp u c)+-- (VIrr,_) -> throwErrorMsg $ "app internal error: " ++ show (VApp u c) -- _ -> return $ VApp u c @@ -871,7 +872,7 @@ matchingConstructors v@(VDef d) = failValInv v -- matchingConstructors' d [] matchingConstructors (VApp (VDef (DefId DatK d)) vl) = matchingConstructors' d vl >>= return . Just matchingConstructors v = return Nothing--- fail $ "matchingConstructors: not a data type: " ++ show v -- return []+-- throwErrorMsg $ "matchingConstructors: not a data type: " ++ show v -- return [] matchingConstructors' :: QName -> [Val] -> TypeCheck [(ConstructorInfo,Env)] matchingConstructors' n vl = do@@ -1183,7 +1184,7 @@ matchList env (p:pl) (v:vl) = match env p v `bindMaybe` \ env' -> matchList env' pl vl-matchList env pl vl = fail $ "matchList internal error: inequal length while trying to match patterns " ++ show pl ++ " against values " ++ show vl+matchList env pl vl = throwErrorMsg $ "matchList internal error: inequal length while trying to match patterns " ++ show pl ++ " against values " ++ show vl -- * Typed Non-linear Matching ----------------------------------------- @@ -1255,7 +1256,7 @@ VQuant Pi x dom fv -> nonLinMatch undot symm st p v (typ dom) `bindMaybe` \ st' -> nonLinMatchList' undot symm st' pl vl =<< app fv v- _ -> fail $ "nonLinMatchList': cannot match in absence of pi-type"+ _ -> throwErrorMsg $ "nonLinMatchList': cannot match in absence of pi-type" nonLinMatchList' _ _ _ _ _ _ = return Nothing @@ -1264,7 +1265,7 @@ expandDefPat p@(ConP pi c ps) | coPat pi == DefPat = do PatSig ns pat v <- lookupSymbQ c unless (length ns == length ps) $- fail ("underapplied defined pattern in " ++ show p)+ throwErrorMsg ("underapplied defined pattern in " ++ show p) let pat' = if dottedPat pi then dotConstructors pat else pat return $ patSubst (zip ns ps) pat' expandDefPat p = return p@@ -1341,7 +1342,7 @@ VIrr -> mempty VCase v tv env cls -> nocc ks $ v : tv : map snd (envMap env) -- impossible: closure (reduced away)- VClos{} -> fail $ "internal error: nocc " ++ show (ks,v)+ VClos{} -> throwErrorMsg $ "internal error: nocc " ++ show (ks,v) -- heterogeneous typed equality and subtyping ------------------------@@ -1450,7 +1451,7 @@ Set v -> ShSet (One v) CoSet v -> ShCoSet (One v) -typeView12 :: (Functor m, Error e, MonadError e m) => OneOrTwo TVal -> m TypeShape+typeView12 :: (Functor m, Monad m, MonadError TraceError m) => OneOrTwo TVal -> m TypeShape -- typeView12 :: OneOrTwo TVal -> TypeCheck TypeShape typeView12 (One tv) = return $ typeView tv typeView12 (Two tv1 tv2) =@@ -1465,16 +1466,16 @@ (ShSort s1, ShSort s2) | s1 == s2 -> return $ ShSort $ s1 (ShData n1 _, ShData n2 _) | n1 == n2 -> return $ ShData n1 (Two tv1 tv2) (ShNe{} , ShNe{} ) -> return $ ShNe (Two tv1 tv2)- _ -> throwError $ strMsg $ "type " ++ show tv1 ++ " has different shape than " ++ show tv2+ _ -> throwErrorMsg $ "type " ++ show tv1 ++ " has different shape than " ++ show tv2 -sortView12 :: (Monad m) => OneOrTwo (Sort Val) -> m SortShape+sortView12 :: (Monad m, MonadError TraceError m) => OneOrTwo (Sort Val) -> m SortShape sortView12 (One s) = return $ sortView s sortView12 (Two s1 s2) = case (s1, s2) of (SortC c1, SortC c2) | c1 == c2 -> return $ ShSortC c1 (Set v1, Set v2) -> return $ ShSet (Two v1 v2) (CoSet v1, CoSet v2) -> return $ ShCoSet (Two v1 v2)- _ -> fail $ "sort " ++ show s1 ++ " has different shape than " ++ show s2+ _ -> throwErrorMsg $ "sort " ++ show s1 ++ " has different shape than " ++ show s2 whnf12 :: OneOrTwo Env -> OneOrTwo Expr -> TypeCheck (OneOrTwo Val) whnf12 env12 e12 = Traversable.traverse id $ zipWith12 whnf env12 e12@@ -1514,9 +1515,9 @@ mt12f <- mapM (mapM force) mt12 -- leads to LOOP, see HungryEta.ma sh12 <- case mt12f of Nothing -> return Nothing- Just tv12 -> case typeView12 tv12 of+ Just tv12 -> case runExcept $ typeView12 tv12 of Right sh -> return $ Just sh- Left err -> (recoverFail err) >> return Nothing+ Left err -> (recoverFail $ show err) >> return Nothing case sh12 of -- subtyping directed by common type shape@@ -1740,14 +1741,14 @@ loop cls1' cls2' eqPattern :: Pattern -> Pattern -> TypeCheck ()-eqPattern p1 p2 = if p1 == p2 then return () else fail $ "pattern " ++ show p1 ++ " != " ++ show p2+eqPattern p1 p2 = if p1 == p2 then return () else throwErrorMsg $ "pattern " ++ show p1 ++ " != " ++ show p2 -} type NameMap = [(Name,Name)] alphaPattern :: Pattern -> Pattern -> StateT NameMap TypeCheck () alphaPattern p1 p2 = do- let failure = fail $ "pattern " ++ show p1 ++ " != " ++ show p2+ let failure = throwErrorMsg $ "pattern " ++ show p1 ++ " != " ++ show p2 alpha x1 x2 = do ns <- get case lookup x1 ns of@@ -1836,7 +1837,7 @@ <+> prettyTCM vl1 <+> text " to " <+> prettyTCM vl2 <+> text " at type " <+> prettyTCM tv12--- _ -> fail $ "leqVals': not (compatible) function types or mismatch number of arguments when comparing " ++ show vl1 ++ " to " ++ show vl2 ++ " at type " ++ show tv12+-- _ -> throwErrorMsg $ "leqVals': not (compatible) function types or mismatch number of arguments when comparing " ++ show vl1 ++ " to " ++ show vl2 ++ " at type " ++ show tv12 {- leqVals' f q (VPi x1 dom1@(Domain av1 _ dec1) env1 b1,@@ -2084,8 +2085,8 @@ (v1,VMeta i rho n) -> addLe ltle v1 v2 _ -> leSize'' ltle 0 v1 v2 {- HANDLED BY leSize'' ltle- (VSucc{}, VGen{}) -> fail err- (VSucc{}, VPlus{}) -> fail err+ (VSucc{}, VGen{}) -> throwErrorMsg err+ (VSucc{}, VPlus{}) -> throwErrorMsg err -} -- leSize'' ltle bal v v' checks whether Succ^bal v `lt` v' -- invariant: bal is zero in cases for VMax and VMeta@@ -2254,7 +2255,7 @@ (True,False) -> ret LT -- THIS IS COMPLETE BOGUS!!! (True,True) -> ret EQ (False,True) -> ret GT- (False,False) -> fail $ "compareSize (" ++ show a1 ++ ", " ++ show a2 ++ "): sizes incomparable"+ (False,False) -> throwErrorMsg $ "compareSize (" ++ show a1 ++ ", " ++ show a2 ++ "): sizes incomparable" -} {- Bound entailment
Extract.hs view
@@ -152,7 +152,7 @@ import Control.Applicative import Control.Monad-import Control.Monad.Error+import Control.Monad.Except import Control.Monad.Reader import Control.Monad.Writer import Control.Monad.State@@ -176,7 +176,7 @@ traceExtrM s = return () -runExtract sig k = runErrorT (runReaderT (runStateT k (initWithSig sig)) emptyContext)+runExtract sig k = runExceptT (runReaderT (runStateT k (initWithSig sig)) emptyContext) -- extraction @@ -198,7 +198,7 @@ extractDecl d = case d of MutualDecl _ ds -> extractDecls ds -- TODO!- OverrideDecl{} -> fail $ "extractDecls internal error: overrides impossible"+ OverrideDecl{} -> throwErrorMsg $ "extractDecls internal error: overrides impossible" MutualFunDecl _ co funs -> extractFuns co funs FunDecl co fun -> extractFun co fun LetDecl evl x tel (Just t) e | null tel -> extractLet evl x t e@@ -354,7 +354,7 @@ Prod av1 av2 -> extractPattern' av1 p1 $ \ [p1] -> do extractPattern' av2 p2 $ \ [p2] -> cont [PairP p1 p2]- _ -> fail $ "extractPattern': IMPOSSIBLE: pattern " +++ _ -> throwErrorMsg $ "extractPattern': IMPOSSIBLE: pattern " ++ show p ++ " : " ++ show av -} ConP pi n ps -> do@@ -369,7 +369,7 @@ ConSig { conPars, extrTyp, dataPars } <- lookupSymbQ c traceExtrM ("extrConType " ++ show c ++ " has extrTyp = " ++ show extrTyp) tv <- whnf' extrTyp- numPars <- maybe (return dataPars) (const $ fail $ "NYI: extrConType for pattern parameters") conPars+ numPars <- maybe (return dataPars) (const $ throwErrorMsg $ "NYI: extrConType for pattern parameters") conPars case numPars of 0 -> return tv _ -> do@@ -387,7 +387,7 @@ piApps tv pars -} _ -> piApps tv $ replicate numPars VIrr--- _ -> fail $ "extrConType " ++ show c ++ ": expected datatype, found " ++ show av+-- _ -> throwErrorMsg $ "extrConType " ++ show c ++ ": expected datatype, found " ++ show av -- extracting a term from a term ------------------------------------- @@ -412,7 +412,7 @@ Def f -> (Def f,) <$> do (whnf' . extrTyp) =<< lookupSymbQ (idName f) - Pair{} -> fail $ "extractInfer: IMPOSSIBLE: pair " ++ show e+ Pair{} -> throwErrorMsg $ "extractInfer: IMPOSSIBLE: pair " ++ show e -- other expressions are erased or types _ -> return (Irr, VIrr)@@ -458,7 +458,7 @@ {- case view of Prod av1 av2 -> Pair <$> extractCheck e1 av1 <*> extractCheck e2 av2- _ -> fail $ "extractCheck: tuple type expected " ++ show e ++ " : " ++ show tv+ _ -> throwErrorMsg $ "extractCheck: tuple type expected " ++ show e ++ " : " ++ show tv -} -- TODO: case
Makefile view
@@ -3,11 +3,11 @@ files=Abstract Collection Concrete Eval Extract HsSyntax Lexer Main Parser Polarity PrettyTCM ScopeChecker Semiring SparseMatrix TCM Termination ToHaskell Tokens TraceError TreeShapedOrder TypeChecker Util Value Warshall hsfiles=$(foreach file,$(files),$(file).hs) ghcflags=-ignore-package monads-fd -rtsopts-# -fglasgow-exts +# -fglasgow-exts optflags= # -O #slow compilation, not much speedup profflags=-prof -auto-all-distfiles=*.hs *.hs-boot Lexer.x Parser.y Makefile +distfiles=*.hs *.hs-boot Lexer.x Parser.y Makefile distdirs=test/succeed test/fail examples cabalp=cabal install -p --enable-executable-profiling@@ -43,10 +43,10 @@ # Main test/fail/OverlappingPatternIndFam.ma # vec.ma # examples/List.ma # ship : ../dist/miniagda-2009-07-03.tgz # 06-27.tgz-# +# # ../dist/%.tgz : $(distfiles) # tar czf $@ $^ $(distdirs)-# +# miniagda-prof : Main.hs $(hsfiles) ghc $(ghcflags) $(profflags) $< --make -o $@@@ -76,13 +76,13 @@ test : Main succeed fail -succeed : +succeed : @echo "======================================================================" @echo "===================== Suite of successfull tests =====================" @echo "======================================================================" make -C test/succeed -fail : +fail : @echo "======================================================================" @echo "======================= Suite of failing tests =======================" @echo "======================================================================"@@ -101,7 +101,7 @@ make -C lib -clean : +clean : -rm *.o *.hi Main miniagda-prof # make -C test/fail clean
MiniAgda.cabal view
@@ -1,7 +1,7 @@ name: MiniAgda-version: 0.2014.5.5+version: 0.2014.9.12 build-type: Simple-cabal-version: >= 1.8 +cabal-version: >= 1.8 license: OtherLicense license-file: LICENSE author: Andreas Abel and Karl Mehltretter@@ -20,10 +20,9 @@ arguments are discarded during equality checking and compilation. Recent features include bounded size quantification and destructor- patterns for a more general handling of coinduction. + patterns for a more general handling of coinduction. -tested-with: GHC == 7.6.3,- GHC == 7.8.2+tested-with: GHC == 7.8.3 extra-source-files: Makefile @@ -44,12 +43,9 @@ build-depends: array >= 0.3 && < 0.6, base >= 4.2 && < 4.8, containers >= 0.3 && < 0.6,- haskell-src-exts >= 1.14 && < 1.15,- -- mtl-2.1 contains a severe bug- mtl >= 2.0 && < 2.1 || >= 2.1.1 && < 2.2,- pretty >= 1.0 && < 1.2,--- utility-ht >= 0.0.1 && < 1.0,- IfElse >= 0.85 && < 2.0+ haskell-src-exts >= 1.14 && < 1.16,+ mtl >= 2.2.0.1 && < 2.3,+ pretty >= 1.0 && < 1.2 build-tools: happy >= 1.15 && < 2, alex >= 3.0 && < 4 extensions: CPP
ScopeChecker.hs view
@@ -9,12 +9,11 @@ import Prelude hiding (mapM, null) -import Control.Applicative -- <$>-import Control.Monad.IfElse+import Control.Applicative import Control.Monad.Identity hiding (mapM) import Control.Monad.Reader hiding (mapM) import Control.Monad.State hiding (mapM)-import Control.Monad.Error hiding (mapM)+import Control.Monad.Except hiding (mapM) import Data.List as List hiding (null) import Data.Maybe@@ -153,7 +152,7 @@ -- State monad (hidden) for global signature. -- Error monad for reporting scope violations. newtype ScopeCheck a = ScopeCheck { unScopeCheck ::- ReaderT SCCxt (StateT SCState (ErrorT TraceError Identity)) a }+ ReaderT SCCxt (StateT SCState (ExceptT TraceError Identity)) a } deriving (Functor, Applicative, Monad, MonadReader SCCxt, MonadError TraceError) @@ -162,7 +161,7 @@ -> SCState -- ^ Global identifier mapping. -> ScopeCheck a -- ^ The computation. -> Either TraceError (a, SCState)-runScopeCheck ctx st (ScopeCheck sc) = runIdentity $ runErrorT $+runScopeCheck ctx st (ScopeCheck sc) = runIdentity $ runExceptT $ runStateT (runReaderT sc ctx) st -- ** Local state.@@ -419,7 +418,7 @@ let (ns, mll) = unzip $ compressMaybes mmm let measured = null mll || isJust (head mll) let ok = null mll || all ((head mll)==) (tail mll)- when (not ok) $ fail $ "in a mutual function block, either all functions must be without measure or have a measure of the same length"+ when (not ok) $ throwErrorMsg $ "in a mutual function block, either all functions must be without measure or have a measure of the same length" {- -- switch to internal fun ids let funNames = [ n | (FunK _ , A.TypeSig n _) <- ktsigs ] -- internal fun names@@ -483,11 +482,11 @@ mutualFlattenDecl :: C.Declaration -> ScopeCheck [C.Declaration] mutualFlattenDecl (C.MutualDecl ds) = mutualFlattenDecls ds-mutualFlattenDecl (C.OverrideDecl Fail _) = fail $ "fail declaration not supported in mutual block"+mutualFlattenDecl (C.OverrideDecl Fail _) = throwErrorMsg $ "fail declaration not supported in mutual block" mutualFlattenDecl (C.OverrideDecl o ds) = do ds' <- mutualFlattenDecls ds return $ map (\ d -> C.OverrideDecl o [d]) ds'-mutualFlattenDecl (C.LetDecl{}) = fail $ "let in mutual block not supported"+mutualFlattenDecl (C.LetDecl{}) = throwErrorMsg $ "let in mutual block not supported" mutualFlattenDecl d = return $ [d] -- extract type sigs of a mutual block in order, error on nested mutual@@ -600,7 +599,7 @@ r <- mapM (\ (C.FunDecl _ tysig _) -> scopeCheckFunSig tysig) l let (ml:mll, tsl') = unzip r let ok = all (ml==) mll- when (not ok) $ fail $ "in a mutual function block, either all functions must be without measure or have a measure of the same length"+ when (not ok) $ throwErrorMsg $ "in a mutual function block, either all functions must be without measure or have a measure of the same length" -- add names as internal ids and check bodies let nxs = zipWith (\ (C.FunDecl _ (C.TypeSig n _) _) (A.TypeSig x _) -> (n,x)) l tsl' --let addFuns b = mapM (uncurry $ addAName $ FunK b) nxs@@ -785,7 +784,7 @@ A.Param -> return dec A.Const -> return dec A.PVar{} -> return dec- _ -> fail $ "illegal polarity " ++ show (polarity dec) ++ " in type of constructor " ++ show a+ _ -> throwErrorMsg $ "illegal polarity " ++ show (polarity dec) ++ " in type of constructor " ++ show a -- | Allow shadowing of previous locals. -- Always if we enter a subexpression which is not the body@@ -827,7 +826,7 @@ -- measure & bound -- measures can only appear in fun sigs! C.Quant pisig [C.TMeasure mu] e1 -> do- fail $ "measure not allowed in expression " ++ show e+ throwErrorMsg $ "measure not allowed in expression " ++ show e -- measure bound mu < mu' C.Quant A.Pi [C.TBound beta] e1 -> do@@ -836,7 +835,7 @@ e1' <- scopeCheckExpr' e1 return $ A.pi (A.TBound beta') e1' - C.Quant A.Sigma [C.TBound beta] e1 -> fail $+ C.Quant A.Sigma [C.TBound beta] e1 -> throwErrorMsg $ "measure bound not allowed in expression " ++ show e C.Quant pisig tel e -> do@@ -875,7 +874,7 @@ Just x -> return $ A.Var x Nothing -> scopeCheckGlobalVar n - _ -> fail $ "NYI: scopeCheckExpr " ++ show e+ _ -> throwErrorMsg $ "NYI: scopeCheckExpr " ++ show e scopeCheckGlobalVar :: C.QName -> ScopeCheck A.Expr scopeCheckGlobalVar n = do@@ -1065,7 +1064,7 @@ C.Record fs -> mapM_ (scpField e) fs C.Ident n -> scpApp e n [] C.App (C.Ident n) es -> scpApp e n es- C.App C.App{} es -> fail $ "scopeCheckParameter " ++ show e ++ ": internal invariant violated"+ C.App C.App{} es -> throwErrorMsg $ "scopeCheckParameter " ++ show e ++ ": internal invariant violated" _ -> errorInvalidParameter e where -- we can only treat a record expression as pattern
TCM.hs view
@@ -5,10 +5,9 @@ import Prelude hiding (null) import Control.Monad-import Control.Monad.IfElse import Control.Monad.Identity import Control.Monad.State-import Control.Monad.Error+import Control.Monad.Except import Control.Monad.Reader import Control.Applicative@@ -226,7 +225,7 @@ emptyPosGraph = [] -- type TypeCheck = StateT TCState (ReaderT TCContext (CallStackT String IO))-type TypeCheck = StateT TCState (ReaderT TCContext (ErrorT TraceError IO))+type TypeCheck = StateT TCState (ReaderT TCContext (ExceptT TraceError IO)) instance MonadAssert TypeCheck where assert b s = do@@ -412,49 +411,21 @@ -- upperDecs need not be updated } -{---- only defined for single bindings-cxtSetType :: Int -> Dec -> TVal -> SemCxt -> SemCxt-cxtSetType k dec tv delta =- delta { cxt = Map.insert k (One tv) (cxt delta)- , decs = Map.insert k (One dec) (decs delta)- -- upperDecs need not be updated- }--- , decs = Map.insert k dec (decs delta) }--}-{--cxtLookupGen :: Monad m => SemCxt -> Int -> m Domain-cxtLookupGen delta k = do- One tv <- lookupM k (cxt delta)- One dec <- lookupM k (decs delta)--- dec <- lookupM k (decs delta)- return $ Domain { typ = tv, decor = dec }+-- | Version of 'Map.lookup' that throws 'TraceError'.+lookupM :: (MonadError TraceError m, Show k, Ord k) => k -> Map k v -> m v+lookupM k m = maybe (throwErrorMsg $ "lookupM: unbound key " ++ show k) return $ Map.lookup k m -cxtLookupGen :: Monad m => SemCxt -> Int -> m CxtEntry-cxtLookupGen delta k = do- tv12 <- lookupM k (cxt delta)- dec12 <- lookupM k (decs delta)- udec <- lookupM k (upperDecs delta)- return $ CxtEntry (zipWith12 Domain tv12 dec12) udec--}-cxtLookupGen :: Monad m => SemCxt -> Int -> m CxtEntry+cxtLookupGen :: MonadError TraceError m => SemCxt -> Int -> m CxtEntry cxtLookupGen delta k = do dom12 <- lookupM k (cxt delta) udec <- lookupM k (upperDecs delta) return $ CxtEntry dom12 udec -cxtLookupName :: Monad m => SemCxt -> Ren -> Name -> m CxtEntry+cxtLookupName :: MonadError TraceError m => SemCxt -> Ren -> Name -> m CxtEntry cxtLookupName delta ren x = do i <- lookupM x ren cxtLookupGen delta i -{--cxtLookupName :: Monad m => SemCxt -> Ren -> Name -> m Domain-cxtLookupName delta ren x = do- i <- lookupM x ren- cxtLookupGen delta i--}- -- apply decoration, possibly resurrecting (see Pfenning, LICS 2001) -- and changing polarities (see Abel, MSCS 2008) cxtApplyDec :: Dec -> SemCxt -> SemCxt@@ -631,14 +602,14 @@ genOfName x = do ce <- ask case Map.lookup x (renaming ce) of- Nothing -> fail $ "internal error: variable not bound: " ++ show x+ Nothing -> throwErrorMsg $ "internal error: variable not bound: " ++ show x Just k -> return k nameOfGen k = do ce <- ask case Map.lookup k (naming ce) of Nothing -> return $ fresh $ "error_unnamed_gen" ++ show k- -- fail $ "internal error: no name for variable " ++ show k+ -- throwErrorMsg $ "internal error: no name for variable " ++ show k Just x -> return x {-@@ -784,7 +755,7 @@ TSO.increasesHeight son (dist, father) <$> asks sizeRels) $ do recoverFail $ "cannot add hypothesis " ++ s ++ " because it is not satisfyable under all possible valuations of the current hypotheses" -- if the new son is an ancestor of the father, we are cyclic- awhenM (TSO.isAncestor father son <$> asks sizeRels) $ \ n -> -- n steps from father up to son+ whenJustM (TSO.isAncestor father son <$> asks sizeRels) $ \ n -> -- n steps from father up to son when (dist > - n) $ -- still ok if dist == n == 0, otherwise fail recoverFail$ "cannot add hypothesis " ++ s ++ " because it makes the set of hyptheses unsatisfiable" local (\ cxt -> cxt@@ -982,11 +953,11 @@ VApp (VDef (DefId DatK d)) vl -> case p of ProjP n -> cont =<< projectType tv n VIrr -- no record value here- _ -> fail $ "introPatType: internal error, expected projection pattern, found " ++ show p ++ " at type " ++ show tv+ _ -> throwErrorMsg $ "introPatType: internal error, expected projection pattern, found " ++ show p ++ " at type " ++ show tv VQuant Pi x dom fv -> do v <- whnfClos v matchPatType (p,v) dom . cont =<< app fv v- _ -> fail $ "introPatType: internal error, expected Pi-type, found " ++ show tv+ _ -> throwErrorMsg $ "introPatType: internal error, expected Pi-type, found " ++ show tv introPatTypes :: [(Pattern,Val)] -> TVal -> (TVal -> TypeCheck a) -> TypeCheck a introPatTypes pvs tv f = do@@ -1021,12 +992,12 @@ matchPatType (p1,v1) dom1 $ do bv <- app fv v1 matchPatType (p2,v2) (Domain bv ki dec) cont- _ -> fail $ "matchPatType: IMPOSSIBLE " ++ show p ++ " : " ++ show dom+ _ -> throwErrorMsg $ "matchPatType: IMPOSSIBLE " ++ show p ++ " : " ++ show dom (DotP e, _) -> cont (AbsurdP, _) -> cont (ErasedP p,_) -> matchPatType (p,v) dom cont- _ -> fail $ "matchPatType: IMPOSSIBLE " ++ show (p,v)+ _ -> throwErrorMsg $ "matchPatType: IMPOSSIBLE " ++ show (p,v) -- Signature -----------------------------------------------------@@ -1164,7 +1135,7 @@ dv <- dataView tv case dv of Data d _ -> return $ Qual d n- _ -> fail $ "cannot resolve constructor " ++ show n+ _ -> throwErrorMsg $ "cannot resolve constructor " ++ show n -- | @conType c tv@ returns the type of constructor @c@ at datatype @tv@ -- with parameters instantiated.@@ -1209,7 +1180,7 @@ NoData -> failDoc (text ("conType " ++ show c ++ ": expected") <+> prettyTCM tv <+> text "to be a data type") Data d vs -> do- unless (d == dataName) $ fail $ "expected constructor of datatype " ++ show d ++ ", but found one of datatype " ++ show dataName+ unless (d == dataName) $ throwErrorMsg $ "expected constructor of datatype " ++ show d ++ ", but found one of datatype " ++ show dataName let (pars, inds) = splitAt numPars vs unless (length pars == numPars) $ failDoc (text ("conType " ++ show c ++ ": expected")@@ -1247,8 +1218,8 @@ <+> prettyTCM tv <+> text "to be a data type") Data d vs -> do whenJust md $ \ d' ->- unless (d == d') $ fail $ "expected constructor of datatype " ++ show d ++ ", but found one of datatype " ++ show d'- -- whenJust conPars $ fail $ "NYI: constructor with pattern parameters"+ unless (d == d') $ throwErrorMsg $ "expected constructor of datatype " ++ show d ++ ", but found one of datatype " ++ show d'+ -- whenJust conPars $ throwErrorMsg $ "NYI: constructor with pattern parameters" let (pars, inds) = splitAt dataPars vs unless (length pars == dataPars) failure case (isSized, inds) of@@ -1364,7 +1335,7 @@ -- lookupSig :: Name -> Signature -> TypeCheck SigDef lookupSig n sig = case (Map.lookup n sig) of- Nothing -> fail $ "identifier " ++ show n ++ " not in signature " ++ show (Map.keys sig)+ Nothing -> throwErrorMsg $ "identifier " ++ show n ++ " not in signature " ++ show (Map.keys sig) Just k -> return k @@ -1411,8 +1382,8 @@ mkConstraint v (VMax vs) = do bs <- mapM (errorToBool . leqSize' v) vs if any id bs then return Nothing else- fail $ "cannot handle constraint " ++ show v ++ " <= " ++ show (VMax vs)- mkConstraint w@(VMax vs) v = fail $ "cannot handle constraint " ++ show w ++ " <= " ++ show v+ throwErrorMsg $ "cannot handle constraint " ++ show v ++ " <= " ++ show (VMax vs)+ mkConstraint w@(VMax vs) v = throwErrorMsg $ "cannot handle constraint " ++ show w ++ " <= " ++ show v mkConstraint (VMeta i rho n) (VMeta j rho' m) = retret $ arc (Flex i) (m-n) (Flex j) mkConstraint (VMeta i rho n) VInfty = retret $ arc (Flex i) 0 (Rigid (RConst Infinite)) mkConstraint (VMeta i rho n) v = retret $ arc (Flex i) (m-n) (Rigid (RVar j))@@ -1420,7 +1391,7 @@ mkConstraint VInfty (VMeta i rho n) = retret $ arc (Rigid (RConst Infinite)) 0 (Flex i) mkConstraint v (VMeta j rho m) = retret $ arc (Rigid (RVar i)) (m-n) (Flex j) where (i,n) = vGenSuccs v 0- mkConstraint v1 v2 = fail $ "mkConstraint undefined for " ++ show (v1,v2)+ mkConstraint v1 v2 = throwErrorMsg $ "mkConstraint undefined for " ++ show (v1,v2) -- addMeta k x adds a metavariable which can refer to VGens < k -- addMeta :: Ren -> MVar -> TypeCheck ()@@ -1450,7 +1421,7 @@ else case solve cs of Just subst -> traceMeta ("solution" ++ show subst) $ return subst- Nothing -> fail $ "size constraints " ++ show cs ++ " unsolvable"+ Nothing -> throwErrorMsg $ "size constraints " ++ show cs ++ " unsolvable" nameOf :: EnvMap -> Int -> Maybe Name
TCM.hs-boot view
@@ -5,7 +5,7 @@ import Control.Monad.Identity import Control.Monad.State-import Control.Monad.Error+import Control.Monad.Except import Control.Monad.Reader data OneOrTwo a = One a | Two a a@@ -14,4 +14,4 @@ data TCState -- type TypeCheck = StateT TCState (ReaderT TCContext (CallStackT String IO))-type TypeCheck = StateT TCState (ReaderT TCContext (ErrorT TraceError IO))+type TypeCheck = StateT TCState (ReaderT TCContext (ExceptT TraceError IO))
ToHaskell.hs view
@@ -45,7 +45,7 @@ import Control.Applicative import Control.Monad-import Control.Monad.Error+import Control.Monad.Except import Control.Monad.Reader import Control.Monad.Writer import Control.Monad.State@@ -66,7 +66,7 @@ -- translation monad -type Translate = StateT TState (ReaderT TContext (ErrorT TraceError IO))+type Translate = StateT TState (ReaderT TContext (ExceptT TraceError IO)) {- no longer needed with mtl-2 instance Applicative Translate where@@ -85,7 +85,7 @@ initCxt = TContext runTranslate :: Translate a -> IO (Either TraceError a)-runTranslate t = runErrorT (runReaderT (evalStateT t initSt) initCxt)+runTranslate t = runExceptT (runReaderT (evalStateT t initSt) initCxt) -- translation @@ -101,7 +101,7 @@ translateDecl d = case d of MutualDecl _ ds -> translateDecls ds- OverrideDecl{} -> fail $ "translateDecls internal error: overrides impossible"+ OverrideDecl{} -> throwErrorMsg $ "translateDecls internal error: overrides impossible" MutualFunDecl _ _ funs -> translateFuns funs FunDecl _ fun -> translateFun fun LetDecl _ x tel (Just t) e | null tel -> translateLet x t e@@ -196,7 +196,7 @@ _ -> return H.unit_tycon {- TODO:- _ -> fail $ "no Haskell representation for type " ++ show t+ _ -> throwErrorMsg $ "no Haskell representation for type " ++ show t -} translateExpr :: FExpr -> Translate H.Exp@@ -269,7 +269,7 @@ (DefId DatK (QName x)) -> do let n = suggestion x unless (isUpper $ head n) $- fail $ "data names need to be capitalized"+ throwErrorMsg $ "data names need to be capitalized" return $ H.Ident n (DefId (ConK co) (Qual d x)) -> do let n = suggestion x@@ -283,7 +283,7 @@ let n = suggestion $ unqual x {- ignore for now unless (isLower $ head n) $- fail $ "function names need to start with a lowercase letter"+ throwErrorMsg $ "function names need to start with a lowercase letter" -} return $ H.Ident n
TraceError.hs view
@@ -2,7 +2,7 @@ module TraceError where -import Control.Monad.Error+import Control.Monad.Except import Debug.Trace import Util@@ -10,9 +10,9 @@ data TraceError = Err String | TrErr String TraceError -instance Error TraceError where- noMsg = Err "no message"- strMsg s = Err s+-- instance Error TraceError where+-- noMsg = Err "no message"+-- strMsg s = Err s instance Show TraceError where show (Err str) = str@@ -35,8 +35,8 @@ d <- md enter (render (pretty d)) cont -failDoc :: (Monad m) => m Doc -> m a-failDoc d = fail . render =<< d+failDoc :: (MonadError TraceError m) => m Doc -> m a+failDoc d = throwErrorMsg . render =<< d newErrorDoc :: (MonadError TraceError m) => m a -> m Doc -> m a newErrorDoc c d = c `catchError` (\ _ -> failDoc d)@@ -47,13 +47,13 @@ errorToBool :: (MonadError e m) => m () -> m Bool errorToBool m = (m >> return True) `catchError` (\ _ -> return False) -boolToErrorDoc :: (Monad m) => m Doc -> Bool -> m ()+boolToErrorDoc :: (MonadError TraceError m) => m Doc -> Bool -> m () boolToErrorDoc d True = return () boolToErrorDoc d False = failDoc d -boolToError :: (Monad m) => String -> Bool -> m ()+boolToError :: (MonadError TraceError m) => String -> Bool -> m () boolToError msg True = return ()-boolToError msg False = fail msg+boolToError msg False = throwErrorMsg msg instance MonadError () Maybe where catchError Nothing k = k ()@@ -68,13 +68,13 @@ data AssertionHandling = Failure | Warning | Ignore deriving (Eq,Ord,Show) -assert' :: (MonadIO m) => AssertionHandling -> Bool -> String -> m ()+assert' :: (MonadError TraceError m, MonadIO m) => AssertionHandling -> Bool -> String -> m () assert' Ignore b s = return () assert' h True s = return () assert' Warning False s = liftIO $ putStrLn $ "warning: ignoring error: " ++ s-assert' Failure False s = fail s+assert' Failure False s = throwErrorMsg s -assertDoc' :: (MonadIO m) => AssertionHandling -> Bool -> m Doc -> m ()+assertDoc' :: (MonadError TraceError m, MonadIO m) => AssertionHandling -> Bool -> m Doc -> m () assertDoc' h b md = assert' h b . render =<< md class Monad m => MonadAssert m where
TreeShapedOrder.hs view
@@ -61,7 +61,7 @@ -- | @parent a o@ returns the immediate parent, if it exists. parent :: (Ord a, Eq a) => a -> TSO a -> Maybe (Int,a)-parent a t = headM $ parents a t+parent a t = headMaybe $ parents a t -- | @isAncestor a b o = Just n@ if there are n steps up from a to b. isAncestor :: (Ord a, Eq a) => a -> a -> TSO a -> Maybe Int
TypeChecker.hs view
@@ -7,10 +7,9 @@ import Control.Applicative hiding (Const) -- ((<$>)) import Control.Monad-import Control.Monad.IfElse import Control.Monad.Identity import Control.Monad.State-import Control.Monad.Error+import Control.Monad.Except import Control.Monad.Reader import qualified Data.List as List@@ -68,17 +67,17 @@ {- DEAD CODE runWhnf :: Signature -> TypeCheck a -> IO (Either TraceError (a,Signature))-runWhnf sig tc = (runErrorT (runStateT tc sig))+runWhnf sig tc = (runExceptT (runStateT tc sig)) -} -doNf sig e = runErrorT (runReaderT (runStateT (whnf emptyEnv e >>= reify) (initWithSig sig)) emptyContext)-doWhnf sig e = runErrorT (runReaderT (runStateT (whnf emptyEnv e >>= whnfClos) (initWithSig sig)) emptyContext)+doNf sig e = runExceptT (runReaderT (runStateT (whnf emptyEnv e >>= reify) (initWithSig sig)) emptyContext)+doWhnf sig e = runExceptT (runReaderT (runStateT (whnf emptyEnv e >>= whnfClos) (initWithSig sig)) emptyContext) -- top-level functions ------------------------------------------- runTypeCheck :: TCState -> TypeCheck a -> IO (Either TraceError (a,TCState))-runTypeCheck st tc = runErrorT (runReaderT (runStateT tc st) emptyContext)+runTypeCheck st tc = runExceptT (runReaderT (runStateT tc st) emptyContext) -- runTypeCheck st tc = runCallStackT (runReaderT (runStateT tc st) emptyContext) [] typeCheck dl = runTypeCheck initSt (typeCheckDecls dl)@@ -130,7 +129,7 @@ r <- (typeCheckDecls ds >> return True) `catchError` (\ s -> do liftIO $ putStrLn ("block fails as expected, error message:\n" ++ show s) return False)- if r then fail "unexpected success" else do+ if r then throwErrorMsg "unexpected success" else do put st return [] @@ -242,7 +241,7 @@ newAssertionHandling Warning $ typeCheckMutualSig d typeCheckMutualSig (OverrideDecl Impredicative [d]) = goImpredicative $ typeCheckMutualSig d-typeCheckMutualSig d = fail $ "typeCheckMutualSig: panic: unexpected declaration " ++ show d+typeCheckMutualSig d = throwErrorMsg $ "typeCheckMutualSig: panic: unexpected declaration " ++ show d -- typeCheckMutualBody measured kindCandidate typeCheckMutualBody :: Bool -> Kind -> Declaration -> TypeCheck [EDeclaration]@@ -272,7 +271,7 @@ -- insert correct polarity annotation if none was there pol | pol `elem` [Param,Rec] -> return $ Quant Pi (TBind x $ Domain tSize kSize $ setPol polsz dec) b pol | pol == polsz -> return t0- pol -> fail $ "sized type " ++ show n ++ " has wrong polarity annotation " ++ show pol ++ " at Size argument, it should be " ++ show polsz+ pol -> throwErrorMsg $ "sized type " ++ show n ++ " has wrong polarity annotation " ++ show pol ++ " at Size argument, it should be " ++ show polsz t0 -> return t0 return (params + 1, pos0 ++ [polsz], t) NotSized -> return (params, pos0, t0)@@ -418,7 +417,7 @@ return (cxt, ps) where- errorParamNotPattern e = fail $+ errorParamNotPattern e = throwErrorMsg $ "expected parameter to be a pattern, but I found " ++ show es -- |@@ -683,7 +682,7 @@ addBind (mapDec (const paramDec) tb) $ do -- size is parametric in constructor type Kinded ki t2e <- checkConType' t2 return $ Kinded ki $ Quant Pi (mapDec (const irrelevantDec) tb) t2e -- size is irrelevant in constructor- _ -> fail $ "checkConType: expecting size quantification, found " ++ show t+ _ -> throwErrorMsg $ "checkConType: expecting size quantification, found " ++ show t checkConType' :: Expr -> TypeCheck (Kinded Extr) checkConType' t = do@@ -691,7 +690,7 @@ case s of Set{} -> return kte CoSet{} -> return kte- _ -> fail $ "checkConType: type " ++ show t ++ " of constructor not a universe"+ _ -> throwErrorMsg $ "checkConType: type " ++ show t ++ " of constructor not a universe" -- check that the data type and the parameter arguments (written down like declared in telescope) -- precondition: target tg type checks in current context@@ -704,7 +703,7 @@ enter ("checking datatype parameters in constructor target") $ leqVals' N mixed (One dv) (take (size tel) vs) telvs return ()- _ -> fail $ "constructor should produce something in data type " ++ show d+ _ -> throwErrorMsg $ "constructor should produce something in data type " ++ show d {- RETIRED (syntactic check) checkTarget :: Name -> Telescope -> Type -> TypeCheck ()@@ -1263,7 +1262,7 @@ let parametric = checkingConType cxt -- are we dealing with a parametric pi? let err = "ptsRule " ++ show (s1,s2) ++ " " ++ (if parametric then "(in type of constructor)" else "") ++ ": " case (s1,s2) of- (Set VInfty,_) -> fail $ err ++ "domain too big"+ (Set VInfty,_) -> throwErrorMsg $ err ++ "domain too big" (Set v1, Set v2) -> if parametric then do unless er $ leqSize Pos v1 v2 -- when we are checking a constructor, to reject@@ -1273,15 +1272,15 @@ (CoSet v1, Set VZero) | parametric -> return $ CoSet v1 | v1 == VInfty -> return $ Set VZero- | otherwise -> fail $ err ++ "domain cannot be sized"+ | otherwise -> throwErrorMsg $ err ++ "domain cannot be sized" (CoSet v1, CoSet v2) | parametric -> do let v2' = maybe v2 id $ predSize v2 case minSize v1 v2 of Just v -> return $ CoSet v- Nothing -> fail $ err ++ "min" ++ show (v1,v2) ++ " does not exist"+ Nothing -> throwErrorMsg $ err ++ "min" ++ show (v1,v2) ++ " does not exist" | v1 == VInfty -> return $ CoSet $ succSize v2- | otherwise -> fail $ err ++ "domain cannot be sized"+ | otherwise -> throwErrorMsg $ err ++ "domain cannot be sized" _ -> return s2 checkOrInfer :: Dec -> Expr -> Maybe Type -> TypeCheck (TVal, EType, Kinded Extr)@@ -1302,7 +1301,7 @@ (sv, te) <- inferExpr t case sv of VSort s | not (s `elem` map SortC [Tm,Size]) -> return (s,te)- _ -> fail $ "inferExpr: expected " ++ show t ++ " to be a type!"+ _ -> throwErrorMsg $ "inferExpr: expected " ++ show t ++ " to be a type!" -- inferExpr e = (tv, s, ee) -- input : expr e | inferable e@@ -1380,9 +1379,9 @@ let dec = decor item let pol = polarity dec if erased dec then- fail $ err ++ ", because it is marked as erased"+ throwErrorMsg $ err ++ ", because it is marked as erased" else if not (leqPol pol SPos) then- fail $ err ++ ", because it has polarity " ++ show pol+ throwErrorMsg $ err ++ ", because it has polarity " ++ show pol else do -- traceCheckM ("infer variable " ++ x ++ " : " ++ show (typ item)) return $ (typ item, Var x) -- TODO: (typ item, kind item, Var x)@@ -1408,7 +1407,7 @@ checkCon <- asks checkingConType {- TODO when (checkCon && polarity dec /= Mixed) $- fail $ "constructor arguments must be declared mixed-variant"+ throwErrorMsg $ "constructor arguments must be declared mixed-variant" -} (s1, Kinded ki0 t1e) <- (if pisig==Pi then checkingDom else id) $ checkingCon False $ inferType t1 -- switch off parametric Pi@@ -1579,7 +1578,7 @@ case s of Set VZero -> return te CoSet{} -> return te- _ -> fail $ "expected " ++ show s ++ " to be Set or CoSet _"+ _ -> throwErrorMsg $ "expected " ++ show s ++ " to be Set or CoSet _" {- -- small type@@ -1620,8 +1619,8 @@ tel <- getContextTele -- TODO! case (absp,mrhs) of (True,Nothing) -> return $ Kinded NoKind (Clause tel [pe] Nothing)- (False,Nothing) -> fail ("missing right hand side in case " ++ showCase cl)- (True,Just rhs) -> fail ("absurd pattern requires no right hand side in case " ++ showCase cl)+ (False,Nothing) -> throwErrorMsg ("missing right hand side in case " ++ showCase cl)+ (True,Just rhs) -> throwErrorMsg ("absurd pattern requires no right hand side in case " ++ showCase cl) (False,Just rhs) -> do -- pv <- whnf' (patternToExpr p) -- DIFFICULT FOR DOT PATTERNS! -- vp <- patternToVal p -- BUG: INTRODUCES FRESH GENS, BUT THEY HAVE ALREADY BEEN INTRODUCED IN checkPattern@@ -1676,8 +1675,8 @@ tel <- getContextTele -- WRONG TELE, has VGens for DotPs case (absp,mrhs) of (True,Nothing) -> return $ Kinded NoKind (Clause tel ple Nothing)- (False,Nothing) -> fail ("missing right hand side in clause " ++ show cl)- (True,Just rhs) -> fail ("absurd pattern requires no right hand side in clause " ++ show cl)+ (False,Nothing) -> throwErrorMsg ("missing right hand side in clause " ++ show cl)+ (True,Just rhs) -> throwErrorMsg ("absurd pattern requires no right hand side in clause " ++ show cl) (False,Just rhs) -> do Kinded ki rhse <- checkRHS ins rhs tv0 env <- getEnv@@ -1712,7 +1711,7 @@ VMeasured mu vb -> setMeasure mu $ checkPatterns dec0 flex ins vb pl VGuard beta vb -> addBoundHyp beta $ checkPatterns dec0 flex ins vb pl {-- VGuard beta vb -> fail $ "checkPattern at type " ++ show v ++ " --- introduction of constraints not supported"+ VGuard beta vb -> throwErrorMsg $ "checkPattern at type " ++ show v ++ " --- introduction of constraints not supported" -} _ -> case pl of [] -> do cxt <- ask@@ -1794,7 +1793,7 @@ co <- asks mutualCo when (co /= CoInd) $- fail ("successor pattern only allowed in cofun")+ throwErrorMsg ("successor pattern only allowed in cofun") enterDoc (text ("checkPattern " ++ show p ++" : matching on size, checking that target") <+> prettyTCM tv <+> text "ends in correct coinductive sized type") $ underAbs x domEr fv $ \ i _ bv -> endsInSizedCo i bv@@ -1911,7 +1910,7 @@ return (flex, ins, cxt', maybeErase $ SizeP e y, xv, False) AbsurdP -> do- when (isFunType av) $ fail ("absurd pattern " ++ show p ++ " does not match function types, like " ++ show av)+ when (isFunType av) $ throwErrorMsg ("absurd pattern " ++ show p ++ " does not match function types, like " ++ show av) cxt' <- ask return (MaxMatches 0 av : flex, ins, cxt', maybeErase $ AbsurdP, VIrr, True) {-@@ -1945,7 +1944,7 @@ -} (vc,(flex',ins',cxt',vc',ple,pvs,absp)) <- checkConstructorPattern co n pl - when (isFunType vc') $ fail ("higher-order matching of pattern " ++ show p ++ " of type " ++ show vc' ++ " not allowed")+ when (isFunType vc') $ throwErrorMsg ("higher-order matching of pattern " ++ show p ++ " of type " ++ show vc' ++ " not allowed") let flexgen = concat $ map (\ g -> case g of DotFlex i _ _ -> [i] _ -> []) flex'@@ -2040,7 +2039,7 @@ maybeErase p = if erased decEr then ErasedP p else p checkConstructorPattern co n pl = do- when (isFunType av) $ fail ("higher-order matching of pattern " ++ show p ++ " at type " ++ show av ++ " not allowed")+ when (isFunType av) $ throwErrorMsg ("higher-order matching of pattern " ++ show p ++ " at type " ++ show av ++ " not allowed") -- TODO: ensure that matchings against erased arguments are forced -- when (erased dec) $ throwErrorMsg $ "checkPattern: cannot match on erased argument " ++ show p ++ " : " ++ show av @@ -2076,7 +2075,7 @@ when (co == CoCons && isJust sz) $ do let sizep = head pl -- 2012-01-22: WAS (pl !! nPars) unless (isDotPattern sizep) $- fail $ "in pattern " ++ show p ++ ", coinductive size sub pattern " ++ show sizep ++ " must be dotted"+ throwErrorMsg $ "in pattern " ++ show p ++ ", coinductive size sub pattern " ++ show sizep ++ " must be dotted" when (not $ decEr `elem` map Dec [Const,Rec]) $ recoverFail $ "cannot match pattern " ++ show p ++ " against non-computational argument"@@ -2150,7 +2149,7 @@ checkDot :: Substitution -> DotFlex -> TypeCheck () checkDot subst (i,(e,it)) = enter ("dot pattern " ++ show e) $ case (lookup i subst) of- Nothing -> fail $ "not instantiated"+ Nothing -> throwErrorMsg $ "not instantiated" Just v -> do tv <- substitute subst (typ it) ask >>= \ ce -> traceCheckM ("checking dot pattern " ++ show ce ++ " |- " ++ show e ++ " : " ++ show (decor it) ++ " " ++ show tv)@@ -2325,7 +2324,7 @@ (VQuant Pi x dom fv) -> do vb <- app fv v2 instList' (np - 1) (tailPosl posl) flex vb vl1 vl2-instList' np pos flex tv vl1 vl2 = fail $ "internal error: instList' " ++ show (np,pos,flex,tv,vl1,vl2) ++ " not handled"+instList' np pos flex tv vl1 vl2 = throwErrorMsg $ "internal error: instList' " ++ show (np,pos,flex,tv,vl1,vl2) ++ " not handled" headPosl :: [Pol] -> Pol headPosl [] = mixed@@ -2497,7 +2496,7 @@ VQuant Pi x dom fv | isVSize (typ dom) -> underAbs x dom fv $ \ k xv bv -> do szSizeVarUsage n co p k bv- _ -> fail $ "not a valid sized constructor: expected size quantification"+ _ -> throwErrorMsg $ "not a valid sized constructor: expected size quantification" szSizeVarUsage :: Name -> Co -> Int -> Int -> TVal -> TypeCheck () szSizeVarUsage n co p i tv = enterDoc (text "szSizeVarUsage of" <+> prettyTCM (VGen i) <+> text "in" <+> prettyTCM tv) $@@ -2637,7 +2636,7 @@ admFunDef co cls tv = do (cls, inco) <- admClauses cls tv when (co==CoInd && not (co `elem` inco)) $- fail $ show tv ++ " is not a type of a cofun" -- ++ if co==Ind then "fun" else "cofun"+ throwErrorMsg $ show tv ++ " is not a type of a cofun" -- ++ if co==Ind then "fun" else "cofun" return cls admClauses :: [Clause] -> TVal -> TypeCheck ([Clause], [Co])@@ -2988,7 +2987,7 @@ VApp (VDef (DefId DatK d)) vl -> do case p of ProjP n -> return (p, [])- _ -> fail "admPattern: IMPOSSIBLE: non-projection pattern for record type"+ _ -> throwErrorMsg "admPattern: IMPOSSIBLE: non-projection pattern for record type" VQuant Pi x dom fv -> underAbs x dom fv $ \ k xv bv -> do {- if p is successor pattern@@ -3004,7 +3003,7 @@ else return (UnusableP p, inco) else return (p, []) - _ -> fail "admPattern: IMPOSSIBLE: pattern for a non-function type"+ _ -> throwErrorMsg "admPattern: IMPOSSIBLE: pattern for a non-function type" cannotMatchDeep p tv = recoverFailDoc $ text "cannot match against deep successor pattern"@@ -3297,6 +3296,6 @@ do s <- whnfClos $ vl !! p case s of VGen i' | i == i' -> return ()- _ -> fail $ "expected size variable"- _ -> fail $ "expected (co)inductive sized type"- _ -> fail $ "expected (co)inductive sized type"+ _ -> throwErrorMsg $ "expected size variable"+ _ -> throwErrorMsg $ "expected (co)inductive sized type"+ _ -> throwErrorMsg $ "expected (co)inductive sized type"
Util.hs view
@@ -7,6 +7,7 @@ import Prelude hiding (showList, null) import Control.Applicative hiding (empty)+import Control.Monad import Control.Monad.Writer (Writer, runWriter, All, getAll) import qualified Data.List as List@@ -68,9 +69,15 @@ (<.>) :: Functor m => (b -> c) -> (a -> m b) -> a -> m c (f <.> g) a = f <$> g a -liftMaybe :: (Monad m) => Maybe a -> m a-liftMaybe = maybe (fail "Util.liftMaybe: unexpected Nothing") return+whenM :: Monad m => m Bool -> m () -> m ()+whenM mb k = mb >>= (`when` k) +unlessM :: Monad m => m Bool -> m () -> m ()+unlessM mb k = mb >>= (`unless` k)++whenJustM :: (Monad m) => m (Maybe a) -> (a -> m ()) -> m ()+whenJustM mm k = mm >>= (`whenJust` k)+ whenJust :: (Monad m) => Maybe a -> (a -> m ()) -> m () whenJust (Just a) k = k a whenJust Nothing k = return ()@@ -85,9 +92,6 @@ ifJustM :: (Monad m) => m (Maybe a) -> (a -> m b) -> m b -> m b ifJustM mma f mb = maybe mb f =<< mma -lookupM :: (Monad m, Show k, Ord k) => k -> Map k v -> m v-lookupM k m = maybe (fail $ "lookupM: unbound key " ++ show k) return $ Map.lookup k m- mapMapM :: (Monad m, Ord k) => (a -> m b) -> Map k a -> m (Map k b) mapMapM f = Map.foldrWithKey step (return $ Map.empty) where step k a m = do a' <- f a@@ -164,10 +168,6 @@ headMaybe :: [a] -> Maybe a headMaybe [] = Nothing headMaybe (a:as) = Just a--headM :: Monad m => [a] -> m a-headM [] = fail "headM"-headM (a:as) = return a firstJust :: [Maybe a] -> Maybe a firstJust = headMaybe . compressMaybes
Value.hs view
@@ -167,9 +167,6 @@ vApp f vs = VApp f vs -} -failValInv :: (Monad m) => Val -> m a-failValInv v = fail $ "internal error: value " ++ show v ++ " violates representation invariant"- vAbs :: Name -> Int -> Val -> FVal vAbs x i v = VAbs x i v emptyVal
+ test/succeed/AgdaIssue1052.ma view
@@ -0,0 +1,49 @@++data Eq [A : Set] (a : A) (b : A) : Set+{ refl : Eq A a a }++fun X : Set {}+fun f : X -> X {}++data StepsTo (x, z : X) : Set+{ done : StepsTo x x+; next : (y : X) -> Eq X (f y) z -> StepsTo x y -> StepsTo x z+}++fun trans : (x, y, z : X) -> StepsTo x y -> StepsTo y z -> StepsTo x z+{ trans x y .y p done = p+; trans x y z p (next z' r q) = next z' r (trans x y z' p q)+}++fun const : (x, y : X) -> StepsTo x y -> Eq X (f x) x -> Eq X x y+{ const x .x done q = refl+-- ; const _ _ (next _ r p) q = -- TODO+}++{-+fun bad : (x, y, z : X) -> StepsTo x z -> Eq X (f z) x -> StepsTo x y -> StepsTo y x+{ bad x y z (next z' p q) r s =+ next z r (bad z y _ (trans _ _ _ (next _ r done) q) p (trans _ _ _ (next _ r done) s))+} -- Giving up, need unification!!++-}+{-+data _=⟨_⟩⇒*_ {X : Set}(x : X)(f : X → X) : X → Set where+ done : x =⟨ f ⟩⇒* x+ next : ∀{y z} → f y ≡ z → x =⟨ f ⟩⇒* y → x =⟨ f ⟩⇒* z++trans* : ∀{X}{x y z}{f : X → X} → x =⟨ f ⟩⇒* y → y =⟨ f ⟩⇒* z → x =⟨ f ⟩⇒* z+trans* p done = p+trans* p (next r q) = next r (trans* p q)++const* : ∀{X}{x y}{f : X → X} → x =⟨ f ⟩⇒* y → f x ≡ x → x ≡ y+const* done q = refl+const* (next r p) q with const* p q+const* (next r p) q | refl = trans (sym q) r++bad : ∀{X}{x y z}{f : X → X} → x =⟨ f ⟩⇒* z → f z ≡ x → x =⟨ f ⟩⇒* y →+ y =⟨ f ⟩⇒* x+bad done p q rewrite const* q p = done+bad (next p q) r s =+ next r (bad (trans* (next r done) q) p (trans* (next r done) s))+-}