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

Agda.TypeChecking.Free.Old

Description

Computing the free variables of a term.

This is the old version of '`Free'`, using `IntSet`s for the separate variable categories. We keep it as a specification.

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.flexibleVars :: VarSetVariables occuring in arguments of metas. These are only potentially free, depending how the meta variable is instantiated.irrelevantVars :: VarSetVariables in irrelevant arguments and under a `DontCare`, i.e., in irrelevant positions.unusedVars :: VarSetVariables in `UnusedArg`uments.

Instances

 Source Source Source Free variable sets form a monoid under `union`.

class Free a Source

Minimal complete definition

freeVars'

Instances

 Source Source Source Source Source Source Source Source Free a => Free [a] Source Free a => Free (Maybe a) Source Free a => Free (Tele a) Source Free a => Free (Abs a) Source Free a => Free (Elim' a) Source Free a => Free (Dom a) Source Free a => Free (Arg a) Source (Free a, Free b) => Free (a, b) 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 Source

freeVars :: Free a => a -> FreeVars Source

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

`allVars fv` includes irrelevant variables.

All but the irrelevant variables.

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

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

data Occurrence 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 In arguments of metas. Unused

Instances

 Source Source