Pourquoi deux points pour indiquer qu'une valeur appartient à un type?

19

Pierce (2002) introduit la relation de frappe à la page 92 en écrivant:

La relation de typage pour les expressions arithmétiques, écrite "t: T", est définie par un ensemble de règles d'inférence affectant des types aux termes

et la note de bas de page indique que le symbole est souvent utilisé au lieu de:. Ma question est simplement pourquoi les théoriciens des types préfèrent utiliser: over ? Si un type est un ensemble de valeurs, il est parfaitement logique d'écrire , aucune nouvelle notation n'est nécessaire.TtT

Est-ce similaire à la façon dont certains auteurs cs préfèrent même s'ils pensent qu'il s'agit d'un abus de notation et devrait être écrit ?3n2=O(n2)3n2O(n2)

Björn Lindqvist
la source
7
Le prédicat d' appartenance peut être vrai ou faux, alors qu'une déclaration de typage est généralement interprétée comme une déclaration factuelle déclarée vraie ou sa vérité peut être dérivée par des moyens purement syntaxiques. Comparez cela à un nombre premier, pour lequel aucune méthode syntaxique d'appartenance ne suffit. xX x:X
Musa Al-hassy
4
@ MusaAl-hassy: c'est une fausse représentation de ce qui se passe. Il n'est pas déclaré vrai, car cela signifierait que je peux "déclarer" que " false: int", par exemple. Il n'est pas non plus vrai que le jugement doit être nécessairement dérivé par des "moyens purement syntaxiques", par exemple dans le cas de la théorie de type interne d'une catégorie à familles.
Andrej Bauer
2
Pour ajouter au commentaire de @ MusaAl-hassy, ​​dans la théorie du type informatique de Bob Constable, Stuart Allen, Bob Harper, et al., In est utilisé couramment pour taper des jugements car il s'apparente davantage à un prédicat d'appartenance (voir cet exposé, diapositive 25 , à titre d'exemple).
xrq
3
Sûrement est aussi un abus de notation et devrait vraiment être écrit ? (Les mathématiciens pourraient préférer .)λ n .3 n 2O ( λ n . N 2 ) n 3 n 2O ( n n 2 )3n2O(n2)λn.3n2O(λn.n2)n3n2O(nn2)
Oscar Cunningham

Réponses:

12

Parce que ce qui est à droite des deux points n'est pas nécessairement un ensemble et ce qui est à gauche des deux points n'est pas nécessairement un membre de cet ensemble.

La théorie des types a commencé au début du 20e siècle en tant qu'approche du fondement des mathématiques. Bertrand Russel a découvert un paradoxe dans la théorie naïve des ensembles, et il a travaillé sur la théorie des types comme moyen de limiter le pouvoir expressif de la théorie des ensembles pour éviter ce paradoxe (et tout autre). Au fil des ans, Russel et d'autres ont défini de nombreuses théories de types. Dans certaines théories des types, les types sont des ensembles avec certaines propriétés, mais dans d'autres, ils sont un type de bête différent.

En particulier, de nombreuses théories des types ont une formulation syntaxique . Il y a des règles qui font qu'une chose a un type. Lorsque les règles de frappe sont utilisées comme fondement d'une théorie, il est important de distinguer ce que disent les règles de frappe de ce que l'on pourrait inférer en appliquant des connaissances externes supplémentaires. Cela est particulièrement important si les règles de typage sont le fondement d'une théorie de la preuve: les théorèmes qui reposent sur une théorie des ensembles avec une logique classique et l'axiome de choix peuvent ou non tenir dans une logique constructive, par exemple. L' un des articles fondamentaux dans ce domaine est Eglise de A Formulation de la théorie simple des types (1940)

Peut-être que la manière dont la distinction entre les types et les ensembles est la plus apparente est que la règle la plus fondamentale pour les ensembles, à savoir que deux ensembles sont égaux s'ils ont les mêmes éléments, ne s'applique généralement pas aux types. Voir la réponse d'Andrej Bauer ici et sa réponse à une question connexe pour quelques exemples. Ce deuxième fil a d'autres réponses qui méritent d'être lues.

Dans un calcul typé, dire que les types sont des ensembles, c'est en fait donner une sémantique aux types. Donner à un calcul une sémantique théorique de type n'est pas trivial. Par exemple, supposons que vous définissez un langage avec des fonctions. Quel ensemble est un type de fonction? Les fonctions totales sont déterminées par leur graphique, comme nous l'avons appris dans la théorie des ensembles 101. Mais qu'en est-il des fonctions partielles? Voulez-vous donner à toutes les fonctions non terminales la même sémantique? Vous ne pouvez pas interpréter les types comme des ensembles pour un calcul qui autorise des fonctions récursives tant que vous n'avez pas répondu à cette question. Donner aux langages de programmation ou aux calculs une sémantique dénotationnelle était un problème difficile au début des années 1970. Le papier séminal ici est Vers une sémantique mathématique pour les langages informatiques (1971) parDana Scott et Christopher Strachey . Le wikibook Haskell a une bonne présentation du sujet.

Comme je l'ai écrit ci-dessus, une deuxième partie de la réponse est que même si vous avez réussi à donner aux types une sémantique théorique, la chose à gauche du deux-points n'est pas toujours un élément de l'ensemble. Les valeurs ont des types, mais il en va de même pour d'autres choses, telles que les expressions et les variables . Par exemple, une expression dans un langage de programmation typé a un type même si elle ne se termine pas. Vous pourriez être prêt à conflate integeret Z , mais (x := 0; while true; do x := x + 1; x)n'est pas un élément de Z .

Je ne sais pas quand la notation deux-points est apparue pour les types. Il est désormais standard en sémantique et commun dans les langages de programmation, mais ni Russel ni Church ne l'ont utilisé. Algol ne l'a pas utilisé, mais le langage fortement inspiré d'Algol que Pascal a utilisé en 1971. Je soupçonne que ce n'était pas le premier, cependant, parce que de nombreux articles théoriques du début des années 1970 utilisent la notation, mais je ne connais pas de utilisation antérieure. Fait intéressant, c'était peu de temps après l'unification des concepts de types issus de la programmation et de la logique - comme le montre Simon Martini dans Plusieurs types de types dans les langages de programmation , ce que l'on appelait un «type» dans les langages de programmation jusqu'aux années 1960 provenait du vernaculaire. l'utilisation du mot et non de la théorie des types.

Gilles 'SO- arrête d'être méchant'
la source
37

La principale raison de préférer la notation deux points t:T à la relation d'appartenance tT est que la relation d'appartenance peut être trompeuse car les types ne sont pas (seulement) des collections .

[ Supplémentaire: Je dois noter que la théorie de type historique a été écrite en utilisant . La conception du type de Martin-Löf visait à capturer des décors de manière constructive, et déjà Russell et Whitehead utilisaient ϵ pour le memebrship de la classe. Il serait intéressant de retrouver le moment où : est devenu plus répandu que .]

Un type décrit un certain type de construction, c'est-à-dire comment fabriquer des objets avec une certaine structure, comment les utiliser et quelles équations contiennent à leur sujet.

Par exemple , un type de produit A×B a des règles d'introduction qui expliquent comment faire couples et les règles d'élimination expliquant que nous pouvons projeter le premier et le second composants de tout élément de A×B . La définition de A×B ne commence pas par les mots "la collection de tous ..." et elle ne dit nulle part quelque chose comme "tous les éléments de A×B sont des paires" (mais il résulte de la définition que chaque élément de A×B est propositionnellementégal à une paire). En contraste, la définition théorique de X×Y est définie comme "l'ensemble de toutes les paires ordonnées ...".

La notation t:T signifie le fait que t a la structure décrite par T .

Un type T ne doit pas être confondu avec son prolongement , qui est la collection de tous les objets de type T . Un type n'est pas déterminé par son extension, tout comme un groupe n'est pas déterminé par son ensemble de porteuses. De plus, il peut arriver que deux types aient la même extension, mais soient différents, par exemple:

  1. Le type de tous les nombres premiers pairs supérieurs à deux: Σ(n:N).isprime(n)×iseven(n)×(n>2) .
  2. Le type de tous les nombres premiers impairs inférieurs à deux: Σ(n:N).isprime(n)×isodd(n)×(n<2) .

L'extension des deux est vide, mais ce n'est pas le même type.

Il existe d'autres différences entre la théorie des types : et la théorie des ensembles . Un objet dans a théorie des ensembles existe indépendamment des ensembles auxquels il appartient, et il peut appartenir à plusieurs ensembles. En revanche, la plupart des théories de type satisfont l' unicité de frappe: si t:T et t:U puis TU . Ou, pour le dire différemment, une construction théorique de type t a précisément un type T , et en fait il n'y a aucun moyen d'avoir juste un objet t sans son type (déterminé de manière unique).

Une autre différence est que , en théorie , ensemble nous pouvons nier le fait que aA par écrit ¬(aA) ou aA . Ce n'est pas possible en théorie des types, car t:T est un jugement qui peut être dérivé en utilisant les règles de la théorie des types, mais rien dans la théorie des types ne nous permettrait d'affirmer que quelque chose n'a pas été dérivé. Quand un enfant fabrique quelque chose à partir de blocs LEGO, il court fièrement vers ses parents pour leur montrer la construction, mais il ne court jamais vers ses parents pour leur montrer ce qu'ils n'ont pas fait.

Andrej Bauer
la source
1
Andrej, excellente réponse. Connaissez-vous justement l'origine historique de la notation du côlon?
Andreas Rossberg
Hélas, non. La théorie des types de Church utilise des indices, c'est-à-dire pour une variable de type α . Russell et Whitehead ont utilisé ϵ pour la relation d'appartenance à une classe. Algol 68 met les types devant les noms de variables. La théorie du type de Martin-Löf de 1972 utilise , tout comme la version de 1984 , mais la [version de 1994] utilise deux points. xααϵ
Andrej Bauer
1
Donc, votre argument est qu'un type est comme un groupe? Cela a du sens, mais la notation est courante en algèbre abstraite. gG
Björn Lindqvist
2
@ BjörnLindqvist: Je ne pense pas que cette réponse soit l'histoire complète. Même en mathématiques standard , nous utilisons « » pour indiquer que f est une fonction de S à T . Pourquoi n'avons-nous pas utilisé " f ( S T ) " ou quelque chose comme ça? Eh bien, nous ne l'avons pas fait. Bien sûr, il y a de bonnes raisons d'éviter l'utilisation de " " dans une présentation de certains types de théories de types, tout simplement parce que nous ne voulons pas que les personnes formées à ZFC pensent que c'est comme des ensembles ZFC, ce qui n'est évidemment pas le Cas. Mais cela ne signifie pas que le colon n'a pas déjàf:STfSTf(ST)largement utilisé bien avant que la théorie des types ne devienne populaire.
user21820
1
@ user21820 "Pourquoi n'avons-nous pas utilisé ?" Je ne fais que spéculer: parce que les mathématiciens n'ont jamais considéré S T comme un ensemble. Pour l'historique de cette notation, voir ici . Je doute que le colon de f : S T ait été l'inspiration pour les théoriciens des types. Il est plus probable que les théoriciens des types deux-points soient liés au fait que n'est pas un caractère ASCII. f(ST)STf:ST
Michael
5

Björn,

Il y a probablement une référence antérieure mais pour une chose, les deux points ont été utilisés dans le langage de programmation Pascal:

Premier succès de Google pour Pascal

Bjørn Kjos-Hanssen
la source
2
N'y avait-il aucun langage de programmation antérieur utilisé :?
Andrej Bauer
@AndrejBauer en effet, j'ai écrit "Il y a probablement une référence antérieure mais ..." pour se prémunir contre ce fait probable.
Bjørn Kjos-Hanssen
@AndrejBauer Algol ne l'a pas fait. A été :utilisé dans les articles théoriques avant les années 1970?
Gilles 'SO- arrête d'être méchant'
1
Fortran l'a fait, REAL :: xmais je ne sais pas si cela a précédé Pascal.
Michael
1
@Michael Fortran est venu plus tôt que Pascal (ca. 1955 vs ca. 1970), mais je pense que cette syntaxe spécifique n'a été introduite que dans Fortran 90, donc beaucoup plus tard que Pascal. Voir par exemple ici fortranwiki.org/fortran/show/Modernizing+Old+Fortran
Federico Poloni