diff options
| author | Théo Zimmermann | 2020-05-13 20:10:14 +0200 |
|---|---|---|
| committer | Théo Zimmermann | 2020-05-13 20:10:14 +0200 |
| commit | 485c5a1590daaee61a4ca7801fd6de3ee7489e6c (patch) | |
| tree | 3e82956a0a4884890c81c7f922f2b458c5f27b21 | |
| parent | 91b5990e724acc863a5dba66acc33fd698ac26f0 (diff) | |
Extract Inductive types from CIC.
| -rw-r--r-- | doc/sphinx/language/cic.rst | 894 |
1 files changed, 0 insertions, 894 deletions
diff --git a/doc/sphinx/language/cic.rst b/doc/sphinx/language/cic.rst index b125d21a3c..678374e83e 100644 --- a/doc/sphinx/language/cic.rst +++ b/doc/sphinx/language/cic.rst @@ -1,734 +1,3 @@ -.. _calculusofinductiveconstructions: - - -Calculus of Inductive Constructions -==================================== - -The underlying formal language of |Coq| is a *Calculus of Inductive -Constructions* (|Cic|) whose inference rules are presented in this -chapter. The history of this formalism as well as pointers to related -work are provided in a separate chapter; see *Credits*. - - -.. _The-terms: - -The terms -------------- - -The expressions of the |Cic| are *terms* and all terms have a *type*. -There are types for functions (or programs), there are atomic types -(especially datatypes)... but also types for proofs and types for the -types themselves. Especially, any object handled in the formalism must -belong to a type. For instance, universal quantification is relative -to a type and takes the form “*for all x of type* :math:`T`, :math:`P`”. The expression -“:math:`x` *of type* :math:`T`” is written “:math:`x:T`”. Informally, “:math:`x:T`” can be thought as -“:math:`x` *belongs to* :math:`T`”. - -The types of types are called :gdef:`sort`\s. Types and sorts are themselves terms -so that terms, types and sorts are all components of a common -syntactic language of terms which is described in Section :ref:`terms`. But -first, we describe sorts. - - -.. _Sorts: - -Sorts -~~~~~~~~~~~ - -All sorts have a type and there is an infinite well-founded typing -hierarchy of sorts whose base sorts are :math:`\SProp`, :math:`\Prop` -and :math:`\Set`. - -The sort :math:`\Prop` intends to be the type of logical propositions. If :math:`M` is a -logical proposition then it denotes the class of terms representing -proofs of :math:`M`. An object :math:`m` belonging to :math:`M` witnesses the fact that :math:`M` is -provable. An object of type :math:`\Prop` is called a proposition. - -The sort :math:`\SProp` is like :math:`\Prop` but the propositions in -:math:`\SProp` are known to have irrelevant proofs (all proofs are -equal). Objects of type :math:`\SProp` are called strict propositions. -See :ref:`sprop` for information about using -:math:`\SProp`, and :cite:`Gilbert:POPL2019` for meta theoretical -considerations. - -The sort :math:`\Set` intends to be the type of small sets. This includes data -types such as booleans and naturals, but also products, subsets, and -function types over these data types. - -:math:`\SProp`, :math:`\Prop` and :math:`\Set` themselves can be manipulated as ordinary terms. -Consequently they also have a type. Because assuming simply that :math:`\Set` -has type :math:`\Set` leads to an inconsistent theory :cite:`Coq86`, the language of -|Cic| has infinitely many sorts. There are, in addition to the base sorts, -a hierarchy of universes :math:`\Type(i)` for any integer :math:`i ≥ 1`. - -Like :math:`\Set`, all of the sorts :math:`\Type(i)` contain small sets such as -booleans, natural numbers, as well as products, subsets and function -types over small sets. But, unlike :math:`\Set`, they also contain large sets, -namely the sorts :math:`\Set` and :math:`\Type(j)` for :math:`j<i`, and all products, subsets -and function types over these sorts. - -Formally, we call :math:`\Sort` the set of sorts which is defined by: - -.. math:: - - \Sort \equiv \{\SProp,\Prop,\Set,\Type(i)\;|\; i~∈ ℕ\} - -Their properties, such as: :math:`\Prop:\Type(1)`, :math:`\Set:\Type(1)`, and -:math:`\Type(i):\Type(i+1)`, are defined in Section :ref:`subtyping-rules`. - -The user does not have to mention explicitly the index :math:`i` when -referring to the universe :math:`\Type(i)`. One only writes :math:`\Type`. The system -itself generates for each instance of :math:`\Type` a new index for the -universe and checks that the constraints between these indexes can be -solved. From the user point of view we consequently have :math:`\Type:\Type`. We -shall make precise in the typing rules the constraints between the -indices. - - -.. _Implementation-issues: - -**Implementation issues** In practice, the Type hierarchy is -implemented using *algebraic -universes*. An algebraic universe :math:`u` is either a variable (a qualified -identifier with a number) or a successor of an algebraic universe (an -expression :math:`u+1`), or an upper bound of algebraic universes (an -expression :math:`\max(u_1 ,...,u_n )`), or the base universe (the expression -:math:`0`) which corresponds, in the arity of template polymorphic inductive -types (see Section -:ref:`well-formed-inductive-definitions`), -to the predicative sort :math:`\Set`. A graph of -constraints between the universe variables is maintained globally. To -ensure the existence of a mapping of the universes to the positive -integers, the graph of constraints must remain acyclic. Typing -expressions that violate the acyclicity of the graph of constraints -results in a Universe inconsistency error. - -.. seealso:: Section :ref:`printing-universes`. - - -.. _Terms: - -Terms -~~~~~ - - - -Terms are built from sorts, variables, constants, abstractions, -applications, local definitions, and products. From a syntactic point -of view, types cannot be distinguished from terms, except that they -cannot start by an abstraction or a constructor. More precisely the -language of the *Calculus of Inductive Constructions* is built from -the following rules. - - -#. the sorts :math:`\SProp`, :math:`\Prop`, :math:`\Set`, :math:`\Type(i)` are terms. -#. variables, hereafter ranged over by letters :math:`x`, :math:`y`, etc., are terms -#. constants, hereafter ranged over by letters :math:`c`, :math:`d`, etc., are terms. -#. if :math:`x` is a variable and :math:`T`, :math:`U` are terms then - :math:`∀ x:T,~U` (:g:`forall x:T, U` in |Coq| concrete syntax) is a term. - If :math:`x` occurs in :math:`U`, :math:`∀ x:T,~U` reads as - “for all :math:`x` of type :math:`T`, :math:`U`”. - As :math:`U` depends on :math:`x`, one says that :math:`∀ x:T,~U` is - a *dependent product*. If :math:`x` does not occur in :math:`U` then - :math:`∀ x:T,~U` reads as - “if :math:`T` then :math:`U`”. A *non dependent product* can be - written: :math:`T \rightarrow U`. -#. if :math:`x` is a variable and :math:`T`, :math:`u` are terms then - :math:`λ x:T .~u` (:g:`fun x:T => u` - in |Coq| concrete syntax) is a term. This is a notation for the - λ-abstraction of λ-calculus :cite:`Bar81`. The term :math:`λ x:T .~u` is a function - which maps elements of :math:`T` to the expression :math:`u`. -#. if :math:`t` and :math:`u` are terms then :math:`(t~u)` is a term - (:g:`t u` in |Coq| concrete - syntax). The term :math:`(t~u)` reads as “:math:`t` applied to :math:`u`”. -#. if :math:`x` is a variable, and :math:`t`, :math:`T` and :math:`u` are - terms then :math:`\letin{x}{t:T}{u}` is - a term which denotes the term :math:`u` where the variable :math:`x` is locally bound - to :math:`t` of type :math:`T`. This stands for the common “let-in” construction of - functional programs such as ML or Scheme. - - - -.. _Free-variables: - -**Free variables.** -The notion of free variables is defined as usual. In the expressions -:math:`λx:T.~U` and :math:`∀ x:T,~U` the occurrences of :math:`x` in :math:`U` are bound. - - -.. _Substitution: - -**Substitution.** -The notion of substituting a term :math:`t` to free occurrences of a variable -:math:`x` in a term :math:`u` is defined as usual. The resulting term is written -:math:`\subst{u}{x}{t}`. - - -.. _The-logical-vs-programming-readings: - -**The logical vs programming readings.** -The constructions of the |Cic| can be used to express both logical and -programming notions, accordingly to the Curry-Howard correspondence -between proofs and programs, and between propositions and types -:cite:`Cur58,How80,Bru72`. - -For instance, let us assume that :math:`\nat` is the type of natural numbers -with zero element written :math:`0` and that :g:`True` is the always true -proposition. Then :math:`→` is used both to denote :math:`\nat→\nat` which is the type -of functions from :math:`\nat` to :math:`\nat`, to denote True→True which is an -implicative proposition, to denote :math:`\nat →\Prop` which is the type of -unary predicates over the natural numbers, etc. - -Let us assume that ``mult`` is a function of type :math:`\nat→\nat→\nat` and ``eqnat`` a -predicate of type :math:`\nat→\nat→ \Prop`. The λ-abstraction can serve to build -“ordinary” functions as in :math:`λ x:\nat.~(\kw{mult}~x~x)` (i.e. -:g:`fun x:nat => mult x x` -in |Coq| notation) but may build also predicates over the natural -numbers. For instance :math:`λ x:\nat.~(\kw{eqnat}~x~0)` -(i.e. :g:`fun x:nat => eqnat x 0` -in |Coq| notation) will represent the predicate of one variable :math:`x` which -asserts the equality of :math:`x` with :math:`0`. This predicate has type -:math:`\nat → \Prop` -and it can be applied to any expression of type :math:`\nat`, say :math:`t`, to give an -object :math:`P~t` of type :math:`\Prop`, namely a proposition. - -Furthermore :g:`forall x:nat, P x` will represent the type of functions -which associate to each natural number :math:`n` an object of type :math:`(P~n)` and -consequently represent the type of proofs of the formula “:math:`∀ x.~P(x)`”. - - -.. _Typing-rules: - -Typing rules ----------------- - -As objects of type theory, terms are subjected to *type discipline*. -The well typing of a term depends on a global environment and a local -context. - - -.. _Local-context: - -**Local context.** -A *local context* is an ordered list of *local declarations* of names -which we call *variables*. The declaration of some variable :math:`x` is -either a *local assumption*, written :math:`x:T` (:math:`T` is a type) or a *local -definition*, written :math:`x:=t:T`. We use brackets to write local contexts. -A typical example is :math:`[x:T;~y:=u:U;~z:V]`. Notice that the variables -declared in a local context must be distinct. If :math:`Γ` is a local context -that declares some :math:`x`, we -write :math:`x ∈ Γ`. By writing :math:`(x:T) ∈ Γ` we mean that either :math:`x:T` is an -assumption in :math:`Γ` or that there exists some :math:`t` such that :math:`x:=t:T` is a -definition in :math:`Γ`. If :math:`Γ` defines some :math:`x:=t:T`, we also write :math:`(x:=t:T) ∈ Γ`. -For the rest of the chapter, :math:`Γ::(y:T)` denotes the local context :math:`Γ` -enriched with the local assumption :math:`y:T`. Similarly, :math:`Γ::(y:=t:T)` denotes -the local context :math:`Γ` enriched with the local definition :math:`(y:=t:T)`. The -notation :math:`[]` denotes the empty local context. By :math:`Γ_1 ; Γ_2` we mean -concatenation of the local context :math:`Γ_1` and the local context :math:`Γ_2`. - - -.. _Global-environment: - -**Global environment.** -A *global environment* is an ordered list of *global declarations*. -Global declarations are either *global assumptions* or *global -definitions*, but also declarations of inductive objects. Inductive -objects themselves declare both inductive or coinductive types and -constructors (see Section :ref:`inductive-definitions`). - -A *global assumption* will be represented in the global environment as -:math:`(c:T)` which assumes the name :math:`c` to be of some type :math:`T`. A *global -definition* will be represented in the global environment as :math:`c:=t:T` -which defines the name :math:`c` to have value :math:`t` and type :math:`T`. We shall call -such names *constants*. For the rest of the chapter, the :math:`E;~c:T` denotes -the global environment :math:`E` enriched with the global assumption :math:`c:T`. -Similarly, :math:`E;~c:=t:T` denotes the global environment :math:`E` enriched with the -global definition :math:`(c:=t:T)`. - -The rules for inductive definitions (see Section -:ref:`inductive-definitions`) have to be considered as assumption -rules to which the following definitions apply: if the name :math:`c` -is declared in :math:`E`, we write :math:`c ∈ E` and if :math:`c:T` or -:math:`c:=t:T` is declared in :math:`E`, we write :math:`(c : T) ∈ E`. - - -.. _Typing-rules2: - -**Typing rules.** -In the following, we define simultaneously two judgments. The first -one :math:`\WTEG{t}{T}` means the term :math:`t` is well-typed and has type :math:`T` in the -global environment :math:`E` and local context :math:`Γ`. The second judgment :math:`\WFE{Γ}` -means that the global environment :math:`E` is well-formed and the local -context :math:`Γ` is a valid local context in this global environment. - -A term :math:`t` is well typed in a global environment :math:`E` iff -there exists a local context :math:`\Gamma` and a term :math:`T` such -that the judgment :math:`\WTEG{t}{T}` can be derived from the -following rules. - -.. inference:: W-Empty - - --------- - \WF{[]}{} - -.. inference:: W-Local-Assum - - \WTEG{T}{s} - s \in \Sort - x \not\in \Gamma % \cup E - ------------------------- - \WFE{\Gamma::(x:T)} - -.. inference:: W-Local-Def - - \WTEG{t}{T} - x \not\in \Gamma % \cup E - ------------------------- - \WFE{\Gamma::(x:=t:T)} - -.. inference:: W-Global-Assum - - \WTE{}{T}{s} - s \in \Sort - c \notin E - ------------ - \WF{E;~c:T}{} - -.. inference:: W-Global-Def - - \WTE{}{t}{T} - c \notin E - --------------- - \WF{E;~c:=t:T}{} - -.. inference:: Ax-SProp - - \WFE{\Gamma} - ---------------------- - \WTEG{\SProp}{\Type(1)} - -.. inference:: Ax-Prop - - \WFE{\Gamma} - ---------------------- - \WTEG{\Prop}{\Type(1)} - -.. inference:: Ax-Set - - \WFE{\Gamma} - --------------------- - \WTEG{\Set}{\Type(1)} - -.. inference:: Ax-Type - - \WFE{\Gamma} - --------------------------- - \WTEG{\Type(i)}{\Type(i+1)} - -.. inference:: Var - - \WFE{\Gamma} - (x:T) \in \Gamma~~\mbox{or}~~(x:=t:T) \in \Gamma~\mbox{for some $t$} - -------------------------------------------------------------------- - \WTEG{x}{T} - -.. inference:: Const - - \WFE{\Gamma} - (c:T) \in E~~\mbox{or}~~(c:=t:T) \in E~\mbox{for some $t$} - ---------------------------------------------------------- - \WTEG{c}{T} - -.. inference:: Prod-SProp - - \WTEG{T}{s} - s \in {\Sort} - \WTE{\Gamma::(x:T)}{U}{\SProp} - ----------------------------- - \WTEG{\forall~x:T,U}{\SProp} - -.. inference:: Prod-Prop - - \WTEG{T}{s} - s \in \Sort - \WTE{\Gamma::(x:T)}{U}{\Prop} - ----------------------------- - \WTEG{∀ x:T,~U}{\Prop} - -.. inference:: Prod-Set - - \WTEG{T}{s} - s \in \{\SProp, \Prop, \Set\} - \WTE{\Gamma::(x:T)}{U}{\Set} - ---------------------------- - \WTEG{∀ x:T,~U}{\Set} - -.. inference:: Prod-Type - - \WTEG{T}{s} - s \in \{\SProp, \Type{i}\} - \WTE{\Gamma::(x:T)}{U}{\Type(i)} - -------------------------------- - \WTEG{∀ x:T,~U}{\Type(i)} - -.. inference:: Lam - - \WTEG{∀ x:T,~U}{s} - \WTE{\Gamma::(x:T)}{t}{U} - ------------------------------------ - \WTEG{λ x:T\mto t}{∀ x:T,~U} - -.. inference:: App - - \WTEG{t}{∀ x:U,~T} - \WTEG{u}{U} - ------------------------------ - \WTEG{(t\ u)}{\subst{T}{x}{u}} - -.. inference:: Let - - \WTEG{t}{T} - \WTE{\Gamma::(x:=t:T)}{u}{U} - ----------------------------------------- - \WTEG{\letin{x}{t:T}{u}}{\subst{U}{x}{t}} - - - -.. note:: - - **Prod-Prop** and **Prod-Set** typing-rules make sense if we consider the - semantic difference between :math:`\Prop` and :math:`\Set`: - - + All values of a type that has a sort :math:`\Set` are extractable. - + No values of a type that has a sort :math:`\Prop` are extractable. - - - -.. note:: - We may have :math:`\letin{x}{t:T}{u}` well-typed without having - :math:`((λ x:T.~u)~t)` well-typed (where :math:`T` is a type of - :math:`t`). This is because the value :math:`t` associated to - :math:`x` may be used in a conversion rule - (see Section :ref:`Conversion-rules`). - - -.. _Conversion-rules: - -Conversion rules --------------------- - -In |Cic|, there is an internal reduction mechanism. In particular, it -can decide if two programs are *intentionally* equal (one says -*convertible*). Convertibility is described in this section. - - -.. _beta-reduction: - -β-reduction -~~~~~~~~~~~ - -We want to be able to identify some terms as we can identify the -application of a function to a given argument with its result. For -instance the identity function over a given type :math:`T` can be written -:math:`λx:T.~x`. In any global environment :math:`E` and local context -:math:`Γ`, we want to identify any object :math:`a` (of type -:math:`T`) with the application :math:`((λ x:T.~x)~a)`. We define for -this a *reduction* (or a *conversion*) rule we call :math:`β`: - -.. math:: - - E[Γ] ⊢ ((λx:T.~t)~u)~\triangleright_β~\subst{t}{x}{u} - -We say that :math:`\subst{t}{x}{u}` is the *β-contraction* of -:math:`((λx:T.~t)~u)` and, conversely, that :math:`((λ x:T.~t)~u)` is the -*β-expansion* of :math:`\subst{t}{x}{u}`. - -According to β-reduction, terms of the *Calculus of Inductive -Constructions* enjoy some fundamental properties such as confluence, -strong normalization, subject reduction. These results are -theoretically of great importance but we will not detail them here and -refer the interested reader to :cite:`Coq85`. - - -.. _iota-reduction: - -ι-reduction -~~~~~~~~~~~ - -A specific conversion rule is associated to the inductive objects in -the global environment. We shall give later on (see Section -:ref:`Well-formed-inductive-definitions`) the precise rules but it -just says that a destructor applied to an object built from a -constructor behaves as expected. This reduction is called ι-reduction -and is more precisely studied in :cite:`Moh93,Wer94`. - - -.. _delta-reduction: - -δ-reduction -~~~~~~~~~~~ - -We may have variables defined in local contexts or constants defined -in the global environment. It is legal to identify such a reference -with its value, that is to expand (or unfold) it into its value. This -reduction is called δ-reduction and shows as follows. - -.. inference:: Delta-Local - - \WFE{\Gamma} - (x:=t:T) ∈ Γ - -------------- - E[Γ] ⊢ x~\triangleright_Δ~t - -.. inference:: Delta-Global - - \WFE{\Gamma} - (c:=t:T) ∈ E - -------------- - E[Γ] ⊢ c~\triangleright_δ~t - - -.. _zeta-reduction: - -ζ-reduction -~~~~~~~~~~~ - -|Coq| allows also to remove local definitions occurring in terms by -replacing the defined variable by its value. The declaration being -destroyed, this reduction differs from δ-reduction. It is called -ζ-reduction and shows as follows. - -.. inference:: Zeta - - \WFE{\Gamma} - \WTEG{u}{U} - \WTE{\Gamma::(x:=u:U)}{t}{T} - -------------- - E[Γ] ⊢ \letin{x}{u:U}{t}~\triangleright_ζ~\subst{t}{x}{u} - - -.. _eta-expansion: - -η-expansion -~~~~~~~~~~~ - -Another important concept is η-expansion. It is legal to identify any -term :math:`t` of functional type :math:`∀ x:T,~U` with its so-called η-expansion - -.. math:: - λx:T.~(t~x) - -for :math:`x` an arbitrary variable name fresh in :math:`t`. - - -.. note:: - - We deliberately do not define η-reduction: - - .. math:: - λ x:T.~(t~x)~\not\triangleright_η~t - - This is because, in general, the type of :math:`t` need not to be convertible - to the type of :math:`λ x:T.~(t~x)`. E.g., if we take :math:`f` such that: - - .. math:: - f ~:~ ∀ x:\Type(2),~\Type(1) - - then - - .. math:: - λ x:\Type(1).~(f~x) ~:~ ∀ x:\Type(1),~\Type(1) - - We could not allow - - .. math:: - λ x:\Type(1).~(f~x) ~\triangleright_η~ f - - because the type of the reduced term :math:`∀ x:\Type(2),~\Type(1)` would not be - convertible to the type of the original term :math:`∀ x:\Type(1),~\Type(1)`. - -.. _proof-irrelevance: - -Proof Irrelevance -~~~~~~~~~~~~~~~~~ - -It is legal to identify any two terms whose common type is a strict -proposition :math:`A : \SProp`. Terms in a strict propositions are -therefore called *irrelevant*. - -.. _convertibility: - -Convertibility -~~~~~~~~~~~~~~ - -Let us write :math:`E[Γ] ⊢ t \triangleright u` for the contextual closure of the -relation :math:`t` reduces to :math:`u` in the global environment -:math:`E` and local context :math:`Γ` with one of the previous -reductions β, δ, ι or ζ. - -We say that two terms :math:`t_1` and :math:`t_2` are -*βδιζη-convertible*, or simply *convertible*, or *equivalent*, in the -global environment :math:`E` and local context :math:`Γ` iff there -exist terms :math:`u_1` and :math:`u_2` such that :math:`E[Γ] ⊢ t_1 \triangleright -… \triangleright u_1` and :math:`E[Γ] ⊢ t_2 \triangleright … \triangleright u_2` and either :math:`u_1` and -:math:`u_2` are identical up to irrelevant subterms, or they are convertible up to η-expansion, -i.e. :math:`u_1` is :math:`λ x:T.~u_1'` and :math:`u_2 x` is -recursively convertible to :math:`u_1'`, or, symmetrically, -:math:`u_2` is :math:`λx:T.~u_2'` -and :math:`u_1 x` is recursively convertible to :math:`u_2'`. We then write -:math:`E[Γ] ⊢ t_1 =_{βδιζη} t_2`. - -Apart from this we consider two instances of polymorphic and -cumulative (see Chapter :ref:`polymorphicuniverses`) inductive types -(see below) convertible - -.. math:: - E[Γ] ⊢ t~w_1 … w_m =_{βδιζη} t~w_1' … w_m' - -if we have subtypings (see below) in both directions, i.e., - -.. math:: - E[Γ] ⊢ t~w_1 … w_m ≤_{βδιζη} t~w_1' … w_m' - -and - -.. math:: - E[Γ] ⊢ t~w_1' … w_m' ≤_{βδιζη} t~w_1 … w_m. - -Furthermore, we consider - -.. math:: - E[Γ] ⊢ c~v_1 … v_m =_{βδιζη} c'~v_1' … v_m' - -convertible if - -.. math:: - E[Γ] ⊢ v_i =_{βδιζη} v_i' - -and we have that :math:`c` and :math:`c'` -are the same constructors of different instances of the same inductive -types (differing only in universe levels) such that - -.. math:: - E[Γ] ⊢ c~v_1 … v_m : t~w_1 … w_m - -and - -.. math:: - E[Γ] ⊢ c'~v_1' … v_m' : t'~ w_1' … w_m ' - -and we have - -.. math:: - E[Γ] ⊢ t~w_1 … w_m =_{βδιζη} t~w_1' … w_m'. - -The convertibility relation allows introducing a new typing rule which -says that two convertible well-formed types have the same inhabitants. - - -.. _subtyping-rules: - -Subtyping rules -------------------- - -At the moment, we did not take into account one rule between universes -which says that any term in a universe of index :math:`i` is also a term in -the universe of index :math:`i+1` (this is the *cumulativity* rule of |Cic|). -This property extends the equivalence relation of convertibility into -a *subtyping* relation inductively defined by: - - -#. if :math:`E[Γ] ⊢ t =_{βδιζη} u` then :math:`E[Γ] ⊢ t ≤_{βδιζη} u`, -#. if :math:`i ≤ j` then :math:`E[Γ] ⊢ \Type(i) ≤_{βδιζη} \Type(j)`, -#. for any :math:`i`, :math:`E[Γ] ⊢ \Set ≤_{βδιζη} \Type(i)`, -#. :math:`E[Γ] ⊢ \Prop ≤_{βδιζη} \Set`, hence, by transitivity, - :math:`E[Γ] ⊢ \Prop ≤_{βδιζη} \Type(i)`, for any :math:`i` - (note: :math:`\SProp` is not related by cumulativity to any other term) -#. if :math:`E[Γ] ⊢ T =_{βδιζη} U` and - :math:`E[Γ::(x:T)] ⊢ T' ≤_{βδιζη} U'` then - :math:`E[Γ] ⊢ ∀x:T,~T′ ≤_{βδιζη} ∀ x:U,~U′`. -#. if :math:`\ind{p}{Γ_I}{Γ_C}` is a universe polymorphic and cumulative - (see Chapter :ref:`polymorphicuniverses`) inductive type (see below) - and - :math:`(t : ∀Γ_P ,∀Γ_{\mathit{Arr}(t)}, S)∈Γ_I` - and - :math:`(t' : ∀Γ_P' ,∀Γ_{\mathit{Arr}(t)}', S')∈Γ_I` - are two different instances of *the same* inductive type (differing only in - universe levels) with constructors - - .. math:: - [c_1 : ∀Γ_P ,∀ T_{1,1} … T_{1,n_1} ,~t~v_{1,1} … v_{1,m} ;~…;~ - c_k : ∀Γ_P ,∀ T_{k,1} … T_{k,n_k} ,~t~v_{k,1} … v_{k,m} ] - - and - - .. math:: - [c_1 : ∀Γ_P' ,∀ T_{1,1}' … T_{1,n_1}' ,~t'~v_{1,1}' … v_{1,m}' ;~…;~ - c_k : ∀Γ_P' ,∀ T_{k,1}' … T_{k,n_k}' ,~t'~v_{k,1}' … v_{k,m}' ] - - respectively then - - .. math:: - E[Γ] ⊢ t~w_1 … w_m ≤_{βδιζη} t'~w_1' … w_m' - - (notice that :math:`t` and :math:`t'` are both - fully applied, i.e., they have a sort as a type) if - - .. math:: - E[Γ] ⊢ w_i =_{βδιζη} w_i' - - for :math:`1 ≤ i ≤ m` and we have - - - .. math:: - E[Γ] ⊢ T_{i,j} ≤_{βδιζη} T_{i,j}' - - and - - .. math:: - E[Γ] ⊢ A_i ≤_{βδιζη} A_i' - - where :math:`Γ_{\mathit{Arr}(t)} = [a_1 : A_1 ;~ … ;~a_l : A_l ]` and - :math:`Γ_{\mathit{Arr}(t)}' = [a_1 : A_1';~ … ;~a_l : A_l']`. - - -The conversion rule up to subtyping is now exactly: - -.. inference:: Conv - - E[Γ] ⊢ U : s - E[Γ] ⊢ t : T - E[Γ] ⊢ T ≤_{βδιζη} U - -------------- - E[Γ] ⊢ t : U - - -.. _Normal-form: - -**Normal form**. A term which cannot be any more reduced is said to be in *normal -form*. There are several ways (or strategies) to apply the reduction -rules. Among them, we have to mention the *head reduction* which will -play an important role (see Chapter :ref:`tactics`). Any term :math:`t` can be written as -:math:`λ x_1 :T_1 .~… λ x_k :T_k .~(t_0~t_1 … t_n )` where :math:`t_0` is not an -application. We say then that :math:`t_0` is the *head of* :math:`t`. If we assume -that :math:`t_0` is :math:`λ x:T.~u_0` then one step of β-head reduction of :math:`t` is: - -.. math:: - λ x_1 :T_1 .~… λ x_k :T_k .~(λ x:T.~u_0~t_1 … t_n ) ~\triangleright~ - λ (x_1 :T_1 )…(x_k :T_k ).~(\subst{u_0}{x}{t_1}~t_2 … t_n ) - -Iterating the process of head reduction until the head of the reduced -term is no more an abstraction leads to the *β-head normal form* of :math:`t`: - -.. math:: - t \triangleright … \triangleright λ x_1 :T_1 .~…λ x_k :T_k .~(v~u_1 … u_m ) - -where :math:`v` is not an abstraction (nor an application). Note that the head -normal form must not be confused with the normal form since some :math:`u_i` -can be reducible. Similar notions of head-normal forms involving δ, ι -and ζ reductions or any combination of those can also be defined. - - .. _inductive-definitions: Inductive Definitions @@ -1939,166 +1208,3 @@ possible: The principles of mutual induction can be automatically generated using the Scheme command described in Section :ref:`proofschemes-induction-principles`. - - -.. _Admissible-rules-for-global-environments: - -Admissible rules for global environments --------------------------------------------- - -From the original rules of the type system, one can show the -admissibility of rules which change the local context of definition of -objects in the global environment. We show here the admissible rules -that are used in the discharge mechanism at the end of a section. - - -.. _Abstraction: - -**Abstraction.** -One can modify a global declaration by generalizing it over a -previously assumed constant :math:`c`. For doing that, we need to modify the -reference to the global declaration in the subsequent global -environment and local context by explicitly applying this constant to -the constant :math:`c`. - -Below, if :math:`Γ` is a context of the form :math:`[y_1 :A_1 ;~…;~y_n :A_n]`, we write -:math:`∀x:U,~\subst{Γ}{c}{x}` to mean -:math:`[y_1 :∀ x:U,~\subst{A_1}{c}{x};~…;~y_n :∀ x:U,~\subst{A_n}{c}{x}]` -and :math:`\subst{E}{|Γ|}{|Γ|c}` to mean the parallel substitution -:math:`E\{y_1 /(y_1~c)\}…\{y_n/(y_n~c)\}`. - - -.. _First-abstracting-property: - -**First abstracting property:** - -.. math:: - \frac{\WF{E;~c:U;~E′;~c′:=t:T;~E″}{Γ}} - {\WF{E;~c:U;~E′;~c′:=λ x:U.~\subst{t}{c}{x}:∀x:U,~\subst{T}{c}{x};~\subst{E″}{c′}{(c′~c)}} - {\subst{Γ}{c′}{(c′~c)}}} - - -.. math:: - \frac{\WF{E;~c:U;~E′;~c′:T;~E″}{Γ}} - {\WF{E;~c:U;~E′;~c′:∀ x:U,~\subst{T}{c}{x};~\subst{E″}{c′}{(c′~c)}}{\subst{Γ}{c′}{(c′~c)}}} - -.. math:: - \frac{\WF{E;~c:U;~E′;~\ind{p}{Γ_I}{Γ_C};~E″}{Γ}} - {\WFTWOLINES{E;~c:U;~E′;~\ind{p+1}{∀ x:U,~\subst{Γ_I}{c}{x}}{∀ x:U,~\subst{Γ_C}{c}{x}};~ - \subst{E″}{|Γ_I ;Γ_C |}{|Γ_I ;Γ_C | c}} - {\subst{Γ}{|Γ_I ;Γ_C|}{|Γ_I ;Γ_C | c}}} - -One can similarly modify a global declaration by generalizing it over -a previously defined constant :math:`c`. Below, if :math:`Γ` is a context of the form -:math:`[y_1 :A_1 ;~…;~y_n :A_n]`, we write :math:`\subst{Γ}{c}{u}` to mean -:math:`[y_1 :\subst{A_1} {c}{u};~…;~y_n:\subst{A_n} {c}{u}]`. - - -.. _Second-abstracting-property: - -**Second abstracting property:** - -.. math:: - \frac{\WF{E;~c:=u:U;~E′;~c′:=t:T;~E″}{Γ}} - {\WF{E;~c:=u:U;~E′;~c′:=(\letin{x}{u:U}{\subst{t}{c}{x}}):\subst{T}{c}{u};~E″}{Γ}} - -.. math:: - \frac{\WF{E;~c:=u:U;~E′;~c′:T;~E″}{Γ}} - {\WF{E;~c:=u:U;~E′;~c′:\subst{T}{c}{u};~E″}{Γ}} - -.. math:: - \frac{\WF{E;~c:=u:U;~E′;~\ind{p}{Γ_I}{Γ_C};~E″}{Γ}} - {\WF{E;~c:=u:U;~E′;~\ind{p}{\subst{Γ_I}{c}{u}}{\subst{Γ_C}{c}{u}};~E″}{Γ}} - -.. _Pruning-the-local-context: - -**Pruning the local context.** -If one abstracts or substitutes constants with the above rules then it -may happen that some declared or defined constant does not occur any -more in the subsequent global environment and in the local context. -One can consequently derive the following property. - - -.. _First-pruning-property: - -.. inference:: First pruning property: - - \WF{E;~c:U;~E′}{Γ} - c~\kw{does not occur in}~E′~\kw{and}~Γ - -------------------------------------- - \WF{E;E′}{Γ} - - -.. _Second-pruning-property: - -.. inference:: Second pruning property: - - \WF{E;~c:=u:U;~E′}{Γ} - c~\kw{does not occur in}~E′~\kw{and}~Γ - -------------------------------------- - \WF{E;E′}{Γ} - - -.. _Co-inductive-types: - -Co-inductive types ----------------------- - -The implementation contains also co-inductive definitions, which are -types inhabited by infinite objects. More information on co-inductive -definitions can be found in :cite:`Gimenez95b,Gim98,GimCas05`. - - -.. _The-Calculus-of-Inductive-Construction-with-impredicative-Set: - -The Calculus of Inductive Constructions with impredicative Set ------------------------------------------------------------------ - -|Coq| can be used as a type checker for the Calculus of Inductive -Constructions with an impredicative sort :math:`\Set` by using the compiler -option ``-impredicative-set``. For example, using the ordinary `coqtop` -command, the following is rejected, - -.. example:: - - .. coqtop:: all - - Fail Definition id: Set := forall X:Set,X->X. - -while it will type check, if one uses instead the `coqtop` -``-impredicative-set`` option.. - -The major change in the theory concerns the rule for product formation -in the sort :math:`\Set`, which is extended to a domain in any sort: - -.. inference:: ProdImp - - E[Γ] ⊢ T : s - s ∈ \Sort - E[Γ::(x:T)] ⊢ U : \Set - --------------------- - E[Γ] ⊢ ∀ x:T,~U : \Set - -This extension has consequences on the inductive definitions which are -allowed. In the impredicative system, one can build so-called *large -inductive definitions* like the example of second-order existential -quantifier (:g:`exSet`). - -There should be restrictions on the eliminations which can be -performed on such definitions. The elimination rules in the -impredicative system for sort :math:`\Set` become: - - - -.. inference:: Set1 - - s ∈ \{\Prop, \Set\} - ----------------- - [I:\Set|I→ s] - -.. inference:: Set2 - - I~\kw{is a small inductive definition} - s ∈ \{\Type(i)\} - ---------------- - [I:\Set|I→ s] |
