Dans les types récursifs de Wadler gratuitement! [1], il a démontré deux types, et , et a déclaré qu'ils sont doubles . En particulier, il a souligné que le type n'est pas le double du premier. Il semble que la dualité en question ici soit différente de la dualité de Morgan dans la logique. Je me demande comment la dualité des types est définie, spécifiquement pour les trois types mentionnés, pourquoi le second est double du premier alors que le troisième ne l'est pas. Merci.∃ X . ( X → F ( X ) ) × X ∃ X . X → ( X → F ( X ) )
[1] http://homepages.inf.ed.ac.uk/wadler/papers/free-rectypes/free-rectypes.txt
lo.logic
type-theory
journée
la source
la source
Réponses:
Dans ce contexte, la dualité fait référence à la prise du point fixe le moins élevé dans un cas et du point fixe le plus élevé dans l'autre. Nous devons essayer de comprendre dans quel sens et sont les "moins" et "plus grandes" solutions de l' équation récursive .G = ∃ X . ( X → F ( X ) ) × X F ( X ) ≅ XL = ∀ X. ( F( X) → X) → X G = ∃ X. ( X→ F( X) ) × X F( X) ≅X
Tout d'abord, et sont en effet des points fixes (sous certaines hypothèses techniques qui restreignent la nature de ) car la comparaison mappe et donnée par et sont des isomorphismes. Notez que nous avons utilisé le fait que est un foncteur, c'est-à-dire qu'il est monotone, lorsque nous l'avons appliqué aux fonctions.G F v : F ( L ) → L w : G → F ( G ) vL G F v:F(L)→L w:G→F(G) w ( X , ( f , x ) ) = F ( λ y : X
Supposons est toute solution de avec un isomorphisme médiation . Ensuite, nous avons des cartes canoniques définies par et Par conséquent, est le moins parce que nous pouvons le mapper à partir de n'importe quelle autre solution, et est le plus grand parce que nous pouvons le mapper à partir de n'importe quelle autre solution. Nous pourrions rendre tout cela plus précis en parlant des algèbres initiales et des houillères finales, mais je veux que ma réponse soit courte et douce, et cody a expliqué les algèbres de toute façon.F ( Y ) ≅ Y u : F ( Y ) → Y α : L → Y et β : Y → G αY F(Y)≅Y u:F(Y)→Y
En pratique, les moindres solutions sont des types de données avides et les meilleures solutions sont des types de données paresseux . Par exemple, si puis dans le premier cas , nous obtenons finis listes de « s et dans la seconde liste finie et infinie de » s.F(X)=1+A×X AA A
la source
w'
s'agit d'un isomorphisme, mais cela vous donne-t-il une houille de charbon valide? (Je suppose que c'est le cas, mais je peux me tromper ...) On dirait que le carré ne ferait pas la navette.La réponse peut être comprise catégoriquement à travers la lentille de F-algèbres . La représentation catégorielle d'un type récursif dans une catégorie peut être grossièrement spécifiée en utilisant un foncteur . On travaille alors dans la catégorie des algèbres avecI C F:C→C F
sous forme de flèches: carrés
Maintenant, pour que sois le type récursif représenté par , être initial dans cette catégorie: nous avons besoinI F I
Maintenant , définir . Il est assez clair comment construire un : prenez simplement bâtiment est un peu plus délicat, explique Wadler, donc je n'essaierai pas. Notez cependant qu'il nécessite le fait que soit un foncteur , ce qui peut être vu comme une exigence de positivité.I=∀X.(F(X)→X)→X fold
Maintenant, dans la théorie des catégories, nous voulons souvent considérer la situation dans laquelle toutes les flèches sont inversées. Dans ce cas, étant donné , nous pouvons considérer la catégorie de charbon de bois avecF F
Nous souhaitons maintenant examiner l' objet terminal de cette catégorie. Les exigences sont désormais inversées:T
Comment faisons-nous cela? Eh bien comme prescrit WADLER, nous prenons . De la même manière qu'auparavant, nous avons Cette construction n'aurait pas fonctionné si nous avions plutôt pris .T=∃X.(X→F(X))×X
la source
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)↑ α α x x¯¯¯⟨false,7⟩ α¯¯¯ (v,w) v w α¯¯¯ (bool,int)↓ . Un processus habitant en serait . α¯¯¯ x c(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) v w β¯¯¯=(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 .x Q α¯¯¯ x P Q β β¯¯¯
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) v X w 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 .
la source