D'après mon expérience, une bonne manière opérationnelle de comprendre la dualité des types pour -calculi consiste à passer par -calculus.λπ
Lorsque vous traduisez (décomposez) des types en calcul de processus, la dualité devient simple: l' entrée est double à la sortie et vice versa . Il n'y a pas (beaucoup) plus à la dualité.
Dans -calculus, vous avez une dualité simple (et presque symétrique) entre l'entrée et la sortie. Supposons que vous ayez un type . Alors dit qu'un canal de type fait exactement une sortie, portant une valeur booléenne et un entier. Un processus habitant ce type au canal serait . Le type double, que nous pourrions écrire
, exprimerait qu'une entrée se produit d'une paire où est un booléen et est un entier. Nous écrivons commeπα=(Bool,Int)↑ααxx¯¯¯⟨false,7⟩α¯¯¯(v,w)vwα¯¯¯(bool,int)↓ . Un processus habitant en serait . α¯¯¯xc(v,w).0
Naturellement, les processus ne communiquent pas seulement des valeurs entières ou booléennes simples, mais aussi des canaux. Par exemple, le type décrit un canal qui fait une entrée de deux valeurs où est un entier et est un canal qui est utilisé pour faire exactement une sortie (d'un entier). Il est clair que son double doit être , qui décrit un canal qui produit deux éléments de données, un entier et un canal utilisé pour entrer un entier. La dualité de et signifie que nous pouvons composer de manière cohérente en parallèle un processus typeβ=(int,(int)↑)↓(v,w)vwβ¯¯¯=(int,(int)↓)↑αα¯¯¯Pα
à un nom de canal avec un processus qui a le type
au même (en supposant que les autres canaux partagés de et sont également doubles). Et de même pour et sa double .xQα¯¯¯xPQββ¯¯¯
Cela peut facilement être généralisé à des types d'ordre supérieur, par exemple
est un type qui entre deux éléments où est de de type et est un canal utilisé pour émettre en sortie un peu de Type . Un exemple d'un processus ayant ce type sur un canal est le transitaire générique
Simplifiant un peu, c'est essentiellement le seul habitant du type
.∀X.(X,(X)↑)↓(v,w)vXwXx
x(vw).w¯¯¯¯v
∀X.(X,(X)↑)↓
Que signifie la quantification universelle au niveau du processus? L'interprétation est simple: si les données sont saisies par une variable de type, elles ne peuvent pas être utilisées comme objet d'une sortie, uniquement comme un objet. Nous ne pouvons donc pas inspecter ces données, nous ne pouvons que les transmettre ou les oublier.
Le type est double de
. Comment interpréter la quantification existentielle? Assez simple: si les données sont typées par une variable de type quantifiée existentiellement, elles ne peuvent être transmises qu'à des processus qui n'inspectent pas les données, mais les transmettent uniquement (ou les oublient). En d'autres termes, nous ne pouvons le transmettre qu'aux processus qui utilisent la variable de type à quantification universelle double.∀X.(X,(X)↑)↓∃X.(X,(X)↓)↑
La théorie de ceci a été développée en détail dans [1, 2, 3] et dans quelques autres, plus difficiles d'accès, et liée très précisément à la logique linéaire polarisée et à sa notion de dualité en 4 .
Maintenant, vous vous demandez souvent comment cela se rapporte au type -calculi. La réponse est que -calculi peut être décomposé en -calculus de manière précise, à la suite des travaux pionniers de R. Milner 5 , et chaque type
-calculus a une correspondance précise avec les
types -calculus. La dualité au niveau du type de processus se traduit par une dualité au niveau du type de fonction. C'est juste que l'application de la fonction est moins une opération symétrique, et la simplicité de la dualité au niveau du processus est cachée dans les complications de -calculus.λ π λ π λλλπλπλ
1 N. Yoshida et al., Strong Normalization in the -Calculusπ .
2 K. Honda et al., Genericity and the -Calculusπ .
3 K. Honda et al., Control in the -Calculusπ .
4 K. Honda et al., Une correspondance exacte entre un pi-calcul typé et des réseaux de preuve polarisés .
5 R. Milner, Fonctions en tant que processus .