Agda-2.6.4.1: A dependently typed functional programming language and proof assistant
Safe HaskellNone
LanguageHaskell2010

Agda.TypeChecking.Irrelevance

Description

Compile-time irrelevance.

In type theory with compile-time irrelevance à la Pfenning (LiCS 2001), variables in the context are annotated with relevance attributes. @ Γ = r₁x₁:A₁, ..., rⱼxⱼ:Aⱼ To handle irrelevant projections, we also record the current relevance attribute in the judgement. For instance, this attribute is equal to to Irrelevant if we are in an irrelevant position, like an irrelevant argument. Γ ⊢r t : A Only relevant variables can be used: @

(Relevant x : A) ∈ Γ -------------------- Γ ⊢r x : A @ Irrelevant global declarations can only be used if r = Irrelevant@.

When we enter a r'-relevant function argument, we compose the r with r' and (left-)divide the attributes in the context by r'. @ Γ ⊢r t : (r' x : A) → B r' Γ ⊢(r'·r) u : A --------------------------------------------------------- Γ ⊢r t u : B[u/x] No surprises for abstraction: @

Γ, (r' x : A) ⊢r : B ----------------------------- Γ ⊢r λxt : (r' x : A) → B @@

This is different for runtime irrelevance (erasure) which is `flat', meaning that once one is in an irrelevant context, all new assumptions will be usable, since they are turned relevant once entering the context. See Conor McBride (WadlerFest 2016), for a type system in this spirit:

We use such a rule for runtime-irrelevance: @ Γ, (q q') x : A ⊢q t : B ------------------------------ Γ ⊢q λxt : (q' x : A) → B @

Conor's system is however set up differently, with a very different variable rule:

@@

(q x : A) ∈ Γ -------------- Γ ⊢q x : A

Γ, (q·p) x : A ⊢q t : B ----------------------------- Γ ⊢q λxt : (p x : A) → B

Γ ⊢q t : (p x : A) → B Γ' ⊢qp u : A ------------------------------------------------- Γ + Γ' ⊢q t u : B[u/x] @@

Synopsis

Documentation

class UsableRelevance a where Source #

Check whether something can be used in a position of the given relevance.

This is a substitute for double-checking that only makes sure relevances are correct. See issue #2640.

Used in unifier ( unifyStep Solution{}).

At the moment, this implements McBride-style irrelevance, where Pfenning-style would be the most accurate thing. However, these two notions only differ how they handle bound variables in a term. Here, we are only concerned in the free variables, used meta-variables, and used (irrelevant) definitions.

Instances

Instances details
UsableRelevance Level Source # 
Instance details

Defined in Agda.TypeChecking.Irrelevance

UsableRelevance PlusLevel Source # 
Instance details

Defined in Agda.TypeChecking.Irrelevance

UsableRelevance Sort Source # 
Instance details

Defined in Agda.TypeChecking.Irrelevance

UsableRelevance Term Source # 
Instance details

Defined in Agda.TypeChecking.Irrelevance

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

Defined in Agda.TypeChecking.Irrelevance

(Subst a, UsableRelevance a) => UsableRelevance (Abs a) Source # 
Instance details

Defined in Agda.TypeChecking.Irrelevance

UsableRelevance a => UsableRelevance (Dom a) Source # 
Instance details

Defined in Agda.TypeChecking.Irrelevance

UsableRelevance a => UsableRelevance (Type' a) Source # 
Instance details

Defined in Agda.TypeChecking.Irrelevance

UsableRelevance a => UsableRelevance (Elim' a) Source # 
Instance details

Defined in Agda.TypeChecking.Irrelevance

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

Defined in Agda.TypeChecking.Irrelevance

(UsableRelevance a, UsableRelevance b) => UsableRelevance (a, b) Source # 
Instance details

Defined in Agda.TypeChecking.Irrelevance

(UsableRelevance a, UsableRelevance b, UsableRelevance c) => UsableRelevance (a, b, c) Source # 
Instance details

Defined in Agda.TypeChecking.Irrelevance

class UsableModality a where Source #

Check whether something can be used in a position of the given modality.

This is a substitute for double-checking that only makes sure modalities are correct. See issue #2640.

Used in unifier ( unifyStep Solution{}).

This uses McBride-style modality checking. It does not differ from Pfenning-style if we are only interested in the modality of the free variables, used meta-variables, and used definitions.

Instances

Instances details
UsableModality Level Source # 
Instance details

Defined in Agda.TypeChecking.Irrelevance

UsableModality Sort Source # 
Instance details

Defined in Agda.TypeChecking.Irrelevance

UsableModality Term Source # 
Instance details

Defined in Agda.TypeChecking.Irrelevance

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

Defined in Agda.TypeChecking.Irrelevance

UsableModality a => UsableModality (Dom a) Source # 
Instance details

Defined in Agda.TypeChecking.Irrelevance

UsableRelevance a => UsableModality (Type' a) Source # 
Instance details

Defined in Agda.TypeChecking.Irrelevance

UsableModality a => UsableModality (Elim' a) Source # 
Instance details

Defined in Agda.TypeChecking.Irrelevance

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

Defined in Agda.TypeChecking.Irrelevance

(UsableModality a, UsableModality b) => UsableModality (a, b) Source # 
Instance details

Defined in Agda.TypeChecking.Irrelevance

Propositions

isPropM :: (LensSort a, PrettyTCM a, PureTCM m, MonadBlock m) => a -> m Bool Source #

Is a type a proposition? (Needs reduction.)

Fibrant types

isFibrant :: (LensSort a, PureTCM m, MonadBlock m) => a -> m Bool Source #

Is a type fibrant (i.e. Type, Prop)?

isCoFibrantSort :: (LensSort a, PureTCM m, MonadBlock m) => a -> m Bool Source #

Cofibrant types are those that could be the domain of a fibrant pi type. (Notion by C. Sattler).