Système F

le

pour l'artiste électronique de musique de danse, voient le transporter en bac Corsten .

Le système F , également connu sous le nom de calcul polymorphe du lambda ou calcul de second ordre du lambda, est un calcul de lambda dactylographié par . Il a été découvert indépendamment par le Jean-Yves Girard du logicien et le John C. Reynolds de l'informaticien . Le système F formalise la notion du polymorphisme paramétrique dans les langages de programmation

Juste comme le lambda le calcul a des variables s'étendre au-dessus des fonctions, et des reliures pour elles, le calcul de second ordre de lambda a des variables s'étendre au-dessus des types de , et des reliures pour elles.

Comme exemple, le fait que la fonction d'identité peut avoir n'importe quel type de la forme A→ A être formalisé dans le système F comme jugement de

\ vdash \ lambda \ alpha. \ alpha \ à \ alpha

là où le α est un type variable de .

Sous l'isomorphisme de Cari-Howard de , le système F correspond à une logique de second ordre .

Le système F, ainsi que des calculs bien plus expressifs de lambda, peut être vu en tant qu'élément du cube en lambda.

Logique et attributs

Le type booléen du est défini comme : \ forall \ alpha. \ alpha \ \ alpha \ à \ alpha, où le α est un type variable de . Ceci produit les deux définitions suivantes pour les valeurs booléennes TRUE et FALSE :

VRAI : = \ lambda \ alpha. \ lambda
du y^ de x^ \ alpha \ lambda \ alpha.x FAUX : = \ lambda \ alpha. \ lambda y^ de x^ \ alpha \ lambda \ alpha.y

Puis, avec ces deux λ-limites, nous pouvons définir quelques opérateurs de logique : ET : = \ lambda x^ {y^ booléen} \ lambda {booléen}. ((x (booléen)) y)
de FALSE OU : = \ lambda x^ {y^ booléen} \ lambda {booléen}. ((x (booléen)) RECTIFIER) le
de y PAS : = x^ du \ lambda {booléen}. ((x (booléen)) ) VRAI FAUX

Il n'y a vraiment aucun besoin de fonction du IFTHENELSE en tant qu'une peut juste employer des limites dactylographiées booléennes crues comme fonctions de décision. Cependant, si on est demandé :
IFTHENELSE de
: = \ lambda \ alpha. \ lambda x^ {booléen} \ lambda y^ {\ z^} d'alpha \ lambda {\ alpha}. ((x (\ alpha)) y) z suffira. Un attribut de est une fonction qui renvoie une valeur booléenne. L'attribut le plus fondamental est ISZERO qui renvoie TRUE si et seulement si son argument est le numéro 0 d'église : ISZERO de : = n de λ. ) TRUE FAUX

Structures du système F

Le système F permet aux constructions récursives d'être incluses d'une façon normale, liée à celle dans le type la théorie de Martin-Löf's de . Les structures d'abstrait (s) sont créées using les constructeurs de . Ce sont des fonctions dactylographiées comme : K_1 \ rightarrow K_2 \ rightarrow \ points \ rightarrow S.

La récurrence est manifestée quand S lui-même apparaît à moins d'un des types K_i. Si vous avez m de ces constructeurs, vous pouvez définir le type de S comme : \ forall \ alpha de . (K_1^1 \ rightarrow \ point \ rightarrow \ alpha) \ point \ rightarrow (K_1^m \ rightarrow \ points \) de rightarrow \ alpha \ rightarrow \ alpha

Par exemple, les nombres normaux peuvent être définis comme datatype inductif N avec le de de constructeurs \ mathit {zéro} : \
du mathrm {N} \ mathit {succ} : \ mathrm {} de N \ \ mathrm {N} Le type du système F correspondant à cette structure est \ forall \ alpha. \ alpha \ à (\ alpha \ \) d'alpha \ à \ alpha. Les limites de ce type comportent une version dactylographiée des numéros d'église de les premiers dont être :
0 de
: =
\ lambda \ alpha. \ lambda f^ {\ alpha \ \ alpha}.
1 de x : = \ lambda \ alpha. \ lambda f^ {\ alpha \ \ alpha}.
2 de f x : = \ lambda \ alpha. \ lambda f^ {\ alpha \ \ alpha}. f (
3 de f x) : = \ lambda \ alpha. \ lambda f^ {\ alpha \ \ alpha}. f (f (f x))

Si nous renversons l'ordre des arguments au curry ( \ forall \ alpha de c. (\ alpha \ \) d'alpha \ \ alpha \ à \ alpha), alors le numéro d'église pour n est une fonction qui prend un f de de fonction comme argument et renvoie la puissance de n^ \ textrm {Th} du f de . C'est-à-dire, un numéro d'église est une fonction évoluée -- il prend un f de de fonction de simple-argument, et renvoie une autre fonction de simple-argument.

Utilisation dans des langages de programmation

La version du système F utilisée en cet article est en tant qu'explicite-dactylographiée, ou Église-modèle, calcul. L'information de dactylographie contenue dans les λ-limites rend le de Type-vérification franc. Les puits (1994) de Joe de ont arrangé un " ; problem" ouvert embarrassant ; en montrant que le type vérification est le undecidable pour une variante de Cari-modèle du système F, c., un qui manque des annotations de dactylographie explicites.

Le résultat des puits implique que le type de l'inférence pour le système F est impossible. Une restriction du système F connue sous le nom de " ; Hindley-Milner ", ou simplement " ; HM" ; , a un type facile algorithme d'inférence et est employé pour beaucoup le fortement dactylographié du les langages de programmation fonctionnelle tel que le Haskell et le ml .

F_ de système \ omega

Le système F_1 est le calcul de lambda Simple-dactylographié par ; il n'inclut aucun tracé des types aux types. Le système F décrit en cet article est techniquement le système F_2 ; c'est-à-dire, le système où tous les tracés des types aux types prennent les arguments qui sont strictement de premier ordre (pas fonctionne eux-mêmes).

Il y a généralement une famille des systèmes définis inductivement par les sortes de autorisées dans chaque système :
le

F_1 ne permet aucune sorte (seulement les types)
F_n permet des sortes :
\ star (le genre de types) et
J \ Rightarrow KJ \ dans F_ {n-1} et K \ dans F_n (le genre de fonctions des types aux types, où le type d'argument est d'un ordre inférieur)

Dans la limite, nous pouvons définir le F_ de système \ omega pour être
= de F_ \ Omega de

\ underset {1 \ leq i} {\ bigcup} F_i

C'est-à-dire, le F_ \ omega est le système qui permet des fonctions des types aux types où l'argument (et le résultat) peuvent être de n'importe quel ordre.

Noter cela bien que le F_ \ omega n'impose aucune restriction à l'ordre s arguments dans ces tracés, il limite l'univers s arguments pour ces tracés -- ils doivent être des types plutôt que des valeurs. Le F_ de système \ omega ne permet pas des tracés des valeurs aux types (la personne à charge de dactylographie ), bien qu'il permette des tracés des valeurs aux valeurs (abstraction de \ lambda), des tracés des types aux valeurs (abstraction de \ Lambda, parfois écrite \ forall) et des tracés des types aux types (l'abstraction de \ lambda au niveau des types)

.

Random links:Fraise, la Californie | Marion Williams | Theun de Vries | Tour de BankWest | Sistema_F