Introduction à la théorie de type de Martin-Löf


36

Quelle serait la meilleure introduction aux idées de Per Martin-Löfs sur la théorie des types? J'ai regardé certaines conférences de l'université d'été de l'Oregon PL, mais la question suivante me laisse toujours perplexe:

Qu'est-ce qu'un type?

Je sais ce qu'est un ensemble, car vous pouvez les définir à l'aide des axiomes habituels de ZF et ils ont un modèle concret très intuitif; il suffit de penser à un panier rempli de choses. Cependant, je n'ai pas encore vu de définition raisonnable d'un type et je me demandais s'il y avait une source qui pourrait distiller cette idée pour un mannequin.


4
Le livre HoTT a une introduction qui compare les types et les ensembles. Cela aidera peut-être, voir la section 1.1 de homotopytypetheory.org/book . Mais plus important encore, vous voulez que nous implantions directement dans votre tête la bonne idée des types, alors que pour les ensembles, vous êtes content de les avoir décrits par des axiomes, sans insister pour savoir "ce qu’ils sont vraiment". Eh bien, les types sont décrits par les règles d'inférence pour les types. Et ils ont un modèle concret très intuitif, vous savez, un panier rempli de blocs Lego. Tout ce que vous pouvez construire d'eux est dans le type.
Andrej Bauer

Je pense que le plus gros problème est de sortir de ma théorie des sets. Cependant, je ne suis pas sûr de la qualité de l'analogie de Lego. Quels sont les blocs? Si x: A et y: A, en général, je ne peux rien construire à moins que A ne soit un type de flèche récursif. Bien sûr, je peux souvent mélanger des trucs de types différents pour construire quelque chose d'un troisième type ...
dst

4
Les blocs Lego sont les constructeurs de types. Ainsi , par exemple de et y : A on peut construire ( x , y ) et ( x , x ) et i n l ( x ) et r e l f x et λ z : A . x . Vous pouvez également construire de nouveaux types, par exemple I d ( x , y ) et : Ax:Ay:UNE(x,y)(X,X)jenl(X)relFXλz:UNE.Xje(X,y) , etc. Les gens ont des intuitions différentes sur les types. Sets est l'un d'entre eux, mais brut. Les types ressemblent également à des espaces topologiques. Ils sont aussi comme des données structurées en programmation. Ils sont aussi comme co -groupoids. C'est la beauté de cela, la richesse des possibilités. Choisissez une possibilité et courez avec elle. z:AId(x,z)ω
Andrej Bauer

Réponses:


31

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:τ0M:τ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(AB)AB(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.


+1 pour TAPL. J'ai pu apprendre beaucoup de choses sur les types en lisant ce livre.
Guy Coder

Je ne suis pas sûr que ATTAPL soit un bon point de départ pour en savoir plus sur les types dépendants.
Martin Berger

15

Peut-être une meilleure question pour quelqu'un qui vient de la théorie des ensembles et qui se demande en quoi la théorie des ensembles et la théorie de type de Martin-Löf diffèrent est de réfléchir à ce que sont les ensembles. Vos intuitions sur la théorie des ensembles et sur les fondements des mathématiques seront infectées par des hypothèses incontestées sur la théorie des ensembles que vous prenez pour acquis. Hélas, la théorie des types de Martin-Löf ne partage pas ces hypothèses.

Contrairement à la conception conventionnelle, la théorie des ensembles est une théorie de deux relations: égalité et appartenance des ensembles , et pas seulement des membres des ensembles. Et ces deux relations sont construites dans des phases sensiblement distinctes.

  1. Nous construisons la logique du premier ordre en tant que théorie de l'égalité des choses arbitraires (pas seulement des ensembles). La logique du premier ordre utilise une notion informelle de preuve. La preuve conceptuelle n'est pas elle-même exprimable formellement dans la seule logique du premier ordre.

  2. Ensuite, nous construisons la théorie des ensembles au-dessus de la logique du premier ordre en tant que théorie des ensembles et appartenance à un ensemble.

  3. L’appartenance et l’égalité des ensembles sont alors liées par l’axiome de l’extensionalité qui dit que deux ensembles sont égaux exactement quand ils ont les mêmes membres.

  4. Enfin, le concept informel de preuve de (1) obtient une rationalisation ex post sous la forme de certains ensembles (arbres de preuve).

Il est important de réaliser que la notion de preuve est donc un citoyen de seconde classe. en théorie des ensembles.

Cette configuration fonctionne très bien pour les mathématiques classiques de petite / moyenne taille, mais comme nous nous intéressons maintenant aux preuves à grande échelle, telles que la classification de tous les groupes simples simples ou la vérification de programmes informatiques non triviaux, elle tombe en morceaux, car il ne conduit pas à une mécanisation facile.

La théorie de type de Martin-Löf est différente: elle construit la notion de preuve et celle de type (c'est-à-dire qu'en gros, la théorie de type de Martin-Löf définit ce qui doit être la théorie des ensembles) d'un seul coup. Cela signifie que les preuves sont des citoyens de première classe de la théorie. Alors qu'un ensemble est donné par ses membres, la théorie des ensembles omet de spécifier formellement ce qui compte comme preuve que quelque chose est un membre de l'ensemble. En revanche, un type est donné par ses preuves d’habitation. Donc tu comprends un typeT exactement quand vous comprenez ce qui compte comme une preuve de T.

Quelles sont ces preuves qui habitent les types? Simplifiant un peu (et omettant les types d’identité), ce sont des programmes fonctionnels, plus précisément des termes dans λ-calcul qui sont typables. Ceci est connu comme la correspondance Curry-Howard. Cela donne une belle base nouvelle et moins ad hoc de mathématiques constructives. Cela ne fonctionne pas très bien pour les mathématiques classiques difficiles.


C'était extrêmement utile. Je pense qu'un des problèmes majeurs de quiconque se lance dans les mathématiques constructives est de désapprendre beaucoup de choses.
dst

Je suis d'accord. Il faut un certain temps pour désapprendre ses postulats théoriques non reconnus. Faire beaucoup de programmation Agda m'a aidé, et pourrait travailler pour vous aussi si vous venez de l'informatique.
Martin Berger

10

Je ne suis pas au courant de voies faciles vers la théorie de type de Martin-Löf. Je suppose que ce qui suit pourrait servir d’introduction.

Cependant, si vous êtes intrigué par la question "Qu'est-ce qu'un type", je suggère de commencer par des théories du type beaucoup plus simples. N'importe quel langage de programmation dactylographié fera l'affaire, mais par exemple, Ocaml, F # et Haskell seraient particulièrement utiles. En simplifiant un peu, on pourrait dire que la théorie de type de Martin-Löf étend les types derrière les langues susmentionnées de deux manières:

  1. Avec types dépendants . Vous les trouvez sous forme domptée dans différents langages de programmation.
  2. Avec les types d'identité. C'est la principale innovation de Martin-Löf par rapport aux théories de types dépendantes précédentes.

L'idée clé derrière les types dépendants est simple: les types peuvent être paramétrés par des programmes. Ceci n'est pas possible (simplifiant un peu) dans des systèmes de typage plus classiques tels que ceux mentionnés ci-dessus. Bien que simples, les conséquences sont profondes: les types dépendants soulèvent la correspondance de Curry-Howard à une logique constructive de premier ordre. Les types d'identité sont un peu inhabituels. Si vous êtes à l'aise avec une langue comme Haskell, vous pouvez apprendre l' Agda , qui est fondamentalement Haskell avec la théorie de type de Martin-Löf. Je pense qu'Agda est beaucoup plus facile à apprendre pour un programmeur que de lire les livres mentionnés ci-dessus.


Je connais réellement Haskell. Mon problème est que tout tutoriel va juste vous dire comment définir des types, mais jamais ce qu’ils sont réellement. Il semble simplement s'agir d'une balise magique attachée à toutes vos données, de sorte que le vérificateur de type puisse choisir la bonne version d'une fonction polymorphe et vérifier que les éléments ne sont pas mélangés d'une manière qui n'a pas de sens. Ils laissent encore ouverte la question de savoir ce qu’est un type. Cela me laisse particulièrement perplexe, car Voevodsky & co essaie de baser toutes ses maths sur ce sujet, mais je n’ai jamais vu de définition précise.
dst

2
En Haskell, vous avez des jugements de dactylographie ΓM:αM est un programme, α est le type de M, en admettant que MLes variables libres de sont typées comme supposé dans l'environnement de typage Γ. En première approximation, les types Haskell eux-mêmes sont des «blobs», des marqueurs syntaxiques. C'est exactement la même chose dans la théorie de type de Martin-Löf. Il se trouve que les types, les "blobs", les marqueurs syntaxiques de la théorie de type de Martin-Löf sont plus compliqués que ceux de Haskell.
Martin Berger

Les types sont très précisément définis dans Haskell, dans la théorie des types de Martin-Löf et dans la théorie des types à homotopie de Voevodsky. Il n'y a aucune ambiguïté que ce soit. Par exemple, l'annexe A.2 donne un système de preuve pour tous les termes et types de théorie des types d'homotopie. Si vous voulez encore plus de rigueur, vous pouvez regarder les formalisations Coq ou Agda .
Martin Berger

2
Peut-être devez-vous avouer que les types n'ont pas d'essence autre que la façon dont ils sont définis. Ce n'est pas différent avec par exemple les ensembles, ils sont donnés par les axiomes de la théorie des ensembles. (Ce n'est pas tout à fait vrai, mais il est néanmoins important de comprendre.)
Martin Berger
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.