Le CoC serait le point culminant des trois dimensions du Lambda Cube. Cela ne m’apparaît pas du tout. Je pense que je comprends les dimensions individuelles, et la combinaison de deux semble entraîner une union relativement simple (peut-être que je manque quelque chose?). Mais quand je regarde le CoC, au lieu de ressembler à une combinaison des trois, cela ressemble à une chose complètement différente. De quelle dimension les types Type, Prop et petits / grands proviennent-ils? Où les produits dépendants ont-ils disparu? Et pourquoi l'accent est-il mis sur les propositions et les preuves plutôt que sur les types et les programmes? Y a-t-il quelque chose d'équivalent qui se concentre sur les types et les programmes?
Edit: Au cas où ce ne serait pas clair, je demande une explication sur la façon dont le CoC est équivalent à l'union simple des dimensions du Lambda Cube. Et y a-t-il une union réelle des trois là où je peux étudier (c'est-à-dire en termes de programmes et de types, pas de preuves et de propositions)? C'est en réponse aux commentaires sur la question, et non aux réponses actuelles.
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?Réponses:
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étavariableA
) et les termes (classés par la métavariablee
). 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é)
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 atomiquesp
et des types de fonctionA → B
. Les termes sont des variables, des abstractions ou des applications.λω_ (STLC + opérateurs de type supérieur)
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'applicationA 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)
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 typee [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)
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)
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 deA → 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 correspondantesA [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)
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)
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 typeA [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)
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 applicatione [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.
la source
Mais d'abord, il faut probablement essayer de dissocier les différents problèmes. Le prouveur de théorème interactif Coq est basé sur une théorie de type sous-jacente, parfois appelée avec amour le calcul des constructions inductives avec des univers . Vous remarquerez qu'il s'agit plus d'une bouchée que simplement du "calcul des constructions", et en effet, il y a beaucoup plus de choses là-dedans que le CoC. En particulier, je pense que vous ne savez pas exactement quelles fonctionnalités sont dans CoC proprement dit. En particulier, la distinction Set / Prop et les univers n'apparaissent pas dans CoC.
Je ne donnerai pas ici un aperçu complet des systèmes de type pur, mais la règle importante (pour les PTS fonctionnels comme le CoC) est la suivante
Et donc nous avons 4 règles qui correspondent à 4 objectifs différents:
Je vais expliquer chacun de ces éléments plus en détail.
Avec ces sortes et règles supplémentaires, vous obtenez quelque chose qui n'est pas un PTS, mais quelque chose de proche. C'est (presque) le calcul étendu des constructions , qui est plus proche de la base de Coq. La grande pièce manquante ici est les types inductifs, dont je ne parlerai pas ici.
Edit: Il y a une référence plutôt sympa qui décrit les différentes fonctionnalités des langages de programmation dans le cadre des PTS, en décrivant un PTS qui est un bon candidat pour une représentation intermédiaire d'un langage de programmation fonctionnel:
Henk: A Typed Intermediate Language , SP Jones et E. Meijer.
la source