Järjestelmä F ( polymorfinen lambda-laskenta , järjestelmä , toisen asteen tyyppinen lambda-laskenta ) on tyypitetty lambda -laskentajärjestelmä, joka eroaa yksinkertaisesti tyypitetystä järjestelmästä yleisen tyyppien kvantifiointimekanismin läsnäololla . Tämän järjestelmän kehitti vuonna 1972 Jean-Yves Girard [1] logiikan todistusteorian yhteydessä. Hänestä riippumatta samanlaista järjestelmää ehdotti vuonna 1974 John Reynolds [2] . F-järjestelmän avulla voit formalisoida parametrisen polymorfismin käsitteen ohjelmointikielissä ja se toimii teoreettisena perustana sellaisille ohjelmointikielille kuin Haskell ja ML .
Järjestelmä F mahdollistaa termien muodostamisen tyypeistä riippuen. Teknisesti tämä saavutetaan mekanismilla, jossa termi abstraktoidaan tyypin mukaan, mikä johtaa uuteen termiin. Perinteisesti tällaisessa abstraktiossa käytetään suurta lambda-symbolia . Esimerkiksi ottamalla termi tyyppi ja abstraktimalla muuttujan tyypin , saamme termi . Tämä termi on funktio tyypeistä termeihin. Kun tätä funktiota sovelletaan eri tyyppeihin, saamme termejä, joilla on sama rakenne, mutta eri tyyppejä:
- tyypin termi ; on tyypin termi .Voidaan nähdä, että termillä on polymorfinen käyttäytyminen, eli se määrittelee yhteisen rajapinnan eri tietotyypeille. Järjestelmässä F tälle termille annetaan tyyppi . Tyypin yleinen kvantori korostaa mahdollisuutta korvata tyyppimuuttuja mikä tahansa kelvollinen tyyppi .
Järjestelmän F tyypit muodostetaan tyyppimuuttujien joukosta käyttämällä ja -operaattoreita . Perinteisesti kreikkalaisia kirjaimia käytetään tyyppimuuttujina. Tyyppien muodostamista koskevat säännöt ovat seuraavat:
Ulommat sulut jätetään usein pois, operaattoria pidetään oikea-assosiatiivisena ja operaattorin toiminta jatkuu mahdollisimman pitkälle oikealle. Esimerkiksi on vakiolyhenne sanalle .
Järjestelmän F termit muodostetaan termimuuttujien joukosta ( , , jne.) seuraavien sääntöjen mukaisesti
Ulkosulut jätetään usein pois, molempien sovellusten katsotaan olevan vasen-assosiatiivisia ja abstraktien toiminnan katsotaan jatkuvan mahdollisimman pitkälle oikealle.
Yksinkertaisesti kirjoitetusta järjestelmästä on kaksi versiota. Jos, kuten yllä olevissa säännöissä, lambda-abstraktion termimuuttujat on merkitty tyypeillä, järjestelmän sanotaan olevan kirkon tyyppinen . Jos abstraktiosäännön tilalle tulee
ja hylkää kaksi viimeistä sääntöä, niin järjestelmää kutsutaan Curry-tyyppiseksi . Itse asiassa Curry-tyyppisen järjestelmän ehdot ovat samat kuin tyypittämättömässä lambda-laskennassa.
Lambda -kiven standardin vähennyssäännön lisäksi
Kirkkotyyppinen järjestelmä F tuo lisäsäännön,
,mahdollistaa termin soveltamisen tyyppiin laskemisen tyyppikorvausmekanismin avulla tyyppimuuttujan sijaan.
Konteksti, kuten yksinkertaisesti kirjoitetussa lambda-laskennassa , on joukko lauseita eri muuttujien tyyppien määrittämisestä, erotettuna pilkulla
Voit lisätä kontekstiin muuttujan "fresh" tälle kontekstille: jos on kelvollinen konteksti, joka ei sisällä muuttujaa , ja on tyyppi, se on myös kelvollinen konteksti.
Kirjoituslausekkeen yleinen muoto on:
Tämä kuuluu seuraavasti: kontekstissa termillä on tyyppi .
Kirkon tyyppisessä järjestelmässä F tyyppien määrittäminen termeille tapahtuu seuraavien sääntöjen mukaisesti:
( Alkusääntö ) Jos muuttuja esiintyy tyypin kanssa kontekstissa , sillä on tyyppi kyseisessä kontekstissa . Päätelmäsäännön muodossa
( Johdannon sääntö ) Jos jossain kontekstissa, jota laajennetaan lauseella, jolla on tyyppi , termillä on tyyppi , niin mainitussa yhteydessä (ilman ) lambda-abstraktiolla on tyyppi . Päätelmäsäännön muodossa
( Poistosääntö ) Jos jossain kontekstissa termillä on tyyppi ja termillä on tyyppi , sovelluksella on tyyppi . Päätelmäsäännön muodossa
( Johdannon sääntö ) Jos jossain kontekstissa termillä on tyyppi , niin siinä yhteydessä termillä on tyyppi . Päätelmäsäännön muodossa
Tämä sääntö edellyttää varoituksen: tyyppimuuttujaa ei saa esiintyä kontekstikirjoitusväitteissä .
( Poistosääntö ) Jos jossain kontekstissa termillä on tyyppi ja se on tyyppi, niin tässä yhteydessä termillä on tyyppi . Päätelmäsäännön muodossa
Curry-tyyppisessä järjestelmässä F tyyppien määrittäminen termeille tapahtuu seuraavien sääntöjen mukaisesti:
( Alkusääntö ) Jos muuttuja esiintyy tyypin kanssa kontekstissa , sillä on tyyppi kyseisessä kontekstissa . Päätelmäsäännön muodossa
( Johdannon sääntö ) Jos jossain kontekstissa, jota laajennetaan lauseella, jolla on tyyppi , termillä on tyyppi , niin mainitussa yhteydessä (ilman ) lambda-abstraktiolla on tyyppi . Päätelmäsäännön muodossa
( Poistosääntö ) Jos jossain kontekstissa termillä on tyyppi ja termillä on tyyppi , sovelluksella on tyyppi . Päätelmäsäännön muodossa
( Johdannon sääntö ) Jos termillä on jossain kontekstissa tyyppi , niin tässä yhteydessä tälle termille voidaan myös määrittää tyyppi . Päätelmäsäännön muodossa
Tämä sääntö edellyttää varoituksen: tyyppimuuttujaa ei saa esiintyä kontekstikirjoitusväitteissä .
( Poistosääntö ) Jos jossain kontekstissa termillä on tyyppi ja se on tyyppi, niin tässä yhteydessä tälle termille voidaan myös määrittää tyyppi . Päätelmäsäännön muodossa
Esimerkki. Alkuperäisen säännön mukaan:
Sovelletaan poistosääntöä tyypiksi
Nyt meillä on poistosäännön mukaan mahdollisuus soveltaa termiä itseensä
ja lopuksi käyttöönottosäännön mukaan
Tämä on esimerkki termistä, joka kirjoitetaan järjestelmässä F, mutta ei yksinkertaisesti kirjoitetussa järjestelmässä .
Järjestelmä F on riittävän ilmeikäs toteuttamaan suoraan monet ohjelmointikielissä käytetyt tietotyypit. Työskentelemme kirkon F-järjestelmän versiossa.
Tyhjä tyyppi. Tyyppi
on asumaton järjestelmässä F, eli siinä ei ole tämän tyypin termejä.
Yksi tyyppi. Y tyyppi
järjestelmässä F on yksi normaalimuotoinen asukas, termi
.boolen tyyppi. Järjestelmässä F annetaan seuraavasti:
.Tällä tyypillä on täsmälleen kaksi asukasta, jotka tunnistetaan kahdella Boolen vakiolla
Ehdollinen operaattorirakenne
Tämä toiminto täyttää luonnolliset vaatimukset
ja
mielivaltaiselle tyypille ja mielivaltaiselle ja . Tämä on helppo varmistaa laajentamalla määritelmiä ja tekemällä -vähennyksiä.
Taideteoksen tyyppi. Satunnaisille tyypeille ja niiden karteesisen tuotteen tyypille
pariskunta asuu
jokaiselle ja . Parin projektiot saadaan funktioilla
Nämä toiminnot täyttävät ja luontaiset vaatimukset .
Summatyyppi. Satunnaisille tyypeille ja niiden summan tyypille
täytetään joko termillä tyyppi , tai termillä tyyppi , käytetystä rakentajasta riippuen
Täällä ,. _ Toiminnolla, joka suorittaa tapausten jäsentämisen (kuvion täsmäytyksen), on muoto
Tämä toiminto täyttää seuraavat luonnolliset vaatimukset
ja
mielivaltaisille tyypeille ja ja mielivaltaisille termeille ja .
Kirkon numerot. Luonnollisten lukujen tyyppi järjestelmässä F
jossa on ääretön määrä erilaisia elementtejä, jotka on saatu kahdella konstruktorilla ja :
Luonnollinen luku saadaan käyttämällä toista konstruktoria - kertaa ensimmäiseen tai vastaavasti termillä
Huomaa, että Curry-Howard-vastaavuus määrittää tosi yhden tyypin, false tyhjän tyypin, konjunktio tyyppien tulon ja disjunktio niiden summan.