| Safe Haskell | None |
|---|---|
| Language | Haskell2010 |
Agda.TypeChecking.Free.Base
Contents
- Set of meta variables.
- Flexible and rigid occurrences (semigroup)
- Multi-dimensional feature vector for variable occurrence (semigroup)
- Storing variable occurrences (semimodule).
- Simple flexible/rigid variable collection.
- Plain variable occurrence counting.
- Environment for collecting free variables.
- Orphan instances
Synopsis
- newtype MetaSet = MetaSet {}
- insertMetaSet :: MetaId -> MetaSet -> MetaSet
- foldrMetaSet :: (MetaId -> a -> a) -> a -> MetaSet -> a
- metaSetToBlocker :: MetaSet -> Blocker
- data FlexRig' a
- = Flexible !a
- | WeaklyRigid
- | Unguarded
- | StronglyRigid
- type FlexRig = FlexRig' MetaSet
- class LensFlexRig o a | o -> a where
- lensFlexRig :: Lens' o (FlexRig' a)
- isFlexible :: LensFlexRig o a => o -> Bool
- isUnguarded :: LensFlexRig o a => o -> Bool
- isWeaklyRigid :: LensFlexRig o a => o -> Bool
- isStronglyRigid :: LensFlexRig o a => o -> Bool
- addFlexRig :: Semigroup a => FlexRig' a -> FlexRig' a -> FlexRig' a
- zeroFlexRig :: Monoid a => FlexRig' a
- omegaFlexRig :: FlexRig' a
- composeFlexRig :: Semigroup a => FlexRig' a -> FlexRig' a -> FlexRig' a
- oneFlexRig :: FlexRig' a
- flexRigToBlocker :: FlexRig -> Blocker
- data VarOcc' a = VarOcc {
- varFlexRig :: !(FlexRig' a)
- varModality :: !Modality
- type VarOcc = VarOcc' MetaSet
- topVarOcc :: VarOcc' a
- composeVarOcc :: Semigroup a => VarOcc' a -> VarOcc' a -> VarOcc' a
- oneVarOcc :: VarOcc' a
- constructorFlexRig :: ConHead -> Elims -> FlexRig' a
- class (Singleton MetaId a, Monoid a, Monoid c) => IsVarSet a c | c -> a where
- withVarOcc :: VarOcc' a -> c -> c
- type TheVarMap' a = IntMap (VarOcc' a)
- newtype VarMap' a = VarMap {
- theVarMap :: TheVarMap' a
- type TheVarMap = TheVarMap' MetaSet
- type VarMap = VarMap' MetaSet
- mapVarMap :: (TheVarMap' a -> TheVarMap' b) -> VarMap' a -> VarMap' b
- lookupVarMap :: Variable -> VarMap' a -> Maybe (VarOcc' a)
- type TheFlexRigMap = IntMap (FlexRig' ())
- newtype FlexRigMap = FlexRigMap {}
- mapFlexRigMap :: (TheFlexRigMap -> TheFlexRigMap) -> FlexRigMap -> FlexRigMap
- newtype VarCounts = VarCounts {}
- data IgnoreSorts
- data FreeEnv' a b c = FreeEnv {
- feExtra :: !b
- feFlexRig :: !(FlexRig' a)
- feModality :: !Modality
- feSingleton :: !(b -> Maybe Variable -> c)
- type Variable = Int
- type SingleVar c = Variable -> c
- type FreeEnv c = FreeEnv' MetaSet IgnoreSorts c
- feIgnoreSorts :: FreeEnv' a IgnoreSorts c -> IgnoreSorts
- initFreeEnv :: Monoid c => b -> SingleVar c -> FreeEnv' a b c
Set of meta variables.
A set of meta variables. Forms a monoid under union.
Constructors
| MetaSet | |
Fields | |
foldrMetaSet :: (MetaId -> a -> a) -> a -> MetaSet -> a Source #
metaSetToBlocker :: MetaSet -> Blocker Source #
Flexible and rigid occurrences (semigroup)
Depending on the surrounding context of a variable, it's occurrence can be classified as flexible or rigid, with finer distinctions.
The constructors are listed in increasing order (wrt. information content).
Constructors
| Flexible !a | In arguments of metas.
The set of metas is used by ' |
| WeaklyRigid | In arguments to variables and definitions. |
| Unguarded | In top position, or only under inductive record constructors (unit). |
| StronglyRigid | Under at least one and only inductive constructors. |
Instances
class LensFlexRig o a | o -> a where Source #
Methods
lensFlexRig :: Lens' o (FlexRig' a) Source #
Instances
| LensFlexRig (FlexRig' a) a Source # | |
Defined in Agda.TypeChecking.Free.Base | |
| LensFlexRig (VarOcc' a) a Source # | Access to |
Defined in Agda.TypeChecking.Free.Base | |
| LensFlexRig (FreeEnv' a b c) a Source # | |
Defined in Agda.TypeChecking.Free.Base | |
isFlexible :: LensFlexRig o a => o -> Bool Source #
isUnguarded :: LensFlexRig o a => o -> Bool Source #
isWeaklyRigid :: LensFlexRig o a => o -> Bool Source #
isStronglyRigid :: LensFlexRig o a => o -> Bool Source #
addFlexRig :: Semigroup a => FlexRig' a -> FlexRig' a -> FlexRig' a Source #
FlexRig aggregation (additive operation of the semiring).
For combining occurrences of the same variable in subterms.
This is a refinement of the max operation for FlexRig
which would work if Flexible did not have the MetaSet as an argument.
Now, to aggregate two Flexible occurrences, we union the involved MetaSets.
zeroFlexRig :: Monoid a => FlexRig' a Source #
Unit for addFlexRig.
omegaFlexRig :: FlexRig' a Source #
Absorptive for addFlexRig.
composeFlexRig :: Semigroup a => FlexRig' a -> FlexRig' a -> FlexRig' a Source #
FlexRig composition (multiplicative operation of the semiring).
For accumulating the context of a variable.
Flexible is dominant. Once we are under a meta, we are flexible
regardless what else comes. We taint all variable occurrences
under a meta by this meta.
WeaklyRigid is next in strength. Destroys strong rigidity.
StronglyRigid is still dominant over Unguarded.
Unguarded is the unit. It is the top (identity) context.
oneFlexRig :: FlexRig' a Source #
Unit for composeFlexRig.
flexRigToBlocker :: FlexRig -> Blocker Source #
Extract a blocker from an occurrence
Multi-dimensional feature vector for variable occurrence (semigroup)
Occurrence of free variables is classified by several dimensions.
Currently, we have FlexRig and Modality.
Constructors
| VarOcc | |
Fields
| |
Instances
| LensModality (VarOcc' a) Source # | |
Defined in Agda.TypeChecking.Free.Base | |
| LensQuantity (VarOcc' a) Source # | |
Defined in Agda.TypeChecking.Free.Base | |
| LensRelevance (VarOcc' a) Source # | |
Defined in Agda.TypeChecking.Free.Base | |
| Pretty a => Pretty (VarOcc' a) Source # | |
| PrettyTCM a => PrettyTCM (VarOcc' a) Source # | |
Defined in Agda.TypeChecking.Pretty | |
| Monoid a => Monoid (VarOcc' a) Source # | The neutral element for variable occurrence aggregation is least serious
occurrence: flexible, irrelevant.
This is also the absorptive element for |
| Semigroup a => Semigroup (VarOcc' a) Source # | The default way of aggregating free variable info from subterms is by adding
the variable occurrences. For instance, if we have a pair From counting
|
| Show a => Show (VarOcc' a) Source # | |
| Eq a => Eq (VarOcc' a) Source # | Equality up to origin. |
| LensFlexRig (VarOcc' a) a Source # | Access to |
Defined in Agda.TypeChecking.Free.Base | |
topVarOcc :: VarOcc' a Source #
The absorptive element of variable occurrence under aggregation: strongly rigid, relevant.
composeVarOcc :: Semigroup a => VarOcc' a -> VarOcc' a -> VarOcc' a Source #
First argument is the outer occurrence (context) and second is the inner. This multiplicative operation is to modify an occurrence under a context.
Storing variable occurrences (semimodule).
class (Singleton MetaId a, Monoid a, Monoid c) => IsVarSet a c | c -> a where Source #
Any representation c of a set of variables need to be able to be modified by
a variable occurrence. This is to ensure that free variable analysis is
compositional. For instance, it should be possible to compute `fv (v [u/x])`
from `fv v` and `fv u`.
In algebraic terminology, a variable set a needs to be (almost) a left semimodule
to the semiring VarOcc.
Methods
withVarOcc :: VarOcc' a -> c -> c Source #
Laws * Respects monoid operations: ``` withVarOcc o mempty == mempty withVarOcc o (x <> y) == withVarOcc o x <> withVarOcc o y ``` * Respects VarOcc composition: ``` withVarOcc oneVarOcc = id withVarOcc (composeVarOcc o1 o2) = withVarOcc o1 . withVarOcc o2 ``` * Respects VarOcc aggregation: ``` withVarOcc (o1 <> o2) x = withVarOcc o1 x <> withVarOcc o2 x ``` Since the corresponding unit law may fail, ``` withVarOcc mempty x = mempty ``` it is not quite a semimodule.
Instances
| IsVarSet () FlexRigMap Source # | Compose everything with the |
Defined in Agda.TypeChecking.Free.Base Methods withVarOcc :: VarOcc' () -> FlexRigMap -> FlexRigMap Source # | |
| IsVarSet () VarCounts Source # | |
Defined in Agda.TypeChecking.Free.Base | |
| IsVarSet () AllowedVar Source # | |
Defined in Agda.TypeChecking.MetaVars.Occurs Methods withVarOcc :: VarOcc' () -> AllowedVar -> AllowedVar Source # | |
| (Singleton MetaId a, Monoid a) => IsVarSet a (VarMap' a) Source # | |
Defined in Agda.TypeChecking.Free.Base | |
type TheVarMap' a = IntMap (VarOcc' a) Source #
Representation of a variable set as map from de Bruijn indices
to VarOcc.
Constructors
| VarMap | |
Fields
| |
Instances
| (Singleton MetaId a, Monoid a) => IsVarSet a (VarMap' a) Source # | |
Defined in Agda.TypeChecking.Free.Base | |
| Singleton Variable (VarMap' a) Source # | A "set"-style |
| PrettyTCM a => PrettyTCM (VarMap' a) Source # | |
Defined in Agda.TypeChecking.Pretty | |
| Semigroup a => Monoid (VarMap' a) Source # | |
| Semigroup a => Semigroup (VarMap' a) Source # | Proper monoid instance for |
| Show a => Show (VarMap' a) Source # | |
| Eq a => Eq (VarMap' a) Source # | |
type TheVarMap = TheVarMap' MetaSet Source #
mapVarMap :: (TheVarMap' a -> TheVarMap' b) -> VarMap' a -> VarMap' b Source #
Simple flexible/rigid variable collection.
type TheFlexRigMap = IntMap (FlexRig' ()) Source #
Keep track of FlexRig for every variable, but forget the involved meta vars.
newtype FlexRigMap Source #
Constructors
| FlexRigMap | |
Fields | |
Instances
| Monoid FlexRigMap Source # | |
Defined in Agda.TypeChecking.Free.Base Methods mempty :: FlexRigMap # mappend :: FlexRigMap -> FlexRigMap -> FlexRigMap # mconcat :: [FlexRigMap] -> FlexRigMap # | |
| Semigroup FlexRigMap Source # | |
Defined in Agda.TypeChecking.Free.Base Methods (<>) :: FlexRigMap -> FlexRigMap -> FlexRigMap # sconcat :: NonEmpty FlexRigMap -> FlexRigMap # stimes :: Integral b => b -> FlexRigMap -> FlexRigMap # | |
| Show FlexRigMap Source # | |
Defined in Agda.TypeChecking.Free.Base Methods showsPrec :: Int -> FlexRigMap -> ShowS # show :: FlexRigMap -> String # showList :: [FlexRigMap] -> ShowS # | |
| IsVarSet () FlexRigMap Source # | Compose everything with the |
Defined in Agda.TypeChecking.Free.Base Methods withVarOcc :: VarOcc' () -> FlexRigMap -> FlexRigMap Source # | |
| Singleton (Variable, FlexRig' ()) FlexRigMap Source # | |
Defined in Agda.TypeChecking.Free.Base | |
mapFlexRigMap :: (TheFlexRigMap -> TheFlexRigMap) -> FlexRigMap -> FlexRigMap Source #
Plain variable occurrence counting.
Environment for collecting free variables.
data IgnoreSorts Source #
Where should we skip sorts in free variable analysis?
Constructors
| IgnoreNot | Do not skip. |
| IgnoreInAnnotations | Skip when annotation to a type. |
| IgnoreAll | Skip unconditionally. |
Instances
| Show IgnoreSorts Source # | |
Defined in Agda.TypeChecking.Free.Base Methods showsPrec :: Int -> IgnoreSorts -> ShowS # show :: IgnoreSorts -> String # showList :: [IgnoreSorts] -> ShowS # | |
| Eq IgnoreSorts Source # | |
Defined in Agda.TypeChecking.Free.Base | |
The current context.
Constructors
| FreeEnv | |
Fields
| |
Instances
| LensModality (FreeEnv' a b c) Source # | |
Defined in Agda.TypeChecking.Free.Base | |
| LensQuantity (FreeEnv' a b c) Source # | |
Defined in Agda.TypeChecking.Free.Base | |
| LensRelevance (FreeEnv' a b c) Source # | |
Defined in Agda.TypeChecking.Free.Base | |
| LensFlexRig (FreeEnv' a b c) a Source # | |
Defined in Agda.TypeChecking.Free.Base | |
feIgnoreSorts :: FreeEnv' a IgnoreSorts c -> IgnoreSorts Source #
Ignore free variables in sorts.