Un type est une propriété de calculs. C'est ce que vous écrivez à la droite du côlon.
Laissez-moi élaborer sur cela. Notez que la terminologie n'est pas tout à fait standard: certains articles ou livres peuvent utiliser des mots différents pour certains concepts.
Un terme est un élément d'une syntaxe abstraite destiné à représenter le calcul. Intuitivement, c'est un arbre d'analyse. Formellement, c'est un arbre fini où les nœuds appartiennent à un alphabet. Un calcul non typé définit une syntaxe pour les termes. Par exemple, le lambda calcul (non typé) contient des termes (écrits en , N , etc.) construits à partir de trois types de nœuds:MN
- variables, d'arité 0 (une collection dénombrable), écrites , y , etc .;xy
- application d'une variable, d'arity 1 (une collection dénombrable, avec une bijection à des variables), écrite λx.M , etc .;
- application, d'arity 2, écrit .MN
Un terme est une construction syntaxique. Une sémantique relie les termes aux calculs. Il existe de nombreux types de sémantique, les plus courants étant opérationnels (décrivant comment les termes peuvent être transformés en d'autres termes) ou dénotants (décrivant les termes par une transformation dans un autre espace, généralement construit à partir de la théorie des ensembles).
Un type est une propriété de termes. Un système de types pour un calcul non typé décrit quels termes ont quels types. Mathématiquement, à la base, un système de types est une relation entre des termes et des types. Plus précisément, un système de types est une famille de telles relations, indexée par contextes - généralement, un contexte fournit au moins des types pour les variables (c’est-à-dire qu'un contexte est une fonction partielle de variables en types), de sorte qu'un terme ne peut avoir qu'un type dans des contextes qui fournissent un type pour toutes ses variables libres. Le type d'objet mathématique d'un type dépend du système de types.
Certains systèmes de types sont décrits avec des types sous forme d'ensembles, utilisant des notions de théorie des ensembles telles que l'intersection, l'union et la compréhension. Cela a l'avantage de reposer sur des fondements mathématiques familiers. Une limitation de cette approche est qu’elle ne permet pas de raisonner sur des types équivalents.
De nombreux systèmes de types décrivent les types eux-mêmes comme des termes dans un calcul de types. Selon le système de types, il peut s'agir des mêmes termes ou de termes différents. J'utiliserai l'expression terme de base pour désigner un terme du calcul qui décrit le calcul. Par exemple, le lambda calcul simplement saisi utilise les types de calcul suivants (écrit , etc.):τ
- types de base, d'arité 0 (une collection finie ou dénombrable de celle-ci), écrite , B , etc.AB
- fonction, d'arité 2, écrite .τ0→τ1
La relation entre les termes et les types définissant le calcul lambda simplement typé est généralement définie par des règles de typage . Les règles de frappe ne sont pas le seul moyen de définir un système de types, mais elles sont courantes. Ils fonctionnent bien pour les systèmes de types compositionnels, c’est-à-dire les systèmes de types où le (s) type (s) d’un terme est construit à partir des types de sous-termes. Les règles de typage définissent un système de types de manière inductive: chaque règle de typage est un axiome qui stipule que, pour toute instanciation des formules au-dessus de la règle horizontale, la formule située sous la règle est également vraie. Voir Comment lire les règles de frappe? pour plus de détails. Existe-t-il un calcul lambda typé complet de Turing? peut également être d'intérêt.
Pour le calcul lambda simplement typé, le jugement de typage pour signifie que M a le type τ dans le contexte Γ . J'ai omis la définition formelle des contextes.
x : τ ∈ ΓΓ⊢M:τMτΓ
x:τ∈ΓΓ⊢x:τ(Γ)Γ,x:τ0⊢M:τ1Γ⊢λx.M:τ0→τ1(→I)Γ⊢M:τ0→τ1Γ⊢N:τ0Γ⊢MN:τ1(→E)
Par exemple, si et BAB sont des types basés, alors a le type ( A → B ) → A → B dans tout contexte (de bas en haut, appliquer ( → I ) deux fois, puis ( → E ) , et enfin ( Γ ) sur chaque branche).λx.λy.xy(A→B)→A→B(→I)(→E)(Γ)
Il est possible d'interpréter les types du calcul lambda simplement typé comme des ensembles. Cela revient à donner une sémantique dénotationnelle pour les types. Une bonne sémantique dénotationnelle pour les termes de base attribuerait à chaque terme de base un membre de la dénotation de tous ses types.
La théorie des types intuitionnistes (également appelée théorie des types de Martin-Löf) est plus complexe que le lambda calcul simplement typé, car elle comporte beaucoup plus d'éléments dans le calcul des types (et ajoute également quelques constantes aux termes de base). Mais les principes fondamentaux sont les mêmes. Une caractéristique importante de la théorie des types de Martin-Löf est que les types peuvent contenir des termes de base (ce sont des types dépendants ): l’univers des termes de base et l’univers des types sont identiques, bien qu’ils puissent être distingués par de simples règles syntaxiques (généralement appelées règles de syntaxe). le tri, c'est-à-dire l'attribution de tris à des termes, en théorie de la réécriture).
Il existe des systèmes de types qui vont plus loin et mélangent complètement les types et les termes de base, de sorte qu'il n'y a pas de distinction entre les deux. De tels systèmes de type sont dits d' ordre supérieur . Dans ces calculs, les types ont des types - un type peut apparaître sur le côté gauche de la . Le calcul de la construction est le paradigme des types dépendants d'ordre supérieur. Le cube lambda (également appelé cube de Barendregt) classifie les systèmes de types selon qu'ils autorisent les termes à dépendre de types ( polymorphisme - certains termes de base contiennent des types sous forme de sous-termes), de types à dépendre de termes (types dépendants) ou de types à dépendre sur les types ( opérateurs de type - le calcul des types a une notion de calcul).:
La plupart des systèmes de types ont reçu une sémantique de la théorie des ensembles, afin de les rattacher aux bases habituelles des mathématiques.
Quel est le lien entre les langages de programmation et les fondements des mathématiques? et
Quelle est la différence entre les vues sémantique et syntaxique des types de fonctions? peut être d'intérêt ici. Des travaux ont également été menés sur l'utilisation de la théorie des types en tant que fondement des mathématiques - la théorie des ensembles est le fondement historique, mais ce n'est pas le seul choix possible. La théorie des types d'homotopie est une étape importante dans cette direction: elle décrit la sémantique de la théorie des types d'intuitionnisme intentionnelle en termes de théorie d'homotopie et construit la théorie des ensembles dans ce cadre.
Je recommande les livres de Benjamin Pierce Types et langages de programmation et Thèmes avancés dans Types et langages de programmation . Ils sont accessibles à tous les étudiants de premier cycle sans autre préalable que la connaissance de base du raisonnement mathématique formel. TAPL décrit de nombreux systèmes de types; les types dépendants font l'objet du chapitre 2 de ATTAPL.