Agda- A dependently typed functional programming language and proof assistant

Safe HaskellNone




The abstract syntax. This is what you get after desugaring and scope analysis of the concrete syntax. The type checker works on abstract syntax, producing internal syntax (Agda.Syntax.Internal).



type Arg a = Arg Color a Source

type Dom a = Dom Color a Source

data Expr Source

Expressions after scope checking (operators parsed, names resolved).


Var Name

Bound variable.

Def QName

Constant: axiom, function, data or record type.

Proj QName


Con AmbiguousQName


PatternSyn QName

Pattern synonym.

Lit Literal


QuestionMark MetaInfo InteractionId

Meta variable for interaction. The InteractionId is usually identical with the metaNumber of MetaInfo. However, if you want to print an interaction meta as just ? instead of ?n, you should set the metaNumber to Nothing while keeping the InteractionId.

Underscore MetaInfo

Meta variable for hidden argument (must be inferred locally).

App ExprInfo Expr (NamedArg Expr)

Ordinary (binary) application.

WithApp ExprInfo Expr [Expr]

With application.

Lam ExprInfo LamBinding Expr

λ bs → e.

AbsurdLam ExprInfo Hiding

λ() or λ{}.

ExtendedLam ExprInfo DefInfo QName [Clause] 
Pi ExprInfo Telescope Expr

Dependent function space Γ → A.

Fun ExprInfo (Arg Expr) Expr

Non-dependent function space.

Set ExprInfo Integer

Set, Set1, Set2, ...

Prop ExprInfo

Prop (no longer supported, used as dummy type).

Let ExprInfo [LetBinding] Expr

let bs in e.

ETel Telescope

Only used when printing telescopes.

Rec ExprInfo Assigns

Record construction.

RecUpdate ExprInfo Expr Assigns

Record update.

ScopedExpr ScopeInfo Expr

Scope annotation.

QuoteGoal ExprInfo Name Expr

Binds Name to current type in Expr.

QuoteContext ExprInfo Name Expr

Binds Name to current context in Expr.

Quote ExprInfo

Quote an identifier QName.

QuoteTerm ExprInfo

Quote a term.

Unquote ExprInfo

The splicing construct: unquote ...

DontCare Expr

For printing DontCare from Syntax.Internal.

type Assign = (Name, Expr) Source

Record field assignment f = e.

data Axiom Source

Is a type signature a postulate or a function signature?



A function signature.


Not a function signature, i.e., a postulate (in user input) or another (e.g. data/record) type signature (internally).

type Ren a = [(a, a)] Source

Renaming (generic).

data Declaration Source


Axiom Axiom DefInfo ArgInfo QName Expr

type signature (can be irrelevant and colored, but not hidden)

Field DefInfo QName (Arg Expr)

record field

Primitive DefInfo QName Expr

primitive function

Mutual MutualInfo [Declaration]

a bunch of mutually recursive definitions

Section ModuleInfo ModuleName [TypedBindings] [Declaration] 
Apply ModuleInfo ModuleName ModuleApplication (Ren QName) (Ren ModuleName) 
Import ModuleInfo ModuleName 
Pragma Range Pragma 
Open ModuleInfo ModuleName

only retained for highlighting purposes

FunDef DefInfo QName Delayed [Clause]

sequence of function clauses

DataSig DefInfo QName Telescope Expr

lone data signature ^ the LamBindings are DomainFree and binds the parameters of the datatype.

DataDef DefInfo QName [LamBinding] [Constructor]

the LamBindings are DomainFree and binds the parameters of the datatype.

RecSig DefInfo QName Telescope Expr

lone record signature

RecDef DefInfo QName (Maybe (Ranged Induction)) (Maybe QName) [LamBinding] Expr [Declaration]

The Expr gives the constructor type telescope, (x1 : A1)..(xn : An) -> Prop, and the optional name is the constructor's name.

PatternSynDef QName [Arg Name] Pattern

Only for highlighting purposes

UnquoteDecl MutualInfo DefInfo QName Expr 
ScopedDecl ScopeInfo [Declaration]

scope annotation

data TypedBinding Source

A typed binding. Appears in dependent function spaces, typed lambdas, and telescopes. It might be tempting to simplify this to only bind a single name at a time, and translate, say, (x y : A) to (x : A)(y : A) before type-checking. However, this would be slightly problematic:

  1. We would have to typecheck the type A several times.
  2. If A contains a meta variable or hole, it would be duplicated by such a translation.

While 1. is only slightly inefficient, 2. would be an outright bug. Duplicating A could not be done naively, we would have to make sure that the metas of the copy are aliases of the metas of the original.


TBind Range [WithHiding Name] Expr

As in telescope (x y z : A) or type (x y z : A) -> B.

TLet Range [LetBinding]

E.g. (let x = e) or (let open M).

data Clause' lhs Source

We could throw away where clauses at this point and translate them to let. It's not obvious how to remember that the let was really a where clause though, so for the time being we keep it here.



data RHS Source


RHS Expr 
WithRHS QName [Expr] [Clause]

The QName is the name of the with function.

RewriteRHS [(QName, Expr)] RHS [Declaration]

The QNames are the names of the generated with functions. One for each Expr. The RHS shouldn't be another RewriteRHS.

data SpineLHS Source

The lhs of a clause in spine view (inside-out). Projection patterns are contained in spLhsPats, represented as DefP d [].




spLhsInfo :: LHSInfo


spLhsDefName :: QName

Name of function we are defining.

spLhsPats :: [NamedArg Pattern]

Function parameters (patterns).

spLhsWithPats :: [Pattern]

with patterns (after |).

data LHS Source

The lhs of a clause in focused (projection-application) view (outside-in). Projection patters are represented as LHSProjs.




lhsInfo :: LHSInfo


lhsCore :: LHSCore


lhsWithPats :: [Pattern]

with patterns (after |).

data LHSCore' e Source

The lhs minus with-patterns in projection-application view. Parameterised over the type e of dot patterns.



The head applied to ordinary patterns.


lhsDefName :: QName

Head f.

lhsPats :: [NamedArg (Pattern' e)]

Applied to patterns ps.




lhsDestructor :: QName

Record projection identifier.

lhsPatsLeft :: [NamedArg (Pattern' e)]

Indices of the projection. Currently none [], since we do not have indexed records.

lhsFocus :: NamedArg (LHSCore' e)

Main branch.

lhsPatsRight :: [NamedArg (Pattern' e)]

Further applied to patterns.

class LHSToSpine a b where Source

Convert a focused lhs to spine view and back.


lhsToSpine :: a -> b Source

spineToLhs :: b -> a Source


LHSToSpine LHS SpineLHS Source

LHS instance.

LHSToSpine Clause SpineClause Source

Clause instance.

LHSToSpine a b => LHSToSpine [a] [b] Source

List instance (for clauses).

lhsCoreApp :: LHSCore' e -> [NamedArg (Pattern' e)] -> LHSCore' e Source

Add applicative patterns (non-projection patterns) to the right.

lhsCoreAddSpine :: LHSCore' e -> [NamedArg (Pattern' e)] -> LHSCore' e Source

Add projection and applicative patterns to the right.

lhsCoreAllPatterns :: LHSCore' e -> [Pattern' e] Source

Used for checking pattern linearity.

lhsCoreToPattern :: LHSCore -> Pattern Source

Used in AbstractToConcrete.


data Pattern' e Source

Parameterised over the type of dot patterns.


VarP Name 
ConP ConPatInfo AmbiguousQName [NamedArg (Pattern' e)] 
DefP PatInfo QName [NamedArg (Pattern' e)]

Defined pattern: function definition f ps or destructor pattern d p ps.

WildP PatInfo

Underscore pattern entered by user. Or generated at type checking for implicit arguments.

AsP PatInfo Name (Pattern' e) 
DotP PatInfo e 
AbsurdP PatInfo 
LitP Literal 
PatternSynP PatInfo QName [NamedArg (Pattern' e)] 

class IsProjP a where Source

Check whether we are a projection pattern.


isProjP :: a -> Maybe QName Source

class AllNames a where Source

Extracts all the names which are declared in a Declaration. This does not include open public or let expressions, but it does include local modules, where clauses and the names of extended lambdas.


allNames :: a -> Seq QName Source

axiomName :: Declaration -> QName Source

The name defined by the given axiom.

Precondition: The declaration has to be a (scoped) Axiom.

class AnyAbstract a where Source

Are we in an abstract block?

In that case some definition is abstract.


anyAbstract :: a -> Bool Source

insertImplicitPatSynArgs :: HasRange a => (Range -> a) -> Range -> [Arg Name] -> [NamedArg a] -> Maybe ([(Name, a)], [Arg Name]) Source