Abstract : We study set-theoretic types: types that include union, intersection, and negation connectives. Set-theoretic types, coupled with a suitable subtyping relation, are useful to type several programming language constructs – including conditional branching, pattern matching, and function overloading – very precisely. We define subtyping following the semantic subtyping approach, which interprets types as sets and defines subtyping as set inclusion. Our set-theoretic types are polymorphic, that is, they contain type variables to allow parametric polymorphism. We extend previous work on set-theoretic types and semantic subtyping by showing how to adapt them to new settings and apply them to type various features of functional languages. More precisely, we integrate semantic subtyping with three important language features. In Part I we study implicitly typed languages with let-polymorphism and type inference (previous work on semantic subtyping focused on explicitly typed languages). We describe an implicitly typed lambda-calculus and a declarative type system for which we prove soundness. We study type inference and prove results of soundness and completeness. Then, we show how to make type inference more precise when programs are partially annotated with types. In Part II we study gradual typing. We describe a new approach to add gradual typing to a static type system; the novelty is that we give a declarative presentation of the type system, while previous work considered algorithmic presentations. We first illustrate the approach on a Hindley-Milner type system without subtyping. We describe declarative typing, compilation to a cast language, and sound and complete type inference. Then, we add set-theoretic types, defining a subtyping relation on set-theoretic gradual types, and we describe sound type inference for the extended system. In Part III we consider non-strict semantics. The existing semantic subtyping systems are designed for call-by-value languages and are unsound for non-strict semantics. We adapt them to obtain soundness for call-by-need. To do so, we introduce an explicit representation for divergence in the types, allowing the type system to distinguish the expressions that are already evaluated from those that are computations which might diverge.

Résumé : Cette thèse porte sur l'étude des types ensemblistes : des types qui contiennent des connecteurs d'union, d'intersection et de négation. Les types ensemblistes permettent de typer de manière très précise plusieurs constructions des langages de programmation (comme par exemple les branches conditionnelles, le filtrage par motif et la surcharge des fonctions) lorsqu'ils sont utilisés avec une notion appropriée de sous-typage. Pour définir celle-ci, nous utilisons l'approche du sous-typage sémantique, dans laquelle les types sont interprétés comme des ensembles, et où le sous-typage est défini comme l'inclusion ensembliste. Dans la plupart de cette thèse, les types ensemblistes sont polymorphes, dans le sens où ils contiennent des variables de type pour permettre le polymorphisme paramétrique. La thèse étend les travaux précédents sur les types ensemblistes et le sous-typage sémantique en montrant comment les adapter à de nouveaux contextes et comment les utiliser pour typer plusieurs aspects des langages fonctionnels. Elle se compose de trois parties. La première partie porte sur une étude des langages typés de manière implicite avec polymorphisme du "let" et inférence de types (contrairement aux travaux précédents sur le sous-typage sémantique qui étudiaient des langages typés explicitement). Nous y décrivons un lambda-calcul typé implicitement avec un système de types dont nous démontrons la correction. De même, nous y étudions l'inférence de types dont nous démontrons la correction et la complétude. Enfin, nous montrons comment rendre l'inférence plus précise quand les programmes sont partiellement annotés avec des types. La deuxième partie décrit une nouvelle approche permettant d'étendre un système de types statique avec du typage graduel; l'originalité venant du fait que nous décrivons le système de types de façon déclarative, lorsque les systèmes existants proposent des descriptions algorithmiques. Nous illustrons cette approche en ajoutant le typage graduel à un système de types à la Hindley-Milner sans sous-typage. Nous décrivons pour cela un système de types déclaratif, un processus de compilation vers un langage avec vérifications de type dynamiques (ou "casts"), et nous présentons un système d'inférence de types correct et complet. Ensuite, nous y ajoutons les types ensemblistes, en définissant une relation de sous-typage sur les types graduel ensemblistes, puis en présentant un système d'inférence de types correct pour le système étendu. La troisième partie porte sur l'étude des sémantiques non-strictes. Les systèmes existants qui utilisent le sous-typage sémantique ont été développés pour des langages avec appel par valeur et ne sont pas sûrs pour des sémantiques non-strictes. Nous montrons ici comment les adapter pour garantir leur sûreté en appel par nécessité. Pour faire ça, nous introduisons dans les types une représentation explicite de la divergence, afin que le système des types puisse distinguer les expressions qui ne demandent pas d'évaluation de celles qui la demandent et pourraient ainsi diverger.