Mikan
Safe HaskellNone
LanguageHaskell2010

Mikan.TypeChecking.Telescope

Contents

Synopsis

Documentation

flattenTel :: TermSubst a => Tele (Dom a) -> [Dom a] Source #

Flatten telescope: (Γ : Tel) -> [Type Γ].

flattenTel is lazy in both the spine and values of the resulting list.

flattenRevTel :: TermSubst a => Tele (Dom a) -> [Dom a] Source #

Flatten telescope: (Γ : Tel) -> [Type Γ] into a reversed list.

flattenRevTel is lazy in both the spine and values of the resulting list.

flattenContext :: Context -> [ContextEntry] Source #

Turn a context into a flat telescope: all entries live in the whole context. (Γ : Context) -> [Type Γ]

reorderTel :: [Dom Type] -> Maybe Permutation Source #

Order a flattened telescope in the correct dependency order: Γ -> Permutation (Γ -> Γ~)

Since reorderTel tel uses free variable analysis of type in tel, the telescope should be normalised.

unflattenTel :: [ArgName] -> [Dom Type] -> Telescope Source #

Unflatten: turns a flattened telescope into a proper telescope. Must be properly ordered.

unflattenTel' :: Int -> [ArgName] -> [Dom Type] -> Telescope Source #

A variant of unflattenTel which takes the size of the last argument as an argument.

renameTel :: [Maybe ArgName] -> Telescope -> Telescope Source #

Rename the variables in the telescope to the given names Precondition: size xs == size tel.

teleNames :: Telescope -> [ArgName] Source #

Get the suggested names from a telescope

teleArgs :: DeBruijn a => Tele (Dom t) -> [Arg a] Source #

Convert a telescope to a list of Arg in left-to-right order:

teleArgs ((a : A) (b : B a) {c : C}) = [a, b, {c}] = [2, 1, {0}]

teleDoms :: DeBruijn a => Tele (Dom t) -> [Dom a] Source #

Convert a telescope to a list of Dom in left-to-right order:

teleDoms ((a : A) (b : B a) {c : C}) = [a, b, {c}] = [2, 1, {0}]

tele2NamedArgs :: DeBruijn a => Telescope -> Telescope -> [NamedArg a] Source #

A variant of teleNamedArgs which takes the argument names (and the argument info) from the first telescope and the variable names from the second telescope.

Precondition: the two telescopes have the same length.

splitTelescopeAt :: Int -> Telescope -> (Telescope, Telescope) Source #

Split the telescope at the specified position.

takeTelescope :: Int -> Telescope -> Telescope Source #

Take the first n elements off of a telescope.

dropEndTelescope :: Int -> Telescope -> Telescope Source #

Drop the last n elements off of a telescope.

This is strict in the spine of the telescope.

permuteTel :: Permutation -> Telescope -> Telescope Source #

Permute telescope: permutes or drops the types in the telescope according to the given permutation (on de Bruijn _levels_). Assumes that the permutation preserves the dependencies in the telescope.

For example (Andreas, 2016-12-18, issue #2344): tel = (A : Type) (X : _18 A) (i : Fin (_m_23 A X)) tel (de Bruijn) = 2:Type, 1:_18 0, 0:Fin(_m_23 1 0) flattenTel tel = 2:Type, 1:_18 0, 0:Fin(_m_23 1 0) |- [ Type, _18 2, Fin (_m_23 2 1) ] perm = 0,1,2 -> 0,1 (picks the first two) renaming _ perm = [var 0, var 1, error] -- THE WRONG RENAMING! (levels) renaming _ (reverseP perm) = [error, var 0, var 1] -- The correct renaming! (indices) apply to flattened tel = ... |- [ Type, _18 1, Fin (_m_23 1 0) ] permute perm it = ... |- [ Type, _18 1 ] unflatten (de Bruijn) = 1:Type, 0: _18 0 unflatten = (A : Type) (X : _18 A)

permuteContext :: Permutation -> Context -> Telescope Source #

Like permuteTel, but start with a context.

varDependencies :: Telescope -> VarSet -> VarSet Source #

Recursively computes dependencies of a set of variables in a given telescope. Any dependencies outside of the telescope are ignored.

Note that varDependencies considers a variable to depend on itself.

varDependents :: Telescope -> VarSet -> VarSet Source #

Computes the set of variables in a telescope whose type depend on one of the variables in the given set (including recursive dependencies). Any dependencies outside of the telescope are ignored.

Unlike varDependencies, a variable is *not* considered to depend on itself.

data SplitTel Source #

A telescope split in two.

Constructors

SplitTel 

Fields

splitTelescope Source #

Arguments

:: VarSet

A set of de Bruijn indices.

-> Int

The first k variables are always included in the first part.

-> Telescope

Original telescope.

-> SplitTel

firstPart mentions the given variables, secondPart not.

Split a telescope into the part that defines the given variables and the part that doesn't.

See prop_splitTelescope.

splitTelescopeExact Source #

Arguments

:: [Int]

A list of de Bruijn indices

-> Telescope

The telescope to split

-> Maybe SplitTel

firstPart mentions the given variables in the given order, secondPart contains all other variables

As splitTelescope, but fails if any additional variables or reordering would be needed to make the first part well-typed.

instantiateTelescope Source #

Arguments

:: Telescope

⊢ Γ

-> Int

Γ ⊢ var k : A de Bruijn _level_

-> DeBruijnPattern

Γ ⊢ u : A

-> Maybe (Telescope, PatternSubstitution, Permutation) 

Try to instantiate one variable in the telescope (given by its de Bruijn level) with the given value, returning the new telescope and a substitution to the old one. Returns Nothing if the given value depends (directly or indirectly) on the variable.

expandTelescopeVar :: Telescope -> Int -> Telescope -> ConHead -> (Telescope, PatternSubstitution) Source #

Try to eta-expand one variable in the telescope (given by its de Bruijn level)

telView :: (MonadReduce m, MonadAddContext m) => Type -> m TelView Source #

Gather leading Πs of a type in a telescope.

telViewUpTo :: (MonadReduce m, MonadAddContext m) => Int -> Type -> m TelView Source #

telViewUpTo n t takes off the first n function types of t. Takes off all if n < 0.

telViewUpTo' :: (MonadReduce m, MonadAddContext m) => Int -> (Dom Type -> Bool) -> Type -> m TelView Source #

telViewUpTo' n p t takes off $t$ the first n (or arbitrary many if n < 0) function domains as long as they satify p.

telViewUpToPath :: PureTCM m => Int -> Type -> m TelView Source #

telViewUpToPath n t takes off t the first n (or arbitrary many if n < 0) function domains or Path types.

telViewUpToPath n t = fst $ telViewUpToPathBoundary' n t

newtype Boundary' x a Source #

Boundary conditions [[ (i,(x,y)) ]] = [(i=0) -> x, (i=1) -> y]. For instance, if p : Path A a b, then p i has boundary condition (i,(a,b)). We call i the dimension and (x,y) its boundary.

Constructors

Boundary 

Fields

Instances

Instances details
Subst Boundary Source #

Substitution into a Boundary a priori creates a TmBoundary which we convert back via varBoundary. A priori, this is a partial operation.

Instance details

Defined in Mikan.TypeChecking.Telescope

Associated Types

type SubstArg Boundary 
Instance details

Defined in Mikan.TypeChecking.Telescope

Subst TmBoundary Source # 
Instance details

Defined in Mikan.TypeChecking.Telescope

Associated Types

type SubstArg TmBoundary 
Instance details

Defined in Mikan.TypeChecking.Telescope

(Pretty x, Pretty a) => Pretty (Boundary' x a) Source # 
Instance details

Defined in Mikan.TypeChecking.Telescope

(PrettyTCM x, PrettyTCM a) => PrettyTCM (Boundary' x a) Source # 
Instance details

Defined in Mikan.TypeChecking.Pretty

Methods

prettyTCM :: MonadPretty m => Boundary' x a -> m Doc Source #

Null (Boundary' x a) Source # 
Instance details

Defined in Mikan.TypeChecking.Telescope

Methods

empty :: Boundary' x a Source #

null :: Boundary' x a -> Bool Source #

(Show x, Show a) => Show (Boundary' x a) Source # 
Instance details

Defined in Mikan.TypeChecking.Telescope

Methods

showsPrec :: Int -> Boundary' x a -> ShowS #

show :: Boundary' x a -> String #

showList :: [Boundary' x a] -> ShowS #

type SubstArg Boundary Source # 
Instance details

Defined in Mikan.TypeChecking.Telescope

type SubstArg TmBoundary Source # 
Instance details

Defined in Mikan.TypeChecking.Telescope

type Boundary = Boundary' Int Term Source #

Usually, the dimensions of a boundary condition are interval variables, represented by a de Bruijn index Int.

type TmBoundary = Boundary' Term Term Source #

Substitution formally creates dimensions that are interval expressions, represented by a Term. However, in practice these terms should be of the form var i.

tmBoundary :: Boundary' Int a -> Boundary' Term a Source #

Turn dimension variables i into dimension expressions var i.

varBoundary :: Boundary' Term a -> Boundary' Int a Source #

Turn dimension expressions into dimension variables. Formally this is a partial operation, but should only be called when the precondition is met.

Precondition: the dimension terms in the boundary are all of the form var i.

telViewUpToPathBoundary' :: PureTCM m => Int -> Type -> m (TelView, Boundary) Source #

Like telViewUpToPath but also returns the Boundary expected by the Path types encountered. The boundary terms live in the telescope given by the TelView. Each point of the boundary has the type of the codomain of the Path type it got taken from, see fullBoundary.

 (TelV Γ b, [(i,t_i,u_i)]) <- telViewUpToPathBoundary' n a
 Input:  Δ ⊢ a
 Output: Δ.Γ ⊢ b
         Δ.Γ ⊢ T is the codomain of the PathP at variable i
         Δ.Γ ⊢ i : I
         Δ.Γ ⊢ [ (i=0) -> t_i; (i=1) -> u_i ] : T

Useful to reconstruct IApplyP patterns after teleNamedArgs Γ.

telViewUpToPathBoundary :: PureTCM m => Int -> Type -> m (TelView, Boundary) Source #

(TelV Γ b, [(i,t_i,u_i)]) <- telViewUpToPathBoundary n a Input: Δ ⊢ a Output: ΔΓ ⊢ b ΔΓ ⊢ i : I ΔΓ ⊢ [ (i=0) -> t_i; (i=1) -> u_i ] : b

teleElims :: DeBruijn a => Telescope -> Boundary' Int a -> [Elim' a] Source #

teleElimsB args bs = es Input: Δ.Γ ⊢ args : Γ Δ.Γ ⊢ T is the codomain of the PathP at variable i Δ.Γ ⊢ i : I Δ.Γ ⊢ bs = [ (i=0) -> t_i; (i=1) -> u_i ] : T Output: Δ.Γ | PiPath Γ bs A ⊢ es : A

pathViewAsPi' :: PureTCM m => Type -> m (Either ((Dom Type, Abs Type), (Term, Term)) Type) Source #

Reduces Type.

piOrPath :: HasBuiltins m => Type -> m (Either (Dom Type, Abs Type) Type) Source #

Returns Left (a,b) in case the type is Pi a b or PathP b _ _. Assumes the Type is in whnf.

telView'UpToPath :: Int -> Type -> TCM TelView Source #

Assumes Type is in whnf.

ifPath :: PureTCM m => Type -> (Dom Type -> Abs Type -> m a) -> (Type -> m a) -> m a Source #

ifPathB :: PureTCM m => Type -> (Dom Type -> Abs Type -> m a) -> (Blocked Type -> m a) -> m a Source #

ifNotPathB :: PureTCM m => Type -> (Blocked Type -> m a) -> (Dom Type -> Abs Type -> m a) -> m a Source #

ifPiOrPathB :: PureTCM m => Type -> (Dom Type -> Abs Type -> m a) -> (Blocked Type -> m a) -> m a Source #

ifNotPiOrPathB :: PureTCM m => Type -> (Blocked Type -> m a) -> (Dom Type -> Abs Type -> m a) -> m a Source #

telePatterns' :: DeBruijn a => (forall a1. DeBruijn a1 => Telescope -> [NamedArg a1]) -> Telescope -> Boundary -> [NamedArg (Pattern' a)] Source #

mustBePi :: MonadReduce m => Type -> m (Dom Type, Abs Type) Source #

Decomposing a function type.

ifPi :: MonadReduce m => Term -> (Dom Type -> Abs Type -> m a) -> (Term -> m a) -> m a Source #

If the given type is a Pi, pass its parts to the first continuation. If not (or blocked), pass the reduced type to the second continuation.

ifPiB :: MonadReduce m => Term -> (Dom Type -> Abs Type -> m a) -> (Blocked Term -> m a) -> m a Source #

ifPiTypeB :: MonadReduce m => Type -> (Dom Type -> Abs Type -> m a) -> (Blocked Type -> m a) -> m a Source #

ifPiType :: MonadReduce m => Type -> (Dom Type -> Abs Type -> m a) -> (Type -> m a) -> m a Source #

If the given type is a Pi, pass its parts to the first continuation. If not (or blocked), pass the reduced type to the second continuation.

ifNotPi :: MonadReduce m => Term -> (Term -> m a) -> (Dom Type -> Abs Type -> m a) -> m a Source #

If the given type is blocked or not a Pi, pass it reduced to the first continuation. If it is a Pi, pass its parts to the second continuation.

ifNotPiType :: MonadReduce m => Type -> (Type -> m a) -> (Dom Type -> Abs Type -> m a) -> m a Source #

If the given type is blocked or not a Pi, pass it reduced to the first continuation. If it is a Pi, pass its parts to the second continuation.

ifNotPiOrPathType :: (MonadReduce tcm, HasBuiltins tcm) => Type -> (Type -> tcm a) -> (Dom Type -> Abs Type -> tcm a) -> tcm a Source #

piApplyM'' Source #

Arguments

:: (MonadReduce m, HasBuiltins m) 
=> m Empty

How to proceed if the type cannot be reduced to a Pi type

-> Type

The type to instantiate

-> [Term]

The arguments

-> m Type 

Instantiate a Type with a sequence of arguments, possibly reducing if the type is not manifestly a Pi.

This is a safe variant of piApply.

class PiApplyArgs a where Source #

A class for things (Arg, etc) that can be turned into a sequence of arguments for piApplyM'.

Methods

toPiArgs :: a -> [Term] Source #

Instances

Instances details
PiApplyArgs Term Source # 
Instance details

Defined in Mikan.TypeChecking.Telescope

Methods

toPiArgs :: Term -> [Term] Source #

PiApplyArgs a => PiApplyArgs (Arg a) Source # 
Instance details

Defined in Mikan.TypeChecking.Telescope

Methods

toPiArgs :: Arg a -> [Term] Source #

PiApplyArgs a => PiApplyArgs [a] Source # 
Instance details

Defined in Mikan.TypeChecking.Telescope

Methods

toPiArgs :: [a] -> [Term] Source #

PiApplyArgs a => PiApplyArgs (Named n a) Source # 
Instance details

Defined in Mikan.TypeChecking.Telescope

Methods

toPiArgs :: Named n a -> [Term] Source #

piApplyM' :: (MonadReduce m, HasBuiltins m, PiApplyArgs a) => m Empty -> Type -> a -> m Type Source #

A version of piApplyM'' generalised over the arguments to instantiate with.

piApplyM :: (MonadReduce m, HasBuiltins m, PiApplyArgs a) => Type -> a -> m Type Source #

A version of piApplyM'' generalised over the arguments to instantiate with, throwing an __IMPOSSIBLE__ error if there are leftover arguments and the type can not be reduced to a Pi type.

typeArity :: Type -> TCM Nat Source #

Compute type arity

foldrTelescopeM :: MonadAddContext m => (Dom (ArgName, Type) -> m b -> m b) -> m b -> Telescope -> m b Source #

Fold a telescope into a monadic computation, adding variables to the context at each step.

Teletypes

teleApply' Source #

Arguments

:: Teletype

The teletype to instantiate.

-> Args

The arguments.

-> (Telescope -> Type -> a)

How to handle running out of arguments.

-> (Type -> Args -> a)

How to handle running out of quantifiers.

-> a 

Instantiate a Teletype with some Args, attempting to produce a Type.

Takes continuations for whether we ran out of arguments with leftover quantification, or out of quantifiers with leftover arguments. Note that, unlike teleView, the Type given to the "out of arguments" continuation may include leading Pis.

teleApplyM Source #

Arguments

:: (HasBuiltins m, MonadReduce m) 
=> m Empty

How to error if there are leftover arguments and the "core" of the teletype does not compute to a function type.

-> Teletype

The teletype to instantiate.

-> Args

The arguments.

-> m Type 

Instantiate a Teletype with some Args, handling leftover arguments by attempting reduction.

Leftover quantifiers are turned into dependent binders (Abs), as per telePi_.

teleApply :: HasCallStack => Teletype -> Args -> Type Source #

Instantiate a Teletype with some Args. Leftover quantifiers are turned into dependent binders (Abs), as per telePi_.

INVARIANT: the length of the arguments must not exceed the explicit quantification in the teletype. If this is not known, use the monadic teleApplyM instead.

teleView :: MonadReduce m => Teletype -> m TelView Source #

View a Teletype as a TelView, continuing into the "core" type if necessary.

Unlike unpackTeletype, this function will also move quantification in the "core" of the Teletype into the Telescope returned, as per telView.

teleType :: Telescope -> Type -> Teletype Source #

Quantify a Type over a Telescope, producing a Teletype.

If the type is a literal function type (as per telView'), these extra quantifiers are also moved into the Teletype.

teleCons :: Dom (ArgName, Type) -> Teletype -> Teletype Source #

Add a binding to the front of a Teletype.

teleViewUpToPathBoundary :: PureTCM m => Int -> Teletype -> m (TelView, Boundary) Source #

View a Teletype as a TelView, continuing into the "core" type if necessary, returning the expected boundaries of any path encountered along the way; a Teletype version of telViewUpToPathBoundary.

The Int parameter, n, controls the number of quantifiers that may be returned in the TelView. This means that if n is less than the size of the teletype, any quantifiers will be moved into the type part of the TelView.

This function is lazy in the Boundary, so it can be used even if computing the boundary is not necessary.