Agda-2.6.0: A dependently typed functional programming language and proof assistant

Agda.TypeChecking.Free

Contents

Description

Computing the free variables of a term.

The distinction between rigid and strongly rigid occurrences comes from: Jason C. Reed, PhD thesis, 2009, page 96 (see also his LFMTP 2009 paper)

The main idea is that x = t(x) is unsolvable if x occurs strongly rigidly in t. It might have a solution if the occurrence is not strongly rigid, e.g.

x = f -> suc (f (x ( y -> k))) has x = f -> suc (f (suc k))

Jason C. Reed, PhD thesis, page 106

Under coinductive constructors, occurrences are never strongly rigid. Also, function types and lambdas do not establish strong rigidity. Only inductive constructors do so. (See issue 1271).

Synopsis

# Documentation

data FreeVars Source #

Free variables of a term, (disjointly) partitioned into strongly and and weakly rigid variables, flexible variables and irrelevant variables.

Constructors

 FV FieldsstronglyRigidVars :: VarSetVariables under only and at least one inductive constructor(s).unguardedVars :: VarSetVariables at top or only under inductive record constructors λs and Πs. The purpose of recording these separately is that they can still become strongly rigid if put under a constructor whereas weakly rigid ones stay weakly rigid.weaklyRigidVars :: VarSetOrdinary rigid variables, e.g., in arguments of variables or functions.flexibleVars :: IntMap MetaSetVariables occuring in arguments of metas. These are only potentially free, depending how the meta variable is instantiated. The set contains the id's of the meta variables that this variable is an argument to.irrelevantVars :: VarSetVariables in irrelevant arguments and under a DontCare, i.e., in irrelevant positions.
Instances
 Source # Instance detailsDefined in Agda.TypeChecking.Free Methods Source # Instance detailsDefined in Agda.TypeChecking.Free MethodsshowList :: [FreeVars] -> ShowS # Source # Free variable sets form a monoid under union. Instance detailsDefined in Agda.TypeChecking.Free Methodsstimes :: Integral b => b -> FreeVars -> FreeVars # Source # Instance detailsDefined in Agda.TypeChecking.Free Methodsmconcat :: [FreeVars] -> FreeVars # Source # Instance detailsDefined in Agda.TypeChecking.Free Methods Source # Instance detailsDefined in Agda.TypeChecking.Free Methods Source # Instance detailsDefined in Agda.TypeChecking.Free Methods

newtype VarCounts Source #

Constructors

 VarCounts FieldsvarCounts :: IntMap Int
Instances
 Source # Instance detailsDefined in Agda.TypeChecking.Free Methodsstimes :: Integral b => b -> VarCounts -> VarCounts # Source # Instance detailsDefined in Agda.TypeChecking.Free Methodsmconcat :: [VarCounts] -> VarCounts # Source # Instance detailsDefined in Agda.TypeChecking.Free Methods Source # Instance detailsDefined in Agda.TypeChecking.Free Methods

class Free a Source #

Gather free variables in a collection.

Minimal complete definition

freeVars'

Instances
 Source # Instance detailsDefined in Agda.TypeChecking.Free.Lazy Methods Source # Instance detailsDefined in Agda.TypeChecking.Free.Lazy MethodsfreeVars' :: IsVarSet c => Clause -> FreeM c Source # Source # Instance detailsDefined in Agda.TypeChecking.Free.Lazy Methods Source # Instance detailsDefined in Agda.TypeChecking.Free.Lazy Methods Source # Instance detailsDefined in Agda.TypeChecking.Free.Lazy MethodsfreeVars' :: IsVarSet c => Level -> FreeM c Source # Source # Instance detailsDefined in Agda.TypeChecking.Free.Lazy MethodsfreeVars' :: IsVarSet c => Sort -> FreeM c Source # Source # Instance detailsDefined in Agda.TypeChecking.Free.Lazy MethodsfreeVars' :: IsVarSet c => Term -> FreeM c Source # Source # Instance detailsDefined in Agda.TypeChecking.Monad.Base Methods Source # Instance detailsDefined in Agda.TypeChecking.Rewriting MethodsfreeVars' :: IsVarSet c => NLPType -> FreeM c Source # Source # Instance detailsDefined in Agda.TypeChecking.Rewriting MethodsfreeVars' :: IsVarSet c => NLPat -> FreeM c Source # Source # Instance detailsDefined in Agda.TypeChecking.Monad.Base Methods Source # Instance detailsDefined in Agda.TypeChecking.Monad.Base Methods Source # Instance detailsDefined in Agda.TypeChecking.Monad.Base Methods Free a => Free [a] Source # Instance detailsDefined in Agda.TypeChecking.Free.Lazy MethodsfreeVars' :: IsVarSet c => [a] -> FreeM c Source # Free a => Free (Maybe a) Source # Instance detailsDefined in Agda.TypeChecking.Free.Lazy MethodsfreeVars' :: IsVarSet c => Maybe a -> FreeM c Source # Free a => Free (Dom a) Source # Instance detailsDefined in Agda.TypeChecking.Free.Lazy MethodsfreeVars' :: IsVarSet c => Dom a -> FreeM c Source # Free a => Free (Arg a) Source # Instance detailsDefined in Agda.TypeChecking.Free.Lazy MethodsfreeVars' :: IsVarSet c => Arg a -> FreeM c Source # Free a => Free (Tele a) Source # Instance detailsDefined in Agda.TypeChecking.Free.Lazy MethodsfreeVars' :: IsVarSet c => Tele a -> FreeM c Source # Free a => Free (Type' a) Source # Instance detailsDefined in Agda.TypeChecking.Free.Lazy MethodsfreeVars' :: IsVarSet c => Type' a -> FreeM c Source # Free a => Free (Abs a) Source # Instance detailsDefined in Agda.TypeChecking.Free.Lazy MethodsfreeVars' :: IsVarSet c => Abs a -> FreeM c Source # Free a => Free (Elim' a) Source # Instance detailsDefined in Agda.TypeChecking.Free.Lazy MethodsfreeVars' :: IsVarSet c => Elim' a -> FreeM c Source # (Free a, Free b) => Free (a, b) Source # Instance detailsDefined in Agda.TypeChecking.Free.Lazy MethodsfreeVars' :: IsVarSet c => (a, b) -> FreeM c Source #

class (Semigroup a, Monoid a) => IsVarSet a where Source #

Any representation 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.

Methods

withVarOcc :: VarOcc -> a -> a Source #

Laws * Respects monoid operations:  withVarOcc o mempty == mempty withVarOcc o (x <> y) == withVarOcc o x <> withVarOcc o y  * Respects VarOcc composition  withVarOcc (composeVarOcc o1 o2) = withVarOcc o1 . withVarOcc o2 

Instances
 Source # Instance detailsDefined in Agda.TypeChecking.Free Methods Source # Instance detailsDefined in Agda.TypeChecking.Free Methods Source # Instance detailsDefined in Agda.TypeChecking.Free.Lazy Methods Source # Instance detailsDefined in Agda.TypeChecking.Free Methods Source # Instance detailsDefined in Agda.TypeChecking.Free Methods Source # Instance detailsDefined in Agda.TypeChecking.Free MethodswithVarOcc :: VarOcc -> [Int] -> [Int] 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
 Source # Instance detailsDefined in Agda.TypeChecking.Free.Lazy Methods Source # Instance detailsDefined in Agda.TypeChecking.Free.Lazy MethodsshowList :: [IgnoreSorts] -> ShowS #

runFree :: (IsVarSet c, Free a) => SingleVar c -> IgnoreSorts -> a -> c Source #

Compute free variables.

rigidVars :: FreeVars -> VarSet Source #

Rigid variables: either strongly rigid, unguarded, or weakly rigid.

relevantVars :: FreeVars -> VarSet Source #

All but the irrelevant variables.

allVars :: FreeVars -> VarSet Source #

allVars fv includes irrelevant variables.

allFreeVars :: Free a => a -> VarSet Source #

Collect all free variables.

allFreeVarsWithOcc :: Free a => a -> TheVarMap Source #

Collect all free variables together with information about their occurrence.

allRelevantVars :: Free a => a -> VarSet Source #

Collect all relevant free variables, excluding the "unused" ones.

allRelevantVarsIgnoring :: Free a => IgnoreSorts -> a -> VarSet Source #

Collect all relevant free variables, possibly ignoring sorts.

freeIn :: Free a => Nat -> a -> Bool Source #

isBinderUsed :: Free a => Abs a -> Bool Source #

Is the variable bound by the abstraction actually used?

relevantIn :: Free a => Nat -> a -> Bool Source #

Constructors

 NoOccurrence Irrelevantly StronglyRigid Under at least one and only inductive constructors. Unguarded In top position, or only under inductive record constructors. WeaklyRigid In arguments to variables and definitions. Flexible MetaSet In arguments of metas.
Instances
 Source # Instance detailsDefined in Agda.TypeChecking.Free Methods Source # Instance detailsDefined in Agda.TypeChecking.Free MethodsshowList :: [Occurrence] -> ShowS #

data VarOcc Source #

Occurrence of free variables is classified by several dimensions. Currently, we have FlexRig and Relevance.

Constructors

 VarOcc Fields
Instances
 Source # Instance detailsDefined in Agda.TypeChecking.Free.Lazy Methods(==) :: VarOcc -> VarOcc -> Bool #(/=) :: VarOcc -> VarOcc -> Bool # Source # Instance detailsDefined in Agda.TypeChecking.Free.Lazy MethodsshowsPrec :: Int -> VarOcc -> ShowS #showList :: [VarOcc] -> ShowS # Source # Instance detailsDefined in Agda.TypeChecking.Free.Lazy Methods Source # Instance detailsDefined in Agda.TypeChecking.Free.Lazy Methodssingleton :: (Variable, VarOcc) -> VarMap Source #

occurrence :: Free a => Nat -> a -> Occurrence Source #

Compute an occurrence of a single variable in a piece of internal syntax.

closed :: Free a => a -> Bool Source #

Is the term entirely closed (no free variables)?

freeVars :: (IsVarSet c, Singleton Variable c, Free a) => a -> c Source #

Doesn't go inside solved metas, but collects the variables from a metavariable application X ts as flexibleVars.

freeVars' :: (Free a, IsVarSet c) => a -> FreeM c Source #

# Orphan instances

 Source # Instance details Methods Source # Instance details Methods Source # Instance details MethodswithVarOcc :: VarOcc -> [Int] -> [Int] Source #