Sistemul F ( calcul lambda polimorf , sistem , calcul lambda tipizat de ordinul doi ) este un sistem de calcul lambda tipizat care diferă de un sistem tipizat simplu prin prezența unui mecanism universal de cuantificare asupra tipurilor. Acest sistem a fost dezvoltat în 1972 de Jean-Yves Girard [1] în contextul teoriei demonstrației în logică. Independent de el, un sistem similar a fost propus în 1974 de John Reynolds [2] . Sistemul F vă permite să formalizați conceptul de polimorfism parametric în limbaje de programare și servește drept bază teoretică pentru astfel de limbaje de programare precum Haskell și ML .
Sistemul F permite construirea termenilor în funcție de tipuri. Din punct de vedere tehnic, acest lucru se realizează prin mecanismul abstracției unui termen după tip, care are ca rezultat un nou termen. În mod tradițional, pentru o astfel de abstractizare, se folosește simbolul lambda mare . De exemplu, luând un termen de tip și făcând abstracție peste o variabilă de tip , obținem termen . Acest termen este o funcție de la tipuri la termeni. Aplicând această funcție la diferite tipuri, vom obține termeni cu structură identică, dar tipuri diferite:
- termenul tipului ; este un termen de tip .Se poate observa că termenul are comportament polimorf, adică definește o interfață comună pentru diferite tipuri de date. În sistemul F, acestui termen i se atribuie tipul . Cuantificatorul universal dintr-un tip subliniază posibilitatea de a înlocui orice tip valid pentru o variabilă de tip.
Tipurile de sistem F sunt construite dintr-un set de variabile de tip folosind operatorii și . Prin tradiție, literele grecești sunt folosite pentru variabilele de tip. Regulile pentru formarea tipurilor sunt următoarele:
Parantezele exterioare sunt adesea omise, operatorul este considerat drept asociativ, iar acțiunea operatorului continuă pe cât posibil spre dreapta. De exemplu, este abrevierea standard pentru .
Termenii sistemului F sunt construiți dintr-un set de variabile de termen ( , , etc.) conform următoarelor reguli
Parantezele exterioare sunt adesea omise, ambele tipuri de aplicații sunt considerate a fi asociate la stânga, iar acțiunea abstracțiilor este considerată a continua spre dreapta pe cât posibil.
Există două versiuni ale sistemului simplu tastat. Dacă, ca în regulile de mai sus, termenii variabile din abstracția lambda sunt adnotați cu tipuri, atunci se spune că sistemul este tip Church . Dacă regula de abstractizare este înlocuită cu
și aruncați ultimele două reguli, apoi sistemul se numește Curry-typed . De fapt, termenii sistemului de tip Curry sunt aceiași cu cei din calculul lambda netipizat.
În plus față de regula standard de reducere pentru calculul lambda
Sistemul în stil bisericesc F introduce o regulă suplimentară,
,permițând calcularea aplicării unui termen la un tip prin mecanismul substituției de tip în locul unei variabile de tip.
Contextul, ca și în calculul lambda tip simplu , este un set de instrucțiuni despre atribuirea de tipuri diferitelor variabile, separate prin virgulă
Puteți adăuga o variabilă „proaspătă” pentru acest context în context: dacă este un context valid care nu conține variabila și este un tip, atunci este și un context valid.
Forma generală a unei instrucțiuni de tastare este:
Acesta se citește după cum urmează: în context, un termen are tipul .
În sistemul F tip biserică, atribuirea tipurilor la termeni se face conform următoarelor reguli:
( Regulă inițială ) Dacă o variabilă este prezentă cu un tip într-un context , atunci are un tip în acel context . Sub forma unei reguli de inferență
( Regula de introducere ) Dacă într-un context extins prin declarația care are tip , termenul are tip , atunci în contextul menționat (fără ), abstracția lambda are tip . Sub forma unei reguli de inferență
( Regula de eliminare ) Dacă într-un anumit context un termen are un tip și un termen are un tip , atunci aplicația are un tip . Sub forma unei reguli de inferență
( Regulă de introducere ) Dacă într - un anumit context un termen are un tip , atunci în acel context termenul are un tip . Sub forma unei reguli de inferență
Această regulă necesită o avertizare: o variabilă de tip nu trebuie să apară în aserțiunile de tastare în context .
( Regula de eliminare ) Dacă într-un anumit context un termen are tip și este un tip, atunci în acest context termenul are tip . Sub forma unei reguli de inferență
În sistemul de tip Curry F, atribuirea tipurilor la termeni se face conform următoarelor reguli:
( Regulă inițială ) Dacă o variabilă este prezentă cu un tip într-un context , atunci are un tip în acel context . Sub forma unei reguli de inferență
( Regula de introducere ) Dacă într-un context extins prin declarația care are tip , termenul are tip , atunci în contextul menționat (fără ), abstracția lambda are tip . Sub forma unei reguli de inferență
( Regula de eliminare ) Dacă într-un anumit context un termen are un tip și un termen are un tip , atunci aplicația are un tip . Sub forma unei reguli de inferență
( Regula de introducere ) Dacă într-un anumit context un termen are un tip , atunci în acest context acestui termen i se poate atribui și un tip . Sub forma unei reguli de inferență
Această regulă necesită o avertizare: o variabilă de tip nu trebuie să apară în aserțiunile de tastare în context .
( Regula de eliminare ) Dacă, într-un anumit context, un termen are tip și este un tip, atunci în acest context acestui termen i se poate atribui și tipul . Sub forma unei reguli de inferență
Exemplu. Conform regulii initiale:
Să aplicăm regula de eliminare , luând drept tip
Acum, conform regulii de înlăturare , avem posibilitatea de a aplica termenul în sine
iar în final, conform regulii de introducere
Acesta este un exemplu de termen tastat în Sistemul F, dar nu într- un sistem simplu tastat .
Sistemul F este suficient de expresiv pentru a implementa direct multe dintre tipurile de date utilizate în limbajele de programare. Vom lucra în versiunea Church a sistemului F.
Tip gol. Tip de
este nelocuită în sistemul F, adică nu există termeni cu acest tip în el.
Un singur tip. tip Y
sistemul F are un singur locuitor de formă normală, termen
.tip boolean. În sistemul F este dat după cum urmează:
.Acest tip are exact doi locuitori, identificați cu două constante booleene
Construcția operatorului condiționat
Această funcție satisface cerințele naturale
și
pentru un tip arbitrar și arbitrar și . Este ușor de verificat acest lucru prin extinderea definițiilor și efectuând -reduceri.
Tipul operei de artă. Pentru tipurile arbitrare și tipul produsului cartezian al acestora
locuit de un cuplu
pentru fiecare și . Proiecțiile unei perechi sunt date de funcții
Aceste funcții satisfac cerințele naturale ale și .
Tipul sumei. Pentru tipurile arbitrare și tipul sumei lor
populat fie de un termen de tip , fie de un termen de tip , în funcție de constructorul aplicat
Aici , . Funcția care realizează analizarea majusculelor (potrivirea modelului) are forma
Această funcție satisface următoarele cerințe naturale
și
pentru tipuri arbitrare și și termeni arbitrari și .
Numerele bisericii. Tipul numerelor naturale în sistemul F
locuit de un număr infinit de elemente diferite, obținute prin doi constructori și :
Un număr natural poate fi obținut prin aplicarea celui de-al doilea constructor - ori la primul sau, echivalent, reprezentat printr-un termen
Rețineți că corespondența Curry-Howard atribuie adevărat un singur tip, fals un tip gol, conjuncționează un produs de tipuri și disjunge o sumă a acestora.