Existe-t-il une hiérarchie d'expressivité pour les systèmes de types?

23

Inspiré par les vastes hiérarchies présentes dans la théorie de la complexité, je me suis demandé si de telles hiérarchies étaient également présentes pour les systèmes de types. Cependant, les deux exemples que j'ai trouvés jusqu'à présent ressemblent davantage à des listes de contrôle (avec des caractéristiques orthogonales) qu'à des hiérarchies (avec des systèmes de type de plus en plus expressifs).

Les deux exemples que j'ai trouvés sont le cube Lambda et le concept de polymorphisme de rang k . La première est une liste de contrôle avec trois options, la seconde est une véritable hiérarchie (bien que le classement k pour les valeurs spécifiques de k soit rare je crois). Toutes les autres caractéristiques du système de type que je connais sont principalement orthogonales.

Je m'intéresse à ces concepts parce que je conçois mon propre langage et je suis très curieux de voir comment il se classe parmi les systèmes de types existants (mon système de type est quelque peu non conventionnel, pour autant que je sache).

Je me rends compte que le concept d '«expressivité» peut être un peu vague, ce qui peut expliquer pourquoi les systèmes de types me semblent être des listes de contrôle.

Alex ten Brink
la source
4
Je suis sûr que les comparaisons d'expressivité dures et rapides ne peuvent être faites qu'entre les systèmes de type plus théoriques. Si vous concevez un langage de programmation complet, vous pouvez faire une comparaison caractéristique par fonctionnalité avec les langages / formalisme existants. Malheureusement, comme de nombreuses fonctionnalités peuvent être encodées en termes d'autres fonctionnalités, ce ne sera pas une tâche triviale. Si vous pouvez avoir des types aussi fantaisistes que Scala ou Haskell, alors vous vous en sortirez bien en termes d'expressivité.
Dave Clarke,
3
Je devrais vraiment finir par écrire ce billet de blog sur "Comment comparer les langages de programmation" ...
Andrej Bauer
@Andrej Bauer: Ce serait un ajout intéressant aux réponses et remarques déjà présentes ici. J'ai déjà beaucoup appris sur la façon de définir «l'expressivité» - j'aurais peut-être dû demander cela à la place ...
Alex ten Brink
Je suis sûr d'avoir vu le polymorphisme de rang 2 utilisé à quelques endroits. Un dont je me souviens en ce moment est Lammel, Peyton-Jones, Scrap Your Boilerplate, 2003.
Radu GRIGore
2
@Radu GRIGore: Le polymorphisme de rang 2 est significatif car il permet aux arguments de type d'apparaître dans une position doublement contravariante, ce qui, par le type habituel de dualité, permet de modéliser les types existentiels par leur codage d'église. Le rang 3 donne à nouveau une quantification universelle et il alterne à partir de là, donc il y a peu de puissance expressive ajoutée en comparaison.
CA McCann,

Réponses:

22

Il existe plusieurs sens de «expressivité» que vous pourriez souhaiter pour un système de type.

  1. Quelles fonctions mathématiques pouvez-vous exprimer dans un système de types particulier. Par exemple, dans le calcul lambda simplement tapé, toutes les fonctions calculables ne peuvent pas être exprimées. Il en va de même pour le système , mais strictement plus de fonctions peuvent être exprimées. Ce n'est pas très intéressant une fois que vous arrivez à taper des systèmes pour les langages Turing-complets.F

  2. Le système vérifier chaque programme écrit dans le système B ? C'est essentiellement ce que la première notion de force de cody concerne pour les PTS. Encore une fois, le système F est plus forte que la STLC dans cet ordre, étant donné que tous les types de programmes de STLC dans le Système F . De même, un système avec sous-typage sera plus fort qu'un système sans.ABFF

  3. Existe-t-il des transformations locales (au sens de l'article de Felleisen sur le pouvoir expressif des langages de programmation ) qui permettent à un programme qui tape dans le système de taper dans le système B , mais pas l'inverse. AB

  4. Un système de type garantit-il des propriétés plus fortes qu'un autre? Par exemple, les systèmes de type linéaire rejettent simplement plus de programmes, mais cela leur permet de faire des déclarations plus fortes sur les programmes qu'ils acceptent.

Malheureusement, je ne pense pas qu'il y ait eu des travaux sur la catégorisation ou la formalisation de ces notions, à l'exception du lambda-cube de Barendregt, comme discute @cody.

Sam Tobin-Hochstadt
la source
3
Je suppose que par "l'article sur l'expressivité de Felleisen", vous entendez son propos sur le pouvoir expressif des langages de programmation .
Martin Berger
Oui, exactement. J'ai clarifié cette partie de la réponse.
Sam Tobin-Hochstadt
13

Je ne suis pas sûr d'avoir une réponse satisfaisante à votre question, mais si vous considérez les systèmes de type purs, qui sont une généralisation des systèmes trouvés dans le cube lambda (un aperçu complet, quoique quelque peu daté, peut être trouvé dans le texte classique de Barendregt ), il y a ensuite quelques notions naturelles de hiérarchies:

  1. ΓA t:TΓB t:TΓ,tT:(,,)PTS dans le sens où il existe un morphisme de tous les autres PTS. Cela peut être considéré comme une mesure de l'expressivité d'un système de type, où le PTS final est le système le plus expressif.

  2. ABAFωECC

cody
la source