Tout d'abord, pour réitérer l'un des points de cody, le calcul des constructions inductives (sur lequel le noyau de Coq est basé) est très différent du calcul des constructions. Il est préférable de commencer par la théorie des types de Martin-Löf avec des univers, puis d'ajouter un tri Prop au bas de la hiérarchie des types. Il s'agit d'une bête très différente du CoC d'origine, qui est mieux considérée comme une version dépendante du F-oméga. (Par exemple, CiC a des modèles de théorie des ensembles et pas le CoC.)
Cela dit, le lambda-cube (dont le CoC est membre) est généralement présenté comme un système de type pur pour des raisons d'économie dans le nombre de règles de typage. En traitant les tris, les types et les termes comme des éléments de la même catégorie syntaxique, vous pouvez écrire beaucoup moins de règles et vos preuves deviennent également un peu moins redondantes.
Cependant, pour la compréhension, il peut être utile de séparer explicitement les différentes catégories. Nous pouvons introduire trois catégories syntaxiques, les types ( classés par la métavariable k
), les types (classés par la métavariable A
) et les termes (classés par la métavariable e
). Les huit systèmes peuvent alors être considérés comme des variations de ce qui est autorisé à chacun des trois niveaux.
λ → (calcul lambda simplement tapé)
k ::= ∗
A ::= p | A → B
e ::= x | λx:A.e | e e
Il s'agit du calcul lambda typé de base. Il existe un seul type ∗
, qui est le type de types. Les types eux-mêmes sont des types atomiques p
et des types de fonction A → B
. Les termes sont des variables, des abstractions ou des applications.
λω_ (STLC + opérateurs de type supérieur)
k ::= ∗ | k → k
A ::= a | p | A → B | λa:k.A | A B
e ::= x | λx:A.e | e e
Le STLC n'autorise l'abstraction qu'au niveau des termes. Si nous l'ajoutons au niveau des types, nous ajoutons un nouveau type k → k
qui est le type des fonctions au niveau du type, ainsi que l'abstraction λa:k.A
et l'application A B
au niveau du type. Alors maintenant, nous n'avons pas de polymorphisme, mais nous avons des opérateurs de type.
Si la mémoire est bonne, ce système n'a pas plus de puissance de calcul que le STLC; il vous donne simplement la possibilité d'abréger les types.
λ2 (système F)
k ::= ∗
A ::= a | p | A → B | ∀a:k. A
e ::= x | λx:A.e | e e | Λa:k. e | e [A]
Au lieu d'ajouter des opérateurs de type, nous aurions pu ajouter du polymorphisme. Au niveau du type, nous ajoutons ∀a:k. A
qui est un formateur de type polymorphe, et au niveau du terme, nous ajoutons l'abstraction sur les types Λa:k. e
et l'application de type e [A]
.
Ce système est beaucoup plus puissant que le STLC - il est aussi fort que l'arithmétique de second ordre.
λω (Système F-oméga)
k ::= ∗ | k → k
A ::= a | p | A → B | ∀a:k. A | λa:k.A | A B
e ::= x | λx:A.e | e e | Λa:k. e | e [A]
Si nous avons à la fois des opérateurs de type et du polymorphisme, nous obtenons F-oméga. Ce système est plus ou moins la théorie du type de noyau de la plupart des langages fonctionnels modernes (comme ML et Haskell). Il est également beaucoup plus puissant que le système F - il est équivalent en force à l'arithmétique d'ordre supérieur.
λP (LF)
k ::= ∗ | Πx:A. k
A ::= a | p | Πx:A. B | Λx:A.B | A [e]
e ::= x | λx:A.e | e e
Au lieu du polymorphisme, nous aurions pu aller dans le sens de la dépendance à partir du calcul lambda simplement typé. Si vous avez autorisé le type de fonction à laisser son argument être utilisé dans le type de retour (c'est-à-dire, écrire Πx:A. B(x)
au lieu de A → B
), alors vous obtenez λP. Pour rendre cela vraiment utile, nous devons étendre l'ensemble des types avec une sorte d'opérateurs de type qui prennent les termes en arguments Πx:A. k
, et nous devons donc également ajouter une abstraction Λx:A.B
et une application correspondantes A [e]
au niveau du type.
Ce système est parfois appelé LF, ou le cadre logique d'Édimbourg.
Il a la même puissance de calcul que le calcul lambda simplement tapé.
λP2 (pas de nom spécial)
k ::= ∗ | Πx:A. k
A ::= a | p | Πx:A. B | ∀a:k.A | Λx:A.B | A [e]
e ::= x | λx:A.e | e e | Λa:k. e | e [A]
Nous pouvons également ajouter du polymorphisme à λP, pour obtenir λP2. Ce système n'est pas souvent utilisé, il n'a donc pas de nom particulier. (Le seul article que j'ai lu qui l'utilise est l' induction d' Herman Geuvers n'est pas dérivable dans la théorie des types dépendants du second ordre .)
Ce système a la même force que le système F.
λPω_ (pas de nom spécial)
k ::= ∗ | Πx:A. k | Πa:k. k'
A ::= a | p | Πx:A. B | Λx:A.B | A [e] | λa:k.A | A B
e ::= x | λx:A.e | e e
Nous pourrions également ajouter des opérateurs de type à λP, pour obtenir λPω_. Cela implique l'ajout d'un type Πa:k. k'
pour les opérateurs de type, ainsi que l'abstraction Λx:A.B
et l'application correspondantes au niveau du type A [e]
.
Puisqu'il n'y a à nouveau aucun saut dans la puissance de calcul par rapport au STLC, ce système devrait également constituer une base fine pour un cadre logique, mais personne ne l'a fait.
λPω (le calcul des constructions)
k ::= ∗ | Πx:A. k | Πa:k. k'
A ::= a | p | Πx:A. B | ∀a:k.A | Λx:A.B | A [e] | λa:k.A | A B
e ::= x | λx:A.e | e e | Λa:k. e | e [A]
Enfin, nous arrivons à λPω, le calcul des constructions, en prenant λPω_ et en ajoutant un ancien de type polymorphe ∀a:k.A
et une abstraction au niveau du terme Λa:k. e
et une application e [A]
pour celui-ci.
Les types de ce système sont beaucoup plus expressifs que dans le F-oméga, mais il a la même force de calcul.
soft-question
. Je ne vois pas ici de véritable question technique. Peut-être pourriez-vous être un peu plus précis sur ce que vous demandez?