HORIZON HASKELLDocslts/ghc-9.10.xc74966e2026-09-27Search names, modules, packages, or :: a typeCtrl K

GHC 9.10.3 · lts/ghc-9.10.x · c74966e · 2026-09-27

ModuleAgda-2.7.0.1Haskell2010

Agda.TypeChecking.MetaVars

  • 5 types
  • 2 classes
  • 59 values
  • PackageAgda-2.7.0.1
  • Exports66
  • LanguageHaskell2010
  • LicenceMIT
  • SourceMetaVars.hs
valuefindIdx :: Eq a => [a] -> a -> Maybe Int
#

Find position of a value in a list. Used to change metavar argument indices during assignment.

reverse is necessary because we are directly abstracting over the list.

Performing the assignment

2 declarations

Creating meta variables.

60 declarations

Create a postponed type checking problem e : t that waits for conditon unblock. A new meta is created in the current context that has as instantiation the postponed type checking problem. An UnBlock constraint is added for this meta, which links to this meta.

valueetaExpandMetaTCM :: [MetaClass] -> MetaId -> TCM ()
#

Eta-expand a local meta-variable, if it is of the specified kind. Don't do anything if the meta-variable is a blocked term.

valueassign :: CompareDirection -> MetaId -> Args -> Term -> CompareAs -> TCM ()
#

Miller pattern unification:

assign dir x vs v a solves problem x vs <=(dir) v : a for meta x if vs are distinct variables (linearity check) and v depends only on these variables and does not contain x itself (occurs check).

This is the basic story, but we have added some features:

  1. Pruning.

  2. Benign cases of non-linearity.

  3. vs may contain record patterns.

For a reference to some of these extensions, read Andreas Abel and Brigitte Pientka's TLCA 2011 paper.

valueassignMeta :: Int -> MetaId -> Type -> [Int] -> Term -> TCM ()
#

assignMeta m x t ids u solves x ids = u for meta x of type t, where term u lives in a context of length m. Precondition: ids is linear.

valueassignMeta' :: Int -> MetaId -> Type -> Int -> SubstCand -> Term -> TCM ()
#

assignMeta' m x t ids u solves x = [ids]u for meta x of type t, where term u lives in a context of length m, and ids is a partial substitution.

valuecheckMetaInst :: MetaId -> TCM ()
#

Check that the instantiation of the given metavariable fits the type of the metavariable. If the metavariable is not yet instantiated, add a constraint to check the instantiation later.

valuesubtypingForSizeLt
  1. :: CompareDirection
    dir
  2. -> MetaId

    The local meta-variable x.

  3. -> MetaVariable

    Its associated information mvar <- lookupLocalMeta x.

  4. -> Type

    Its type t = jMetaType $ mvJudgement mvar

  5. -> Args

    Its arguments.

  6. -> Term

    Its to-be-assigned value v, such that x args dir v.

  7. -> (Term -> TCM ())

    Continuation taking its possibly assigned value.

  8. -> TCM ()
#

Turn the assignment problem _X args <= SizeLt u into _X args = SizeLt (_Y args) and constraint _Y args <= u.

classclass (TermLike a, TermSubst a, Reduce a) => ReduceAndEtaContract a where
#

Normalize just far enough to be able to eta-contract maximally.

Methods

Instances3ReduceAndEtaContract

Check that arguments args to a metavar are in pattern fragment. Assumes all arguments already in whnf and eta-reduced. Parameters are represented as Vars so checkArgs really checks that all args are Vars and returns the "substitution" to be applied to the rhs of the equation to solve. (If args is considered a substitution, its inverse is returned.)

The returned list might not be ordered. Linearity, i.e., whether the substitution is deterministic, has to be checked separately.

If the given metavariable application represents a face, return:

  • The metavariable information;

  • The actual face, as an assignment of booleans to variables;

  • The substitution candidate resulting from inverseSubst'. This is guaranteed to be linear and deterministic.

  • The actual substitution, mapping from the constraint context to the metavariable's context.

Put concisely, a face constraint is an equation in the pattern fragment modulo the presence of endpoints (i0 and i1) in the telescope. In more detail, a face constraint has the form

?0 Δ (i = i0) (j = i0) Γ (k = i1) Θ (l = i0) = t

where all the greek letters consist entirely of distinct bound variables (and, of course, arbitrarily many endpoints are allowed between each substitution fragment).

Orphan instances

1 instance