Sistemul F

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.

Descriere formală

Introduceți sintaxa

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 .

Sintaxa termenilor

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.

Reguli de reducere

Î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.

Contexte de tastare și afirmație 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 .

Reguli de tastare în biserică

Î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ță

Regulile de tastare ale lui Curry

Î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 .

Reprezentarea tipurilor de date

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

Proprietăți

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.

Note

  1. 1 2 Girard, Jean-Yves. Interpretation fonctionnelle et elimination des coupures de l'arithmétique d'ordre supérieur : Ph.D. teza. - Universitatea Paris 7, 1972.
  2. John C. Reynolds. Spre o teorie a structurii tip . - 1974. Arhivat la 31 octombrie 2014.
  3. Wells JB Tipabilitatea și verificarea tipului în calculul lambda de ordinul doi sunt echivalente și indecidabile  // Proceedings of the 9th Annual IEEE Symposium on Logic in Computer Science (LICS). - 1994. - S. 176-185 . Arhivat din original pe 22 februarie 2007.

Literatură