packages feed

Agda 2.4.2.1 → 2.4.2.2

raw patch · 29 files changed

+905/−499 lines, 29 filesdep ~Agdadep ~hashtablesPVP: major bump suggested

API removals or changes: PVP suggests a major version bump

Dependency ranges changed: Agda, hashtables

API changes (from Hackage documentation)

- Agda.Syntax.Internal: data Pattern
- Agda.Syntax.Internal: instance Show Pattern
- Agda.Syntax.Internal: instance Typeable Pattern
- Agda.TypeChecking.Quote: UnQFun :: Type -> [Clause] -> UnquotedFunDef
- Agda.TypeChecking.Quote: agdaTermType :: TCM Type
- Agda.TypeChecking.Quote: choice :: Monad m => [(m Bool, m a)] -> m a -> m a
- Agda.TypeChecking.Quote: class Unquote a
- Agda.TypeChecking.Quote: data UnquotedFunDef
- Agda.TypeChecking.Quote: ensureCon :: QName -> UnquoteM QName
- Agda.TypeChecking.Quote: ensureDef :: QName -> UnquoteM QName
- Agda.TypeChecking.Quote: instance Unquote ArgInfo
- Agda.TypeChecking.Quote: instance Unquote Char
- Agda.TypeChecking.Quote: instance Unquote Clause
- Agda.TypeChecking.Quote: instance Unquote ConHead
- Agda.TypeChecking.Quote: instance Unquote Double
- Agda.TypeChecking.Quote: instance Unquote Hiding
- Agda.TypeChecking.Quote: instance Unquote Integer
- Agda.TypeChecking.Quote: instance Unquote Level
- Agda.TypeChecking.Quote: instance Unquote Literal
- Agda.TypeChecking.Quote: instance Unquote Pattern
- Agda.TypeChecking.Quote: instance Unquote QName
- Agda.TypeChecking.Quote: instance Unquote Relevance
- Agda.TypeChecking.Quote: instance Unquote Sort
- Agda.TypeChecking.Quote: instance Unquote Str
- Agda.TypeChecking.Quote: instance Unquote Term
- Agda.TypeChecking.Quote: instance Unquote Type
- Agda.TypeChecking.Quote: instance Unquote UnquotedFunDef
- Agda.TypeChecking.Quote: instance Unquote a => Unquote (Abs a)
- Agda.TypeChecking.Quote: instance Unquote a => Unquote (Arg a)
- Agda.TypeChecking.Quote: instance Unquote a => Unquote (Elim' a)
- Agda.TypeChecking.Quote: instance Unquote a => Unquote [a]
- Agda.TypeChecking.Quote: isCon :: ConHead -> TCM Term -> UnquoteM Bool
- Agda.TypeChecking.Quote: pickName :: Type -> String
- Agda.TypeChecking.Quote: qNameType :: TCM Type
- Agda.TypeChecking.Quote: reifyUnquoted :: Reify a e => a -> TCM e
- Agda.TypeChecking.Quote: runUnquoteM :: UnquoteM a -> TCM (Either UnquoteError a)
- Agda.TypeChecking.Quote: type UnquoteM = ExceptionT UnquoteError TCM
- Agda.TypeChecking.Quote: unquote :: Unquote a => Term -> UnquoteM a
- Agda.TypeChecking.Quote: unquoteH :: Unquote a => Arg Term -> UnquoteM a
- Agda.TypeChecking.Quote: unquoteN :: Unquote a => Arg Term -> UnquoteM a
- Agda.TypeChecking.Rules.LHS.Unify: emptyUOutput :: UnifyOutput
- Agda.TypeChecking.Rules.LHS.Unify: onSub :: (Sub -> a) -> Unify a
+ Agda.Syntax.Internal: data Pattern' x
+ Agda.Syntax.Internal: instance Foldable Pattern'
+ Agda.Syntax.Internal: instance Functor Pattern'
+ Agda.Syntax.Internal: instance Show x => Show (Pattern' x)
+ Agda.Syntax.Internal: instance Traversable Pattern'
+ Agda.Syntax.Internal: instance Typeable Pattern'
+ Agda.Syntax.Internal: type Pattern = Pattern' PatVarName
+ Agda.Syntax.Internal.Pattern: class LabelPatVars a b i | b -> i
+ Agda.Syntax.Internal.Pattern: instance [overlap ok] LabelPatVars (Pattern' x) (Pattern' (i, x)) i
+ Agda.Syntax.Internal.Pattern: instance [overlap ok] LabelPatVars a b i => LabelPatVars (Arg c a) (Arg c b) i
+ Agda.Syntax.Internal.Pattern: instance [overlap ok] LabelPatVars a b i => LabelPatVars (Named x a) (Named x b) i
+ Agda.Syntax.Internal.Pattern: instance [overlap ok] LabelPatVars a b i => LabelPatVars [a] [b] i
+ Agda.Syntax.Internal.Pattern: labelPatVars :: LabelPatVars a b i => a -> State [i] b
+ Agda.Syntax.Internal.Pattern: numberPatVars :: LabelPatVars a b Int => Permutation -> a -> b
+ Agda.TypeChecking.Reduce: instance InstantiateFull Substitution
+ Agda.TypeChecking.Rules.LHS: instance InstantiateFull LHSResult
+ Agda.TypeChecking.Rules.LHS: instantiatePattern' :: Substitution -> Permutation -> [NamedArg Pattern] -> [NamedArg Pattern]
+ Agda.TypeChecking.Rules.LHS.Unify: getSub :: Unify Sub
+ Agda.TypeChecking.Unquote: UnQFun :: Type -> [Clause] -> UnquotedFunDef
+ Agda.TypeChecking.Unquote: agdaTermType :: TCM Type
+ Agda.TypeChecking.Unquote: choice :: Monad m => [(m Bool, m a)] -> m a -> m a
+ Agda.TypeChecking.Unquote: class Unquote a
+ Agda.TypeChecking.Unquote: data UnquotedFunDef
+ Agda.TypeChecking.Unquote: ensureCon :: QName -> UnquoteM QName
+ Agda.TypeChecking.Unquote: ensureDef :: QName -> UnquoteM QName
+ Agda.TypeChecking.Unquote: instance Unquote ArgInfo
+ Agda.TypeChecking.Unquote: instance Unquote Char
+ Agda.TypeChecking.Unquote: instance Unquote Clause
+ Agda.TypeChecking.Unquote: instance Unquote ConHead
+ Agda.TypeChecking.Unquote: instance Unquote Double
+ Agda.TypeChecking.Unquote: instance Unquote Hiding
+ Agda.TypeChecking.Unquote: instance Unquote Integer
+ Agda.TypeChecking.Unquote: instance Unquote Level
+ Agda.TypeChecking.Unquote: instance Unquote Literal
+ Agda.TypeChecking.Unquote: instance Unquote Pattern
+ Agda.TypeChecking.Unquote: instance Unquote QName
+ Agda.TypeChecking.Unquote: instance Unquote Relevance
+ Agda.TypeChecking.Unquote: instance Unquote Sort
+ Agda.TypeChecking.Unquote: instance Unquote Str
+ Agda.TypeChecking.Unquote: instance Unquote Term
+ Agda.TypeChecking.Unquote: instance Unquote Type
+ Agda.TypeChecking.Unquote: instance Unquote UnquotedFunDef
+ Agda.TypeChecking.Unquote: instance Unquote a => Unquote (Abs a)
+ Agda.TypeChecking.Unquote: instance Unquote a => Unquote (Arg a)
+ Agda.TypeChecking.Unquote: instance Unquote a => Unquote (Elim' a)
+ Agda.TypeChecking.Unquote: instance Unquote a => Unquote [a]
+ Agda.TypeChecking.Unquote: isCon :: ConHead -> TCM Term -> UnquoteM Bool
+ Agda.TypeChecking.Unquote: pickName :: Type -> String
+ Agda.TypeChecking.Unquote: qNameType :: TCM Type
+ Agda.TypeChecking.Unquote: reifyUnquoted :: Reify a e => a -> TCM e
+ Agda.TypeChecking.Unquote: runUnquoteM :: UnquoteM a -> TCM (Either UnquoteError a)
+ Agda.TypeChecking.Unquote: type UnquoteM = ExceptionT UnquoteError TCM
+ Agda.TypeChecking.Unquote: unquote :: Unquote a => Term -> UnquoteM a
+ Agda.TypeChecking.Unquote: unquoteH :: Unquote a => Arg Term -> UnquoteM a
+ Agda.TypeChecking.Unquote: unquoteN :: Unquote a => Arg Term -> UnquoteM a
+ Agda.Utils.Permutation: class InversePermute a b
+ Agda.Utils.Permutation: instance InversePermute [Maybe a] (IntMap a)
+ Agda.Utils.Permutation: instance InversePermute [Maybe a] [(Int, a)]
+ Agda.Utils.Permutation: instance InversePermute [Maybe a] [Maybe a]
+ Agda.Utils.Permutation: inversePermute :: InversePermute a b => Permutation -> a -> b
+ Agda.Utils.Permutation.Tests: instance Arbitrary ComposablePermutations
+ Agda.Utils.Permutation.Tests: instance Arbitrary Permutation
+ Agda.Utils.Permutation.Tests: instance Eq ComposablePermutations
+ Agda.Utils.Permutation.Tests: instance Show ComposablePermutations
+ Agda.Utils.Permutation.Tests: tests :: IO Bool
+ Agda.Utils.VarSet: toDescList :: IntSet -> [Key]
- Agda.Compiler.Epic.Injection: Tags :: Map Int (Set QName) -> Map QName TagEq -> Tags
+ Agda.Compiler.Epic.Injection: Tags :: IntMap (Set QName) -> Map QName TagEq -> Tags
- Agda.Compiler.Epic.Injection: eqGroups :: Tags -> Map Int (Set QName)
+ Agda.Compiler.Epic.Injection: eqGroups :: Tags -> IntMap (Set QName)
- Agda.Syntax.Concrete.Generic: class ExprLike a where traverseExpr = (throwImpossible (Impossible "dist/build/tmp-32572/src/full/Agda/Syntax/Concrete/Generic.hs" 35)) foldExpr = (throwImpossible (Impossible "dist/build/tmp-32572/src/full/Agda/Syntax/Concrete/Generic.hs" 36))
+ Agda.Syntax.Concrete.Generic: class ExprLike a where traverseExpr = (throwImpossible (Impossible "dist/build/tmp-29154/src/full/Agda/Syntax/Concrete/Generic.hs" 35)) foldExpr = (throwImpossible (Impossible "dist/build/tmp-29154/src/full/Agda/Syntax/Concrete/Generic.hs" 36))
- Agda.Syntax.Internal: ConP :: ConHead -> ConPatternInfo -> [NamedArg Pattern] -> Pattern
+ Agda.Syntax.Internal: ConP :: ConHead -> ConPatternInfo -> [NamedArg (Pattern' x)] -> Pattern' x
- Agda.Syntax.Internal: DotP :: Term -> Pattern
+ Agda.Syntax.Internal: DotP :: Term -> Pattern' x
- Agda.Syntax.Internal: LitP :: Literal -> Pattern
+ Agda.Syntax.Internal: LitP :: Literal -> Pattern' x
- Agda.Syntax.Internal: ProjP :: QName -> Pattern
+ Agda.Syntax.Internal: ProjP :: QName -> Pattern' x
- Agda.Syntax.Internal: VarP :: PatVarName -> Pattern
+ Agda.Syntax.Internal: VarP :: x -> Pattern' x
- Agda.TypeChecking.Rules.LHS.Unify: type Sub = Map Nat Term
+ Agda.TypeChecking.Rules.LHS.Unify: type Sub = IntMap Term
- Agda.Utils.Permutation: class DoDrop a where dropMore n (Drop m xs) = Drop (m + n) xs unDrop n (Drop m xs) | n <= m = Drop (m - n) xs | otherwise = (throwImpossible (Impossible "dist/build/tmp-32572/src/full/Agda/Utils/Permutation.hs" 182))
+ Agda.Utils.Permutation: class DoDrop a where dropMore n (Drop m xs) = Drop (m + n) xs unDrop n (Drop m xs) | n <= m = Drop (m - n) xs | otherwise = (throwImpossible (Impossible "dist/build/tmp-29154/src/full/Agda/Utils/Permutation.hs" 217))

Files

Agda.cabal view
@@ -1,5 +1,5 @@ name:            Agda-version:         2.4.2.1+version:         2.4.2.2 cabal-version:   >= 1.8 build-type:      Custom license:         OtherLicense@@ -33,7 +33,6 @@   policy, because it is not intended to be used by third-party   packages. tested-with:        GHC == 7.0.4-                    GHC == 7.2.2                     GHC == 7.4.2                     GHC == 7.6.3                     GHC == 7.8.3@@ -57,7 +56,7 @@ source-repository this   type:     git   location: https://github.com/agda/agda-  tag:      2.4.2.1+  tag:      2.4.2.2  flag cpphs   default:     True@@ -331,6 +330,7 @@                     Agda.TypeChecking.Test.Generators                     Agda.TypeChecking.Tests --                    Agda.TypeChecking.UniversePolymorphism -- RETIRED+                    Agda.TypeChecking.Unquote                     Agda.TypeChecking.With                     Agda.Utils.AssocList                     Agda.Utils.Bag@@ -363,6 +363,7 @@                     Agda.Utils.Null                     Agda.Utils.PartialOrd                     Agda.Utils.Permutation+                    Agda.Utils.Permutation.Tests                     Agda.Utils.Pointer                     Agda.Utils.Pointed                     Agda.Utils.Pretty@@ -419,7 +420,7 @@   -- under GHC 7.0.4.  -Werror is for developers only, who are assumed   -- to use a recent GHC.   -- if impl(ghc > 7.2.2)-  --   ghc-options:    -Werror+  --    ghc-options:    -Werror   if impl(ghc >= 6.12)     ghc-options:    -fwarn-dodgy-exports                     -fwarn-wrong-do-bind@@ -441,7 +442,7 @@   hs-source-dirs: src/main   main-is:        Main.hs   build-depends:-    Agda == 2.4.2.1+    Agda == 2.4.2.2     -- Nothing is used from the following package, except for the     -- prelude.     , base >= 3 && < 6
CHANGELOG view
@@ -1,4 +1,22 @@ ------------------------------------------------------------------------+-- Release notes for Agda version 2.4.2.2+------------------------------------------------------------------------++Important changes since 2.4.2.1:++Bug fixes+=========++* Compilation on Windows fixed.++* Other issues fixed ( see https://code.google.com/p/agda/issues )+  1332+  1353+  1360+  1366+  1369++------------------------------------------------------------------------ -- Release notes for Agda version 2.4.2.1 ------------------------------------------------------------------------ @@ -62,11 +80,11 @@    Even though this code looks right, Agda complains about the type   expression `∀ u → unit ≡ dx u`.  If you ask Agda what should go-  there instead, she happily tells you that she wants-  `∀ u → unit ≡ dx u`.  Women!  In fact what you do not see and she+  there instead, it happily tells you that it wants+  `∀ u → unit ≡ dx u`. In fact what you do not see and Agda   will never show you is that the two expressions actually differ in   the invisible first argument to `dx`, which is visible only outside-  module `M`.  What she wants is an invisible `unit` after `dx`, but all+  module `M`.  What Agda wants is an invisible `unit` after `dx`, but all   you can write is an invisible `x` (which is inserted behind the   scenes). @@ -155,7 +173,7 @@   constructor applied to call argument, which is valid descent.    Note however, that Agda only looks for syntactic equality when-  identifying subterms, since she is not allowed to normalize terms on+  identifying subterms, since it is not allowed to normalize terms on   the rhs during termination checking.    Actually writing the dot pattern has no effect, this works as well,
src/data/emacs-mode/agda2-mode.el view
@@ -10,7 +10,7 @@  ;;; Code: -(defvar agda2-version "2.4.2.1"+(defvar agda2-version "2.4.2.2"   "The version of the Agda mode. Note that the same version of the Agda executable must be used.") 
src/full/Agda/Compiler/Epic/Injection.hs view
@@ -10,6 +10,8 @@ import Control.Monad.State import Control.Monad.Reader +import Data.IntMap (IntMap)+import qualified Data.IntMap as IntMap import Data.List import Data.Map (Map) import qualified Data.Map as Map@@ -219,7 +221,7 @@             _         -> __IMPOSSIBLE__         case Map.toList eqs of             (c, Same n) : _ -> do-                let grp = eqGroups tags !!!! n+                let grp = fromMaybe __IMPOSSIBLE__ $ IntMap.lookup n $ eqGroups tags                 tag <- assignConstrTag' c (Set.toList grp)                 updateTags . fromMaybe __IMPOSSIBLE__ =<< setTag n tag tags { constrGroup = eqs }             _              -> return ()@@ -334,13 +336,13 @@   deriving Eq  data Tags = Tags-    { eqGroups    :: Map Int (Set QName)+    { eqGroups    :: IntMap (Set QName)     , constrGroup :: Map QName TagEq     }  initialTags :: Map QName Tag -> [QName] -> Tags initialTags setTags newNames = Tags-    { eqGroups    = Map.fromList $ zip [0..] (map Set.singleton newNames)+    { eqGroups    = IntMap.fromList $ zip [0..] (map Set.singleton newNames)     , constrGroup = Map.map IsTag setTags `Map.union` Map.fromList (zip newNames (map Same [0..]))     } @@ -358,19 +360,21 @@  setTag :: Int -> Tag -> Tags -> Compile TCM (Maybe Tags) setTag gid tag ts = return $ Just $ ts-    { constrGroup = foldr (\c -> Map.insert c (IsTag tag)) (constrGroup ts) (Set.toList $ eqGroups ts !!!! gid)}+    { constrGroup = foldr (\ c -> Map.insert c (IsTag tag))+                          (constrGroup ts)+                          (Set.toList $ fromMaybe __IMPOSSIBLE__ $ IntMap.lookup gid $ eqGroups ts) }  mergeGroups :: Int -> Int -> Tags -> Compile TCM (Maybe Tags) mergeGroups n1 n2 ts = do-    let g1s = eqGroups ts !!!! n1-        g2s = eqGroups ts !!!! n2+    let g1s = fromMaybe __IMPOSSIBLE__ $ IntMap.lookup n1 $ eqGroups ts+        g2s = fromMaybe __IMPOSSIBLE__ $ IntMap.lookup n2 $ eqGroups ts         gs  = Set.union g1s g2s         g1l = Set.toList g1s         g2l = Set.toList g2s     ifNotM (andM $ zipWith unifiable g1l g2l)         (return Nothing) $         return $ Just $ ts-            { eqGroups    = Map.delete n2 $ Map.insert n1 gs (eqGroups ts)+            { eqGroups    = IntMap.delete n2 $ IntMap.insert n1 gs (eqGroups ts)             , constrGroup = Map.fromList [ (e2, Same n1) | e2 <- g2l ] `Map.union` constrGroup ts             } 
src/full/Agda/Compiler/JS/Compiler.hs view
@@ -25,7 +25,7 @@     mnameToList, qnameName, qnameModule, isInModule, nameId ) import Agda.Syntax.Internal   ( Name, Args, Type,-    Clause, Pattern(VarP,DotP,LitP,ConP,ProjP),+    Clause, Pattern, Pattern'(VarP,DotP,LitP,ConP,ProjP),     ClauseBodyF(Body,NoBody,Bind),ClauseBody,     Term(Var,Lam,Lit,Level,Def,Con,Pi,Sort,MetaV,DontCare,Shared,ExtLam),     unSpine, allApplyElims,
src/full/Agda/Interaction/BasicOps.hs view
@@ -99,12 +99,24 @@         TP.text "give: instantiated meta type =" TP.<+> prettyTCM t'       v <- checkExpr e t'       case mvInstantiation mv of-        InstV _ v' -> unlessM ((Irrelevant ==) <$> asks envRelevance) $ do+        InstV xs v' -> unlessM ((Irrelevant ==) <$> asks envRelevance) $ do           reportSDoc "interaction.give" 20 $ TP.sep             [ TP.text "meta was already set to value v' = " TP.<+> prettyTCM v'+              TP.<+> TP.text " with free variables " TP.<+> return (fsep $ map pretty xs)             , TP.text "now comparing it to given value v = " TP.<+> prettyTCM v+            , TP.text "in context " TP.<+> inTopContext (prettyTCM ctx)             ]-          equalTerm t' v v'  -- Note: v' lives in context of meta+          -- The number of free variables should be at least the size of the context+          -- (Ideally, if we implemented contextual type theory, it should be the same.)+          when (length xs < size ctx) __IMPOSSIBLE__+          -- if there are more free variables than the context has+          -- we need to abstract over the additional ones (xs2)+          let (_xs1, xs2) = splitAt (size ctx) xs+          v' <- return $ foldr (\ (Arg ai x) -> I.Lam ai . I.Abs x) v' xs2+          reportSDoc "interaction.give" 20 $ TP.sep+            [ TP.text "in meta context, v' = " TP.<+> prettyTCM v'+            ]+          equalTerm t' v v'  -- Note: v' now lives in context of meta         _ -> updateMeta mi v       reify v 
src/full/Agda/Syntax/Internal.hs view
@@ -325,17 +325,24 @@ --     This also meshes well with the fact that values (i.e. --     the arguments we are matching with) use @QName@. ---data Pattern-  = VarP PatVarName-    -- ^ The @PatVarName@ is a name suggestion.+data Pattern' x+  = VarP x+    -- ^ @x@   | DotP Term-  | ConP ConHead ConPatternInfo [NamedArg Pattern]-    -- ^ The @Pattern@s do not contain any projection copatterns.+    -- ^ @.t@+  | ConP ConHead ConPatternInfo [NamedArg (Pattern' x)]+    -- ^ @c ps@+    --   The subpatterns do not contain any projection copatterns.   | LitP Literal+    -- ^ E.g. @5@, @"hello"@.   | ProjP QName     -- ^ Projection copattern.  Can only appear by itself.-  deriving (Typeable, Show)+  deriving (Typeable, Show, Functor, Foldable, Traversable) +type Pattern = Pattern' PatVarName+    -- ^ The @PatVarName@ is a name suggestion.++ namedVarP :: PatVarName -> Named (Ranged PatVarName) Pattern namedVarP x = Named named $ VarP x   where named = if isUnderscore x then Nothing else Just $ unranged x@@ -937,4 +944,3 @@       NotHidden -> prettyPrec p       Hidden    -> braces . pretty       Instance  -> braces . braces . pretty-
src/full/Agda/Syntax/Internal/Pattern.hs view
@@ -1,6 +1,12 @@-{-# LANGUAGE CPP                  #-}-{-# LANGUAGE FlexibleInstances    #-}-{-# LANGUAGE OverlappingInstances #-}+{-# LANGUAGE CPP                    #-}+{-# LANGUAGE FlexibleContexts       #-}+{-# LANGUAGE FlexibleInstances      #-}+{-# LANGUAGE FunctionalDependencies #-}+{-# LANGUAGE MultiParamTypeClasses  #-}+{-# LANGUAGE OverlappingInstances   #-}+{-# LANGUAGE TupleSections          #-}+{-# LANGUAGE TypeSynonymInstances   #-}+{-# LANGUAGE UndecidableInstances   #-}  -- because of func. deps.  module Agda.Syntax.Internal.Pattern where @@ -57,55 +63,75 @@  -- * Tools for patterns -instance IsProjP Pattern where-  isProjP (ProjP d) = Just d-  isProjP _         = Nothing+-- | Label the pattern variables from left to right+--   using one label for each variable pattern and one for each dot pattern.+class LabelPatVars a b i | b -> i where+  labelPatVars :: a -> State [i] b+  -- ^ Intended, but unpractical due to the absence of type-level lambda, is:+  --   @labelPatVars :: f (Pattern' x) -> State [i] (f (Pattern' (i,x)))@ --- Special case of Agda.Syntax.Abstract.IsProjP (Arg...)--- instance IsProjP (Common.Arg c Pattern) where---   isProjP = isProjP . unArg+instance LabelPatVars a b i => LabelPatVars (Arg c a) (Arg c b) i where+  labelPatVars = traverse labelPatVars -{- NOTE: The following definition does not work, since Elim' already-   contains Arg.  Otherwise, we could have fixed it using traverseF.+instance LabelPatVars a b i => LabelPatVars (Named x a) (Named x b) i where+  labelPatVars = traverse labelPatVars -patternsToElims :: Permutation -> [I.NamedArg Pattern] -> Elims-patternsToElims perm aps = evalState (argPatsToElims aps) xs-  where-    xs   = permute (invertP __IMPOSSIBLE__ perm) $ downFrom (size perm)+instance LabelPatVars a b i => LabelPatVars [a] [b] i where+  labelPatVars = traverse labelPatVars -    tick :: State [Int] Int-    tick = do x : xs <- get; put xs; return x+instance LabelPatVars (Pattern' x) (Pattern' (i,x)) i where+  labelPatVars p =+    case p of+      VarP x       -> VarP . (,x) <$> next+      DotP t       -> DotP t <$ next+      ConP c mt ps -> ConP c mt <$> labelPatVars ps+      LitP l       -> return $ LitP l+      ProjP q      -> return $ ProjP q+    where next = do (x:xs) <- get; put xs; return x -    argPatsToElims :: [I.NamedArg Pattern] -> State [Int] Elims-    argPatsToElims = traverse $ traverse $ patToElim . namedThing+-- | Augment pattern variables with their de Bruijn index.+{-# SPECIALIZE numberPatVars :: Permutation -> [NamedArg (Pattern' x)] -> [(NamedArg (Pattern' (Int, x)))] #-}+numberPatVars :: LabelPatVars a b Int => Permutation -> a -> b+numberPatVars perm ps = evalState (labelPatVars ps) $+  permute (invertP __IMPOSSIBLE__ perm) $ downFrom $ size perm -    patToElim :: Pattern -> State [Int] (Elim' Term)-    patToElim p = case p of-      VarP _      -> Apply . flip var <$> tick-      DotP v      -> Apply v <$ tick   -- dot patterns count as variables-      ConP c _ ps -> Apply . Con c . map argFromElim <$> argPatsToElims ps-      LitP l      -> pure $ Apply $ Lit l-      ProjP d     -> pure $ Proj d--}+instance IsProjP Pattern where+  isProjP (ProjP d) = Just d+  isProjP _         = Nothing  patternsToElims :: Permutation -> [I.NamedArg Pattern] -> [Elim]-patternsToElims perm ps = evalState (mapM build' ps) xs+patternsToElims perm ps = map build' $ numberPatVars perm ps   where-    xs   = permute (invertP __IMPOSSIBLE__ perm) $ downFrom (size perm) -    tick :: State [Int] Int-    tick = do x : xs <- get; put xs; return x--    build' :: NamedArg Pattern -> State [Int] Elim+    build' :: NamedArg (Pattern' (Int, PatVarName)) -> Elim     build' = build . fmap namedThing -    build :: I.Arg Pattern -> State [Int] Elim-    build (Arg ai (VarP _)     ) = Apply . Arg ai . var <$> tick-    build (Arg ai (ConP c _ ps)) =-      Apply . Arg ai . Con c <$> mapM (argFromElim <.> build') ps-    build (Arg ai (DotP t)     ) = Apply (Arg ai t) <$ tick-    build (Arg ai (LitP l)     ) = return $ Apply $ Arg ai $ Lit l-    build (Arg ai (ProjP dest) ) = return $ Proj  $ dest+    build :: I.Arg (Pattern' (Int, PatVarName)) -> Elim+    build (Arg ai (VarP (i, _))) = Apply $ Arg ai $ var i+    build (Arg ai (ConP c _ ps)) = Apply $ Arg ai $ Con c $+      map (argFromElim . build') ps+    build (Arg ai (DotP t)     ) = Apply $ Arg ai t+    build (Arg ai (LitP l)     ) = Apply $ Arg ai $ Lit l+    build (Arg ai (ProjP dest) ) = Proj  $ dest++-- patternsToElims :: Permutation -> [I.NamedArg Pattern] -> [Elim]+-- patternsToElims perm ps = evalState (mapM build' ps) xs+--   where+--     xs   = permute (invertP __IMPOSSIBLE__ perm) $ downFrom (size perm)++--     tick :: State [Int] Int+--     tick = do x : xs <- get; put xs; return x++--     build' :: NamedArg Pattern -> State [Int] Elim+--     build' = build . fmap namedThing++--     build :: I.Arg Pattern -> State [Int] Elim+--     build (Arg ai (VarP _)     ) = Apply . Arg ai . var <$> tick+--     build (Arg ai (ConP c _ ps)) =+--       Apply . Arg ai . Con c <$> mapM (argFromElim <.> build') ps+--     build (Arg ai (DotP t)     ) = Apply (Arg ai t) <$ tick+--     build (Arg ai (LitP l)     ) = return $ Apply $ Arg ai $ Lit l+--     build (Arg ai (ProjP dest) ) = return $ Proj  $ dest  -- * One hole patterns 
src/full/Agda/Tests.hs view
@@ -32,6 +32,7 @@ import Agda.Utils.Graph.AdjacencyMap.Unidirectional as UtilGraphUni (tests) import Agda.Utils.List                        as UtilList   (tests) import Agda.Utils.PartialOrd                  as UtilPOrd   (tests)+import Agda.Utils.Permutation.Tests           as UtilPerm   (tests) import Agda.Utils.Warshall                    as UtilWarsh  (tests)  testSuite :: IO Bool@@ -39,6 +40,7 @@   [ Irrel.tests   , SizedTypes.tests   , UtilFav.tests+  , UtilPerm.tests   , UtilPOrd.tests   , CompEnco.tests   , InteEmac.tests
src/full/Agda/TypeChecking/Abstract.hs view
@@ -56,7 +56,7 @@   abstractTerm :: Term -> a -> a  instance AbstractTerm Term where-  abstractTerm u v | Just es <- u `isPrefixOf` v = Var 0 es+  abstractTerm u v | Just es <- u `isPrefixOf` v = Var 0 $ raise 1 es                    | otherwise                   =     case v of -- Andreas, 2013-10-20: the original impl. works only at base types
src/full/Agda/TypeChecking/CheckInternal.hs view
@@ -177,11 +177,24 @@ -}  checkSpine :: Type -> Term -> Elims -> Type -> TCM ()-checkSpine a self es t = inferSpine a self es >>= (`subtype` t)+checkSpine a self es t = do+  reportSDoc "tc.check.internal" 20 $ sep+    [ text "checking spine "+    , text "("+    , prettyTCM self+    , text " : "+    , prettyTCM a+    , text ")"+    , prettyTCM es+    , text " : "+    , prettyTCM t+    ]+  inferSpine a self es >>= (`subtype` t)  checkArgs :: Type -> Term -> Args -> Type -> TCM () checkArgs a self vs t = checkSpine a self (map Apply vs) t +-- | @checkArgInfo actual expected@. checkArgInfo :: I.ArgInfo -> I.ArgInfo -> TCM () checkArgInfo ai ai' = do   checkHiding    (getHiding ai)     (getHiding ai')
src/full/Agda/TypeChecking/Coverage.hs view
@@ -1,3 +1,5 @@+{-# OPTIONS_GHC -fwarn-unused-imports #-}+ {-# LANGUAGE CPP              #-} {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE PatternGuards    #-}@@ -42,9 +44,8 @@  import Agda.TypeChecking.Rules.LHS.Problem (FlexibleVar(..),flexibleVarFromHiding) import Agda.TypeChecking.Rules.LHS.Unify-import Agda.TypeChecking.Rules.LHS.Instantiate-import Agda.TypeChecking.Rules.LHS-import qualified Agda.TypeChecking.Rules.LHS.Split as Split+import Agda.TypeChecking.Rules.LHS.Instantiate (instantiateTel)+import Agda.TypeChecking.Rules.LHS (instantiatePattern)  import Agda.TypeChecking.Coverage.Match import Agda.TypeChecking.Coverage.SplitTree
src/full/Agda/TypeChecking/Injectivity.hs view
@@ -211,7 +211,7 @@           -- The clause might not give as many patterns as there           -- are arguments (point-free style definitions).           let args' = take (length margs) args-          compareElims pol ftype org margs args'+          compareElims pol ftype (Def f []) margs args' {- Andreas, 2011-05-09 allow unsolved constraints as long as progress           unless (null cs) $ do             reportSDoc "tc.inj.invert" 30 $
src/full/Agda/TypeChecking/Polarity.hs view
@@ -205,7 +205,7 @@  -- | Record information that an argument is unused in 'Relevance'. mkUnused :: Relevance -> Relevance-mkUnused Relevant = UnusedArg   -- commenting out this line switches of 'UnusedArg' polarity machinery+mkUnused Relevant = UnusedArg   -- commenting out this line switches off 'UnusedArg' polarity machinery mkUnused r        = r  -- 'Irrelevant' is more informative than 'UnusedArg'.  -- | Improve 'Relevance' information in a type by polarity information.
src/full/Agda/TypeChecking/Quote.hs view
@@ -227,363 +227,3 @@ quoteType v = do   kit <- quotingKit   runReduceM (quoteTypeWithKit kit v)--agdaTermType :: TCM Type-agdaTermType = El (mkType 0) <$> primAgdaTerm--qNameType :: TCM Type-qNameType = El (mkType 0) <$> primQName--type UnquoteM = ExceptionT UnquoteError TCM--runUnquoteM :: UnquoteM a -> TCM (Either UnquoteError a)-runUnquoteM = runExceptionT--isCon :: ConHead -> TCM Term -> UnquoteM Bool-isCon con tm = do t <- lift tm-                  case ignoreSharing t of-                    Con con' _ -> return (con == con')-                    _ -> return False--{-unquoteFailedGeneric :: String -> UnquoteM a-unquoteFailedGeneric msg = typeError . GenericError $ "Unable to unquote the " ++ msg--unquoteFailed :: String -> String -> Term -> TCM a-unquoteFailed kind msg t = do doc <- prettyTCM t-                              unquoteFailedGeneric $ "term (" ++ show doc ++ ") of type " ++ kind ++ ".\nReason: " ++ msg ++ "."--}-class Unquote a where-  unquote :: Term -> UnquoteM a--unquoteH :: Unquote a => I.Arg Term -> UnquoteM a-unquoteH a | isHidden a && isRelevant a =-    unquote $ unArg a-unquoteH a = throwException $ BadVisibility "hidden"  a--unquoteN :: Unquote a => I.Arg Term -> UnquoteM a-unquoteN a | notHidden a && isRelevant a =-    unquote $ unArg a-unquoteN a = throwException $ BadVisibility "visible" a--choice :: Monad m => [(m Bool, m a)] -> m a -> m a-choice [] dflt = dflt-choice ((mb, mx) : mxs) dflt = ifM mb mx $ choice mxs dflt--ensureDef :: QName -> UnquoteM QName-ensureDef x = do-  i <- (theDef <$> getConstInfo x) `catchError` \_ -> return Axiom  -- for recursive unquoteDecl-  case i of-    Constructor{} -> do-      def <- lift $ prettyTCM =<< primAgdaTermDef-      con <- lift $ prettyTCM =<< primAgdaTermCon-      throwException $ ConInsteadOfDef x (show def) (show con)-    _ -> return x--ensureCon :: QName -> UnquoteM QName-ensureCon x = do-  i <- (theDef <$> getConstInfo x) `catchError` \_ -> return Axiom  -- for recursive unquoteDecl-  case i of-    Constructor{} -> return x-    _ -> do-      def <- lift $ prettyTCM =<< primAgdaTermDef-      con <- lift $ prettyTCM =<< primAgdaTermCon-      throwException $ DefInsteadOfCon x (show def) (show con)--pickName :: Type -> String-pickName a =-  case unEl a of-    Pi{}   -> "f"-    Sort{} -> "A"-    Def d _ | c:_ <- show (qnameName d),-              isAlpha c -> [toLower c]-    _    -> "_"--instance Unquote I.ArgInfo where-  unquote t = do-    t <- lift $ reduce t-    case ignoreSharing t of-      Con c [h,r] -> do-        choice-          [(c `isCon` primArgArgInfo, ArgInfo <$> unquoteN h <*> unquoteN r <*> return [])]-          __IMPOSSIBLE__-      Con c _ -> __IMPOSSIBLE__-      _ -> throwException $ NotAConstructor "ArgInfo" t--instance Unquote a => Unquote (I.Arg a) where-  unquote t = do-    t <- lift $ reduce t-    case ignoreSharing t of-      Con c [info,x] -> do-        choice-          [(c `isCon` primArgArg, Arg <$> unquoteN info <*> unquoteN x)]-          __IMPOSSIBLE__-      Con c _ -> __IMPOSSIBLE__-      _ -> throwException $ NotAConstructor "Arg" t---- Andreas, 2013-10-20: currently, post-fix projections are not part of the--- quoted syntax.-instance Unquote a => Unquote (Elim' a) where-  unquote t = Apply <$> unquote t--instance Unquote Integer where-  unquote t = do-    t <- lift $ reduce t-    case ignoreSharing t of-      Lit (LitInt _ n) -> return n-      _ -> throwException $ NotALiteral "Integer" t--instance Unquote Double where-  unquote t = do-    t <- lift $ reduce t-    case ignoreSharing t of-      Lit (LitFloat _ x) -> return x-      _ -> throwException $ NotALiteral "Float" t--instance Unquote Char where-  unquote t = do-    t <- lift $ reduce t-    case ignoreSharing t of-      Lit (LitChar _ x) -> return x-      _ -> throwException $ NotALiteral "Char" t--instance Unquote Str where-  unquote t = do-    t <- lift $ reduce t-    case ignoreSharing t of-      Lit (LitString _ x) -> return (Str x)-      _ -> throwException $ NotALiteral "String" t--instance Unquote a => Unquote [a] where-  unquote t = do-    t <- lift $ reduce t-    case ignoreSharing t of-      Con c [x,xs] -> do-        choice-          [(c `isCon` primCons, (:) <$> unquoteN x <*> unquoteN xs)]-          __IMPOSSIBLE__-      Con c [] -> do-        choice-          [(c `isCon` primNil, return [])]-          __IMPOSSIBLE__-      Con c _ -> __IMPOSSIBLE__-      _ -> throwException $ NotAConstructor "List" t--instance Unquote Hiding where-  unquote t = do-    t <- lift $ reduce t-    case ignoreSharing t of-      Con c [] -> do-        choice-          [(c `isCon` primHidden,  return Hidden)-          ,(c `isCon` primInstance, return Instance)-          ,(c `isCon` primVisible, return NotHidden)]-          __IMPOSSIBLE__-      Con c vs -> __IMPOSSIBLE__-      _        -> throwException $ NotAConstructor "Hiding" t--instance Unquote Relevance where-  unquote t = do-    t <- lift $ reduce t-    case ignoreSharing t of-      Con c [] -> do-        choice-          [(c `isCon` primRelevant,   return Relevant)-          ,(c `isCon` primIrrelevant, return Irrelevant)]-          __IMPOSSIBLE__-      Con c vs -> __IMPOSSIBLE__-      _        -> throwException $ NotAConstructor "Relevance" t--instance Unquote QName where-  unquote t = do-    t <- lift $ reduce t-    case ignoreSharing t of-      Lit (LitQName _ x) -> return x-      _                  -> throwException $ NotALiteral "QName" t--instance Unquote ConHead where-  unquote t = lift . getConHead =<< ensureCon =<< unquote t--instance Unquote a => Unquote (Abs a) where-  unquote t = Abs "_" <$> unquote t--instance Unquote Sort where-  unquote t = do-    t <- lift $ reduce t-    case ignoreSharing t of-      Con c [] -> do-        choice-          [(c `isCon` primAgdaSortUnsupported, pure $ Type $ Max [Plus 0 $ UnreducedLevel $ hackReifyToMeta])]-          __IMPOSSIBLE__-      Con c [u] -> do-        choice-          [(c `isCon` primAgdaSortSet, Type <$> unquoteN u)-          ,(c `isCon` primAgdaSortLit, Type . levelMax . (:[]) . ClosedLevel <$> unquoteN u)]-          __IMPOSSIBLE__-      Con c _ -> __IMPOSSIBLE__-      _ -> throwException $ NotAConstructor "Sort" t--instance Unquote Level where-  unquote l = Max . (:[]) . Plus 0 . UnreducedLevel <$> unquote l--instance Unquote Type where-  unquote t = do-    t <- lift $ reduce t-    case ignoreSharing t of-      Con c [s, u] -> do-        choice-          [(c `isCon` primAgdaTypeEl, El <$> unquoteN s <*> unquoteN u)]-          __IMPOSSIBLE__-      Con c _ -> __IMPOSSIBLE__-      _ -> throwException $ NotAConstructor "Type" t--instance Unquote Literal where-  unquote t = do-    t <- lift $ reduce t-    case ignoreSharing t of-      Con c [x] ->-        choice-          [ (c `isCon` primAgdaLitNat,    LitInt    noRange <$> unquoteN x)-          , (c `isCon` primAgdaLitFloat,  LitFloat  noRange <$> unquoteN x)-          , (c `isCon` primAgdaLitChar,   LitChar   noRange <$> unquoteN x)-          , (c `isCon` primAgdaLitString, LitString noRange . unStr <$> unquoteN x)-          , (c `isCon` primAgdaLitQName,  LitQName  noRange <$> unquoteN x) ]-          __IMPOSSIBLE__-      Con c _ -> __IMPOSSIBLE__-      _ -> throwException $ NotAConstructor "Literal" t--instance Unquote Term where-  unquote t = do-    t <- lift $ reduce t-    case ignoreSharing t of-      Con c [] ->-        choice-          [(c `isCon` primAgdaTermUnsupported, pure hackReifyToMeta)]-          __IMPOSSIBLE__--      Con c [x] -> do-        choice-          [ (c `isCon` primAgdaTermSort,   Sort <$> unquoteN x)-          , (c `isCon` primAgdaTermLit,    Lit <$> unquoteN x) ]-          __IMPOSSIBLE__--      Con c [x, y] ->-        choice-          [ (c `isCon` primAgdaTermVar, Var <$> (fromInteger <$> unquoteN x) <*> unquoteN y)-          , (c `isCon` primAgdaTermCon, Con <$> unquoteN x <*> unquoteN y)-          , (c `isCon` primAgdaTermDef, Def <$> (ensureDef =<< unquoteN x) <*> unquoteN y)-          , (c `isCon` primAgdaTermLam, Lam <$> (flip setHiding defaultArgInfo <$> unquoteN x) <*> unquoteN y)-          , (c `isCon` primAgdaTermPi,  mkPi <$> (domFromArg <$> unquoteN x) <*> unquoteN y)-          , (c `isCon` primAgdaTermExtLam, mkExtLam <$> unquoteN x <*> unquoteN y) ]-          __IMPOSSIBLE__-        where-          mkExtLam = ExtLam-          mkPi a (Abs _ b) = Pi a (Abs x b)-            where x | 0 `freeIn` b = pickName (unDom a)-                    | otherwise    = "_"-          mkPi _ NoAbs{} = __IMPOSSIBLE__--      Con{} -> __IMPOSSIBLE__-      Lit{} -> __IMPOSSIBLE__-      _ -> throwException $ NotAConstructor "Term" t--instance Unquote Pattern where-  unquote t = do-    t <- lift $ reduce t-    case ignoreSharing t of-      Con c [] -> do-        choice-          [ (c `isCon` primAgdaPatVar,    pure (VarP "x"))-          , (c `isCon` primAgdaPatAbsurd, pure (VarP "()"))-          , (c `isCon` primAgdaPatDot,    pure (DotP hackReifyToMeta))-          ] __IMPOSSIBLE__-      Con c [x] -> do-        choice-          [ (c `isCon` primAgdaPatProj, ProjP <$> unquoteN x)-          , (c `isCon` primAgdaPatLit,  LitP  <$> unquoteN x) ]-          __IMPOSSIBLE__-      Con c [x, y] -> do-        choice-          [ (c `isCon` primAgdaPatCon, flip ConP Nothing <$> unquoteN x <*> (map (fmap unnamed) <$> unquoteN y)) ]-          __IMPOSSIBLE__-      Con c _ -> __IMPOSSIBLE__-      _ -> throwException $ NotAConstructor "Pattern" t--data UnquotedFunDef = UnQFun Type [Clause]--instance Unquote Clause where-  unquote t = do-    t <- lift $ reduce t-    case ignoreSharing t of-      Con c [x] -> do-        choice-          [ (c `isCon` primAgdaClauseAbsurd, mkClause Nothing <$> unquoteN x) ]-          __IMPOSSIBLE__-      Con c [x, y] -> do-        choice-          [ (c `isCon` primAgdaClauseClause, checkClause =<< mkClause . Just <$> unquoteN y <*> unquoteN x) ]-          __IMPOSSIBLE__-      Con c _ -> __IMPOSSIBLE__-      _ -> throwException $ NotAConstructor "Clause" t-    where-      mkClause :: Maybe Term -> [I.Arg Pattern] -> I.Clause-      mkClause b ps0 =-        Clause { clauseRange     = noRange-               , clauseTel       = dummyTel n'-               , clausePerm      = Perm n vs-               , namedClausePats = ps-               , clauseBody      = mkBody n b-               , clauseType      = Nothing }-        where-          ps = map (fmap unnamed) ps0-          n  = vars True ps  -- with dot patterns-          n' = vars False ps -- without dot patterns-          dummyTel 0 = EmptyTel-          dummyTel n = ExtendTel (defaultDom typeDontCare) (Abs "x" $ dummyTel (n - 1))-          mkBody 0 b = maybe NoBody Body b-          mkBody n b = Bind $ Abs "x" $ mkBody (n - 1) b-          vars d ps = sum $ map (vars' d . namedArg) ps-          vars' d (ConP _ _ ps) = vars d ps-          vars' d VarP{}      = 1-          vars' d DotP{}      = if d then 1 else 0-          vars' d LitP{}      = 0-          vars' d ProjP{}     = 0--          vs = evalState (execWriterT $ mapM_ (computePerm . namedArg) ps) 0-          next = do n <- get; put (n + 1); return n--          computePerm (ConP _ _ ps) = mapM_ (computePerm . namedArg) ps-          computePerm VarP{}        = tell . (:[]) =<< next-          computePerm DotP{}        = () <$ next-          computePerm LitP{}        = return ()-          computePerm ProjP{}       = return ()--      checkClause :: I.Clause -> UnquoteM I.Clause-      checkClause cl@Clause{ clausePerm = Perm n vs , clauseBody = body } = do-        let freevs    = allVars $ freeVars $ fromMaybe __IMPOSSIBLE__ $ getBody body-            propervs  = Set.fromList $ map ((n-1)-) vs-            dottedvs  = Set.difference (Set.fromList [0..n-1]) propervs-            offending = Set.intersection freevs dottedvs-        Agda.TypeChecking.Monad.reportSDoc "tc.unquote.clause.dotvars" 30 $ vcat-          [ text $ "checkClause "-          , nest 2 $ text $ "free vars:      " ++ show freevs-          , nest 2 $ text $ "dotted vars:    " ++ show dottedvs-          , nest 2 $ text $ "offending vars: " ++ show offending-          ]-        if Set.null offending-          then return cl-          else throwException $ RhsUsesDottedVar (Set.toList offending) t--instance Unquote UnquotedFunDef where-  unquote t = do-    t <- lift $ reduce t-    case ignoreSharing t of-      Con c [x, y] -> do-        choice-          [ (c `isCon` primAgdaFunDefCon, UnQFun <$> unquoteN x <*> unquoteN y) ]-          __IMPOSSIBLE__-      Con c _ -> __IMPOSSIBLE__-      _ -> throwException $ NotAConstructor "Pattern" t--reifyUnquoted :: Reify a e => a -> TCM e-reifyUnquoted = nowReifyingUnquoted . disableDisplayForms . withShowAllArguments . reify-
src/full/Agda/TypeChecking/Reduce.hs view
@@ -938,6 +938,17 @@           (BlockedLevel m <$> instantiateFull' v)     UnreducedLevel v -> UnreducedLevel <$> instantiateFull' v +instance InstantiateFull Substitution where+  instantiateFull' sigma =+    case sigma of+      IdS                  -> return IdS+      EmptyS               -> return EmptyS+      Wk   n sigma         -> Wk   n         <$> instantiateFull' sigma+      Lift n sigma         -> Lift n         <$> instantiateFull' sigma+      Strengthen bot sigma -> Strengthen bot <$> instantiateFull' sigma+      t :# sigma           -> (:#) <$> instantiateFull' t+                                   <*> instantiateFull' sigma+ instance InstantiateFull Bool where     instantiateFull' = return 
src/full/Agda/TypeChecking/Reduce/Monad.hs view
@@ -30,8 +30,7 @@ import Agda.Syntax.Internal import Agda.TypeChecking.Monad hiding   ( enterClosure, underAbstraction_, underAbstraction, addCtx, mkContextEntry,-    isInstantiatedMeta, verboseS, reportSDoc, reportSLn, typeOfConst, lookupMeta,-    instantiateDef )+    isInstantiatedMeta, verboseS, reportSDoc, reportSLn, typeOfConst, lookupMeta ) import Agda.TypeChecking.Monad.Builtin hiding ( constructorForm ) import Agda.TypeChecking.Substitute import Agda.Interaction.Options
src/full/Agda/TypeChecking/Rules/Decl.hs view
@@ -47,6 +47,7 @@ import Agda.TypeChecking.SizedTypes.Solve import Agda.TypeChecking.Substitute import Agda.TypeChecking.Telescope+import Agda.TypeChecking.Unquote  import Agda.TypeChecking.Rules.Term import Agda.TypeChecking.Rules.Data    ( checkDataDef )
src/full/Agda/TypeChecking/Rules/Def.hs view
@@ -574,6 +574,10 @@   reportSLn "tc.with.top" 20 "created with display form"    -- Generate the type of the with function+  delta1 <- normalise delta1 -- Issue 1332: checkInternal is picky about argInfo+                             -- but module application is sloppy.+                             -- We normalise to get rid of Def's coming+                             -- from module applications.   candidateType <- withFunctionType delta1 vs as delta2 b   reportSDoc "tc.with.type" 10 $ sep [ text "candidate type:", nest 2 $ prettyTCM candidateType ]   reportSDoc "tc.with.type" 50 $ sep [ text "candidate type:", nest 2 $ text $ show candidateType ]
src/full/Agda/TypeChecking/Rules/LHS.hs view
@@ -2,11 +2,13 @@  module Agda.TypeChecking.Rules.LHS where +import Prelude hiding (mapM)+ import Data.Maybe  import Control.Applicative-import Control.Monad-import Control.Monad.State+import Control.Monad hiding (mapM)+import Control.Monad.State hiding (mapM)  import Data.Traversable @@ -103,28 +105,60 @@          _           -> __IMPOSSIBLE__ -instantiatePattern :: Substitution -> Permutation -> [I.NamedArg Pattern] -> [I.NamedArg Pattern]++-- | In an internal pattern, replace some pattern variables+--   by dot patterns, according to the given substitution.+instantiatePattern+  :: Substitution+     -- ^ Partial substitution for the pattern variables,+     --   given in order of the clause telescope,+     --   (not in the order of occurrence in the patterns).+  -> Permutation+     -- ^ Map from the pattern variables to the telescope variables.+  -> [I.NamedArg Pattern]+     -- ^ Input patterns.+  -> [I.NamedArg Pattern]+     -- ^ Output patterns, with some @VarP@ replaced by @DotP@+     --   according to the @Substitution@. instantiatePattern sub perm ps-  | length sub /= length hps = error $ unlines [ "instantiatePattern:"-                                               , "  sub  = " ++ show sub-                                               , "  perm = " ++ show perm-                                               , "  ps   = " ++ show ps-                                               ]+  | length sub /= length hps = error $ unlines+      [ "instantiatePattern:"+      , "  sub  = " ++ show sub+      , "  perm = " ++ show perm+      , "  ps   = " ++ show ps+      ]   | otherwise  = foldr merge ps $ zipWith inst (reverse sub) hps   where+    -- For each pattern variable get a copy of the patterns+    -- focusing on this variable.+    -- Order them in the dependency (telescope) order.     hps = permute perm $ allHoles ps+    -- If we do not want to substitute a variable, we+    -- throw away the corresponding one-hole pattern.     inst Nothing  hps = Nothing+    -- If we want to substitute, we replace the variable+    -- by the dot pattern.     inst (Just t) hps = Just $ plugHole (DotP t) hps +    -- If we did not instantiate a variable, we can keep the original+    -- patterns in this iteration.     merge Nothing   ps = ps+    -- Otherwise, we merge the changes in @qs@ into @ps@.+    -- This means we walk simultaneously through @qs@ and @ps@+    -- and expect them to be the same everywhere except that+    -- a @q@ can be a @DotP@ and the corresponding @p@ a @VarP@.+    -- In this case, we take the @DotP@.+    -- Apparently, the other way round can also happen (why?).     merge (Just qs) ps = zipWith mergeA qs ps       where         mergeA a1 a2 = fmap (mergeP (namedArg a1) (namedArg a2) <$) a1         mergeP (DotP s)  (DotP t)           | s == t                    = DotP s           | otherwise                 = __IMPOSSIBLE__+        -- interesting cases:         mergeP (DotP t)  (VarP _)     = DotP t         mergeP (VarP _)  (DotP t)     = DotP t+        -- the rest is homomorphical         mergeP (DotP _)  _            = __IMPOSSIBLE__         mergeP _         (DotP _)     = __IMPOSSIBLE__         mergeP (ConP c1 mt1 ps) (ConP c2 mt2 qs)@@ -148,6 +182,41 @@         mergeP ProjP{} _              = __IMPOSSIBLE__         mergeP _       ProjP{}        = __IMPOSSIBLE__ ++-- | In an internal pattern, replace some pattern variables+--   by dot patterns, according to the given substitution.+instantiatePattern'+  :: Substitution+     -- ^ Partial substitution for the pattern variables,+     --   given in order of the clause telescope,+     --   (not in the order of occurrence in the patterns).+  -> Permutation+     -- ^ Map from the pattern variables to the telescope variables.+  -> [I.NamedArg Pattern]+     -- ^ Input patterns.+  -> [I.NamedArg Pattern]+     -- ^ Output patterns, with some @VarP@ replaced by @DotP@+     --   according to the @Substitution@.+instantiatePattern' sub perm ps = evalState (mapM goArg ps) 0+  where+    -- get a partial substitution from pattern variables to terms+    sub'    = inversePermute perm sub+    -- get next pattern variable+    next    = do n <- get; put (n+1); return n+    goArg   = traverse goNamed+    goNamed = traverse goPat+    goPat p = case p of+      VarP x       -> replace p+      DotP t       -> replace p+      ConP c mt ps -> ConP c mt <$> mapM goArg ps+      LitP{}       -> return p+      ProjP{}      -> return p+    replace p = do+      i <- next+      return $ fromMaybe p $ DotP <$> sub' !! i+++ -- | Check if a problem is solved. That is, if the patterns are all variables. isSolvedProblem :: Problem -> Bool isSolvedProblem problem = null (restPats $ problemRest problem) &&@@ -159,13 +228,6 @@     isSolved (A.ImplicitP _) = True     isSolved (A.AbsurdP _)   = True     isSolved _               = False-{--    isVar (A.VarP _)      = True-    isVar (A.WildP _)     = True-    isVar (A.ImplicitP _) = True-    isVar (A.AbsurdP _)   = True-    isVar _               = False--}  -- | For each user-defined pattern variable in the 'Problem', check -- that the corresponding data type (if any) does not contain a@@ -314,6 +376,16 @@   , lhsPermutation :: Permutation       -- ^ The permutation from pattern vars to @Δ@.   } +instance InstantiateFull LHSResult where+  instantiateFull' (LHSResult mtel tel sub xs ps t perm) = LHSResult+    <$> instantiateFull' mtel+    <*> instantiateFull' tel+    <*> instantiateFull' sub+    <*> return xs+    <*> instantiateFull' ps+    <*> instantiateFull' t+    <*> return perm+ -- | Check a LHS. Main function. -- --   @checkLeftHandSide a ps a ret@ checks that user patterns @ps@ eliminate@@ -370,10 +442,9 @@     mapM_ checkDotPattern dpi      let rho = renamingR perm -- I'm not certain about this...-        Perm n _ = perm-        xs  = [ stringToArgName $ "h" ++ show n | n <- [0..n - 1] ]-    applyRelevanceToContext (getRelevance b') $ do-      ret $ LHSResult mgamma delta rho xs qs b' perm+        xs  = [ stringToArgName $ "h" ++ show n | n <- [0..permRange perm - 1] ]+    lhsResult <- return $ LHSResult mgamma delta rho xs qs b' perm+    applyRelevanceToContext (getRelevance b') $ ret lhsResult  -- | The loop (tail-recursive): split at a variable in the problem until problem is solved checkLHS@@ -513,7 +584,9 @@       --   ]        -- Andreas 2010-09-07  propagate relevance info to new vars-      gamma' <- return $ fmap (applyRelevance $ argInfoRelevance info) gamma'+      -- Andreas 2014-11-25  clear 'Forced' and 'Unused'+      let updRel = ignoreForced . composeRelevance (getRelevance info)+      gamma' <- return $ mapRelevance updRel <$> gamma'        -- Insert implicit patterns       qs' <- insertImplicitPatterns ExpandLast qs gamma'
src/full/Agda/TypeChecking/Rules/LHS/Unify.hs view
@@ -12,15 +12,19 @@  module Agda.TypeChecking.Rules.LHS.Unify where +import Prelude hiding (null)+ import Control.Arrow ((***)) import Control.Applicative hiding (empty) import Control.Monad.State import Control.Monad.Reader import Control.Monad.Writer (WriterT(..), MonadWriter(..), Monoid(..)) +import Data.IntMap (IntMap)+import qualified Data.IntMap as IntMap import Data.Map (Map) import qualified Data.Map as Map-import Data.List hiding (sort)+import Data.List hiding (null, sort)  import Data.Typeable (Typeable) import Data.Foldable (Foldable)@@ -41,7 +45,8 @@ import Agda.TypeChecking.DropArgs import Agda.TypeChecking.Level (reallyUnLevelView) import Agda.TypeChecking.Reduce-import Agda.TypeChecking.Pretty+import Agda.TypeChecking.Pretty hiding (empty)+import qualified Agda.TypeChecking.Pretty as P import Agda.TypeChecking.Substitute hiding (Substitution) import qualified Agda.TypeChecking.Substitute as S import Agda.TypeChecking.Telescope@@ -60,8 +65,9 @@   )  import Agda.Utils.Maybe-import Agda.Utils.Size import Agda.Utils.Monad+import Agda.Utils.Null+import Agda.Utils.Size  #include "undefined.h" import Agda.Utils.Impossible@@ -83,6 +89,9 @@ instance HasConstInfo Unify where   getConstInfo = U . lift . lift . lift . lift . getConstInfo +-- UnifyEnv+------------------------------------------------------------------------+ data UnifyMayPostpone = MayPostpone | MayNotPostpone  type UnifyEnv = UnifyMayPostpone@@ -91,17 +100,14 @@ emptyUEnv = MayPostpone  noPostponing :: Unify a -> Unify a-noPostponing (U (ReaderT f)) = U . ReaderT . const $ f MayNotPostpone+noPostponing = U . local (const MayNotPostpone) . unUnify  askPostpone :: Unify UnifyMayPostpone-askPostpone = U . ReaderT $ return+askPostpone = U $ ask  -- | Output the result of unification (success or maybe). type UnifyOutput = Unifiable -emptyUOutput :: UnifyOutput-emptyUOutput = mempty- -- | Were two terms unifiable or did we have to postpone some equation such that we are not sure? data Unifiable   = Definitely  -- ^ Unification succeeded.@@ -127,7 +133,7 @@     Possibly ->   e  data Equality = Equal TypeHH Term Term-type Sub = Map Nat Term+type Sub = IntMap Term  data UnifyException   = ConstructorMismatch Type Term Term@@ -140,12 +146,13 @@   noMsg  = strMsg ""   strMsg = GenericUnifyException -data UnifyState = USt { uniSub    :: Sub-                      , uniConstr :: [Equality]-                      }+data UnifyState = USt+  { uniSub    :: Sub+  , uniConstr :: [Equality]+  }  emptyUState :: UnifyState-emptyUState = USt Map.empty []+emptyUState = USt IntMap.empty []  -- | Throw-away error message. projectionMismatch :: QName -> QName -> Unify a@@ -163,8 +170,8 @@   applySubst rho (Equal a s t) =     Equal (applySubst rho a) (applySubst rho s) (applySubst rho t) -onSub :: (Sub -> a) -> Unify a-onSub f = U $ gets $ f . uniSub+getSub :: Unify Sub+getSub = U $ gets uniSub  modSub :: (Sub -> Sub) -> Unify () modSub f = U $ modify $ \s -> s { uniSub = f $ uniSub s }@@ -253,19 +260,19 @@ i |-> (u, a) = do   occursCheck i u a   liftTCM $ reportSDoc "tc.lhs.unify.assign" 15 $ prettyTCM (var i) <+> text ":=" <+> prettyTCM u-  modSub $ Map.insert i (killRange u)+  modSub $ IntMap.insert i (killRange u)   -- Apply substitution to itself (issue 552)-  rho  <- onSub id+  rho  <- getSub   rho' <- traverse ureduce rho   modSub $ const rho'  makeSubstitution :: Sub -> S.Substitution makeSubstitution sub-  | Map.null sub = idS-  | otherwise    = map val [0 .. highestIndex] ++# raiseS (highestIndex + 1)+  | null sub  = idS+  | otherwise = map val [0 .. highestIndex] ++# raiseS (highestIndex + 1)   where-    highestIndex = fst $ Map.findMax sub-    val i = maybe (var i) id $ Map.lookup i sub+    highestIndex = fst $ IntMap.findMax sub+    val i = fromMaybe (var i) $ IntMap.lookup i sub  -- | Apply the current substitution on a term and reduce to weak head normal form. class UReduce t where@@ -273,7 +280,7 @@  instance UReduce Term where   ureduce u = doEtaContractImplicit $ do-    rho <- onSub makeSubstitution+    rho <- makeSubstitution <$> getSub -- Andreas, 2013-10-24 the following call to 'normalise' is problematic -- (see issue 924).  Instead, we only normalize if unifyAtomHH is undecided. --    liftTCM $ etaContract =<< normalise (applySubst rho u)@@ -338,11 +345,15 @@       where         Just u = s !! i +    -- @inst i u v@ replaces index @i@ in @v@ by @u@, without removing the index.     inst :: Nat -> Term -> Term -> Term     inst i u v = applySubst us v       where us = [var j | j <- [0..i - 1] ] ++# u :# raiseS (i + 1) -data UnificationResult = Unifies Substitution | NoUnify Type Term Term | DontKnow TCErr+data UnificationResult+  = Unifies Substitution+  | NoUnify Type Term Term+  | DontKnow TCErr  -- | Are we in a homogeneous (one type) or heterogeneous (two types) situation? data HomHet a@@ -491,7 +502,7 @@       Right _                               -> do         checkEqualities $ applySubst (makeSubstitution s) eqs         let n = maximum $ (-1) : flex'-        return $ Unifies $ flattenSubstitution [ Map.lookup i s | i <- [0..n] ]+        return $ Unifies $ flattenSubstitution [ IntMap.lookup i s | i <- [0..n] ]   `catchError` \err -> case err of      TypeError _ (Closure {clValue = WithoutKError{}}) -> throwError err      _                                                 -> return $ DontKnow err@@ -744,9 +755,9 @@        liftTCM $ reportSDoc "tc.lhs.unify" 15 $         sep [ text "unifyAtom"-            , nest 2 $ prettyTCM u <> if flexibleTerm u then text " (flexible)" else empty+            , nest 2 $ prettyTCM u <> if flexibleTerm u then text " (flexible)" else P.empty             , nest 2 $ text "=?="-            , nest 2 $ prettyTCM v <> if flexibleTerm v then text " (flexible)" else empty+            , nest 2 $ prettyTCM v <> if flexibleTerm v then text " (flexible)" else P.empty             , nest 2 $ text ":" <+> prettyTCM aHH             ]       liftTCM $ reportSDoc "tc.lhs.unify" 60 $
src/full/Agda/TypeChecking/Rules/Record.hs view
@@ -80,6 +80,8 @@       reportSDoc "tc.rec" 15 $ text "checking fields"       -- WRONG: contype <- workOnTypes $ killRange <$> (instantiateFull =<< isType_ contel)       contype <- killRange <$> (instantiateFull =<< isType_ contel)+      reportSDoc "tc.rec" 20 $ vcat+        [ text "contype = " <+> prettyTCM contype ]        -- compute the field telescope (does not include record parameters)       let TelV ftel _ = telView' contype@@ -97,6 +99,9 @@         Sort s  -> return s         _       -> typeError $ ShouldBeASort t0       gamma <- getContextTelescope  -- the record params (incl. module params)+      reportSDoc "tc.rec" 20 $ vcat+        [ text "gamma = " <+> inTopContext (prettyTCM gamma) ]+       -- record type (name applied to parameters)       let rect = El s $ Def name $ map Apply $ teleArgs gamma 
src/full/Agda/TypeChecking/Rules/Term.hs view
@@ -56,6 +56,7 @@ import Agda.TypeChecking.Substitute import Agda.TypeChecking.Telescope import Agda.TypeChecking.Rules.LHS (checkLeftHandSide, LHSResult(..))+import Agda.TypeChecking.Unquote  import {-# SOURCE #-} Agda.TypeChecking.Empty (isEmptyType) import {-# SOURCE #-} Agda.TypeChecking.Rules.Decl (checkSectionApplication)
src/full/Agda/TypeChecking/Telescope.hs view
@@ -20,7 +20,7 @@ import Agda.Utils.Size import Agda.Utils.Tuple import Agda.Utils.VarSet (VarSet)-import qualified Agda.Utils.VarSet as Set+import qualified Agda.Utils.VarSet as VarSet  #include "undefined.h" import Agda.Utils.Impossible@@ -113,24 +113,33 @@  -- | A telescope split in two. data SplitTel = SplitTel-      { firstPart  :: Telescope-      , secondPart :: Telescope-      , splitPerm  :: Permutation-      }+  { firstPart  :: Telescope+  , secondPart :: Telescope+  , splitPerm  :: Permutation+    -- ^ The permutation takes us from the original telescope to+    --   @firstPart ++ secondPart@.+  }  -- | Split a telescope into the part that defines the given variables and the --   part that doesn't.-splitTelescope :: VarSet -> Telescope -> SplitTel+--+--   See 'Agda.TypeChecking.Tests.prop_splitTelescope'.+splitTelescope+  :: VarSet     -- ^ A set of de Bruijn indices.+  -> Telescope  -- ^ Original telescope.+  -> SplitTel   -- ^ @firstPart@ mentions the given variables, @secondPart@ not. splitTelescope fv tel = SplitTel tel1 tel2 perm   where     names = teleNames tel     ts0   = flattenTel tel-     n     = size tel      -- We start with a rough split into fv and the rest. This will most likely     -- not be correct so we patch it up later with reorderTel.-    is    = map (n - 1 -) $ filter (< n) $ reverse $ Set.toList fv++    -- Convert given de Bruijn indices into ascending list of de Bruijn levels.+    is    = map (n - 1 -) $ dropWhile (>= n) $ VarSet.toDescList fv+    -- Compute the complement (de Bruijn levels not mentioned in @fv@).     isC   = [0..n - 1] \\ is     perm0 = Perm n $ is ++ isC @@ -146,9 +155,8 @@      tel'  = unflattenTel (permute perm names) ts2 -    Perm _ js = perm-    m         = genericLength $ takeWhile (`notElem` is) (reverse js)-    (tel1, tel2) = telFromList -*- telFromList $ genericSplitAt (n - m) $ telToList tel'+    m            = length $ takeWhile (`notElem` is) $ reverse $ permPicks perm+    (tel1, tel2) = telFromList -*- telFromList $ splitAt (n - m) $ telToList tel'  telView :: Type -> TCM TelView telView = telViewUpTo (-1)
+ src/full/Agda/TypeChecking/Unquote.hs view
@@ -0,0 +1,403 @@+{-# LANGUAGE CPP                  #-}+{-# LANGUAGE FlexibleInstances    #-}+{-# LANGUAGE PatternGuards        #-}+{-# LANGUAGE TypeSynonymInstances #-}++module Agda.TypeChecking.Unquote where++import Control.Applicative+import Control.Monad.State (evalState, get, put)+import Control.Monad.Writer (execWriterT, tell)+import Control.Monad.Trans (lift)++import Data.Char+import Data.Maybe (fromMaybe)+import Data.Traversable (traverse)++import Agda.Syntax.Common+import Agda.Syntax.Internal as I+import Agda.Syntax.Literal+import Agda.Syntax.Position+import Agda.Syntax.Translation.InternalToAbstract++import Agda.TypeChecking.CompiledClause+import Agda.TypeChecking.Datatypes ( getConHead )+import Agda.TypeChecking.DropArgs+import Agda.TypeChecking.Free+import Agda.TypeChecking.Level+import Agda.TypeChecking.Monad+import Agda.TypeChecking.Monad.Builtin+import Agda.TypeChecking.Monad.Exception+import Agda.TypeChecking.Pretty+import Agda.TypeChecking.Reduce+import Agda.TypeChecking.Reduce.Monad+import Agda.TypeChecking.Substitute++import Agda.Utils.Except+import Agda.Utils.Impossible+import Agda.Utils.Monad ( ifM )+import Agda.Utils.Permutation ( Permutation(Perm) )+import Agda.Utils.String ( Str(Str), unStr )+import Agda.Utils.VarSet (VarSet)+import qualified Agda.Utils.VarSet as Set++#include "undefined.h"++agdaTermType :: TCM Type+agdaTermType = El (mkType 0) <$> primAgdaTerm++qNameType :: TCM Type+qNameType = El (mkType 0) <$> primQName++type UnquoteM = ExceptionT UnquoteError TCM++runUnquoteM :: UnquoteM a -> TCM (Either UnquoteError a)+runUnquoteM = runExceptionT++isCon :: ConHead -> TCM Term -> UnquoteM Bool+isCon con tm = do t <- lift tm+                  case ignoreSharing t of+                    Con con' _ -> return (con == con')+                    _ -> return False++{-unquoteFailedGeneric :: String -> UnquoteM a+unquoteFailedGeneric msg = typeError . GenericError $ "Unable to unquote the " ++ msg++unquoteFailed :: String -> String -> Term -> TCM a+unquoteFailed kind msg t = do doc <- prettyTCM t+                              unquoteFailedGeneric $ "term (" ++ show doc ++ ") of type " ++ kind ++ ".\nReason: " ++ msg ++ "."+-}+class Unquote a where+  unquote :: Term -> UnquoteM a++unquoteH :: Unquote a => I.Arg Term -> UnquoteM a+unquoteH a | isHidden a && isRelevant a =+    unquote $ unArg a+unquoteH a = throwException $ BadVisibility "hidden"  a++unquoteN :: Unquote a => I.Arg Term -> UnquoteM a+unquoteN a | notHidden a && isRelevant a =+    unquote $ unArg a+unquoteN a = throwException $ BadVisibility "visible" a++choice :: Monad m => [(m Bool, m a)] -> m a -> m a+choice [] dflt = dflt+choice ((mb, mx) : mxs) dflt = ifM mb mx $ choice mxs dflt++ensureDef :: QName -> UnquoteM QName+ensureDef x = do+  i <- (theDef <$> getConstInfo x) `catchError` \_ -> return Axiom  -- for recursive unquoteDecl+  case i of+    Constructor{} -> do+      def <- lift $ prettyTCM =<< primAgdaTermDef+      con <- lift $ prettyTCM =<< primAgdaTermCon+      throwException $ ConInsteadOfDef x (show def) (show con)+    _ -> return x++ensureCon :: QName -> UnquoteM QName+ensureCon x = do+  i <- (theDef <$> getConstInfo x) `catchError` \_ -> return Axiom  -- for recursive unquoteDecl+  case i of+    Constructor{} -> return x+    _ -> do+      def <- lift $ prettyTCM =<< primAgdaTermDef+      con <- lift $ prettyTCM =<< primAgdaTermCon+      throwException $ DefInsteadOfCon x (show def) (show con)++pickName :: Type -> String+pickName a =+  case unEl a of+    Pi{}   -> "f"+    Sort{} -> "A"+    Def d _ | c:_ <- show (qnameName d),+              isAlpha c -> [toLower c]+    _    -> "_"++instance Unquote I.ArgInfo where+  unquote t = do+    t <- lift $ reduce t+    case ignoreSharing t of+      Con c [h,r] -> do+        choice+          [(c `isCon` primArgArgInfo, ArgInfo <$> unquoteN h <*> unquoteN r <*> return [])]+          __IMPOSSIBLE__+      Con c _ -> __IMPOSSIBLE__+      _ -> throwException $ NotAConstructor "ArgInfo" t++instance Unquote a => Unquote (I.Arg a) where+  unquote t = do+    t <- lift $ reduce t+    case ignoreSharing t of+      Con c [info,x] -> do+        choice+          [(c `isCon` primArgArg, Arg <$> unquoteN info <*> unquoteN x)]+          __IMPOSSIBLE__+      Con c _ -> __IMPOSSIBLE__+      _ -> throwException $ NotAConstructor "Arg" t++-- Andreas, 2013-10-20: currently, post-fix projections are not part of the+-- quoted syntax.+instance Unquote a => Unquote (Elim' a) where+  unquote t = Apply <$> unquote t++instance Unquote Integer where+  unquote t = do+    t <- lift $ reduce t+    case ignoreSharing t of+      Lit (LitInt _ n) -> return n+      _ -> throwException $ NotALiteral "Integer" t++instance Unquote Double where+  unquote t = do+    t <- lift $ reduce t+    case ignoreSharing t of+      Lit (LitFloat _ x) -> return x+      _ -> throwException $ NotALiteral "Float" t++instance Unquote Char where+  unquote t = do+    t <- lift $ reduce t+    case ignoreSharing t of+      Lit (LitChar _ x) -> return x+      _ -> throwException $ NotALiteral "Char" t++instance Unquote Str where+  unquote t = do+    t <- lift $ reduce t+    case ignoreSharing t of+      Lit (LitString _ x) -> return (Str x)+      _ -> throwException $ NotALiteral "String" t++instance Unquote a => Unquote [a] where+  unquote t = do+    t <- lift $ reduce t+    case ignoreSharing t of+      Con c [x,xs] -> do+        choice+          [(c `isCon` primCons, (:) <$> unquoteN x <*> unquoteN xs)]+          __IMPOSSIBLE__+      Con c [] -> do+        choice+          [(c `isCon` primNil, return [])]+          __IMPOSSIBLE__+      Con c _ -> __IMPOSSIBLE__+      _ -> throwException $ NotAConstructor "List" t++instance Unquote Hiding where+  unquote t = do+    t <- lift $ reduce t+    case ignoreSharing t of+      Con c [] -> do+        choice+          [(c `isCon` primHidden,  return Hidden)+          ,(c `isCon` primInstance, return Instance)+          ,(c `isCon` primVisible, return NotHidden)]+          __IMPOSSIBLE__+      Con c vs -> __IMPOSSIBLE__+      _        -> throwException $ NotAConstructor "Hiding" t++instance Unquote Relevance where+  unquote t = do+    t <- lift $ reduce t+    case ignoreSharing t of+      Con c [] -> do+        choice+          [(c `isCon` primRelevant,   return Relevant)+          ,(c `isCon` primIrrelevant, return Irrelevant)]+          __IMPOSSIBLE__+      Con c vs -> __IMPOSSIBLE__+      _        -> throwException $ NotAConstructor "Relevance" t++instance Unquote QName where+  unquote t = do+    t <- lift $ reduce t+    case ignoreSharing t of+      Lit (LitQName _ x) -> return x+      _                  -> throwException $ NotALiteral "QName" t++instance Unquote ConHead where+  unquote t = lift . getConHead =<< ensureCon =<< unquote t++instance Unquote a => Unquote (Abs a) where+  unquote t = Abs "_" <$> unquote t++instance Unquote Sort where+  unquote t = do+    t <- lift $ reduce t+    case ignoreSharing t of+      Con c [] -> do+        choice+          [(c `isCon` primAgdaSortUnsupported, pure $ Type $ Max [Plus 0 $ UnreducedLevel $ hackReifyToMeta])]+          __IMPOSSIBLE__+      Con c [u] -> do+        choice+          [(c `isCon` primAgdaSortSet, Type <$> unquoteN u)+          ,(c `isCon` primAgdaSortLit, Type . levelMax . (:[]) . ClosedLevel <$> unquoteN u)]+          __IMPOSSIBLE__+      Con c _ -> __IMPOSSIBLE__+      _ -> throwException $ NotAConstructor "Sort" t++instance Unquote Level where+  unquote l = Max . (:[]) . Plus 0 . UnreducedLevel <$> unquote l++instance Unquote Type where+  unquote t = do+    t <- lift $ reduce t+    case ignoreSharing t of+      Con c [s, u] -> do+        choice+          [(c `isCon` primAgdaTypeEl, El <$> unquoteN s <*> unquoteN u)]+          __IMPOSSIBLE__+      Con c _ -> __IMPOSSIBLE__+      _ -> throwException $ NotAConstructor "Type" t++instance Unquote Literal where+  unquote t = do+    t <- lift $ reduce t+    case ignoreSharing t of+      Con c [x] ->+        choice+          [ (c `isCon` primAgdaLitNat,    LitInt    noRange <$> unquoteN x)+          , (c `isCon` primAgdaLitFloat,  LitFloat  noRange <$> unquoteN x)+          , (c `isCon` primAgdaLitChar,   LitChar   noRange <$> unquoteN x)+          , (c `isCon` primAgdaLitString, LitString noRange . unStr <$> unquoteN x)+          , (c `isCon` primAgdaLitQName,  LitQName  noRange <$> unquoteN x) ]+          __IMPOSSIBLE__+      Con c _ -> __IMPOSSIBLE__+      _ -> throwException $ NotAConstructor "Literal" t++instance Unquote Term where+  unquote t = do+    t <- lift $ reduce t+    case ignoreSharing t of+      Con c [] ->+        choice+          [(c `isCon` primAgdaTermUnsupported, pure hackReifyToMeta)]+          __IMPOSSIBLE__++      Con c [x] -> do+        choice+          [ (c `isCon` primAgdaTermSort,   Sort <$> unquoteN x)+          , (c `isCon` primAgdaTermLit,    Lit <$> unquoteN x) ]+          __IMPOSSIBLE__++      Con c [x, y] ->+        choice+          [ (c `isCon` primAgdaTermVar, Var <$> (fromInteger <$> unquoteN x) <*> unquoteN y)+          , (c `isCon` primAgdaTermCon, Con <$> unquoteN x <*> unquoteN y)+          , (c `isCon` primAgdaTermDef, Def <$> (ensureDef =<< unquoteN x) <*> unquoteN y)+          , (c `isCon` primAgdaTermLam, Lam <$> (flip setHiding defaultArgInfo <$> unquoteN x) <*> unquoteN y)+          , (c `isCon` primAgdaTermPi,  mkPi <$> (domFromArg <$> unquoteN x) <*> unquoteN y)+          , (c `isCon` primAgdaTermExtLam, mkExtLam <$> unquoteN x <*> unquoteN y) ]+          __IMPOSSIBLE__+        where+          mkExtLam = ExtLam+          mkPi a (Abs _ b) = Pi a (Abs x b)+            where x | 0 `freeIn` b = pickName (unDom a)+                    | otherwise    = "_"+          mkPi _ NoAbs{} = __IMPOSSIBLE__++      Con{} -> __IMPOSSIBLE__+      Lit{} -> __IMPOSSIBLE__+      _ -> throwException $ NotAConstructor "Term" t++instance Unquote Pattern where+  unquote t = do+    t <- lift $ reduce t+    case ignoreSharing t of+      Con c [] -> do+        choice+          [ (c `isCon` primAgdaPatVar,    pure (VarP "x"))+          , (c `isCon` primAgdaPatAbsurd, pure (VarP "()"))+          , (c `isCon` primAgdaPatDot,    pure (DotP hackReifyToMeta))+          ] __IMPOSSIBLE__+      Con c [x] -> do+        choice+          [ (c `isCon` primAgdaPatProj, ProjP <$> unquoteN x)+          , (c `isCon` primAgdaPatLit,  LitP  <$> unquoteN x) ]+          __IMPOSSIBLE__+      Con c [x, y] -> do+        choice+          [ (c `isCon` primAgdaPatCon, flip ConP Nothing <$> unquoteN x <*> (map (fmap unnamed) <$> unquoteN y)) ]+          __IMPOSSIBLE__+      Con c _ -> __IMPOSSIBLE__+      _ -> throwException $ NotAConstructor "Pattern" t++data UnquotedFunDef = UnQFun Type [Clause]++instance Unquote Clause where+  unquote t = do+    t <- lift $ reduce t+    case ignoreSharing t of+      Con c [x] -> do+        choice+          [ (c `isCon` primAgdaClauseAbsurd, mkClause Nothing <$> unquoteN x) ]+          __IMPOSSIBLE__+      Con c [x, y] -> do+        choice+          [ (c `isCon` primAgdaClauseClause, checkClause =<< mkClause . Just <$> unquoteN y <*> unquoteN x) ]+          __IMPOSSIBLE__+      Con c _ -> __IMPOSSIBLE__+      _ -> throwException $ NotAConstructor "Clause" t+    where+      mkClause :: Maybe Term -> [I.Arg Pattern] -> I.Clause+      mkClause b ps0 =+        Clause { clauseRange     = noRange+               , clauseTel       = dummyTel n'+               , clausePerm      = Perm n vs+               , namedClausePats = ps+               , clauseBody      = mkBody n b+               , clauseType      = Nothing }+        where+          ps = map (fmap unnamed) ps0+          n  = vars True ps  -- with dot patterns+          n' = vars False ps -- without dot patterns+          dummyTel 0 = EmptyTel+          dummyTel n = ExtendTel (defaultDom typeDontCare) (Abs "x" $ dummyTel (n - 1))+          mkBody 0 b = maybe NoBody Body b+          mkBody n b = Bind $ Abs "x" $ mkBody (n - 1) b+          vars d ps = sum $ map (vars' d . namedArg) ps+          vars' d (ConP _ _ ps) = vars d ps+          vars' d VarP{}      = 1+          vars' d DotP{}      = if d then 1 else 0+          vars' d LitP{}      = 0+          vars' d ProjP{}     = 0++          vs = evalState (execWriterT $ mapM_ (computePerm . namedArg) ps) 0+          next = do n <- get; put (n + 1); return n++          computePerm (ConP _ _ ps) = mapM_ (computePerm . namedArg) ps+          computePerm VarP{}        = tell . (:[]) =<< next+          computePerm DotP{}        = () <$ next+          computePerm LitP{}        = return ()+          computePerm ProjP{}       = return ()++      checkClause :: I.Clause -> UnquoteM I.Clause+      checkClause cl@Clause{ clausePerm = Perm n vs , clauseBody = body } = do+        let freevs    = allVars $ freeVars $ fromMaybe __IMPOSSIBLE__ $ getBody body+            propervs  = Set.fromList $ map ((n-1)-) vs+            dottedvs  = Set.difference (Set.fromList [0..n-1]) propervs+            offending = Set.intersection freevs dottedvs+        Agda.TypeChecking.Monad.reportSDoc "tc.unquote.clause.dotvars" 30 $ vcat+          [ text $ "checkClause "+          , nest 2 $ text $ "free vars:      " ++ show freevs+          , nest 2 $ text $ "dotted vars:    " ++ show dottedvs+          , nest 2 $ text $ "offending vars: " ++ show offending+          ]+        if Set.null offending+          then return cl+          else throwException $ RhsUsesDottedVar (Set.toList offending) t++instance Unquote UnquotedFunDef where+  unquote t = do+    t <- lift $ reduce t+    case ignoreSharing t of+      Con c [x, y] -> do+        choice+          [ (c `isCon` primAgdaFunDefCon, UnQFun <$> unquoteN x <*> unquoteN y) ]+          __IMPOSSIBLE__+      Con c _ -> __IMPOSSIBLE__+      _ -> throwException $ NotAConstructor "Pattern" t++reifyUnquoted :: Reify a e => a -> TCM e+reifyUnquoted = nowReifyingUnquoted . disableDisplayForms . withShowAllArguments . reify
src/full/Agda/Utils/FileName.hs view
@@ -76,7 +76,7 @@   | otherwise    = __IMPOSSIBLE__  #if mingw32_HOST_OS-prop_mkAbsolute :: FilePath -> Propertty+prop_mkAbsolute :: FilePath -> Property #else prop_mkAbsolute :: FilePath -> Bool #endif
src/full/Agda/Utils/Permutation.hs view
@@ -3,11 +3,16 @@ {-# LANGUAGE DeriveFoldable     #-} {-# LANGUAGE DeriveFunctor      #-} {-# LANGUAGE DeriveTraversable  #-}+{-# LANGUAGE FlexibleInstances  #-}+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE TupleSections      #-}  module Agda.Utils.Permutation where  import Prelude hiding (drop) +import Data.IntMap (IntMap)+import qualified Data.IntMap as IntMap import Data.List hiding (drop) import qualified Data.List as List import Data.Maybe@@ -16,8 +21,9 @@ import Data.Traversable (Traversable) import Data.Typeable (Typeable) -import Agda.Utils.Size+import Agda.Utils.Functor import Agda.Utils.List ((!!!))+import Agda.Utils.Size  #include "undefined.h" import Agda.Utils.Impossible@@ -63,6 +69,33 @@     xs !!!! n | n < 0     = Nothing               | otherwise = xs !!! n +-- |  Invert a Permutation on a partial finite int map.+-- @inversePermute perm f = f'@+-- such that @permute perm f' = f@+--+-- Example, with map represented as @[Maybe a]@:+-- @+--   f    = [Nothing, Just a, Just b ]+--   perm = Perm 4 [3,0,2]+--   f'   = [ Just a , Nothing , Just b , Nothing ]+-- @+-- Zipping @perm@ with @f@ gives @[(0,a),(2,b)]@, after compression+-- with @catMaybes@.  This is an @IntMap@ which can easily+-- written out into a substitution again.++class InversePermute a b where+  inversePermute :: Permutation -> a -> b++instance InversePermute [Maybe a] [(Int,a)] where+  inversePermute (Perm n is) = catMaybes . zipWith (\ i ma -> (i,) <$> ma) is++instance InversePermute [Maybe a] (IntMap a) where+  inversePermute p = IntMap.fromList . inversePermute p++instance InversePermute [Maybe a] [Maybe a] where+  inversePermute p@(Perm n _) = tabulate . inversePermute p+    where tabulate m = for [0..n-1] $ \ i -> IntMap.lookup i m+ -- | Identity permutation. idP :: Int -> Permutation idP n = Perm n [0..n - 1]@@ -159,7 +192,9 @@         xs = [ x | (x, []) <- g ]         remove x g = [ (y, filter (/= x) ys) | (y, ys) <- g, x /= y ] +------------------------------------------------------------------------ -- * Drop (apply) and undrop (abstract)+------------------------------------------------------------------------  -- | Delayed dropping which allows undropping. data Drop a = Drop@@ -189,3 +224,7 @@     Perm (n + m) $ [0..m-1] ++ map (+ m) (List.drop k xs)     where m = -k   unDrop m = dropMore (-m) -- allow picking up more than dropped++------------------------------------------------------------------------+-- * Properties, see 'Agda.Utils.Permutation.Tests'+------------------------------------------------------------------------
+ src/full/Agda/Utils/Permutation/Tests.hs view
@@ -0,0 +1,117 @@+{-# OPTIONS_GHC -fno-warn-missing-signatures #-}++{-# LANGUAGE CPP                #-}+{-# LANGUAGE DeriveDataTypeable #-}+{-# LANGUAGE DeriveFoldable     #-}+{-# LANGUAGE DeriveFunctor      #-}+{-# LANGUAGE DeriveTraversable  #-}+{-# LANGUAGE TemplateHaskell    #-}++module Agda.Utils.Permutation.Tests (tests) where++import Data.Functor+import Data.List as List+import Data.Maybe++import Test.QuickCheck+import Test.QuickCheck.All++import Agda.Utils.Permutation++------------------------------------------------------------------------+-- * Properties+------------------------------------------------------------------------++instance Arbitrary Permutation where+  arbitrary = do+    is <- nub . map getNonNegative <$> arbitrary+    NonNegative n <- arbitrary+    return $ Perm (if null is then n else maximum is + n + 1) is++data ComposablePermutations = ComposablePermutations Permutation Permutation+  deriving (Eq, Show)++instance Arbitrary ComposablePermutations where+  arbitrary = do+    p2@(Perm n is) <- arbitrary+    let m = length is+    p1 <- Perm m . filter (< m) . map getNonNegative <$> arbitrary+    return $ ComposablePermutations p1 p2++type A = Int++-- | Extend a list by indefinitely many elements.+withStream :: Testable b+  => ([a] -> b)  -- ^ Stream function.+  -> [a]         -- ^ Initial segment.+  -> a           -- ^ Default element, appended ad infinitum.+  -> b+withStream k as a = k $ as ++ repeat a++-- | Apply a permutation to a list which might be too short.+--   Silently discard picks that go beyond the list's boundaries.+permutePartial :: Permutation -> [a] -> [a]+permutePartial perm xs =+  catMaybes $ permute perm $ map Just xs ++ repeat Nothing+  -- Note: we have to add @Nothing@s to make @permute@ total.++-- | @perm([0..n-1]) == perm@+prop_permute_id_r :: Permutation -> Bool+prop_permute_id_r perm@(Perm n picks) =+  permute perm [0..] == picks++-- | @idP(xs) == xs@+prop_permute_id_l :: Int -> [A] -> A -> Bool+prop_permute_id_l n = withStream $ \ xs ->+  permute (idP n) xs == take n xs++-- | @takeP n perm = perm . take n@+prop_takeP :: Int -> Permutation -> [A] -> A -> Bool+prop_takeP n perm = withStream $ \ xs ->+  permute (takeP n perm) xs == permutePartial perm (take n xs)+  -- Note: we have to add @Nothing@s to make @permute@ total.++-- | @(droppedP perm)(xs) = xs \\ perm(xs)@+prop_droppedP :: Permutation -> [A] -> A -> Bool+prop_droppedP perm@(Perm n _) = withStream $ \ xs -> let xs' = take n xs in+  sort (permute (droppedP perm) xs') == sort (xs' \\ permute perm xs')++-- | @(p1 ∘ p2)(xs) = p1(p2(xs))@+prop_composeP :: ComposablePermutations -> [A] -> A -> Bool+prop_composeP (ComposablePermutations p1 p2) = withStream $ \ xs ->+  permute (composeP p1 p2) xs == permutePartial p1 (permute p2 xs)++-- | @p ∘ p⁻¹ ∘ p = p@+prop_invertP_left :: Permutation -> Int -> [A] -> A -> Bool+prop_invertP_left p err = withStream $ \ xs -> let ys = permute p xs in+  permute p (permute (invertP err p) ys) == ys++-- NOT QUITE RIGHT YET:+-- -- | @p⁻1 ∘ p ∘ p⁻¹ = p⁻¹@+-- prop_invertP_right :: Permutation -> Int -> [A] -> A -> Bool+-- prop_invertP_right p err = withStream $ \ xs ->+--   let pinv = invertP err p+--       ys   = permute pinv xs+--   in  permute pinv (permute p ys) == ys++-- | @reverseP p = reverse . p . reverse@+prop_reverseP :: Permutation -> [A] -> A -> Bool+prop_reverseP p@(Perm n _) = withStream $ \ xs0 -> let xs = take n xs0 in+  permute (reverseP p) xs == reverse (permute p (reverse xs))++-- | @permute p . inversePermute p = id@+prop_inversePermute :: Permutation -> [Maybe A] -> Maybe A -> Bool+prop_inversePermute p@(Perm _ is) = withStream $ \ xs0 ->+  let xs = take (length is) xs0+      ys = inversePermute p xs+  in  permute p ys == xs++-- Template Haskell hack to make the following $quickCheckAll work+-- under ghc-7.8.+return [] -- KEEP!++-- | All tests as collected by 'quickCheckAll'.+tests :: IO Bool+tests = do+  putStrLn "Agda.Utils.Permutation"+  $quickCheckAll
src/full/Agda/Utils/VarSet.hs view
@@ -1,18 +1,29 @@+{-# LANGUAGE CPP #-}+ -- | Var field implementation of sets of (small) natural numbers.+ module Agda.Utils.VarSet   ( VarSet-  , union, unions, member, empty, delete, singleton, fromList, toList, isSubsetOf, Set.null+  , union, unions, member, empty, delete, singleton+  , fromList, toList, toDescList+  , isSubsetOf, IntSet.null   , intersection, difference   , Agda.Utils.VarSet.subtract   )   where -import Data.IntSet as Set+import Data.IntSet (IntSet)+import Data.IntSet as IntSet -type VarSet = Set.IntSet+type VarSet = IntSet  subtract :: Int -> VarSet -> VarSet-subtract n s = Set.map (Prelude.subtract n) s+subtract n = IntSet.map (Prelude.subtract n)++#if !MIN_VERSION_containers(0,5,0)+toDescList :: VarSet -> [Int]+toDescList = reverse . toList+#endif  {- import Data.Bits